mirror of
https://github.com/denoland/deno
synced 2024-11-05 18:45:24 +00:00
refactor: rewrite websocket to use op2 macro (#20140)
Co-authored-by: Bartek Iwańczuk <biwanczuk@gmail.com>
This commit is contained in:
parent
cbddf5756e
commit
1a81b2826d
6 changed files with 75 additions and 43 deletions
12
Cargo.lock
generated
12
Cargo.lock
generated
|
@ -1205,9 +1205,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_core"
|
||||
version = "0.220.0"
|
||||
version = "0.221.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b9a21d0411c638803d21b5059b8cac2e847933fe7272c7eadafec7890f4421f1"
|
||||
checksum = "cf694d66a55050bdfad2036765f93547392ba7c131adc7fcd5e91fa31e291c51"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bytes",
|
||||
|
@ -1594,9 +1594,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "deno_ops"
|
||||
version = "0.96.0"
|
||||
version = "0.97.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "28f8b32e5575daabc57c42339496bed91236a9af422f500674fb0da01689e35e"
|
||||
checksum = "aab46b645231decaf3b03d9eb99a5207e4e66c8c53b7774000b44e3ae43e0f99"
|
||||
dependencies = [
|
||||
"deno-proc-macro-rules",
|
||||
"lazy-regex",
|
||||
|
@ -4821,9 +4821,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "serde_v8"
|
||||
version = "0.129.0"
|
||||
version = "0.130.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "00f52380e42a53d4c3884c21969621620fdd0bcc1c165b02c2d80e2f41f5730e"
|
||||
checksum = "2c6078fc5e16615b092b26199e7f1d7d2d336848623d32e00f95e74618274111"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"derive_more",
|
||||
|
|
|
@ -40,7 +40,7 @@ repository = "https://github.com/denoland/deno"
|
|||
[workspace.dependencies]
|
||||
deno_ast = { version = "0.29.3", features = ["transpiling"] }
|
||||
|
||||
deno_core = { version = "0.220.0" }
|
||||
deno_core = { version = "0.221.0" }
|
||||
|
||||
deno_runtime = { version = "0.128.0", path = "./runtime" }
|
||||
napi_sym = { version = "0.50.0", path = "./cli/napi/sym" }
|
||||
|
|
|
@ -146,6 +146,7 @@ const OP_DETAILS = {
|
|||
"op_ws_next_event": ["receive the next message on a WebSocket", "closing a `WebSocket` or `WebSocketStream`"],
|
||||
"op_ws_send_text": ["send a message on a WebSocket", "closing a `WebSocket` or `WebSocketStream`"],
|
||||
"op_ws_send_binary": ["send a message on a WebSocket", "closing a `WebSocket` or `WebSocketStream`"],
|
||||
"op_ws_send_binary_ab": ["send a message on a WebSocket", "closing a `WebSocket` or `WebSocketStream`"],
|
||||
"op_ws_send_ping": ["send a message on a WebSocket", "closing a `WebSocket` or `WebSocketStream`"],
|
||||
"op_ws_send_pong": ["send a message on a WebSocket", "closing a `WebSocket` or `WebSocketStream`"],
|
||||
};
|
||||
|
|
|
@ -26,7 +26,6 @@ const {
|
|||
ArrayPrototypeJoin,
|
||||
ArrayPrototypeMap,
|
||||
ArrayPrototypeSome,
|
||||
DataView,
|
||||
ErrorPrototypeToString,
|
||||
ObjectDefineProperties,
|
||||
ObjectPrototypeIsPrototypeOf,
|
||||
|
@ -50,6 +49,7 @@ const {
|
|||
op_ws_create,
|
||||
op_ws_close,
|
||||
op_ws_send_binary,
|
||||
op_ws_send_binary_ab,
|
||||
op_ws_send_text,
|
||||
op_ws_next_event,
|
||||
op_ws_get_buffer,
|
||||
|
@ -336,11 +336,7 @@ class WebSocket extends EventTarget {
|
|||
PromisePrototypeThen(
|
||||
// deno-lint-ignore prefer-primordials
|
||||
data.slice().arrayBuffer(),
|
||||
(ab) =>
|
||||
op_ws_send_binary(
|
||||
this[_rid],
|
||||
new DataView(ab),
|
||||
),
|
||||
(ab) => op_ws_send_binary_ab(this[_rid], ab),
|
||||
);
|
||||
} else {
|
||||
const string = String(data);
|
||||
|
|
|
@ -5,6 +5,7 @@ use deno_core::error::invalid_hostname;
|
|||
use deno_core::error::type_error;
|
||||
use deno_core::error::AnyError;
|
||||
use deno_core::op;
|
||||
use deno_core::op2;
|
||||
use deno_core::url;
|
||||
use deno_core::AsyncMutFuture;
|
||||
use deno_core::AsyncRefCell;
|
||||
|
@ -108,11 +109,12 @@ impl Resource for WsCancelResource {
|
|||
// This op is needed because creating a WS instance in JavaScript is a sync
|
||||
// operation and should throw error when permissions are not fulfilled,
|
||||
// but actual op that connects WS is async.
|
||||
#[op]
|
||||
#[op2]
|
||||
#[smi]
|
||||
pub fn op_ws_check_permission_and_cancel_handle<WP>(
|
||||
state: &mut OpState,
|
||||
api_name: String,
|
||||
url: String,
|
||||
#[string] api_name: String,
|
||||
#[string] url: String,
|
||||
cancel_handle: bool,
|
||||
) -> Result<Option<ResourceId>, AnyError>
|
||||
where
|
||||
|
@ -167,14 +169,15 @@ async fn handshake<S: AsyncRead + AsyncWrite + Send + Unpin + 'static>(
|
|||
Ok((stream, response))
|
||||
}
|
||||
|
||||
#[op]
|
||||
#[op2(async)]
|
||||
#[serde]
|
||||
pub async fn op_ws_create<WP>(
|
||||
state: Rc<RefCell<OpState>>,
|
||||
api_name: String,
|
||||
url: String,
|
||||
protocols: String,
|
||||
cancel_handle: Option<ResourceId>,
|
||||
headers: Option<Vec<(ByteString, ByteString)>>,
|
||||
#[string] api_name: String,
|
||||
#[string] url: String,
|
||||
#[string] protocols: String,
|
||||
#[smi] cancel_handle: Option<ResourceId>,
|
||||
#[serde] headers: Option<Vec<(ByteString, ByteString)>>,
|
||||
) -> Result<CreateResponse, AnyError>
|
||||
where
|
||||
WP: WebSocketPermissions + 'static,
|
||||
|
@ -407,8 +410,7 @@ pub fn ws_create_server_stream(
|
|||
Ok(rid)
|
||||
}
|
||||
|
||||
#[op(fast)]
|
||||
pub fn op_ws_send_binary(state: &mut OpState, rid: ResourceId, data: &[u8]) {
|
||||
fn send_binary(state: &mut OpState, rid: ResourceId, data: &[u8]) {
|
||||
let resource = state.resource_table.get::<ServerWebSocket>(rid).unwrap();
|
||||
let data = data.to_vec();
|
||||
let len = data.len();
|
||||
|
@ -426,8 +428,30 @@ pub fn op_ws_send_binary(state: &mut OpState, rid: ResourceId, data: &[u8]) {
|
|||
});
|
||||
}
|
||||
|
||||
#[op(fast)]
|
||||
pub fn op_ws_send_text(state: &mut OpState, rid: ResourceId, data: String) {
|
||||
#[op2(fast)]
|
||||
pub fn op_ws_send_binary(
|
||||
state: &mut OpState,
|
||||
#[smi] rid: ResourceId,
|
||||
#[anybuffer] data: &[u8],
|
||||
) {
|
||||
send_binary(state, rid, data)
|
||||
}
|
||||
|
||||
#[op2(fast)]
|
||||
pub fn op_ws_send_binary_ab(
|
||||
state: &mut OpState,
|
||||
#[smi] rid: ResourceId,
|
||||
#[arraybuffer] data: &[u8],
|
||||
) {
|
||||
send_binary(state, rid, data)
|
||||
}
|
||||
|
||||
#[op2(fast)]
|
||||
pub fn op_ws_send_text(
|
||||
state: &mut OpState,
|
||||
#[smi] rid: ResourceId,
|
||||
#[string] data: String,
|
||||
) {
|
||||
let resource = state.resource_table.get::<ServerWebSocket>(rid).unwrap();
|
||||
let len = data.len();
|
||||
resource.buffered.set(resource.buffered.get() + len);
|
||||
|
@ -487,8 +511,12 @@ pub async fn op_ws_send_text_async(
|
|||
|
||||
const EMPTY_PAYLOAD: &[u8] = &[];
|
||||
|
||||
#[op(fast)]
|
||||
pub fn op_ws_get_buffered_amount(state: &mut OpState, rid: ResourceId) -> u32 {
|
||||
#[op2(fast)]
|
||||
#[smi]
|
||||
pub fn op_ws_get_buffered_amount(
|
||||
state: &mut OpState,
|
||||
#[smi] rid: ResourceId,
|
||||
) -> u32 {
|
||||
state
|
||||
.resource_table
|
||||
.get::<ServerWebSocket>(rid)
|
||||
|
@ -497,10 +525,10 @@ pub fn op_ws_get_buffered_amount(state: &mut OpState, rid: ResourceId) -> u32 {
|
|||
.get() as u32
|
||||
}
|
||||
|
||||
#[op]
|
||||
#[op2(async)]
|
||||
pub async fn op_ws_send_pong(
|
||||
state: Rc<RefCell<OpState>>,
|
||||
rid: ResourceId,
|
||||
#[smi] rid: ResourceId,
|
||||
) -> Result<(), AnyError> {
|
||||
let resource = state
|
||||
.borrow_mut()
|
||||
|
@ -512,10 +540,10 @@ pub async fn op_ws_send_pong(
|
|||
.await
|
||||
}
|
||||
|
||||
#[op]
|
||||
#[op2(async)]
|
||||
pub async fn op_ws_send_ping(
|
||||
state: Rc<RefCell<OpState>>,
|
||||
rid: ResourceId,
|
||||
#[smi] rid: ResourceId,
|
||||
) -> Result<(), AnyError> {
|
||||
let resource = state
|
||||
.borrow_mut()
|
||||
|
@ -530,12 +558,12 @@ pub async fn op_ws_send_ping(
|
|||
.await
|
||||
}
|
||||
|
||||
#[op(deferred)]
|
||||
#[op2(async(lazy))]
|
||||
pub async fn op_ws_close(
|
||||
state: Rc<RefCell<OpState>>,
|
||||
rid: ResourceId,
|
||||
code: Option<u16>,
|
||||
reason: Option<String>,
|
||||
#[smi] rid: ResourceId,
|
||||
#[smi] code: Option<u16>,
|
||||
#[string] reason: Option<String>,
|
||||
) -> Result<(), AnyError> {
|
||||
let resource = state
|
||||
.borrow_mut()
|
||||
|
@ -551,23 +579,29 @@ pub async fn op_ws_close(
|
|||
Ok(())
|
||||
}
|
||||
|
||||
#[op]
|
||||
pub fn op_ws_get_buffer(state: &mut OpState, rid: ResourceId) -> ToJsBuffer {
|
||||
#[op2]
|
||||
#[serde]
|
||||
pub fn op_ws_get_buffer(
|
||||
state: &mut OpState,
|
||||
#[smi] rid: ResourceId,
|
||||
) -> ToJsBuffer {
|
||||
let resource = state.resource_table.get::<ServerWebSocket>(rid).unwrap();
|
||||
resource.buffer.take().unwrap().into()
|
||||
}
|
||||
|
||||
#[op]
|
||||
#[op2]
|
||||
#[string]
|
||||
pub fn op_ws_get_buffer_as_string(
|
||||
state: &mut OpState,
|
||||
rid: ResourceId,
|
||||
#[smi] rid: ResourceId,
|
||||
) -> String {
|
||||
let resource = state.resource_table.get::<ServerWebSocket>(rid).unwrap();
|
||||
resource.string.take().unwrap()
|
||||
}
|
||||
|
||||
#[op]
|
||||
pub fn op_ws_get_error(state: &mut OpState, rid: ResourceId) -> String {
|
||||
#[op2]
|
||||
#[string]
|
||||
pub fn op_ws_get_error(state: &mut OpState, #[smi] rid: ResourceId) -> String {
|
||||
let Ok(resource) = state.resource_table.get::<ServerWebSocket>(rid) else {
|
||||
return "Bad resource".into();
|
||||
};
|
||||
|
@ -660,6 +694,7 @@ deno_core::extension!(deno_websocket,
|
|||
op_ws_get_buffer_as_string,
|
||||
op_ws_get_error,
|
||||
op_ws_send_binary,
|
||||
op_ws_send_binary_ab,
|
||||
op_ws_send_text,
|
||||
op_ws_send_binary_async,
|
||||
op_ws_send_text_async,
|
||||
|
|
|
@ -31,7 +31,7 @@ fn op_main_module(state: &mut OpState) -> Result<String, AnyError> {
|
|||
|
||||
/// This is an op instead of being done at initialization time because
|
||||
/// it's expensive to retrieve the ppid on Windows.
|
||||
#[op2]
|
||||
#[op2(fast)]
|
||||
#[bigint]
|
||||
pub fn op_ppid() -> i64 {
|
||||
#[cfg(windows)]
|
||||
|
|
Loading…
Reference in a new issue