crossws 0.1.1 → 0.1.3

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 (39) hide show
  1. package/README.md +36 -251
  2. package/adapters/uws.d.ts +2 -0
  3. package/dist/adapters/bun.cjs +52 -29
  4. package/dist/adapters/bun.d.cts +7 -14
  5. package/dist/adapters/bun.d.mts +7 -14
  6. package/dist/adapters/bun.d.ts +7 -14
  7. package/dist/adapters/bun.mjs +52 -29
  8. package/dist/adapters/cloudflare.cjs +26 -16
  9. package/dist/adapters/cloudflare.d.cts +3 -3
  10. package/dist/adapters/cloudflare.d.mts +3 -3
  11. package/dist/adapters/cloudflare.d.ts +3 -3
  12. package/dist/adapters/cloudflare.mjs +26 -16
  13. package/dist/adapters/deno.cjs +32 -17
  14. package/dist/adapters/deno.d.cts +7 -3
  15. package/dist/adapters/deno.d.mts +7 -3
  16. package/dist/adapters/deno.d.ts +7 -3
  17. package/dist/adapters/deno.mjs +31 -16
  18. package/dist/adapters/node.cjs +48 -22
  19. package/dist/adapters/node.d.cts +2 -2
  20. package/dist/adapters/node.d.mts +2 -2
  21. package/dist/adapters/node.d.ts +2 -2
  22. package/dist/adapters/node.mjs +47 -21
  23. package/dist/adapters/uws.cjs +146 -0
  24. package/dist/adapters/uws.d.cts +19 -0
  25. package/dist/adapters/uws.d.mts +19 -0
  26. package/dist/adapters/uws.d.ts +19 -0
  27. package/dist/adapters/uws.mjs +144 -0
  28. package/dist/index.cjs +6 -4
  29. package/dist/index.d.cts +65 -17
  30. package/dist/index.d.mts +65 -17
  31. package/dist/index.d.ts +65 -17
  32. package/dist/index.mjs +2 -1
  33. package/dist/shared/crossws.6009d265.cjs +156 -0
  34. package/dist/shared/crossws.6f7f02b3.mjs +8 -0
  35. package/dist/shared/crossws.a6b0a7cc.mjs +150 -0
  36. package/dist/shared/crossws.deae10fd.cjs +10 -0
  37. package/package.json +28 -6
  38. package/dist/shared/crossws.21e14e0d.cjs +0 -59
  39. package/dist/shared/crossws.9536f626.mjs +0 -54
package/dist/index.d.mts CHANGED
@@ -2,40 +2,65 @@ declare class WebSocketError extends Error {
2
2
  constructor(...args: any[]);
3
3
  }
4
4
 
5
- declare class WebSocketMessage {
6
- readonly rawData: string | ArrayBuffer | Uint8Array;
5
+ declare class WSMessage {
6
+ readonly rawData: any;
7
7
  readonly isBinary?: boolean | undefined;
8
- constructor(rawData: string | ArrayBuffer | Uint8Array, isBinary?: boolean | undefined);
8
+ constructor(rawData: any, isBinary?: boolean | undefined);
9
9
  text(): string;
10
10
  toString(): string;
11
11
  }
12
12
 
13
13
  type ReadyState = 0 | 1 | 2 | 3;
14
- interface WebSocketContext {
14
+ interface WSRequest {
15
+ readonly url: string;
16
+ readonly headers: HeadersInit;
15
17
  }
16
- declare abstract class WebSocketPeerBase<T extends WebSocketContext = WebSocketContext> {
17
- ctx: T;
18
- constructor(ctx: T);
18
+ declare abstract class WSPeer<AdapterContext = any> implements WSRequest {
19
+ ctx: AdapterContext;
20
+ _subscriptions: Set<string>;
21
+ constructor(ctx: AdapterContext);
19
22
  get id(): string | undefined;
23
+ get url(): string;
24
+ get headers(): HeadersInit;
20
25
  get readyState(): ReadyState | -1;
21
- abstract send(message: string | ArrayBuffer | Uint8Array, compress?: boolean): number;
26
+ abstract send(message: any, options?: {
27
+ compress?: boolean;
28
+ }): number;
29
+ publish(topic: string, message: any, options?: {
30
+ compress?: boolean;
31
+ }): void;
32
+ subscribe(topic: string): void;
33
+ unsubscribe(topic: string): void;
22
34
  toString(): string;
23
35
  }
24
36
 
25
- type WSHook<ArgsT extends Array<any> = []> = (peer: WebSocketPeerBase, ...args: ArgsT) => void | Promise<void>;
26
- declare function defineWebSocketHooks(hooks: Partial<WebSocketHooks>): Partial<WebSocketHooks>;
37
+ type MaybePromise<T> = T | Promise<T>;
38
+ type _UserHooks = WebSocketHooks & AdapterHooks;
39
+ type UserHooks = Partial<_UserHooks>;
40
+ declare function defineWebSocketHooks<T extends UserHooks = UserHooks>(hooks: T): T;
41
+ type UserHookName = Exclude<keyof _UserHooks, "$">;
42
+ type CatchAllHandler = <Name extends UserHookName>(name: Name, ...args: Parameters<_UserHooks[Name]>) => MaybePromise<void>;
27
43
  interface WebSocketHooks {
44
+ /** Catch-all handler */
45
+ $: CatchAllHandler;
46
+ /** Upgrading */
47
+ upgrade: (req: WSRequest) => MaybePromise<void | {
48
+ headers?: HeadersInit;
49
+ }>;
28
50
  /** A message is received */
29
- message: WSHook<[WebSocketMessage]>;
51
+ message: (peer: WSPeer, message: WSMessage) => MaybePromise<void>;
30
52
  /** A socket is opened */
31
- open: WSHook<[]>;
53
+ open: (peer: WSPeer) => MaybePromise<void>;
32
54
  /** A socket is closed */
33
- close: WSHook<[{
55
+ close: (peer: WSPeer, details: {
34
56
  code?: number;
35
57
  reason?: string;
36
- }]>;
58
+ }) => MaybePromise<void>;
37
59
  /** An error occurs */
38
- error: WSHook<[WebSocketError]>;
60
+ error: (peer: WSPeer, error: WebSocketError) => MaybePromise<void>;
61
+ }
62
+ type WSHook<ArgsT extends Array<any> = []> = (peer: WSPeer, ...args: ArgsT) => MaybePromise<void>;
63
+ interface AdapterHooks {
39
64
  "bun:message": WSHook<[ws: any, message: any]>;
40
65
  "bun:open": WSHook<[ws: any]>;
41
66
  "bun:close": WSHook<[ws: any]>;
@@ -59,9 +84,32 @@ interface WebSocketHooks {
59
84
  "node:pong": WSHook<[data: Buffer]>;
60
85
  "node:unexpected-response": WSHook<[req: any, res: any]>;
61
86
  "node:upgrade": WSHook<[req: any]>;
87
+ "uws:open": WSHook<[ws: any]>;
88
+ "uws:message": WSHook<[ws: any, message: any, isBinary: boolean]>;
89
+ "uws:close": WSHook<[ws: any, code: number, message: any]>;
90
+ "uws:ping": WSHook<[ws: any, message: any]>;
91
+ "uws:pong": WSHook<[ws: any, message: any]>;
92
+ "uws:drain": WSHook<[ws: any]>;
93
+ "uws:upgrade": WSHook<[res: any, req: any, context: any]>;
94
+ "uws:subscription": WSHook<[
95
+ ws: any,
96
+ topic: any,
97
+ newCount: number,
98
+ oldCount: number
99
+ ]>;
62
100
  }
63
101
 
64
- type WebSocketAdapter<RT = any, OT = any> = (hooks: Partial<WebSocketHooks>, opts: OT) => RT;
102
+ type WebSocketAdapter<RT = any, OT = any> = (hooks: Partial<WebSocketHooks & AdapterHooks>, opts: OT) => RT;
65
103
  declare function defineWebSocketAdapter<RT, OT>(factory: WebSocketAdapter<RT, OT>): WebSocketAdapter<RT, OT>;
66
104
 
67
- export { type WebSocketAdapter, type WebSocketContext, WebSocketError, type WebSocketHooks, WebSocketMessage, WebSocketPeerBase, defineWebSocketAdapter, defineWebSocketHooks };
105
+ interface CrossWS extends WebSocketHooks {
106
+ upgrade: (req: WSRequest) => Promise<{
107
+ headers: HeadersInit;
108
+ }>;
109
+ }
110
+ interface CrossWSOptions {
111
+ resolve?: (info: WSRequest | WSPeer) => UserHooks | Promise<UserHooks>;
112
+ }
113
+ declare function createCrossWS(hooks: UserHooks, options: CrossWSOptions): CrossWS;
114
+
115
+ export { type AdapterHooks, type CrossWS, type CrossWSOptions, type UserHooks, WSMessage, WSPeer, type WSRequest, type WebSocketAdapter, WebSocketError, type WebSocketHooks, type _UserHooks, createCrossWS, defineWebSocketAdapter, defineWebSocketHooks };
package/dist/index.d.ts CHANGED
@@ -2,40 +2,65 @@ declare class WebSocketError extends Error {
2
2
  constructor(...args: any[]);
3
3
  }
4
4
 
5
- declare class WebSocketMessage {
6
- readonly rawData: string | ArrayBuffer | Uint8Array;
5
+ declare class WSMessage {
6
+ readonly rawData: any;
7
7
  readonly isBinary?: boolean | undefined;
8
- constructor(rawData: string | ArrayBuffer | Uint8Array, isBinary?: boolean | undefined);
8
+ constructor(rawData: any, isBinary?: boolean | undefined);
9
9
  text(): string;
10
10
  toString(): string;
11
11
  }
12
12
 
13
13
  type ReadyState = 0 | 1 | 2 | 3;
14
- interface WebSocketContext {
14
+ interface WSRequest {
15
+ readonly url: string;
16
+ readonly headers: HeadersInit;
15
17
  }
16
- declare abstract class WebSocketPeerBase<T extends WebSocketContext = WebSocketContext> {
17
- ctx: T;
18
- constructor(ctx: T);
18
+ declare abstract class WSPeer<AdapterContext = any> implements WSRequest {
19
+ ctx: AdapterContext;
20
+ _subscriptions: Set<string>;
21
+ constructor(ctx: AdapterContext);
19
22
  get id(): string | undefined;
23
+ get url(): string;
24
+ get headers(): HeadersInit;
20
25
  get readyState(): ReadyState | -1;
21
- abstract send(message: string | ArrayBuffer | Uint8Array, compress?: boolean): number;
26
+ abstract send(message: any, options?: {
27
+ compress?: boolean;
28
+ }): number;
29
+ publish(topic: string, message: any, options?: {
30
+ compress?: boolean;
31
+ }): void;
32
+ subscribe(topic: string): void;
33
+ unsubscribe(topic: string): void;
22
34
  toString(): string;
23
35
  }
24
36
 
25
- type WSHook<ArgsT extends Array<any> = []> = (peer: WebSocketPeerBase, ...args: ArgsT) => void | Promise<void>;
26
- declare function defineWebSocketHooks(hooks: Partial<WebSocketHooks>): Partial<WebSocketHooks>;
37
+ type MaybePromise<T> = T | Promise<T>;
38
+ type _UserHooks = WebSocketHooks & AdapterHooks;
39
+ type UserHooks = Partial<_UserHooks>;
40
+ declare function defineWebSocketHooks<T extends UserHooks = UserHooks>(hooks: T): T;
41
+ type UserHookName = Exclude<keyof _UserHooks, "$">;
42
+ type CatchAllHandler = <Name extends UserHookName>(name: Name, ...args: Parameters<_UserHooks[Name]>) => MaybePromise<void>;
27
43
  interface WebSocketHooks {
44
+ /** Catch-all handler */
45
+ $: CatchAllHandler;
46
+ /** Upgrading */
47
+ upgrade: (req: WSRequest) => MaybePromise<void | {
48
+ headers?: HeadersInit;
49
+ }>;
28
50
  /** A message is received */
29
- message: WSHook<[WebSocketMessage]>;
51
+ message: (peer: WSPeer, message: WSMessage) => MaybePromise<void>;
30
52
  /** A socket is opened */
31
- open: WSHook<[]>;
53
+ open: (peer: WSPeer) => MaybePromise<void>;
32
54
  /** A socket is closed */
33
- close: WSHook<[{
55
+ close: (peer: WSPeer, details: {
34
56
  code?: number;
35
57
  reason?: string;
36
- }]>;
58
+ }) => MaybePromise<void>;
37
59
  /** An error occurs */
38
- error: WSHook<[WebSocketError]>;
60
+ error: (peer: WSPeer, error: WebSocketError) => MaybePromise<void>;
61
+ }
62
+ type WSHook<ArgsT extends Array<any> = []> = (peer: WSPeer, ...args: ArgsT) => MaybePromise<void>;
63
+ interface AdapterHooks {
39
64
  "bun:message": WSHook<[ws: any, message: any]>;
40
65
  "bun:open": WSHook<[ws: any]>;
41
66
  "bun:close": WSHook<[ws: any]>;
@@ -59,9 +84,32 @@ interface WebSocketHooks {
59
84
  "node:pong": WSHook<[data: Buffer]>;
60
85
  "node:unexpected-response": WSHook<[req: any, res: any]>;
61
86
  "node:upgrade": WSHook<[req: any]>;
87
+ "uws:open": WSHook<[ws: any]>;
88
+ "uws:message": WSHook<[ws: any, message: any, isBinary: boolean]>;
89
+ "uws:close": WSHook<[ws: any, code: number, message: any]>;
90
+ "uws:ping": WSHook<[ws: any, message: any]>;
91
+ "uws:pong": WSHook<[ws: any, message: any]>;
92
+ "uws:drain": WSHook<[ws: any]>;
93
+ "uws:upgrade": WSHook<[res: any, req: any, context: any]>;
94
+ "uws:subscription": WSHook<[
95
+ ws: any,
96
+ topic: any,
97
+ newCount: number,
98
+ oldCount: number
99
+ ]>;
62
100
  }
63
101
 
64
- type WebSocketAdapter<RT = any, OT = any> = (hooks: Partial<WebSocketHooks>, opts: OT) => RT;
102
+ type WebSocketAdapter<RT = any, OT = any> = (hooks: Partial<WebSocketHooks & AdapterHooks>, opts: OT) => RT;
65
103
  declare function defineWebSocketAdapter<RT, OT>(factory: WebSocketAdapter<RT, OT>): WebSocketAdapter<RT, OT>;
66
104
 
67
- export { type WebSocketAdapter, type WebSocketContext, WebSocketError, type WebSocketHooks, WebSocketMessage, WebSocketPeerBase, defineWebSocketAdapter, defineWebSocketHooks };
105
+ interface CrossWS extends WebSocketHooks {
106
+ upgrade: (req: WSRequest) => Promise<{
107
+ headers: HeadersInit;
108
+ }>;
109
+ }
110
+ interface CrossWSOptions {
111
+ resolve?: (info: WSRequest | WSPeer) => UserHooks | Promise<UserHooks>;
112
+ }
113
+ declare function createCrossWS(hooks: UserHooks, options: CrossWSOptions): CrossWS;
114
+
115
+ export { type AdapterHooks, type CrossWS, type CrossWSOptions, type UserHooks, WSMessage, WSPeer, type WSRequest, type WebSocketAdapter, WebSocketError, type WebSocketHooks, type _UserHooks, createCrossWS, defineWebSocketAdapter, defineWebSocketHooks };
package/dist/index.mjs CHANGED
@@ -1,4 +1,5 @@
1
- export { W as WebSocketError, a as WebSocketMessage, b as WebSocketPeerBase, d as defineWebSocketAdapter } from './shared/crossws.9536f626.mjs';
1
+ export { W as WSMessage, a as WSPeer, c as createCrossWS, d as defineWebSocketAdapter } from './shared/crossws.a6b0a7cc.mjs';
2
+ export { W as WebSocketError } from './shared/crossws.6f7f02b3.mjs';
2
3
 
3
4
  function defineWebSocketHooks(hooks) {
4
5
  return hooks;
@@ -0,0 +1,156 @@
1
+ 'use strict';
2
+
3
+ function defineWebSocketAdapter(factory) {
4
+ return factory;
5
+ }
6
+
7
+ function createCrossWS(hooks, options) {
8
+ const _callHook = options.resolve ? async function(name, info, ...args) {
9
+ const hooks2 = await options.resolve?.(info);
10
+ const hook = hooks2?.[name];
11
+ return hook?.(info, ...args);
12
+ } : void 0;
13
+ return {
14
+ async $(name, ...args) {
15
+ await Promise.all([hooks.$?.(name, ...args), _callHook?.(name, ...args)]);
16
+ },
17
+ async upgrade(req) {
18
+ const upgradeResults = await Promise.all([
19
+ hooks.upgrade?.(req),
20
+ _callHook?.("upgrade", req)
21
+ ]);
22
+ const headers = /* @__PURE__ */ Object.create(null);
23
+ for (const result of upgradeResults) {
24
+ if (result?.headers) {
25
+ Object.assign(headers, result.headers);
26
+ }
27
+ }
28
+ return { headers };
29
+ },
30
+ async message(peer, message) {
31
+ await Promise.all([
32
+ hooks.message?.(peer, message),
33
+ _callHook?.("message", peer, message)
34
+ ]);
35
+ },
36
+ async open(peer) {
37
+ await Promise.all([hooks.open?.(peer), _callHook?.("open", peer)]);
38
+ },
39
+ async close(peer, { code, reason }) {
40
+ await Promise.all([
41
+ hooks.close?.(peer, { code, reason }),
42
+ _callHook?.("close", peer, { code, reason })
43
+ ]);
44
+ },
45
+ async error(peer, error) {
46
+ await Promise.all([
47
+ hooks.error?.(peer, error),
48
+ _callHook?.("error", peer, error)
49
+ ]);
50
+ }
51
+ };
52
+ }
53
+
54
+ function toBufferLike(val) {
55
+ if (val === void 0 || val === null) {
56
+ return "";
57
+ }
58
+ if (typeof val === "string") {
59
+ return val;
60
+ }
61
+ if (isPlainObject(val)) {
62
+ return JSON.stringify(val);
63
+ }
64
+ return val;
65
+ }
66
+ function isPlainObject(value) {
67
+ if (value === null || typeof value !== "object") {
68
+ return false;
69
+ }
70
+ const prototype = Object.getPrototypeOf(value);
71
+ if (prototype !== null && prototype !== Object.prototype && Object.getPrototypeOf(prototype) !== null) {
72
+ return false;
73
+ }
74
+ if (Symbol.iterator in value) {
75
+ return false;
76
+ }
77
+ if (Symbol.toStringTag in value) {
78
+ return Object.prototype.toString.call(value) === "[object Module]";
79
+ }
80
+ return true;
81
+ }
82
+
83
+ class WSMessage {
84
+ constructor(rawData, isBinary) {
85
+ this.rawData = rawData;
86
+ this.isBinary = isBinary;
87
+ }
88
+ text() {
89
+ if (typeof this.rawData === "string") {
90
+ return this.rawData;
91
+ }
92
+ const buff = toBufferLike(this.rawData);
93
+ if (typeof buff === "string") {
94
+ return buff;
95
+ }
96
+ return new TextDecoder().decode(buff);
97
+ }
98
+ toString() {
99
+ return this.text();
100
+ }
101
+ [Symbol.for("nodejs.util.inspect.custom")]() {
102
+ return this.text();
103
+ }
104
+ }
105
+
106
+ var __defProp = Object.defineProperty;
107
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
108
+ var __publicField = (obj, key, value) => {
109
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
110
+ return value;
111
+ };
112
+ const ReadyStateMap = {
113
+ "-1": "unknown",
114
+ 0: "connecting",
115
+ 1: "open",
116
+ 2: "closing",
117
+ 3: "closed"
118
+ };
119
+ class WSPeer {
120
+ constructor(ctx) {
121
+ this.ctx = ctx;
122
+ __publicField(this, "_subscriptions", /* @__PURE__ */ new Set());
123
+ }
124
+ get id() {
125
+ return "??";
126
+ }
127
+ get url() {
128
+ return "/";
129
+ }
130
+ get headers() {
131
+ return {};
132
+ }
133
+ get readyState() {
134
+ return -1;
135
+ }
136
+ publish(topic, message, options) {
137
+ }
138
+ subscribe(topic) {
139
+ this._subscriptions.add(topic);
140
+ }
141
+ unsubscribe(topic) {
142
+ this._subscriptions.delete(topic);
143
+ }
144
+ toString() {
145
+ return `${this.id || ""}${this.readyState === 1 || this.readyState === -1 ? "" : ` [${ReadyStateMap[this.readyState]}]`}`;
146
+ }
147
+ [Symbol.for("nodejs.util.inspect.custom")]() {
148
+ return this.toString();
149
+ }
150
+ }
151
+
152
+ exports.WSMessage = WSMessage;
153
+ exports.WSPeer = WSPeer;
154
+ exports.createCrossWS = createCrossWS;
155
+ exports.defineWebSocketAdapter = defineWebSocketAdapter;
156
+ exports.toBufferLike = toBufferLike;
@@ -0,0 +1,8 @@
1
+ class WebSocketError extends Error {
2
+ constructor(...args) {
3
+ super(...args);
4
+ this.name = "WebSocketError";
5
+ }
6
+ }
7
+
8
+ export { WebSocketError as W };
@@ -0,0 +1,150 @@
1
+ function defineWebSocketAdapter(factory) {
2
+ return factory;
3
+ }
4
+
5
+ function createCrossWS(hooks, options) {
6
+ const _callHook = options.resolve ? async function(name, info, ...args) {
7
+ const hooks2 = await options.resolve?.(info);
8
+ const hook = hooks2?.[name];
9
+ return hook?.(info, ...args);
10
+ } : void 0;
11
+ return {
12
+ async $(name, ...args) {
13
+ await Promise.all([hooks.$?.(name, ...args), _callHook?.(name, ...args)]);
14
+ },
15
+ async upgrade(req) {
16
+ const upgradeResults = await Promise.all([
17
+ hooks.upgrade?.(req),
18
+ _callHook?.("upgrade", req)
19
+ ]);
20
+ const headers = /* @__PURE__ */ Object.create(null);
21
+ for (const result of upgradeResults) {
22
+ if (result?.headers) {
23
+ Object.assign(headers, result.headers);
24
+ }
25
+ }
26
+ return { headers };
27
+ },
28
+ async message(peer, message) {
29
+ await Promise.all([
30
+ hooks.message?.(peer, message),
31
+ _callHook?.("message", peer, message)
32
+ ]);
33
+ },
34
+ async open(peer) {
35
+ await Promise.all([hooks.open?.(peer), _callHook?.("open", peer)]);
36
+ },
37
+ async close(peer, { code, reason }) {
38
+ await Promise.all([
39
+ hooks.close?.(peer, { code, reason }),
40
+ _callHook?.("close", peer, { code, reason })
41
+ ]);
42
+ },
43
+ async error(peer, error) {
44
+ await Promise.all([
45
+ hooks.error?.(peer, error),
46
+ _callHook?.("error", peer, error)
47
+ ]);
48
+ }
49
+ };
50
+ }
51
+
52
+ function toBufferLike(val) {
53
+ if (val === void 0 || val === null) {
54
+ return "";
55
+ }
56
+ if (typeof val === "string") {
57
+ return val;
58
+ }
59
+ if (isPlainObject(val)) {
60
+ return JSON.stringify(val);
61
+ }
62
+ return val;
63
+ }
64
+ function isPlainObject(value) {
65
+ if (value === null || typeof value !== "object") {
66
+ return false;
67
+ }
68
+ const prototype = Object.getPrototypeOf(value);
69
+ if (prototype !== null && prototype !== Object.prototype && Object.getPrototypeOf(prototype) !== null) {
70
+ return false;
71
+ }
72
+ if (Symbol.iterator in value) {
73
+ return false;
74
+ }
75
+ if (Symbol.toStringTag in value) {
76
+ return Object.prototype.toString.call(value) === "[object Module]";
77
+ }
78
+ return true;
79
+ }
80
+
81
+ class WSMessage {
82
+ constructor(rawData, isBinary) {
83
+ this.rawData = rawData;
84
+ this.isBinary = isBinary;
85
+ }
86
+ text() {
87
+ if (typeof this.rawData === "string") {
88
+ return this.rawData;
89
+ }
90
+ const buff = toBufferLike(this.rawData);
91
+ if (typeof buff === "string") {
92
+ return buff;
93
+ }
94
+ return new TextDecoder().decode(buff);
95
+ }
96
+ toString() {
97
+ return this.text();
98
+ }
99
+ [Symbol.for("nodejs.util.inspect.custom")]() {
100
+ return this.text();
101
+ }
102
+ }
103
+
104
+ var __defProp = Object.defineProperty;
105
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
106
+ var __publicField = (obj, key, value) => {
107
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
108
+ return value;
109
+ };
110
+ const ReadyStateMap = {
111
+ "-1": "unknown",
112
+ 0: "connecting",
113
+ 1: "open",
114
+ 2: "closing",
115
+ 3: "closed"
116
+ };
117
+ class WSPeer {
118
+ constructor(ctx) {
119
+ this.ctx = ctx;
120
+ __publicField(this, "_subscriptions", /* @__PURE__ */ new Set());
121
+ }
122
+ get id() {
123
+ return "??";
124
+ }
125
+ get url() {
126
+ return "/";
127
+ }
128
+ get headers() {
129
+ return {};
130
+ }
131
+ get readyState() {
132
+ return -1;
133
+ }
134
+ publish(topic, message, options) {
135
+ }
136
+ subscribe(topic) {
137
+ this._subscriptions.add(topic);
138
+ }
139
+ unsubscribe(topic) {
140
+ this._subscriptions.delete(topic);
141
+ }
142
+ toString() {
143
+ return `${this.id || ""}${this.readyState === 1 || this.readyState === -1 ? "" : ` [${ReadyStateMap[this.readyState]}]`}`;
144
+ }
145
+ [Symbol.for("nodejs.util.inspect.custom")]() {
146
+ return this.toString();
147
+ }
148
+ }
149
+
150
+ export { WSMessage as W, WSPeer as a, createCrossWS as c, defineWebSocketAdapter as d, toBufferLike as t };
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ class WebSocketError extends Error {
4
+ constructor(...args) {
5
+ super(...args);
6
+ this.name = "WebSocketError";
7
+ }
8
+ }
9
+
10
+ exports.WebSocketError = WebSocketError;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "crossws",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Cross-platform WebSocket Servers for Node.js, Deno, Bun and Cloudflare Workers",
5
5
  "repository": "unjs/crossws",
6
6
  "license": "MIT",
@@ -49,6 +49,11 @@
49
49
  "types": "./dist/adapters/node.d.ts",
50
50
  "import": "./dist/adapters/node.mjs",
51
51
  "require": "./dist/adapters/node.cjs"
52
+ },
53
+ "./adapters/uws": {
54
+ "types": "./dist/adapters/uws.d.ts",
55
+ "import": "./dist/adapters/uws.mjs",
56
+ "require": "./dist/adapters/uws.cjs"
52
57
  }
53
58
  },
54
59
  "main": "./dist/index.cjs",
@@ -61,28 +66,37 @@
61
66
  ],
62
67
  "scripts": {
63
68
  "build": "unbuild",
64
- "play:node": "jiti playground/node.ts",
65
- "play:bun": "bun playground/bun.ts",
66
- "play:deno": "deno run -A playground/deno.ts",
67
- "play:cf": "wrangler dev --port 3001",
69
+ "dev": "pnpm play:node",
68
70
  "lint": "eslint --cache --ext .ts,.js,.mjs,.cjs . && prettier -c src",
69
71
  "lint:fix": "eslint --cache --ext .ts,.js,.mjs,.cjs . --fix && prettier -c src -w",
70
72
  "prepack": "pnpm run build",
71
- "release": "pnpm test && changelogen --release && npm publish && git push --follow-tags",
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",
78
+ "release": "pnpm test && pnpm build && changelogen --release && npm publish && git push --follow-tags",
72
79
  "test": "pnpm lint && pnpm test:types",
73
80
  "test:types": "tsc --noEmit --skipLibCheck"
74
81
  },
82
+ "resolutions": {
83
+ "crossws": "workspace:*"
84
+ },
75
85
  "devDependencies": {
76
86
  "@cloudflare/workers-types": "^4.20240117.0",
87
+ "@deno/types": "^0.0.1",
77
88
  "@types/bun": "^1.0.4",
78
89
  "@types/node": "^20.11.10",
79
90
  "@types/web": "^0.0.135",
80
91
  "@types/ws": "^8.5.10",
92
+ "automd": "^0.3.6",
81
93
  "changelogen": "^0.5.5",
82
94
  "consola": "^3.2.3",
83
95
  "eslint": "^8.56.0",
84
96
  "eslint-config-unjs": "^0.2.1",
97
+ "h3": "^1.10.1",
85
98
  "jiti": "^1.21.0",
99
+ "listhen": "^1.6.0",
86
100
  "prettier": "^3.2.4",
87
101
  "typescript": "^5.3.3",
88
102
  "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.33.0",
@@ -90,5 +104,13 @@
90
104
  "wrangler": "^3.25.0",
91
105
  "ws": "^8.16.0"
92
106
  },
107
+ "peerDependencies": {
108
+ "uWebSockets.js": "*"
109
+ },
110
+ "peerDependenciesMeta": {
111
+ "uWebSockets.js": {
112
+ "optional": true
113
+ }
114
+ },
93
115
  "packageManager": "pnpm@8.15.0"
94
116
  }