Skip to content

Commit

Permalink
feat: Allow embedded PDPs to be loaded from precompiled `WebAssembly.…
Browse files Browse the repository at this point in the history
…Module`s

Signed-off-by: Andrew Haines <[email protected]>
  • Loading branch information
haines committed Sep 23, 2024
1 parent 213244a commit c28da17
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 7 deletions.
10 changes: 10 additions & 0 deletions docs/embedded.loader._constructor_.md
Original file line number Diff line number Diff line change
Expand Up @@ -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);
```

2 changes: 1 addition & 1 deletion docs/embedded.source.md
Original file line number Diff line number Diff line change
Expand Up @@ -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<ArrayBufferView | ArrayBuffer | Response>;
export type Source = string | URL | ArrayBufferView | ArrayBuffer | Response | WebAssembly.Module | Promise<ArrayBufferView | ArrayBuffer | Response | WebAssembly.Module>;
```
4 changes: 3 additions & 1 deletion packages/embedded/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
7 changes: 7 additions & 0 deletions packages/embedded/changelog.yaml
Original file line number Diff line number Diff line change
@@ -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
Expand Down
11 changes: 7 additions & 4 deletions packages/embedded/src/bundle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<Exports> {
if (source instanceof Response) {
Expand All @@ -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;
}
12 changes: 11 additions & 1 deletion packages/embedded/src/loader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ export type Source =
| ArrayBufferView
| ArrayBuffer
| Response
| Promise<ArrayBufferView | ArrayBuffer | Response>;
| WebAssembly.Module
| Promise<ArrayBufferView | ArrayBuffer | Response | WebAssembly.Module>;

/**
* Options for creating a new {@link Embedded} client or {@link Loader}.
Expand Down Expand Up @@ -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,
Expand Down
10 changes: 10 additions & 0 deletions private/test/src/matrix-node/embedded/loader.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,16 @@ describe("loaders", () => {
"Promise<Response>",
async (): Promise<Response> => await fetch(server.url),
],
[
"WebAssembly.Module",
(): WebAssembly.Module =>
new WebAssembly.Module(readFileSync(bundleFilePath(first))),
],
[
"Promise<WebAssembly.Module>",
async (): Promise<WebAssembly.Module> =>
await WebAssembly.compile(await readFile(bundleFilePath(first))),
],
])("%s", async (_, source) => {
const callbacks = new Callbacks();
const loader = new Loader(source(), callbacks);
Expand Down

0 comments on commit c28da17

Please sign in to comment.