diff --git a/docs/embedded.loader._constructor_.md b/docs/embedded.loader._constructor_.md index 978d0bb3..ddb998f2 100644 --- a/docs/embedded.loader._constructor_.md +++ b/docs/embedded.loader._constructor_.md @@ -88,3 +88,13 @@ import { readFile } from "fs/promises"; const loader = new Loader(readFile("policies.wasm")); ``` +## Example 3 + +Load an embedded PDP bundle from a precompiled WebAssembly module (requires a bundler): + +```typescript +import bundle from "bundle.wasm"; + +const loader = new Loader(bundle); +``` + diff --git a/docs/embedded.source.md b/docs/embedded.source.md index be32aa94..4fea3b4f 100644 --- a/docs/embedded.source.md +++ b/docs/embedded.source.md @@ -9,5 +9,5 @@ WebAssembly binary code of an embedded policy decision point bundle, or a URL or **Signature:** ```typescript -export type Source = string | URL | ArrayBufferView | ArrayBuffer | Response | Promise; +export type Source = string | URL | ArrayBufferView | ArrayBuffer | Response | WebAssembly.Module | Promise; ``` diff --git a/packages/embedded/CHANGELOG.md b/packages/embedded/CHANGELOG.md index f44f7487..bad58a4b 100644 --- a/packages/embedded/CHANGELOG.md +++ b/packages/embedded/CHANGELOG.md @@ -2,7 +2,9 @@ ## [Unreleased] -No notable changes. +### Added + +- Support for loading a precompiled `WebAssembly.Module` ([#1016](https://github.com/cerbos/cerbos-sdk-javascript/pull/1016)) ## [0.7.3] - 2024-06-11 diff --git a/packages/embedded/changelog.yaml b/packages/embedded/changelog.yaml index 27e4d8fe..501a42b6 100644 --- a/packages/embedded/changelog.yaml +++ b/packages/embedded/changelog.yaml @@ -1,3 +1,10 @@ +unreleased: + type: minor + + added: + - summary: Support for loading a precompiled `WebAssembly.Module` + pull: 1016 + releases: - version: 0.7.3 date: 2024-06-11 diff --git a/packages/embedded/src/bundle.ts b/packages/embedded/src/bundle.ts index 886cbddc..539d64bd 100644 --- a/packages/embedded/src/bundle.ts +++ b/packages/embedded/src/bundle.ts @@ -156,7 +156,7 @@ export async function download( } async function instantiate( - source: ArrayBufferView | ArrayBuffer | Response, + source: ArrayBufferView | ArrayBuffer | Response | WebAssembly.Module, imports: WebAssembly.Imports, ): Promise { if (source instanceof Response) { @@ -182,8 +182,11 @@ async function instantiateStreaming( ); } -function instantiated({ - instance: { exports }, -}: WebAssembly.WebAssemblyInstantiatedSource): Exports { +function instantiated( + result: WebAssembly.Instance | WebAssembly.WebAssemblyInstantiatedSource, +): Exports { + const { exports } = + result instanceof WebAssembly.Instance ? result : result.instance; + return exports as Exports; } diff --git a/packages/embedded/src/loader.ts b/packages/embedded/src/loader.ts index cee92ab4..42f8be92 100644 --- a/packages/embedded/src/loader.ts +++ b/packages/embedded/src/loader.ts @@ -61,7 +61,8 @@ export type Source = | ArrayBufferView | ArrayBuffer | Response - | Promise; + | WebAssembly.Module + | Promise; /** * Options for creating a new {@link Embedded} client or {@link Loader}. @@ -232,6 +233,15 @@ export class Loader { * * const loader = new Loader(readFile("policies.wasm")); * ``` + * + * @example + * Load an embedded PDP bundle from a precompiled WebAssembly module (requires a bundler): + * + * ```typescript + * import bundle from "bundle.wasm"; + * + * const loader = new Loader(bundle); + * ``` */ public constructor( source: Source, diff --git a/private/test/src/matrix-node/embedded/loader.test.ts b/private/test/src/matrix-node/embedded/loader.test.ts index bef13a82..e3a0e3ef 100644 --- a/private/test/src/matrix-node/embedded/loader.test.ts +++ b/private/test/src/matrix-node/embedded/loader.test.ts @@ -89,6 +89,16 @@ describe("loaders", () => { "Promise", async (): Promise => await fetch(server.url), ], + [ + "WebAssembly.Module", + (): WebAssembly.Module => + new WebAssembly.Module(readFileSync(bundleFilePath(first))), + ], + [ + "Promise", + async (): Promise => + await WebAssembly.compile(await readFile(bundleFilePath(first))), + ], ])("%s", async (_, source) => { const callbacks = new Callbacks(); const loader = new Loader(source(), callbacks);