fastify-uws
Version:
A performant HTTP and WebSocket server for Fastify with uWebSockets.
59 lines (58 loc) • 1.86 kB
JavaScript
import H from "fastify-plugin";
import { kWs as i, kRes as y } from "./symbols.js";
import { WebSocketServer as R, WebSocket as u } from "./websocket-server.js";
function g(t, n) {
n.log.error(t), n.raw.destroy(t);
}
function E(t, n, d) {
const { server: p } = t, { errorHandler: a = g, options: S } = n;
if (a && typeof a != "function")
return d(new Error("invalid errorHandler function"));
const k = new R(S);
p[i] = k, t.decorate("websocketServer", k), t.addHook("onRoute", (o) => {
if (!!!o.websocket || o.method === "HEAD" || o.method === "OPTIONS") return;
const h = typeof o.ws == "object" ? o.ws : {}, w = o.handler, b = Buffer.from(o.url), m = {};
if (h.topics)
for (const c of h.topics)
m[c] = u.allocTopic(b, c);
o.handler = function(c, r) {
const e = c.raw;
if (e[i]) {
r.hijack();
const W = e.socket[y];
if (e.socket[i] = !0, e.socket.aborted || e.socket.destroyed) return;
W.upgrade(
{
req: e,
handler: (v) => {
const s = new u(b, v, m);
let f;
try {
e.once("error", () => {
s.close();
}), e.once("close", () => {
s.end();
}), f = w.call(this, s, c, r);
} catch (l) {
return a.call(this, l, s, c, r);
}
f && typeof f.catch == "function" && f.catch((l) => a.call(this, l, s, c, r));
}
},
e.headers["sec-websocket-key"],
e.headers["sec-websocket-protocol"],
e.headers["sec-websocket-extensions"],
e[i]
);
} else
return w.call(this, c, r);
};
}), d();
}
const B = H(E, {
fastify: "5.x",
name: "@fastify/websocket"
});
export {
B as default
};