diff options
Diffstat (limited to 'ext/websocket/01_websocket.js')
-rw-r--r-- | ext/websocket/01_websocket.js | 42 |
1 files changed, 14 insertions, 28 deletions
diff --git a/ext/websocket/01_websocket.js b/ext/websocket/01_websocket.js index 5b364f809..2284a0e77 100644 --- a/ext/websocket/01_websocket.js +++ b/ext/websocket/01_websocket.js @@ -20,7 +20,6 @@ ArrayPrototypeJoin, ArrayPrototypeMap, ArrayPrototypeSome, - Uint32Array, ErrorPrototypeToString, ObjectDefineProperties, ObjectPrototypeIsPrototypeOf, @@ -85,10 +84,6 @@ const _idleTimeoutDuration = Symbol("[[idleTimeout]]"); const _idleTimeoutTimeout = Symbol("[[idleTimeoutTimeout]]"); const _serverHandleIdleTimeout = Symbol("[[serverHandleIdleTimeout]]"); - - /* [event type, close code] */ - const eventBuf = new Uint32Array(2); - class WebSocket extends EventTarget { [_rid]; @@ -417,15 +412,13 @@ async [_eventLoop]() { while (this[_readyState] !== CLOSED) { - const value = await core.opAsync( + const { kind, value } = await core.opAsync( "op_ws_next_event", this[_rid], - eventBuf, ); - const kind = eventBuf[0]; + switch (kind) { - /* string */ - case 0: { + case "string": { this[_serverHandleIdleTimeout](); const event = new MessageEvent("message", { data: value, @@ -434,15 +427,14 @@ this.dispatchEvent(event); break; } - /* binary */ - case 1: { + case "binary": { this[_serverHandleIdleTimeout](); let data; if (this.binaryType === "blob") { data = new Blob([value]); } else { - data = value; + data = value.buffer; } const event = new MessageEvent("message", { @@ -452,23 +444,18 @@ this.dispatchEvent(event); break; } - /* ping */ - case 3: { + case "ping": { core.opAsync("op_ws_send", this[_rid], { kind: "pong", }); break; } - /* pong */ - case 4: { + case "pong": { this[_serverHandleIdleTimeout](); break; } - /* closed */ - case 6: // falls through - /* close */ - case 2: { - const code = eventBuf[1]; + case "closed": + case "close": { const prevState = this[_readyState]; this[_readyState] = CLOSED; clearTimeout(this[_idleTimeoutTimeout]); @@ -478,8 +465,8 @@ await core.opAsync( "op_ws_close", this[_rid], - code, - value, + value.code, + value.reason, ); } catch { // ignore failures @@ -488,15 +475,14 @@ const event = new CloseEvent("close", { wasClean: true, - code, - reason: value, + code: value.code, + reason: value.reason, }); this.dispatchEvent(event); core.tryClose(this[_rid]); break; } - /* error */ - case 5: { + case "error": { this[_readyState] = CLOSED; const errorEv = new ErrorEvent("error", { |