UNPKG

1.38 kBJavaScriptView Raw
1// src/internal/ws.ts
2const { STATUS_CODES:p } = require('worktop');
3const { byteLength:d } = require('worktop/utils');
4function r(t) {
5 let e = p[t];
6 return new Response(e, {
7 status: t,
8 statusText: e,
9 headers: {
10 Connection: "close",
11 "Content-Type": "text/plain",
12 "Content-Length": "" + d(e)
13 }
14 });
15}
16
17// src/ws.ts
18var f = function(t) {
19 if (t.method !== "GET")
20 return r(405);
21 let e = t.headers.get("upgrade");
22 if (e !== "websocket")
23 return r(426);
24 if (e = (t.headers.get("sec-websocket-key") || "").trim(), !/^[+/0-9A-Za-z]{22}==$/.test(e))
25 return r(400);
26 if (e = t.headers.get("sec-websocket-version"), e !== "13")
27 return r(400);
28};
29function v(t) {
30 return function(e, a) {
31 let s = f(e, a);
32 if (s)
33 return s;
34 let {0: l, 1: n} = new WebSocketPair(), u = {};
35 function i(o) {
36 return t(e, {
37 send: n.send.bind(n),
38 close: n.close.bind(n),
39 context: u,
40 event: o
41 });
42 }
43 async function c(o) {
44 try {
45 await i(o);
46 } finally {
47 n.close();
48 }
49 }
50 return n.accept(), n.addEventListener("close", c), n.addEventListener("message", i), n.addEventListener("error", c), new Response(null, {
51 status: 101,
52 statusText: "Switching Protocols",
53 webSocket: l
54 });
55 };
56}
57
58
59exports.connect = f;
60exports.listen = v;
\No newline at end of file