crossws 0.3.5 → 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.
- package/adapters/bun.d.ts +2 -2
- package/adapters/cloudflare.d.ts +2 -2
- package/adapters/deno.d.ts +2 -2
- package/adapters/node.d.ts +2 -2
- package/adapters/sse.d.ts +2 -2
- package/adapters/uws.d.ts +2 -2
- package/dist/adapters/bun.d.mts +5 -3
- package/dist/adapters/bun.mjs +23 -13
- package/dist/adapters/cloudflare.d.mts +40 -7
- package/dist/adapters/cloudflare.mjs +172 -14
- package/dist/adapters/deno.mjs +18 -9
- package/dist/adapters/node.d.mts +1 -1
- package/dist/adapters/node.mjs +28 -29
- package/dist/adapters/sse.mjs +8 -7
- package/dist/adapters/uws.d.mts +12 -9
- package/dist/adapters/uws.mjs +25 -27
- package/dist/index.d.mts +33 -20
- package/dist/index.mjs +1 -1
- package/dist/server/bun.d.mts +24 -0
- package/dist/server/bun.mjs +37 -0
- package/dist/server/cloudflare.d.mts +24 -0
- package/dist/server/cloudflare.mjs +36 -0
- package/dist/server/default.d.mts +24 -0
- package/dist/server/default.mjs +32 -0
- package/dist/server/deno.d.mts +24 -0
- package/dist/server/deno.mjs +30 -0
- package/dist/server/node.d.mts +24 -0
- package/dist/server/node.mjs +43 -0
- package/dist/shared/crossws.95-eYp2D.d.mts +23 -0
- package/dist/shared/crossws.B31KJMcF.mjs +83 -0
- package/dist/shared/{crossws.D9ehKjSh.mjs → crossws.CPlNx7g8.mjs} +44 -25
- package/dist/shared/{crossws.DfCzGthR.mjs → crossws.WpyOHUXc.mjs} +18 -13
- package/package.json +42 -53
- package/server/bun.d.ts +2 -0
- package/server/deno.d.ts +2 -0
- package/server/node.d.ts +2 -0
- package/server.d.ts +2 -0
- package/websocket/sse.d.ts +2 -0
- package/websocket.d.ts +2 -2
- package/dist/adapters/bun.d.ts +0 -39
- package/dist/adapters/cloudflare-durable.d.mts +0 -42
- package/dist/adapters/cloudflare-durable.d.ts +0 -42
- package/dist/adapters/cloudflare-durable.mjs +0 -141
- package/dist/adapters/cloudflare.d.ts +0 -13
- package/dist/adapters/deno.d.ts +0 -19
- package/dist/adapters/node.d.ts +0 -299
- package/dist/adapters/sse.d.ts +0 -13
- package/dist/adapters/uws.d.ts +0 -59
- package/dist/index.d.ts +0 -157
- package/dist/shared/crossws.BQXMA5bH.d.ts +0 -297
- package/dist/websocket/native.d.ts +0 -3
- package/dist/websocket/node.d.ts +0 -3
- package/dist/websocket/sse.d.ts +0 -42
package/dist/adapters/uws.mjs
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import { M as Message, P as Peer, t as toBufferLike } from '../shared/crossws.
|
|
2
|
-
import { a as adapterUtils, A as AdapterHookable } from '../shared/crossws.
|
|
3
|
-
import '
|
|
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
|
|
7
|
+
const globalPeers = /* @__PURE__ */ new Map();
|
|
8
8
|
return {
|
|
9
|
-
...adapterUtils(
|
|
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
|
|
37
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
143
|
-
|
|
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
|
-
|
|
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
|
-
|
|
157
|
+
rawHeaders.push([key, value]);
|
|
155
158
|
});
|
|
156
|
-
const query =
|
|
157
|
-
const pathname =
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
get headers() {
|
|
161
|
-
if (!this._headers) {
|
|
162
|
-
this._headers = new Headers(this._rawHeaders);
|
|
163
|
-
}
|
|
164
|
-
return this._headers;
|
|
159
|
+
const query = req.getQuery();
|
|
160
|
+
const pathname = req.getUrl();
|
|
161
|
+
const url = `${proto}://${host}${pathname}${query ? `?${query}` : ""}`;
|
|
162
|
+
super(url, { headers: rawHeaders });
|
|
165
163
|
}
|
|
166
164
|
}
|
|
167
165
|
class UwsWebSocketProxy {
|
package/dist/index.d.mts
CHANGED
|
@@ -2,11 +2,14 @@ import { W as WebSocket } from './shared/crossws.BQXMA5bH.mjs';
|
|
|
2
2
|
|
|
3
3
|
declare const kNodeInspect: unique symbol;
|
|
4
4
|
|
|
5
|
+
interface PeerContext extends Record<string, unknown> {
|
|
6
|
+
}
|
|
5
7
|
interface AdapterInternal {
|
|
6
8
|
ws: unknown;
|
|
7
|
-
request:
|
|
9
|
+
request: Request;
|
|
10
|
+
namespace: string;
|
|
8
11
|
peers?: Set<Peer>;
|
|
9
|
-
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():
|
|
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():
|
|
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]():
|
|
61
|
+
[kNodeInspect](): unknown;
|
|
58
62
|
}
|
|
59
63
|
|
|
60
64
|
interface AdapterInstance {
|
|
61
|
-
readonly peers: Set<Peer
|
|
62
|
-
readonly 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 = (
|
|
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:
|
|
141
|
-
context
|
|
142
|
-
}) => MaybePromise<
|
|
149
|
+
upgrade: (request: Request & {
|
|
150
|
+
readonly context?: Record<string, unknown>;
|
|
151
|
+
}) => MaybePromise<{
|
|
152
|
+
headers?: HeadersInit;
|
|
153
|
+
namespace?: string;
|
|
154
|
+
context?: PeerContext;
|
|
155
|
+
} | Response | void>;
|
|
143
156
|
/** A message is received */
|
|
144
157
|
message: (peer: Peer, message: Message) => MaybePromise<void>;
|
|
145
158
|
/** A socket is opened */
|
|
@@ -154,4 +167,4 @@ interface Hooks {
|
|
|
154
167
|
}
|
|
155
168
|
|
|
156
169
|
export { Message, Peer, WSError, defineHooks, defineWebSocketAdapter };
|
|
157
|
-
export type { Adapter, AdapterInstance, AdapterInternal, AdapterOptions, Hooks, ResolveHooks };
|
|
170
|
+
export type { Adapter, AdapterInstance, AdapterInternal, AdapterOptions, Hooks, PeerContext, ResolveHooks };
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { d as defineHooks, b as defineWebSocketAdapter } from './shared/crossws.
|
|
1
|
+
export { d as defineHooks, b as defineWebSocketAdapter } from './shared/crossws.CPlNx7g8.mjs';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ServerPlugin, Server } from 'srvx/types';
|
|
2
|
+
import { W as WSOptions, S as ServerWithWSOptions } from '../shared/crossws.95-eYp2D.mjs';
|
|
3
|
+
import '../index.mjs';
|
|
4
|
+
import '../shared/crossws.BQXMA5bH.mjs';
|
|
5
|
+
import '../adapters/bun.mjs';
|
|
6
|
+
import 'bun';
|
|
7
|
+
import '../adapters/deno.mjs';
|
|
8
|
+
import '../adapters/node.mjs';
|
|
9
|
+
import 'node:http';
|
|
10
|
+
import 'node:stream';
|
|
11
|
+
import 'events';
|
|
12
|
+
import 'node:https';
|
|
13
|
+
import 'node:tls';
|
|
14
|
+
import 'node:url';
|
|
15
|
+
import 'node:zlib';
|
|
16
|
+
import '../adapters/sse.mjs';
|
|
17
|
+
import '../adapters/cloudflare.mjs';
|
|
18
|
+
import '@cloudflare/workers-types';
|
|
19
|
+
import 'cloudflare:workers';
|
|
20
|
+
|
|
21
|
+
declare function plugin(wsOpts: WSOptions): ServerPlugin;
|
|
22
|
+
declare function serve(options: ServerWithWSOptions): Server;
|
|
23
|
+
|
|
24
|
+
export { plugin, serve };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { serve as serve$1 } from 'srvx/bun';
|
|
2
|
+
import bunAdapter from '../adapters/bun.mjs';
|
|
3
|
+
import '../shared/crossws.WpyOHUXc.mjs';
|
|
4
|
+
import '../shared/crossws.CPlNx7g8.mjs';
|
|
5
|
+
|
|
6
|
+
function plugin(wsOpts) {
|
|
7
|
+
return (server) => {
|
|
8
|
+
const ws = bunAdapter({
|
|
9
|
+
hooks: wsOpts,
|
|
10
|
+
resolve: wsOpts.resolve,
|
|
11
|
+
...wsOpts.options?.bun
|
|
12
|
+
});
|
|
13
|
+
server.options.middleware.unshift((req, next) => {
|
|
14
|
+
if (req.headers.get("upgrade")?.toLowerCase() === "websocket") {
|
|
15
|
+
return ws.handleUpgrade(
|
|
16
|
+
req,
|
|
17
|
+
req.runtime.bun.server
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
return next();
|
|
21
|
+
});
|
|
22
|
+
server.options.bun ??= {};
|
|
23
|
+
if (server.options.bun.websocket) {
|
|
24
|
+
throw new Error("websocket handlers for bun already set!");
|
|
25
|
+
}
|
|
26
|
+
server.options.bun.websocket = ws.websocket;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function serve(options) {
|
|
30
|
+
if (options.websocket) {
|
|
31
|
+
options.plugins ||= [];
|
|
32
|
+
options.plugins.push(plugin(options.websocket));
|
|
33
|
+
}
|
|
34
|
+
return serve$1(options);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export { plugin, serve };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ServerPlugin, Server } from 'srvx/types';
|
|
2
|
+
import { W as WSOptions, S as ServerWithWSOptions } from '../shared/crossws.95-eYp2D.mjs';
|
|
3
|
+
import '../index.mjs';
|
|
4
|
+
import '../shared/crossws.BQXMA5bH.mjs';
|
|
5
|
+
import '../adapters/bun.mjs';
|
|
6
|
+
import 'bun';
|
|
7
|
+
import '../adapters/deno.mjs';
|
|
8
|
+
import '../adapters/node.mjs';
|
|
9
|
+
import 'node:http';
|
|
10
|
+
import 'node:stream';
|
|
11
|
+
import 'events';
|
|
12
|
+
import 'node:https';
|
|
13
|
+
import 'node:tls';
|
|
14
|
+
import 'node:url';
|
|
15
|
+
import 'node:zlib';
|
|
16
|
+
import '../adapters/sse.mjs';
|
|
17
|
+
import '../adapters/cloudflare.mjs';
|
|
18
|
+
import '@cloudflare/workers-types';
|
|
19
|
+
import 'cloudflare:workers';
|
|
20
|
+
|
|
21
|
+
declare function plugin(wsOpts: WSOptions): ServerPlugin;
|
|
22
|
+
declare function serve(options: ServerWithWSOptions): Server;
|
|
23
|
+
|
|
24
|
+
export { plugin, serve };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { serve as serve$1 } from 'srvx/cloudflare';
|
|
2
|
+
import cloudflareAdapter from '../adapters/cloudflare.mjs';
|
|
3
|
+
import 'cloudflare:workers';
|
|
4
|
+
import '../shared/crossws.WpyOHUXc.mjs';
|
|
5
|
+
import '../shared/crossws.CPlNx7g8.mjs';
|
|
6
|
+
import '../shared/crossws.B31KJMcF.mjs';
|
|
7
|
+
import '../shared/crossws.By9qWDAI.mjs';
|
|
8
|
+
|
|
9
|
+
function plugin(wsOpts) {
|
|
10
|
+
return (server) => {
|
|
11
|
+
const ws = cloudflareAdapter({
|
|
12
|
+
hooks: wsOpts,
|
|
13
|
+
resolve: wsOpts.resolve,
|
|
14
|
+
...wsOpts.options?.cloudflare
|
|
15
|
+
});
|
|
16
|
+
server.options.middleware.unshift((req, next) => {
|
|
17
|
+
if (req.headers.get("upgrade")?.toLowerCase() === "websocket") {
|
|
18
|
+
return ws.handleUpgrade(
|
|
19
|
+
req,
|
|
20
|
+
req.runtime.cloudflare.env,
|
|
21
|
+
req.runtime.cloudflare.context
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
return next();
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function serve(options) {
|
|
29
|
+
if (options.websocket) {
|
|
30
|
+
options.plugins ||= [];
|
|
31
|
+
options.plugins.push(plugin(options.websocket));
|
|
32
|
+
}
|
|
33
|
+
return serve$1(options);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { plugin, serve };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ServerPlugin, Server } from 'srvx/types';
|
|
2
|
+
import { W as WSOptions, S as ServerWithWSOptions } from '../shared/crossws.95-eYp2D.mjs';
|
|
3
|
+
import '../index.mjs';
|
|
4
|
+
import '../shared/crossws.BQXMA5bH.mjs';
|
|
5
|
+
import '../adapters/bun.mjs';
|
|
6
|
+
import 'bun';
|
|
7
|
+
import '../adapters/deno.mjs';
|
|
8
|
+
import '../adapters/node.mjs';
|
|
9
|
+
import 'node:http';
|
|
10
|
+
import 'node:stream';
|
|
11
|
+
import 'events';
|
|
12
|
+
import 'node:https';
|
|
13
|
+
import 'node:tls';
|
|
14
|
+
import 'node:url';
|
|
15
|
+
import 'node:zlib';
|
|
16
|
+
import '../adapters/sse.mjs';
|
|
17
|
+
import '../adapters/cloudflare.mjs';
|
|
18
|
+
import '@cloudflare/workers-types';
|
|
19
|
+
import 'cloudflare:workers';
|
|
20
|
+
|
|
21
|
+
declare function plugin(wsOpts: WSOptions): ServerPlugin;
|
|
22
|
+
declare function serve(options: ServerWithWSOptions): Server;
|
|
23
|
+
|
|
24
|
+
export { plugin, serve };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { serve as serve$1 } from 'srvx';
|
|
2
|
+
import sseAdapter from '../adapters/sse.mjs';
|
|
3
|
+
import '../shared/crossws.WpyOHUXc.mjs';
|
|
4
|
+
import '../shared/crossws.CPlNx7g8.mjs';
|
|
5
|
+
|
|
6
|
+
function plugin(wsOpts) {
|
|
7
|
+
const ws = sseAdapter({
|
|
8
|
+
hooks: wsOpts,
|
|
9
|
+
resolve: wsOpts.resolve,
|
|
10
|
+
...wsOpts.options?.sse
|
|
11
|
+
});
|
|
12
|
+
console.warn(
|
|
13
|
+
"[crossws] Using SSE adapter for WebSocket support. This requires a custom WebSocket client (https://crossws.h3.dev/adapters/sse)."
|
|
14
|
+
);
|
|
15
|
+
return (server) => {
|
|
16
|
+
server.options.middleware.unshift((req, next) => {
|
|
17
|
+
if (req.headers.get("upgrade")?.toLowerCase() === "websocket") {
|
|
18
|
+
return ws.fetch(req);
|
|
19
|
+
}
|
|
20
|
+
return next();
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function serve(options) {
|
|
25
|
+
if (options.websocket) {
|
|
26
|
+
options.plugins ||= [];
|
|
27
|
+
options.plugins.push(plugin(options.websocket));
|
|
28
|
+
}
|
|
29
|
+
return serve$1(options);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export { plugin, serve };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ServerPlugin, Server } from 'srvx/types';
|
|
2
|
+
import { W as WSOptions, S as ServerWithWSOptions } from '../shared/crossws.95-eYp2D.mjs';
|
|
3
|
+
import '../index.mjs';
|
|
4
|
+
import '../shared/crossws.BQXMA5bH.mjs';
|
|
5
|
+
import '../adapters/bun.mjs';
|
|
6
|
+
import 'bun';
|
|
7
|
+
import '../adapters/deno.mjs';
|
|
8
|
+
import '../adapters/node.mjs';
|
|
9
|
+
import 'node:http';
|
|
10
|
+
import 'node:stream';
|
|
11
|
+
import 'events';
|
|
12
|
+
import 'node:https';
|
|
13
|
+
import 'node:tls';
|
|
14
|
+
import 'node:url';
|
|
15
|
+
import 'node:zlib';
|
|
16
|
+
import '../adapters/sse.mjs';
|
|
17
|
+
import '../adapters/cloudflare.mjs';
|
|
18
|
+
import '@cloudflare/workers-types';
|
|
19
|
+
import 'cloudflare:workers';
|
|
20
|
+
|
|
21
|
+
declare function plugin(wsOpts: WSOptions): ServerPlugin;
|
|
22
|
+
declare function serve(options: ServerWithWSOptions): Server;
|
|
23
|
+
|
|
24
|
+
export { plugin, serve };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { serve as serve$1 } from 'srvx/deno';
|
|
2
|
+
import denoAdapter from '../adapters/deno.mjs';
|
|
3
|
+
import '../shared/crossws.WpyOHUXc.mjs';
|
|
4
|
+
import '../shared/crossws.CPlNx7g8.mjs';
|
|
5
|
+
import '../shared/crossws.By9qWDAI.mjs';
|
|
6
|
+
|
|
7
|
+
function plugin(wsOpts) {
|
|
8
|
+
return (server) => {
|
|
9
|
+
const ws = denoAdapter({
|
|
10
|
+
hooks: wsOpts,
|
|
11
|
+
resolve: wsOpts.resolve,
|
|
12
|
+
...wsOpts.options?.deno
|
|
13
|
+
});
|
|
14
|
+
server.options.middleware.unshift((req, next) => {
|
|
15
|
+
if (req.headers.get("upgrade")?.toLowerCase() === "websocket") {
|
|
16
|
+
return ws.handleUpgrade(req, req.runtime.deno.info);
|
|
17
|
+
}
|
|
18
|
+
return next();
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function serve(options) {
|
|
23
|
+
if (options.websocket) {
|
|
24
|
+
options.plugins ||= [];
|
|
25
|
+
options.plugins.push(plugin(options.websocket));
|
|
26
|
+
}
|
|
27
|
+
return serve$1(options);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { plugin, serve };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ServerPlugin, Server } from 'srvx/types';
|
|
2
|
+
import { W as WSOptions, S as ServerWithWSOptions } from '../shared/crossws.95-eYp2D.mjs';
|
|
3
|
+
import '../index.mjs';
|
|
4
|
+
import '../shared/crossws.BQXMA5bH.mjs';
|
|
5
|
+
import '../adapters/bun.mjs';
|
|
6
|
+
import 'bun';
|
|
7
|
+
import '../adapters/deno.mjs';
|
|
8
|
+
import '../adapters/node.mjs';
|
|
9
|
+
import 'node:http';
|
|
10
|
+
import 'node:stream';
|
|
11
|
+
import 'events';
|
|
12
|
+
import 'node:https';
|
|
13
|
+
import 'node:tls';
|
|
14
|
+
import 'node:url';
|
|
15
|
+
import 'node:zlib';
|
|
16
|
+
import '../adapters/sse.mjs';
|
|
17
|
+
import '../adapters/cloudflare.mjs';
|
|
18
|
+
import '@cloudflare/workers-types';
|
|
19
|
+
import 'cloudflare:workers';
|
|
20
|
+
|
|
21
|
+
declare function plugin(wsOpts: WSOptions): ServerPlugin;
|
|
22
|
+
declare function serve(options: ServerWithWSOptions): Server;
|
|
23
|
+
|
|
24
|
+
export { plugin, serve };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { NodeRequest, serve as serve$1 } from 'srvx/node';
|
|
2
|
+
import nodeAdapter from '../adapters/node.mjs';
|
|
3
|
+
import '../shared/crossws.WpyOHUXc.mjs';
|
|
4
|
+
import '../shared/crossws.CPlNx7g8.mjs';
|
|
5
|
+
import '../shared/crossws.By9qWDAI.mjs';
|
|
6
|
+
import '../shared/crossws.CipVM6lf.mjs';
|
|
7
|
+
import 'stream';
|
|
8
|
+
import 'events';
|
|
9
|
+
import 'http';
|
|
10
|
+
import 'crypto';
|
|
11
|
+
import 'buffer';
|
|
12
|
+
import 'zlib';
|
|
13
|
+
import 'https';
|
|
14
|
+
import 'net';
|
|
15
|
+
import 'tls';
|
|
16
|
+
import 'url';
|
|
17
|
+
import '../shared/crossws.B31KJMcF.mjs';
|
|
18
|
+
|
|
19
|
+
function plugin(wsOpts) {
|
|
20
|
+
return (server) => {
|
|
21
|
+
const ws = nodeAdapter({
|
|
22
|
+
hooks: wsOpts,
|
|
23
|
+
resolve: wsOpts.resolve,
|
|
24
|
+
...wsOpts.options?.deno
|
|
25
|
+
});
|
|
26
|
+
const originalServe = server.serve;
|
|
27
|
+
server.serve = () => {
|
|
28
|
+
server.node?.server.on("upgrade", (req, socket, head) => {
|
|
29
|
+
ws.handleUpgrade(req, socket, head, new NodeRequest(req));
|
|
30
|
+
});
|
|
31
|
+
return originalServe.call(server);
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function serve(options) {
|
|
36
|
+
if (options.websocket) {
|
|
37
|
+
options.plugins ||= [];
|
|
38
|
+
options.plugins.push(plugin(options.websocket));
|
|
39
|
+
}
|
|
40
|
+
return serve$1(options);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { plugin, serve };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ServerRequest, ServerOptions } from 'srvx/types';
|
|
2
|
+
import { Hooks } from '../index.mjs';
|
|
3
|
+
import { BunOptions } from '../adapters/bun.mjs';
|
|
4
|
+
import { DenoOptions } from '../adapters/deno.mjs';
|
|
5
|
+
import { NodeOptions } from '../adapters/node.mjs';
|
|
6
|
+
import { SSEOptions } from '../adapters/sse.mjs';
|
|
7
|
+
import { CloudflareOptions } from '../adapters/cloudflare.mjs';
|
|
8
|
+
|
|
9
|
+
type WSOptions = Partial<Hooks> & {
|
|
10
|
+
resolve?: (req: ServerRequest) => Partial<Hooks> | Promise<Partial<Hooks>>;
|
|
11
|
+
options?: {
|
|
12
|
+
bun?: BunOptions;
|
|
13
|
+
deno?: DenoOptions;
|
|
14
|
+
node?: NodeOptions;
|
|
15
|
+
sse?: SSEOptions;
|
|
16
|
+
cloudflare?: CloudflareOptions;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
type ServerWithWSOptions = ServerOptions & {
|
|
20
|
+
websocket?: WSOptions;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export type { ServerWithWSOptions as S, WSOptions as W };
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
const StubRequest = /* @__PURE__ */ (() => {
|
|
2
|
+
class StubRequest2 {
|
|
3
|
+
url;
|
|
4
|
+
_signal;
|
|
5
|
+
_headers;
|
|
6
|
+
_init;
|
|
7
|
+
constructor(url, init = {}) {
|
|
8
|
+
this.url = url;
|
|
9
|
+
this._init = init;
|
|
10
|
+
}
|
|
11
|
+
get headers() {
|
|
12
|
+
if (!this._headers) {
|
|
13
|
+
this._headers = new Headers(this._init?.headers);
|
|
14
|
+
}
|
|
15
|
+
return this._headers;
|
|
16
|
+
}
|
|
17
|
+
clone() {
|
|
18
|
+
return new StubRequest2(this.url, this._init);
|
|
19
|
+
}
|
|
20
|
+
// --- dummy ---
|
|
21
|
+
get method() {
|
|
22
|
+
return "GET";
|
|
23
|
+
}
|
|
24
|
+
get signal() {
|
|
25
|
+
return this._signal ??= new AbortSignal();
|
|
26
|
+
}
|
|
27
|
+
get cache() {
|
|
28
|
+
return "default";
|
|
29
|
+
}
|
|
30
|
+
get credentials() {
|
|
31
|
+
return "same-origin";
|
|
32
|
+
}
|
|
33
|
+
get destination() {
|
|
34
|
+
return "";
|
|
35
|
+
}
|
|
36
|
+
get integrity() {
|
|
37
|
+
return "";
|
|
38
|
+
}
|
|
39
|
+
get keepalive() {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
get redirect() {
|
|
43
|
+
return "follow";
|
|
44
|
+
}
|
|
45
|
+
get mode() {
|
|
46
|
+
return "cors";
|
|
47
|
+
}
|
|
48
|
+
get referrer() {
|
|
49
|
+
return "about:client";
|
|
50
|
+
}
|
|
51
|
+
get referrerPolicy() {
|
|
52
|
+
return "";
|
|
53
|
+
}
|
|
54
|
+
get body() {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
get bodyUsed() {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
arrayBuffer() {
|
|
61
|
+
return Promise.resolve(new ArrayBuffer(0));
|
|
62
|
+
}
|
|
63
|
+
blob() {
|
|
64
|
+
return Promise.resolve(new Blob());
|
|
65
|
+
}
|
|
66
|
+
bytes() {
|
|
67
|
+
return Promise.resolve(new Uint8Array());
|
|
68
|
+
}
|
|
69
|
+
formData() {
|
|
70
|
+
return Promise.resolve(new FormData());
|
|
71
|
+
}
|
|
72
|
+
json() {
|
|
73
|
+
return Promise.resolve(JSON.parse(""));
|
|
74
|
+
}
|
|
75
|
+
text() {
|
|
76
|
+
return Promise.resolve("");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
Object.setPrototypeOf(StubRequest2.prototype, globalThis.Request.prototype);
|
|
80
|
+
return StubRequest2;
|
|
81
|
+
})();
|
|
82
|
+
|
|
83
|
+
export { StubRequest as S };
|