summaryrefslogtreecommitdiff
path: root/cli/js/plugins.ts
blob: 4d2072c79f62e14c69012ca61a3de911bd41222e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import { sendSync } from "./dispatch_json.ts";
import { OP_OPEN_PLUGIN } 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 {
    core.setAsyncHandler(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);
}