Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
@skava/graphql-toolset / src / KeyValueCache.ts
Size: Mime:
import { CompatibleLogger } from './typings'
import { toMockLogger } from './loggerMock'

/**
 * @see https://github.com/apollographql/apollo-server/blob/master/packages/apollo-server-caching/src/InMemoryLRUCache.ts
 * @tutorial https://github.com/apollographql/apollo-server/tree/master/packages/apollo-server-caching
 *
 * @see (related) https://github.com/apollographql/apollo-server/blob/master/packages/apollo-datasource-rest/src/__tests__/RESTDataSource.test.ts
 * @see (related) https://github.com/apollographql/apollo-server/blob/master/packages/apollo-datasource-rest/src/HTTPCache.ts
 */
export interface KeyValueCacheType {
  delete(key: string, options: { ttl?: number }): Promise<void | undefined>
  get(key: string): Promise<string | undefined>
  set(key: string, value: string, options?: { ttl?: number }): Promise<void>
}
export class KeyValueCache implements KeyValueCacheType {
  store: Map<string, string> = new Map()
  logger: CompatibleLogger

  constructor(logger: CompatibleLogger = toMockLogger()) {
    this.logger = logger
  }

  async get(key: string): Promise<string | undefined> {
    const value = this.store.get(key)
    this.logger.info('[cache] get: ' + key)
    // @todo could get size of this instead
    this.logger.debug('[cache] get->value: ', value)
    return Promise.resolve(value)
  }
  async set(
    key: string,
    value: string,
    options: { ttl?: number } = {}
  ): Promise<void> {
    this.logger.info('[cache] set: ' + key)
    this.store.set(key, value)
    return Promise.resolve()
  }
  async delete(key: string, options: { ttl?: number } = {}): Promise<void> {
    this.logger.info('[cache] delete: ' + key)
    this.store.delete(key)
    return Promise.resolve()
  }

  async clear(): Promise<void> {
    this.store.clear()
  }

  // apollo uses these, we do not
  // async flush(): Promise<void> {
  //   this.store.clear()
  // }
  // async close(): Promise<void> {
  //   //
  // }
}