summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrowlKats <13135287+crowlKats@users.noreply.github.com>2021-01-05 13:37:02 +0100
committerGitHub <noreply@github.com>2021-01-05 13:37:02 +0100
commitf85cd54cb4a1c54d835374d83dba4f8f7b89d2d1 (patch)
treea9f1d28b6b34014972ed36c1666d069bcca1c95e
parentc823211a2cae13ff6fdb7d3d3fc585bb4e096232 (diff)
fix(runtime/websocket): respond to ping with pong (#8974)
-rw-r--r--runtime/js/27_websocket.js9
-rw-r--r--runtime/ops/websocket.rs9
2 files changed, 15 insertions, 3 deletions
diff --git a/runtime/js/27_websocket.js b/runtime/js/27_websocket.js
index 60428c24d..9f86bdbed 100644
--- a/runtime/js/27_websocket.js
+++ b/runtime/js/27_websocket.js
@@ -167,6 +167,7 @@
this.#bufferedAmount += ta.size;
core.jsonOpAsync("op_ws_send", {
rid: this.#rid,
+ kind: "binary",
}, ta).then(() => {
this.#bufferedAmount -= ta.size;
});
@@ -193,6 +194,7 @@
this.#bufferedAmount += d.size;
core.jsonOpAsync("op_ws_send", {
rid: this.#rid,
+ kind: "text",
text: string,
}).then(() => {
this.#bufferedAmount -= d.size;
@@ -266,6 +268,13 @@
this.dispatchEvent(event);
this.#eventLoop();
+ } else if (message.type === "ping") {
+ core.jsonOpAsync("op_ws_send", {
+ rid: this.#rid,
+ kind: "pong",
+ });
+
+ this.#eventLoop();
} else if (message.type === "close") {
this.#readyState = CLOSED;
const event = new CloseEvent("close", {
diff --git a/runtime/ops/websocket.rs b/runtime/ops/websocket.rs
index 812844f39..b220655ae 100644
--- a/runtime/ops/websocket.rs
+++ b/runtime/ops/websocket.rs
@@ -216,6 +216,7 @@ pub async fn op_ws_create(
#[serde(rename_all = "camelCase")]
struct SendArgs {
rid: u32,
+ kind: String,
text: Option<String>,
}
@@ -226,9 +227,11 @@ pub async fn op_ws_send(
) -> Result<Value, AnyError> {
let args: SendArgs = serde_json::from_value(args)?;
- let msg = match args.text {
- Some(text) => Message::Text(text),
- None => Message::Binary(bufs[0].to_vec()),
+ let msg = match args.kind.as_str() {
+ "text" => Message::Text(args.text.unwrap()),
+ "binary" => Message::Binary(bufs[0].to_vec()),
+ "pong" => Message::Pong(vec![]),
+ _ => unreachable!(),
};
let rid = args.rid;