@sphereon/ssi-sdk.resource-resolver 0.34.0 → 0.34.1-next.3

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":["../plugin.schema.json","../src/index.ts","../src/agent/ResourceResolver.ts","../src/utils/ResourceResolverUtils.ts"],"sourcesContent":["{\n \"IResourceResolver\": {\n \"components\": {\n \"schemas\": {\n \"ResourceResolverOptions\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"ResolveArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"ResolveOptions\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"ResourceType\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"ClearAllResourcesArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"PersistResourceArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"GetResourceArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"StoreIdStrArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"NamespaceStrArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"PrefixArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"StoreArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"Resource\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"SerializedResponse\": {\n \"type\": \"object\",\n \"properties\": {}\n }\n },\n \"methods\": {\n \"resourceResolve\": {\n \"description\": \"\",\n \"arguments\": {\n \"$ref\": \"#/components/schemas/ResolveArgs\"\n },\n \"returnType\": {}\n },\n \"resourceClearAllResources\": {\n \"description\": \"\",\n \"arguments\": {\n \"$ref\": \"#/components/schemas/ClearAllResourcesArgs\"\n },\n \"returnType\": {}\n },\n \"resourceDefaultStoreId\": {\n \"description\": \"\",\n \"returnType\": {}\n },\n \"resourceDefaultNamespace\": {\n \"description\": \"\",\n \"returnType\": {}\n },\n \"resourceDefaultTtl\": {\n \"description\": \"\",\n \"returnType\": {}\n }\n }\n }\n }\n}\n","/**\n * @public\n */\nconst schema = require('../plugin.schema.json')\nexport { schema }\nexport { ResourceResolver } from './agent/ResourceResolver'\nexport * from './types/IResourceResolver'\n","import { IKeyValueStore, IValueData, KeyValueStore, ValueStoreType } from '@sphereon/ssi-sdk.kv-store-temp'\nimport { IAgentPlugin } from '@veramo/core'\nimport fetch, { Response, Headers } from 'cross-fetch'\nimport { schema } from '../index'\nimport { deserializeResponse, getResourceIdentifier, isCacheWithinMaxAge, serializeResponse } from '../utils/ResourceResolverUtils'\nimport {\n ClearAllResourcesArgs,\n ResolveArgs,\n GetResourceArgs,\n IResourceResolver,\n NamespaceStrArgs,\n PersistResourceArgs,\n PrefixArgs,\n RequiredContext,\n ResourceResolverOptions,\n StoreArgs,\n StoreIdStrArgs,\n Resource,\n} from '../types/IResourceResolver'\n\n/**\n * {@inheritDoc IResourceResolver}\n */\nexport class ResourceResolver implements IAgentPlugin {\n readonly schema = schema.IResourceResolver\n readonly methods: IResourceResolver = {\n resourceResolve: this.resourceResolve.bind(this),\n resourceClearAllResources: this.resourceClearAllResources.bind(this),\n resourceDefaultStoreId: this.resourceDefaultStoreId.bind(this),\n resourceDefaultNamespace: this.resourceDefaultNamespace.bind(this),\n resourceDefaultTtl: this.resourceDefaultTtl.bind(this),\n }\n\n private readonly defaultStoreId: string\n private readonly defaultNamespace: string\n private readonly defaultTtl: number\n private readonly detectLocation: boolean\n private readonly _resourceStores: Map<string, IKeyValueStore<Resource>>\n\n constructor(options?: ResourceResolverOptions) {\n const { defaultStore, defaultNamespace, resourceStores, ttl, detectLocation } = options ?? {}\n\n this.defaultStoreId = defaultStore ?? '_default'\n this.defaultNamespace = defaultNamespace ?? 'resources'\n this.defaultTtl = ttl ?? 3600\n this.detectLocation = detectLocation ?? false\n\n if (resourceStores && resourceStores instanceof Map) {\n this._resourceStores = resourceStores\n } else if (resourceStores) {\n this._resourceStores = new Map().set(this.defaultStoreId, resourceStores)\n } else {\n this._resourceStores = new Map().set(\n this.defaultStoreId,\n new KeyValueStore({\n namespace: this.defaultNamespace,\n store: new Map<string, Resource>(),\n ttl: this.defaultTtl,\n }),\n )\n }\n }\n\n /** {@inheritDoc IResourceResolver.resourceResolve} */\n private async resourceResolve(args: ResolveArgs, context: RequiredContext): Promise<Response> {\n const { input, init, resourceType, resolveOpts, partyCorrelationId, storeId, namespace } = args\n\n const resourceIdentifier = getResourceIdentifier(input)\n\n const cachedResource = await this.getResource({ resourceIdentifier, storeId, namespace })\n if (cachedResource.value && isCacheWithinMaxAge(cachedResource.value, resolveOpts)) {\n return deserializeResponse(cachedResource.value.response)\n }\n\n if (resolveOpts?.onlyCache) {\n return new Response(JSON.stringify({ error: 'Resource not found' }), {\n status: 404,\n statusText: 'Not Found',\n headers: new Headers({ 'Content-Type': 'application/json' }),\n })\n }\n\n let location\n if (this.detectLocation) {\n location = await this.retrieveLocation(input, context)\n }\n\n const response = await fetch(input, init)\n if (!resolveOpts?.skipPersistence && response.status >= 200 && response.status < 300) {\n const serializedResponse = await serializeResponse(response)\n const resource: Resource = {\n location,\n response: serializedResponse,\n resourceType,\n insertedAt: Date.now(),\n partyCorrelationId,\n }\n const cachedResource = await this.persistResource({\n resource,\n resourceIdentifier,\n namespace,\n storeId,\n })\n\n if (!cachedResource.value) {\n return Promise.reject(Error('Resource not present in persistence result'))\n }\n\n return deserializeResponse(cachedResource.value.response)\n }\n\n return response\n }\n\n private async retrieveLocation(input: RequestInfo | URL, context: RequiredContext) {\n let url: URL\n if (input instanceof Request && input.url !== undefined && input.url !== null) {\n url = new URL(input.url)\n } else if (input instanceof URL) {\n url = input\n } else {\n throw Error(`input type is required to be RequestInfo | URL`)\n }\n return await context.agent.anomalyDetectionLookupLocation({\n ipOrHostname: url.hostname,\n })\n }\n\n /** {@inheritDoc IResourceResolver.resourceClearAllResources} */\n private async resourceClearAllResources(args: ClearAllResourcesArgs, context: RequiredContext): Promise<boolean> {\n const { storeId } = args\n return await this.store({ stores: this._resourceStores, storeId })\n .clear()\n .then(() => true)\n }\n\n /** {@inheritDoc IResourceResolver.resourceDefaultStoreId} */\n private async resourceDefaultStoreId(context: RequiredContext): Promise<string> {\n return this.defaultStoreId\n }\n\n /** {@inheritDoc IResourceResolver.resourceDefaultNamespace} */\n private async resourceDefaultNamespace(context: RequiredContext): Promise<string> {\n return this.defaultNamespace\n }\n\n /** {@inheritDoc IResourceResolver.resourceDefaultTtl} */\n private async resourceDefaultTtl(context: RequiredContext): Promise<number> {\n return this.defaultTtl\n }\n\n private async getResource(args: GetResourceArgs): Promise<IValueData<Resource>> {\n const { resourceIdentifier, storeId, namespace } = args\n return this.store({ stores: this._resourceStores, storeId }).getAsValueData(\n this.prefix({\n namespace,\n resourceIdentifier,\n }),\n )\n }\n\n private async persistResource(args: PersistResourceArgs): Promise<IValueData<Resource>> {\n const { resource, resourceIdentifier, ttl } = args\n const namespace = this.namespaceStr(args)\n const storeId = this.storeIdStr(args)\n\n return await this.store({ stores: this._resourceStores, storeId }).set(\n this.prefix({\n namespace,\n resourceIdentifier,\n }),\n resource,\n ttl ?? this.defaultTtl,\n )\n }\n\n private store<T extends ValueStoreType>(args: StoreArgs<T>): IKeyValueStore<T> {\n const storeId = this.storeIdStr({ storeId: args.storeId })\n const store = args.stores.get(storeId)\n if (!store) {\n throw Error(`Could not get resource store: ${storeId}`)\n }\n return store\n }\n\n private storeIdStr(args: StoreIdStrArgs): string {\n const { storeId } = args\n return storeId ?? this.defaultStoreId\n }\n\n private namespaceStr(args: NamespaceStrArgs): string {\n const { namespace } = args\n return namespace ?? this.defaultNamespace\n }\n\n private prefix(args: PrefixArgs): string {\n const { namespace, resourceIdentifier } = args\n return `${this.namespaceStr({ namespace })}:${resourceIdentifier}`\n }\n}\n","import { Headers, Response, Request } from 'cross-fetch'\n\n// @ts-ignore\nimport { fromString } from 'uint8arrays/from-string'\n// @ts-ignore\nimport { toString } from 'uint8arrays/to-string'\nimport { ResolveOptions, Resource, SerializedResponse } from '../types/IResourceResolver'\n\nexport const getResourceIdentifier = (input: Request | string | URL): string => {\n if (typeof input === 'string') {\n return input\n } else if (input instanceof Request) {\n return input.url\n } else if (input instanceof URL) {\n return input.toString()\n }\n\n throw new Error('Invalid input type. Expected Request, string, or URL.')\n}\n\nexport const serializeResponse = async (response: Response): Promise<SerializedResponse> => {\n const arrayBuffer = await response.arrayBuffer()\n const base64Url = toString(new Uint8Array(arrayBuffer), 'base64url')\n\n return {\n status: response.status,\n statusText: response.statusText,\n // @ts-ignore\n headers: Object.fromEntries(response.headers.entries()),\n body: base64Url,\n }\n}\n\nexport const deserializeResponse = async (data: SerializedResponse): Promise<Response> => {\n const { status, statusText, headers, body } = data\n\n const uint8Array = fromString(body, 'base64url')\n const arrayBuffer = uint8Array.buffer.slice(uint8Array.byteOffset, uint8Array.byteOffset + uint8Array.byteLength)\n\n return new Response(arrayBuffer, {\n status,\n statusText,\n headers: new Headers(headers),\n })\n}\n\n// Check if the cache is still within the acceptable age\nexport const isCacheWithinMaxAge = (cachedResource: Resource, resolveOpts?: ResolveOptions): boolean => {\n return cachedResource && (resolveOpts?.maxAgeMs === undefined || Date.now() - cachedResource.insertedAt < resolveOpts.maxAgeMs)\n}\n"],"mappings":"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","names":["module","import_cross_fetch","getResourceIdentifier","input","Request","url","URL","toString","Error","serializeResponse","response","arrayBuffer","base64Url","Uint8Array","status","statusText","headers","Object","fromEntries","entries","body","deserializeResponse","data","uint8Array","fromString","buffer","slice","byteOffset","byteLength","Response","Headers","isCacheWithinMaxAge","cachedResource","resolveOpts","maxAgeMs","undefined","Date","now","insertedAt","ResourceResolver","schema","IResourceResolver","methods","resourceResolve","bind","resourceClearAllResources","resourceDefaultStoreId","resourceDefaultNamespace","resourceDefaultTtl","defaultStoreId","defaultNamespace","defaultTtl","detectLocation","_resourceStores","constructor","options","defaultStore","resourceStores","ttl","Map","set","KeyValueStore","namespace","store","args","context","input","init","resourceType","resolveOpts","partyCorrelationId","storeId","resourceIdentifier","getResourceIdentifier","cachedResource","getResource","value","isCacheWithinMaxAge","deserializeResponse","response","onlyCache","Response","JSON","stringify","error","status","statusText","headers","Headers","location","retrieveLocation","fetch","skipPersistence","serializedResponse","serializeResponse","resource","insertedAt","Date","now","persistResource","Promise","reject","Error","url","Request","undefined","URL","agent","anomalyDetectionLookupLocation","ipOrHostname","hostname","stores","clear","then","getAsValueData","prefix","namespaceStr","storeIdStr","get","schema","require"]}
1
+ {"version":3,"sources":["../plugin.schema.json","../src/index.ts","../src/agent/ResourceResolver.ts","../src/utils/ResourceResolverUtils.ts"],"sourcesContent":["{\n \"IResourceResolver\": {\n \"components\": {\n \"schemas\": {\n \"ResourceResolverOptions\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"ResolveArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"ResolveOptions\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"ResourceType\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"ClearAllResourcesArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"PersistResourceArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"GetResourceArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"StoreIdStrArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"NamespaceStrArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"PrefixArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"StoreArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"Resource\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"SerializedResponse\": {\n \"type\": \"object\",\n \"properties\": {}\n }\n },\n \"methods\": {\n \"resourceResolve\": {\n \"description\": \"\",\n \"arguments\": {\n \"$ref\": \"#/components/schemas/ResolveArgs\"\n },\n \"returnType\": {}\n },\n \"resourceClearAllResources\": {\n \"description\": \"\",\n \"arguments\": {\n \"$ref\": \"#/components/schemas/ClearAllResourcesArgs\"\n },\n \"returnType\": {}\n },\n \"resourceDefaultStoreId\": {\n \"description\": \"\",\n \"returnType\": {}\n },\n \"resourceDefaultNamespace\": {\n \"description\": \"\",\n \"returnType\": {}\n },\n \"resourceDefaultTtl\": {\n \"description\": \"\",\n \"returnType\": {}\n }\n }\n }\n }\n}\n","/**\n * @public\n */\nconst schema = require('../plugin.schema.json')\nexport { schema }\nexport { ResourceResolver } from './agent/ResourceResolver'\nexport * from './types/IResourceResolver'\n","import { IKeyValueStore, IValueData, KeyValueStore, ValueStoreType } from '@sphereon/ssi-sdk.kv-store-temp'\nimport { IAgentPlugin } from '@veramo/core'\nimport fetch, { Response, Headers } from 'cross-fetch'\nimport { schema } from '../index'\nimport { deserializeResponse, getResourceIdentifier, isCacheWithinMaxAge, serializeResponse } from '../utils/ResourceResolverUtils'\nimport {\n ClearAllResourcesArgs,\n ResolveArgs,\n GetResourceArgs,\n IResourceResolver,\n NamespaceStrArgs,\n PersistResourceArgs,\n PrefixArgs,\n RequiredContext,\n ResourceResolverOptions,\n StoreArgs,\n StoreIdStrArgs,\n Resource,\n} from '../types/IResourceResolver'\n\n/**\n * {@inheritDoc IResourceResolver}\n */\nexport class ResourceResolver implements IAgentPlugin {\n readonly schema = schema.IResourceResolver\n readonly methods: IResourceResolver = {\n resourceResolve: this.resourceResolve.bind(this),\n resourceClearAllResources: this.resourceClearAllResources.bind(this),\n resourceDefaultStoreId: this.resourceDefaultStoreId.bind(this),\n resourceDefaultNamespace: this.resourceDefaultNamespace.bind(this),\n resourceDefaultTtl: this.resourceDefaultTtl.bind(this),\n }\n\n private readonly defaultStoreId: string\n private readonly defaultNamespace: string\n private readonly defaultTtl: number\n private readonly detectLocation: boolean\n private readonly _resourceStores: Map<string, IKeyValueStore<Resource>>\n\n constructor(options?: ResourceResolverOptions) {\n const { defaultStore, defaultNamespace, resourceStores, ttl, detectLocation } = options ?? {}\n\n this.defaultStoreId = defaultStore ?? '_default'\n this.defaultNamespace = defaultNamespace ?? 'resources'\n this.defaultTtl = ttl ?? 3600\n this.detectLocation = detectLocation ?? false\n\n if (resourceStores && resourceStores instanceof Map) {\n this._resourceStores = resourceStores\n } else if (resourceStores) {\n this._resourceStores = new Map().set(this.defaultStoreId, resourceStores)\n } else {\n this._resourceStores = new Map().set(\n this.defaultStoreId,\n new KeyValueStore({\n namespace: this.defaultNamespace,\n store: new Map<string, Resource>(),\n ttl: this.defaultTtl,\n }),\n )\n }\n }\n\n /** {@inheritDoc IResourceResolver.resourceResolve} */\n private async resourceResolve(args: ResolveArgs, context: RequiredContext): Promise<Response> {\n const { input, init, resourceType, resolveOpts, partyCorrelationId, storeId, namespace } = args\n\n const resourceIdentifier = getResourceIdentifier(input)\n\n const cachedResource = await this.getResource({ resourceIdentifier, storeId, namespace })\n if (cachedResource.value && isCacheWithinMaxAge(cachedResource.value, resolveOpts)) {\n return deserializeResponse(cachedResource.value.response)\n }\n\n if (resolveOpts?.onlyCache) {\n return new Response(JSON.stringify({ error: 'Resource not found' }), {\n status: 404,\n statusText: 'Not Found',\n headers: new Headers({ 'Content-Type': 'application/json' }),\n })\n }\n\n let location\n if (this.detectLocation) {\n location = await this.retrieveLocation(input, context)\n }\n\n const response = await fetch(input, init)\n if (!resolveOpts?.skipPersistence && response.status >= 200 && response.status < 300) {\n const serializedResponse = await serializeResponse(response)\n const resource: Resource = {\n location,\n response: serializedResponse,\n resourceType,\n insertedAt: Date.now(),\n partyCorrelationId,\n }\n const cachedResource = await this.persistResource({\n resource,\n resourceIdentifier,\n namespace,\n storeId,\n })\n\n if (!cachedResource.value) {\n return Promise.reject(Error('Resource not present in persistence result'))\n }\n\n return deserializeResponse(cachedResource.value.response)\n }\n\n return response\n }\n\n private async retrieveLocation(input: RequestInfo | URL, context: RequiredContext) {\n let url: URL\n if (input instanceof Request && input.url !== undefined && input.url !== null) {\n url = new URL(input.url)\n } else if (input instanceof URL) {\n url = input\n } else {\n throw Error(`input type is required to be RequestInfo | URL`)\n }\n return await context.agent.anomalyDetectionLookupLocation({\n ipOrHostname: url.hostname,\n })\n }\n\n /** {@inheritDoc IResourceResolver.resourceClearAllResources} */\n private async resourceClearAllResources(args: ClearAllResourcesArgs, context: RequiredContext): Promise<boolean> {\n const { storeId } = args\n return await this.store({ stores: this._resourceStores, storeId })\n .clear()\n .then(() => true)\n }\n\n /** {@inheritDoc IResourceResolver.resourceDefaultStoreId} */\n private async resourceDefaultStoreId(context: RequiredContext): Promise<string> {\n return this.defaultStoreId\n }\n\n /** {@inheritDoc IResourceResolver.resourceDefaultNamespace} */\n private async resourceDefaultNamespace(context: RequiredContext): Promise<string> {\n return this.defaultNamespace\n }\n\n /** {@inheritDoc IResourceResolver.resourceDefaultTtl} */\n private async resourceDefaultTtl(context: RequiredContext): Promise<number> {\n return this.defaultTtl\n }\n\n private async getResource(args: GetResourceArgs): Promise<IValueData<Resource>> {\n const { resourceIdentifier, storeId, namespace } = args\n return this.store({ stores: this._resourceStores, storeId }).getAsValueData(\n this.prefix({\n namespace,\n resourceIdentifier,\n }),\n )\n }\n\n private async persistResource(args: PersistResourceArgs): Promise<IValueData<Resource>> {\n const { resource, resourceIdentifier, ttl } = args\n const namespace = this.namespaceStr(args)\n const storeId = this.storeIdStr(args)\n\n return await this.store({ stores: this._resourceStores, storeId }).set(\n this.prefix({\n namespace,\n resourceIdentifier,\n }),\n resource,\n ttl ?? this.defaultTtl,\n )\n }\n\n private store<T extends ValueStoreType>(args: StoreArgs<T>): IKeyValueStore<T> {\n const storeId = this.storeIdStr({ storeId: args.storeId })\n const store = args.stores.get(storeId)\n if (!store) {\n throw Error(`Could not get resource store: ${storeId}`)\n }\n return store\n }\n\n private storeIdStr(args: StoreIdStrArgs): string {\n const { storeId } = args\n return storeId ?? this.defaultStoreId\n }\n\n private namespaceStr(args: NamespaceStrArgs): string {\n const { namespace } = args\n return namespace ?? this.defaultNamespace\n }\n\n private prefix(args: PrefixArgs): string {\n const { namespace, resourceIdentifier } = args\n return `${this.namespaceStr({ namespace })}:${resourceIdentifier}`\n }\n}\n","import { Headers, Response, Request } from 'cross-fetch'\n\n// @ts-ignore\nimport { fromString } from 'uint8arrays/from-string'\n// @ts-ignore\nimport { toString } from 'uint8arrays/to-string'\nimport { ResolveOptions, Resource, SerializedResponse } from '../types/IResourceResolver'\n\nexport const getResourceIdentifier = (input: Request | string | URL): string => {\n if (typeof input === 'string') {\n return input\n } else if (input instanceof Request) {\n return input.url\n } else if (input instanceof URL) {\n return input.toString()\n }\n\n throw new Error('Invalid input type. Expected Request, string, or URL.')\n}\n\nexport const serializeResponse = async (response: Response): Promise<SerializedResponse> => {\n const arrayBuffer = await response.arrayBuffer()\n const base64Url = toString(new Uint8Array(arrayBuffer), 'base64url')\n\n return {\n status: response.status,\n statusText: response.statusText,\n // @ts-ignore\n headers: Object.fromEntries(response.headers.entries()),\n body: base64Url,\n }\n}\n\nexport const deserializeResponse = async (data: SerializedResponse): Promise<Response> => {\n const { status, statusText, headers, body } = data\n\n const uint8Array = fromString(body, 'base64url')\n const arrayBuffer = uint8Array.buffer.slice(uint8Array.byteOffset, uint8Array.byteOffset + uint8Array.byteLength)\n\n return new Response(arrayBuffer, {\n status,\n statusText,\n headers: new Headers(headers),\n })\n}\n\n// Check if the cache is still within the acceptable age\nexport const isCacheWithinMaxAge = (cachedResource: Resource, resolveOpts?: ResolveOptions): boolean => {\n return cachedResource && (resolveOpts?.maxAgeMs === undefined || Date.now() - cachedResource.insertedAt < resolveOpts.maxAgeMs)\n}\n"],"mappings":"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","names":["module","import_cross_fetch","getResourceIdentifier","input","Request","url","URL","toString","Error","serializeResponse","response","arrayBuffer","base64Url","Uint8Array","status","statusText","headers","Object","fromEntries","entries","body","deserializeResponse","data","uint8Array","fromString","buffer","slice","byteOffset","byteLength","Response","Headers","isCacheWithinMaxAge","cachedResource","resolveOpts","maxAgeMs","undefined","Date","now","insertedAt","ResourceResolver","schema","IResourceResolver","methods","resourceResolve","bind","resourceClearAllResources","resourceDefaultStoreId","resourceDefaultNamespace","resourceDefaultTtl","defaultStoreId","defaultNamespace","defaultTtl","detectLocation","_resourceStores","options","defaultStore","resourceStores","ttl","Map","set","KeyValueStore","namespace","store","args","context","input","init","resourceType","resolveOpts","partyCorrelationId","storeId","resourceIdentifier","getResourceIdentifier","cachedResource","getResource","value","isCacheWithinMaxAge","deserializeResponse","response","onlyCache","Response","JSON","stringify","error","status","statusText","headers","Headers","location","retrieveLocation","fetch","skipPersistence","serializedResponse","serializeResponse","resource","insertedAt","Date","now","persistResource","Promise","reject","Error","url","Request","undefined","URL","agent","anomalyDetectionLookupLocation","ipOrHostname","hostname","stores","clear","then","getAsValueData","prefix","namespaceStr","storeIdStr","get","schema","require"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../plugin.schema.json","../src/agent/ResourceResolver.ts","../src/utils/ResourceResolverUtils.ts","../src/index.ts"],"sourcesContent":["{\n \"IResourceResolver\": {\n \"components\": {\n \"schemas\": {\n \"ResourceResolverOptions\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"ResolveArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"ResolveOptions\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"ResourceType\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"ClearAllResourcesArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"PersistResourceArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"GetResourceArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"StoreIdStrArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"NamespaceStrArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"PrefixArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"StoreArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"Resource\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"SerializedResponse\": {\n \"type\": \"object\",\n \"properties\": {}\n }\n },\n \"methods\": {\n \"resourceResolve\": {\n \"description\": \"\",\n \"arguments\": {\n \"$ref\": \"#/components/schemas/ResolveArgs\"\n },\n \"returnType\": {}\n },\n \"resourceClearAllResources\": {\n \"description\": \"\",\n \"arguments\": {\n \"$ref\": \"#/components/schemas/ClearAllResourcesArgs\"\n },\n \"returnType\": {}\n },\n \"resourceDefaultStoreId\": {\n \"description\": \"\",\n \"returnType\": {}\n },\n \"resourceDefaultNamespace\": {\n \"description\": \"\",\n \"returnType\": {}\n },\n \"resourceDefaultTtl\": {\n \"description\": \"\",\n \"returnType\": {}\n }\n }\n }\n }\n}\n","import { IKeyValueStore, IValueData, KeyValueStore, ValueStoreType } from '@sphereon/ssi-sdk.kv-store-temp'\nimport { IAgentPlugin } from '@veramo/core'\nimport fetch, { Response, Headers } from 'cross-fetch'\nimport { schema } from '../index'\nimport { deserializeResponse, getResourceIdentifier, isCacheWithinMaxAge, serializeResponse } from '../utils/ResourceResolverUtils'\nimport {\n ClearAllResourcesArgs,\n ResolveArgs,\n GetResourceArgs,\n IResourceResolver,\n NamespaceStrArgs,\n PersistResourceArgs,\n PrefixArgs,\n RequiredContext,\n ResourceResolverOptions,\n StoreArgs,\n StoreIdStrArgs,\n Resource,\n} from '../types/IResourceResolver'\n\n/**\n * {@inheritDoc IResourceResolver}\n */\nexport class ResourceResolver implements IAgentPlugin {\n readonly schema = schema.IResourceResolver\n readonly methods: IResourceResolver = {\n resourceResolve: this.resourceResolve.bind(this),\n resourceClearAllResources: this.resourceClearAllResources.bind(this),\n resourceDefaultStoreId: this.resourceDefaultStoreId.bind(this),\n resourceDefaultNamespace: this.resourceDefaultNamespace.bind(this),\n resourceDefaultTtl: this.resourceDefaultTtl.bind(this),\n }\n\n private readonly defaultStoreId: string\n private readonly defaultNamespace: string\n private readonly defaultTtl: number\n private readonly detectLocation: boolean\n private readonly _resourceStores: Map<string, IKeyValueStore<Resource>>\n\n constructor(options?: ResourceResolverOptions) {\n const { defaultStore, defaultNamespace, resourceStores, ttl, detectLocation } = options ?? {}\n\n this.defaultStoreId = defaultStore ?? '_default'\n this.defaultNamespace = defaultNamespace ?? 'resources'\n this.defaultTtl = ttl ?? 3600\n this.detectLocation = detectLocation ?? false\n\n if (resourceStores && resourceStores instanceof Map) {\n this._resourceStores = resourceStores\n } else if (resourceStores) {\n this._resourceStores = new Map().set(this.defaultStoreId, resourceStores)\n } else {\n this._resourceStores = new Map().set(\n this.defaultStoreId,\n new KeyValueStore({\n namespace: this.defaultNamespace,\n store: new Map<string, Resource>(),\n ttl: this.defaultTtl,\n }),\n )\n }\n }\n\n /** {@inheritDoc IResourceResolver.resourceResolve} */\n private async resourceResolve(args: ResolveArgs, context: RequiredContext): Promise<Response> {\n const { input, init, resourceType, resolveOpts, partyCorrelationId, storeId, namespace } = args\n\n const resourceIdentifier = getResourceIdentifier(input)\n\n const cachedResource = await this.getResource({ resourceIdentifier, storeId, namespace })\n if (cachedResource.value && isCacheWithinMaxAge(cachedResource.value, resolveOpts)) {\n return deserializeResponse(cachedResource.value.response)\n }\n\n if (resolveOpts?.onlyCache) {\n return new Response(JSON.stringify({ error: 'Resource not found' }), {\n status: 404,\n statusText: 'Not Found',\n headers: new Headers({ 'Content-Type': 'application/json' }),\n })\n }\n\n let location\n if (this.detectLocation) {\n location = await this.retrieveLocation(input, context)\n }\n\n const response = await fetch(input, init)\n if (!resolveOpts?.skipPersistence && response.status >= 200 && response.status < 300) {\n const serializedResponse = await serializeResponse(response)\n const resource: Resource = {\n location,\n response: serializedResponse,\n resourceType,\n insertedAt: Date.now(),\n partyCorrelationId,\n }\n const cachedResource = await this.persistResource({\n resource,\n resourceIdentifier,\n namespace,\n storeId,\n })\n\n if (!cachedResource.value) {\n return Promise.reject(Error('Resource not present in persistence result'))\n }\n\n return deserializeResponse(cachedResource.value.response)\n }\n\n return response\n }\n\n private async retrieveLocation(input: RequestInfo | URL, context: RequiredContext) {\n let url: URL\n if (input instanceof Request && input.url !== undefined && input.url !== null) {\n url = new URL(input.url)\n } else if (input instanceof URL) {\n url = input\n } else {\n throw Error(`input type is required to be RequestInfo | URL`)\n }\n return await context.agent.anomalyDetectionLookupLocation({\n ipOrHostname: url.hostname,\n })\n }\n\n /** {@inheritDoc IResourceResolver.resourceClearAllResources} */\n private async resourceClearAllResources(args: ClearAllResourcesArgs, context: RequiredContext): Promise<boolean> {\n const { storeId } = args\n return await this.store({ stores: this._resourceStores, storeId })\n .clear()\n .then(() => true)\n }\n\n /** {@inheritDoc IResourceResolver.resourceDefaultStoreId} */\n private async resourceDefaultStoreId(context: RequiredContext): Promise<string> {\n return this.defaultStoreId\n }\n\n /** {@inheritDoc IResourceResolver.resourceDefaultNamespace} */\n private async resourceDefaultNamespace(context: RequiredContext): Promise<string> {\n return this.defaultNamespace\n }\n\n /** {@inheritDoc IResourceResolver.resourceDefaultTtl} */\n private async resourceDefaultTtl(context: RequiredContext): Promise<number> {\n return this.defaultTtl\n }\n\n private async getResource(args: GetResourceArgs): Promise<IValueData<Resource>> {\n const { resourceIdentifier, storeId, namespace } = args\n return this.store({ stores: this._resourceStores, storeId }).getAsValueData(\n this.prefix({\n namespace,\n resourceIdentifier,\n }),\n )\n }\n\n private async persistResource(args: PersistResourceArgs): Promise<IValueData<Resource>> {\n const { resource, resourceIdentifier, ttl } = args\n const namespace = this.namespaceStr(args)\n const storeId = this.storeIdStr(args)\n\n return await this.store({ stores: this._resourceStores, storeId }).set(\n this.prefix({\n namespace,\n resourceIdentifier,\n }),\n resource,\n ttl ?? this.defaultTtl,\n )\n }\n\n private store<T extends ValueStoreType>(args: StoreArgs<T>): IKeyValueStore<T> {\n const storeId = this.storeIdStr({ storeId: args.storeId })\n const store = args.stores.get(storeId)\n if (!store) {\n throw Error(`Could not get resource store: ${storeId}`)\n }\n return store\n }\n\n private storeIdStr(args: StoreIdStrArgs): string {\n const { storeId } = args\n return storeId ?? this.defaultStoreId\n }\n\n private namespaceStr(args: NamespaceStrArgs): string {\n const { namespace } = args\n return namespace ?? this.defaultNamespace\n }\n\n private prefix(args: PrefixArgs): string {\n const { namespace, resourceIdentifier } = args\n return `${this.namespaceStr({ namespace })}:${resourceIdentifier}`\n }\n}\n","import { Headers, Response, Request } from 'cross-fetch'\n\n// @ts-ignore\nimport { fromString } from 'uint8arrays/from-string'\n// @ts-ignore\nimport { toString } from 'uint8arrays/to-string'\nimport { ResolveOptions, Resource, SerializedResponse } from '../types/IResourceResolver'\n\nexport const getResourceIdentifier = (input: Request | string | URL): string => {\n if (typeof input === 'string') {\n return input\n } else if (input instanceof Request) {\n return input.url\n } else if (input instanceof URL) {\n return input.toString()\n }\n\n throw new Error('Invalid input type. Expected Request, string, or URL.')\n}\n\nexport const serializeResponse = async (response: Response): Promise<SerializedResponse> => {\n const arrayBuffer = await response.arrayBuffer()\n const base64Url = toString(new Uint8Array(arrayBuffer), 'base64url')\n\n return {\n status: response.status,\n statusText: response.statusText,\n // @ts-ignore\n headers: Object.fromEntries(response.headers.entries()),\n body: base64Url,\n }\n}\n\nexport const deserializeResponse = async (data: SerializedResponse): Promise<Response> => {\n const { status, statusText, headers, body } = data\n\n const uint8Array = fromString(body, 'base64url')\n const arrayBuffer = uint8Array.buffer.slice(uint8Array.byteOffset, uint8Array.byteOffset + uint8Array.byteLength)\n\n return new Response(arrayBuffer, {\n status,\n statusText,\n headers: new Headers(headers),\n })\n}\n\n// Check if the cache is still within the acceptable age\nexport const isCacheWithinMaxAge = (cachedResource: Resource, resolveOpts?: ResolveOptions): boolean => {\n return cachedResource && (resolveOpts?.maxAgeMs === undefined || Date.now() - cachedResource.insertedAt < resolveOpts.maxAgeMs)\n}\n","/**\n * @public\n */\nconst schema = require('../plugin.schema.json')\nexport { schema }\nexport { ResourceResolver } from './agent/ResourceResolver'\nexport * from './types/IResourceResolver'\n"],"mappings":"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","names":["KeyValueStore","fetch","Response","Headers","Headers","Response","Request","fromString","toString","getResourceIdentifier","input","Request","url","URL","toString","Error","serializeResponse","response","arrayBuffer","base64Url","Uint8Array","status","statusText","headers","Object","fromEntries","entries","body","deserializeResponse","data","uint8Array","fromString","buffer","slice","byteOffset","byteLength","Response","Headers","isCacheWithinMaxAge","cachedResource","resolveOpts","maxAgeMs","undefined","Date","now","insertedAt","ResourceResolver","schema","IResourceResolver","methods","resourceResolve","bind","resourceClearAllResources","resourceDefaultStoreId","resourceDefaultNamespace","resourceDefaultTtl","defaultStoreId","defaultNamespace","defaultTtl","detectLocation","_resourceStores","constructor","options","defaultStore","resourceStores","ttl","Map","set","KeyValueStore","namespace","store","args","context","input","init","resourceType","resolveOpts","partyCorrelationId","storeId","resourceIdentifier","getResourceIdentifier","cachedResource","getResource","value","isCacheWithinMaxAge","deserializeResponse","response","onlyCache","Response","JSON","stringify","error","status","statusText","headers","Headers","location","retrieveLocation","fetch","skipPersistence","serializedResponse","serializeResponse","resource","insertedAt","Date","now","persistResource","Promise","reject","Error","url","Request","undefined","URL","agent","anomalyDetectionLookupLocation","ipOrHostname","hostname","stores","clear","then","getAsValueData","prefix","namespaceStr","storeIdStr","get","schema","require"]}
1
+ {"version":3,"sources":["../plugin.schema.json","../src/agent/ResourceResolver.ts","../src/utils/ResourceResolverUtils.ts","../src/index.ts"],"sourcesContent":["{\n \"IResourceResolver\": {\n \"components\": {\n \"schemas\": {\n \"ResourceResolverOptions\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"ResolveArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"ResolveOptions\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"ResourceType\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"ClearAllResourcesArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"PersistResourceArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"GetResourceArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"StoreIdStrArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"NamespaceStrArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"PrefixArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"StoreArgs\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"Resource\": {\n \"type\": \"object\",\n \"properties\": {}\n },\n \"SerializedResponse\": {\n \"type\": \"object\",\n \"properties\": {}\n }\n },\n \"methods\": {\n \"resourceResolve\": {\n \"description\": \"\",\n \"arguments\": {\n \"$ref\": \"#/components/schemas/ResolveArgs\"\n },\n \"returnType\": {}\n },\n \"resourceClearAllResources\": {\n \"description\": \"\",\n \"arguments\": {\n \"$ref\": \"#/components/schemas/ClearAllResourcesArgs\"\n },\n \"returnType\": {}\n },\n \"resourceDefaultStoreId\": {\n \"description\": \"\",\n \"returnType\": {}\n },\n \"resourceDefaultNamespace\": {\n \"description\": \"\",\n \"returnType\": {}\n },\n \"resourceDefaultTtl\": {\n \"description\": \"\",\n \"returnType\": {}\n }\n }\n }\n }\n}\n","import { IKeyValueStore, IValueData, KeyValueStore, ValueStoreType } from '@sphereon/ssi-sdk.kv-store-temp'\nimport { IAgentPlugin } from '@veramo/core'\nimport fetch, { Response, Headers } from 'cross-fetch'\nimport { schema } from '../index'\nimport { deserializeResponse, getResourceIdentifier, isCacheWithinMaxAge, serializeResponse } from '../utils/ResourceResolverUtils'\nimport {\n ClearAllResourcesArgs,\n ResolveArgs,\n GetResourceArgs,\n IResourceResolver,\n NamespaceStrArgs,\n PersistResourceArgs,\n PrefixArgs,\n RequiredContext,\n ResourceResolverOptions,\n StoreArgs,\n StoreIdStrArgs,\n Resource,\n} from '../types/IResourceResolver'\n\n/**\n * {@inheritDoc IResourceResolver}\n */\nexport class ResourceResolver implements IAgentPlugin {\n readonly schema = schema.IResourceResolver\n readonly methods: IResourceResolver = {\n resourceResolve: this.resourceResolve.bind(this),\n resourceClearAllResources: this.resourceClearAllResources.bind(this),\n resourceDefaultStoreId: this.resourceDefaultStoreId.bind(this),\n resourceDefaultNamespace: this.resourceDefaultNamespace.bind(this),\n resourceDefaultTtl: this.resourceDefaultTtl.bind(this),\n }\n\n private readonly defaultStoreId: string\n private readonly defaultNamespace: string\n private readonly defaultTtl: number\n private readonly detectLocation: boolean\n private readonly _resourceStores: Map<string, IKeyValueStore<Resource>>\n\n constructor(options?: ResourceResolverOptions) {\n const { defaultStore, defaultNamespace, resourceStores, ttl, detectLocation } = options ?? {}\n\n this.defaultStoreId = defaultStore ?? '_default'\n this.defaultNamespace = defaultNamespace ?? 'resources'\n this.defaultTtl = ttl ?? 3600\n this.detectLocation = detectLocation ?? false\n\n if (resourceStores && resourceStores instanceof Map) {\n this._resourceStores = resourceStores\n } else if (resourceStores) {\n this._resourceStores = new Map().set(this.defaultStoreId, resourceStores)\n } else {\n this._resourceStores = new Map().set(\n this.defaultStoreId,\n new KeyValueStore({\n namespace: this.defaultNamespace,\n store: new Map<string, Resource>(),\n ttl: this.defaultTtl,\n }),\n )\n }\n }\n\n /** {@inheritDoc IResourceResolver.resourceResolve} */\n private async resourceResolve(args: ResolveArgs, context: RequiredContext): Promise<Response> {\n const { input, init, resourceType, resolveOpts, partyCorrelationId, storeId, namespace } = args\n\n const resourceIdentifier = getResourceIdentifier(input)\n\n const cachedResource = await this.getResource({ resourceIdentifier, storeId, namespace })\n if (cachedResource.value && isCacheWithinMaxAge(cachedResource.value, resolveOpts)) {\n return deserializeResponse(cachedResource.value.response)\n }\n\n if (resolveOpts?.onlyCache) {\n return new Response(JSON.stringify({ error: 'Resource not found' }), {\n status: 404,\n statusText: 'Not Found',\n headers: new Headers({ 'Content-Type': 'application/json' }),\n })\n }\n\n let location\n if (this.detectLocation) {\n location = await this.retrieveLocation(input, context)\n }\n\n const response = await fetch(input, init)\n if (!resolveOpts?.skipPersistence && response.status >= 200 && response.status < 300) {\n const serializedResponse = await serializeResponse(response)\n const resource: Resource = {\n location,\n response: serializedResponse,\n resourceType,\n insertedAt: Date.now(),\n partyCorrelationId,\n }\n const cachedResource = await this.persistResource({\n resource,\n resourceIdentifier,\n namespace,\n storeId,\n })\n\n if (!cachedResource.value) {\n return Promise.reject(Error('Resource not present in persistence result'))\n }\n\n return deserializeResponse(cachedResource.value.response)\n }\n\n return response\n }\n\n private async retrieveLocation(input: RequestInfo | URL, context: RequiredContext) {\n let url: URL\n if (input instanceof Request && input.url !== undefined && input.url !== null) {\n url = new URL(input.url)\n } else if (input instanceof URL) {\n url = input\n } else {\n throw Error(`input type is required to be RequestInfo | URL`)\n }\n return await context.agent.anomalyDetectionLookupLocation({\n ipOrHostname: url.hostname,\n })\n }\n\n /** {@inheritDoc IResourceResolver.resourceClearAllResources} */\n private async resourceClearAllResources(args: ClearAllResourcesArgs, context: RequiredContext): Promise<boolean> {\n const { storeId } = args\n return await this.store({ stores: this._resourceStores, storeId })\n .clear()\n .then(() => true)\n }\n\n /** {@inheritDoc IResourceResolver.resourceDefaultStoreId} */\n private async resourceDefaultStoreId(context: RequiredContext): Promise<string> {\n return this.defaultStoreId\n }\n\n /** {@inheritDoc IResourceResolver.resourceDefaultNamespace} */\n private async resourceDefaultNamespace(context: RequiredContext): Promise<string> {\n return this.defaultNamespace\n }\n\n /** {@inheritDoc IResourceResolver.resourceDefaultTtl} */\n private async resourceDefaultTtl(context: RequiredContext): Promise<number> {\n return this.defaultTtl\n }\n\n private async getResource(args: GetResourceArgs): Promise<IValueData<Resource>> {\n const { resourceIdentifier, storeId, namespace } = args\n return this.store({ stores: this._resourceStores, storeId }).getAsValueData(\n this.prefix({\n namespace,\n resourceIdentifier,\n }),\n )\n }\n\n private async persistResource(args: PersistResourceArgs): Promise<IValueData<Resource>> {\n const { resource, resourceIdentifier, ttl } = args\n const namespace = this.namespaceStr(args)\n const storeId = this.storeIdStr(args)\n\n return await this.store({ stores: this._resourceStores, storeId }).set(\n this.prefix({\n namespace,\n resourceIdentifier,\n }),\n resource,\n ttl ?? this.defaultTtl,\n )\n }\n\n private store<T extends ValueStoreType>(args: StoreArgs<T>): IKeyValueStore<T> {\n const storeId = this.storeIdStr({ storeId: args.storeId })\n const store = args.stores.get(storeId)\n if (!store) {\n throw Error(`Could not get resource store: ${storeId}`)\n }\n return store\n }\n\n private storeIdStr(args: StoreIdStrArgs): string {\n const { storeId } = args\n return storeId ?? this.defaultStoreId\n }\n\n private namespaceStr(args: NamespaceStrArgs): string {\n const { namespace } = args\n return namespace ?? this.defaultNamespace\n }\n\n private prefix(args: PrefixArgs): string {\n const { namespace, resourceIdentifier } = args\n return `${this.namespaceStr({ namespace })}:${resourceIdentifier}`\n }\n}\n","import { Headers, Response, Request } from 'cross-fetch'\n\n// @ts-ignore\nimport { fromString } from 'uint8arrays/from-string'\n// @ts-ignore\nimport { toString } from 'uint8arrays/to-string'\nimport { ResolveOptions, Resource, SerializedResponse } from '../types/IResourceResolver'\n\nexport const getResourceIdentifier = (input: Request | string | URL): string => {\n if (typeof input === 'string') {\n return input\n } else if (input instanceof Request) {\n return input.url\n } else if (input instanceof URL) {\n return input.toString()\n }\n\n throw new Error('Invalid input type. Expected Request, string, or URL.')\n}\n\nexport const serializeResponse = async (response: Response): Promise<SerializedResponse> => {\n const arrayBuffer = await response.arrayBuffer()\n const base64Url = toString(new Uint8Array(arrayBuffer), 'base64url')\n\n return {\n status: response.status,\n statusText: response.statusText,\n // @ts-ignore\n headers: Object.fromEntries(response.headers.entries()),\n body: base64Url,\n }\n}\n\nexport const deserializeResponse = async (data: SerializedResponse): Promise<Response> => {\n const { status, statusText, headers, body } = data\n\n const uint8Array = fromString(body, 'base64url')\n const arrayBuffer = uint8Array.buffer.slice(uint8Array.byteOffset, uint8Array.byteOffset + uint8Array.byteLength)\n\n return new Response(arrayBuffer, {\n status,\n statusText,\n headers: new Headers(headers),\n })\n}\n\n// Check if the cache is still within the acceptable age\nexport const isCacheWithinMaxAge = (cachedResource: Resource, resolveOpts?: ResolveOptions): boolean => {\n return cachedResource && (resolveOpts?.maxAgeMs === undefined || Date.now() - cachedResource.insertedAt < resolveOpts.maxAgeMs)\n}\n","/**\n * @public\n */\nconst schema = require('../plugin.schema.json')\nexport { schema }\nexport { ResourceResolver } from './agent/ResourceResolver'\nexport * from './types/IResourceResolver'\n"],"mappings":"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","names":["KeyValueStore","fetch","Response","Headers","Headers","Response","Request","fromString","toString","getResourceIdentifier","input","Request","url","URL","toString","Error","serializeResponse","response","arrayBuffer","base64Url","Uint8Array","status","statusText","headers","Object","fromEntries","entries","body","deserializeResponse","data","uint8Array","fromString","buffer","slice","byteOffset","byteLength","Response","Headers","isCacheWithinMaxAge","cachedResource","resolveOpts","maxAgeMs","undefined","Date","now","insertedAt","ResourceResolver","schema","IResourceResolver","methods","resourceResolve","bind","resourceClearAllResources","resourceDefaultStoreId","resourceDefaultNamespace","resourceDefaultTtl","defaultStoreId","defaultNamespace","defaultTtl","detectLocation","_resourceStores","options","defaultStore","resourceStores","ttl","Map","set","KeyValueStore","namespace","store","args","context","input","init","resourceType","resolveOpts","partyCorrelationId","storeId","resourceIdentifier","getResourceIdentifier","cachedResource","getResource","value","isCacheWithinMaxAge","deserializeResponse","response","onlyCache","Response","JSON","stringify","error","status","statusText","headers","Headers","location","retrieveLocation","fetch","skipPersistence","serializedResponse","serializeResponse","resource","insertedAt","Date","now","persistResource","Promise","reject","Error","url","Request","undefined","URL","agent","anomalyDetectionLookupLocation","ipOrHostname","hostname","stores","clear","then","getAsValueData","prefix","namespaceStr","storeIdStr","get","schema","require"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sphereon/ssi-sdk.resource-resolver",
3
- "version": "0.34.0",
3
+ "version": "0.34.1-next.3+6c49ea2f",
4
4
  "source": "src/index.ts",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -26,15 +26,15 @@
26
26
  "build": "tsup --config ../../tsup.config.ts --tsconfig ../../tsconfig.tsup.json"
27
27
  },
28
28
  "dependencies": {
29
- "@sphereon/ssi-sdk.anomaly-detection": "0.34.0",
30
- "@sphereon/ssi-sdk.kv-store-temp": "0.34.0",
29
+ "@sphereon/ssi-sdk.anomaly-detection": "0.34.1-next.3+6c49ea2f",
30
+ "@sphereon/ssi-sdk.kv-store-temp": "0.34.1-next.3+6c49ea2f",
31
31
  "cross-fetch": "^3.1.8",
32
32
  "debug": "^4.3.5",
33
33
  "typeorm": "0.3.20",
34
34
  "uint8arrays": "^3.1.1"
35
35
  },
36
36
  "devDependencies": {
37
- "@sphereon/ssi-sdk.agent-config": "0.34.0",
37
+ "@sphereon/ssi-sdk.agent-config": "0.34.1-next.3+6c49ea2f",
38
38
  "@veramo/remote-client": "4.2.0",
39
39
  "@veramo/remote-server": "4.2.0",
40
40
  "nock": "^13.5.4",
@@ -61,5 +61,5 @@
61
61
  "Resource Management",
62
62
  "Caching"
63
63
  ],
64
- "gitHead": "b1c9c5e91a9ce4bc677ff2cce5f2d520a16b366d"
64
+ "gitHead": "6c49ea2f9c1bc61641ca2c98e3aa0a5b48018d91"
65
65
  }