crossws 0.3.3 → 0.3.5
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 +7 -7
- package/dist/adapters/bun.d.mts +7 -6
- package/dist/adapters/bun.d.ts +7 -6
- package/dist/adapters/bun.mjs +43 -43
- package/dist/adapters/cloudflare-durable.d.mts +30 -8
- package/dist/adapters/cloudflare-durable.d.ts +30 -8
- package/dist/adapters/cloudflare-durable.mjs +18 -11
- package/dist/adapters/cloudflare.d.mts +5 -4
- package/dist/adapters/cloudflare.d.ts +5 -4
- package/dist/adapters/cloudflare.mjs +52 -54
- package/dist/adapters/deno.d.mts +5 -4
- package/dist/adapters/deno.d.ts +5 -4
- package/dist/adapters/deno.mjs +42 -44
- package/dist/adapters/node.d.mts +13 -14
- package/dist/adapters/node.d.ts +13 -14
- package/dist/adapters/node.mjs +67 -62
- package/dist/adapters/sse.d.mts +5 -4
- package/dist/adapters/sse.d.ts +5 -4
- package/dist/adapters/sse.mjs +6 -6
- package/dist/adapters/uws.d.mts +6 -4
- package/dist/adapters/uws.d.ts +6 -4
- package/dist/adapters/uws.mjs +84 -81
- package/dist/index.d.mts +13 -4
- package/dist/index.d.ts +13 -4
- package/dist/index.mjs +1 -1
- package/dist/shared/{crossws.ChIJSJVK.d.mts → crossws.BQXMA5bH.d.mts} +1 -1
- package/dist/shared/{crossws.ChIJSJVK.d.ts → crossws.BQXMA5bH.d.ts} +1 -1
- package/dist/shared/{crossws.DelSCW9g.mjs → crossws.CipVM6lf.mjs} +197 -7
- package/dist/shared/{crossws.CB4awDDj.mjs → crossws.D9ehKjSh.mjs} +19 -6
- package/dist/shared/{crossws.DLRVRjZs.mjs → crossws.DfCzGthR.mjs} +12 -5
- package/dist/websocket/native.d.mts +2 -9
- package/dist/websocket/native.d.ts +2 -9
- package/dist/websocket/native.mjs +2 -2
- package/dist/websocket/node.d.mts +2 -9
- package/dist/websocket/node.d.ts +2 -9
- package/dist/websocket/node.mjs +3 -3
- package/dist/websocket/sse.d.mts +3 -2
- package/dist/websocket/sse.d.ts +3 -2
- package/dist/websocket/sse.mjs +1 -1
- package/package.json +32 -24
package/README.md
CHANGED
|
@@ -9,13 +9,13 @@
|
|
|
9
9
|
|
|
10
10
|
Elegant, typed, and simple toolkit to implement cross-platform WebSocket servers.
|
|
11
11
|
|
|
12
|
-
👉 [📖 documentation](https://crossws.
|
|
12
|
+
👉 [📖 documentation](https://crossws.h3.dev)
|
|
13
13
|
|
|
14
14
|
## Features
|
|
15
15
|
|
|
16
|
-
🧩 Seamlessly integrates with [Bun](https://crossws.
|
|
16
|
+
🧩 Seamlessly integrates with [Bun](https://crossws.h3.dev/adapters/bun), [Cloudflare Workers](https://crossws.h3.dev/adapters/cloudflare), [Deno](https://crossws.h3.dev/adapters/deno) and [Node.js](https://crossws.h3.dev/adapters/node) and any compatible web framework.
|
|
17
17
|
|
|
18
|
-
✅ Prebundled with [ws](https://github.com/websockets/ws) for Node.js support with alternative/much faster [uWebSockets](https://crossws.
|
|
18
|
+
✅ Prebundled with [ws](https://github.com/websockets/ws) for Node.js support with alternative/much faster [uWebSockets](https://crossws.h3.dev/adapters/node#uwebsockets) adapter.
|
|
19
19
|
|
|
20
20
|
📦 Extremely lightweight and tree-shakable conditional ESM exports.
|
|
21
21
|
|
|
@@ -44,11 +44,11 @@ Elegant, typed, and simple toolkit to implement cross-platform WebSocket servers
|
|
|
44
44
|
|
|
45
45
|
<!-- automd:contributors license=MIT author="pi0" -->
|
|
46
46
|
|
|
47
|
-
Published under the [MIT](https://github.com/
|
|
48
|
-
Made by [@pi0](https://github.com/pi0) and [community](https://github.com/
|
|
47
|
+
Published under the [MIT](https://github.com/h3js/crossws/blob/main/LICENSE) license.
|
|
48
|
+
Made by [@pi0](https://github.com/pi0) and [community](https://github.com/h3js/crossws/graphs/contributors) 💛
|
|
49
49
|
<br><br>
|
|
50
|
-
<a href="https://github.com/
|
|
51
|
-
<img src="https://contrib.rocks/image?repo=
|
|
50
|
+
<a href="https://github.com/h3js/crossws/graphs/contributors">
|
|
51
|
+
<img src="https://contrib.rocks/image?repo=h3js/crossws" />
|
|
52
52
|
</a>
|
|
53
53
|
|
|
54
54
|
<!-- /automd -->
|
package/dist/adapters/bun.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import '../shared/crossws.
|
|
1
|
+
import { WebSocketHandler, ServerWebSocket, Server } from 'bun';
|
|
2
|
+
import { Adapter, AdapterInstance, Peer, AdapterOptions } from '../index.mjs';
|
|
3
|
+
import '../shared/crossws.BQXMA5bH.mjs';
|
|
4
4
|
|
|
5
5
|
interface BunAdapter extends AdapterInstance {
|
|
6
6
|
websocket: WebSocketHandler<ContextData>;
|
|
@@ -14,7 +14,7 @@ type ContextData = {
|
|
|
14
14
|
server?: Server;
|
|
15
15
|
context: Peer["context"];
|
|
16
16
|
};
|
|
17
|
-
declare const
|
|
17
|
+
declare const bunAdapter: Adapter<BunAdapter, BunOptions>;
|
|
18
18
|
|
|
19
19
|
declare class BunPeer extends Peer<{
|
|
20
20
|
ws: ServerWebSocket<ContextData>;
|
|
@@ -22,7 +22,7 @@ declare class BunPeer extends Peer<{
|
|
|
22
22
|
peers: Set<BunPeer>;
|
|
23
23
|
}> {
|
|
24
24
|
get remoteAddress(): string;
|
|
25
|
-
get context():
|
|
25
|
+
get context(): Peer["context"];
|
|
26
26
|
send(data: unknown, options?: {
|
|
27
27
|
compress?: boolean;
|
|
28
28
|
}): number;
|
|
@@ -35,4 +35,5 @@ declare class BunPeer extends Peer<{
|
|
|
35
35
|
terminate(): void;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
export {
|
|
38
|
+
export { bunAdapter as default };
|
|
39
|
+
export type { BunAdapter, BunOptions };
|
package/dist/adapters/bun.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import '../shared/crossws.
|
|
1
|
+
import { WebSocketHandler, ServerWebSocket, Server } from 'bun';
|
|
2
|
+
import { Adapter, AdapterInstance, Peer, AdapterOptions } from '../index.js';
|
|
3
|
+
import '../shared/crossws.BQXMA5bH.js';
|
|
4
4
|
|
|
5
5
|
interface BunAdapter extends AdapterInstance {
|
|
6
6
|
websocket: WebSocketHandler<ContextData>;
|
|
@@ -14,7 +14,7 @@ type ContextData = {
|
|
|
14
14
|
server?: Server;
|
|
15
15
|
context: Peer["context"];
|
|
16
16
|
};
|
|
17
|
-
declare const
|
|
17
|
+
declare const bunAdapter: Adapter<BunAdapter, BunOptions>;
|
|
18
18
|
|
|
19
19
|
declare class BunPeer extends Peer<{
|
|
20
20
|
ws: ServerWebSocket<ContextData>;
|
|
@@ -22,7 +22,7 @@ declare class BunPeer extends Peer<{
|
|
|
22
22
|
peers: Set<BunPeer>;
|
|
23
23
|
}> {
|
|
24
24
|
get remoteAddress(): string;
|
|
25
|
-
get context():
|
|
25
|
+
get context(): Peer["context"];
|
|
26
26
|
send(data: unknown, options?: {
|
|
27
27
|
compress?: boolean;
|
|
28
28
|
}): number;
|
|
@@ -35,4 +35,5 @@ declare class BunPeer extends Peer<{
|
|
|
35
35
|
terminate(): void;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
export {
|
|
38
|
+
export { bunAdapter as default };
|
|
39
|
+
export type { BunAdapter, BunOptions };
|
package/dist/adapters/bun.mjs
CHANGED
|
@@ -1,49 +1,47 @@
|
|
|
1
|
-
import { M as Message, P as Peer, t as toBufferLike } from '../shared/crossws.
|
|
2
|
-
import {
|
|
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
3
|
import 'uncrypto';
|
|
4
4
|
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
context
|
|
21
|
-
},
|
|
22
|
-
headers: upgradeHeaders
|
|
23
|
-
});
|
|
24
|
-
if (!upgradeOK) {
|
|
25
|
-
return new Response("Upgrade failed", { status: 500 });
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
websocket: {
|
|
29
|
-
message: (ws, message) => {
|
|
30
|
-
const peer = getPeer(ws, peers);
|
|
31
|
-
hooks.callHook("message", peer, new Message(message, peer));
|
|
32
|
-
},
|
|
33
|
-
open: (ws) => {
|
|
34
|
-
const peer = getPeer(ws, peers);
|
|
35
|
-
peers.add(peer);
|
|
36
|
-
hooks.callHook("open", peer);
|
|
5
|
+
const bunAdapter = (options = {}) => {
|
|
6
|
+
const hooks = new AdapterHookable(options);
|
|
7
|
+
const peers = /* @__PURE__ */ new Set();
|
|
8
|
+
return {
|
|
9
|
+
...adapterUtils(peers),
|
|
10
|
+
async handleUpgrade(request, server) {
|
|
11
|
+
const { upgradeHeaders, endResponse, context } = await hooks.upgrade(request);
|
|
12
|
+
if (endResponse) {
|
|
13
|
+
return endResponse;
|
|
14
|
+
}
|
|
15
|
+
const upgradeOK = server.upgrade(request, {
|
|
16
|
+
data: {
|
|
17
|
+
server,
|
|
18
|
+
request,
|
|
19
|
+
context
|
|
37
20
|
},
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
21
|
+
headers: upgradeHeaders
|
|
22
|
+
});
|
|
23
|
+
if (!upgradeOK) {
|
|
24
|
+
return new Response("Upgrade failed", { status: 500 });
|
|
43
25
|
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
)
|
|
26
|
+
},
|
|
27
|
+
websocket: {
|
|
28
|
+
message: (ws, message) => {
|
|
29
|
+
const peer = getPeer(ws, peers);
|
|
30
|
+
hooks.callHook("message", peer, new Message(message, peer));
|
|
31
|
+
},
|
|
32
|
+
open: (ws) => {
|
|
33
|
+
const peer = getPeer(ws, peers);
|
|
34
|
+
peers.add(peer);
|
|
35
|
+
hooks.callHook("open", peer);
|
|
36
|
+
},
|
|
37
|
+
close: (ws, code, reason) => {
|
|
38
|
+
const peer = getPeer(ws, peers);
|
|
39
|
+
peers.delete(peer);
|
|
40
|
+
hooks.callHook("close", peer, { code, reason });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
};
|
|
47
45
|
function getPeer(ws, peers) {
|
|
48
46
|
if (ws.data?.peer) {
|
|
49
47
|
return ws.data.peer;
|
|
@@ -73,9 +71,11 @@ class BunPeer extends Peer {
|
|
|
73
71
|
);
|
|
74
72
|
}
|
|
75
73
|
subscribe(topic) {
|
|
74
|
+
this._topics.add(topic);
|
|
76
75
|
this._internal.ws.subscribe(topic);
|
|
77
76
|
}
|
|
78
77
|
unsubscribe(topic) {
|
|
78
|
+
this._topics.delete(topic);
|
|
79
79
|
this._internal.ws.unsubscribe(topic);
|
|
80
80
|
}
|
|
81
81
|
close(code, reason) {
|
|
@@ -86,4 +86,4 @@ class BunPeer extends Peer {
|
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
export {
|
|
89
|
+
export { bunAdapter as default };
|
|
@@ -1,9 +1,34 @@
|
|
|
1
|
-
import { Adapter, AdapterInstance, AdapterOptions } from '../index.mjs';
|
|
2
|
-
import { W as WebSocket$1 } from '../shared/crossws.ChIJSJVK.mjs';
|
|
3
1
|
import * as CF from '@cloudflare/workers-types';
|
|
4
2
|
import { DurableObject } from 'cloudflare:workers';
|
|
3
|
+
import { Adapter, AdapterInstance, AdapterOptions } from '../index.mjs';
|
|
4
|
+
import { W as WebSocket$1 } from '../shared/crossws.BQXMA5bH.mjs';
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
type ResolveDurableStub = (req: CF.Request, env: unknown, context: CF.ExecutionContext) => CF.DurableObjectStub | Promise<CF.DurableObjectStub>;
|
|
7
|
+
interface CloudflareOptions extends AdapterOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Durable Object binding name from environment.
|
|
10
|
+
*
|
|
11
|
+
* **Note:** This option will be ignored if `resolveDurableStub` is provided.
|
|
12
|
+
*
|
|
13
|
+
* @default "$DurableObject"
|
|
14
|
+
*/
|
|
15
|
+
bindingName?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Durable Object instance name.
|
|
18
|
+
*
|
|
19
|
+
* **Note:** This option will be ignored if `resolveDurableStub` is provided.
|
|
20
|
+
*
|
|
21
|
+
* @default "crossws"
|
|
22
|
+
*/
|
|
23
|
+
instanceName?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Custom function that resolves Durable Object binding to handle the WebSocket upgrade.
|
|
26
|
+
*
|
|
27
|
+
* **Note:** This option will override `bindingName` and `instanceName`.
|
|
28
|
+
*/
|
|
29
|
+
resolveDurableStub?: ResolveDurableStub;
|
|
30
|
+
}
|
|
31
|
+
declare const cloudflareDurableAdapter: Adapter<CloudflareDurableAdapter, CloudflareOptions>;
|
|
7
32
|
|
|
8
33
|
interface CloudflareDurableAdapter extends AdapterInstance {
|
|
9
34
|
handleUpgrade(req: Request | CF.Request, env: unknown, context: CF.ExecutionContext): Promise<Response>;
|
|
@@ -12,9 +37,6 @@ interface CloudflareDurableAdapter extends AdapterInstance {
|
|
|
12
37
|
handleDurableMessage(obj: DurableObject, ws: WebSocket | CF.WebSocket | WebSocket$1, message: ArrayBuffer | string): Promise<void>;
|
|
13
38
|
handleDurableClose(obj: DurableObject, ws: WebSocket | CF.WebSocket | WebSocket$1, code: number, reason: string, wasClean: boolean): Promise<void>;
|
|
14
39
|
}
|
|
15
|
-
interface CloudflareOptions extends AdapterOptions {
|
|
16
|
-
bindingName?: string;
|
|
17
|
-
instanceName?: string;
|
|
18
|
-
}
|
|
19
40
|
|
|
20
|
-
export {
|
|
41
|
+
export { cloudflareDurableAdapter as default };
|
|
42
|
+
export type { CloudflareDurableAdapter, CloudflareOptions };
|
|
@@ -1,9 +1,34 @@
|
|
|
1
|
-
import { Adapter, AdapterInstance, AdapterOptions } from '../index.js';
|
|
2
|
-
import { W as WebSocket$1 } from '../shared/crossws.ChIJSJVK.js';
|
|
3
1
|
import * as CF from '@cloudflare/workers-types';
|
|
4
2
|
import { DurableObject } from 'cloudflare:workers';
|
|
3
|
+
import { Adapter, AdapterInstance, AdapterOptions } from '../index.js';
|
|
4
|
+
import { W as WebSocket$1 } from '../shared/crossws.BQXMA5bH.js';
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
type ResolveDurableStub = (req: CF.Request, env: unknown, context: CF.ExecutionContext) => CF.DurableObjectStub | Promise<CF.DurableObjectStub>;
|
|
7
|
+
interface CloudflareOptions extends AdapterOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Durable Object binding name from environment.
|
|
10
|
+
*
|
|
11
|
+
* **Note:** This option will be ignored if `resolveDurableStub` is provided.
|
|
12
|
+
*
|
|
13
|
+
* @default "$DurableObject"
|
|
14
|
+
*/
|
|
15
|
+
bindingName?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Durable Object instance name.
|
|
18
|
+
*
|
|
19
|
+
* **Note:** This option will be ignored if `resolveDurableStub` is provided.
|
|
20
|
+
*
|
|
21
|
+
* @default "crossws"
|
|
22
|
+
*/
|
|
23
|
+
instanceName?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Custom function that resolves Durable Object binding to handle the WebSocket upgrade.
|
|
26
|
+
*
|
|
27
|
+
* **Note:** This option will override `bindingName` and `instanceName`.
|
|
28
|
+
*/
|
|
29
|
+
resolveDurableStub?: ResolveDurableStub;
|
|
30
|
+
}
|
|
31
|
+
declare const cloudflareDurableAdapter: Adapter<CloudflareDurableAdapter, CloudflareOptions>;
|
|
7
32
|
|
|
8
33
|
interface CloudflareDurableAdapter extends AdapterInstance {
|
|
9
34
|
handleUpgrade(req: Request | CF.Request, env: unknown, context: CF.ExecutionContext): Promise<Response>;
|
|
@@ -12,9 +37,6 @@ interface CloudflareDurableAdapter extends AdapterInstance {
|
|
|
12
37
|
handleDurableMessage(obj: DurableObject, ws: WebSocket | CF.WebSocket | WebSocket$1, message: ArrayBuffer | string): Promise<void>;
|
|
13
38
|
handleDurableClose(obj: DurableObject, ws: WebSocket | CF.WebSocket | WebSocket$1, code: number, reason: string, wasClean: boolean): Promise<void>;
|
|
14
39
|
}
|
|
15
|
-
interface CloudflareOptions extends AdapterOptions {
|
|
16
|
-
bindingName?: string;
|
|
17
|
-
instanceName?: string;
|
|
18
|
-
}
|
|
19
40
|
|
|
20
|
-
export {
|
|
41
|
+
export { cloudflareDurableAdapter as default };
|
|
42
|
+
export type { CloudflareDurableAdapter, CloudflareOptions };
|
|
@@ -1,18 +1,25 @@
|
|
|
1
|
-
import { M as Message, P as Peer, t as toBufferLike } from '../shared/crossws.
|
|
2
|
-
import {
|
|
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
3
|
import 'uncrypto';
|
|
4
4
|
|
|
5
|
-
const
|
|
5
|
+
const cloudflareDurableAdapter = (opts = {}) => {
|
|
6
6
|
const hooks = new AdapterHookable(opts);
|
|
7
7
|
const peers = /* @__PURE__ */ new Set();
|
|
8
|
+
const resolveDurableStub = opts.resolveDurableStub || ((_req, env, _context) => {
|
|
9
|
+
const bindingName = opts.bindingName || "$DurableObject";
|
|
10
|
+
const binding = env[bindingName];
|
|
11
|
+
if (!binding) {
|
|
12
|
+
throw new Error(
|
|
13
|
+
`Durable Object binding "${bindingName}" not available`
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
const instanceId = binding.idFromName(opts.instanceName || "crossws");
|
|
17
|
+
return binding.get(instanceId);
|
|
18
|
+
});
|
|
8
19
|
return {
|
|
9
20
|
...adapterUtils(peers),
|
|
10
|
-
handleUpgrade: async (req, env,
|
|
11
|
-
const
|
|
12
|
-
const instanceName = opts?.instanceName ?? "crossws";
|
|
13
|
-
const binding = env[bindingName];
|
|
14
|
-
const id = binding.idFromName(instanceName);
|
|
15
|
-
const stub = binding.get(id);
|
|
21
|
+
handleUpgrade: async (req, env, context) => {
|
|
22
|
+
const stub = await resolveDurableStub(req, env, context);
|
|
16
23
|
return stub.fetch(req);
|
|
17
24
|
},
|
|
18
25
|
handleDurableInit: async (obj, state, env) => {
|
|
@@ -52,7 +59,7 @@ const cloudflareDurable = defineWebSocketAdapter((opts) => {
|
|
|
52
59
|
await hooks.callHook("close", peer, details);
|
|
53
60
|
}
|
|
54
61
|
};
|
|
55
|
-
}
|
|
62
|
+
};
|
|
56
63
|
class CloudflareDurablePeer extends Peer {
|
|
57
64
|
get peers() {
|
|
58
65
|
return new Set(
|
|
@@ -131,4 +138,4 @@ function setAttachedState(ws, state) {
|
|
|
131
138
|
ws.serializeAttachment(state);
|
|
132
139
|
}
|
|
133
140
|
|
|
134
|
-
export {
|
|
141
|
+
export { cloudflareDurableAdapter as default };
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { AdapterInstance, AdapterOptions
|
|
1
|
+
import { Adapter, AdapterInstance, AdapterOptions } from '../index.mjs';
|
|
2
2
|
import * as CF from '@cloudflare/workers-types';
|
|
3
|
-
import '../shared/crossws.
|
|
3
|
+
import '../shared/crossws.BQXMA5bH.mjs';
|
|
4
4
|
|
|
5
5
|
interface CloudflareAdapter extends AdapterInstance {
|
|
6
6
|
handleUpgrade(req: CF.Request, env: unknown, context: CF.ExecutionContext): Promise<CF.Response>;
|
|
7
7
|
}
|
|
8
8
|
interface CloudflareOptions extends AdapterOptions {
|
|
9
9
|
}
|
|
10
|
-
declare const
|
|
10
|
+
declare const cloudflareAdapter: Adapter<CloudflareAdapter, CloudflareOptions>;
|
|
11
11
|
|
|
12
|
-
export {
|
|
12
|
+
export { cloudflareAdapter as default };
|
|
13
|
+
export type { CloudflareAdapter, CloudflareOptions };
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { AdapterInstance, AdapterOptions
|
|
1
|
+
import { Adapter, AdapterInstance, AdapterOptions } from '../index.js';
|
|
2
2
|
import * as CF from '@cloudflare/workers-types';
|
|
3
|
-
import '../shared/crossws.
|
|
3
|
+
import '../shared/crossws.BQXMA5bH.js';
|
|
4
4
|
|
|
5
5
|
interface CloudflareAdapter extends AdapterInstance {
|
|
6
6
|
handleUpgrade(req: CF.Request, env: unknown, context: CF.ExecutionContext): Promise<CF.Response>;
|
|
7
7
|
}
|
|
8
8
|
interface CloudflareOptions extends AdapterOptions {
|
|
9
9
|
}
|
|
10
|
-
declare const
|
|
10
|
+
declare const cloudflareAdapter: Adapter<CloudflareAdapter, CloudflareOptions>;
|
|
11
11
|
|
|
12
|
-
export {
|
|
12
|
+
export { cloudflareAdapter as default };
|
|
13
|
+
export type { CloudflareAdapter, CloudflareOptions };
|
|
@@ -1,60 +1,58 @@
|
|
|
1
|
-
import { M as Message, P as Peer, t as toBufferLike } from '../shared/crossws.
|
|
2
|
-
import {
|
|
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
3
|
import { W as WSError } from '../shared/crossws.By9qWDAI.mjs';
|
|
4
4
|
import 'uncrypto';
|
|
5
5
|
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return endResponse;
|
|
18
|
-
}
|
|
19
|
-
const pair = new WebSocketPair();
|
|
20
|
-
const client = pair[0];
|
|
21
|
-
const server = pair[1];
|
|
22
|
-
const peer = new CloudflarePeer({
|
|
23
|
-
ws: client,
|
|
24
|
-
peers,
|
|
25
|
-
wsServer: server,
|
|
26
|
-
request,
|
|
27
|
-
cfEnv: env,
|
|
28
|
-
cfCtx,
|
|
29
|
-
context
|
|
30
|
-
});
|
|
31
|
-
peers.add(peer);
|
|
32
|
-
server.accept();
|
|
33
|
-
hooks.callHook("open", peer);
|
|
34
|
-
server.addEventListener("message", (event) => {
|
|
35
|
-
hooks.callHook(
|
|
36
|
-
"message",
|
|
37
|
-
peer,
|
|
38
|
-
new Message(event.data, peer, event)
|
|
39
|
-
);
|
|
40
|
-
});
|
|
41
|
-
server.addEventListener("error", (event) => {
|
|
42
|
-
peers.delete(peer);
|
|
43
|
-
hooks.callHook("error", peer, new WSError(event.error));
|
|
44
|
-
});
|
|
45
|
-
server.addEventListener("close", (event) => {
|
|
46
|
-
peers.delete(peer);
|
|
47
|
-
hooks.callHook("close", peer, event);
|
|
48
|
-
});
|
|
49
|
-
return new Response(null, {
|
|
50
|
-
status: 101,
|
|
51
|
-
webSocket: client,
|
|
52
|
-
headers: upgradeHeaders
|
|
53
|
-
});
|
|
6
|
+
const cloudflareAdapter = (options = {}) => {
|
|
7
|
+
const hooks = new AdapterHookable(options);
|
|
8
|
+
const peers = /* @__PURE__ */ new Set();
|
|
9
|
+
return {
|
|
10
|
+
...adapterUtils(peers),
|
|
11
|
+
handleUpgrade: async (request, env, cfCtx) => {
|
|
12
|
+
const { upgradeHeaders, endResponse, context } = await hooks.upgrade(
|
|
13
|
+
request
|
|
14
|
+
);
|
|
15
|
+
if (endResponse) {
|
|
16
|
+
return endResponse;
|
|
54
17
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
18
|
+
const pair = new WebSocketPair();
|
|
19
|
+
const client = pair[0];
|
|
20
|
+
const server = pair[1];
|
|
21
|
+
const peer = new CloudflarePeer({
|
|
22
|
+
ws: client,
|
|
23
|
+
peers,
|
|
24
|
+
wsServer: server,
|
|
25
|
+
request,
|
|
26
|
+
cfEnv: env,
|
|
27
|
+
cfCtx,
|
|
28
|
+
context
|
|
29
|
+
});
|
|
30
|
+
peers.add(peer);
|
|
31
|
+
server.accept();
|
|
32
|
+
hooks.callHook("open", peer);
|
|
33
|
+
server.addEventListener("message", (event) => {
|
|
34
|
+
hooks.callHook(
|
|
35
|
+
"message",
|
|
36
|
+
peer,
|
|
37
|
+
new Message(event.data, peer, event)
|
|
38
|
+
);
|
|
39
|
+
});
|
|
40
|
+
server.addEventListener("error", (event) => {
|
|
41
|
+
peers.delete(peer);
|
|
42
|
+
hooks.callHook("error", peer, new WSError(event.error));
|
|
43
|
+
});
|
|
44
|
+
server.addEventListener("close", (event) => {
|
|
45
|
+
peers.delete(peer);
|
|
46
|
+
hooks.callHook("close", peer, event);
|
|
47
|
+
});
|
|
48
|
+
return new Response(null, {
|
|
49
|
+
status: 101,
|
|
50
|
+
webSocket: client,
|
|
51
|
+
headers: upgradeHeaders
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
};
|
|
58
56
|
class CloudflarePeer extends Peer {
|
|
59
57
|
send(data) {
|
|
60
58
|
this._internal.wsServer.send(toBufferLike(data));
|
|
@@ -67,4 +65,4 @@ class CloudflarePeer extends Peer {
|
|
|
67
65
|
}
|
|
68
66
|
}
|
|
69
67
|
|
|
70
|
-
export {
|
|
68
|
+
export { cloudflareAdapter as default };
|
package/dist/adapters/deno.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AdapterInstance, AdapterOptions
|
|
2
|
-
import '../shared/crossws.
|
|
1
|
+
import { Adapter, AdapterInstance, AdapterOptions } from '../index.mjs';
|
|
2
|
+
import '../shared/crossws.BQXMA5bH.mjs';
|
|
3
3
|
|
|
4
4
|
interface DenoAdapter extends AdapterInstance {
|
|
5
5
|
handleUpgrade(req: Request, info: ServeHandlerInfo): Promise<Response>;
|
|
@@ -13,6 +13,7 @@ type ServeHandlerInfo = {
|
|
|
13
13
|
port: number;
|
|
14
14
|
};
|
|
15
15
|
};
|
|
16
|
-
declare const
|
|
16
|
+
declare const denoAdapter: Adapter<DenoAdapter, DenoOptions>;
|
|
17
17
|
|
|
18
|
-
export {
|
|
18
|
+
export { denoAdapter as default };
|
|
19
|
+
export type { DenoAdapter, DenoOptions };
|
package/dist/adapters/deno.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AdapterInstance, AdapterOptions
|
|
2
|
-
import '../shared/crossws.
|
|
1
|
+
import { Adapter, AdapterInstance, AdapterOptions } from '../index.js';
|
|
2
|
+
import '../shared/crossws.BQXMA5bH.js';
|
|
3
3
|
|
|
4
4
|
interface DenoAdapter extends AdapterInstance {
|
|
5
5
|
handleUpgrade(req: Request, info: ServeHandlerInfo): Promise<Response>;
|
|
@@ -13,6 +13,7 @@ type ServeHandlerInfo = {
|
|
|
13
13
|
port: number;
|
|
14
14
|
};
|
|
15
15
|
};
|
|
16
|
-
declare const
|
|
16
|
+
declare const denoAdapter: Adapter<DenoAdapter, DenoOptions>;
|
|
17
17
|
|
|
18
|
-
export {
|
|
18
|
+
export { denoAdapter as default };
|
|
19
|
+
export type { DenoAdapter, DenoOptions };
|
package/dist/adapters/deno.mjs
CHANGED
|
@@ -1,50 +1,48 @@
|
|
|
1
|
-
import { M as Message, P as Peer, t as toBufferLike } from '../shared/crossws.
|
|
2
|
-
import {
|
|
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
3
|
import { W as WSError } from '../shared/crossws.By9qWDAI.mjs';
|
|
4
4
|
import 'uncrypto';
|
|
5
5
|
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
return endResponse;
|
|
16
|
-
}
|
|
17
|
-
const upgrade = Deno.upgradeWebSocket(request, {
|
|
18
|
-
// @ts-expect-error https://github.com/denoland/deno/pull/22242
|
|
19
|
-
headers: upgradeHeaders
|
|
20
|
-
});
|
|
21
|
-
const peer = new DenoPeer({
|
|
22
|
-
ws: upgrade.socket,
|
|
23
|
-
request,
|
|
24
|
-
peers,
|
|
25
|
-
denoInfo: info,
|
|
26
|
-
context
|
|
27
|
-
});
|
|
28
|
-
peers.add(peer);
|
|
29
|
-
upgrade.socket.addEventListener("open", () => {
|
|
30
|
-
hooks.callHook("open", peer);
|
|
31
|
-
});
|
|
32
|
-
upgrade.socket.addEventListener("message", (event) => {
|
|
33
|
-
hooks.callHook("message", peer, new Message(event.data, peer, event));
|
|
34
|
-
});
|
|
35
|
-
upgrade.socket.addEventListener("close", () => {
|
|
36
|
-
peers.delete(peer);
|
|
37
|
-
hooks.callHook("close", peer, {});
|
|
38
|
-
});
|
|
39
|
-
upgrade.socket.addEventListener("error", (error) => {
|
|
40
|
-
peers.delete(peer);
|
|
41
|
-
hooks.callHook("error", peer, new WSError(error));
|
|
42
|
-
});
|
|
43
|
-
return upgrade.response;
|
|
6
|
+
const denoAdapter = (options = {}) => {
|
|
7
|
+
const hooks = new AdapterHookable(options);
|
|
8
|
+
const peers = /* @__PURE__ */ new Set();
|
|
9
|
+
return {
|
|
10
|
+
...adapterUtils(peers),
|
|
11
|
+
handleUpgrade: async (request, info) => {
|
|
12
|
+
const { upgradeHeaders, endResponse, context } = await hooks.upgrade(request);
|
|
13
|
+
if (endResponse) {
|
|
14
|
+
return endResponse;
|
|
44
15
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
16
|
+
const upgrade = Deno.upgradeWebSocket(request, {
|
|
17
|
+
// @ts-expect-error https://github.com/denoland/deno/pull/22242
|
|
18
|
+
headers: upgradeHeaders
|
|
19
|
+
});
|
|
20
|
+
const peer = new DenoPeer({
|
|
21
|
+
ws: upgrade.socket,
|
|
22
|
+
request,
|
|
23
|
+
peers,
|
|
24
|
+
denoInfo: info,
|
|
25
|
+
context
|
|
26
|
+
});
|
|
27
|
+
peers.add(peer);
|
|
28
|
+
upgrade.socket.addEventListener("open", () => {
|
|
29
|
+
hooks.callHook("open", peer);
|
|
30
|
+
});
|
|
31
|
+
upgrade.socket.addEventListener("message", (event) => {
|
|
32
|
+
hooks.callHook("message", peer, new Message(event.data, peer, event));
|
|
33
|
+
});
|
|
34
|
+
upgrade.socket.addEventListener("close", () => {
|
|
35
|
+
peers.delete(peer);
|
|
36
|
+
hooks.callHook("close", peer, {});
|
|
37
|
+
});
|
|
38
|
+
upgrade.socket.addEventListener("error", (error) => {
|
|
39
|
+
peers.delete(peer);
|
|
40
|
+
hooks.callHook("error", peer, new WSError(error));
|
|
41
|
+
});
|
|
42
|
+
return upgrade.response;
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
};
|
|
48
46
|
class DenoPeer extends Peer {
|
|
49
47
|
get remoteAddress() {
|
|
50
48
|
return this._internal.denoInfo.remoteAddr?.hostname;
|
|
@@ -68,4 +66,4 @@ class DenoPeer extends Peer {
|
|
|
68
66
|
}
|
|
69
67
|
}
|
|
70
68
|
|
|
71
|
-
export {
|
|
69
|
+
export { denoAdapter as default };
|