summaryrefslogtreecommitdiff
path: root/ext/websocket
diff options
context:
space:
mode:
Diffstat (limited to 'ext/websocket')
-rw-r--r--ext/websocket/01_websocket.js8
-rw-r--r--ext/websocket/lib.rs93
2 files changed, 66 insertions, 35 deletions
diff --git a/ext/websocket/01_websocket.js b/ext/websocket/01_websocket.js
index 5f0f648a7..3417eff67 100644
--- a/ext/websocket/01_websocket.js
+++ b/ext/websocket/01_websocket.js
@@ -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);
diff --git a/ext/websocket/lib.rs b/ext/websocket/lib.rs
index 479cae7ec..48a22431b 100644
--- a/ext/websocket/lib.rs
+++ b/ext/websocket/lib.rs
@@ -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,