Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: update to use extism:host/env and extism:host/user namespaces #20

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions src/browser/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@ import {
ManifestWasmUrl,
HttpRequest,
HttpResponse,
embeddedRuntime,
embeddedRuntimeHash,
CurrentPlugin,
StreamingSource,
isURL,
} from '../plugin';

import {
embeddedRuntime,
embeddedRuntimeHash,
} from '../runtime';
import { WASI, Fd, File, OpenFile } from '@bjorn3/browser_wasi_shim';
import { minimatch } from 'minimatch';

Expand Down
6 changes: 4 additions & 2 deletions src/deno/mod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@ import {
ManifestWasmUrl,
HttpRequest,
HttpResponse,
embeddedRuntime,
embeddedRuntimeHash,
CurrentPlugin,
StreamingSource,
isURL,
} from '../plugin.ts';
import {
embeddedRuntime,
embeddedRuntimeHash,
} from '../runtime.ts';
import Context from 'https://deno.land/std@0.200.0/wasi/snapshot_preview1.ts';
import minimatch from 'https://deno.land/x/minimatch@v3.0.4/index.js';
import { createHash } from 'https://deno.land/std@0.108.0/hash/mod.ts';
Expand Down
6 changes: 4 additions & 2 deletions src/node/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@ import {
ManifestWasmUrl,
HttpRequest,
HttpResponse,
embeddedRuntime,
embeddedRuntimeHash,
CurrentPlugin,
StreamingSource,
isURL,
} from '../plugin';
import {
embeddedRuntime,
embeddedRuntimeHash,
} from '../runtime';
import { WASI } from 'wasi';
import { readFile } from 'fs';
import { promisify } from 'util';
Expand Down
91 changes: 43 additions & 48 deletions src/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,9 @@ export abstract class ExtismPluginBase {

let imports: any = {
wasi_snapshot_preview1: pluginWasi?.importObject(),
env: environment,
"extism:host/env": environment,
"extism:host/user": {},
"env": {}
};

for (const m in this.options.functions) {
Expand All @@ -117,14 +119,13 @@ export abstract class ExtismPluginBase {
imports[m][f] = imports[m][f].bind(null, this.currentPlugin);
}
}

if (this.moduleData instanceof ArrayBuffer || ArrayBuffer.isView(this.moduleData)) {
this.module = await WebAssembly.instantiate(this.moduleData, imports);
} else {
this.module = await WebAssembly.instantiateStreaming(this.moduleData, imports);
}

if (this.module.instance.exports._start) {
if (this.options.useWasi) {
pluginWasi?.initialize(this.module.instance);
}

Expand All @@ -136,46 +137,46 @@ export abstract class ExtismPluginBase {
private makeEnv(): any {
let plugin = this;
var env: any = {
extism_alloc(cp: CurrentPlugin, n: bigint): bigint {
alloc(cp: CurrentPlugin, n: bigint): bigint {
const response = cp.alloc(n);
return response;
},
extism_free(cp: CurrentPlugin, n: bigint) {
free(cp: CurrentPlugin, n: bigint) {
cp.free(n);
},
extism_load_u8(cp: CurrentPlugin, n: bigint): number {
load_u8(cp: CurrentPlugin, n: bigint): number {
return cp.getMemoryBuffer()[Number(n)];
},
extism_load_u64(cp: CurrentPlugin, n: bigint): bigint {
load_u64(cp: CurrentPlugin, n: bigint): bigint {
let cast = new DataView(cp.getMemory().buffer, Number(n));
return cast.getBigUint64(0, true);
},
extism_store_u8(cp: CurrentPlugin, offset: bigint, n: number) {
store_u8(cp: CurrentPlugin, offset: bigint, n: number) {
cp.getMemoryBuffer()[Number(offset)] = Number(n);
},
extism_store_u64(cp: CurrentPlugin, offset: bigint, n: bigint) {
store_u64(cp: CurrentPlugin, offset: bigint, n: bigint) {
const tmp = new DataView(cp.getMemory().buffer, Number(offset));
tmp.setBigUint64(0, n, true);
},
extism_input_length(): bigint {
input_length(): bigint {
return BigInt(plugin.input.length);
},
extism_input_load_u8(cp: CurrentPlugin, i: bigint): number {
input_load_u8(cp: CurrentPlugin, i: bigint): number {
return plugin.input[Number(i)];
},
extism_input_load_u64(cp: CurrentPlugin, idx: bigint): bigint {
input_load_u64(cp: CurrentPlugin, idx: bigint): bigint {
let cast = new DataView(plugin.input.buffer, Number(idx));
return cast.getBigUint64(0, true);
},
extism_output_set(cp: CurrentPlugin, offset: bigint, length: bigint) {
output_set(cp: CurrentPlugin, offset: bigint, length: bigint) {
const offs = Number(offset);
const len = Number(length);
plugin.output = cp.getMemoryBuffer().slice(offs, offs + len);
},
extism_error_set(cp: CurrentPlugin, i: bigint) {
error_set(cp: CurrentPlugin, i: bigint) {
throw new Error(`Call error: ${cp.readString(i)}`);
},
extism_config_get(cp: CurrentPlugin, i: bigint): bigint {
config_get(cp: CurrentPlugin, i: bigint): bigint {
if (typeof plugin.options.config === 'undefined') {
return BigInt(0);
}
Expand All @@ -189,7 +190,7 @@ export abstract class ExtismPluginBase {
}
return cp.writeString(value);
},
extism_var_get(cp: CurrentPlugin, i: bigint): bigint {
var_get(cp: CurrentPlugin, i: bigint): bigint {
const key = cp.readString(i);
if (key === null) {
return BigInt(0);
Expand All @@ -200,7 +201,7 @@ export abstract class ExtismPluginBase {
}
return cp.writeBytes(value);
},
extism_var_set(cp: CurrentPlugin, n: bigint, i: bigint) {
var_set(cp: CurrentPlugin, n: bigint, i: bigint) {
const key = cp.readString(n);
if (key === null) {
return;
Expand All @@ -211,7 +212,7 @@ export abstract class ExtismPluginBase {
}
cp.vars[key] = value;
},
extism_http_request(cp: CurrentPlugin, requestOffset: bigint, bodyOffset: bigint): bigint {
http_request(cp: CurrentPlugin, requestOffset: bigint, bodyOffset: bigint): bigint {
if (!plugin.supportsHttpRequests()) {
cp.free(bodyOffset);
cp.free(requestOffset);
Expand Down Expand Up @@ -258,25 +259,25 @@ export abstract class ExtismPluginBase {

return offset;
},
extism_http_status_code(): number {
http_status_code(): number {
return plugin.lastStatusCode;
},
extism_length(cp: CurrentPlugin, i: bigint): bigint {
length(cp: CurrentPlugin, i: bigint): bigint {
return cp.getLength(i);
},
extism_log_warn(cp: CurrentPlugin, i: bigint) {
log_warn(cp: CurrentPlugin, i: bigint) {
const s = cp.readString(i);
console.warn(s);
},
extism_log_info(cp: CurrentPlugin, i: bigint) {
log_info(cp: CurrentPlugin, i: bigint) {
const s = cp.readString(i);
console.log(s);
},
extism_log_debug(cp: CurrentPlugin, i: bigint) {
log_debug(cp: CurrentPlugin, i: bigint) {
const s = cp.readString(i);
console.debug(s);
},
extism_log_error(cp: CurrentPlugin, i: bigint) {
log_error(cp: CurrentPlugin, i: bigint) {
const s = cp.readString(i);
console.error(s);
},
Expand Down Expand Up @@ -444,23 +445,21 @@ export async function fetchModuleData(

function haskellRuntime(module: WebAssembly.Instance): GuestRuntime | null {
const haskellInit = module.exports.hs_init;

if (!haskellInit) {
return null;
}

const reactorInit = module.exports._initialize;

let init: () => void;
if (reactorInit) {
//@ts-ignore
init = () => reactorInit();
} else {
//@ts-ignore
init = () => haskellInit();
}

const kind = reactorInit ? 'reactor' : 'normal';
const init = () => {
if (reactorInit) {
//@ts-ignore
reactorInit();
}
if (haskellInit) {
//@ts-ignore
haskellInit();
}
};

const kind = reactorInit ? 'reactor' : 'command';
console.debug(`Haskell (${kind}) runtime detected.`);

return { type: GuestRuntimeType.Haskell, init: init, initialized: false };
Expand Down Expand Up @@ -528,10 +527,6 @@ export type HttpRequest = {
method: string;
};

export const embeddedRuntime = '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';

export const embeddedRuntimeHash = 'aab40a25b5edda3fc5c9d1de1bf17af9ce5d02cbac1bacf5bdfa495b4ab9fc39'

export class CurrentPlugin {
vars: Record<string, Uint8Array>;
plugin: ExtismPluginBase;
Expand Down Expand Up @@ -594,7 +589,7 @@ export class CurrentPlugin {
* @returns {void}
*/
reset() {
return (this.#extism.exports.extism_reset as Function)();
return (this.#extism.exports.reset as Function)();
}

/**
Expand All @@ -603,7 +598,7 @@ export class CurrentPlugin {
* @returns {bigint} Offset in the memory.
*/
alloc(length: bigint): bigint {
return (this.#extism.exports.extism_alloc as Function)(length);
return (this.#extism.exports.alloc as Function)(length);
}

/**
Expand Down Expand Up @@ -682,11 +677,11 @@ export class CurrentPlugin {
* @returns {bigint} Length of the memory block.
*/
getLength(offset: bigint): bigint {
return (this.#extism.exports.extism_length as Function)(offset);
return (this.#extism.exports.length as Function)(offset);
}

inputLength(): bigint {
return (this.#extism.exports.extism_input_length as Function)();
return (this.#extism.exports.input_length as Function)();
}

/**
Expand All @@ -699,6 +694,6 @@ export class CurrentPlugin {
return;
}

(this.#extism.exports.extism_free as Function)(offset);
(this.#extism.exports.free as Function)(offset);
}
}
}
3 changes: 3 additions & 0 deletions src/runtime.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// DO NOT EDIT - this file was generated by update-kernel.js
export const embeddedRuntime = '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';
export const embeddedRuntimeHash = '052d33900a4aba9e43c65d6ed40062229add176e9c8198b74f38ec895ffb8383';
Loading
Loading