mirror of
https://github.com/denoland/deno.git
synced 2025-07-24 13:44:08 +00:00
Remove core/plugin.rs (#4824)
This simplifies the plugin interface in order to deliver op crates with a similar API
This commit is contained in:
parent
437e35ca52
commit
6e5f3453f8
11 changed files with 53 additions and 190 deletions
|
@ -93,7 +93,7 @@ export {
|
|||
PermissionStatus,
|
||||
Permissions,
|
||||
} from "./permissions.ts";
|
||||
export { openPlugin } from "./plugins.ts";
|
||||
export { openPlugin } from "./ops/plugins.ts";
|
||||
export { kill } from "./ops/process.ts";
|
||||
export { run, RunOptions, Process, ProcessStatus } from "./process.ts";
|
||||
export { DirEntry, readdirSync, readdir } from "./ops/fs/read_dir.ts";
|
||||
|
|
34
cli/js/lib.deno.ns.d.ts
vendored
34
cli/js/lib.deno.ns.d.ts
vendored
|
@ -1796,35 +1796,23 @@ declare namespace Deno {
|
|||
* Requires `allow-write` permission. */
|
||||
export function truncate(name: string, len?: number): Promise<void>;
|
||||
|
||||
export interface AsyncHandler {
|
||||
(msg: Uint8Array): void;
|
||||
}
|
||||
|
||||
export interface PluginOp {
|
||||
dispatch(
|
||||
control: Uint8Array,
|
||||
zeroCopy?: ArrayBufferView | null
|
||||
): Uint8Array | null;
|
||||
setAsyncHandler(handler: AsyncHandler): void;
|
||||
}
|
||||
|
||||
export interface Plugin {
|
||||
ops: {
|
||||
[name: string]: PluginOp;
|
||||
};
|
||||
}
|
||||
|
||||
/** **UNSTABLE**: new API, yet to be vetted.
|
||||
*
|
||||
* Open and initalize a plugin.
|
||||
*
|
||||
* const plugin = Deno.openPlugin("./path/to/some/plugin.so");
|
||||
* const some_op = plugin.ops.some_op;
|
||||
* const response = some_op.dispatch(new Uint8Array([1,2,3,4]));
|
||||
* const rid = Deno.openPlugin("./path/to/some/plugin.so");
|
||||
* const opId = Deno.core.ops()["some_op"];
|
||||
* const response = Deno.core.dispatch(opId, new Uint8Array([1,2,3,4]));
|
||||
* console.log(`Response from plugin ${response}`);
|
||||
*
|
||||
* Requires `allow-plugin` permission. */
|
||||
export function openPlugin(filename: string): Plugin;
|
||||
* Requires `allow-plugin` permission.
|
||||
*
|
||||
* The plugin system is not stable and will change in the future, hence the
|
||||
* lack of docs. For now take a look at the example
|
||||
* https://github.com/denoland/deno/tree/master/test_plugin
|
||||
*/
|
||||
export function openPlugin(filename: string): number;
|
||||
|
||||
export interface NetAddr {
|
||||
transport: "tcp" | "udp";
|
||||
hostname: string;
|
||||
|
|
|
@ -1,12 +1,6 @@
|
|||
import { sendSync } from "./dispatch_json.ts";
|
||||
|
||||
interface OpenPluginResponse {
|
||||
rid: number;
|
||||
ops: {
|
||||
[name: string]: number;
|
||||
};
|
||||
}
|
||||
|
||||
export function openPlugin(filename: string): OpenPluginResponse {
|
||||
return sendSync("op_open_plugin", { filename });
|
||||
export function openPlugin(filename: string): number {
|
||||
const rid = sendSync("op_open_plugin", { filename });
|
||||
return rid;
|
||||
}
|
||||
|
|
|
@ -1,64 +0,0 @@
|
|||
import { openPlugin as openPluginOp } from "./ops/plugins.ts";
|
||||
import { core } from "./core.ts";
|
||||
import { close } from "./ops/resources.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 {
|
||||
readonly #opId: number;
|
||||
|
||||
constructor(opId: number) {
|
||||
this.#opId = opId;
|
||||
}
|
||||
|
||||
dispatch(
|
||||
control: Uint8Array,
|
||||
zeroCopy?: ArrayBufferView | null
|
||||
): Uint8Array | null {
|
||||
return core.dispatch(this.#opId, control, zeroCopy);
|
||||
}
|
||||
|
||||
setAsyncHandler(handler: AsyncHandler): void {
|
||||
core.setAsyncHandler(this.#opId, handler);
|
||||
}
|
||||
}
|
||||
|
||||
interface Plugin {
|
||||
ops: {
|
||||
[name: string]: PluginOp;
|
||||
};
|
||||
close(): void;
|
||||
}
|
||||
|
||||
class PluginImpl implements Plugin {
|
||||
#ops: { [name: string]: PluginOp } = {};
|
||||
|
||||
constructor(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);
|
||||
}
|
||||
|
||||
close(): void {
|
||||
close(this.rid);
|
||||
}
|
||||
}
|
||||
|
||||
export function openPlugin(filename: string): Plugin {
|
||||
const response = openPluginOp(filename);
|
||||
return new PluginImpl(response.rid, response.ops);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue