diff options
Diffstat (limited to 'cli')
-rw-r--r-- | cli/js/deno.ts | 2 | ||||
-rw-r--r-- | cli/js/lib.deno.ns.d.ts | 34 | ||||
-rw-r--r-- | cli/js/ops/plugins.ts | 12 | ||||
-rw-r--r-- | cli/js/plugins.ts | 64 | ||||
-rw-r--r-- | cli/ops/plugins.rs | 54 | ||||
-rw-r--r-- | cli/ops/resources.rs | 2 |
6 files changed, 25 insertions, 143 deletions
diff --git a/cli/js/deno.ts b/cli/js/deno.ts index 0322bac27..e35e8c161 100644 --- a/cli/js/deno.ts +++ b/cli/js/deno.ts @@ -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"; diff --git a/cli/js/lib.deno.ns.d.ts b/cli/js/lib.deno.ns.d.ts index 06baf3aa2..119ba781e 100644 --- a/cli/js/lib.deno.ns.d.ts +++ b/cli/js/lib.deno.ns.d.ts @@ -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; diff --git a/cli/js/ops/plugins.ts b/cli/js/ops/plugins.ts index 878ea1c66..e4593afbb 100644 --- a/cli/js/ops/plugins.ts +++ b/cli/js/ops/plugins.ts @@ -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; } diff --git a/cli/js/plugins.ts b/cli/js/plugins.ts deleted file mode 100644 index 498da8e16..000000000 --- a/cli/js/plugins.ts +++ /dev/null @@ -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); -} diff --git a/cli/ops/plugins.rs b/cli/ops/plugins.rs index c0dffc90f..8b905d786 100644 --- a/cli/ops/plugins.rs +++ b/cli/ops/plugins.rs @@ -4,16 +4,13 @@ use crate::op_error::OpError; use crate::ops::json_op; use crate::state::State; use deno_core::Isolate; -use deno_core::OpDispatcher; -use deno_core::OpId; -use deno_core::PluginInitContext; -use deno_core::PluginInitFn; use deno_core::ZeroCopyBuf; use dlopen::symbor::Library; -use std::collections::HashMap; use std::ffi::OsStr; use std::path::Path; +pub type PluginInitFn = fn(isolate: &mut deno_core::Isolate); + pub fn init(i: &mut Isolate, s: &State) { i.register_op( "op_open_plugin", @@ -23,27 +20,11 @@ pub fn init(i: &mut Isolate, s: &State) { fn open_plugin<P: AsRef<OsStr>>(lib_path: P) -> Result<Library, OpError> { debug!("Loading Plugin: {:#?}", lib_path.as_ref()); - Library::open(lib_path).map_err(OpError::from) } struct PluginResource { lib: Library, - ops: HashMap<String, OpId>, -} - -struct InitContext { - ops: HashMap<String, Box<OpDispatcher>>, -} - -impl PluginInitContext for InitContext { - fn register_op(&mut self, name: &str, op: Box<OpDispatcher>) { - let existing = self.ops.insert(name.to_string(), op); - assert!( - existing.is_none(), - format!("Op already registered: {}", name) - ); - } } #[derive(Deserialize)] @@ -58,16 +39,13 @@ pub fn op_open_plugin( args: Value, _zero_copy: Option<ZeroCopyBuf>, ) -> Result<JsonOp, OpError> { - let args: OpenPluginArgs = serde_json::from_value(args)?; + let args: OpenPluginArgs = serde_json::from_value(args).unwrap(); let filename = deno_fs::resolve_from_cwd(Path::new(&args.filename))?; state.check_plugin(&filename)?; - let lib = open_plugin(filename)?; - let plugin_resource = PluginResource { - lib, - ops: HashMap::new(), - }; + let lib = open_plugin(filename).unwrap(); + let plugin_resource = PluginResource { lib }; let mut state_ = state.borrow_mut(); let rid = state_ .resource_table @@ -77,27 +55,13 @@ pub fn op_open_plugin( .get_mut::<PluginResource>(rid) .unwrap(); - let init_fn = *unsafe { + let deno_plugin_init = *unsafe { plugin_resource .lib .symbol::<PluginInitFn>("deno_plugin_init") - }?; - let mut init_context = InitContext { - ops: HashMap::new(), - }; - init_fn(&mut init_context); - for op in init_context.ops { - // Register each plugin op in the `OpRegistry` with the name - // formated like this `plugin_{plugin_rid}_{name}`. - // The inclusion of prefix and rid is designed to avoid any - // op name collision beyond the bound of a single loaded - // plugin instance. - let op_id = isolate - .register_op(&format!("plugin_{}_{}", rid, op.0), state.core_op(op.1)); - plugin_resource.ops.insert(op.0, op_id); } + .unwrap(); + deno_plugin_init(isolate); - Ok(JsonOp::Sync( - json!({ "rid": rid, "ops": plugin_resource.ops }), - )) + Ok(JsonOp::Sync(json!(rid))) } diff --git a/cli/ops/resources.rs b/cli/ops/resources.rs index 4f49b2d9a..379831879 100644 --- a/cli/ops/resources.rs +++ b/cli/ops/resources.rs @@ -29,7 +29,7 @@ fn op_close( struct CloseArgs { rid: i32, } - let args: CloseArgs = serde_json::from_value(args)?; + let args: CloseArgs = serde_json::from_value(args).unwrap(); let mut state = state.borrow_mut(); state .resource_table |