diff --git a/WRAP_TEST_HARNESS b/WRAP_TEST_HARNESS index db8b214f7a..8b25206ff9 100644 --- a/WRAP_TEST_HARNESS +++ b/WRAP_TEST_HARNESS @@ -1 +1 @@ -module-trait-rs \ No newline at end of file +master \ No newline at end of file diff --git a/packages/js/client-config-builder/README.md b/packages/js/client-config-builder/README.md index 889f6fb587..f4ed4e4341 100644 --- a/packages/js/client-config-builder/README.md +++ b/packages/js/client-config-builder/README.md @@ -34,12 +34,10 @@ Add client configuration with [add](#add), or flexibly mix and match builder [co builder .addPackage("wrap://plugin/package", httpPlugin({})) .removePackage("wrap://plugin/package") - .addPackages( - { - "wrap://plugin/http": httpPlugin({}), - "wrap://plugin/filesystem": fileSystemPlugin({}), - } - ); + .addPackages({ + "wrap://plugin/http": httpPlugin({}), + "wrap://plugin/filesystem": fileSystemPlugin({}), + }); ``` You can add the entire [default client configuration bundle](#bundle--defaultconfig) at once with [addDefaults](#adddefaults) @@ -58,7 +56,7 @@ Finally, build a ClientConfig or CoreClientConfig to pass to the PolywrapClient // build with a custom cache coreClientConfig = builder.build({ - wrapperCache: new WrapperCache(), + resolutionResultCache: new ResolutionResultCache(), }); // or build with a custom resolver @@ -90,25 +88,28 @@ A complete example using all or most of the available methods. // add and remove wrappers builder - .addWrapper("wrap://ens/wrapper.eth", await WasmWrapper.from( - new Uint8Array([1, 2, 3]), - new Uint8Array([1, 2, 3]) - )) + .addWrapper( + "wrap://ens/wrapper.eth", + await WasmWrapper.from( + new Uint8Array([1, 2, 3]), + new Uint8Array([1, 2, 3]) + ) + ) .removeWrapper("wrap://ens/wrapper.eth") .addWrappers({ "wrap://ens/wrapper.eth": await WasmWrapper.from( - new Uint8Array([1, 2, 3]), - new Uint8Array([1, 2, 3]) - )} - ); + new Uint8Array([1, 2, 3]), + new Uint8Array([1, 2, 3]) + ), + }); // add and remove wrap packages builder .addPackage("wrap://plugin/package", httpPlugin({})) .removePackage("wrap://plugin/package") .addPackages({ - "wrap://plugin/package": httpPlugin({}) - }) + "wrap://plugin/package": httpPlugin({}), + }); // add and remove Envs builder @@ -140,7 +141,7 @@ A complete example using all or most of the available methods. .addRedirect("wrap://ens/from.eth", "wrap://ens/to.eth") .removeRedirect("wrap://ens/from.eth") .addRedirects({ - "wrap://ens/from.eth": "wrap://ens/to.eth", + "wrap://ens/from.eth": "wrap://ens/to.eth", }); // add resolvers diff --git a/packages/js/client-config-builder/examples/quickstart.ts b/packages/js/client-config-builder/examples/quickstart.ts index 89f0947984..bc099f1977 100644 --- a/packages/js/client-config-builder/examples/quickstart.ts +++ b/packages/js/client-config-builder/examples/quickstart.ts @@ -3,7 +3,10 @@ import { ClientConfigBuilder } from "../build"; // eslint-disable-next-line import/no-extraneous-dependencies import { WasmWrapper } from "@polywrap/wasm-js"; import { httpPlugin } from "@polywrap/http-plugin-js"; -import { RecursiveResolver, WrapperCache } from "@polywrap/uri-resolvers-js"; +import { + RecursiveResolver, + ResolutionResultCache, +} from "@polywrap/uri-resolvers-js"; import { fileSystemPlugin } from "@polywrap/file-system-plugin-js"; import { CoreClientConfig } from "@polywrap/core-js"; @@ -34,12 +37,10 @@ export function configure(): ClientConfigBuilder { builder .addPackage("wrap://plugin/package", httpPlugin({})) .removePackage("wrap://plugin/package") - .addPackages( - { - "wrap://plugin/http": httpPlugin({}), - "wrap://plugin/filesystem": fileSystemPlugin({}), - } - ); + .addPackages({ + "wrap://plugin/http": httpPlugin({}), + "wrap://plugin/filesystem": fileSystemPlugin({}), + }); // $end // $start: quickstart-addDefaults @@ -49,9 +50,7 @@ export function configure(): ClientConfigBuilder { return builder; } -export function build(): - | ClientConfigBuilder - | CoreClientConfig { +export function build(): ClientConfigBuilder | CoreClientConfig { const builder = new ClientConfigBuilder(); // $start: quickstart-build @@ -60,7 +59,7 @@ export function build(): // build with a custom cache coreClientConfig = builder.build({ - wrapperCache: new WrapperCache(), + resolutionResultCache: new ResolutionResultCache(), }); // or build with a custom resolver @@ -92,25 +91,28 @@ export async function example(): Promise { // add and remove wrappers builder - .addWrapper("wrap://ens/wrapper.eth", await WasmWrapper.from( - new Uint8Array([1, 2, 3]), - new Uint8Array([1, 2, 3]) - )) + .addWrapper( + "wrap://ens/wrapper.eth", + await WasmWrapper.from( + new Uint8Array([1, 2, 3]), + new Uint8Array([1, 2, 3]) + ) + ) .removeWrapper("wrap://ens/wrapper.eth") .addWrappers({ "wrap://ens/wrapper.eth": await WasmWrapper.from( - new Uint8Array([1, 2, 3]), - new Uint8Array([1, 2, 3]) - )} - ); + new Uint8Array([1, 2, 3]), + new Uint8Array([1, 2, 3]) + ), + }); // add and remove wrap packages builder .addPackage("wrap://plugin/package", httpPlugin({})) .removePackage("wrap://plugin/package") .addPackages({ - "wrap://plugin/package": httpPlugin({}) - }) + "wrap://plugin/package": httpPlugin({}), + }); // add and remove Envs builder @@ -142,7 +144,7 @@ export async function example(): Promise { .addRedirect("wrap://ens/from.eth", "wrap://ens/to.eth") .removeRedirect("wrap://ens/from.eth") .addRedirects({ - "wrap://ens/from.eth": "wrap://ens/to.eth", + "wrap://ens/from.eth": "wrap://ens/to.eth", }); // add resolvers diff --git a/packages/js/client-config-builder/src/ClientConfigBuilder.ts b/packages/js/client-config-builder/src/ClientConfigBuilder.ts index a9bc3fc437..9ceb41f01e 100644 --- a/packages/js/client-config-builder/src/ClientConfigBuilder.ts +++ b/packages/js/client-config-builder/src/ClientConfigBuilder.ts @@ -15,8 +15,8 @@ import { import { RecursiveResolver, StaticResolver, - WrapperCache, - WrapperCacheResolver, + ResolutionResultCache, + ResolutionResultCacheResolver, PackageToWrapperResolver, RequestSynchronizerResolver, } from "@polywrap/uri-resolvers-js"; @@ -38,8 +38,10 @@ export class ClientConfigBuilder extends BaseClientConfigBuilder { build(options?: BuildOptions): CoreClientConfig { const resolver = options && "resolver" in options ? options.resolver : undefined; - const wrapperCache = - options && "wrapperCache" in options ? options.wrapperCache : undefined; + const resolutionResultCache = + options && "resolutionResultCache" in options + ? options.resolutionResultCache + : undefined; return { envs: this.buildEnvs(), interfaces: this.buildInterfaces(), @@ -47,7 +49,7 @@ export class ClientConfigBuilder extends BaseClientConfigBuilder { resolver ?? RecursiveResolver.from( RequestSynchronizerResolver.from( - WrapperCacheResolver.from( + ResolutionResultCacheResolver.from( PackageToWrapperResolver.from([ StaticResolver.from([ ...this.buildRedirects(), @@ -57,7 +59,7 @@ export class ClientConfigBuilder extends BaseClientConfigBuilder { ...this._config.resolvers, new ExtendableUriResolver(), ]), - wrapperCache ?? new WrapperCache() + resolutionResultCache ?? new ResolutionResultCache() ) ) ), diff --git a/packages/js/client-config-builder/src/types/BuildOptions.ts b/packages/js/client-config-builder/src/types/BuildOptions.ts index 68a603c89a..f108db5507 100644 --- a/packages/js/client-config-builder/src/types/BuildOptions.ts +++ b/packages/js/client-config-builder/src/types/BuildOptions.ts @@ -1,9 +1,9 @@ -import { IWrapperCache } from "@polywrap/uri-resolvers-js"; +import { IResolutionResultCache } from "@polywrap/uri-resolvers-js"; import { IUriResolver } from "@polywrap/core-js"; export type BuildOptions = | { - wrapperCache: IWrapperCache; + resolutionResultCache: IResolutionResultCache; } | { resolver: IUriResolver; diff --git a/packages/js/client/src/__tests__/core/uri-resolution/histories/sanity.json b/packages/js/client/src/__tests__/core/uri-resolution/histories/sanity.json index bad78819e3..a94af54674 100644 --- a/packages/js/client/src/__tests__/core/uri-resolution/histories/sanity.json +++ b/packages/js/client/src/__tests__/core/uri-resolution/histories/sanity.json @@ -1,7 +1,7 @@ [ "wrap://ens/uri.eth => RequestSynchronizerResolver", [ - "wrap://ens/uri.eth => WrapperCacheResolver", + "wrap://ens/uri.eth => ResolutionResultCacheResolver", [ "wrap://ens/uri.eth => PackageToWrapperResolver", [ @@ -12,7 +12,7 @@ [ "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => WrapperCacheResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", [ "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => PackageToWrapperResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", [ @@ -25,7 +25,7 @@ ], "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", [ - "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => WrapperCacheResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", [ "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => PackageToWrapperResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", [ @@ -39,7 +39,7 @@ "wrap://ens/uri.eth => ResolverExtension (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)", "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", [ - "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => WrapperCacheResolver => uri (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", + "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver => uri (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", [ "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => PackageToWrapperResolver => uri (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", [ @@ -52,7 +52,7 @@ ], "wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw => RequestSynchronizerResolver => wrapper (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", [ - "wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw => WrapperCacheResolver => wrapper (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", + "wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw => ResolutionResultCacheResolver => wrapper (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", [ "wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw => PackageToWrapperResolver => wrapper (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", [ @@ -61,9 +61,13 @@ "wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw => StaticResolver - Miss", "wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw => ExtendableUriResolver => package (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)", + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => WrapperCacheResolver (Cache) => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)" + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" + ], + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", + [ + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" ], "wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw => ResolverExtension (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0) => package (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)" ] @@ -74,7 +78,7 @@ "wrap://ens/uri.eth => ResolverExtension (wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0)", "wrap://ens/wraps.eth:http-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg)", [ - "wrap://ens/wraps.eth:http-uri-resolver-ext@1.0.0 => WrapperCacheResolver => uri (wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg)", + "wrap://ens/wraps.eth:http-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver => uri (wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg)", [ "wrap://ens/wraps.eth:http-uri-resolver-ext@1.0.0 => PackageToWrapperResolver => uri (wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg)", [ @@ -83,14 +87,22 @@ "wrap://ens/wraps.eth:http-uri-resolver-ext@1.0.0 => StaticResolver - Miss", "wrap://ens/wraps.eth:http-uri-resolver-ext@1.0.0 => ExtendableUriResolver => uri (wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)", + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", + [ + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" + ], + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => WrapperCacheResolver (Cache) => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)" + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" ], "wrap://ens/wraps.eth:http-uri-resolver-ext@1.0.0 => ResolverExtension (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)", - "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0)", + "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", [ - "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => WrapperCacheResolver (Cache) => wrapper (wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0)" + "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => uri (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)" + ], + "wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw => RequestSynchronizerResolver => wrapper (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", + [ + "wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw => ResolutionResultCacheResolver (Cache) => wrapper (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)" ], "wrap://ens/wraps.eth:http-uri-resolver-ext@1.0.0 => ResolverExtension (wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0) => uri (wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg)" ] @@ -100,7 +112,7 @@ ], "wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg => RequestSynchronizerResolver => wrapper (wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg)", [ - "wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg => WrapperCacheResolver => wrapper (wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg)", + "wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg => ResolutionResultCacheResolver => wrapper (wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg)", [ "wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg => PackageToWrapperResolver => wrapper (wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg)", [ @@ -109,9 +121,13 @@ "wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg => StaticResolver - Miss", "wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg => ExtendableUriResolver => package (wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)", + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => WrapperCacheResolver (Cache) => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)" + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" + ], + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", + [ + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" ], "wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg => ResolverExtension (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0) => package (wrap://ipfs/QmbsxmNDbJ3uNp9CRBTfTVQJikCYWQrFcXbC3mVpTRTLZg)" ] @@ -122,7 +138,7 @@ "wrap://ens/uri.eth => ResolverExtension (wrap://ens/wraps.eth:http-uri-resolver-ext@1.0.0)", "wrap://ens/wraps.eth:file-system-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU)", [ - "wrap://ens/wraps.eth:file-system-uri-resolver-ext@1.0.0 => WrapperCacheResolver => uri (wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU)", + "wrap://ens/wraps.eth:file-system-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver => uri (wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU)", [ "wrap://ens/wraps.eth:file-system-uri-resolver-ext@1.0.0 => PackageToWrapperResolver => uri (wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU)", [ @@ -131,14 +147,22 @@ "wrap://ens/wraps.eth:file-system-uri-resolver-ext@1.0.0 => StaticResolver - Miss", "wrap://ens/wraps.eth:file-system-uri-resolver-ext@1.0.0 => ExtendableUriResolver => uri (wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)", + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", + [ + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" + ], + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => WrapperCacheResolver (Cache) => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)" + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" ], "wrap://ens/wraps.eth:file-system-uri-resolver-ext@1.0.0 => ResolverExtension (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)", - "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0)", + "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", [ - "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => WrapperCacheResolver (Cache) => wrapper (wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0)" + "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => uri (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)" + ], + "wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw => RequestSynchronizerResolver => wrapper (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", + [ + "wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw => ResolutionResultCacheResolver (Cache) => wrapper (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)" ], "wrap://ens/wraps.eth:file-system-uri-resolver-ext@1.0.0 => ResolverExtension (wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0) => uri (wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU)" ] @@ -148,7 +172,7 @@ ], "wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU => RequestSynchronizerResolver => wrapper (wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU)", [ - "wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU => WrapperCacheResolver => wrapper (wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU)", + "wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU => ResolutionResultCacheResolver => wrapper (wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU)", [ "wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU => PackageToWrapperResolver => wrapper (wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU)", [ @@ -157,9 +181,13 @@ "wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU => StaticResolver - Miss", "wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU => ExtendableUriResolver => package (wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)", + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", + [ + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" + ], + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => WrapperCacheResolver (Cache) => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)" + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" ], "wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU => ResolverExtension (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0) => package (wrap://ipfs/QmQLEc9G4YnMxLexgkWzQo1jHVhfmdLQWX7zXm4Kh9RPMU)" ] @@ -170,7 +198,7 @@ "wrap://ens/uri.eth => ResolverExtension (wrap://ens/wraps.eth:file-system-uri-resolver-ext@1.0.0)", "wrap://ens/wraps.eth:ens-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP)", [ - "wrap://ens/wraps.eth:ens-uri-resolver-ext@1.0.0 => WrapperCacheResolver => uri (wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP)", + "wrap://ens/wraps.eth:ens-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver => uri (wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP)", [ "wrap://ens/wraps.eth:ens-uri-resolver-ext@1.0.0 => PackageToWrapperResolver => uri (wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP)", [ @@ -179,14 +207,22 @@ "wrap://ens/wraps.eth:ens-uri-resolver-ext@1.0.0 => StaticResolver - Miss", "wrap://ens/wraps.eth:ens-uri-resolver-ext@1.0.0 => ExtendableUriResolver => uri (wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)", + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", + [ + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" + ], + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => WrapperCacheResolver (Cache) => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)" + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" ], "wrap://ens/wraps.eth:ens-uri-resolver-ext@1.0.0 => ResolverExtension (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)", - "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0)", + "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", [ - "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => WrapperCacheResolver (Cache) => wrapper (wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0)" + "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => uri (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)" + ], + "wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw => RequestSynchronizerResolver => wrapper (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", + [ + "wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw => ResolutionResultCacheResolver (Cache) => wrapper (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)" ], "wrap://ens/wraps.eth:ens-uri-resolver-ext@1.0.0 => ResolverExtension (wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0) => uri (wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP)" ] @@ -196,7 +232,7 @@ ], "wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP => RequestSynchronizerResolver => wrapper (wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP)", [ - "wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP => WrapperCacheResolver => wrapper (wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP)", + "wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP => ResolutionResultCacheResolver => wrapper (wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP)", [ "wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP => PackageToWrapperResolver => wrapper (wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP)", [ @@ -205,9 +241,13 @@ "wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP => StaticResolver - Miss", "wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP => ExtendableUriResolver => package (wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)", + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", + [ + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" + ], + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => WrapperCacheResolver (Cache) => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)" + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" ], "wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP => ResolverExtension (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0) => package (wrap://ipfs/QmSFn6uAoGdXRpiPXHWb3ynQGxs8WhubAa8yZXuJBKnMgP)" ] @@ -218,7 +258,7 @@ "wrap://ens/uri.eth => ResolverExtension (wrap://ens/wraps.eth:ens-uri-resolver-ext@1.0.0)", "wrap://ens/wraps.eth:ens-ipfs-contenthash-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p)", [ - "wrap://ens/wraps.eth:ens-ipfs-contenthash-uri-resolver-ext@1.0.0 => WrapperCacheResolver => uri (wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p)", + "wrap://ens/wraps.eth:ens-ipfs-contenthash-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver => uri (wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p)", [ "wrap://ens/wraps.eth:ens-ipfs-contenthash-uri-resolver-ext@1.0.0 => PackageToWrapperResolver => uri (wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p)", [ @@ -227,14 +267,22 @@ "wrap://ens/wraps.eth:ens-ipfs-contenthash-uri-resolver-ext@1.0.0 => StaticResolver - Miss", "wrap://ens/wraps.eth:ens-ipfs-contenthash-uri-resolver-ext@1.0.0 => ExtendableUriResolver => uri (wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)", + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => WrapperCacheResolver (Cache) => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)" + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" + ], + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", + [ + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" ], "wrap://ens/wraps.eth:ens-ipfs-contenthash-uri-resolver-ext@1.0.0 => ResolverExtension (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)", - "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0)", + "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", + [ + "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => uri (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)" + ], + "wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw => RequestSynchronizerResolver => wrapper (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)", [ - "wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0 => WrapperCacheResolver (Cache) => wrapper (wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0)" + "wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw => ResolutionResultCacheResolver (Cache) => wrapper (wrap://ipfs/QmaM318ABUXDhc5eZGGbmDxkb2ZgnbLxigm5TyZcCsh1Kw)" ], "wrap://ens/wraps.eth:ens-ipfs-contenthash-uri-resolver-ext@1.0.0 => ResolverExtension (wrap://ens/wraps.eth:ens-text-record-uri-resolver-ext@1.0.0) => uri (wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p)" ] @@ -244,7 +292,7 @@ ], "wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p => RequestSynchronizerResolver => wrapper (wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p)", [ - "wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p => WrapperCacheResolver => wrapper (wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p)", + "wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p => ResolutionResultCacheResolver => wrapper (wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p)", [ "wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p => PackageToWrapperResolver => wrapper (wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p)", [ @@ -253,9 +301,13 @@ "wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p => StaticResolver - Miss", "wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p => ExtendableUriResolver => package (wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)", + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", + [ + "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => uri (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" + ], + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => RequestSynchronizerResolver => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)", [ - "wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0 => WrapperCacheResolver (Cache) => wrapper (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0)" + "wrap://embed/async-ipfs-uri-resolver-ext@1.0.0 => ResolutionResultCacheResolver (Cache) => wrapper (wrap://embed/async-ipfs-uri-resolver-ext@1.0.0)" ], "wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p => ResolverExtension (wrap://ens/wraps.eth:async-ipfs-uri-resolver-ext@1.0.0) => package (wrap://ipfs/QmQW5rw8W9zreuhZwNEAsX7F3dC5ireiHaNxPFuEk6tu9p)" ] diff --git a/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/error-with-cache.json b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/error-with-cache.json new file mode 100644 index 0000000000..ec603e0800 --- /dev/null +++ b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/error-with-cache.json @@ -0,0 +1,3 @@ +[ + "wrap://test/error => ResolutionResultCacheResolver (Cache) => error (A test error)" +] diff --git a/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/error-without-cache.json b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/error-without-cache.json new file mode 100644 index 0000000000..2706a26a91 --- /dev/null +++ b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/error-without-cache.json @@ -0,0 +1,4 @@ +[ + "wrap://test/error => ResolutionResultCacheResolver => error (A test error)", + ["wrap://test/error => TestResolver => error (A test error)"] +] diff --git a/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/package-with-cache.json b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/package-with-cache.json new file mode 100644 index 0000000000..5a40f65c50 --- /dev/null +++ b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/package-with-cache.json @@ -0,0 +1,3 @@ +[ + "wrap://test/package => ResolutionResultCacheResolver (Cache) => package (wrap://test/package)" +] diff --git a/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/package-without-cache.json b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/package-without-cache.json new file mode 100644 index 0000000000..0769d25f08 --- /dev/null +++ b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/package-without-cache.json @@ -0,0 +1,6 @@ +[ + "wrap://test/package => ResolutionResultCacheResolver => package (wrap://test/package)", + [ + "wrap://test/package => TestResolver => package (wrap://test/package)" + ] +] \ No newline at end of file diff --git a/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/uri-with-cache.json b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/uri-with-cache.json new file mode 100644 index 0000000000..daa3562605 --- /dev/null +++ b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/uri-with-cache.json @@ -0,0 +1 @@ +["wrap://test/from => ResolutionResultCacheResolver (Cache) => uri (wrap://test/to)"] diff --git a/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/uri-without-cache.json b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/uri-without-cache.json new file mode 100644 index 0000000000..b1017e1c5a --- /dev/null +++ b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/uri-without-cache.json @@ -0,0 +1,6 @@ +[ + "wrap://test/from => ResolutionResultCacheResolver => uri (wrap://test/to)", + [ + "wrap://test/from => TestResolver => uri (wrap://test/to)" + ] +] \ No newline at end of file diff --git a/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/wrapper-with-cache.json b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/wrapper-with-cache.json new file mode 100644 index 0000000000..fb197949f2 --- /dev/null +++ b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/wrapper-with-cache.json @@ -0,0 +1,3 @@ +[ + "wrap://test/wrapper => ResolutionResultCacheResolver (Cache) => wrapper (wrap://test/wrapper)" +] diff --git a/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/wrapper-without-cache.json b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/wrapper-without-cache.json new file mode 100644 index 0000000000..d4453b8ced --- /dev/null +++ b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/histories/wrapper-without-cache.json @@ -0,0 +1,4 @@ +[ + "wrap://test/wrapper => ResolutionResultCacheResolver => wrapper (wrap://test/wrapper)", + ["wrap://test/wrapper => TestResolver => wrapper (wrap://test/wrapper)"] +] diff --git a/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/resolution-result-cache-resolver.spec.ts b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/resolution-result-cache-resolver.spec.ts new file mode 100644 index 0000000000..a37a4c393a --- /dev/null +++ b/packages/js/uri-resolvers/src/__tests__/resolution-result-cache-resolver/resolution-result-cache-resolver.spec.ts @@ -0,0 +1,350 @@ +import { + CoreClient, + IUriResolutionContext, + IUriResolver, + Result, + Uri, + UriPackageOrWrapper, + UriResolutionContext, +} from "@polywrap/core-js"; +import { expectHistory } from "../helpers/expectHistory"; +import { RecursiveResolver, UriResolutionResult } from "../../helpers"; +import { PolywrapCoreClient } from "@polywrap/core-client-js"; +import { PluginPackage } from "@polywrap/plugin-js"; +import { ResolutionResultCacheResolver } from "../../cache/ResolutionResultCacheResolver"; +import { ResolutionResultCache } from "../../cache/ResolutionResultCache"; + +jest.setTimeout(20000); + +class TestResolver implements IUriResolver { + async tryResolveUri( + uri: Uri, + client: CoreClient, + resolutionContext: IUriResolutionContext + ): Promise> { + let result: Result; + + switch (uri.uri) { + case "wrap://test/package": + result = UriResolutionResult.ok( + Uri.from("test/package"), + PluginPackage.from(() => ({})) + ); + break; + case "wrap://test/wrapper": + let wrapperResult = await PluginPackage.from( + () => ({}) + ).createWrapper(); + if (!wrapperResult.ok) { + throw wrapperResult.error; + } + + result = UriResolutionResult.ok( + Uri.from("test/wrapper"), + wrapperResult.value + ); + break; + case "wrap://test/from": + result = UriResolutionResult.ok(Uri.from("test/to")); + break; + case "wrap://test/A": + result = UriResolutionResult.ok(Uri.from("test/B")); + break; + case "wrap://test/B": + result = UriResolutionResult.ok(Uri.from("test/wrapper")); + break; + case "wrap://test/error": + result = UriResolutionResult.err(new Error("A test error")); + break; + default: + throw new Error(`Unexpected URI: ${uri.uri}`); + } + + resolutionContext.trackStep({ + sourceUri: uri, + result, + description: "TestResolver", + }); + + return result; + } +} + +describe("ResolutionResultCacheResolver", () => { + it("caches a resolved wrapper", async () => { + const uri = new Uri("test/wrapper"); + + const client = new PolywrapCoreClient({ + resolver: ResolutionResultCacheResolver.from( + new TestResolver(), + new ResolutionResultCache() + ), + }); + + let resolutionContext = new UriResolutionContext(); + let result = await client.tryResolveUri({ uri, resolutionContext }); + + await expectHistory( + resolutionContext.getHistory(), + "resolution-result-cache-resolver", + "wrapper-without-cache" + ); + + if (!result.ok) { + fail(result.error); + } + + if (result.value.type !== "wrapper") { + fail("Expected a wrapper, received: " + result.value.type); + } + + expect(result.value.uri.uri).toEqual("wrap://test/wrapper"); + + resolutionContext = new UriResolutionContext(); + result = await client.tryResolveUri({ uri, resolutionContext }); + + await expectHistory( + resolutionContext.getHistory(), + "resolution-result-cache-resolver", + "wrapper-with-cache" + ); + + if (!result.ok) { + fail(result.error); + } + + if (result.value.type !== "wrapper") { + fail("Expected a wrapper, received: " + result.value.type); + } + + expect(result.value.uri.uri).toEqual("wrap://test/wrapper"); + }); + + it("caches a resolved URI", async () => { + const uri = new Uri("test/from"); + + const client = new PolywrapCoreClient({ + resolver: ResolutionResultCacheResolver.from( + new TestResolver(), + new ResolutionResultCache() + ), + }); + + let resolutionContext = new UriResolutionContext(); + let result = await client.tryResolveUri({ uri, resolutionContext }); + + await expectHistory( + resolutionContext.getHistory(), + "resolution-result-cache-resolver", + "uri-without-cache" + ); + + if (!result.ok) { + fail(result.error); + } + + if (result.value.type !== "uri") { + fail("Expected a uri, received: " + result.value.type); + } + + expect(result.value.uri.uri).toEqual("wrap://test/to"); + + resolutionContext = new UriResolutionContext(); + result = await client.tryResolveUri({ uri, resolutionContext }); + + await expectHistory( + resolutionContext.getHistory(), + "resolution-result-cache-resolver", + "uri-with-cache" + ); + + if (!result.ok) { + fail(result.error); + } + + if (result.value.type !== "uri") { + fail("Expected a uri, received: " + result.value.type); + } + + expect(result.value.uri.uri).toEqual("wrap://test/to"); + }); + + it("caches a resolved package", async () => { + const uri = new Uri("test/package"); + + const client = new PolywrapCoreClient({ + resolver: ResolutionResultCacheResolver.from( + new TestResolver(), + new ResolutionResultCache() + ), + }); + + let resolutionContext = new UriResolutionContext(); + let result = await client.tryResolveUri({ uri, resolutionContext }); + + await expectHistory( + resolutionContext.getHistory(), + "resolution-result-cache-resolver", + "package-without-cache" + ); + + if (!result.ok) { + fail(result.error); + } + + if (result.value.type !== "package") { + fail("Expected a package, received: " + result.value.type); + } + + expect(result.value.uri.uri).toEqual("wrap://test/package"); + + resolutionContext = new UriResolutionContext(); + result = await client.tryResolveUri({ uri, resolutionContext }); + + await expectHistory( + resolutionContext.getHistory(), + "resolution-result-cache-resolver", + "package-with-cache" + ); + + if (!result.ok) { + fail(result.error); + } + + if (result.value.type !== "package") { + fail("Expected a package, received: " + result.value.type); + } + + expect(result.value.uri.uri).toEqual("wrap://test/package"); + }); + + it("does not cache error by default", async () => { + const client = new PolywrapCoreClient({ + resolver: ResolutionResultCacheResolver.from( + new TestResolver(), + new ResolutionResultCache() + ), + }); + + let resolutionContext = new UriResolutionContext(); + let result = await client.tryResolveUri({ + uri: Uri.from("test/error"), + resolutionContext, + }); + + await expectHistory( + resolutionContext.getHistory(), + "resolution-result-cache-resolver", + "error-without-cache" + ); + + if (result.ok) { + fail("Expected an error, received: " + result.value.type); + } + expect((result.error as Error)?.message).toEqual("A test error"); + + resolutionContext = new UriResolutionContext(); + result = await client.tryResolveUri({ + uri: Uri.from("test/error"), + resolutionContext, + }); + + await expectHistory( + resolutionContext.getHistory(), + "resolution-result-cache-resolver", + "error-without-cache" + ); + + if (result.ok) { + fail("Expected an error, received: " + result.value.type); + } + expect((result.error as Error)?.message).toEqual("A test error"); + }); + + it("caches error if configured", async () => { + const client = new PolywrapCoreClient({ + resolver: ResolutionResultCacheResolver.from( + new TestResolver(), + new ResolutionResultCache(), + { + cacheErrors: true, + } + ), + }); + + let resolutionContext = new UriResolutionContext(); + let result = await client.tryResolveUri({ + uri: Uri.from("test/error"), + resolutionContext, + }); + + await expectHistory( + resolutionContext.getHistory(), + "resolution-result-cache-resolver", + "error-without-cache" + ); + + if (result.ok) { + fail("Expected an error, received: " + result.value.type); + } + expect((result.error as Error)?.message).toEqual("A test error"); + + resolutionContext = new UriResolutionContext(); + result = await client.tryResolveUri({ + uri: Uri.from("test/error"), + resolutionContext, + }); + + await expectHistory( + resolutionContext.getHistory(), + "resolution-result-cache-resolver", + "error-with-cache" + ); + + if (result.ok) { + fail("Expected an error, received: " + result.value.type); + } + expect((result.error as Error)?.message).toEqual("A test error"); + }); + + it("keeps the same resolution path after caching", async () => { + const uri = new Uri("test/A"); + + const client = new PolywrapCoreClient({ + resolver: RecursiveResolver.from([ + ResolutionResultCacheResolver.from( + [ + { + from: Uri.from("test/A"), + to: Uri.from("test/B"), + }, + { + from: Uri.from("test/B"), + to: Uri.from("test/wrapper"), + }, + new TestResolver(), + ], + new ResolutionResultCache() + ), + ]), + }); + + let resolutionContext = new UriResolutionContext(); + await client.tryResolveUri({ uri, resolutionContext }); + + expect(resolutionContext.getResolutionPath().map((x) => x.uri)).toEqual([ + "wrap://test/A", + "wrap://test/B", + "wrap://test/wrapper", + ]); + + resolutionContext = new UriResolutionContext(); + await client.tryResolveUri({ uri, resolutionContext }); + + expect(resolutionContext.getResolutionPath().map((x) => x.uri)).toEqual([ + "wrap://test/A", + "wrap://test/B", + "wrap://test/wrapper", + ]); + }); +}); diff --git a/packages/js/uri-resolvers/src/__tests__/wrapper-cache-resolver/wrapper-cache-resolver.spec.ts b/packages/js/uri-resolvers/src/__tests__/wrapper-cache-resolver/wrapper-cache-resolver.spec.ts index a11563831a..91912d122e 100644 --- a/packages/js/uri-resolvers/src/__tests__/wrapper-cache-resolver/wrapper-cache-resolver.spec.ts +++ b/packages/js/uri-resolvers/src/__tests__/wrapper-cache-resolver/wrapper-cache-resolver.spec.ts @@ -31,7 +31,9 @@ class TestResolver implements IUriResolver { ); break; case "wrap://test/wrapper": - let wrapperResult = await PluginPackage.from(() => ({})).createWrapper(); + let wrapperResult = await PluginPackage.from( + () => ({}) + ).createWrapper(); if (!wrapperResult.ok) { throw wrapperResult.error; } @@ -42,19 +44,13 @@ class TestResolver implements IUriResolver { ); break; case "wrap://test/from": - result = UriResolutionResult.ok( - Uri.from("test/to"), - ); + result = UriResolutionResult.ok(Uri.from("test/to")); break; case "wrap://test/A": - result = UriResolutionResult.ok( - Uri.from("test/B"), - ); + result = UriResolutionResult.ok(Uri.from("test/B")); break; case "wrap://test/B": - result = UriResolutionResult.ok( - Uri.from("test/wrapper"), - ); + result = UriResolutionResult.ok(Uri.from("test/wrapper")); break; default: throw new Error(`Unexpected URI: ${uri.uri}`); @@ -76,10 +72,7 @@ describe("WrapperCacheResolver", () => { const cache = new WrapperCache(); const client = new PolywrapCoreClient({ - resolver: WrapperCacheResolver.from( - new TestResolver(), - cache - ), + resolver: WrapperCacheResolver.from(new TestResolver(), cache), }); let resolutionContext = new UriResolutionContext(); @@ -88,7 +81,7 @@ describe("WrapperCacheResolver", () => { await expectHistory( resolutionContext.getHistory(), "wrapper-cache-resolver", - "wrapper-without-cache", + "wrapper-without-cache" ); if (!result.ok) { @@ -107,7 +100,7 @@ describe("WrapperCacheResolver", () => { await expectHistory( resolutionContext.getHistory(), "wrapper-cache-resolver", - "wrapper-with-cache", + "wrapper-with-cache" ); if (!result.ok) { @@ -137,7 +130,7 @@ describe("WrapperCacheResolver", () => { await expectHistory( resolutionContext.getHistory(), "wrapper-cache-resolver", - "uri-without-cache", + "uri-without-cache" ); if (!result.ok) { @@ -156,7 +149,7 @@ describe("WrapperCacheResolver", () => { await expectHistory( resolutionContext.getHistory(), "wrapper-cache-resolver", - "uri-without-cache", + "uri-without-cache" ); if (!result.ok) { @@ -186,7 +179,7 @@ describe("WrapperCacheResolver", () => { await expectHistory( resolutionContext.getHistory(), "wrapper-cache-resolver", - "package-without-cache", + "package-without-cache" ); if (!result.ok) { @@ -205,7 +198,7 @@ describe("WrapperCacheResolver", () => { await expectHistory( resolutionContext.getHistory(), "wrapper-cache-resolver", - "package-without-cache", + "package-without-cache" ); if (!result.ok) { @@ -223,20 +216,20 @@ describe("WrapperCacheResolver", () => { const cache = new WrapperCache(); const client = new PolywrapCoreClient({ resolver: RecursiveResolver.from( - WrapperCacheResolver.from( - new TestResolver(), - cache - ) + WrapperCacheResolver.from(new TestResolver(), cache) ), }); let resolutionContext = new UriResolutionContext(); - let result = await client.tryResolveUri({ uri: Uri.from("test/A"), resolutionContext }); + let result = await client.tryResolveUri({ + uri: Uri.from("test/A"), + resolutionContext, + }); await expectHistory( resolutionContext.getHistory(), "wrapper-cache-resolver", - "resolution-path-without-cache", + "resolution-path-without-cache" ); if (!result.ok) { @@ -250,12 +243,15 @@ describe("WrapperCacheResolver", () => { expect(result.value.uri.uri).toEqual("wrap://test/wrapper"); resolutionContext = new UriResolutionContext(); - result = await client.tryResolveUri({ uri: Uri.from("test/A"), resolutionContext }); + result = await client.tryResolveUri({ + uri: Uri.from("test/A"), + resolutionContext, + }); await expectHistory( resolutionContext.getHistory(), "wrapper-cache-resolver", - "resolution-path-A-with-cache", + "resolution-path-A-with-cache" ); if (!result.ok) { @@ -269,12 +265,15 @@ describe("WrapperCacheResolver", () => { expect(result.value.uri.uri).toEqual("wrap://test/A"); resolutionContext = new UriResolutionContext(); - result = await client.tryResolveUri({ uri: Uri.from("test/B"), resolutionContext }); + result = await client.tryResolveUri({ + uri: Uri.from("test/B"), + resolutionContext, + }); await expectHistory( resolutionContext.getHistory(), "wrapper-cache-resolver", - "resolution-path-B-with-cache", + "resolution-path-B-with-cache" ); if (!result.ok) { @@ -288,12 +287,15 @@ describe("WrapperCacheResolver", () => { expect(result.value.uri.uri).toEqual("wrap://test/B"); resolutionContext = new UriResolutionContext(); - result = await client.tryResolveUri({ uri: Uri.from("test/wrapper"), resolutionContext }); + result = await client.tryResolveUri({ + uri: Uri.from("test/wrapper"), + resolutionContext, + }); await expectHistory( resolutionContext.getHistory(), "wrapper-cache-resolver", - "resolution-path-wrapper-with-cache", + "resolution-path-wrapper-with-cache" ); if (!result.ok) { diff --git a/packages/js/uri-resolvers/src/cache/IResolutionResultCache.ts b/packages/js/uri-resolvers/src/cache/IResolutionResultCache.ts new file mode 100644 index 0000000000..9f532dfdc0 --- /dev/null +++ b/packages/js/uri-resolvers/src/cache/IResolutionResultCache.ts @@ -0,0 +1,17 @@ +import { + MaybeAsync, + Result, + Uri, + UriPackageOrWrapper, +} from "@polywrap/core-js"; + +// $start: IResolutionResultCache +/** A ResolutionResultCache cache */ +export interface IResolutionResultCache { + /** get a Result from the cache, given its URI index */ + get(uri: Uri): MaybeAsync | undefined>; + + /** add a Result to the cache, indexed by a URI */ + set(uri: Uri, result: Result): MaybeAsync; +} +// $end diff --git a/packages/js/uri-resolvers/src/cache/ResolutionResultCache.ts b/packages/js/uri-resolvers/src/cache/ResolutionResultCache.ts new file mode 100644 index 0000000000..e0d43f0b30 --- /dev/null +++ b/packages/js/uri-resolvers/src/cache/ResolutionResultCache.ts @@ -0,0 +1,24 @@ +import { IResolutionResultCache } from "./IResolutionResultCache"; + +import { Uri, Result, UriPackageOrWrapper } from "@polywrap/core-js"; + +// $start: ResolutionResultCache +/** + * A minimal implementation of IResolutionResultCache + * */ +export class ResolutionResultCache + implements IResolutionResultCache /* $ */ { + private _map: Map> = new Map(); + + // $start: ResolutionResultCache-get + /** get a Result from the cache, given its URI index */ + get(uri: Uri): Result | undefined /* $ */ { + return this._map.get(uri.uri); + } + + // $start: ResolutionResultCache-set + /** add a Result to the cache, indexed by a URI */ + set(uris: Uri, result: Result): void /* $ */ { + this._map.set(uris.uri, result); + } +} diff --git a/packages/js/uri-resolvers/src/cache/ResolutionResultCacheResolver.ts b/packages/js/uri-resolvers/src/cache/ResolutionResultCacheResolver.ts new file mode 100644 index 0000000000..077242ed90 --- /dev/null +++ b/packages/js/uri-resolvers/src/cache/ResolutionResultCacheResolver.ts @@ -0,0 +1,106 @@ +import { IResolutionResultCache } from "./IResolutionResultCache"; +import { UriResolver, UriResolverLike } from "../helpers"; + +import { + IUriResolver, + Uri, + CoreClient, + IUriResolutionContext, + UriPackageOrWrapper, +} from "@polywrap/core-js"; +import { Result } from "@polywrap/result"; + +// $start: ResolutionResultCacheResolver +/** + * An IUriResolver implementation that caches the URI resolution result. + * The URI resolution result can be a URI, IWrapPackage, Wrapper or Error. + * Errors are not cached by default and can be cached by setting the cacheErrors option to true. + * The ResolutionResultCacheResolver wraps an IUriResolver implementation and delegates resolution to it. + * */ +export class ResolutionResultCacheResolver + implements IUriResolver /* $ */ { + // $start: ResolutionResultCacheResolver-constructor + /** + * Creates a ResolutionResultCacheResolver + * + * @param _innerResolver - a resolver to delegate resolution to + * @param _cache - a resolution result cache + * @param options - cacheErrors (default: false) + * */ + constructor( + private _innerResolver: IUriResolver, + private _cache: IResolutionResultCache, + private _options: { cacheErrors: boolean } = { cacheErrors: false } + ) /* $ */ {} + + // $start: ResolutionResultCacheResolver-from + /** + * Creates a ResolutionResultCacheResolver from a resolver-like object + * + * @param innerResolver - a resolver-like item to delegate resolution to + * @param cache - a resolution result cache + * @param options - cacheErrors (default: false) + * + * @returns a ResolutionResultCacheResolver + * */ + static from( + innerResolver: UriResolverLike, + cache: IResolutionResultCache, + options: { cacheErrors: boolean } = { cacheErrors: false } + ): ResolutionResultCacheResolver /* $ */ { + return new ResolutionResultCacheResolver( + UriResolver.from(innerResolver), + cache, + options + ); + } + + // $start: ResolutionResultCacheResolver-tryResolveUri + /** + * Resolve a URI to a wrap package, a wrapper, or a URI. + * If successful, cache the result. + * + * @param uri - the URI to resolve + * @param client - a CoreClient instance that may be used to invoke a wrapper that implements the UriResolver interface + * @param resolutionContext - the current URI resolution context + * @returns A Promise with a Result containing either a wrap package, a wrapper, or a URI if successful + */ + async tryResolveUri( + uri: Uri, + client: CoreClient, + resolutionContext: IUriResolutionContext + ): Promise> /* $ */ { + const cachedResult = await this._cache.get(uri); + + // Return from cache if available + if (cachedResult) { + resolutionContext.trackStep({ + sourceUri: uri, + result: cachedResult, + description: "ResolutionResultCacheResolver (Cache)", + }); + return cachedResult; + } + + // Resolve URI if not in cache + const subContext = resolutionContext.createSubHistoryContext(); + + const result = await this._innerResolver.tryResolveUri( + uri, + client, + subContext + ); + + if (result.ok || this._options.cacheErrors) { + await this._cache.set(uri, result); + } + + resolutionContext.trackStep({ + sourceUri: uri, + result, + subHistory: subContext.getHistory(), + description: "ResolutionResultCacheResolver", + }); + return result; + } +} diff --git a/packages/js/uri-resolvers/src/cache/index.ts b/packages/js/uri-resolvers/src/cache/index.ts index 740b1e0062..11f00c5a64 100644 --- a/packages/js/uri-resolvers/src/cache/index.ts +++ b/packages/js/uri-resolvers/src/cache/index.ts @@ -2,3 +2,6 @@ export * from "./WrapperCacheResolver"; export * from "./RequestSynchronizerResolver"; export * from "./IWrapperCache"; export * from "./WrapperCache"; +export * from "./ResolutionResultCacheResolver"; +export * from "./IResolutionResultCache"; +export * from "./ResolutionResultCache";