summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/lib.rs1
-rw-r--r--core/plugin_api.rs23
2 files changed, 24 insertions, 0 deletions
diff --git a/core/lib.rs b/core/lib.rs
index 661640910..ffccc8feb 100644
--- a/core/lib.rs
+++ b/core/lib.rs
@@ -17,6 +17,7 @@ mod js_errors;
mod module_specifier;
mod modules;
mod ops;
+pub mod plugin_api;
mod resources;
mod shared_queue;
diff --git a/core/plugin_api.rs b/core/plugin_api.rs
new file mode 100644
index 000000000..2e93fdb77
--- /dev/null
+++ b/core/plugin_api.rs
@@ -0,0 +1,23 @@
+// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
+
+// This file defines the public interface for dynamically loaded plugins.
+
+// The plugin needs to do all interaction with the CLI crate through trait
+// objects and function pointers. This ensures that no concrete internal methods
+// (such as register_op and the closures created by it) can end up in the plugin
+// shared library itself, which would cause segfaults when the plugin is
+// unloaded and all functions in the plugin library are unmapped from memory.
+
+pub use crate::Buf;
+pub use crate::Op;
+pub use crate::OpId;
+pub use crate::ZeroCopyBuf;
+
+pub type InitFn = fn(&mut dyn Interface);
+
+pub type DispatchOpFn =
+ fn(&mut dyn Interface, &[u8], Option<ZeroCopyBuf>) -> Op;
+
+pub trait Interface {
+ fn register_op(&mut self, name: &str, dispatcher: DispatchOpFn) -> OpId;
+}