crossws 0.3.5 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/adapters/bun.d.ts +2 -2
  2. package/adapters/cloudflare.d.ts +2 -2
  3. package/adapters/deno.d.ts +2 -2
  4. package/adapters/node.d.ts +2 -2
  5. package/adapters/sse.d.ts +2 -2
  6. package/adapters/uws.d.ts +2 -2
  7. package/dist/adapters/bun.d.mts +5 -3
  8. package/dist/adapters/bun.mjs +23 -13
  9. package/dist/adapters/cloudflare.d.mts +40 -7
  10. package/dist/adapters/cloudflare.mjs +172 -14
  11. package/dist/adapters/deno.mjs +18 -9
  12. package/dist/adapters/node.d.mts +1 -1
  13. package/dist/adapters/node.mjs +28 -29
  14. package/dist/adapters/sse.mjs +8 -7
  15. package/dist/adapters/uws.d.mts +12 -9
  16. package/dist/adapters/uws.mjs +25 -27
  17. package/dist/index.d.mts +33 -20
  18. package/dist/index.mjs +1 -1
  19. package/dist/server/bun.d.mts +24 -0
  20. package/dist/server/bun.mjs +37 -0
  21. package/dist/server/cloudflare.d.mts +24 -0
  22. package/dist/server/cloudflare.mjs +36 -0
  23. package/dist/server/default.d.mts +24 -0
  24. package/dist/server/default.mjs +32 -0
  25. package/dist/server/deno.d.mts +24 -0
  26. package/dist/server/deno.mjs +30 -0
  27. package/dist/server/node.d.mts +24 -0
  28. package/dist/server/node.mjs +49 -0
  29. package/dist/shared/crossws.95-eYp2D.d.mts +23 -0
  30. package/dist/shared/crossws.B31KJMcF.mjs +83 -0
  31. package/dist/shared/{crossws.D9ehKjSh.mjs → crossws.CPlNx7g8.mjs} +44 -25
  32. package/dist/shared/{crossws.DfCzGthR.mjs → crossws.WpyOHUXc.mjs} +18 -13
  33. package/package.json +42 -53
  34. package/server/bun.d.ts +2 -0
  35. package/server/deno.d.ts +2 -0
  36. package/server/node.d.ts +2 -0
  37. package/server.d.ts +2 -0
  38. package/websocket/sse.d.ts +2 -0
  39. package/websocket.d.ts +2 -2
  40. package/dist/adapters/bun.d.ts +0 -39
  41. package/dist/adapters/cloudflare-durable.d.mts +0 -42
  42. package/dist/adapters/cloudflare-durable.d.ts +0 -42
  43. package/dist/adapters/cloudflare-durable.mjs +0 -141
  44. package/dist/adapters/cloudflare.d.ts +0 -13
  45. package/dist/adapters/deno.d.ts +0 -19
  46. package/dist/adapters/node.d.ts +0 -299
  47. package/dist/adapters/sse.d.ts +0 -13
  48. package/dist/adapters/uws.d.ts +0 -59
  49. package/dist/index.d.ts +0 -157
  50. package/dist/shared/crossws.BQXMA5bH.d.ts +0 -297
  51. package/dist/websocket/native.d.ts +0 -3
  52. package/dist/websocket/node.d.ts +0 -3
  53. package/dist/websocket/sse.d.ts +0 -42
@@ -1,15 +1,16 @@
1
- import { M as Message, P as Peer, t as toBufferLike } from '../shared/crossws.DfCzGthR.mjs';
2
- import { a as adapterUtils, A as AdapterHookable } from '../shared/crossws.D9ehKjSh.mjs';
3
- import 'uncrypto';
1
+ import { M as Message, P as Peer, t as toBufferLike } from '../shared/crossws.WpyOHUXc.mjs';
2
+ import { a as adapterUtils, A as AdapterHookable, g as getPeers } from '../shared/crossws.CPlNx7g8.mjs';
3
+ import { S as StubRequest } from '../shared/crossws.B31KJMcF.mjs';
4
4
 
5
5
  const uwsAdapter = (options = {}) => {
6
6
  const hooks = new AdapterHookable(options);
7
- const peers = /* @__PURE__ */ new Set();
7
+ const globalPeers = /* @__PURE__ */ new Map();
8
8
  return {
9
- ...adapterUtils(peers),
9
+ ...adapterUtils(globalPeers),
10
10
  websocket: {
11
11
  ...options.uws,
12
12
  close(ws, code, message) {
13
+ const peers = getPeers(globalPeers, ws.getUserData().namespace);
13
14
  const peer = getPeer(ws, peers);
14
15
  peer._internal.ws.readyState = 2;
15
16
  peers.delete(peer);
@@ -20,10 +21,12 @@ const uwsAdapter = (options = {}) => {
20
21
  peer._internal.ws.readyState = 3;
21
22
  },
22
23
  message(ws, message, isBinary) {
24
+ const peers = getPeers(globalPeers, ws.getUserData().namespace);
23
25
  const peer = getPeer(ws, peers);
24
26
  hooks.callHook("message", peer, new Message(message, peer));
25
27
  },
26
28
  open(ws) {
29
+ const peers = getPeers(globalPeers, ws.getUserData().namespace);
27
30
  const peer = getPeer(ws, peers);
28
31
  peers.add(peer);
29
32
  hooks.callHook("open", peer);
@@ -33,9 +36,8 @@ const uwsAdapter = (options = {}) => {
33
36
  res.onAborted(() => {
34
37
  aborted = true;
35
38
  });
36
- const { upgradeHeaders, endResponse, context } = await hooks.upgrade(
37
- new UWSReqProxy(req)
38
- );
39
+ const webReq = new UWSReqProxy(req);
40
+ const { upgradeHeaders, endResponse, context, namespace } = await hooks.upgrade(webReq);
39
41
  if (endResponse) {
40
42
  res.writeStatus(`${endResponse.status} ${endResponse.statusText}`);
41
43
  for (const [key, value] of endResponse.headers) {
@@ -70,12 +72,14 @@ const uwsAdapter = (options = {}) => {
70
72
  {
71
73
  req,
72
74
  res,
75
+ webReq,
73
76
  protocol,
74
77
  extensions,
75
- context
78
+ context,
79
+ namespace
76
80
  },
77
81
  key,
78
- protocol,
82
+ "",
79
83
  extensions,
80
84
  uwsContext
81
85
  );
@@ -93,7 +97,8 @@ function getPeer(uws, peers) {
93
97
  peers,
94
98
  uws,
95
99
  ws: new UwsWebSocketProxy(uws),
96
- request: new UWSReqProxy(uwsData.req),
100
+ request: uwsData.webReq,
101
+ namespace: uwsData.namespace,
97
102
  uwsData
98
103
  });
99
104
  uwsData.peer = peer;
@@ -138,30 +143,23 @@ class UWSPeer extends Peer {
138
143
  this._internal.uws.close();
139
144
  }
140
145
  }
141
- class UWSReqProxy {
142
- _headers;
143
- _rawHeaders = [];
144
- url;
145
- constructor(_req) {
146
+ class UWSReqProxy extends StubRequest {
147
+ constructor(req) {
148
+ const rawHeaders = [];
146
149
  let host = "localhost";
147
150
  let proto = "http";
148
- _req.forEach((key, value) => {
151
+ req.forEach((key, value) => {
149
152
  if (key === "host") {
150
153
  host = value;
151
154
  } else if (key === "x-forwarded-proto" && value === "https") {
152
155
  proto = "https";
153
156
  }
154
- this._rawHeaders.push([key, value]);
157
+ rawHeaders.push([key, value]);
155
158
  });
156
- const query = _req.getQuery();
157
- const pathname = _req.getUrl();
158
- this.url = `${proto}://${host}${pathname}${query ? `?${query}` : ""}`;
159
- }
160
- get headers() {
161
- if (!this._headers) {
162
- this._headers = new Headers(this._rawHeaders);
163
- }
164
- return this._headers;
159
+ const query = req.getQuery();
160
+ const pathname = req.getUrl();
161
+ const url = `${proto}://${host}${pathname}${query ? `?${query}` : ""}`;
162
+ super(url, { headers: rawHeaders });
165
163
  }
166
164
  }
167
165
  class UwsWebSocketProxy {
package/dist/index.d.mts CHANGED
@@ -2,11 +2,14 @@ import { W as WebSocket } from './shared/crossws.BQXMA5bH.mjs';
2
2
 
3
3
  declare const kNodeInspect: unique symbol;
4
4
 
5
+ interface PeerContext extends Record<string, unknown> {
6
+ }
5
7
  interface AdapterInternal {
6
8
  ws: unknown;
7
- request: UpgradeRequest;
9
+ request: Request;
10
+ namespace: string;
8
11
  peers?: Set<Peer>;
9
- context?: Peer["context"];
12
+ context?: PeerContext;
10
13
  }
11
14
  declare abstract class Peer<Internal extends AdapterInternal = AdapterInternal> {
12
15
  #private;
@@ -14,7 +17,8 @@ declare abstract class Peer<Internal extends AdapterInternal = AdapterInternal>
14
17
  protected _topics: Set<string>;
15
18
  protected _id?: string;
16
19
  constructor(internal: Internal);
17
- get context(): Record<string, unknown>;
20
+ get context(): PeerContext;
21
+ get namespace(): string;
18
22
  /**
19
23
  * Unique random [uuid v4](https://developer.mozilla.org/en-US/docs/Glossary/UUID) identifier for the peer.
20
24
  */
@@ -22,7 +26,7 @@ declare abstract class Peer<Internal extends AdapterInternal = AdapterInternal>
22
26
  /** IP address of the peer */
23
27
  get remoteAddress(): string | undefined;
24
28
  /** upgrade request */
25
- get request(): UpgradeRequest;
29
+ get request(): Request;
26
30
  /**
27
31
  * Get the [WebSocket](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) instance.
28
32
  *
@@ -54,15 +58,19 @@ declare abstract class Peer<Internal extends AdapterInternal = AdapterInternal>
54
58
  toString(): string;
55
59
  [Symbol.toPrimitive](): string;
56
60
  [Symbol.toStringTag](): "WebSocket";
57
- [kNodeInspect](): Record<string, unknown>;
61
+ [kNodeInspect](): unknown;
58
62
  }
59
63
 
60
64
  interface AdapterInstance {
61
- readonly peers: Set<Peer>;
62
- readonly publish: Peer["publish"];
65
+ readonly peers: Map<string, Set<Peer>>;
66
+ readonly publish: (topic: string, data: unknown, options?: {
67
+ compress?: boolean;
68
+ namespace?: string;
69
+ }) => void;
63
70
  }
64
71
  interface AdapterOptions {
65
72
  resolve?: ResolveHooks;
73
+ getNamespace?: (request: Request) => string;
66
74
  hooks?: Partial<Hooks>;
67
75
  }
68
76
  type Adapter<AdapterT extends AdapterInstance = AdapterInstance, Options extends AdapterOptions = AdapterOptions> = (options?: Options) => AdapterT;
@@ -118,28 +126,33 @@ declare class Message implements Partial<MessageEvent> {
118
126
  get data(): unknown;
119
127
  toString(): string;
120
128
  [Symbol.toPrimitive](): string;
121
- [kNodeInspect](): {
122
- data: unknown;
123
- };
129
+ [kNodeInspect](): unknown;
124
130
  }
125
131
 
126
132
  declare function defineHooks<T extends Partial<Hooks> = Partial<Hooks>>(hooks: T): T;
127
- type ResolveHooks = (info: RequestInit | Peer) => Partial<Hooks> | Promise<Partial<Hooks>>;
133
+ type ResolveHooks = (request: Request & {
134
+ readonly context?: PeerContext;
135
+ }) => Partial<Hooks> | Promise<Partial<Hooks>>;
128
136
  type MaybePromise<T> = T | Promise<T>;
129
- type UpgradeRequest = Request | {
130
- url: string;
131
- headers: Headers;
132
- };
133
137
  interface Hooks {
134
- /** Upgrading */
135
138
  /**
139
+ * Upgrading a request to a WebSocket connection.
140
+ *
141
+ * - You can throw a Response to abort the upgrade.
142
+ * - You can return { headers } to modify the response.
143
+ * - You can return { namespace } to change the pub/sub namespace.
144
+ * - You can return { context } to provide a custom peer context.
136
145
  *
137
146
  * @param request
138
147
  * @throws {Response}
139
148
  */
140
- upgrade: (request: UpgradeRequest & {
141
- context: Peer["context"];
142
- }) => MaybePromise<Response | ResponseInit | void>;
149
+ upgrade: (request: Request & {
150
+ readonly context?: Record<string, unknown>;
151
+ }) => MaybePromise<{
152
+ headers?: HeadersInit;
153
+ namespace?: string;
154
+ context?: PeerContext;
155
+ } | Response | void>;
143
156
  /** A message is received */
144
157
  message: (peer: Peer, message: Message) => MaybePromise<void>;
145
158
  /** A socket is opened */
@@ -154,4 +167,4 @@ interface Hooks {
154
167
  }
155
168
 
156
169
  export { Message, Peer, WSError, defineHooks, defineWebSocketAdapter };
157
- export type { Adapter, AdapterInstance, AdapterInternal, AdapterOptions, Hooks, ResolveHooks };
170
+ export type { Adapter, AdapterInstance, AdapterInternal, AdapterOptions, Hooks, PeerContext, ResolveHooks };
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- export { d as defineHooks, b as defineWebSocketAdapter } from './shared/crossws.D9ehKjSh.mjs';
1
+ export { d as defineHooks, b as defineWebSocketAdapter } from './shared/crossws.CPlNx7g8.mjs';
@@ -0,0 +1,24 @@
1
+ import { ServerPlugin, Server } from 'srvx/types';
2
+ import { W as WSOptions, S as ServerWithWSOptions } from '../shared/crossws.95-eYp2D.mjs';
3
+ import '../index.mjs';
4
+ import '../shared/crossws.BQXMA5bH.mjs';
5
+ import '../adapters/bun.mjs';
6
+ import 'bun';
7
+ import '../adapters/deno.mjs';
8
+ import '../adapters/node.mjs';
9
+ import 'node:http';
10
+ import 'node:stream';
11
+ import 'events';
12
+ import 'node:https';
13
+ import 'node:tls';
14
+ import 'node:url';
15
+ import 'node:zlib';
16
+ import '../adapters/sse.mjs';
17
+ import '../adapters/cloudflare.mjs';
18
+ import '@cloudflare/workers-types';
19
+ import 'cloudflare:workers';
20
+
21
+ declare function plugin(wsOpts: WSOptions): ServerPlugin;
22
+ declare function serve(options: ServerWithWSOptions): Server;
23
+
24
+ export { plugin, serve };
@@ -0,0 +1,37 @@
1
+ import { serve as serve$1 } from 'srvx/bun';
2
+ import bunAdapter from '../adapters/bun.mjs';
3
+ import '../shared/crossws.WpyOHUXc.mjs';
4
+ import '../shared/crossws.CPlNx7g8.mjs';
5
+
6
+ function plugin(wsOpts) {
7
+ return (server) => {
8
+ const ws = bunAdapter({
9
+ hooks: wsOpts,
10
+ resolve: wsOpts.resolve,
11
+ ...wsOpts.options?.bun
12
+ });
13
+ server.options.middleware.unshift((req, next) => {
14
+ if (req.headers.get("upgrade")?.toLowerCase() === "websocket") {
15
+ return ws.handleUpgrade(
16
+ req,
17
+ req.runtime.bun.server
18
+ );
19
+ }
20
+ return next();
21
+ });
22
+ server.options.bun ??= {};
23
+ if (server.options.bun.websocket) {
24
+ throw new Error("websocket handlers for bun already set!");
25
+ }
26
+ server.options.bun.websocket = ws.websocket;
27
+ };
28
+ }
29
+ function serve(options) {
30
+ if (options.websocket) {
31
+ options.plugins ||= [];
32
+ options.plugins.push(plugin(options.websocket));
33
+ }
34
+ return serve$1(options);
35
+ }
36
+
37
+ export { plugin, serve };
@@ -0,0 +1,24 @@
1
+ import { ServerPlugin, Server } from 'srvx/types';
2
+ import { W as WSOptions, S as ServerWithWSOptions } from '../shared/crossws.95-eYp2D.mjs';
3
+ import '../index.mjs';
4
+ import '../shared/crossws.BQXMA5bH.mjs';
5
+ import '../adapters/bun.mjs';
6
+ import 'bun';
7
+ import '../adapters/deno.mjs';
8
+ import '../adapters/node.mjs';
9
+ import 'node:http';
10
+ import 'node:stream';
11
+ import 'events';
12
+ import 'node:https';
13
+ import 'node:tls';
14
+ import 'node:url';
15
+ import 'node:zlib';
16
+ import '../adapters/sse.mjs';
17
+ import '../adapters/cloudflare.mjs';
18
+ import '@cloudflare/workers-types';
19
+ import 'cloudflare:workers';
20
+
21
+ declare function plugin(wsOpts: WSOptions): ServerPlugin;
22
+ declare function serve(options: ServerWithWSOptions): Server;
23
+
24
+ export { plugin, serve };
@@ -0,0 +1,36 @@
1
+ import { serve as serve$1 } from 'srvx/cloudflare';
2
+ import cloudflareAdapter from '../adapters/cloudflare.mjs';
3
+ import 'cloudflare:workers';
4
+ import '../shared/crossws.WpyOHUXc.mjs';
5
+ import '../shared/crossws.CPlNx7g8.mjs';
6
+ import '../shared/crossws.B31KJMcF.mjs';
7
+ import '../shared/crossws.By9qWDAI.mjs';
8
+
9
+ function plugin(wsOpts) {
10
+ return (server) => {
11
+ const ws = cloudflareAdapter({
12
+ hooks: wsOpts,
13
+ resolve: wsOpts.resolve,
14
+ ...wsOpts.options?.cloudflare
15
+ });
16
+ server.options.middleware.unshift((req, next) => {
17
+ if (req.headers.get("upgrade")?.toLowerCase() === "websocket") {
18
+ return ws.handleUpgrade(
19
+ req,
20
+ req.runtime.cloudflare.env,
21
+ req.runtime.cloudflare.context
22
+ );
23
+ }
24
+ return next();
25
+ });
26
+ };
27
+ }
28
+ function serve(options) {
29
+ if (options.websocket) {
30
+ options.plugins ||= [];
31
+ options.plugins.push(plugin(options.websocket));
32
+ }
33
+ return serve$1(options);
34
+ }
35
+
36
+ export { plugin, serve };
@@ -0,0 +1,24 @@
1
+ import { ServerPlugin, Server } from 'srvx/types';
2
+ import { W as WSOptions, S as ServerWithWSOptions } from '../shared/crossws.95-eYp2D.mjs';
3
+ import '../index.mjs';
4
+ import '../shared/crossws.BQXMA5bH.mjs';
5
+ import '../adapters/bun.mjs';
6
+ import 'bun';
7
+ import '../adapters/deno.mjs';
8
+ import '../adapters/node.mjs';
9
+ import 'node:http';
10
+ import 'node:stream';
11
+ import 'events';
12
+ import 'node:https';
13
+ import 'node:tls';
14
+ import 'node:url';
15
+ import 'node:zlib';
16
+ import '../adapters/sse.mjs';
17
+ import '../adapters/cloudflare.mjs';
18
+ import '@cloudflare/workers-types';
19
+ import 'cloudflare:workers';
20
+
21
+ declare function plugin(wsOpts: WSOptions): ServerPlugin;
22
+ declare function serve(options: ServerWithWSOptions): Server;
23
+
24
+ export { plugin, serve };
@@ -0,0 +1,32 @@
1
+ import { serve as serve$1 } from 'srvx';
2
+ import sseAdapter from '../adapters/sse.mjs';
3
+ import '../shared/crossws.WpyOHUXc.mjs';
4
+ import '../shared/crossws.CPlNx7g8.mjs';
5
+
6
+ function plugin(wsOpts) {
7
+ const ws = sseAdapter({
8
+ hooks: wsOpts,
9
+ resolve: wsOpts.resolve,
10
+ ...wsOpts.options?.sse
11
+ });
12
+ console.warn(
13
+ "[crossws] Using SSE adapter for WebSocket support. This requires a custom WebSocket client (https://crossws.h3.dev/adapters/sse)."
14
+ );
15
+ return (server) => {
16
+ server.options.middleware.unshift((req, next) => {
17
+ if (req.headers.get("upgrade")?.toLowerCase() === "websocket") {
18
+ return ws.fetch(req);
19
+ }
20
+ return next();
21
+ });
22
+ };
23
+ }
24
+ function serve(options) {
25
+ if (options.websocket) {
26
+ options.plugins ||= [];
27
+ options.plugins.push(plugin(options.websocket));
28
+ }
29
+ return serve$1(options);
30
+ }
31
+
32
+ export { plugin, serve };
@@ -0,0 +1,24 @@
1
+ import { ServerPlugin, Server } from 'srvx/types';
2
+ import { W as WSOptions, S as ServerWithWSOptions } from '../shared/crossws.95-eYp2D.mjs';
3
+ import '../index.mjs';
4
+ import '../shared/crossws.BQXMA5bH.mjs';
5
+ import '../adapters/bun.mjs';
6
+ import 'bun';
7
+ import '../adapters/deno.mjs';
8
+ import '../adapters/node.mjs';
9
+ import 'node:http';
10
+ import 'node:stream';
11
+ import 'events';
12
+ import 'node:https';
13
+ import 'node:tls';
14
+ import 'node:url';
15
+ import 'node:zlib';
16
+ import '../adapters/sse.mjs';
17
+ import '../adapters/cloudflare.mjs';
18
+ import '@cloudflare/workers-types';
19
+ import 'cloudflare:workers';
20
+
21
+ declare function plugin(wsOpts: WSOptions): ServerPlugin;
22
+ declare function serve(options: ServerWithWSOptions): Server;
23
+
24
+ export { plugin, serve };
@@ -0,0 +1,30 @@
1
+ import { serve as serve$1 } from 'srvx/deno';
2
+ import denoAdapter from '../adapters/deno.mjs';
3
+ import '../shared/crossws.WpyOHUXc.mjs';
4
+ import '../shared/crossws.CPlNx7g8.mjs';
5
+ import '../shared/crossws.By9qWDAI.mjs';
6
+
7
+ function plugin(wsOpts) {
8
+ return (server) => {
9
+ const ws = denoAdapter({
10
+ hooks: wsOpts,
11
+ resolve: wsOpts.resolve,
12
+ ...wsOpts.options?.deno
13
+ });
14
+ server.options.middleware.unshift((req, next) => {
15
+ if (req.headers.get("upgrade")?.toLowerCase() === "websocket") {
16
+ return ws.handleUpgrade(req, req.runtime.deno.info);
17
+ }
18
+ return next();
19
+ });
20
+ };
21
+ }
22
+ function serve(options) {
23
+ if (options.websocket) {
24
+ options.plugins ||= [];
25
+ options.plugins.push(plugin(options.websocket));
26
+ }
27
+ return serve$1(options);
28
+ }
29
+
30
+ export { plugin, serve };
@@ -0,0 +1,24 @@
1
+ import { ServerPlugin, Server } from 'srvx/types';
2
+ import { W as WSOptions, S as ServerWithWSOptions } from '../shared/crossws.95-eYp2D.mjs';
3
+ import '../index.mjs';
4
+ import '../shared/crossws.BQXMA5bH.mjs';
5
+ import '../adapters/bun.mjs';
6
+ import 'bun';
7
+ import '../adapters/deno.mjs';
8
+ import '../adapters/node.mjs';
9
+ import 'node:http';
10
+ import 'node:stream';
11
+ import 'events';
12
+ import 'node:https';
13
+ import 'node:tls';
14
+ import 'node:url';
15
+ import 'node:zlib';
16
+ import '../adapters/sse.mjs';
17
+ import '../adapters/cloudflare.mjs';
18
+ import '@cloudflare/workers-types';
19
+ import 'cloudflare:workers';
20
+
21
+ declare function plugin(wsOpts: WSOptions): ServerPlugin;
22
+ declare function serve(options: ServerWithWSOptions): Server;
23
+
24
+ export { plugin, serve };
@@ -0,0 +1,49 @@
1
+ import { NodeRequest, serve as serve$1 } from 'srvx/node';
2
+ import nodeAdapter from '../adapters/node.mjs';
3
+ import '../shared/crossws.WpyOHUXc.mjs';
4
+ import '../shared/crossws.CPlNx7g8.mjs';
5
+ import '../shared/crossws.By9qWDAI.mjs';
6
+ import '../shared/crossws.CipVM6lf.mjs';
7
+ import 'stream';
8
+ import 'events';
9
+ import 'http';
10
+ import 'crypto';
11
+ import 'buffer';
12
+ import 'zlib';
13
+ import 'https';
14
+ import 'net';
15
+ import 'tls';
16
+ import 'url';
17
+ import '../shared/crossws.B31KJMcF.mjs';
18
+
19
+ function plugin(wsOpts) {
20
+ return (server) => {
21
+ const ws = nodeAdapter({
22
+ hooks: wsOpts,
23
+ resolve: wsOpts.resolve,
24
+ ...wsOpts.options?.deno
25
+ });
26
+ const originalServe = server.serve;
27
+ server.serve = () => {
28
+ server.node?.server.on("upgrade", (req, socket, head) => {
29
+ ws.handleUpgrade(
30
+ req,
31
+ socket,
32
+ head,
33
+ // @ts-expect-error (upgrade is not typed)
34
+ new NodeRequest({ req, upgrade: { socket, head } })
35
+ );
36
+ });
37
+ return originalServe.call(server);
38
+ };
39
+ };
40
+ }
41
+ function serve(options) {
42
+ if (options.websocket) {
43
+ options.plugins ||= [];
44
+ options.plugins.push(plugin(options.websocket));
45
+ }
46
+ return serve$1(options);
47
+ }
48
+
49
+ export { plugin, serve };
@@ -0,0 +1,23 @@
1
+ import { ServerRequest, ServerOptions } from 'srvx/types';
2
+ import { Hooks } from '../index.mjs';
3
+ import { BunOptions } from '../adapters/bun.mjs';
4
+ import { DenoOptions } from '../adapters/deno.mjs';
5
+ import { NodeOptions } from '../adapters/node.mjs';
6
+ import { SSEOptions } from '../adapters/sse.mjs';
7
+ import { CloudflareOptions } from '../adapters/cloudflare.mjs';
8
+
9
+ type WSOptions = Partial<Hooks> & {
10
+ resolve?: (req: ServerRequest) => Partial<Hooks> | Promise<Partial<Hooks>>;
11
+ options?: {
12
+ bun?: BunOptions;
13
+ deno?: DenoOptions;
14
+ node?: NodeOptions;
15
+ sse?: SSEOptions;
16
+ cloudflare?: CloudflareOptions;
17
+ };
18
+ };
19
+ type ServerWithWSOptions = ServerOptions & {
20
+ websocket?: WSOptions;
21
+ };
22
+
23
+ export type { ServerWithWSOptions as S, WSOptions as W };
@@ -0,0 +1,83 @@
1
+ const StubRequest = /* @__PURE__ */ (() => {
2
+ class StubRequest2 {
3
+ url;
4
+ _signal;
5
+ _headers;
6
+ _init;
7
+ constructor(url, init = {}) {
8
+ this.url = url;
9
+ this._init = init;
10
+ }
11
+ get headers() {
12
+ if (!this._headers) {
13
+ this._headers = new Headers(this._init?.headers);
14
+ }
15
+ return this._headers;
16
+ }
17
+ clone() {
18
+ return new StubRequest2(this.url, this._init);
19
+ }
20
+ // --- dummy ---
21
+ get method() {
22
+ return "GET";
23
+ }
24
+ get signal() {
25
+ return this._signal ??= new AbortSignal();
26
+ }
27
+ get cache() {
28
+ return "default";
29
+ }
30
+ get credentials() {
31
+ return "same-origin";
32
+ }
33
+ get destination() {
34
+ return "";
35
+ }
36
+ get integrity() {
37
+ return "";
38
+ }
39
+ get keepalive() {
40
+ return false;
41
+ }
42
+ get redirect() {
43
+ return "follow";
44
+ }
45
+ get mode() {
46
+ return "cors";
47
+ }
48
+ get referrer() {
49
+ return "about:client";
50
+ }
51
+ get referrerPolicy() {
52
+ return "";
53
+ }
54
+ get body() {
55
+ return null;
56
+ }
57
+ get bodyUsed() {
58
+ return false;
59
+ }
60
+ arrayBuffer() {
61
+ return Promise.resolve(new ArrayBuffer(0));
62
+ }
63
+ blob() {
64
+ return Promise.resolve(new Blob());
65
+ }
66
+ bytes() {
67
+ return Promise.resolve(new Uint8Array());
68
+ }
69
+ formData() {
70
+ return Promise.resolve(new FormData());
71
+ }
72
+ json() {
73
+ return Promise.resolve(JSON.parse(""));
74
+ }
75
+ text() {
76
+ return Promise.resolve("");
77
+ }
78
+ }
79
+ Object.setPrototypeOf(StubRequest2.prototype, globalThis.Request.prototype);
80
+ return StubRequest2;
81
+ })();
82
+
83
+ export { StubRequest as S };