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.
- package/README.md +8 -9
- package/adapters/cloudflare-durable.d.ts +2 -0
- package/adapters/sse.d.ts +2 -0
- package/dist/adapters/bun.d.mts +25 -6
- package/dist/adapters/bun.d.ts +25 -6
- package/dist/adapters/bun.mjs +54 -62
- package/dist/adapters/cloudflare-durable.d.mts +20 -0
- package/dist/adapters/cloudflare-durable.d.ts +20 -0
- package/dist/adapters/cloudflare-durable.mjs +132 -0
- package/dist/adapters/cloudflare.d.mts +5 -5
- package/dist/adapters/cloudflare.d.ts +5 -5
- package/dist/adapters/cloudflare.mjs +56 -49
- package/dist/adapters/deno.d.mts +10 -3
- package/dist/adapters/deno.d.ts +10 -3
- package/dist/adapters/deno.mjs +54 -45
- package/dist/adapters/node.d.mts +4 -2
- package/dist/adapters/node.d.ts +4 -2
- package/dist/adapters/node.mjs +108 -71
- package/dist/adapters/sse.d.mts +12 -0
- package/dist/adapters/sse.d.ts +12 -0
- package/dist/adapters/sse.mjs +120 -0
- package/dist/adapters/uws.d.mts +45 -9
- package/dist/adapters/uws.d.ts +45 -9
- package/dist/adapters/uws.mjs +148 -124
- package/dist/index.d.mts +136 -4
- package/dist/index.d.ts +136 -4
- package/dist/index.mjs +1 -10
- package/dist/shared/crossws.B4sHId41.mjs +42 -0
- package/dist/shared/crossws.By9qWDAI.mjs +8 -0
- package/dist/shared/crossws.ChIJSJVK.d.mts +297 -0
- package/dist/shared/crossws.ChIJSJVK.d.ts +297 -0
- package/dist/shared/crossws.DTY7a69w.mjs +315 -0
- package/dist/shared/{crossws.a5db571c.mjs → crossws.YgHWLi0G.mjs} +284 -115
- package/dist/websocket/{index.d.mts → native.d.mts} +1 -1
- package/dist/websocket/{node.d.cts → native.d.ts} +1 -1
- package/dist/websocket/native.mjs +3 -0
- package/dist/websocket/node.d.mts +1 -1
- package/dist/websocket/node.d.ts +1 -1
- package/dist/websocket/node.mjs +1 -1
- package/dist/websocket/sse.d.mts +41 -0
- package/dist/websocket/sse.d.ts +41 -0
- package/dist/websocket/sse.mjs +127 -0
- package/package.json +78 -75
- package/dist/adapters/bun.cjs +0 -95
- package/dist/adapters/bun.d.cts +0 -17
- package/dist/adapters/cloudflare.cjs +0 -65
- package/dist/adapters/cloudflare.d.cts +0 -12
- package/dist/adapters/deno.cjs +0 -63
- package/dist/adapters/deno.d.cts +0 -15
- package/dist/adapters/node.cjs +0 -726
- package/dist/adapters/node.d.cts +0 -298
- package/dist/adapters/uws.cjs +0 -153
- package/dist/adapters/uws.d.cts +0 -19
- package/dist/index.cjs +0 -17
- package/dist/index.d.cts +0 -6
- package/dist/shared/crossws.2ed26345.cjs +0 -3931
- package/dist/shared/crossws.34cfc8d0.mjs +0 -139
- package/dist/shared/crossws.a2e5c71e.d.cts +0 -112
- package/dist/shared/crossws.a2e5c71e.d.mts +0 -112
- package/dist/shared/crossws.a2e5c71e.d.ts +0 -112
- package/dist/shared/crossws.c13afbe7.cjs +0 -146
- package/dist/websocket/index.cjs +0 -5
- package/dist/websocket/index.d.cts +0 -10
- package/dist/websocket/index.d.ts +0 -10
- package/dist/websocket/index.mjs +0 -3
- package/dist/websocket/node.cjs +0 -17
package/dist/websocket/node.d.ts
CHANGED
package/dist/websocket/node.mjs
CHANGED
|
@@ -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.
|
|
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.
|
|
12
|
-
"
|
|
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.
|
|
35
|
-
"
|
|
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.
|
|
40
|
-
"
|
|
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.
|
|
45
|
-
"
|
|
46
|
-
|
|
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.
|
|
50
|
-
"
|
|
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.
|
|
55
|
-
"
|
|
56
|
-
|
|
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.
|
|
58
|
+
"main": "./dist/index.mjs",
|
|
60
59
|
"module": "./dist/index.mjs",
|
|
61
|
-
"types": "./dist/index.d.
|
|
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": "
|
|
70
|
-
"lint": "eslint --cache
|
|
71
|
-
"lint:fix": "eslint --cache
|
|
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
|
|
74
|
-
"play:cf": "wrangler dev --port 3001",
|
|
75
|
-
"play:
|
|
76
|
-
"play:
|
|
77
|
-
"play:
|
|
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.
|
|
90
|
+
"@cloudflare/workers-types": "^4.20240821.1",
|
|
87
91
|
"@deno/types": "^0.0.1",
|
|
88
|
-
"@types/bun": "^1.
|
|
89
|
-
"@types/
|
|
90
|
-
"@types/
|
|
91
|
-
"@types/
|
|
92
|
-
"
|
|
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": "^
|
|
96
|
-
"eslint-config-unjs": "^0.2
|
|
97
|
-
"
|
|
98
|
-
"
|
|
99
|
-
"
|
|
100
|
-
"
|
|
101
|
-
"
|
|
102
|
-
"
|
|
103
|
-
"
|
|
104
|
-
"
|
|
105
|
-
"
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
"
|
|
109
|
-
|
|
110
|
-
|
|
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@
|
|
116
|
-
}
|
|
118
|
+
"packageManager": "pnpm@9.9.0"
|
|
119
|
+
}
|
package/dist/adapters/bun.cjs
DELETED
|
@@ -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;
|
package/dist/adapters/bun.d.cts
DELETED
|
@@ -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 };
|