crossws 0.2.3 → 0.3.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 (66) hide show
  1. package/README.md +8 -9
  2. package/adapters/cloudflare-durable.d.ts +2 -0
  3. package/adapters/sse.d.ts +2 -0
  4. package/dist/adapters/bun.d.mts +25 -6
  5. package/dist/adapters/bun.d.ts +25 -6
  6. package/dist/adapters/bun.mjs +54 -62
  7. package/dist/adapters/cloudflare-durable.d.mts +20 -0
  8. package/dist/adapters/cloudflare-durable.d.ts +20 -0
  9. package/dist/adapters/cloudflare-durable.mjs +132 -0
  10. package/dist/adapters/cloudflare.d.mts +5 -5
  11. package/dist/adapters/cloudflare.d.ts +5 -5
  12. package/dist/adapters/cloudflare.mjs +56 -49
  13. package/dist/adapters/deno.d.mts +10 -3
  14. package/dist/adapters/deno.d.ts +10 -3
  15. package/dist/adapters/deno.mjs +54 -45
  16. package/dist/adapters/node.d.mts +4 -2
  17. package/dist/adapters/node.d.ts +4 -2
  18. package/dist/adapters/node.mjs +108 -71
  19. package/dist/adapters/sse.d.mts +12 -0
  20. package/dist/adapters/sse.d.ts +12 -0
  21. package/dist/adapters/sse.mjs +120 -0
  22. package/dist/adapters/uws.d.mts +45 -9
  23. package/dist/adapters/uws.d.ts +45 -9
  24. package/dist/adapters/uws.mjs +148 -124
  25. package/dist/index.d.mts +136 -4
  26. package/dist/index.d.ts +136 -4
  27. package/dist/index.mjs +1 -10
  28. package/dist/shared/crossws.B4sHId41.mjs +42 -0
  29. package/dist/shared/crossws.By9qWDAI.mjs +8 -0
  30. package/dist/shared/crossws.ChIJSJVK.d.mts +297 -0
  31. package/dist/shared/crossws.ChIJSJVK.d.ts +297 -0
  32. package/dist/shared/crossws.DTY7a69w.mjs +315 -0
  33. package/dist/shared/{crossws.a5db571c.mjs → crossws.YgHWLi0G.mjs} +284 -115
  34. package/dist/websocket/{index.d.mts → native.d.mts} +1 -1
  35. package/dist/websocket/{node.d.cts → native.d.ts} +1 -1
  36. package/dist/websocket/native.mjs +3 -0
  37. package/dist/websocket/node.d.mts +1 -1
  38. package/dist/websocket/node.d.ts +1 -1
  39. package/dist/websocket/node.mjs +1 -1
  40. package/dist/websocket/sse.d.mts +41 -0
  41. package/dist/websocket/sse.d.ts +41 -0
  42. package/dist/websocket/sse.mjs +127 -0
  43. package/package.json +78 -75
  44. package/dist/adapters/bun.cjs +0 -95
  45. package/dist/adapters/bun.d.cts +0 -17
  46. package/dist/adapters/cloudflare.cjs +0 -65
  47. package/dist/adapters/cloudflare.d.cts +0 -12
  48. package/dist/adapters/deno.cjs +0 -63
  49. package/dist/adapters/deno.d.cts +0 -15
  50. package/dist/adapters/node.cjs +0 -726
  51. package/dist/adapters/node.d.cts +0 -298
  52. package/dist/adapters/uws.cjs +0 -153
  53. package/dist/adapters/uws.d.cts +0 -19
  54. package/dist/index.cjs +0 -17
  55. package/dist/index.d.cts +0 -6
  56. package/dist/shared/crossws.2ed26345.cjs +0 -3931
  57. package/dist/shared/crossws.34cfc8d0.mjs +0 -139
  58. package/dist/shared/crossws.a2e5c71e.d.cts +0 -112
  59. package/dist/shared/crossws.a2e5c71e.d.mts +0 -112
  60. package/dist/shared/crossws.a2e5c71e.d.ts +0 -112
  61. package/dist/shared/crossws.c13afbe7.cjs +0 -146
  62. package/dist/websocket/index.cjs +0 -5
  63. package/dist/websocket/index.d.cts +0 -10
  64. package/dist/websocket/index.d.ts +0 -10
  65. package/dist/websocket/index.mjs +0 -3
  66. package/dist/websocket/node.cjs +0 -17
@@ -1,5 +1,5 @@
1
1
  declare const _default: {
2
- new (url: string | URL, protocols?: string | string[] | undefined): WebSocket;
2
+ new (url: string | URL, protocols?: string | string[]): WebSocket;
3
3
  prototype: WebSocket;
4
4
  readonly CONNECTING: 0;
5
5
  readonly OPEN: 1;
@@ -1,5 +1,5 @@
1
1
  declare const _default: {
2
- new (url: string | URL, protocols?: string | string[] | undefined): WebSocket;
2
+ new (url: string | URL, protocols?: string | string[]): WebSocket;
3
3
  prototype: WebSocket;
4
4
  readonly CONNECTING: 0;
5
5
  readonly OPEN: 1;
@@ -0,0 +1,3 @@
1
+ const native = globalThis.WebSocket;
2
+
3
+ export { native as default };
@@ -1,5 +1,5 @@
1
1
  declare const _default: {
2
- new (url: string | URL, protocols?: string | string[] | undefined): WebSocket;
2
+ new (url: string | URL, protocols?: string | string[]): WebSocket;
3
3
  prototype: WebSocket;
4
4
  readonly CONNECTING: 0;
5
5
  readonly OPEN: 1;
@@ -1,5 +1,5 @@
1
1
  declare const _default: {
2
- new (url: string | URL, protocols?: string | string[] | undefined): WebSocket;
2
+ new (url: string | URL, protocols?: string | string[]): WebSocket;
3
3
  prototype: WebSocket;
4
4
  readonly CONNECTING: 0;
5
5
  readonly OPEN: 1;
@@ -1,5 +1,5 @@
1
1
  import 'stream';
2
- import { _ as _WebSocket } from '../shared/crossws.a5db571c.mjs';
2
+ import { _ as _WebSocket } from '../shared/crossws.YgHWLi0G.mjs';
3
3
  import 'events';
4
4
  import 'http';
5
5
  import 'crypto';
@@ -0,0 +1,41 @@
1
+ import { W as WebSocket, C as CloseEvent, E as Event, M as MessageEvent, a as EventTarget } from '../shared/crossws.ChIJSJVK.mjs';
2
+
3
+ type Ctor<T> = {
4
+ prototype: T;
5
+ new (): T;
6
+ };
7
+ declare const _EventTarget: Ctor<EventTarget>;
8
+ interface WebSocketSSEOptions {
9
+ protocols?: string | string[];
10
+ /** enabled by default */
11
+ bidir?: boolean;
12
+ /** enabled by default */
13
+ stream?: boolean;
14
+ headers?: HeadersInit;
15
+ }
16
+ declare class WebSocketSSE extends _EventTarget implements WebSocket {
17
+ #private;
18
+ static CONNECTING: number;
19
+ static OPEN: number;
20
+ static CLOSING: number;
21
+ static CLOSED: number;
22
+ readonly CONNECTING = 0;
23
+ readonly OPEN = 1;
24
+ readonly CLOSING = 2;
25
+ readonly CLOSED = 3;
26
+ onclose: ((this: WebSocket, ev: CloseEvent) => any) | null;
27
+ onerror: ((this: WebSocket, ev: Event) => any) | null;
28
+ onopen: ((this: WebSocket, ev: Event) => any) | null;
29
+ onmessage: ((this: WebSocket, ev: MessageEvent<any>) => any) | null;
30
+ binaryType: BinaryType;
31
+ readyState: number;
32
+ readonly url: string;
33
+ readonly protocol: string;
34
+ readonly extensions: string;
35
+ readonly bufferedAmount: number;
36
+ constructor(url: string, init?: string | string[] | WebSocketSSEOptions);
37
+ close(_code?: number, _reason?: string): void;
38
+ send(data: any): Promise<void>;
39
+ }
40
+
41
+ export { WebSocketSSE, type WebSocketSSEOptions };
@@ -0,0 +1,41 @@
1
+ import { W as WebSocket, C as CloseEvent, E as Event, M as MessageEvent, a as EventTarget } from '../shared/crossws.ChIJSJVK.js';
2
+
3
+ type Ctor<T> = {
4
+ prototype: T;
5
+ new (): T;
6
+ };
7
+ declare const _EventTarget: Ctor<EventTarget>;
8
+ interface WebSocketSSEOptions {
9
+ protocols?: string | string[];
10
+ /** enabled by default */
11
+ bidir?: boolean;
12
+ /** enabled by default */
13
+ stream?: boolean;
14
+ headers?: HeadersInit;
15
+ }
16
+ declare class WebSocketSSE extends _EventTarget implements WebSocket {
17
+ #private;
18
+ static CONNECTING: number;
19
+ static OPEN: number;
20
+ static CLOSING: number;
21
+ static CLOSED: number;
22
+ readonly CONNECTING = 0;
23
+ readonly OPEN = 1;
24
+ readonly CLOSING = 2;
25
+ readonly CLOSED = 3;
26
+ onclose: ((this: WebSocket, ev: CloseEvent) => any) | null;
27
+ onerror: ((this: WebSocket, ev: Event) => any) | null;
28
+ onopen: ((this: WebSocket, ev: Event) => any) | null;
29
+ onmessage: ((this: WebSocket, ev: MessageEvent<any>) => any) | null;
30
+ binaryType: BinaryType;
31
+ readyState: number;
32
+ readonly url: string;
33
+ readonly protocol: string;
34
+ readonly extensions: string;
35
+ readonly bufferedAmount: number;
36
+ constructor(url: string, init?: string | string[] | WebSocketSSEOptions);
37
+ close(_code?: number, _reason?: string): void;
38
+ send(data: any): Promise<void>;
39
+ }
40
+
41
+ export { WebSocketSSE, type WebSocketSSEOptions };
@@ -0,0 +1,127 @@
1
+ const _EventTarget = EventTarget;
2
+ const defaultOptions = Object.freeze({
3
+ bidir: true,
4
+ stream: true
5
+ });
6
+ class WebSocketSSE extends _EventTarget {
7
+ static CONNECTING = 0;
8
+ static OPEN = 1;
9
+ static CLOSING = 2;
10
+ static CLOSED = 3;
11
+ CONNECTING = 0;
12
+ OPEN = 1;
13
+ CLOSING = 2;
14
+ CLOSED = 3;
15
+ /* eslint-disable unicorn/no-null */
16
+ onclose = null;
17
+ onerror = null;
18
+ onopen = null;
19
+ onmessage = null;
20
+ /* eslint-enable unicorn/no-null */
21
+ binaryType = "blob";
22
+ readyState = WebSocketSSE.CONNECTING;
23
+ url;
24
+ protocol = "";
25
+ extensions = "";
26
+ bufferedAmount = 0;
27
+ #options = {};
28
+ #sse;
29
+ #id;
30
+ #sendController;
31
+ #queue = [];
32
+ constructor(url, init) {
33
+ super();
34
+ this.url = url.replace(/^ws/, "http");
35
+ if (typeof init === "string") {
36
+ this.#options = { ...defaultOptions, protocols: init };
37
+ } else if (Array.isArray(init)) {
38
+ this.#options = { ...defaultOptions, protocols: init };
39
+ } else {
40
+ this.#options = { ...defaultOptions, ...init };
41
+ }
42
+ this.#sse = new EventSource(this.url);
43
+ this.#sse.addEventListener("open", (_sseEvent) => {
44
+ this.readyState = WebSocketSSE.OPEN;
45
+ const event = new Event("open");
46
+ this.onopen?.(event);
47
+ this.dispatchEvent(event);
48
+ });
49
+ this.#sse.addEventListener("message", (sseEvent) => {
50
+ const _event = new MessageEvent("message", {
51
+ data: sseEvent.data
52
+ });
53
+ this.onmessage?.(_event);
54
+ this.dispatchEvent(_event);
55
+ });
56
+ if (this.#options.bidir) {
57
+ this.#sse.addEventListener("crossws-id", (sseEvent) => {
58
+ this.#id = sseEvent.data;
59
+ if (this.#options.stream) {
60
+ fetch(this.url, {
61
+ method: "POST",
62
+ // @ts-expect-error
63
+ duplex: "half",
64
+ headers: {
65
+ "content-type": "application/octet-stream",
66
+ "x-crossws-id": this.#id
67
+ },
68
+ body: new ReadableStream({
69
+ start: (controller) => {
70
+ this.#sendController = controller;
71
+ },
72
+ cancel: () => {
73
+ this.#sendController = void 0;
74
+ }
75
+ }).pipeThrough(new TextEncoderStream())
76
+ }).catch(() => {
77
+ });
78
+ }
79
+ for (const data of this.#queue) {
80
+ this.send(data);
81
+ }
82
+ this.#queue = [];
83
+ });
84
+ }
85
+ this.#sse.addEventListener("error", (_sseEvent) => {
86
+ const event = new Event("error");
87
+ this.onerror?.(event);
88
+ this.dispatchEvent(event);
89
+ });
90
+ this.#sse.addEventListener("close", (_sseEvent) => {
91
+ this.readyState = WebSocketSSE.CLOSED;
92
+ const event = new Event("close");
93
+ this.onclose?.(event);
94
+ this.dispatchEvent(event);
95
+ });
96
+ }
97
+ close(_code, _reason) {
98
+ this.readyState = WebSocketSSE.CLOSING;
99
+ this.#sse.close();
100
+ this.readyState = WebSocketSSE.CLOSED;
101
+ }
102
+ async send(data) {
103
+ if (!this.#options.bidir) {
104
+ throw new Error("bdir option is not enabled!");
105
+ }
106
+ if (this.readyState !== WebSocketSSE.OPEN) {
107
+ throw new Error("WebSocket is not open!");
108
+ }
109
+ if (!this.#id) {
110
+ this.#queue.push(data);
111
+ return;
112
+ }
113
+ if (this.#sendController) {
114
+ this.#sendController.enqueue(data);
115
+ return;
116
+ }
117
+ await fetch(this.url, {
118
+ method: "POST",
119
+ headers: {
120
+ "x-crossws-id": this.#id
121
+ },
122
+ body: data
123
+ });
124
+ }
125
+ }
126
+
127
+ export { WebSocketSSE };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crossws",
3
- "version": "0.2.3",
3
+ "version": "0.3.0",
4
4
  "description": "Cross-platform WebSocket Servers for Node.js, Deno, Bun and Cloudflare Workers",
5
5
  "repository": "unjs/crossws",
6
6
  "license": "MIT",
@@ -8,57 +8,56 @@
8
8
  "type": "module",
9
9
  "exports": {
10
10
  ".": {
11
- "types": "./dist/index.d.ts",
12
- "import": "./dist/index.mjs",
13
- "require": "./dist/index.cjs"
14
- },
15
- "./websocket": {
16
- "types": {
17
- "import": "./dist/websocket/index.d.mts",
18
- "require": "./dist/websocket/index.d.cts"
19
- },
20
- "browser": "./dist/websocket/index.mjs",
21
- "worker": "./dist/websocket/index.mjs",
22
- "bun": "./dist/websocket/index.mjs",
23
- "deno": "./dist/websocket/index.mjs",
24
- "edge-light": "./dist/websocket/index.mjs",
25
- "workerd": "./dist/websocket/index.mjs",
26
- "node": {
27
- "import": "./dist/websocket/node.mjs",
28
- "require": "./dist/websocket/node.cjs"
29
- },
30
- "import": "./dist/websocket/index.mjs",
31
- "require": "./dist/websocket/index.cjs"
11
+ "types": "./dist/index.d.mts",
12
+ "default": "./dist/index.mjs"
32
13
  },
33
14
  "./adapters/bun": {
34
- "types": "./dist/adapters/bun.d.ts",
35
- "import": "./dist/adapters/bun.mjs",
36
- "require": "./dist/adapters/bun.cjs"
15
+ "types": "./dist/adapters/bun.d.mts",
16
+ "default": "./dist/adapters/bun.mjs"
37
17
  },
38
18
  "./adapters/deno": {
39
- "types": "./dist/adapters/deno.d.ts",
40
- "import": "./dist/adapters/deno.mjs",
41
- "require": "./dist/adapters/deno.cjs"
19
+ "types": "./dist/adapters/deno.d.mts",
20
+ "default": "./dist/adapters/deno.mjs"
42
21
  },
43
22
  "./adapters/cloudflare": {
44
- "types": "./dist/adapters/cloudflare.d.ts",
45
- "import": "./dist/adapters/cloudflare.mjs",
46
- "require": "./dist/adapters/cloudflare.cjs"
23
+ "types": "./dist/adapters/cloudflare.d.mts",
24
+ "default": "./dist/adapters/cloudflare.mjs"
25
+ },
26
+ "./adapters/cloudflare-durable": {
27
+ "types": "./dist/adapters/cloudflare-durable.d.mts",
28
+ "default": "./dist/adapters/cloudflare-durable.mjs"
29
+ },
30
+ "./adapters/sse": {
31
+ "types": "./dist/adapters/sse.d.mts",
32
+ "default": "./dist/adapters/sse.mjs"
47
33
  },
48
34
  "./adapters/node": {
49
- "types": "./dist/adapters/node.d.ts",
50
- "import": "./dist/adapters/node.mjs",
51
- "require": "./dist/adapters/node.cjs"
35
+ "types": "./dist/adapters/node.d.mts",
36
+ "default": "./dist/adapters/node.mjs"
52
37
  },
53
38
  "./adapters/uws": {
54
- "types": "./dist/adapters/uws.d.ts",
55
- "import": "./dist/adapters/uws.mjs",
56
- "require": "./dist/adapters/uws.cjs"
39
+ "types": "./dist/adapters/uws.d.mts",
40
+ "default": "./dist/adapters/uws.mjs"
41
+ },
42
+ "./websocket": {
43
+ "types": "./dist/websocket/native.d.mts",
44
+ "browser": "./dist/websocket/native.mjs",
45
+ "worker": "./dist/websocket/native.mjs",
46
+ "bun": "./dist/websocket/native.mjs",
47
+ "deno": "./dist/websocket/native.mjs",
48
+ "edge-light": "./dist/websocket/native.mjs",
49
+ "workerd": "./dist/websocket/native.mjs",
50
+ "node": "./dist/websocket/node.mjs",
51
+ "default": "./dist/websocket/native.mjs"
52
+ },
53
+ "./websocket/sse": {
54
+ "types": "./dist/websocket/sse.d.mts",
55
+ "default": "./dist/websocket/sse.mjs"
57
56
  }
58
57
  },
59
- "main": "./dist/index.cjs",
58
+ "main": "./dist/index.mjs",
60
59
  "module": "./dist/index.mjs",
61
- "types": "./dist/index.d.ts",
60
+ "types": "./dist/index.d.mts",
62
61
  "files": [
63
62
  "dist",
64
63
  "adapters",
@@ -66,51 +65,55 @@
66
65
  ],
67
66
  "scripts": {
68
67
  "build": "unbuild",
69
- "dev": "pnpm play:node",
70
- "lint": "eslint --cache --ext .ts,.js,.mjs,.cjs . && prettier -c src",
71
- "lint:fix": "eslint --cache --ext .ts,.js,.mjs,.cjs . --fix && prettier -c src -w",
68
+ "dev": "vitest",
69
+ "lint": "eslint --cache . && prettier -c src test",
70
+ "lint:fix": "eslint --cache . --fix && prettier -w src test",
72
71
  "prepack": "pnpm run build",
73
- "play:bun": "bun playground/bun.ts",
74
- "play:cf": "wrangler dev --port 3001",
75
- "play:deno": "deno run --unstable-sloppy-imports -A playground/deno.ts",
76
- "play:node": "jiti playground/node.ts",
77
- "play:uws": "jiti playground/uws.ts",
72
+ "play:bun": "bun --watch test/fixture/bun.ts",
73
+ "play:cf": "wrangler dev --port 3001 -c test/fixture/wrangler.toml",
74
+ "play:cf-durable": "wrangler dev --port 3001 -c test/fixture/wrangler-durable.toml",
75
+ "play:deno": "deno run --watch --unstable-byonm -A test/fixture/deno.ts",
76
+ "play:node": "jiti test/fixture/node.ts",
77
+ "play:sse": "deno run --unstable-byonm -A --watch test/fixture/sse.ts",
78
+ "play:uws": "jiti test/fixture/uws.ts",
78
79
  "release": "pnpm test && pnpm build && changelogen --release && npm publish && git push --follow-tags",
79
- "test": "pnpm lint && pnpm test:types",
80
+ "test": "pnpm lint && pnpm test:types && vitest run --coverage",
80
81
  "test:types": "tsc --noEmit --skipLibCheck"
81
82
  },
82
83
  "resolutions": {
83
84
  "crossws": "workspace:*"
84
85
  },
86
+ "dependencies": {
87
+ "uncrypto": "^0.1.3"
88
+ },
85
89
  "devDependencies": {
86
- "@cloudflare/workers-types": "^4.20240117.0",
90
+ "@cloudflare/workers-types": "^4.20240821.1",
87
91
  "@deno/types": "^0.0.1",
88
- "@types/bun": "^1.0.4",
89
- "@types/node": "^20.11.10",
90
- "@types/web": "^0.0.135",
91
- "@types/ws": "^8.5.10",
92
- "automd": "^0.3.6",
92
+ "@types/bun": "^1.1.8",
93
+ "@types/eventsource": "^1.1.15",
94
+ "@types/node": "^22.5.1",
95
+ "@types/web": "^0.0.158",
96
+ "@types/ws": "^8.5.12",
97
+ "@vitest/coverage-v8": "^2.0.5",
98
+ "automd": "^0.3.8",
93
99
  "changelogen": "^0.5.5",
94
100
  "consola": "^3.2.3",
95
- "eslint": "^8.56.0",
96
- "eslint-config-unjs": "^0.2.1",
97
- "h3": "^1.10.1",
98
- "jiti": "^1.21.0",
99
- "listhen": "^1.7.0",
100
- "prettier": "^3.2.4",
101
- "typescript": "^5.3.3",
102
- "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.33.0",
103
- "unbuild": "^2.0.0",
104
- "wrangler": "^3.25.0",
105
- "ws": "^8.16.0"
106
- },
107
- "peerDependencies": {
108
- "uWebSockets.js": "*"
109
- },
110
- "peerDependenciesMeta": {
111
- "uWebSockets.js": {
112
- "optional": true
113
- }
101
+ "eslint": "^9.9.1",
102
+ "eslint-config-unjs": "^0.3.2",
103
+ "eventsource": "^2.0.2",
104
+ "execa": "^9.3.1",
105
+ "get-port-please": "^3.1.2",
106
+ "h3": "^1.12.0",
107
+ "jiti": "2.0.0-beta.3",
108
+ "listhen": "^1.7.2",
109
+ "prettier": "^3.3.3",
110
+ "typescript": "^5.5.4",
111
+ "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.44.0",
112
+ "unbuild": "3.0.0-rc.7",
113
+ "undici": "^6.19.8",
114
+ "vitest": "^2.0.5",
115
+ "wrangler": "^3.73.0",
116
+ "ws": "^8.18.0"
114
117
  },
115
- "packageManager": "pnpm@8.15.0"
116
- }
118
+ "packageManager": "pnpm@9.9.0"
119
+ }
@@ -1,95 +0,0 @@
1
- 'use strict';
2
-
3
- const types = require('../shared/crossws.c13afbe7.cjs');
4
-
5
- const bun = types.defineWebSocketAdapter(
6
- (options = {}) => {
7
- const crossws = types.createCrossWS(options);
8
- const getPeer = (ws) => {
9
- if (ws.data?._peer) {
10
- return ws.data._peer;
11
- }
12
- const peer = new BunPeer({ bun: { ws } });
13
- ws.data = ws.data || {};
14
- ws.data._peer = peer;
15
- return peer;
16
- };
17
- return {
18
- async handleUpgrade(req, server) {
19
- const { headers } = await crossws.upgrade({
20
- url: req.url,
21
- headers: req.headers
22
- });
23
- return server.upgrade(req, {
24
- data: { req, server },
25
- headers
26
- });
27
- },
28
- websocket: {
29
- message: (ws, message) => {
30
- const peer = getPeer(ws);
31
- crossws.$callHook("bun:message", peer, ws, message);
32
- crossws.callHook("message", peer, new types.Message(message));
33
- },
34
- open: (ws) => {
35
- const peer = getPeer(ws);
36
- crossws.$callHook("bun:open", peer, ws);
37
- crossws.callHook("open", peer);
38
- },
39
- close: (ws) => {
40
- const peer = getPeer(ws);
41
- crossws.$callHook("bun:close", peer, ws);
42
- crossws.callHook("close", peer, {});
43
- },
44
- drain: (ws) => {
45
- const peer = getPeer(ws);
46
- crossws.$callHook("bun:drain", peer);
47
- },
48
- ping(ws, data) {
49
- const peer = getPeer(ws);
50
- crossws.$callHook("bun:ping", peer, ws, data);
51
- },
52
- pong(ws, data) {
53
- const peer = getPeer(ws);
54
- crossws.$callHook("bun:pong", peer, ws, data);
55
- }
56
- }
57
- };
58
- }
59
- );
60
- class BunPeer extends types.Peer {
61
- get id() {
62
- let addr = this.ctx.bun.ws.remoteAddress;
63
- if (addr.includes(":")) {
64
- addr = `[${addr}]`;
65
- }
66
- return addr;
67
- }
68
- get readyState() {
69
- return this.ctx.bun.ws.readyState;
70
- }
71
- get url() {
72
- return this.ctx.bun.ws.data.req?.url || "/";
73
- }
74
- get headers() {
75
- return this.ctx.bun.ws.data.req?.headers || new Headers();
76
- }
77
- send(message, options) {
78
- return this.ctx.bun.ws.send(types.toBufferLike(message), options?.compress);
79
- }
80
- publish(topic, message, options) {
81
- return this.ctx.bun.ws.publish(
82
- topic,
83
- types.toBufferLike(message),
84
- options?.compress
85
- );
86
- }
87
- subscribe(topic) {
88
- this.ctx.bun.ws.subscribe(topic);
89
- }
90
- unsubscribe(topic) {
91
- this.ctx.bun.ws.unsubscribe(topic);
92
- }
93
- }
94
-
95
- module.exports = bun;
@@ -1,17 +0,0 @@
1
- import { A as AdapterOptions, P as Peer, b as Adapter } from '../shared/crossws.a2e5c71e.cjs';
2
- import { WebSocketHandler, Server } from 'bun';
3
-
4
- interface BunAdapter {
5
- websocket: WebSocketHandler<ContextData>;
6
- handleUpgrade(req: Request, server: Server): Promise<boolean>;
7
- }
8
- interface BunOptions extends AdapterOptions {
9
- }
10
- type ContextData = {
11
- _peer?: Peer;
12
- req?: Request;
13
- server?: Server;
14
- };
15
- declare const _default: Adapter<BunAdapter, BunOptions>;
16
-
17
- export { type BunAdapter, type BunOptions, _default as default };
@@ -1,65 +0,0 @@
1
- 'use strict';
2
-
3
- const types = require('../shared/crossws.c13afbe7.cjs');
4
- const index = require('../index.cjs');
5
-
6
- const cloudflare = types.defineWebSocketAdapter(
7
- (options = {}) => {
8
- const crossws = types.createCrossWS(options);
9
- const handleUpgrade = async (req, env, context) => {
10
- const pair = new WebSocketPair();
11
- const client = pair[0];
12
- const server = pair[1];
13
- const peer = new CloudflarePeer({
14
- cloudflare: { client, server, req, env, context }
15
- });
16
- const { headers } = await crossws.upgrade(peer);
17
- server.accept();
18
- crossws.$callHook("cloudflare:accept", peer);
19
- crossws.callHook("open", peer);
20
- server.addEventListener("message", (event) => {
21
- crossws.$callHook("cloudflare:message", peer, event);
22
- crossws.callHook("message", peer, new types.Message(event.data));
23
- });
24
- server.addEventListener("error", (event) => {
25
- crossws.$callHook("cloudflare:error", peer, event);
26
- crossws.callHook("error", peer, new index.WSError(event.error));
27
- });
28
- server.addEventListener("close", (event) => {
29
- crossws.$callHook("cloudflare:close", peer, event);
30
- crossws.callHook("close", peer, {
31
- code: event.code,
32
- reason: event.reason
33
- });
34
- });
35
- return new Response(null, {
36
- status: 101,
37
- webSocket: client,
38
- headers
39
- });
40
- };
41
- return {
42
- handleUpgrade
43
- };
44
- }
45
- );
46
- class CloudflarePeer extends types.Peer {
47
- get id() {
48
- return void 0;
49
- }
50
- get url() {
51
- return this.ctx.cloudflare.req.url;
52
- }
53
- get headers() {
54
- return this.ctx.cloudflare.req.headers;
55
- }
56
- get readyState() {
57
- return this.ctx.cloudflare.client.readyState;
58
- }
59
- send(message) {
60
- this.ctx.cloudflare.server.send(types.toBufferLike(message));
61
- return 0;
62
- }
63
- }
64
-
65
- module.exports = cloudflare;
@@ -1,12 +0,0 @@
1
- import { A as AdapterOptions, b as Adapter } from '../shared/crossws.a2e5c71e.cjs';
2
- import * as _cf from '@cloudflare/workers-types';
3
-
4
- type Env = Record<string, any>;
5
- interface CloudflareAdapter {
6
- handleUpgrade(req: _cf.Request, env: Env, context: _cf.ExecutionContext): Promise<_cf.Response>;
7
- }
8
- interface CloudflareOptions extends AdapterOptions {
9
- }
10
- declare const _default: Adapter<CloudflareAdapter, CloudflareOptions>;
11
-
12
- export { type CloudflareAdapter, type CloudflareOptions, _default as default };