UNPKG

fastify-uws

Version:

A performant HTTP and WebSocket server for Fastify with uWebSockets.

59 lines (58 loc) 1.86 kB
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 };