diff --git a/.gitignore b/.gitignore index 7ba459d2e..43819bb03 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,9 @@ dist tmp /out-tsc +# cache +.cache + # dependencies node_modules /.pnp diff --git a/package.json b/package.json index 434cfc0de..d6b16a1db 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "bitcoin-address-validation": "^2.2.1", "esbuild": "^0.14.27", "esbuild-runner": "^2.2.1", + "file-system-cache": "^1.0.5", "fs-extra": "^10.0.1", "inquirer": "^8.2.2", "lodash": "^4.17.21", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b793b1862..ea3006fc9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,6 +42,7 @@ specifiers: eslint-plugin-prettier: ^4.0.0 eslint-plugin-unused-imports: ^2.0.0 ethers: ^5.5.1 + file-system-cache: ^1.0.5 fs-extra: ^10.0.1 graphql: ^15.5.1 graphql-request: ^3.7.0 @@ -75,6 +76,7 @@ dependencies: bitcoin-address-validation: 2.2.1 esbuild: 0.14.27 esbuild-runner: 2.2.1_esbuild@0.14.27 + file-system-cache: 1.0.5 fs-extra: 10.0.1 inquirer: 8.2.2 lodash: 4.17.21 @@ -2397,7 +2399,6 @@ packages: /bluebird/3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - dev: true /bn.js/4.11.6: resolution: {integrity: sha1-UzRK2xRhehP26N0s4okF0cC6MhU=} @@ -4189,6 +4190,14 @@ packages: flat-cache: 3.0.4 dev: true + /file-system-cache/1.0.5: + resolution: {integrity: sha1-hCWbNqK7uNPW6xAh0xMv/mTP/08=} + dependencies: + bluebird: 3.7.2 + fs-extra: 0.30.0 + ramda: 0.21.0 + dev: false + /filelist/1.0.2: resolution: {integrity: sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==} dependencies: @@ -4318,6 +4327,16 @@ packages: resolution: {integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=} engines: {node: '>= 0.6'} + /fs-extra/0.30.0: + resolution: {integrity: sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=} + dependencies: + graceful-fs: 4.2.9 + jsonfile: 2.4.0 + klaw: 1.3.1 + path-is-absolute: 1.0.1 + rimraf: 2.7.1 + dev: false + /fs-extra/10.0.1: resolution: {integrity: sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==} engines: {node: '>=12'} @@ -5819,6 +5838,12 @@ packages: resolution: {integrity: sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==} dev: true + /jsonfile/2.4.0: + resolution: {integrity: sha1-NzaitCi4e72gzIO1P6PWM6NcKug=} + optionalDependencies: + graceful-fs: 4.2.9 + dev: false + /jsonfile/4.0.0: resolution: {integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=} optionalDependencies: @@ -5858,6 +5883,12 @@ packages: json-buffer: 3.0.0 dev: true + /klaw/1.3.1: + resolution: {integrity: sha1-QIhDO0azsbolnXh4XY6W9zugJDk=} + optionalDependencies: + graceful-fs: 4.2.9 + dev: false + /kleur/3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -6812,6 +6843,10 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true + /ramda/0.21.0: + resolution: {integrity: sha1-oAGr7bP/YQd9T/HVd9RN536NCjU=} + dev: false + /randombytes/2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: @@ -7025,6 +7060,13 @@ packages: engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true + /rimraf/2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.0 + dev: false + /rimraf/3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true diff --git a/src/cache/cache-on-interval.service.ts b/src/cache/cache-on-interval.service.ts index b16fb5621..934edfef3 100644 --- a/src/cache/cache-on-interval.service.ts +++ b/src/cache/cache-on-interval.service.ts @@ -1,6 +1,6 @@ -import { CACHE_MANAGER, Inject, Injectable, Logger, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; +import { Inject, Injectable, Logger, OnModuleDestroy, OnModuleInit } from '@nestjs/common'; import { DiscoveryService, MetadataScanner, Reflector } from '@nestjs/core'; -import { Cache } from 'cache-manager'; +import Cache from 'file-system-cache'; import { CacheOnIntervalOptions, @@ -13,15 +13,20 @@ export class CacheOnIntervalService implements OnModuleInit, OnModuleDestroy { private readonly intervals: NodeJS.Timer[] = []; private readonly registeredCacheKeys: string[] = []; private logger = new Logger(CacheOnIntervalService.name); + private cacheManager = Cache({ + basePath: './.cache', + ns: '@CacheOnInterval', + }); constructor( - @Inject(CACHE_MANAGER) private readonly cacheManager: Cache, @Inject(DiscoveryService) private readonly discoveryService: DiscoveryService, @Inject(MetadataScanner) private readonly metadataScanner: MetadataScanner, @Inject(Reflector) private readonly reflector: Reflector, ) {} - onModuleInit() { + async onModuleInit() { + await this.cacheManager.load(); + const instanceWrappers = this.discoveryService.getProviders(); instanceWrappers .filter(wrapper => wrapper.isDependencyTreeStatic() && !!wrapper.instance) diff --git a/src/cache/cache.service.ts b/src/cache/cache.service.ts index 4df752026..50e5619be 100644 --- a/src/cache/cache.service.ts +++ b/src/cache/cache.service.ts @@ -1,6 +1,6 @@ -import { CACHE_MANAGER, Inject, Injectable, Logger, OnModuleInit } from '@nestjs/common'; +import { Inject, Injectable, Logger, OnModuleInit } from '@nestjs/common'; import { DiscoveryService, MetadataScanner, Reflector } from '@nestjs/core'; -import { Cache } from 'cache-manager'; +import Cache from 'file-system-cache'; import { isNil } from 'lodash'; import { CacheOptions, CACHE_KEY, CACHE_TTL } from './cache.decorator'; @@ -8,15 +8,20 @@ import { CacheOptions, CACHE_KEY, CACHE_TTL } from './cache.decorator'; @Injectable() export class CacheService implements OnModuleInit { private logger = new Logger(CacheService.name); + private cacheManager = Cache({ + basePath: './.cache', + ns: '@Cache', + }); constructor( - @Inject(CACHE_MANAGER) private readonly cacheManager: Cache, @Inject(DiscoveryService) private readonly discoveryService: DiscoveryService, @Inject(MetadataScanner) private readonly metadataScanner: MetadataScanner, @Inject(Reflector) private readonly reflector: Reflector, ) {} - onModuleInit() { + async onModuleInit() { + await this.cacheManager.load(); + const instanceWrappers = this.discoveryService.getProviders(); instanceWrappers .filter(wrapper => wrapper.isDependencyTreeStatic() && !!wrapper.instance) diff --git a/tsconfig.json b/tsconfig.json index 9b0804894..3b8e6f50a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,7 +22,8 @@ "baseUrl": "./src", "paths": { "~*": ["./*"] - } + }, + "typeRoots": ["types", "node_modules/@types"] }, "include": ["./src/**/*"] } diff --git a/types/file-system-cache/index.d.ts b/types/file-system-cache/index.d.ts new file mode 100644 index 000000000..6ce5844e5 --- /dev/null +++ b/types/file-system-cache/index.d.ts @@ -0,0 +1,15 @@ +declare module 'file-system-cache' { + interface CacheManager { + get(key: string): Promise; + getSync(key: string): string; + set(key: string, value: string): Promise; + setSync(key: string, value: string): void; + remove(key: string): Promise; + clear(): Promise; + load(): Promise; + } + + type factoryOpts = { basePath?: string; ns?: string }; + function factory(opts?: factoryOpts): CacheManager; + export default factory; +}