mirror of
https://github.com/denoland/deno.git
synced 2024-11-29 16:30:56 -05:00
67 lines
1.4 KiB
TypeScript
67 lines
1.4 KiB
TypeScript
|
import { sendSync } from "./dispatch_json.ts";
|
||
|
import { OP_OPEN_PLUGIN, setPluginAsyncHandler } from "./dispatch.ts";
|
||
|
import { core } from "./core.ts";
|
||
|
|
||
|
export interface AsyncHandler {
|
||
|
(msg: Uint8Array): void;
|
||
|
}
|
||
|
|
||
|
interface PluginOp {
|
||
|
dispatch(
|
||
|
control: Uint8Array,
|
||
|
zeroCopy?: ArrayBufferView | null
|
||
|
): Uint8Array | null;
|
||
|
setAsyncHandler(handler: AsyncHandler): void;
|
||
|
}
|
||
|
|
||
|
class PluginOpImpl implements PluginOp {
|
||
|
constructor(private readonly opId: number) {}
|
||
|
|
||
|
dispatch(
|
||
|
control: Uint8Array,
|
||
|
zeroCopy?: ArrayBufferView | null
|
||
|
): Uint8Array | null {
|
||
|
return core.dispatch(this.opId, control, zeroCopy);
|
||
|
}
|
||
|
|
||
|
setAsyncHandler(handler: AsyncHandler): void {
|
||
|
setPluginAsyncHandler(this.opId, handler);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// TODO(afinch7): add close method.
|
||
|
|
||
|
interface Plugin {
|
||
|
ops: {
|
||
|
[name: string]: PluginOp;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
class PluginImpl implements Plugin {
|
||
|
private _ops: { [name: string]: PluginOp } = {};
|
||
|
|
||
|
constructor(private readonly rid: number, ops: { [name: string]: number }) {
|
||
|
for (const op in ops) {
|
||
|
this._ops[op] = new PluginOpImpl(ops[op]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
get ops(): { [name: string]: PluginOp } {
|
||
|
return Object.assign({}, this._ops);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
interface OpenPluginResponse {
|
||
|
rid: number;
|
||
|
ops: {
|
||
|
[name: string]: number;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
export function openPlugin(filename: string): Plugin {
|
||
|
const response: OpenPluginResponse = sendSync(OP_OPEN_PLUGIN, {
|
||
|
filename
|
||
|
});
|
||
|
return new PluginImpl(response.rid, response.ops);
|
||
|
}
|