@sphereon/ssi-sdk.kv-store-temp 0.34.1-fix.103 → 0.34.1-fix.109

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/keyv/keyv.ts","../src/key-value-store.ts","../src/store-adapters/tiered/index.ts","../src/store-adapters/typeorm/index.ts","../src/store-adapters/typeorm/entities/keyValueStoreEntity.ts","../src/store-adapters/typeorm/migrations/1.createKVDatabase.ts","../src/store-adapters/typeorm/migrations/index.ts"],"sourcesContent":["/**\n * Provides a {@link @sphereon/ssi-sdk.kv-store-temp#KeyValueStore} for the\n * {@link @veramo/core#Agent} plugin that implements {@link @sphereon/ssi-sdk.kv-store-temp#IKeyValueStore} interface\n *\n * @packageDocumentation\n */\nexport { KeyValueStore } from './key-value-store'\nexport * from './store-adapters/tiered/index'\nexport * from './store-adapters/typeorm/index'\nexport * from './key-value-types'\n","import { EventEmitter } from 'events'\nimport JSONB from 'json-buffer'\nimport { KeyvDeserializedData, KeyvOptions, KeyvStore, KeyvStoredData } from './keyv-types'\n\n/**\n * Please note that this is code adapted from @link https://github.com/jaredwray/keyv to support Typescript and ESM in Veramo\n *\n * The code should support the storage plugins available for the keyv project.\n * Veramo itself supports NodeJS, Browser and React-Native environment.\n * Please be aware that these requirements probably aren't true for any keyv storage plugins.\n *\n * One of the big changes compared to the upstream project is that this port does not have dynamic loading of store-adapters based on URIs.\n * We believe that any Veramo Key Value store should use explicitly defined store-adapters.\n *\n * The port is part of the Veramo Key Value Store module, as we do not want to make an official maintained port out of it.\n * Veramo exposes its own API/interfaces for the Key Value store, meaning we could also support any other implementation in the future\n *\n * The Veramo kv-store module provides out of the box support for in memory/maps, sqlite and typeorm implementations,\n * including a tiered local/remote implementation that support all environments.\n *\n * We welcome any new storage modules\n */\nexport class Keyv<Value = any> extends EventEmitter implements KeyvStore<Value> {\n readonly opts: KeyvOptions<Value>\n readonly namespace: string\n iterator?: (namespace?: string) => AsyncGenerator<any, void>\n\n constructor(uri?: string | Map<string, Value | undefined> | KeyvStore<Value> | undefined, options?: KeyvOptions<Value>) {\n super()\n const emitErrors = options?.emitErrors === undefined ? true : options.emitErrors\n uri = uri ?? options?.uri\n /*if (!uri) {\n throw Error('No URI provided')\n }*/\n this.opts = {\n namespace: 'keyv',\n serialize: JSONB.stringify,\n deserialize: JSONB.parse,\n ...(typeof uri === 'string' ? { uri } : uri),\n ...options,\n }\n\n if (!this.opts.store) {\n if (typeof uri !== 'string') {\n this.opts.store = uri as KeyvStore<Value | undefined>\n } /* else {\n const adapterOptions = { ...this.opts }\n this.opts.store = loadStore(adapterOptions)\n }*/\n }\n if (!this.opts.store) {\n throw Error('No store')\n }\n\n if (this.opts.compression) {\n const compression = this.opts.compression\n this.opts.serialize = compression.serialize.bind(compression)\n this.opts.deserialize = compression.deserialize.bind(compression)\n }\n\n if (typeof this.opts.store.on === 'function' && emitErrors) {\n this.opts.store.on('error', (error) => this.emit('error', error))\n }\n\n this.opts.store.namespace = this.opts.namespace || 'keyv'\n this.namespace = this.opts.store.namespace\n\n const generateIterator = (iterator: any, keyv: Keyv<any>) =>\n async function* () {\n for await (const [key, raw] of typeof iterator === 'function' ? iterator(keyv.store.namespace) : iterator) {\n const data = await keyv.deserialize(raw)\n if (keyv.store.namespace && !key.includes(keyv.store.namespace)) {\n continue\n }\n\n if (data && typeof data.expires === 'number' && Date.now() > data.expires) {\n keyv.delete(key)\n continue\n }\n\n yield [keyv._getKeyUnprefix(key), data?.value]\n }\n }\n\n // Attach iterators\n // @ts-ignore\n if (typeof this.store[Symbol.iterator] === 'function' && this.store instanceof Map) {\n this.iterator = generateIterator(this.store, this)\n } else if (typeof this.store.iterator === 'function' && this.store.opts && this._checkIterableAdapter()) {\n this.iterator = generateIterator(this.store.iterator.bind(this.store), this)\n }\n }\n\n get store(): Required<KeyvStore<Value>> {\n return this.opts.store as Required<KeyvStore<Value>>\n }\n\n get deserialize() {\n return this.opts.deserialize!\n }\n\n get serialize() {\n return this.opts.serialize!\n }\n\n _checkIterableAdapter() {\n return (\n (this.store.opts.dialect && iterableAdapters.includes(this.store.opts.dialect)) ||\n (this.store.opts.url && iterableAdapters.findIndex((element) => this.store.opts.url.includes(element)) >= 0)\n )\n }\n\n _getKeyPrefix(key: string): string {\n return `${this.opts.namespace}:${key}`\n }\n\n _getKeyPrefixArray(keys: string[]): string[] {\n return keys.map((key) => this._getKeyPrefix(key))\n }\n\n _getKeyUnprefix(key: string): string {\n return key.split(':').splice(1).join(':')\n }\n\n async getMany(keys: string[], options?: { raw?: boolean }): Promise<Array<KeyvStoredData<Value>>> {\n const keyPrefixed = this._getKeyPrefixArray(keys)\n let promise: Promise<Array<KeyvStoredData<Value>>>\n if (this.store.getMany !== undefined) {\n // todo: Probably wise to check expired ValueData here, if the getMany does not implement this feature itself!\n promise = this.store.getMany(keyPrefixed, options) as Promise<KeyvStoredData<Value>[]>\n } else if (this.isMapWithEntries(this.store)) {\n // Handle Map-based stores with prefix matching\n promise = this.getFromMapWithPrefix(keyPrefixed)\n } else {\n promise = Promise.all(keyPrefixed.map((k) => this.store.get(k, options) as Promise<KeyvStoredData<Value>>))\n }\n const allValues = Promise.resolve(promise)\n const results: Promise<KeyvStoredData<Value>>[] = []\n\n return Promise.resolve(allValues)\n .then((all) => {\n const entries = Array.isArray(all) ? all : [all]\n entries.forEach((data, index) => {\n let result = typeof data === 'string' ? this.deserialize(data) : !!data && this.opts.compression ? this.deserialize(data) : data\n\n if (result && typeof result === 'object' && 'expires' in result && typeof result.expires === 'number' && Date.now() > result.expires) {\n this.delete(keys[index])\n result = undefined\n }\n\n const final = (\n options && options.raw ? result : result && typeof result === 'object' && 'value' in result ? result.value : result\n ) as Promise<KeyvStoredData<Value>>\n\n results.push(final)\n })\n })\n .then(() => Promise.all(results))\n }\n\n private isMapWithEntries(store: any): store is Map<string, Value> {\n return store instanceof Map && typeof store.entries === 'function'\n }\n\n private async getFromMapWithPrefix(prefixes: string[]): Promise<Array<KeyvStoredData<Value> | undefined>> {\n if (!this.isMapWithEntries(this.store)) {\n return []\n }\n\n const map = this.store as Map<string, Value>\n\n return prefixes.flatMap((prefix) => {\n const matchedValues = Array.from(map.entries())\n .filter(([key]) => key.startsWith(prefix))\n .map(([, value]) => value as KeyvStoredData<Value>)\n\n return matchedValues.length > 0 ? matchedValues : [undefined]\n })\n }\n\n async get(\n key: string | string[],\n options?: { raw?: boolean },\n ): Promise<Value | string | KeyvDeserializedData<Value> | KeyvStoredData<Value>[] | undefined> {\n const isArray = Array.isArray(key)\n return Promise.resolve()\n .then(() => (isArray ? this.getMany(this._getKeyPrefixArray(key), options) : this.store.get(this._getKeyPrefix(key))))\n .then((data) => (typeof data === 'string' ? this.deserialize(data) : this.opts.compression ? this.deserialize(data) : data))\n .then((data) => {\n if (data === undefined || data === null) {\n return undefined\n }\n const rows = Array.isArray(data) ? data : [data]\n\n if (isArray) {\n const result = []\n\n for (let row of rows) {\n if (row === undefined || row === null) {\n result.push(undefined)\n continue\n }\n\n if (this.isExpired(row)) {\n this.delete(key).then(() => undefined)\n result.push(undefined)\n } else {\n result.push(options && options.raw ? row : toValue(row))\n }\n }\n\n return result\n } else if (!Array.isArray(data)) {\n if (this.isExpired(data)) {\n return this.delete(key).then(() => undefined)\n }\n }\n\n return options && options.raw ? data : Array.isArray(data) ? data.map((d) => toValue(d)) : toValue(data)\n })\n }\n\n private isExpired(data: KeyvDeserializedData<any> | string | Value): boolean {\n return (\n typeof data !== 'string' &&\n data &&\n typeof data === 'object' &&\n 'expires' in data &&\n typeof data.expires === 'number' &&\n Date.now() > data.expires\n )\n }\n\n set(key: string, value: Value, ttl?: number) {\n const keyPrefixed = this._getKeyPrefix(key)\n if (typeof ttl === 'undefined') {\n ttl = this.opts.ttl\n }\n if (ttl === 0) {\n ttl = undefined\n }\n\n // @ts-ignore\n return Promise.resolve()\n .then(() => {\n const expires = typeof ttl === 'number' ? Date.now() + ttl : undefined\n if (typeof value === 'symbol') {\n this.emit('error', 'symbol cannot be serialized')\n }\n\n const input = { value, expires }\n return this.serialize(input)\n })\n .then((value) => this.store.set(keyPrefixed, value as Value, ttl))\n .then(() => true)\n }\n\n delete(key: string | string[]) {\n if (!Array.isArray(key)) {\n const keyPrefixed = this._getKeyPrefix(key)\n return Promise.resolve().then(() => this.store.delete(keyPrefixed))\n }\n\n const keyPrefixed = this._getKeyPrefixArray(key)\n if (this.store.deleteMany !== undefined) {\n return Promise.resolve().then(() => this.store.deleteMany!(keyPrefixed))\n }\n\n const promises = []\n for (const key of keyPrefixed) {\n promises.push(this.store.delete(key))\n }\n\n return Promise.allSettled(promises).then((values) => values.every((x) => x.valueOf() === true))\n }\n\n async clear(): Promise<void> {\n return Promise.resolve().then(() => this.store.clear())\n }\n\n has(key: string) {\n const keyPrefixed = this._getKeyPrefix(key)\n return Promise.resolve().then(async () => {\n if (typeof this.store.has === 'function') {\n return this.store.has(keyPrefixed)\n }\n\n const value = await this.store.get(keyPrefixed)\n return value !== undefined\n })\n }\n\n disconnect() {\n if (typeof this.store.disconnect === 'function') {\n return this.store.disconnect()\n }\n }\n}\n\nconst iterableAdapters = ['sqlite', 'postgres', 'mysql', 'mongo', 'redis', 'tiered']\n\nfunction toValue<Value>(input: KeyvDeserializedData<Value> | string | Value) {\n return input !== null && typeof input === 'object' && 'value' in input ? input.value : input\n}\n","import { IKeyValueStore, IKeyValueStoreOnArgs, IKeyValueStoreOptions, IValueData, ValueStoreType } from './key-value-types'\nimport { Keyv } from './keyv/keyv'\nimport { KeyvDeserializedData, KeyvOptions, KeyvStoredData } from './keyv/keyv-types'\n\n/**\n * Agent plugin that implements {@link @sphereon/ssi-sdk.kv-store-temp#IKeyValueStore} interface\n * @public\n */\nexport class KeyValueStore<ValueType extends ValueStoreType> implements IKeyValueStore<ValueType> {\n /**\n * The main keyv typescript port which delegates to the storage adapters and takes care of some common functionality\n *\n * @internal\n */\n private readonly keyv: Keyv<ValueType>\n\n constructor(options: IKeyValueStoreOptions<ValueType>) {\n this.keyv = new Keyv(options.uri, options as KeyvOptions<ValueType>)\n }\n\n async get(key: string): Promise<ValueType | undefined> {\n const result = await this.keyv.get(key, { raw: false })\n if (result === null || result === undefined) {\n return undefined\n }\n return result as ValueType\n }\n\n async getAsValueData(key: string): Promise<IValueData<ValueType>> {\n const result = await this.keyv.get(key, { raw: true })\n if (result === null || result === undefined) {\n // We always return a ValueData object for this method\n return { value: undefined, expires: undefined }\n }\n return this.toDeserializedValueData(result)\n }\n\n async getMany(keys: string[]): Promise<Array<ValueType | undefined>> {\n if (!keys || keys.length === 0) {\n return []\n }\n let result = await this.keyv.getMany(keys, { raw: false })\n\n // Making sure we return the same array length as the amount of key(s) passed in\n if (result === null || result === undefined || result.length === 0) {\n result = new Array<ValueType | undefined>()\n keys.forEach(() => result.push(undefined))\n }\n return result.map((v) => (!!v ? (v as ValueType) : undefined))\n }\n\n async getManyAsValueData(keys: string[]): Promise<Array<IValueData<ValueType>>> {\n if (!keys || keys.length === 0) {\n return []\n }\n let result = await this.keyv.getMany(keys, { raw: true })\n\n // Making sure we return the same array length as the amount of key(s) passed in\n if (result === null || result === undefined || result.length === 0) {\n result = new Array<KeyvStoredData<ValueType>>()\n keys.forEach(() => result.push({ value: undefined, expires: undefined } as unknown as KeyvDeserializedData<ValueType>))\n }\n return result.map((v) => (!!v ? this.toDeserializedValueData(v) : { value: undefined, expires: undefined }))\n }\n\n async set(key: string, value: ValueType, ttl?: number): Promise<IValueData<ValueType>> {\n return this.keyv.set(key, value, ttl).then(() => this.getAsValueData(key))\n }\n\n async has(key: string): Promise<boolean> {\n return this.keyv.has(key)\n }\n\n async delete(key: string): Promise<boolean> {\n return this.keyv.delete(key)\n }\n\n async deleteMany(keys: string[]): Promise<boolean[]> {\n return Promise.all(keys.map((key) => this.keyv.delete(key)))\n }\n\n async clear(): Promise<IKeyValueStore<ValueType>> {\n return this.keyv.clear().then(() => this)\n }\n\n async disconnect(): Promise<void> {\n return this.keyv.disconnect()\n }\n\n // Public so parties using the kv store directly can add listeners if they want\n async kvStoreOn(args: IKeyValueStoreOnArgs): Promise<IKeyValueStore<ValueType>> {\n this.keyv.on(args.eventName, args.listener)\n return this\n }\n\n private toDeserializedValueData<ValueType>(result: any): IValueData<ValueType> {\n if (result === null || result === undefined) {\n throw Error(`Result cannot be undefined or null at this this point`)\n } else if (typeof result !== 'object') {\n return { value: result, expires: undefined }\n } else if (!('value' in result)) {\n return { value: result, expires: undefined }\n }\n if (!('expires' in result)) {\n result.expires = undefined\n }\n return result as IValueData<ValueType>\n }\n}\n","import { EventEmitter } from 'events'\nimport type { Options, Options_ } from './types'\nimport { KeyvStore, KeyvStoredData } from '../../keyv/keyv-types'\nimport { Keyv } from '../../keyv/keyv'\nimport { IKeyValueStoreAdapter } from '../../key-value-types'\n\ntype KeyvTieredIndex = 'local' | 'remote'\n\n/**\n * Tiered keyv store adapter, combining 2 adapters/stores into one\n * @alpha\n */\nexport class KeyValueTieredStoreAdapter<Value> extends EventEmitter implements KeyvStore<Value>, IKeyValueStoreAdapter<Value> {\n opts: Options_\n remote: KeyvStore<Value>\n local: KeyvStore<Value>\n iterationLimit?: string | number\n\n namespace?: string | undefined\n\n constructor({ remote, local, ...options }: Options<Value>) {\n super()\n this.opts = {\n validator: () => true,\n dialect: 'tiered',\n ...options,\n }\n\n // todo: since we are instantiating a new Keyv object in case we encounter a map, the key prefix applied twice, given it will be part of a an outer keyv object as well.\n // Probably wise to simply create a Map Store class. As it is an in memory construct, and will work in terms of resolution it does not have highest priority\n this.local = (isMap(local) ? new Keyv<Value>(local as Map<string, Value>) : local) as KeyvStore<Value>\n this.remote = (isMap(remote) ? new Keyv<Value>(remote as Map<string, Value>) : remote) as KeyvStore<Value>\n this.namespace = this.local.namespace\n }\n\n async get(key: string | string[], options?: { raw?: boolean }): Promise<KeyvStoredData<Value> | Array<KeyvStoredData<Value>>> {\n if (Array.isArray(key)) {\n return await this.getMany(key, options)\n }\n const localResult = (await this.local.get(key, options)) as KeyvStoredData<Value>\n\n if (localResult === undefined || !this.opts.validator(localResult, key)) {\n const remoteResult = await this.remote.get(key, options)\n\n if (remoteResult !== localResult) {\n const value = (\n !!remoteResult ? (typeof remoteResult === 'object' && 'value' in remoteResult ? remoteResult.value : remoteResult) : undefined\n ) as Value\n const ttl =\n !!remoteResult && typeof remoteResult === 'object' && 'expires' in remoteResult && remoteResult.expires\n ? remoteResult.expires - Date.now()\n : undefined\n if (!ttl || ttl > 0) {\n await this.local.set(key, value, ttl)\n } else {\n this.local.delete(key)\n }\n }\n return remoteResult\n }\n\n return localResult\n }\n\n async getMany(keys: string[], options?: { raw?: boolean }): Promise<Array<KeyvStoredData<Value>>> {\n const promises: Array<Promise<KeyvStoredData<Value>>> = []\n for (const key of keys) {\n promises.push(this.get(key, options) as Promise<KeyvStoredData<Value>>)\n }\n\n const values = await Promise.all(promises)\n const data: Array<KeyvStoredData<Value>> | undefined = []\n for (const value of values) {\n data.push(value as KeyvStoredData<Value>)\n }\n return data\n }\n\n async set(key: string, value: any, ttl?: number) {\n const toSet: KeyvTieredIndex[] = ['local', 'remote']\n return Promise.all(toSet.map(async (store) => this[store].set(key, value, ttl)))\n }\n\n async clear(): Promise<undefined> {\n const toClear: KeyvTieredIndex[] = ['local']\n if (!this.opts.localOnly) {\n toClear.push('remote')\n }\n\n await Promise.all(toClear.map(async (store) => this[store].clear()))\n\n return undefined\n }\n\n async delete(key: string): Promise<boolean> {\n const toDelete: KeyvTieredIndex[] = ['local']\n if (!this.opts.localOnly) {\n toDelete.push('remote')\n }\n\n const deleted = await Promise.all(toDelete.map(async (store) => this[store].delete(key)))\n\n return deleted.every(Boolean)\n }\n\n async deleteMany(keys: string[]): Promise<boolean> {\n const promises = []\n for (const key of keys) {\n promises.push(this.delete(key))\n }\n\n const values = await Promise.all(promises)\n\n return values.every(Boolean)\n }\n\n async has(key: string): Promise<boolean> {\n let response\n if (typeof this.local.has === 'function') {\n response = this.local.has(key)\n } else {\n const value = await this.local.get(key)\n response = value !== undefined\n }\n if (!response || !this.opts.validator(response, key)) {\n if (typeof this.remote.has === 'function') {\n response = this.remote.has(key)\n } else {\n const value = await this.remote.get(key)\n response = value !== undefined\n }\n }\n return response\n }\n\n async *iterator(namespace?: string): AsyncGenerator<any, void, any> {\n const limit = Number.parseInt(this.iterationLimit as string, 10) || 10\n this.remote.opts.iterationLimit = limit\n if (this.remote && typeof this.remote.iterator === 'function') {\n for await (const entries of this.remote.iterator(namespace)) {\n yield entries\n }\n }\n }\n}\n\nfunction isMap(map: any) {\n if (map instanceof Map) {\n return true\n } else if (\n map &&\n typeof map.clear === 'function' &&\n typeof map.delete === 'function' &&\n typeof map.get === 'function' &&\n typeof map.has === 'function' &&\n typeof map.set === 'function'\n ) {\n return true\n }\n\n return false\n}\n","import { EventEmitter } from 'events'\nimport { OrPromise } from '@veramo/utils'\nimport { DataSource, In, Like } from 'typeorm'\nimport { KeyValueStoreEntity } from './entities/keyValueStoreEntity'\nimport { KeyValueTypeORMOptions, Options_ } from './types'\nimport { KeyvStore, KeyvStoredData } from '../../keyv/keyv-types'\nimport { IKeyValueStoreAdapter } from '../../key-value-types'\nimport JSONB from 'json-buffer'\nexport { KeyValueStoreEntity } from './entities/keyValueStoreEntity'\nexport { kvStoreMigrations } from './migrations/index'\n\n/**\n * TypeORM based key value store adapter\n * @beta\n */\nexport class KeyValueTypeORMStoreAdapter extends EventEmitter implements KeyvStore<string>, IKeyValueStoreAdapter<string> {\n private readonly dbConnection: OrPromise<DataSource>\n readonly namespace: string\n opts: Options_<string>\n\n constructor(options: KeyValueTypeORMOptions) {\n super()\n this.dbConnection = options.dbConnection\n this.namespace = options.namespace || 'keyv'\n this.opts = {\n validator: () => true,\n dialect: 'typeorm',\n serialize: JSONB.stringify,\n deserialize: JSONB.parse,\n ...options,\n }\n }\n\n async get(key: string | string[], options?: { raw?: boolean }): Promise<KeyvStoredData<string> | Array<KeyvStoredData<string>>> {\n if (Array.isArray(key)) {\n return this.getMany(key, options)\n }\n const connection = await _getConnectedDb(this.dbConnection)\n const result = await connection.getRepository(KeyValueStoreEntity).findOneBy({\n key,\n })\n return options?.raw !== true || !result ? result?.data : { value: result?.data, expires: result?.expires }\n }\n\n async getMany(keys: string[], options?: { raw?: boolean }): Promise<Array<KeyvStoredData<string>>> {\n const connection = await _getConnectedDb(this.dbConnection)\n const results = await connection.getRepository(KeyValueStoreEntity).findBy({\n key: In(keys),\n })\n const values = keys.map(async (key) => {\n const result = results.find((result) => result.key === key)\n return options?.raw !== true || !result\n ? (result?.data as KeyvStoredData<string>)\n : ({\n value: result?.data ? (await this.opts.deserialize(result.data))?.value : undefined,\n expires: result?.expires,\n } as KeyvStoredData<string>)\n })\n\n return Promise.all(values)\n }\n\n async set(key: string, value: string, ttl?: number): Promise<KeyvStoredData<string>> {\n const connection = await _getConnectedDb(this.dbConnection)\n const entity = new KeyValueStoreEntity()\n entity.key = key\n entity.data = value\n entity.expires = ttl\n await connection.getRepository(KeyValueStoreEntity).save(entity)\n return { value: value, expires: ttl }\n }\n\n async delete(key: string | string[]): Promise<boolean> {\n if (Array.isArray(key)) {\n return this.deleteMany(key)\n }\n const connection = await _getConnectedDb(this.dbConnection)\n const result = await connection.getRepository(KeyValueStoreEntity).delete({ key })\n return result.affected === 1\n }\n\n async deleteMany(keys: string[]): Promise<boolean> {\n const connection = await _getConnectedDb(this.dbConnection)\n const results = await connection.getRepository(KeyValueStoreEntity).delete({\n key: In(keys),\n })\n return !!results.affected && results.affected >= 1\n }\n\n async clear(): Promise<void> {\n const connection = await _getConnectedDb(this.dbConnection)\n await connection.getRepository(KeyValueStoreEntity).delete({\n key: Like(`${this.namespace}:%`),\n })\n }\n\n async has(key: string): Promise<boolean> {\n const connection = await _getConnectedDb(this.dbConnection)\n const result = await connection.getRepository(KeyValueStoreEntity).countBy({\n key,\n })\n return result === 1\n }\n\n async disconnect(): Promise<void> {\n const connection = await _getConnectedDb(this.dbConnection)\n await connection.destroy()\n }\n}\n\n/**\n * Ensures that the provided DataSource is connected.\n *\n * @param dbConnection - a TypeORM DataSource or a Promise that resolves to a DataSource\n * @internal\n */\nexport async function _getConnectedDb(dbConnection: OrPromise<DataSource>): Promise<DataSource> {\n if (dbConnection instanceof Promise) {\n return await dbConnection\n } else if (!dbConnection.isInitialized) {\n return await (<DataSource>dbConnection).initialize()\n } else {\n return dbConnection\n }\n}\n","import { BaseEntity, Column, Entity, PrimaryColumn } from 'typeorm'\n\n/**\n *\n * @beta This API may change without a BREAKING CHANGE notice.\n */\n@Entity('keyvaluestore')\nexport class KeyValueStoreEntity extends BaseEntity {\n @PrimaryColumn('text')\n key!: string\n\n @Column({\n type: 'text',\n })\n data!: string\n\n expires?: number\n}\n","import { MigrationInterface, QueryRunner, Table } from 'typeorm'\nimport Debug from 'debug'\nconst debug = Debug('veramo:kv-store:initial-migration')\n\n/**\n * Create the database layout for Veramo 3.0\n *\n * @public\n */\nexport class CreateKVDatabaseMigration implements MigrationInterface {\n private readonly _tableName: string\n readonly name: string\n\n constructor(tableName?: string) {\n this._tableName = tableName || 'keyvaluestore'\n this.name = `CreateKVDatabase${tableName}1680297189001`\n }\n\n async up(queryRunner: QueryRunner): Promise<void> {\n function getTableName(givenName: string): string {\n return queryRunner.connection.entityMetadatas.find((meta) => meta.givenTableName === givenName)?.tableName || givenName\n }\n\n debug(`creating ${this._tableName} table`)\n // CREATE TABLE \"keyvaluestore\" (\"key\" varchar PRIMARY KEY NOT NULL, \"data\" text NOT NULL)\n await queryRunner.createTable(\n new Table({\n name: getTableName(this._tableName),\n columns: [\n { name: 'key', type: 'varchar', isPrimary: true },\n { name: 'data', type: 'text', isNullable: false },\n ],\n indices: [\n {\n columnNames: ['key'],\n isUnique: true,\n },\n ],\n }),\n true,\n )\n }\n\n async down(queryRunner: QueryRunner): Promise<void> {\n throw new Error('illegal_operation: cannot roll back initial migration')\n }\n}\n","import { CreateKVDatabaseMigration } from './1.createKVDatabase'\n\n/**\n * The migrations array that SHOULD be used when initializing a TypeORM database connection.\n *\n * These ensure the correct creation of tables and the proper migrations of data when tables change between versions.\n *\n * @public\n */\nexport const kvStoreMigrations = [CreateKVDatabaseMigration]\n"],"mappings":"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","names":["Keyv","EventEmitter","opts","namespace","iterator","constructor","uri","options","emitErrors","undefined","serialize","JSONB","stringify","deserialize","parse","store","Error","compression","bind","on","error","emit","generateIterator","keyv","key","raw","data","includes","expires","Date","now","delete","_getKeyUnprefix","value","Symbol","Map","_checkIterableAdapter","dialect","iterableAdapters","url","findIndex","element","_getKeyPrefix","_getKeyPrefixArray","keys","map","split","splice","join","getMany","keyPrefixed","promise","isMapWithEntries","getFromMapWithPrefix","Promise","all","k","get","allValues","resolve","results","then","entries","Array","isArray","forEach","index","result","final","push","prefixes","flatMap","prefix","matchedValues","from","filter","startsWith","length","rows","row","isExpired","toValue","d","set","ttl","input","deleteMany","promises","allSettled","values","every","x","valueOf","clear","has","disconnect","KeyValueStore","keyv","constructor","options","Keyv","uri","get","key","result","raw","undefined","getAsValueData","value","expires","toDeserializedValueData","getMany","keys","length","Array","forEach","push","map","v","getManyAsValueData","set","ttl","then","has","delete","deleteMany","Promise","all","clear","disconnect","kvStoreOn","args","on","eventName","listener","Error","import_events","KeyValueTieredStoreAdapter","EventEmitter","opts","remote","local","iterationLimit","namespace","constructor","options","validator","dialect","isMap","Keyv","get","key","Array","isArray","getMany","localResult","undefined","remoteResult","value","ttl","expires","Date","now","set","delete","keys","promises","push","values","Promise","all","data","toSet","map","store","clear","toClear","localOnly","toDelete","deleted","every","Boolean","deleteMany","has","response","iterator","limit","Number","parseInt","entries","Map","import_events","import_typeorm","KeyValueStoreEntity","BaseEntity","key","data","expires","type","import_json_buffer","import_typeorm","debug","Debug","CreateKVDatabaseMigration","_tableName","name","constructor","tableName","up","queryRunner","getTableName","givenName","connection","entityMetadatas","find","meta","givenTableName","createTable","Table","columns","type","isPrimary","isNullable","indices","columnNames","isUnique","down","Error","kvStoreMigrations","CreateKVDatabaseMigration","KeyValueTypeORMStoreAdapter","EventEmitter","dbConnection","namespace","opts","constructor","options","validator","dialect","serialize","JSONB","stringify","deserialize","parse","get","key","Array","isArray","getMany","connection","_getConnectedDb","result","getRepository","KeyValueStoreEntity","findOneBy","raw","data","value","expires","keys","results","findBy","In","values","map","find","undefined","Promise","all","set","ttl","entity","save","delete","deleteMany","affected","clear","Like","has","countBy","disconnect","destroy","isInitialized","initialize"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/keyv/keyv.ts","../src/key-value-store.ts","../src/store-adapters/tiered/index.ts","../src/store-adapters/typeorm/index.ts","../src/store-adapters/typeorm/entities/keyValueStoreEntity.ts","../src/store-adapters/typeorm/migrations/1.createKVDatabase.ts","../src/store-adapters/typeorm/migrations/index.ts"],"sourcesContent":["/**\n * Provides a {@link @sphereon/ssi-sdk.kv-store-temp#KeyValueStore} for the\n * {@link @veramo/core#Agent} plugin that implements {@link @sphereon/ssi-sdk.kv-store-temp#IKeyValueStore} interface\n *\n * @packageDocumentation\n */\nexport { KeyValueStore } from './key-value-store'\nexport * from './store-adapters/tiered/index'\nexport * from './store-adapters/typeorm/index'\nexport * from './key-value-types'\n","import { EventEmitter } from 'events'\nimport JSONB from 'json-buffer'\nimport { KeyvDeserializedData, KeyvOptions, KeyvStore, KeyvStoredData } from './keyv-types'\n\n/**\n * Please note that this is code adapted from @link https://github.com/jaredwray/keyv to support Typescript and ESM in Veramo\n *\n * The code should support the storage plugins available for the keyv project.\n * Veramo itself supports NodeJS, Browser and React-Native environment.\n * Please be aware that these requirements probably aren't true for any keyv storage plugins.\n *\n * One of the big changes compared to the upstream project is that this port does not have dynamic loading of store-adapters based on URIs.\n * We believe that any Veramo Key Value store should use explicitly defined store-adapters.\n *\n * The port is part of the Veramo Key Value Store module, as we do not want to make an official maintained port out of it.\n * Veramo exposes its own API/interfaces for the Key Value store, meaning we could also support any other implementation in the future\n *\n * The Veramo kv-store module provides out of the box support for in memory/maps, sqlite and typeorm implementations,\n * including a tiered local/remote implementation that support all environments.\n *\n * We welcome any new storage modules\n */\nexport class Keyv<Value = any> extends EventEmitter implements KeyvStore<Value> {\n readonly opts: KeyvOptions<Value>\n readonly namespace: string\n iterator?: (namespace?: string) => AsyncGenerator<any, void>\n\n constructor(uri?: string | Map<string, Value | undefined> | KeyvStore<Value> | undefined, options?: KeyvOptions<Value>) {\n super()\n const emitErrors = options?.emitErrors === undefined ? true : options.emitErrors\n uri = uri ?? options?.uri\n /*if (!uri) {\n throw Error('No URI provided')\n }*/\n this.opts = {\n namespace: 'keyv',\n serialize: JSONB.stringify,\n deserialize: JSONB.parse,\n ...(typeof uri === 'string' ? { uri } : uri),\n ...options,\n }\n\n if (!this.opts.store) {\n if (typeof uri !== 'string') {\n this.opts.store = uri as KeyvStore<Value | undefined>\n } /* else {\n const adapterOptions = { ...this.opts }\n this.opts.store = loadStore(adapterOptions)\n }*/\n }\n if (!this.opts.store) {\n throw Error('No store')\n }\n\n if (this.opts.compression) {\n const compression = this.opts.compression\n this.opts.serialize = compression.serialize.bind(compression)\n this.opts.deserialize = compression.deserialize.bind(compression)\n }\n\n if (typeof this.opts.store.on === 'function' && emitErrors) {\n this.opts.store.on('error', (error) => this.emit('error', error))\n }\n\n this.opts.store.namespace = this.opts.namespace || 'keyv'\n this.namespace = this.opts.store.namespace\n\n const generateIterator = (iterator: any, keyv: Keyv<any>) =>\n async function* () {\n for await (const [key, raw] of typeof iterator === 'function' ? iterator(keyv.store.namespace) : iterator) {\n const data = await keyv.deserialize(raw)\n if (keyv.store.namespace && !key.includes(keyv.store.namespace)) {\n continue\n }\n\n if (data && typeof data.expires === 'number' && Date.now() > data.expires) {\n keyv.delete(key)\n continue\n }\n\n yield [keyv._getKeyUnprefix(key), data?.value]\n }\n }\n\n // Attach iterators\n // @ts-ignore\n if (typeof this.store[Symbol.iterator] === 'function' && this.store instanceof Map) {\n this.iterator = generateIterator(this.store, this)\n } else if (typeof this.store.iterator === 'function' && this.store.opts && this._checkIterableAdapter()) {\n this.iterator = generateIterator(this.store.iterator.bind(this.store), this)\n }\n }\n\n get store(): Required<KeyvStore<Value>> {\n return this.opts.store as Required<KeyvStore<Value>>\n }\n\n get deserialize() {\n return this.opts.deserialize!\n }\n\n get serialize() {\n return this.opts.serialize!\n }\n\n _checkIterableAdapter() {\n return (\n (this.store.opts.dialect && iterableAdapters.includes(this.store.opts.dialect)) ||\n (this.store.opts.url && iterableAdapters.findIndex((element) => this.store.opts.url.includes(element)) >= 0)\n )\n }\n\n _getKeyPrefix(key: string): string {\n return `${this.opts.namespace}:${key}`\n }\n\n _getKeyPrefixArray(keys: string[]): string[] {\n return keys.map((key) => this._getKeyPrefix(key))\n }\n\n _getKeyUnprefix(key: string): string {\n return key.split(':').splice(1).join(':')\n }\n\n async getMany(keys: string[], options?: { raw?: boolean }): Promise<Array<KeyvStoredData<Value>>> {\n const keyPrefixed = this._getKeyPrefixArray(keys)\n let promise: Promise<Array<KeyvStoredData<Value>>>\n if (this.store.getMany !== undefined) {\n // todo: Probably wise to check expired ValueData here, if the getMany does not implement this feature itself!\n promise = this.store.getMany(keyPrefixed, options) as Promise<KeyvStoredData<Value>[]>\n } else if (this.isMapWithEntries(this.store)) {\n // Handle Map-based stores with prefix matching\n promise = this.getFromMapWithPrefix(keyPrefixed)\n } else {\n promise = Promise.all(keyPrefixed.map((k) => this.store.get(k, options) as Promise<KeyvStoredData<Value>>))\n }\n const allValues = Promise.resolve(promise)\n const results: Promise<KeyvStoredData<Value>>[] = []\n\n return Promise.resolve(allValues)\n .then((all) => {\n const entries = Array.isArray(all) ? all : [all]\n entries.forEach((data, index) => {\n let result = typeof data === 'string' ? this.deserialize(data) : !!data && this.opts.compression ? this.deserialize(data) : data\n\n if (result && typeof result === 'object' && 'expires' in result && typeof result.expires === 'number' && Date.now() > result.expires) {\n this.delete(keys[index])\n result = undefined\n }\n\n const final = (\n options && options.raw ? result : result && typeof result === 'object' && 'value' in result ? result.value : result\n ) as Promise<KeyvStoredData<Value>>\n\n results.push(final)\n })\n })\n .then(() => Promise.all(results))\n }\n\n private isMapWithEntries(store: any): store is Map<string, Value> {\n return store instanceof Map && typeof store.entries === 'function'\n }\n\n private async getFromMapWithPrefix(prefixes: string[]): Promise<Array<KeyvStoredData<Value> | undefined>> {\n if (!this.isMapWithEntries(this.store)) {\n return []\n }\n\n const map = this.store as Map<string, Value>\n\n return prefixes.flatMap((prefix) => {\n const matchedValues = Array.from(map.entries())\n .filter(([key]) => key.startsWith(prefix))\n .map(([, value]) => value as KeyvStoredData<Value>)\n\n return matchedValues.length > 0 ? matchedValues : [undefined]\n })\n }\n\n async get(\n key: string | string[],\n options?: { raw?: boolean },\n ): Promise<Value | string | KeyvDeserializedData<Value> | KeyvStoredData<Value>[] | undefined> {\n const isArray = Array.isArray(key)\n return Promise.resolve()\n .then(() => (isArray ? this.getMany(this._getKeyPrefixArray(key), options) : this.store.get(this._getKeyPrefix(key))))\n .then((data) => (typeof data === 'string' ? this.deserialize(data) : this.opts.compression ? this.deserialize(data) : data))\n .then((data) => {\n if (data === undefined || data === null) {\n return undefined\n }\n const rows = Array.isArray(data) ? data : [data]\n\n if (isArray) {\n const result = []\n\n for (let row of rows) {\n if (row === undefined || row === null) {\n result.push(undefined)\n continue\n }\n\n if (this.isExpired(row)) {\n this.delete(key).then(() => undefined)\n result.push(undefined)\n } else {\n result.push(options && options.raw ? row : toValue(row))\n }\n }\n\n return result\n } else if (!Array.isArray(data)) {\n if (this.isExpired(data)) {\n return this.delete(key).then(() => undefined)\n }\n }\n\n return options && options.raw ? data : Array.isArray(data) ? data.map((d) => toValue(d)) : toValue(data)\n })\n }\n\n private isExpired(data: KeyvDeserializedData<any> | string | Value): boolean {\n return (\n typeof data !== 'string' &&\n data &&\n typeof data === 'object' &&\n 'expires' in data &&\n typeof data.expires === 'number' &&\n Date.now() > data.expires\n )\n }\n\n set(key: string, value: Value, ttl?: number) {\n const keyPrefixed = this._getKeyPrefix(key)\n if (typeof ttl === 'undefined') {\n ttl = this.opts.ttl\n }\n if (ttl === 0) {\n ttl = undefined\n }\n\n // @ts-ignore\n return Promise.resolve()\n .then(() => {\n const expires = typeof ttl === 'number' ? Date.now() + ttl : undefined\n if (typeof value === 'symbol') {\n this.emit('error', 'symbol cannot be serialized')\n }\n\n const input = { value, expires }\n return this.serialize(input)\n })\n .then((value) => this.store.set(keyPrefixed, value as Value, ttl))\n .then(() => true)\n }\n\n delete(key: string | string[]) {\n if (!Array.isArray(key)) {\n const keyPrefixed = this._getKeyPrefix(key)\n return Promise.resolve().then(() => this.store.delete(keyPrefixed))\n }\n\n const keyPrefixed = this._getKeyPrefixArray(key)\n if (this.store.deleteMany !== undefined) {\n return Promise.resolve().then(() => this.store.deleteMany!(keyPrefixed))\n }\n\n const promises = []\n for (const key of keyPrefixed) {\n promises.push(this.store.delete(key))\n }\n\n return Promise.allSettled(promises).then((values) => values.every((x) => x.valueOf() === true))\n }\n\n async clear(): Promise<void> {\n return Promise.resolve().then(() => this.store.clear())\n }\n\n has(key: string) {\n const keyPrefixed = this._getKeyPrefix(key)\n return Promise.resolve().then(async () => {\n if (typeof this.store.has === 'function') {\n return this.store.has(keyPrefixed)\n }\n\n const value = await this.store.get(keyPrefixed)\n return value !== undefined\n })\n }\n\n disconnect() {\n if (typeof this.store.disconnect === 'function') {\n return this.store.disconnect()\n }\n }\n}\n\nconst iterableAdapters = ['sqlite', 'postgres', 'mysql', 'mongo', 'redis', 'tiered']\n\nfunction toValue<Value>(input: KeyvDeserializedData<Value> | string | Value) {\n return input !== null && typeof input === 'object' && 'value' in input ? input.value : input\n}\n","import { IKeyValueStore, IKeyValueStoreOnArgs, IKeyValueStoreOptions, IValueData, ValueStoreType } from './key-value-types'\nimport { Keyv } from './keyv/keyv'\nimport { KeyvDeserializedData, KeyvOptions, KeyvStoredData } from './keyv/keyv-types'\n\n/**\n * Agent plugin that implements {@link @sphereon/ssi-sdk.kv-store-temp#IKeyValueStore} interface\n * @public\n */\nexport class KeyValueStore<ValueType extends ValueStoreType> implements IKeyValueStore<ValueType> {\n /**\n * The main keyv typescript port which delegates to the storage adapters and takes care of some common functionality\n *\n * @internal\n */\n private readonly keyv: Keyv<ValueType>\n\n constructor(options: IKeyValueStoreOptions<ValueType>) {\n this.keyv = new Keyv(options.uri, options as KeyvOptions<ValueType>)\n }\n\n async get(key: string): Promise<ValueType | undefined> {\n const result = await this.keyv.get(key, { raw: false })\n if (result === null || result === undefined) {\n return undefined\n }\n return result as ValueType\n }\n\n async getAsValueData(key: string): Promise<IValueData<ValueType>> {\n const result = await this.keyv.get(key, { raw: true })\n if (result === null || result === undefined) {\n // We always return a ValueData object for this method\n return { value: undefined, expires: undefined }\n }\n return this.toDeserializedValueData(result)\n }\n\n async getMany(keys: string[]): Promise<Array<ValueType | undefined>> {\n if (!keys || keys.length === 0) {\n return []\n }\n let result = await this.keyv.getMany(keys, { raw: false })\n\n // Making sure we return the same array length as the amount of key(s) passed in\n if (result === null || result === undefined || result.length === 0) {\n result = new Array<ValueType | undefined>()\n keys.forEach(() => result.push(undefined))\n }\n return result.map((v) => (!!v ? (v as ValueType) : undefined))\n }\n\n async getManyAsValueData(keys: string[]): Promise<Array<IValueData<ValueType>>> {\n if (!keys || keys.length === 0) {\n return []\n }\n let result = await this.keyv.getMany(keys, { raw: true })\n\n // Making sure we return the same array length as the amount of key(s) passed in\n if (result === null || result === undefined || result.length === 0) {\n result = new Array<KeyvStoredData<ValueType>>()\n keys.forEach(() => result.push({ value: undefined, expires: undefined } as unknown as KeyvDeserializedData<ValueType>))\n }\n return result.map((v) => (!!v ? this.toDeserializedValueData(v) : { value: undefined, expires: undefined }))\n }\n\n async set(key: string, value: ValueType, ttl?: number): Promise<IValueData<ValueType>> {\n return this.keyv.set(key, value, ttl).then(() => this.getAsValueData(key))\n }\n\n async has(key: string): Promise<boolean> {\n return this.keyv.has(key)\n }\n\n async delete(key: string): Promise<boolean> {\n return this.keyv.delete(key)\n }\n\n async deleteMany(keys: string[]): Promise<boolean[]> {\n return Promise.all(keys.map((key) => this.keyv.delete(key)))\n }\n\n async clear(): Promise<IKeyValueStore<ValueType>> {\n return this.keyv.clear().then(() => this)\n }\n\n async disconnect(): Promise<void> {\n return this.keyv.disconnect()\n }\n\n // Public so parties using the kv store directly can add listeners if they want\n async kvStoreOn(args: IKeyValueStoreOnArgs): Promise<IKeyValueStore<ValueType>> {\n this.keyv.on(args.eventName, args.listener)\n return this\n }\n\n private toDeserializedValueData<ValueType>(result: any): IValueData<ValueType> {\n if (result === null || result === undefined) {\n throw Error(`Result cannot be undefined or null at this this point`)\n } else if (typeof result !== 'object') {\n return { value: result, expires: undefined }\n } else if (!('value' in result)) {\n return { value: result, expires: undefined }\n }\n if (!('expires' in result)) {\n result.expires = undefined\n }\n return result as IValueData<ValueType>\n }\n}\n","import { EventEmitter } from 'events'\nimport type { Options, Options_ } from './types'\nimport { KeyvStore, KeyvStoredData } from '../../keyv/keyv-types'\nimport { Keyv } from '../../keyv/keyv'\nimport { IKeyValueStoreAdapter } from '../../key-value-types'\n\ntype KeyvTieredIndex = 'local' | 'remote'\n\n/**\n * Tiered keyv store adapter, combining 2 adapters/stores into one\n * @alpha\n */\nexport class KeyValueTieredStoreAdapter<Value> extends EventEmitter implements KeyvStore<Value>, IKeyValueStoreAdapter<Value> {\n opts: Options_\n remote: KeyvStore<Value>\n local: KeyvStore<Value>\n iterationLimit?: string | number\n\n namespace?: string | undefined\n\n constructor({ remote, local, ...options }: Options<Value>) {\n super()\n this.opts = {\n validator: () => true,\n dialect: 'tiered',\n ...options,\n }\n\n // todo: since we are instantiating a new Keyv object in case we encounter a map, the key prefix applied twice, given it will be part of a an outer keyv object as well.\n // Probably wise to simply create a Map Store class. As it is an in memory construct, and will work in terms of resolution it does not have highest priority\n this.local = (isMap(local) ? new Keyv<Value>(local as Map<string, Value>) : local) as KeyvStore<Value>\n this.remote = (isMap(remote) ? new Keyv<Value>(remote as Map<string, Value>) : remote) as KeyvStore<Value>\n this.namespace = this.local.namespace\n }\n\n async get(key: string | string[], options?: { raw?: boolean }): Promise<KeyvStoredData<Value> | Array<KeyvStoredData<Value>>> {\n if (Array.isArray(key)) {\n return await this.getMany(key, options)\n }\n const localResult = (await this.local.get(key, options)) as KeyvStoredData<Value>\n\n if (localResult === undefined || !this.opts.validator(localResult, key)) {\n const remoteResult = await this.remote.get(key, options)\n\n if (remoteResult !== localResult) {\n const value = (\n !!remoteResult ? (typeof remoteResult === 'object' && 'value' in remoteResult ? remoteResult.value : remoteResult) : undefined\n ) as Value\n const ttl =\n !!remoteResult && typeof remoteResult === 'object' && 'expires' in remoteResult && remoteResult.expires\n ? remoteResult.expires - Date.now()\n : undefined\n if (!ttl || ttl > 0) {\n await this.local.set(key, value, ttl)\n } else {\n this.local.delete(key)\n }\n }\n return remoteResult\n }\n\n return localResult\n }\n\n async getMany(keys: string[], options?: { raw?: boolean }): Promise<Array<KeyvStoredData<Value>>> {\n const promises: Array<Promise<KeyvStoredData<Value>>> = []\n for (const key of keys) {\n promises.push(this.get(key, options) as Promise<KeyvStoredData<Value>>)\n }\n\n const values = await Promise.all(promises)\n const data: Array<KeyvStoredData<Value>> | undefined = []\n for (const value of values) {\n data.push(value as KeyvStoredData<Value>)\n }\n return data\n }\n\n async set(key: string, value: any, ttl?: number) {\n const toSet: KeyvTieredIndex[] = ['local', 'remote']\n return Promise.all(toSet.map(async (store) => this[store].set(key, value, ttl)))\n }\n\n async clear(): Promise<undefined> {\n const toClear: KeyvTieredIndex[] = ['local']\n if (!this.opts.localOnly) {\n toClear.push('remote')\n }\n\n await Promise.all(toClear.map(async (store) => this[store].clear()))\n\n return undefined\n }\n\n async delete(key: string): Promise<boolean> {\n const toDelete: KeyvTieredIndex[] = ['local']\n if (!this.opts.localOnly) {\n toDelete.push('remote')\n }\n\n const deleted = await Promise.all(toDelete.map(async (store) => this[store].delete(key)))\n\n return deleted.every(Boolean)\n }\n\n async deleteMany(keys: string[]): Promise<boolean> {\n const promises = []\n for (const key of keys) {\n promises.push(this.delete(key))\n }\n\n const values = await Promise.all(promises)\n\n return values.every(Boolean)\n }\n\n async has(key: string): Promise<boolean> {\n let response\n if (typeof this.local.has === 'function') {\n response = this.local.has(key)\n } else {\n const value = await this.local.get(key)\n response = value !== undefined\n }\n if (!response || !this.opts.validator(response, key)) {\n if (typeof this.remote.has === 'function') {\n response = this.remote.has(key)\n } else {\n const value = await this.remote.get(key)\n response = value !== undefined\n }\n }\n return response\n }\n\n async *iterator(namespace?: string): AsyncGenerator<any, void, any> {\n const limit = Number.parseInt(this.iterationLimit as string, 10) || 10\n this.remote.opts.iterationLimit = limit\n if (this.remote && typeof this.remote.iterator === 'function') {\n for await (const entries of this.remote.iterator(namespace)) {\n yield entries\n }\n }\n }\n}\n\nfunction isMap(map: any) {\n if (map instanceof Map) {\n return true\n } else if (\n map &&\n typeof map.clear === 'function' &&\n typeof map.delete === 'function' &&\n typeof map.get === 'function' &&\n typeof map.has === 'function' &&\n typeof map.set === 'function'\n ) {\n return true\n }\n\n return false\n}\n","import { EventEmitter } from 'events'\nimport { OrPromise } from '@veramo/utils'\nimport { DataSource, In, Like } from 'typeorm'\nimport { KeyValueStoreEntity } from './entities/keyValueStoreEntity'\nimport { KeyValueTypeORMOptions, Options_ } from './types'\nimport { KeyvStore, KeyvStoredData } from '../../keyv/keyv-types'\nimport { IKeyValueStoreAdapter } from '../../key-value-types'\nimport JSONB from 'json-buffer'\nexport { KeyValueStoreEntity } from './entities/keyValueStoreEntity'\nexport { kvStoreMigrations } from './migrations/index'\n\n/**\n * TypeORM based key value store adapter\n * @beta\n */\nexport class KeyValueTypeORMStoreAdapter extends EventEmitter implements KeyvStore<string>, IKeyValueStoreAdapter<string> {\n private readonly dbConnection: OrPromise<DataSource>\n readonly namespace: string\n opts: Options_<string>\n\n constructor(options: KeyValueTypeORMOptions) {\n super()\n this.dbConnection = options.dbConnection\n this.namespace = options.namespace || 'keyv'\n this.opts = {\n validator: () => true,\n dialect: 'typeorm',\n serialize: JSONB.stringify,\n deserialize: JSONB.parse,\n ...options,\n }\n }\n\n async get(key: string | string[], options?: { raw?: boolean }): Promise<KeyvStoredData<string> | Array<KeyvStoredData<string>>> {\n if (Array.isArray(key)) {\n return this.getMany(key, options)\n }\n const connection = await _getConnectedDb(this.dbConnection)\n const result = await connection.getRepository(KeyValueStoreEntity).findOneBy({\n key,\n })\n return options?.raw !== true || !result ? result?.data : { value: result?.data, expires: result?.expires }\n }\n\n async getMany(keys: string[], options?: { raw?: boolean }): Promise<Array<KeyvStoredData<string>>> {\n const connection = await _getConnectedDb(this.dbConnection)\n const results = await connection.getRepository(KeyValueStoreEntity).findBy({\n key: In(keys),\n })\n const values = keys.map(async (key) => {\n const result = results.find((result) => result.key === key)\n return options?.raw !== true || !result\n ? (result?.data as KeyvStoredData<string>)\n : ({\n value: result?.data ? (await this.opts.deserialize(result.data))?.value : undefined,\n expires: result?.expires,\n } as KeyvStoredData<string>)\n })\n\n return Promise.all(values)\n }\n\n async set(key: string, value: string, ttl?: number): Promise<KeyvStoredData<string>> {\n const connection = await _getConnectedDb(this.dbConnection)\n const entity = new KeyValueStoreEntity()\n entity.key = key\n entity.data = value\n entity.expires = ttl\n await connection.getRepository(KeyValueStoreEntity).save(entity)\n return { value: value, expires: ttl }\n }\n\n async delete(key: string | string[]): Promise<boolean> {\n if (Array.isArray(key)) {\n return this.deleteMany(key)\n }\n const connection = await _getConnectedDb(this.dbConnection)\n const result = await connection.getRepository(KeyValueStoreEntity).delete({ key })\n return result.affected === 1\n }\n\n async deleteMany(keys: string[]): Promise<boolean> {\n const connection = await _getConnectedDb(this.dbConnection)\n const results = await connection.getRepository(KeyValueStoreEntity).delete({\n key: In(keys),\n })\n return !!results.affected && results.affected >= 1\n }\n\n async clear(): Promise<void> {\n const connection = await _getConnectedDb(this.dbConnection)\n await connection.getRepository(KeyValueStoreEntity).delete({\n key: Like(`${this.namespace}:%`),\n })\n }\n\n async has(key: string): Promise<boolean> {\n const connection = await _getConnectedDb(this.dbConnection)\n const result = await connection.getRepository(KeyValueStoreEntity).countBy({\n key,\n })\n return result === 1\n }\n\n async disconnect(): Promise<void> {\n const connection = await _getConnectedDb(this.dbConnection)\n await connection.destroy()\n }\n}\n\n/**\n * Ensures that the provided DataSource is connected.\n *\n * @param dbConnection - a TypeORM DataSource or a Promise that resolves to a DataSource\n * @internal\n */\nexport async function _getConnectedDb(dbConnection: OrPromise<DataSource>): Promise<DataSource> {\n if (dbConnection instanceof Promise) {\n return await dbConnection\n } else if (!dbConnection.isInitialized) {\n return await (<DataSource>dbConnection).initialize()\n } else {\n return dbConnection\n }\n}\n","import { BaseEntity, Column, Entity, PrimaryColumn } from 'typeorm'\n\n/**\n *\n * @beta This API may change without a BREAKING CHANGE notice.\n */\n@Entity('keyvaluestore')\nexport class KeyValueStoreEntity extends BaseEntity {\n @PrimaryColumn('text')\n key!: string\n\n @Column({\n type: 'text',\n })\n data!: string\n\n expires?: number\n}\n","import { MigrationInterface, QueryRunner, Table } from 'typeorm'\nimport Debug from 'debug'\nconst debug = Debug('veramo:kv-store:initial-migration')\n\n/**\n * Create the database layout for Veramo 3.0\n *\n * @public\n */\nexport class CreateKVDatabaseMigration implements MigrationInterface {\n private readonly _tableName: string\n readonly name: string\n\n constructor(tableName?: string) {\n this._tableName = tableName || 'keyvaluestore'\n this.name = `CreateKVDatabase${tableName}1680297189001`\n }\n\n async up(queryRunner: QueryRunner): Promise<void> {\n function getTableName(givenName: string): string {\n return queryRunner.connection.entityMetadatas.find((meta) => meta.givenTableName === givenName)?.tableName || givenName\n }\n\n debug(`creating ${this._tableName} table`)\n // CREATE TABLE \"keyvaluestore\" (\"key\" varchar PRIMARY KEY NOT NULL, \"data\" text NOT NULL)\n await queryRunner.createTable(\n new Table({\n name: getTableName(this._tableName),\n columns: [\n { name: 'key', type: 'varchar', isPrimary: true },\n { name: 'data', type: 'text', isNullable: false },\n ],\n indices: [\n {\n columnNames: ['key'],\n isUnique: true,\n },\n ],\n }),\n true,\n )\n }\n\n async down(queryRunner: QueryRunner): Promise<void> {\n throw new Error('illegal_operation: cannot roll back initial migration')\n }\n}\n","import { CreateKVDatabaseMigration } from './1.createKVDatabase'\n\n/**\n * The migrations array that SHOULD be used when initializing a TypeORM database connection.\n *\n * These ensure the correct creation of tables and the proper migrations of data when tables change between versions.\n *\n * @public\n */\nexport const kvStoreMigrations = [CreateKVDatabaseMigration]\n"],"mappings":"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","names":["Keyv","EventEmitter","opts","namespace","iterator","uri","options","emitErrors","undefined","serialize","JSONB","stringify","deserialize","parse","store","Error","compression","bind","on","error","emit","generateIterator","keyv","key","raw","data","includes","expires","Date","now","delete","_getKeyUnprefix","value","Symbol","Map","_checkIterableAdapter","dialect","iterableAdapters","url","findIndex","element","_getKeyPrefix","_getKeyPrefixArray","keys","map","split","splice","join","getMany","keyPrefixed","promise","isMapWithEntries","getFromMapWithPrefix","Promise","all","k","get","allValues","resolve","results","then","entries","Array","isArray","forEach","index","result","final","push","prefixes","flatMap","prefix","matchedValues","from","filter","startsWith","length","rows","row","isExpired","toValue","d","set","ttl","input","deleteMany","promises","allSettled","values","every","x","valueOf","clear","has","disconnect","KeyValueStore","keyv","options","Keyv","uri","get","key","result","raw","undefined","getAsValueData","value","expires","toDeserializedValueData","getMany","keys","length","Array","forEach","push","map","v","getManyAsValueData","set","ttl","then","has","delete","deleteMany","Promise","all","clear","disconnect","kvStoreOn","args","on","eventName","listener","Error","import_events","KeyValueTieredStoreAdapter","EventEmitter","opts","remote","local","iterationLimit","namespace","options","validator","dialect","isMap","Keyv","get","key","Array","isArray","getMany","localResult","undefined","remoteResult","value","ttl","expires","Date","now","set","delete","keys","promises","push","values","Promise","all","data","toSet","map","store","clear","toClear","localOnly","toDelete","deleted","every","Boolean","deleteMany","has","response","iterator","limit","Number","parseInt","entries","Map","import_events","import_typeorm","KeyValueStoreEntity","BaseEntity","key","data","expires","type","import_json_buffer","import_typeorm","debug","Debug","CreateKVDatabaseMigration","_tableName","name","tableName","up","queryRunner","getTableName","givenName","connection","entityMetadatas","find","meta","givenTableName","createTable","Table","columns","type","isPrimary","isNullable","indices","columnNames","isUnique","down","Error","kvStoreMigrations","CreateKVDatabaseMigration","KeyValueTypeORMStoreAdapter","EventEmitter","dbConnection","namespace","opts","options","validator","dialect","serialize","JSONB","stringify","deserialize","parse","get","key","Array","isArray","getMany","connection","_getConnectedDb","result","getRepository","KeyValueStoreEntity","findOneBy","raw","data","value","expires","keys","results","findBy","In","values","map","find","undefined","Promise","all","set","ttl","entity","save","delete","deleteMany","affected","clear","Like","has","countBy","disconnect","destroy","isInitialized","initialize"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/keyv/keyv.ts","../src/key-value-store.ts","../src/store-adapters/tiered/index.ts","../src/store-adapters/typeorm/index.ts","../src/store-adapters/typeorm/entities/keyValueStoreEntity.ts","../src/store-adapters/typeorm/migrations/1.createKVDatabase.ts","../src/store-adapters/typeorm/migrations/index.ts"],"sourcesContent":["import { EventEmitter } from 'events'\nimport JSONB from 'json-buffer'\nimport { KeyvDeserializedData, KeyvOptions, KeyvStore, KeyvStoredData } from './keyv-types'\n\n/**\n * Please note that this is code adapted from @link https://github.com/jaredwray/keyv to support Typescript and ESM in Veramo\n *\n * The code should support the storage plugins available for the keyv project.\n * Veramo itself supports NodeJS, Browser and React-Native environment.\n * Please be aware that these requirements probably aren't true for any keyv storage plugins.\n *\n * One of the big changes compared to the upstream project is that this port does not have dynamic loading of store-adapters based on URIs.\n * We believe that any Veramo Key Value store should use explicitly defined store-adapters.\n *\n * The port is part of the Veramo Key Value Store module, as we do not want to make an official maintained port out of it.\n * Veramo exposes its own API/interfaces for the Key Value store, meaning we could also support any other implementation in the future\n *\n * The Veramo kv-store module provides out of the box support for in memory/maps, sqlite and typeorm implementations,\n * including a tiered local/remote implementation that support all environments.\n *\n * We welcome any new storage modules\n */\nexport class Keyv<Value = any> extends EventEmitter implements KeyvStore<Value> {\n readonly opts: KeyvOptions<Value>\n readonly namespace: string\n iterator?: (namespace?: string) => AsyncGenerator<any, void>\n\n constructor(uri?: string | Map<string, Value | undefined> | KeyvStore<Value> | undefined, options?: KeyvOptions<Value>) {\n super()\n const emitErrors = options?.emitErrors === undefined ? true : options.emitErrors\n uri = uri ?? options?.uri\n /*if (!uri) {\n throw Error('No URI provided')\n }*/\n this.opts = {\n namespace: 'keyv',\n serialize: JSONB.stringify,\n deserialize: JSONB.parse,\n ...(typeof uri === 'string' ? { uri } : uri),\n ...options,\n }\n\n if (!this.opts.store) {\n if (typeof uri !== 'string') {\n this.opts.store = uri as KeyvStore<Value | undefined>\n } /* else {\n const adapterOptions = { ...this.opts }\n this.opts.store = loadStore(adapterOptions)\n }*/\n }\n if (!this.opts.store) {\n throw Error('No store')\n }\n\n if (this.opts.compression) {\n const compression = this.opts.compression\n this.opts.serialize = compression.serialize.bind(compression)\n this.opts.deserialize = compression.deserialize.bind(compression)\n }\n\n if (typeof this.opts.store.on === 'function' && emitErrors) {\n this.opts.store.on('error', (error) => this.emit('error', error))\n }\n\n this.opts.store.namespace = this.opts.namespace || 'keyv'\n this.namespace = this.opts.store.namespace\n\n const generateIterator = (iterator: any, keyv: Keyv<any>) =>\n async function* () {\n for await (const [key, raw] of typeof iterator === 'function' ? iterator(keyv.store.namespace) : iterator) {\n const data = await keyv.deserialize(raw)\n if (keyv.store.namespace && !key.includes(keyv.store.namespace)) {\n continue\n }\n\n if (data && typeof data.expires === 'number' && Date.now() > data.expires) {\n keyv.delete(key)\n continue\n }\n\n yield [keyv._getKeyUnprefix(key), data?.value]\n }\n }\n\n // Attach iterators\n // @ts-ignore\n if (typeof this.store[Symbol.iterator] === 'function' && this.store instanceof Map) {\n this.iterator = generateIterator(this.store, this)\n } else if (typeof this.store.iterator === 'function' && this.store.opts && this._checkIterableAdapter()) {\n this.iterator = generateIterator(this.store.iterator.bind(this.store), this)\n }\n }\n\n get store(): Required<KeyvStore<Value>> {\n return this.opts.store as Required<KeyvStore<Value>>\n }\n\n get deserialize() {\n return this.opts.deserialize!\n }\n\n get serialize() {\n return this.opts.serialize!\n }\n\n _checkIterableAdapter() {\n return (\n (this.store.opts.dialect && iterableAdapters.includes(this.store.opts.dialect)) ||\n (this.store.opts.url && iterableAdapters.findIndex((element) => this.store.opts.url.includes(element)) >= 0)\n )\n }\n\n _getKeyPrefix(key: string): string {\n return `${this.opts.namespace}:${key}`\n }\n\n _getKeyPrefixArray(keys: string[]): string[] {\n return keys.map((key) => this._getKeyPrefix(key))\n }\n\n _getKeyUnprefix(key: string): string {\n return key.split(':').splice(1).join(':')\n }\n\n async getMany(keys: string[], options?: { raw?: boolean }): Promise<Array<KeyvStoredData<Value>>> {\n const keyPrefixed = this._getKeyPrefixArray(keys)\n let promise: Promise<Array<KeyvStoredData<Value>>>\n if (this.store.getMany !== undefined) {\n // todo: Probably wise to check expired ValueData here, if the getMany does not implement this feature itself!\n promise = this.store.getMany(keyPrefixed, options) as Promise<KeyvStoredData<Value>[]>\n } else if (this.isMapWithEntries(this.store)) {\n // Handle Map-based stores with prefix matching\n promise = this.getFromMapWithPrefix(keyPrefixed)\n } else {\n promise = Promise.all(keyPrefixed.map((k) => this.store.get(k, options) as Promise<KeyvStoredData<Value>>))\n }\n const allValues = Promise.resolve(promise)\n const results: Promise<KeyvStoredData<Value>>[] = []\n\n return Promise.resolve(allValues)\n .then((all) => {\n const entries = Array.isArray(all) ? all : [all]\n entries.forEach((data, index) => {\n let result = typeof data === 'string' ? this.deserialize(data) : !!data && this.opts.compression ? this.deserialize(data) : data\n\n if (result && typeof result === 'object' && 'expires' in result && typeof result.expires === 'number' && Date.now() > result.expires) {\n this.delete(keys[index])\n result = undefined\n }\n\n const final = (\n options && options.raw ? result : result && typeof result === 'object' && 'value' in result ? result.value : result\n ) as Promise<KeyvStoredData<Value>>\n\n results.push(final)\n })\n })\n .then(() => Promise.all(results))\n }\n\n private isMapWithEntries(store: any): store is Map<string, Value> {\n return store instanceof Map && typeof store.entries === 'function'\n }\n\n private async getFromMapWithPrefix(prefixes: string[]): Promise<Array<KeyvStoredData<Value> | undefined>> {\n if (!this.isMapWithEntries(this.store)) {\n return []\n }\n\n const map = this.store as Map<string, Value>\n\n return prefixes.flatMap((prefix) => {\n const matchedValues = Array.from(map.entries())\n .filter(([key]) => key.startsWith(prefix))\n .map(([, value]) => value as KeyvStoredData<Value>)\n\n return matchedValues.length > 0 ? matchedValues : [undefined]\n })\n }\n\n async get(\n key: string | string[],\n options?: { raw?: boolean },\n ): Promise<Value | string | KeyvDeserializedData<Value> | KeyvStoredData<Value>[] | undefined> {\n const isArray = Array.isArray(key)\n return Promise.resolve()\n .then(() => (isArray ? this.getMany(this._getKeyPrefixArray(key), options) : this.store.get(this._getKeyPrefix(key))))\n .then((data) => (typeof data === 'string' ? this.deserialize(data) : this.opts.compression ? this.deserialize(data) : data))\n .then((data) => {\n if (data === undefined || data === null) {\n return undefined\n }\n const rows = Array.isArray(data) ? data : [data]\n\n if (isArray) {\n const result = []\n\n for (let row of rows) {\n if (row === undefined || row === null) {\n result.push(undefined)\n continue\n }\n\n if (this.isExpired(row)) {\n this.delete(key).then(() => undefined)\n result.push(undefined)\n } else {\n result.push(options && options.raw ? row : toValue(row))\n }\n }\n\n return result\n } else if (!Array.isArray(data)) {\n if (this.isExpired(data)) {\n return this.delete(key).then(() => undefined)\n }\n }\n\n return options && options.raw ? data : Array.isArray(data) ? data.map((d) => toValue(d)) : toValue(data)\n })\n }\n\n private isExpired(data: KeyvDeserializedData<any> | string | Value): boolean {\n return (\n typeof data !== 'string' &&\n data &&\n typeof data === 'object' &&\n 'expires' in data &&\n typeof data.expires === 'number' &&\n Date.now() > data.expires\n )\n }\n\n set(key: string, value: Value, ttl?: number) {\n const keyPrefixed = this._getKeyPrefix(key)\n if (typeof ttl === 'undefined') {\n ttl = this.opts.ttl\n }\n if (ttl === 0) {\n ttl = undefined\n }\n\n // @ts-ignore\n return Promise.resolve()\n .then(() => {\n const expires = typeof ttl === 'number' ? Date.now() + ttl : undefined\n if (typeof value === 'symbol') {\n this.emit('error', 'symbol cannot be serialized')\n }\n\n const input = { value, expires }\n return this.serialize(input)\n })\n .then((value) => this.store.set(keyPrefixed, value as Value, ttl))\n .then(() => true)\n }\n\n delete(key: string | string[]) {\n if (!Array.isArray(key)) {\n const keyPrefixed = this._getKeyPrefix(key)\n return Promise.resolve().then(() => this.store.delete(keyPrefixed))\n }\n\n const keyPrefixed = this._getKeyPrefixArray(key)\n if (this.store.deleteMany !== undefined) {\n return Promise.resolve().then(() => this.store.deleteMany!(keyPrefixed))\n }\n\n const promises = []\n for (const key of keyPrefixed) {\n promises.push(this.store.delete(key))\n }\n\n return Promise.allSettled(promises).then((values) => values.every((x) => x.valueOf() === true))\n }\n\n async clear(): Promise<void> {\n return Promise.resolve().then(() => this.store.clear())\n }\n\n has(key: string) {\n const keyPrefixed = this._getKeyPrefix(key)\n return Promise.resolve().then(async () => {\n if (typeof this.store.has === 'function') {\n return this.store.has(keyPrefixed)\n }\n\n const value = await this.store.get(keyPrefixed)\n return value !== undefined\n })\n }\n\n disconnect() {\n if (typeof this.store.disconnect === 'function') {\n return this.store.disconnect()\n }\n }\n}\n\nconst iterableAdapters = ['sqlite', 'postgres', 'mysql', 'mongo', 'redis', 'tiered']\n\nfunction toValue<Value>(input: KeyvDeserializedData<Value> | string | Value) {\n return input !== null && typeof input === 'object' && 'value' in input ? input.value : input\n}\n","import { IKeyValueStore, IKeyValueStoreOnArgs, IKeyValueStoreOptions, IValueData, ValueStoreType } from './key-value-types'\nimport { Keyv } from './keyv/keyv'\nimport { KeyvDeserializedData, KeyvOptions, KeyvStoredData } from './keyv/keyv-types'\n\n/**\n * Agent plugin that implements {@link @sphereon/ssi-sdk.kv-store-temp#IKeyValueStore} interface\n * @public\n */\nexport class KeyValueStore<ValueType extends ValueStoreType> implements IKeyValueStore<ValueType> {\n /**\n * The main keyv typescript port which delegates to the storage adapters and takes care of some common functionality\n *\n * @internal\n */\n private readonly keyv: Keyv<ValueType>\n\n constructor(options: IKeyValueStoreOptions<ValueType>) {\n this.keyv = new Keyv(options.uri, options as KeyvOptions<ValueType>)\n }\n\n async get(key: string): Promise<ValueType | undefined> {\n const result = await this.keyv.get(key, { raw: false })\n if (result === null || result === undefined) {\n return undefined\n }\n return result as ValueType\n }\n\n async getAsValueData(key: string): Promise<IValueData<ValueType>> {\n const result = await this.keyv.get(key, { raw: true })\n if (result === null || result === undefined) {\n // We always return a ValueData object for this method\n return { value: undefined, expires: undefined }\n }\n return this.toDeserializedValueData(result)\n }\n\n async getMany(keys: string[]): Promise<Array<ValueType | undefined>> {\n if (!keys || keys.length === 0) {\n return []\n }\n let result = await this.keyv.getMany(keys, { raw: false })\n\n // Making sure we return the same array length as the amount of key(s) passed in\n if (result === null || result === undefined || result.length === 0) {\n result = new Array<ValueType | undefined>()\n keys.forEach(() => result.push(undefined))\n }\n return result.map((v) => (!!v ? (v as ValueType) : undefined))\n }\n\n async getManyAsValueData(keys: string[]): Promise<Array<IValueData<ValueType>>> {\n if (!keys || keys.length === 0) {\n return []\n }\n let result = await this.keyv.getMany(keys, { raw: true })\n\n // Making sure we return the same array length as the amount of key(s) passed in\n if (result === null || result === undefined || result.length === 0) {\n result = new Array<KeyvStoredData<ValueType>>()\n keys.forEach(() => result.push({ value: undefined, expires: undefined } as unknown as KeyvDeserializedData<ValueType>))\n }\n return result.map((v) => (!!v ? this.toDeserializedValueData(v) : { value: undefined, expires: undefined }))\n }\n\n async set(key: string, value: ValueType, ttl?: number): Promise<IValueData<ValueType>> {\n return this.keyv.set(key, value, ttl).then(() => this.getAsValueData(key))\n }\n\n async has(key: string): Promise<boolean> {\n return this.keyv.has(key)\n }\n\n async delete(key: string): Promise<boolean> {\n return this.keyv.delete(key)\n }\n\n async deleteMany(keys: string[]): Promise<boolean[]> {\n return Promise.all(keys.map((key) => this.keyv.delete(key)))\n }\n\n async clear(): Promise<IKeyValueStore<ValueType>> {\n return this.keyv.clear().then(() => this)\n }\n\n async disconnect(): Promise<void> {\n return this.keyv.disconnect()\n }\n\n // Public so parties using the kv store directly can add listeners if they want\n async kvStoreOn(args: IKeyValueStoreOnArgs): Promise<IKeyValueStore<ValueType>> {\n this.keyv.on(args.eventName, args.listener)\n return this\n }\n\n private toDeserializedValueData<ValueType>(result: any): IValueData<ValueType> {\n if (result === null || result === undefined) {\n throw Error(`Result cannot be undefined or null at this this point`)\n } else if (typeof result !== 'object') {\n return { value: result, expires: undefined }\n } else if (!('value' in result)) {\n return { value: result, expires: undefined }\n }\n if (!('expires' in result)) {\n result.expires = undefined\n }\n return result as IValueData<ValueType>\n }\n}\n","import { EventEmitter } from 'events'\nimport type { Options, Options_ } from './types'\nimport { KeyvStore, KeyvStoredData } from '../../keyv/keyv-types'\nimport { Keyv } from '../../keyv/keyv'\nimport { IKeyValueStoreAdapter } from '../../key-value-types'\n\ntype KeyvTieredIndex = 'local' | 'remote'\n\n/**\n * Tiered keyv store adapter, combining 2 adapters/stores into one\n * @alpha\n */\nexport class KeyValueTieredStoreAdapter<Value> extends EventEmitter implements KeyvStore<Value>, IKeyValueStoreAdapter<Value> {\n opts: Options_\n remote: KeyvStore<Value>\n local: KeyvStore<Value>\n iterationLimit?: string | number\n\n namespace?: string | undefined\n\n constructor({ remote, local, ...options }: Options<Value>) {\n super()\n this.opts = {\n validator: () => true,\n dialect: 'tiered',\n ...options,\n }\n\n // todo: since we are instantiating a new Keyv object in case we encounter a map, the key prefix applied twice, given it will be part of a an outer keyv object as well.\n // Probably wise to simply create a Map Store class. As it is an in memory construct, and will work in terms of resolution it does not have highest priority\n this.local = (isMap(local) ? new Keyv<Value>(local as Map<string, Value>) : local) as KeyvStore<Value>\n this.remote = (isMap(remote) ? new Keyv<Value>(remote as Map<string, Value>) : remote) as KeyvStore<Value>\n this.namespace = this.local.namespace\n }\n\n async get(key: string | string[], options?: { raw?: boolean }): Promise<KeyvStoredData<Value> | Array<KeyvStoredData<Value>>> {\n if (Array.isArray(key)) {\n return await this.getMany(key, options)\n }\n const localResult = (await this.local.get(key, options)) as KeyvStoredData<Value>\n\n if (localResult === undefined || !this.opts.validator(localResult, key)) {\n const remoteResult = await this.remote.get(key, options)\n\n if (remoteResult !== localResult) {\n const value = (\n !!remoteResult ? (typeof remoteResult === 'object' && 'value' in remoteResult ? remoteResult.value : remoteResult) : undefined\n ) as Value\n const ttl =\n !!remoteResult && typeof remoteResult === 'object' && 'expires' in remoteResult && remoteResult.expires\n ? remoteResult.expires - Date.now()\n : undefined\n if (!ttl || ttl > 0) {\n await this.local.set(key, value, ttl)\n } else {\n this.local.delete(key)\n }\n }\n return remoteResult\n }\n\n return localResult\n }\n\n async getMany(keys: string[], options?: { raw?: boolean }): Promise<Array<KeyvStoredData<Value>>> {\n const promises: Array<Promise<KeyvStoredData<Value>>> = []\n for (const key of keys) {\n promises.push(this.get(key, options) as Promise<KeyvStoredData<Value>>)\n }\n\n const values = await Promise.all(promises)\n const data: Array<KeyvStoredData<Value>> | undefined = []\n for (const value of values) {\n data.push(value as KeyvStoredData<Value>)\n }\n return data\n }\n\n async set(key: string, value: any, ttl?: number) {\n const toSet: KeyvTieredIndex[] = ['local', 'remote']\n return Promise.all(toSet.map(async (store) => this[store].set(key, value, ttl)))\n }\n\n async clear(): Promise<undefined> {\n const toClear: KeyvTieredIndex[] = ['local']\n if (!this.opts.localOnly) {\n toClear.push('remote')\n }\n\n await Promise.all(toClear.map(async (store) => this[store].clear()))\n\n return undefined\n }\n\n async delete(key: string): Promise<boolean> {\n const toDelete: KeyvTieredIndex[] = ['local']\n if (!this.opts.localOnly) {\n toDelete.push('remote')\n }\n\n const deleted = await Promise.all(toDelete.map(async (store) => this[store].delete(key)))\n\n return deleted.every(Boolean)\n }\n\n async deleteMany(keys: string[]): Promise<boolean> {\n const promises = []\n for (const key of keys) {\n promises.push(this.delete(key))\n }\n\n const values = await Promise.all(promises)\n\n return values.every(Boolean)\n }\n\n async has(key: string): Promise<boolean> {\n let response\n if (typeof this.local.has === 'function') {\n response = this.local.has(key)\n } else {\n const value = await this.local.get(key)\n response = value !== undefined\n }\n if (!response || !this.opts.validator(response, key)) {\n if (typeof this.remote.has === 'function') {\n response = this.remote.has(key)\n } else {\n const value = await this.remote.get(key)\n response = value !== undefined\n }\n }\n return response\n }\n\n async *iterator(namespace?: string): AsyncGenerator<any, void, any> {\n const limit = Number.parseInt(this.iterationLimit as string, 10) || 10\n this.remote.opts.iterationLimit = limit\n if (this.remote && typeof this.remote.iterator === 'function') {\n for await (const entries of this.remote.iterator(namespace)) {\n yield entries\n }\n }\n }\n}\n\nfunction isMap(map: any) {\n if (map instanceof Map) {\n return true\n } else if (\n map &&\n typeof map.clear === 'function' &&\n typeof map.delete === 'function' &&\n typeof map.get === 'function' &&\n typeof map.has === 'function' &&\n typeof map.set === 'function'\n ) {\n return true\n }\n\n return false\n}\n","import { EventEmitter } from 'events'\nimport { OrPromise } from '@veramo/utils'\nimport { DataSource, In, Like } from 'typeorm'\nimport { KeyValueStoreEntity } from './entities/keyValueStoreEntity'\nimport { KeyValueTypeORMOptions, Options_ } from './types'\nimport { KeyvStore, KeyvStoredData } from '../../keyv/keyv-types'\nimport { IKeyValueStoreAdapter } from '../../key-value-types'\nimport JSONB from 'json-buffer'\nexport { KeyValueStoreEntity } from './entities/keyValueStoreEntity'\nexport { kvStoreMigrations } from './migrations/index'\n\n/**\n * TypeORM based key value store adapter\n * @beta\n */\nexport class KeyValueTypeORMStoreAdapter extends EventEmitter implements KeyvStore<string>, IKeyValueStoreAdapter<string> {\n private readonly dbConnection: OrPromise<DataSource>\n readonly namespace: string\n opts: Options_<string>\n\n constructor(options: KeyValueTypeORMOptions) {\n super()\n this.dbConnection = options.dbConnection\n this.namespace = options.namespace || 'keyv'\n this.opts = {\n validator: () => true,\n dialect: 'typeorm',\n serialize: JSONB.stringify,\n deserialize: JSONB.parse,\n ...options,\n }\n }\n\n async get(key: string | string[], options?: { raw?: boolean }): Promise<KeyvStoredData<string> | Array<KeyvStoredData<string>>> {\n if (Array.isArray(key)) {\n return this.getMany(key, options)\n }\n const connection = await _getConnectedDb(this.dbConnection)\n const result = await connection.getRepository(KeyValueStoreEntity).findOneBy({\n key,\n })\n return options?.raw !== true || !result ? result?.data : { value: result?.data, expires: result?.expires }\n }\n\n async getMany(keys: string[], options?: { raw?: boolean }): Promise<Array<KeyvStoredData<string>>> {\n const connection = await _getConnectedDb(this.dbConnection)\n const results = await connection.getRepository(KeyValueStoreEntity).findBy({\n key: In(keys),\n })\n const values = keys.map(async (key) => {\n const result = results.find((result) => result.key === key)\n return options?.raw !== true || !result\n ? (result?.data as KeyvStoredData<string>)\n : ({\n value: result?.data ? (await this.opts.deserialize(result.data))?.value : undefined,\n expires: result?.expires,\n } as KeyvStoredData<string>)\n })\n\n return Promise.all(values)\n }\n\n async set(key: string, value: string, ttl?: number): Promise<KeyvStoredData<string>> {\n const connection = await _getConnectedDb(this.dbConnection)\n const entity = new KeyValueStoreEntity()\n entity.key = key\n entity.data = value\n entity.expires = ttl\n await connection.getRepository(KeyValueStoreEntity).save(entity)\n return { value: value, expires: ttl }\n }\n\n async delete(key: string | string[]): Promise<boolean> {\n if (Array.isArray(key)) {\n return this.deleteMany(key)\n }\n const connection = await _getConnectedDb(this.dbConnection)\n const result = await connection.getRepository(KeyValueStoreEntity).delete({ key })\n return result.affected === 1\n }\n\n async deleteMany(keys: string[]): Promise<boolean> {\n const connection = await _getConnectedDb(this.dbConnection)\n const results = await connection.getRepository(KeyValueStoreEntity).delete({\n key: In(keys),\n })\n return !!results.affected && results.affected >= 1\n }\n\n async clear(): Promise<void> {\n const connection = await _getConnectedDb(this.dbConnection)\n await connection.getRepository(KeyValueStoreEntity).delete({\n key: Like(`${this.namespace}:%`),\n })\n }\n\n async has(key: string): Promise<boolean> {\n const connection = await _getConnectedDb(this.dbConnection)\n const result = await connection.getRepository(KeyValueStoreEntity).countBy({\n key,\n })\n return result === 1\n }\n\n async disconnect(): Promise<void> {\n const connection = await _getConnectedDb(this.dbConnection)\n await connection.destroy()\n }\n}\n\n/**\n * Ensures that the provided DataSource is connected.\n *\n * @param dbConnection - a TypeORM DataSource or a Promise that resolves to a DataSource\n * @internal\n */\nexport async function _getConnectedDb(dbConnection: OrPromise<DataSource>): Promise<DataSource> {\n if (dbConnection instanceof Promise) {\n return await dbConnection\n } else if (!dbConnection.isInitialized) {\n return await (<DataSource>dbConnection).initialize()\n } else {\n return dbConnection\n }\n}\n","import { BaseEntity, Column, Entity, PrimaryColumn } from 'typeorm'\n\n/**\n *\n * @beta This API may change without a BREAKING CHANGE notice.\n */\n@Entity('keyvaluestore')\nexport class KeyValueStoreEntity extends BaseEntity {\n @PrimaryColumn('text')\n key!: string\n\n @Column({\n type: 'text',\n })\n data!: string\n\n expires?: number\n}\n","import { MigrationInterface, QueryRunner, Table } from 'typeorm'\nimport Debug from 'debug'\nconst debug = Debug('veramo:kv-store:initial-migration')\n\n/**\n * Create the database layout for Veramo 3.0\n *\n * @public\n */\nexport class CreateKVDatabaseMigration implements MigrationInterface {\n private readonly _tableName: string\n readonly name: string\n\n constructor(tableName?: string) {\n this._tableName = tableName || 'keyvaluestore'\n this.name = `CreateKVDatabase${tableName}1680297189001`\n }\n\n async up(queryRunner: QueryRunner): Promise<void> {\n function getTableName(givenName: string): string {\n return queryRunner.connection.entityMetadatas.find((meta) => meta.givenTableName === givenName)?.tableName || givenName\n }\n\n debug(`creating ${this._tableName} table`)\n // CREATE TABLE \"keyvaluestore\" (\"key\" varchar PRIMARY KEY NOT NULL, \"data\" text NOT NULL)\n await queryRunner.createTable(\n new Table({\n name: getTableName(this._tableName),\n columns: [\n { name: 'key', type: 'varchar', isPrimary: true },\n { name: 'data', type: 'text', isNullable: false },\n ],\n indices: [\n {\n columnNames: ['key'],\n isUnique: true,\n },\n ],\n }),\n true,\n )\n }\n\n async down(queryRunner: QueryRunner): Promise<void> {\n throw new Error('illegal_operation: cannot roll back initial migration')\n }\n}\n","import { CreateKVDatabaseMigration } from './1.createKVDatabase'\n\n/**\n * The migrations array that SHOULD be used when initializing a TypeORM database connection.\n *\n * These ensure the correct creation of tables and the proper migrations of data when tables change between versions.\n *\n * @public\n */\nexport const kvStoreMigrations = [CreateKVDatabaseMigration]\n"],"mappings":"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","names":["EventEmitter","JSONB","Keyv","EventEmitter","opts","namespace","iterator","constructor","uri","options","emitErrors","undefined","serialize","JSONB","stringify","deserialize","parse","store","Error","compression","bind","on","error","emit","generateIterator","keyv","key","raw","data","includes","expires","Date","now","delete","_getKeyUnprefix","value","Symbol","Map","_checkIterableAdapter","dialect","iterableAdapters","url","findIndex","element","_getKeyPrefix","_getKeyPrefixArray","keys","map","split","splice","join","getMany","keyPrefixed","promise","isMapWithEntries","getFromMapWithPrefix","Promise","all","k","get","allValues","resolve","results","then","entries","Array","isArray","forEach","index","result","final","push","prefixes","flatMap","prefix","matchedValues","from","filter","startsWith","length","rows","row","isExpired","toValue","d","set","ttl","input","deleteMany","promises","allSettled","values","every","x","valueOf","clear","has","disconnect","KeyValueStore","keyv","constructor","options","Keyv","uri","get","key","result","raw","undefined","getAsValueData","value","expires","toDeserializedValueData","getMany","keys","length","Array","forEach","push","map","v","getManyAsValueData","set","ttl","then","has","delete","deleteMany","Promise","all","clear","disconnect","kvStoreOn","args","on","eventName","listener","Error","EventEmitter","KeyValueTieredStoreAdapter","EventEmitter","opts","remote","local","iterationLimit","namespace","constructor","options","validator","dialect","isMap","Keyv","get","key","Array","isArray","getMany","localResult","undefined","remoteResult","value","ttl","expires","Date","now","set","delete","keys","promises","push","values","Promise","all","data","toSet","map","store","clear","toClear","localOnly","toDelete","deleted","every","Boolean","deleteMany","has","response","iterator","limit","Number","parseInt","entries","Map","EventEmitter","In","Like","BaseEntity","Column","Entity","PrimaryColumn","KeyValueStoreEntity","BaseEntity","key","data","expires","type","JSONB","Table","Debug","debug","Debug","CreateKVDatabaseMigration","_tableName","name","constructor","tableName","up","queryRunner","getTableName","givenName","connection","entityMetadatas","find","meta","givenTableName","createTable","Table","columns","type","isPrimary","isNullable","indices","columnNames","isUnique","down","Error","kvStoreMigrations","CreateKVDatabaseMigration","KeyValueTypeORMStoreAdapter","EventEmitter","dbConnection","namespace","opts","constructor","options","validator","dialect","serialize","JSONB","stringify","deserialize","parse","get","key","Array","isArray","getMany","connection","_getConnectedDb","result","getRepository","KeyValueStoreEntity","findOneBy","raw","data","value","expires","keys","results","findBy","In","values","map","find","undefined","Promise","all","set","ttl","entity","save","delete","deleteMany","affected","clear","Like","has","countBy","disconnect","destroy","isInitialized","initialize"]}
1
+ {"version":3,"sources":["../src/keyv/keyv.ts","../src/key-value-store.ts","../src/store-adapters/tiered/index.ts","../src/store-adapters/typeorm/index.ts","../src/store-adapters/typeorm/entities/keyValueStoreEntity.ts","../src/store-adapters/typeorm/migrations/1.createKVDatabase.ts","../src/store-adapters/typeorm/migrations/index.ts"],"sourcesContent":["import { EventEmitter } from 'events'\nimport JSONB from 'json-buffer'\nimport { KeyvDeserializedData, KeyvOptions, KeyvStore, KeyvStoredData } from './keyv-types'\n\n/**\n * Please note that this is code adapted from @link https://github.com/jaredwray/keyv to support Typescript and ESM in Veramo\n *\n * The code should support the storage plugins available for the keyv project.\n * Veramo itself supports NodeJS, Browser and React-Native environment.\n * Please be aware that these requirements probably aren't true for any keyv storage plugins.\n *\n * One of the big changes compared to the upstream project is that this port does not have dynamic loading of store-adapters based on URIs.\n * We believe that any Veramo Key Value store should use explicitly defined store-adapters.\n *\n * The port is part of the Veramo Key Value Store module, as we do not want to make an official maintained port out of it.\n * Veramo exposes its own API/interfaces for the Key Value store, meaning we could also support any other implementation in the future\n *\n * The Veramo kv-store module provides out of the box support for in memory/maps, sqlite and typeorm implementations,\n * including a tiered local/remote implementation that support all environments.\n *\n * We welcome any new storage modules\n */\nexport class Keyv<Value = any> extends EventEmitter implements KeyvStore<Value> {\n readonly opts: KeyvOptions<Value>\n readonly namespace: string\n iterator?: (namespace?: string) => AsyncGenerator<any, void>\n\n constructor(uri?: string | Map<string, Value | undefined> | KeyvStore<Value> | undefined, options?: KeyvOptions<Value>) {\n super()\n const emitErrors = options?.emitErrors === undefined ? true : options.emitErrors\n uri = uri ?? options?.uri\n /*if (!uri) {\n throw Error('No URI provided')\n }*/\n this.opts = {\n namespace: 'keyv',\n serialize: JSONB.stringify,\n deserialize: JSONB.parse,\n ...(typeof uri === 'string' ? { uri } : uri),\n ...options,\n }\n\n if (!this.opts.store) {\n if (typeof uri !== 'string') {\n this.opts.store = uri as KeyvStore<Value | undefined>\n } /* else {\n const adapterOptions = { ...this.opts }\n this.opts.store = loadStore(adapterOptions)\n }*/\n }\n if (!this.opts.store) {\n throw Error('No store')\n }\n\n if (this.opts.compression) {\n const compression = this.opts.compression\n this.opts.serialize = compression.serialize.bind(compression)\n this.opts.deserialize = compression.deserialize.bind(compression)\n }\n\n if (typeof this.opts.store.on === 'function' && emitErrors) {\n this.opts.store.on('error', (error) => this.emit('error', error))\n }\n\n this.opts.store.namespace = this.opts.namespace || 'keyv'\n this.namespace = this.opts.store.namespace\n\n const generateIterator = (iterator: any, keyv: Keyv<any>) =>\n async function* () {\n for await (const [key, raw] of typeof iterator === 'function' ? iterator(keyv.store.namespace) : iterator) {\n const data = await keyv.deserialize(raw)\n if (keyv.store.namespace && !key.includes(keyv.store.namespace)) {\n continue\n }\n\n if (data && typeof data.expires === 'number' && Date.now() > data.expires) {\n keyv.delete(key)\n continue\n }\n\n yield [keyv._getKeyUnprefix(key), data?.value]\n }\n }\n\n // Attach iterators\n // @ts-ignore\n if (typeof this.store[Symbol.iterator] === 'function' && this.store instanceof Map) {\n this.iterator = generateIterator(this.store, this)\n } else if (typeof this.store.iterator === 'function' && this.store.opts && this._checkIterableAdapter()) {\n this.iterator = generateIterator(this.store.iterator.bind(this.store), this)\n }\n }\n\n get store(): Required<KeyvStore<Value>> {\n return this.opts.store as Required<KeyvStore<Value>>\n }\n\n get deserialize() {\n return this.opts.deserialize!\n }\n\n get serialize() {\n return this.opts.serialize!\n }\n\n _checkIterableAdapter() {\n return (\n (this.store.opts.dialect && iterableAdapters.includes(this.store.opts.dialect)) ||\n (this.store.opts.url && iterableAdapters.findIndex((element) => this.store.opts.url.includes(element)) >= 0)\n )\n }\n\n _getKeyPrefix(key: string): string {\n return `${this.opts.namespace}:${key}`\n }\n\n _getKeyPrefixArray(keys: string[]): string[] {\n return keys.map((key) => this._getKeyPrefix(key))\n }\n\n _getKeyUnprefix(key: string): string {\n return key.split(':').splice(1).join(':')\n }\n\n async getMany(keys: string[], options?: { raw?: boolean }): Promise<Array<KeyvStoredData<Value>>> {\n const keyPrefixed = this._getKeyPrefixArray(keys)\n let promise: Promise<Array<KeyvStoredData<Value>>>\n if (this.store.getMany !== undefined) {\n // todo: Probably wise to check expired ValueData here, if the getMany does not implement this feature itself!\n promise = this.store.getMany(keyPrefixed, options) as Promise<KeyvStoredData<Value>[]>\n } else if (this.isMapWithEntries(this.store)) {\n // Handle Map-based stores with prefix matching\n promise = this.getFromMapWithPrefix(keyPrefixed)\n } else {\n promise = Promise.all(keyPrefixed.map((k) => this.store.get(k, options) as Promise<KeyvStoredData<Value>>))\n }\n const allValues = Promise.resolve(promise)\n const results: Promise<KeyvStoredData<Value>>[] = []\n\n return Promise.resolve(allValues)\n .then((all) => {\n const entries = Array.isArray(all) ? all : [all]\n entries.forEach((data, index) => {\n let result = typeof data === 'string' ? this.deserialize(data) : !!data && this.opts.compression ? this.deserialize(data) : data\n\n if (result && typeof result === 'object' && 'expires' in result && typeof result.expires === 'number' && Date.now() > result.expires) {\n this.delete(keys[index])\n result = undefined\n }\n\n const final = (\n options && options.raw ? result : result && typeof result === 'object' && 'value' in result ? result.value : result\n ) as Promise<KeyvStoredData<Value>>\n\n results.push(final)\n })\n })\n .then(() => Promise.all(results))\n }\n\n private isMapWithEntries(store: any): store is Map<string, Value> {\n return store instanceof Map && typeof store.entries === 'function'\n }\n\n private async getFromMapWithPrefix(prefixes: string[]): Promise<Array<KeyvStoredData<Value> | undefined>> {\n if (!this.isMapWithEntries(this.store)) {\n return []\n }\n\n const map = this.store as Map<string, Value>\n\n return prefixes.flatMap((prefix) => {\n const matchedValues = Array.from(map.entries())\n .filter(([key]) => key.startsWith(prefix))\n .map(([, value]) => value as KeyvStoredData<Value>)\n\n return matchedValues.length > 0 ? matchedValues : [undefined]\n })\n }\n\n async get(\n key: string | string[],\n options?: { raw?: boolean },\n ): Promise<Value | string | KeyvDeserializedData<Value> | KeyvStoredData<Value>[] | undefined> {\n const isArray = Array.isArray(key)\n return Promise.resolve()\n .then(() => (isArray ? this.getMany(this._getKeyPrefixArray(key), options) : this.store.get(this._getKeyPrefix(key))))\n .then((data) => (typeof data === 'string' ? this.deserialize(data) : this.opts.compression ? this.deserialize(data) : data))\n .then((data) => {\n if (data === undefined || data === null) {\n return undefined\n }\n const rows = Array.isArray(data) ? data : [data]\n\n if (isArray) {\n const result = []\n\n for (let row of rows) {\n if (row === undefined || row === null) {\n result.push(undefined)\n continue\n }\n\n if (this.isExpired(row)) {\n this.delete(key).then(() => undefined)\n result.push(undefined)\n } else {\n result.push(options && options.raw ? row : toValue(row))\n }\n }\n\n return result\n } else if (!Array.isArray(data)) {\n if (this.isExpired(data)) {\n return this.delete(key).then(() => undefined)\n }\n }\n\n return options && options.raw ? data : Array.isArray(data) ? data.map((d) => toValue(d)) : toValue(data)\n })\n }\n\n private isExpired(data: KeyvDeserializedData<any> | string | Value): boolean {\n return (\n typeof data !== 'string' &&\n data &&\n typeof data === 'object' &&\n 'expires' in data &&\n typeof data.expires === 'number' &&\n Date.now() > data.expires\n )\n }\n\n set(key: string, value: Value, ttl?: number) {\n const keyPrefixed = this._getKeyPrefix(key)\n if (typeof ttl === 'undefined') {\n ttl = this.opts.ttl\n }\n if (ttl === 0) {\n ttl = undefined\n }\n\n // @ts-ignore\n return Promise.resolve()\n .then(() => {\n const expires = typeof ttl === 'number' ? Date.now() + ttl : undefined\n if (typeof value === 'symbol') {\n this.emit('error', 'symbol cannot be serialized')\n }\n\n const input = { value, expires }\n return this.serialize(input)\n })\n .then((value) => this.store.set(keyPrefixed, value as Value, ttl))\n .then(() => true)\n }\n\n delete(key: string | string[]) {\n if (!Array.isArray(key)) {\n const keyPrefixed = this._getKeyPrefix(key)\n return Promise.resolve().then(() => this.store.delete(keyPrefixed))\n }\n\n const keyPrefixed = this._getKeyPrefixArray(key)\n if (this.store.deleteMany !== undefined) {\n return Promise.resolve().then(() => this.store.deleteMany!(keyPrefixed))\n }\n\n const promises = []\n for (const key of keyPrefixed) {\n promises.push(this.store.delete(key))\n }\n\n return Promise.allSettled(promises).then((values) => values.every((x) => x.valueOf() === true))\n }\n\n async clear(): Promise<void> {\n return Promise.resolve().then(() => this.store.clear())\n }\n\n has(key: string) {\n const keyPrefixed = this._getKeyPrefix(key)\n return Promise.resolve().then(async () => {\n if (typeof this.store.has === 'function') {\n return this.store.has(keyPrefixed)\n }\n\n const value = await this.store.get(keyPrefixed)\n return value !== undefined\n })\n }\n\n disconnect() {\n if (typeof this.store.disconnect === 'function') {\n return this.store.disconnect()\n }\n }\n}\n\nconst iterableAdapters = ['sqlite', 'postgres', 'mysql', 'mongo', 'redis', 'tiered']\n\nfunction toValue<Value>(input: KeyvDeserializedData<Value> | string | Value) {\n return input !== null && typeof input === 'object' && 'value' in input ? input.value : input\n}\n","import { IKeyValueStore, IKeyValueStoreOnArgs, IKeyValueStoreOptions, IValueData, ValueStoreType } from './key-value-types'\nimport { Keyv } from './keyv/keyv'\nimport { KeyvDeserializedData, KeyvOptions, KeyvStoredData } from './keyv/keyv-types'\n\n/**\n * Agent plugin that implements {@link @sphereon/ssi-sdk.kv-store-temp#IKeyValueStore} interface\n * @public\n */\nexport class KeyValueStore<ValueType extends ValueStoreType> implements IKeyValueStore<ValueType> {\n /**\n * The main keyv typescript port which delegates to the storage adapters and takes care of some common functionality\n *\n * @internal\n */\n private readonly keyv: Keyv<ValueType>\n\n constructor(options: IKeyValueStoreOptions<ValueType>) {\n this.keyv = new Keyv(options.uri, options as KeyvOptions<ValueType>)\n }\n\n async get(key: string): Promise<ValueType | undefined> {\n const result = await this.keyv.get(key, { raw: false })\n if (result === null || result === undefined) {\n return undefined\n }\n return result as ValueType\n }\n\n async getAsValueData(key: string): Promise<IValueData<ValueType>> {\n const result = await this.keyv.get(key, { raw: true })\n if (result === null || result === undefined) {\n // We always return a ValueData object for this method\n return { value: undefined, expires: undefined }\n }\n return this.toDeserializedValueData(result)\n }\n\n async getMany(keys: string[]): Promise<Array<ValueType | undefined>> {\n if (!keys || keys.length === 0) {\n return []\n }\n let result = await this.keyv.getMany(keys, { raw: false })\n\n // Making sure we return the same array length as the amount of key(s) passed in\n if (result === null || result === undefined || result.length === 0) {\n result = new Array<ValueType | undefined>()\n keys.forEach(() => result.push(undefined))\n }\n return result.map((v) => (!!v ? (v as ValueType) : undefined))\n }\n\n async getManyAsValueData(keys: string[]): Promise<Array<IValueData<ValueType>>> {\n if (!keys || keys.length === 0) {\n return []\n }\n let result = await this.keyv.getMany(keys, { raw: true })\n\n // Making sure we return the same array length as the amount of key(s) passed in\n if (result === null || result === undefined || result.length === 0) {\n result = new Array<KeyvStoredData<ValueType>>()\n keys.forEach(() => result.push({ value: undefined, expires: undefined } as unknown as KeyvDeserializedData<ValueType>))\n }\n return result.map((v) => (!!v ? this.toDeserializedValueData(v) : { value: undefined, expires: undefined }))\n }\n\n async set(key: string, value: ValueType, ttl?: number): Promise<IValueData<ValueType>> {\n return this.keyv.set(key, value, ttl).then(() => this.getAsValueData(key))\n }\n\n async has(key: string): Promise<boolean> {\n return this.keyv.has(key)\n }\n\n async delete(key: string): Promise<boolean> {\n return this.keyv.delete(key)\n }\n\n async deleteMany(keys: string[]): Promise<boolean[]> {\n return Promise.all(keys.map((key) => this.keyv.delete(key)))\n }\n\n async clear(): Promise<IKeyValueStore<ValueType>> {\n return this.keyv.clear().then(() => this)\n }\n\n async disconnect(): Promise<void> {\n return this.keyv.disconnect()\n }\n\n // Public so parties using the kv store directly can add listeners if they want\n async kvStoreOn(args: IKeyValueStoreOnArgs): Promise<IKeyValueStore<ValueType>> {\n this.keyv.on(args.eventName, args.listener)\n return this\n }\n\n private toDeserializedValueData<ValueType>(result: any): IValueData<ValueType> {\n if (result === null || result === undefined) {\n throw Error(`Result cannot be undefined or null at this this point`)\n } else if (typeof result !== 'object') {\n return { value: result, expires: undefined }\n } else if (!('value' in result)) {\n return { value: result, expires: undefined }\n }\n if (!('expires' in result)) {\n result.expires = undefined\n }\n return result as IValueData<ValueType>\n }\n}\n","import { EventEmitter } from 'events'\nimport type { Options, Options_ } from './types'\nimport { KeyvStore, KeyvStoredData } from '../../keyv/keyv-types'\nimport { Keyv } from '../../keyv/keyv'\nimport { IKeyValueStoreAdapter } from '../../key-value-types'\n\ntype KeyvTieredIndex = 'local' | 'remote'\n\n/**\n * Tiered keyv store adapter, combining 2 adapters/stores into one\n * @alpha\n */\nexport class KeyValueTieredStoreAdapter<Value> extends EventEmitter implements KeyvStore<Value>, IKeyValueStoreAdapter<Value> {\n opts: Options_\n remote: KeyvStore<Value>\n local: KeyvStore<Value>\n iterationLimit?: string | number\n\n namespace?: string | undefined\n\n constructor({ remote, local, ...options }: Options<Value>) {\n super()\n this.opts = {\n validator: () => true,\n dialect: 'tiered',\n ...options,\n }\n\n // todo: since we are instantiating a new Keyv object in case we encounter a map, the key prefix applied twice, given it will be part of a an outer keyv object as well.\n // Probably wise to simply create a Map Store class. As it is an in memory construct, and will work in terms of resolution it does not have highest priority\n this.local = (isMap(local) ? new Keyv<Value>(local as Map<string, Value>) : local) as KeyvStore<Value>\n this.remote = (isMap(remote) ? new Keyv<Value>(remote as Map<string, Value>) : remote) as KeyvStore<Value>\n this.namespace = this.local.namespace\n }\n\n async get(key: string | string[], options?: { raw?: boolean }): Promise<KeyvStoredData<Value> | Array<KeyvStoredData<Value>>> {\n if (Array.isArray(key)) {\n return await this.getMany(key, options)\n }\n const localResult = (await this.local.get(key, options)) as KeyvStoredData<Value>\n\n if (localResult === undefined || !this.opts.validator(localResult, key)) {\n const remoteResult = await this.remote.get(key, options)\n\n if (remoteResult !== localResult) {\n const value = (\n !!remoteResult ? (typeof remoteResult === 'object' && 'value' in remoteResult ? remoteResult.value : remoteResult) : undefined\n ) as Value\n const ttl =\n !!remoteResult && typeof remoteResult === 'object' && 'expires' in remoteResult && remoteResult.expires\n ? remoteResult.expires - Date.now()\n : undefined\n if (!ttl || ttl > 0) {\n await this.local.set(key, value, ttl)\n } else {\n this.local.delete(key)\n }\n }\n return remoteResult\n }\n\n return localResult\n }\n\n async getMany(keys: string[], options?: { raw?: boolean }): Promise<Array<KeyvStoredData<Value>>> {\n const promises: Array<Promise<KeyvStoredData<Value>>> = []\n for (const key of keys) {\n promises.push(this.get(key, options) as Promise<KeyvStoredData<Value>>)\n }\n\n const values = await Promise.all(promises)\n const data: Array<KeyvStoredData<Value>> | undefined = []\n for (const value of values) {\n data.push(value as KeyvStoredData<Value>)\n }\n return data\n }\n\n async set(key: string, value: any, ttl?: number) {\n const toSet: KeyvTieredIndex[] = ['local', 'remote']\n return Promise.all(toSet.map(async (store) => this[store].set(key, value, ttl)))\n }\n\n async clear(): Promise<undefined> {\n const toClear: KeyvTieredIndex[] = ['local']\n if (!this.opts.localOnly) {\n toClear.push('remote')\n }\n\n await Promise.all(toClear.map(async (store) => this[store].clear()))\n\n return undefined\n }\n\n async delete(key: string): Promise<boolean> {\n const toDelete: KeyvTieredIndex[] = ['local']\n if (!this.opts.localOnly) {\n toDelete.push('remote')\n }\n\n const deleted = await Promise.all(toDelete.map(async (store) => this[store].delete(key)))\n\n return deleted.every(Boolean)\n }\n\n async deleteMany(keys: string[]): Promise<boolean> {\n const promises = []\n for (const key of keys) {\n promises.push(this.delete(key))\n }\n\n const values = await Promise.all(promises)\n\n return values.every(Boolean)\n }\n\n async has(key: string): Promise<boolean> {\n let response\n if (typeof this.local.has === 'function') {\n response = this.local.has(key)\n } else {\n const value = await this.local.get(key)\n response = value !== undefined\n }\n if (!response || !this.opts.validator(response, key)) {\n if (typeof this.remote.has === 'function') {\n response = this.remote.has(key)\n } else {\n const value = await this.remote.get(key)\n response = value !== undefined\n }\n }\n return response\n }\n\n async *iterator(namespace?: string): AsyncGenerator<any, void, any> {\n const limit = Number.parseInt(this.iterationLimit as string, 10) || 10\n this.remote.opts.iterationLimit = limit\n if (this.remote && typeof this.remote.iterator === 'function') {\n for await (const entries of this.remote.iterator(namespace)) {\n yield entries\n }\n }\n }\n}\n\nfunction isMap(map: any) {\n if (map instanceof Map) {\n return true\n } else if (\n map &&\n typeof map.clear === 'function' &&\n typeof map.delete === 'function' &&\n typeof map.get === 'function' &&\n typeof map.has === 'function' &&\n typeof map.set === 'function'\n ) {\n return true\n }\n\n return false\n}\n","import { EventEmitter } from 'events'\nimport { OrPromise } from '@veramo/utils'\nimport { DataSource, In, Like } from 'typeorm'\nimport { KeyValueStoreEntity } from './entities/keyValueStoreEntity'\nimport { KeyValueTypeORMOptions, Options_ } from './types'\nimport { KeyvStore, KeyvStoredData } from '../../keyv/keyv-types'\nimport { IKeyValueStoreAdapter } from '../../key-value-types'\nimport JSONB from 'json-buffer'\nexport { KeyValueStoreEntity } from './entities/keyValueStoreEntity'\nexport { kvStoreMigrations } from './migrations/index'\n\n/**\n * TypeORM based key value store adapter\n * @beta\n */\nexport class KeyValueTypeORMStoreAdapter extends EventEmitter implements KeyvStore<string>, IKeyValueStoreAdapter<string> {\n private readonly dbConnection: OrPromise<DataSource>\n readonly namespace: string\n opts: Options_<string>\n\n constructor(options: KeyValueTypeORMOptions) {\n super()\n this.dbConnection = options.dbConnection\n this.namespace = options.namespace || 'keyv'\n this.opts = {\n validator: () => true,\n dialect: 'typeorm',\n serialize: JSONB.stringify,\n deserialize: JSONB.parse,\n ...options,\n }\n }\n\n async get(key: string | string[], options?: { raw?: boolean }): Promise<KeyvStoredData<string> | Array<KeyvStoredData<string>>> {\n if (Array.isArray(key)) {\n return this.getMany(key, options)\n }\n const connection = await _getConnectedDb(this.dbConnection)\n const result = await connection.getRepository(KeyValueStoreEntity).findOneBy({\n key,\n })\n return options?.raw !== true || !result ? result?.data : { value: result?.data, expires: result?.expires }\n }\n\n async getMany(keys: string[], options?: { raw?: boolean }): Promise<Array<KeyvStoredData<string>>> {\n const connection = await _getConnectedDb(this.dbConnection)\n const results = await connection.getRepository(KeyValueStoreEntity).findBy({\n key: In(keys),\n })\n const values = keys.map(async (key) => {\n const result = results.find((result) => result.key === key)\n return options?.raw !== true || !result\n ? (result?.data as KeyvStoredData<string>)\n : ({\n value: result?.data ? (await this.opts.deserialize(result.data))?.value : undefined,\n expires: result?.expires,\n } as KeyvStoredData<string>)\n })\n\n return Promise.all(values)\n }\n\n async set(key: string, value: string, ttl?: number): Promise<KeyvStoredData<string>> {\n const connection = await _getConnectedDb(this.dbConnection)\n const entity = new KeyValueStoreEntity()\n entity.key = key\n entity.data = value\n entity.expires = ttl\n await connection.getRepository(KeyValueStoreEntity).save(entity)\n return { value: value, expires: ttl }\n }\n\n async delete(key: string | string[]): Promise<boolean> {\n if (Array.isArray(key)) {\n return this.deleteMany(key)\n }\n const connection = await _getConnectedDb(this.dbConnection)\n const result = await connection.getRepository(KeyValueStoreEntity).delete({ key })\n return result.affected === 1\n }\n\n async deleteMany(keys: string[]): Promise<boolean> {\n const connection = await _getConnectedDb(this.dbConnection)\n const results = await connection.getRepository(KeyValueStoreEntity).delete({\n key: In(keys),\n })\n return !!results.affected && results.affected >= 1\n }\n\n async clear(): Promise<void> {\n const connection = await _getConnectedDb(this.dbConnection)\n await connection.getRepository(KeyValueStoreEntity).delete({\n key: Like(`${this.namespace}:%`),\n })\n }\n\n async has(key: string): Promise<boolean> {\n const connection = await _getConnectedDb(this.dbConnection)\n const result = await connection.getRepository(KeyValueStoreEntity).countBy({\n key,\n })\n return result === 1\n }\n\n async disconnect(): Promise<void> {\n const connection = await _getConnectedDb(this.dbConnection)\n await connection.destroy()\n }\n}\n\n/**\n * Ensures that the provided DataSource is connected.\n *\n * @param dbConnection - a TypeORM DataSource or a Promise that resolves to a DataSource\n * @internal\n */\nexport async function _getConnectedDb(dbConnection: OrPromise<DataSource>): Promise<DataSource> {\n if (dbConnection instanceof Promise) {\n return await dbConnection\n } else if (!dbConnection.isInitialized) {\n return await (<DataSource>dbConnection).initialize()\n } else {\n return dbConnection\n }\n}\n","import { BaseEntity, Column, Entity, PrimaryColumn } from 'typeorm'\n\n/**\n *\n * @beta This API may change without a BREAKING CHANGE notice.\n */\n@Entity('keyvaluestore')\nexport class KeyValueStoreEntity extends BaseEntity {\n @PrimaryColumn('text')\n key!: string\n\n @Column({\n type: 'text',\n })\n data!: string\n\n expires?: number\n}\n","import { MigrationInterface, QueryRunner, Table } from 'typeorm'\nimport Debug from 'debug'\nconst debug = Debug('veramo:kv-store:initial-migration')\n\n/**\n * Create the database layout for Veramo 3.0\n *\n * @public\n */\nexport class CreateKVDatabaseMigration implements MigrationInterface {\n private readonly _tableName: string\n readonly name: string\n\n constructor(tableName?: string) {\n this._tableName = tableName || 'keyvaluestore'\n this.name = `CreateKVDatabase${tableName}1680297189001`\n }\n\n async up(queryRunner: QueryRunner): Promise<void> {\n function getTableName(givenName: string): string {\n return queryRunner.connection.entityMetadatas.find((meta) => meta.givenTableName === givenName)?.tableName || givenName\n }\n\n debug(`creating ${this._tableName} table`)\n // CREATE TABLE \"keyvaluestore\" (\"key\" varchar PRIMARY KEY NOT NULL, \"data\" text NOT NULL)\n await queryRunner.createTable(\n new Table({\n name: getTableName(this._tableName),\n columns: [\n { name: 'key', type: 'varchar', isPrimary: true },\n { name: 'data', type: 'text', isNullable: false },\n ],\n indices: [\n {\n columnNames: ['key'],\n isUnique: true,\n },\n ],\n }),\n true,\n )\n }\n\n async down(queryRunner: QueryRunner): Promise<void> {\n throw new Error('illegal_operation: cannot roll back initial migration')\n }\n}\n","import { CreateKVDatabaseMigration } from './1.createKVDatabase'\n\n/**\n * The migrations array that SHOULD be used when initializing a TypeORM database connection.\n *\n * These ensure the correct creation of tables and the proper migrations of data when tables change between versions.\n *\n * @public\n */\nexport const kvStoreMigrations = [CreateKVDatabaseMigration]\n"],"mappings":"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","names":["EventEmitter","JSONB","Keyv","EventEmitter","opts","namespace","iterator","uri","options","emitErrors","undefined","serialize","JSONB","stringify","deserialize","parse","store","Error","compression","bind","on","error","emit","generateIterator","keyv","key","raw","data","includes","expires","Date","now","delete","_getKeyUnprefix","value","Symbol","Map","_checkIterableAdapter","dialect","iterableAdapters","url","findIndex","element","_getKeyPrefix","_getKeyPrefixArray","keys","map","split","splice","join","getMany","keyPrefixed","promise","isMapWithEntries","getFromMapWithPrefix","Promise","all","k","get","allValues","resolve","results","then","entries","Array","isArray","forEach","index","result","final","push","prefixes","flatMap","prefix","matchedValues","from","filter","startsWith","length","rows","row","isExpired","toValue","d","set","ttl","input","deleteMany","promises","allSettled","values","every","x","valueOf","clear","has","disconnect","KeyValueStore","keyv","options","Keyv","uri","get","key","result","raw","undefined","getAsValueData","value","expires","toDeserializedValueData","getMany","keys","length","Array","forEach","push","map","v","getManyAsValueData","set","ttl","then","has","delete","deleteMany","Promise","all","clear","disconnect","kvStoreOn","args","on","eventName","listener","Error","EventEmitter","KeyValueTieredStoreAdapter","EventEmitter","opts","remote","local","iterationLimit","namespace","options","validator","dialect","isMap","Keyv","get","key","Array","isArray","getMany","localResult","undefined","remoteResult","value","ttl","expires","Date","now","set","delete","keys","promises","push","values","Promise","all","data","toSet","map","store","clear","toClear","localOnly","toDelete","deleted","every","Boolean","deleteMany","has","response","iterator","limit","Number","parseInt","entries","Map","EventEmitter","In","Like","BaseEntity","Column","Entity","PrimaryColumn","KeyValueStoreEntity","BaseEntity","key","data","expires","type","JSONB","Table","Debug","debug","Debug","CreateKVDatabaseMigration","_tableName","name","tableName","up","queryRunner","getTableName","givenName","connection","entityMetadatas","find","meta","givenTableName","createTable","Table","columns","type","isPrimary","isNullable","indices","columnNames","isUnique","down","Error","kvStoreMigrations","CreateKVDatabaseMigration","KeyValueTypeORMStoreAdapter","EventEmitter","dbConnection","namespace","opts","options","validator","dialect","serialize","JSONB","stringify","deserialize","parse","get","key","Array","isArray","getMany","connection","_getConnectedDb","result","getRepository","KeyValueStoreEntity","findOneBy","raw","data","value","expires","keys","results","findBy","In","values","map","find","undefined","Promise","all","set","ttl","entity","save","delete","deleteMany","affected","clear","Like","has","countBy","disconnect","destroy","isInitialized","initialize"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sphereon/ssi-sdk.kv-store-temp",
3
3
  "description": "Key Value Store plugin",
4
- "version": "0.34.1-fix.103+693d8f0b",
4
+ "version": "0.34.1-fix.109+6c2f56cb",
5
5
  "source": "src/index.ts",
6
6
  "type": "module",
7
7
  "main": "./dist/index.cjs",
@@ -35,7 +35,7 @@
35
35
  "@keyv/compress-gzip": "^1.2.3",
36
36
  "@keyv/sqlite": "3.6.5",
37
37
  "@keyv/test-suite": "^1.9.5",
38
- "@sphereon/ssi-sdk.agent-config": "0.34.1-fix.103+693d8f0b",
38
+ "@sphereon/ssi-sdk.agent-config": "0.34.1-fix.109+6c2f56cb",
39
39
  "@types/debug": "^4.1.12",
40
40
  "@types/json-buffer": "^3.0.2",
41
41
  "@types/node": "20.17.30",
@@ -61,5 +61,5 @@
61
61
  "Key Value Store",
62
62
  "keyv"
63
63
  ],
64
- "gitHead": "693d8f0b0c6566650a31647fda630a0715f960c7"
64
+ "gitHead": "6c2f56cb480f0f505d9957f739353b6480baf8e4"
65
65
  }