diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2021-07-11 18:12:26 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-11 18:12:26 -0700 |
commit | 511c48a03adee54aaadbefdeb2d2d521f6a45843 (patch) | |
tree | 817acc25f4c598fdc985f306f29fb3c318f87c55 /test_plugin/src | |
parent | eea6000ef6e30e6684995619e630d3beb7d7484b (diff) |
Revert "Remove unstable native plugins (#10908)"
This reverts commit 7dd4090c2a3dc0222fd6ff611eeb2bd69cd28224.
Diffstat (limited to 'test_plugin/src')
-rw-r--r-- | test_plugin/src/lib.rs | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/test_plugin/src/lib.rs b/test_plugin/src/lib.rs new file mode 100644 index 000000000..88761edcf --- /dev/null +++ b/test_plugin/src/lib.rs @@ -0,0 +1,114 @@ +// Copyright 2018-2021 the Deno authors. All rights reserved. MIT license. + +use std::borrow::Cow; +use std::cell::RefCell; +use std::rc::Rc; + +use deno_core::error::bad_resource_id; +use deno_core::error::AnyError; +use deno_core::op_async; +use deno_core::op_sync; +use deno_core::Extension; +use deno_core::OpState; +use deno_core::Resource; +use deno_core::ResourceId; +use deno_core::ZeroCopyBuf; +use serde::Deserialize; + +#[no_mangle] +pub fn init() -> Extension { + Extension::builder() + .ops(vec![ + ("op_test_sync", op_sync(op_test_sync)), + ("op_test_async", op_async(op_test_async)), + ( + "op_test_resource_table_add", + op_sync(op_test_resource_table_add), + ), + ( + "op_test_resource_table_get", + op_sync(op_test_resource_table_get), + ), + ]) + .build() +} + +#[derive(Debug, Deserialize)] +struct TestArgs { + val: String, +} + +fn op_test_sync( + _state: &mut OpState, + args: TestArgs, + zero_copy: Option<ZeroCopyBuf>, +) -> Result<String, AnyError> { + println!("Hello from sync plugin op."); + + println!("args: {:?}", args); + + if let Some(buf) = zero_copy { + let buf_str = std::str::from_utf8(&buf[..])?; + println!("zero_copy: {}", buf_str); + } + + Ok("test".to_string()) +} + +async fn op_test_async( + _state: Rc<RefCell<OpState>>, + args: TestArgs, + zero_copy: Option<ZeroCopyBuf>, +) -> Result<String, AnyError> { + println!("Hello from async plugin op."); + + println!("args: {:?}", args); + + if let Some(buf) = zero_copy { + let buf_str = std::str::from_utf8(&buf[..])?; + println!("zero_copy: {}", buf_str); + } + + let (tx, rx) = futures::channel::oneshot::channel::<Result<(), ()>>(); + std::thread::spawn(move || { + std::thread::sleep(std::time::Duration::from_secs(1)); + tx.send(Ok(())).unwrap(); + }); + assert!(rx.await.is_ok()); + + Ok("test".to_string()) +} + +struct TestResource(String); +impl Resource for TestResource { + fn name(&self) -> Cow<str> { + "TestResource".into() + } +} + +fn op_test_resource_table_add( + state: &mut OpState, + text: String, + _: (), +) -> Result<u32, AnyError> { + println!("Hello from resource_table.add plugin op."); + + Ok(state.resource_table.add(TestResource(text))) +} + +fn op_test_resource_table_get( + state: &mut OpState, + rid: ResourceId, + _: (), +) -> Result<String, AnyError> { + println!("Hello from resource_table.get plugin op."); + + Ok( + state + .resource_table + .get::<TestResource>(rid) + .ok_or_else(bad_resource_id)? + .0 + .clone(), + ) +} |