websocket.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. // src/adapter/cloudflare-workers/websocket.ts
  2. import { WSContext, defineWebSocketHelper } from "../../helper/websocket/index.js";
  3. var upgradeWebSocket = defineWebSocketHelper(async (c, events) => {
  4. const upgradeHeader = c.req.header("Upgrade");
  5. if (upgradeHeader !== "websocket") {
  6. return;
  7. }
  8. const webSocketPair = new WebSocketPair();
  9. const client = webSocketPair[0];
  10. const server = webSocketPair[1];
  11. const wsContext = new WSContext({
  12. close: (code, reason) => server.close(code, reason),
  13. get protocol() {
  14. return server.protocol;
  15. },
  16. raw: server,
  17. get readyState() {
  18. return server.readyState;
  19. },
  20. url: server.url ? new URL(server.url) : null,
  21. send: (source) => server.send(source)
  22. });
  23. if (events.onClose) {
  24. server.addEventListener("close", (evt) => events.onClose?.(evt, wsContext));
  25. }
  26. if (events.onMessage) {
  27. server.addEventListener("message", (evt) => events.onMessage?.(evt, wsContext));
  28. }
  29. if (events.onError) {
  30. server.addEventListener("error", (evt) => events.onError?.(evt, wsContext));
  31. }
  32. server.accept?.();
  33. return new Response(null, {
  34. status: 101,
  35. // @ts-expect-error - webSocket is not typed
  36. webSocket: client
  37. });
  38. });
  39. export {
  40. upgradeWebSocket
  41. };