UNPKG

@sphereon/ssi-sdk.resource-resolver

Version:

1 lines • 18.7 kB
{"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"]}