crossws 0.3.4 → 0.4.0

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 (61) hide show
  1. package/README.md +7 -7
  2. package/adapters/bun.d.ts +2 -2
  3. package/adapters/cloudflare.d.ts +2 -2
  4. package/adapters/deno.d.ts +2 -2
  5. package/adapters/node.d.ts +2 -2
  6. package/adapters/sse.d.ts +2 -2
  7. package/adapters/uws.d.ts +2 -2
  8. package/dist/adapters/bun.d.mts +9 -6
  9. package/dist/adapters/bun.mjs +23 -13
  10. package/dist/adapters/cloudflare.d.mts +41 -7
  11. package/dist/adapters/cloudflare.mjs +172 -14
  12. package/dist/adapters/deno.d.mts +4 -3
  13. package/dist/adapters/deno.mjs +18 -9
  14. package/dist/adapters/node.d.mts +8 -7
  15. package/dist/adapters/node.mjs +39 -33
  16. package/dist/adapters/sse.d.mts +4 -3
  17. package/dist/adapters/sse.mjs +9 -8
  18. package/dist/adapters/uws.d.mts +15 -11
  19. package/dist/adapters/uws.mjs +25 -27
  20. package/dist/index.d.mts +35 -21
  21. package/dist/index.mjs +1 -1
  22. package/dist/server/bun.d.mts +24 -0
  23. package/dist/server/bun.mjs +37 -0
  24. package/dist/server/cloudflare.d.mts +24 -0
  25. package/dist/server/cloudflare.mjs +36 -0
  26. package/dist/server/default.d.mts +24 -0
  27. package/dist/server/default.mjs +32 -0
  28. package/dist/server/deno.d.mts +24 -0
  29. package/dist/server/deno.mjs +30 -0
  30. package/dist/server/node.d.mts +24 -0
  31. package/dist/server/node.mjs +43 -0
  32. package/dist/shared/crossws.95-eYp2D.d.mts +23 -0
  33. package/dist/shared/crossws.B31KJMcF.mjs +83 -0
  34. package/dist/shared/{crossws.ChIJSJVK.d.mts → crossws.BQXMA5bH.d.mts} +1 -1
  35. package/dist/shared/{crossws.D9ehKjSh.mjs → crossws.CPlNx7g8.mjs} +44 -25
  36. package/dist/shared/{crossws.DelSCW9g.mjs → crossws.CipVM6lf.mjs} +197 -7
  37. package/dist/shared/{crossws.BS81iGZK.mjs → crossws.WpyOHUXc.mjs} +21 -16
  38. package/dist/websocket/node.mjs +1 -1
  39. package/dist/websocket/sse.d.mts +3 -2
  40. package/dist/websocket/sse.mjs +1 -1
  41. package/package.json +61 -64
  42. package/server/bun.d.ts +2 -0
  43. package/server/deno.d.ts +2 -0
  44. package/server/node.d.ts +2 -0
  45. package/server.d.ts +2 -0
  46. package/websocket/sse.d.ts +2 -0
  47. package/websocket.d.ts +2 -2
  48. package/dist/adapters/bun.d.ts +0 -38
  49. package/dist/adapters/cloudflare-durable.d.mts +0 -41
  50. package/dist/adapters/cloudflare-durable.d.ts +0 -41
  51. package/dist/adapters/cloudflare-durable.mjs +0 -141
  52. package/dist/adapters/cloudflare.d.ts +0 -12
  53. package/dist/adapters/deno.d.ts +0 -18
  54. package/dist/adapters/node.d.ts +0 -298
  55. package/dist/adapters/sse.d.ts +0 -12
  56. package/dist/adapters/uws.d.ts +0 -58
  57. package/dist/index.d.ts +0 -156
  58. package/dist/shared/crossws.ChIJSJVK.d.ts +0 -297
  59. package/dist/websocket/native.d.ts +0 -3
  60. package/dist/websocket/node.d.ts +0 -3
  61. package/dist/websocket/sse.d.ts +0 -41
@@ -1,9 +1,9 @@
1
- import { M as Message, P as Peer, t as toBufferLike } from '../shared/crossws.BS81iGZK.mjs';
2
- import { a as adapterUtils, A as AdapterHookable } from '../shared/crossws.D9ehKjSh.mjs';
1
+ import { M as Message, P as Peer, t as toBufferLike } from '../shared/crossws.WpyOHUXc.mjs';
2
+ import { g as getPeers, A as AdapterHookable, a as adapterUtils } from '../shared/crossws.CPlNx7g8.mjs';
3
3
  import { W as WSError } from '../shared/crossws.By9qWDAI.mjs';
4
+ import { _ as _WebSocketServer } from '../shared/crossws.CipVM6lf.mjs';
5
+ import { S as StubRequest } from '../shared/crossws.B31KJMcF.mjs';
4
6
  import 'stream';
5
- import { _ as _WebSocketServer } from '../shared/crossws.DelSCW9g.mjs';
6
- import 'uncrypto';
7
7
  import 'events';
8
8
  import 'http';
9
9
  import 'crypto';
@@ -15,15 +15,28 @@ import 'tls';
15
15
  import 'url';
16
16
 
17
17
  const nodeAdapter = (options = {}) => {
18
+ if ("Deno" in globalThis || "Bun" in globalThis) {
19
+ throw new Error(
20
+ "[crossws] Using Node.js adapter in an incompatible environment."
21
+ );
22
+ }
18
23
  const hooks = new AdapterHookable(options);
19
- const peers = /* @__PURE__ */ new Set();
24
+ const globalPeers = /* @__PURE__ */ new Map();
20
25
  const wss = options.wss || new _WebSocketServer({
21
26
  noServer: true,
27
+ handleProtocols: () => false,
22
28
  ...options.serverOptions
23
29
  });
24
30
  wss.on("connection", (ws, nodeReq) => {
25
31
  const request = new NodeReqProxy(nodeReq);
26
- const peer = new NodePeer({ ws, request, peers, nodeReq });
32
+ const peers = getPeers(globalPeers, nodeReq._namespace);
33
+ const peer = new NodePeer({
34
+ ws,
35
+ request,
36
+ peers,
37
+ nodeReq,
38
+ namespace: nodeReq._namespace
39
+ });
27
40
  peers.add(peer);
28
41
  hooks.callHook("open", peer);
29
42
  ws.on("message", (data) => {
@@ -53,23 +66,28 @@ const nodeAdapter = (options = {}) => {
53
66
  }
54
67
  });
55
68
  return {
56
- ...adapterUtils(peers),
57
- handleUpgrade: async (nodeReq, socket, head) => {
58
- const request = new NodeReqProxy(nodeReq);
59
- const { upgradeHeaders, endResponse, context } = await hooks.upgrade(request);
69
+ ...adapterUtils(globalPeers),
70
+ handleUpgrade: async (nodeReq, socket, head, webRequest) => {
71
+ const request = webRequest || new NodeReqProxy(nodeReq);
72
+ const { upgradeHeaders, endResponse, context, namespace } = await hooks.upgrade(request);
60
73
  if (endResponse) {
61
74
  return sendResponse(socket, endResponse);
62
75
  }
63
76
  nodeReq._request = request;
64
77
  nodeReq._upgradeHeaders = upgradeHeaders;
65
78
  nodeReq._context = context;
79
+ nodeReq._namespace = namespace;
66
80
  wss.handleUpgrade(nodeReq, socket, head, (ws) => {
67
81
  wss.emit("connection", ws, nodeReq);
68
82
  });
69
83
  },
70
- closeAll: (code, data) => {
84
+ closeAll: (code, data, force) => {
71
85
  for (const client of wss.clients) {
72
- client.close(code, data);
86
+ if (force) {
87
+ client.terminate();
88
+ } else {
89
+ client.close(code, data);
90
+ }
73
91
  }
74
92
  }
75
93
  };
@@ -112,27 +130,12 @@ class NodePeer extends Peer {
112
130
  this._internal.ws.terminate();
113
131
  }
114
132
  }
115
- class NodeReqProxy {
116
- _req;
117
- _headers;
118
- _url;
133
+ class NodeReqProxy extends StubRequest {
119
134
  constructor(req) {
120
- this._req = req;
121
- }
122
- get url() {
123
- if (!this._url) {
124
- const req = this._req;
125
- const host = req.headers["host"] || "localhost";
126
- const isSecure = req.socket?.encrypted ?? req.headers["x-forwarded-proto"] === "https";
127
- this._url = `${isSecure ? "https" : "http"}://${host}${req.url}`;
128
- }
129
- return this._url;
130
- }
131
- get headers() {
132
- if (!this._headers) {
133
- this._headers = new Headers(this._req.headers);
134
- }
135
- return this._headers;
135
+ const host = req.headers["host"] || "localhost";
136
+ const isSecure = req.socket?.encrypted ?? req.headers["x-forwarded-proto"] === "https";
137
+ const url = `${isSecure ? "https" : "http"}://${host}${req.url}`;
138
+ super(url, { headers: req.headers });
136
139
  }
137
140
  }
138
141
  async function sendResponse(socket, res) {
@@ -149,7 +152,10 @@ async function sendResponse(socket, res) {
149
152
  }
150
153
  }
151
154
  return new Promise((resolve) => {
152
- socket.end(resolve);
155
+ socket.end(() => {
156
+ socket.destroy();
157
+ resolve();
158
+ });
153
159
  });
154
160
  }
155
161
 
@@ -1,5 +1,5 @@
1
- import { AdapterInstance, AdapterOptions, Adapter } from '../index.mjs';
2
- import '../shared/crossws.ChIJSJVK.mjs';
1
+ import { Adapter, AdapterInstance, AdapterOptions } from '../index.mjs';
2
+ import '../shared/crossws.BQXMA5bH.mjs';
3
3
 
4
4
  interface SSEAdapter extends AdapterInstance {
5
5
  fetch(req: Request): Promise<Response>;
@@ -9,4 +9,5 @@ interface SSEOptions extends AdapterOptions {
9
9
  }
10
10
  declare const sseAdapter: Adapter<SSEAdapter, SSEOptions>;
11
11
 
12
- export { type SSEAdapter, type SSEOptions, sseAdapter as default };
12
+ export { sseAdapter as default };
13
+ export type { SSEAdapter, SSEOptions };
@@ -1,15 +1,14 @@
1
- import { M as Message, P as Peer, a as toString } from '../shared/crossws.BS81iGZK.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, a as toString } from '../shared/crossws.WpyOHUXc.mjs';
2
+ import { a as adapterUtils, A as AdapterHookable, g as getPeers } from '../shared/crossws.CPlNx7g8.mjs';
4
3
 
5
4
  const sseAdapter = (opts = {}) => {
6
5
  const hooks = new AdapterHookable(opts);
7
- const peers = /* @__PURE__ */ new Set();
8
- const peersMap = opts.bidir ? /* @__PURE__ */ new Map() : undefined;
6
+ const globalPeers = /* @__PURE__ */ new Map();
7
+ const peersMap = opts.bidir ? /* @__PURE__ */ new Map() : void 0;
9
8
  return {
10
- ...adapterUtils(peers),
9
+ ...adapterUtils(globalPeers),
11
10
  fetch: async (request) => {
12
- const { upgradeHeaders, endResponse, context } = await hooks.upgrade(request);
11
+ const { upgradeHeaders, endResponse, context, namespace } = await hooks.upgrade(request);
13
12
  if (endResponse) {
14
13
  return endResponse;
15
14
  }
@@ -32,13 +31,15 @@ const sseAdapter = (opts = {}) => {
32
31
  return new Response(null, {});
33
32
  } else {
34
33
  const ws = new SSEWebSocketStub();
34
+ const peers = getPeers(globalPeers, namespace);
35
35
  peer = new SSEPeer({
36
36
  peers,
37
37
  peersMap,
38
38
  request,
39
39
  hooks,
40
40
  ws,
41
- context
41
+ context,
42
+ namespace
42
43
  });
43
44
  peers.add(peer);
44
45
  if (opts.bidir) {
@@ -1,14 +1,20 @@
1
- import { AdapterInstance, AdapterOptions, Adapter, Peer } from '../index.mjs';
2
- import { W as WebSocket } from '../shared/crossws.ChIJSJVK.mjs';
1
+ import { Adapter, AdapterInstance, Peer, PeerContext, AdapterOptions } from '../index.mjs';
2
+ import { W as WebSocket } from '../shared/crossws.BQXMA5bH.mjs';
3
3
  import uws from 'uWebSockets.js';
4
4
 
5
+ declare const StubRequest: {
6
+ new (url: string, init?: RequestInit): Request;
7
+ };
8
+
5
9
  type UserData = {
6
10
  peer?: UWSPeer;
7
11
  req: uws.HttpRequest;
8
12
  res: uws.HttpResponse;
13
+ webReq: UWSReqProxy;
9
14
  protocol: string;
10
15
  extensions: string;
11
- context: Peer["context"];
16
+ context: PeerContext;
17
+ namespace: string;
12
18
  };
13
19
  type WebSocketHandler = uws.WebSocketBehavior<UserData>;
14
20
  interface UWSAdapter extends AdapterInstance {
@@ -22,12 +28,13 @@ declare const uwsAdapter: Adapter<UWSAdapter, UWSOptions>;
22
28
  declare class UWSPeer extends Peer<{
23
29
  peers: Set<UWSPeer>;
24
30
  request: UWSReqProxy;
31
+ namespace: string;
25
32
  uws: uws.WebSocket<UserData>;
26
33
  ws: UwsWebSocketProxy;
27
34
  uwsData: UserData;
28
35
  }> {
29
36
  get remoteAddress(): string | undefined;
30
- get context(): Record<string, unknown>;
37
+ get context(): PeerContext;
31
38
  send(data: unknown, options?: {
32
39
  compress?: boolean;
33
40
  }): number;
@@ -39,12 +46,8 @@ declare class UWSPeer extends Peer<{
39
46
  close(code?: number, reason?: uws.RecognizedString): void;
40
47
  terminate(): void;
41
48
  }
42
- declare class UWSReqProxy {
43
- private _headers?;
44
- private _rawHeaders;
45
- url: string;
46
- constructor(_req: uws.HttpRequest);
47
- get headers(): Headers;
49
+ declare class UWSReqProxy extends StubRequest {
50
+ constructor(req: uws.HttpRequest);
48
51
  }
49
52
  declare class UwsWebSocketProxy implements Partial<WebSocket> {
50
53
  private _uws;
@@ -55,4 +58,5 @@ declare class UwsWebSocketProxy implements Partial<WebSocket> {
55
58
  get extensions(): string;
56
59
  }
57
60
 
58
- export { type UWSAdapter, type UWSOptions, uwsAdapter as default };
61
+ export { uwsAdapter as default };
62
+ export type { UWSAdapter, UWSOptions };
@@ -1,15 +1,16 @@
1
- import { M as Message, P as Peer, t as toBufferLike } from '../shared/crossws.BS81iGZK.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
@@ -1,12 +1,15 @@
1
- import { W as WebSocket } from './shared/crossws.ChIJSJVK.mjs';
1
+ 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 */
@@ -153,4 +166,5 @@ interface Hooks {
153
166
  error: (peer: Peer, error: WSError) => MaybePromise<void>;
154
167
  }
155
168
 
156
- export { type Adapter, type AdapterInstance, type AdapterOptions, type Hooks, Message, Peer, type ResolveHooks, WSError, defineHooks, defineWebSocketAdapter };
169
+ export { Message, Peer, WSError, defineHooks, defineWebSocketAdapter };
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 };