@dxos/websocket-rpc 0.8.3 → 0.8.4-main.1da679c

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.
@@ -1,15 +1,15 @@
1
1
  import "@dxos/node-std/globals";
2
2
 
3
- // packages/core/mesh/websocket-rpc/src/client.ts
3
+ // src/client.ts
4
4
  import WebSocket2 from "isomorphic-ws";
5
5
  import { Event, Trigger } from "@dxos/async";
6
6
  import { log as log2, logInfo } from "@dxos/log";
7
7
  import { createProtoRpcPeer } from "@dxos/rpc";
8
8
 
9
- // packages/core/mesh/websocket-rpc/src/token-auth.ts
9
+ // src/token-auth.ts
10
10
  import WebSocket from "isomorphic-ws";
11
11
  import { log } from "@dxos/log";
12
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/mesh/websocket-rpc/src/token-auth.ts";
12
+ var __dxlog_file = "/__w/dxos/dxos/packages/core/mesh/websocket-rpc/src/token-auth.ts";
13
13
  var PROTOCOL_TOKEN_PREFIX = "base64url.bearer.authorization.dxos.org";
14
14
  var authenticateRequestWithTokenAuth = (request, socket, upgradeHead, token, cb) => {
15
15
  const protocolHeader = request.headers["sec-websocket-protocol"];
@@ -18,7 +18,7 @@ var authenticateRequestWithTokenAuth = (request, socket, upgradeHead, token, cb)
18
18
  header: request.headers["sec-websocket-protocol"]
19
19
  }, {
20
20
  F: __dxlog_file,
21
- L: 28,
21
+ L: 29,
22
22
  S: void 0,
23
23
  C: (f, a) => f(...a)
24
24
  });
@@ -34,7 +34,7 @@ var authenticateRequestWithTokenAuth = (request, socket, upgradeHead, token, cb)
34
34
  foo: encodedToken
35
35
  }, {
36
36
  F: __dxlog_file,
37
- L: 40,
37
+ L: 41,
38
38
  S: void 0,
39
39
  C: (f, a) => f(...a)
40
40
  });
@@ -55,49 +55,35 @@ var WebSocketWithTokenAuth = class extends WebSocket {
55
55
  encodedToken
56
56
  }, {
57
57
  F: __dxlog_file,
58
- L: 55,
58
+ L: 56,
59
59
  S: this,
60
60
  C: (f, a) => f(...a)
61
61
  });
62
62
  }
63
63
  };
64
64
 
65
- // packages/core/mesh/websocket-rpc/src/client.ts
65
+ // src/client.ts
66
+ function _define_property(obj, key, value) {
67
+ if (key in obj) {
68
+ Object.defineProperty(obj, key, {
69
+ value,
70
+ enumerable: true,
71
+ configurable: true,
72
+ writable: true
73
+ });
74
+ } else {
75
+ obj[key] = value;
76
+ }
77
+ return obj;
78
+ }
66
79
  function _ts_decorate(decorators, target, key, desc) {
67
80
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
68
81
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
69
82
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
70
83
  return c > 3 && r && Object.defineProperty(target, key, r), r;
71
84
  }
72
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/mesh/websocket-rpc/src/client.ts";
85
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/core/mesh/websocket-rpc/src/client.ts";
73
86
  var WebsocketRpcClient = class {
74
- constructor(_params) {
75
- this._params = _params;
76
- this._connectTrigger = new Trigger();
77
- this.connected = new Event();
78
- this.disconnected = new Event();
79
- this.error = new Event();
80
- this._rpc = createProtoRpcPeer({
81
- requested: this._params.requested,
82
- exposed: this._params.exposed,
83
- handlers: this._params.handlers,
84
- noHandshake: this._params.noHandshake,
85
- port: {
86
- send: (msg) => {
87
- this._socket.send(msg);
88
- },
89
- subscribe: (cb) => {
90
- this._socket.onmessage = async (msg) => {
91
- if (typeof Blob !== "undefined" && msg.data instanceof Blob) {
92
- cb(Buffer.from(await msg.data.arrayBuffer()));
93
- } else {
94
- cb(msg.data);
95
- }
96
- };
97
- }
98
- }
99
- });
100
- }
101
87
  get url() {
102
88
  return this._params.url;
103
89
  }
@@ -169,20 +155,64 @@ var WebsocketRpcClient = class {
169
155
  get rpc() {
170
156
  return this._rpc.rpc;
171
157
  }
158
+ constructor(_params) {
159
+ _define_property(this, "_params", void 0);
160
+ _define_property(this, "_socket", void 0);
161
+ _define_property(this, "_rpc", void 0);
162
+ _define_property(this, "_connectTrigger", void 0);
163
+ _define_property(this, "connected", void 0);
164
+ _define_property(this, "disconnected", void 0);
165
+ _define_property(this, "error", void 0);
166
+ this._params = _params;
167
+ this._connectTrigger = new Trigger();
168
+ this.connected = new Event();
169
+ this.disconnected = new Event();
170
+ this.error = new Event();
171
+ this._rpc = createProtoRpcPeer({
172
+ requested: this._params.requested,
173
+ exposed: this._params.exposed,
174
+ handlers: this._params.handlers,
175
+ noHandshake: this._params.noHandshake,
176
+ port: {
177
+ send: (msg) => {
178
+ this._socket.send(msg);
179
+ },
180
+ subscribe: (cb) => {
181
+ this._socket.onmessage = async (msg) => {
182
+ if (typeof Blob !== "undefined" && msg.data instanceof Blob) {
183
+ cb(Buffer.from(await msg.data.arrayBuffer()));
184
+ } else {
185
+ cb(msg.data);
186
+ }
187
+ };
188
+ }
189
+ }
190
+ });
191
+ }
172
192
  };
173
193
  _ts_decorate([
174
194
  logInfo
175
195
  ], WebsocketRpcClient.prototype, "url", null);
176
196
 
177
- // packages/core/mesh/websocket-rpc/src/server.ts
197
+ // src/server.ts
178
198
  import WebSocket3 from "isomorphic-ws";
179
199
  import { log as log3 } from "@dxos/log";
180
200
  import { createProtoRpcPeer as createProtoRpcPeer2 } from "@dxos/rpc";
181
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/mesh/websocket-rpc/src/server.ts";
182
- var WebsocketRpcServer = class {
183
- constructor(_params) {
184
- this._params = _params;
201
+ function _define_property2(obj, key, value) {
202
+ if (key in obj) {
203
+ Object.defineProperty(obj, key, {
204
+ value,
205
+ enumerable: true,
206
+ configurable: true,
207
+ writable: true
208
+ });
209
+ } else {
210
+ obj[key] = value;
185
211
  }
212
+ return obj;
213
+ }
214
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/core/mesh/websocket-rpc/src/server.ts";
215
+ var WebsocketRpcServer = class {
186
216
  handleUpgrade(request, socket, head) {
187
217
  this._server?.handleUpgrade(request, socket, head, (ws) => {
188
218
  this._server?.emit("connection", ws, request);
@@ -198,7 +228,7 @@ var WebsocketRpcServer = class {
198
228
  headers: request.headers
199
229
  }, {
200
230
  F: __dxlog_file3,
201
- L: 40,
231
+ L: 41,
202
232
  S: this,
203
233
  C: (f, a) => f(...a)
204
234
  });
@@ -234,6 +264,11 @@ var WebsocketRpcServer = class {
234
264
  async close() {
235
265
  this._server?.close();
236
266
  }
267
+ constructor(_params) {
268
+ _define_property2(this, "_params", void 0);
269
+ _define_property2(this, "_server", void 0);
270
+ this._params = _params;
271
+ }
237
272
  };
238
273
  export {
239
274
  WebSocketWithTokenAuth,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/client.ts", "../../../src/token-auth.ts", "../../../src/server.ts"],
4
- "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { Event, Trigger } from '@dxos/async';\nimport { log, logInfo } from '@dxos/log';\nimport { createProtoRpcPeer, type ProtoRpcPeer, type ProtoRpcPeerOptions } from '@dxos/rpc';\n\nimport { WebSocketWithTokenAuth } from './token-auth';\n\nexport type WebsocketRpcClientParams<C, S> = {\n url: string;\n authenticationToken?: string;\n} & Pick<ProtoRpcPeerOptions<C, S>, 'requested' | 'exposed' | 'handlers' | 'noHandshake'>;\n\nexport class WebsocketRpcClient<C, S> {\n private _socket?: WebSocket;\n private _rpc?: ProtoRpcPeer<C>;\n private readonly _connectTrigger = new Trigger();\n\n readonly connected = new Event();\n readonly disconnected = new Event();\n readonly error = new Event<Error>();\n\n constructor(private readonly _params: WebsocketRpcClientParams<C, S>) {\n this._rpc = createProtoRpcPeer({\n requested: this._params.requested,\n exposed: this._params.exposed,\n handlers: this._params.handlers,\n noHandshake: this._params.noHandshake,\n port: {\n send: (msg) => {\n this._socket!.send(msg);\n },\n subscribe: (cb) => {\n this._socket!.onmessage = async (msg: WebSocket.MessageEvent) => {\n if (typeof Blob !== 'undefined' && msg.data instanceof Blob) {\n cb(Buffer.from(await msg.data.arrayBuffer()));\n } else {\n cb(msg.data as any);\n }\n };\n },\n },\n });\n }\n\n @logInfo\n get url() {\n return this._params.url;\n }\n\n async open(): Promise<void> {\n if (this._params.authenticationToken) {\n this._socket = new WebSocketWithTokenAuth(this._params.url, this._params.authenticationToken);\n } else {\n this._socket = new WebSocket(this._params.url);\n }\n this._socket.onopen = async () => {\n log('Socket open');\n try {\n await this._rpc!.open();\n log(`RPC open ${this._params.url}`);\n this.connected.emit();\n this._connectTrigger.wake();\n } catch (err: any) {\n this.error.emit(err);\n }\n };\n\n this._socket.onclose = async () => {\n log(`Disconnected ${this._params.url}`);\n this.disconnected.emit();\n await this.close();\n };\n\n this._socket.onerror = (event: WebSocket.ErrorEvent) => {\n // Browsers do not include the error message in the event object, so we cannot discern 401 errors from other errors.\n log.error(event.message ?? 'Socket error', { url: this._params.url });\n const error = event.error ?? new Error(event.message);\n this.error.emit(error);\n this._connectTrigger.throw(error);\n };\n\n await this._connectTrigger.wait();\n }\n\n async close(): Promise<void> {\n try {\n await this._rpc?.close();\n } catch (err) {\n log.catch(err);\n }\n this._socket?.close();\n }\n\n get rpc() {\n return this._rpc!.rpc;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// Implement WS header-based auth similar to https://github.com/kubernetes/kubernetes/commit/714f97d7baf4975ad3aa47735a868a81a984d1f0\n// https://stackoverflow.com/questions/4361173/http-headers-in-websockets-client-api/77060459#77060459\n\nimport { type IncomingMessage } from 'http';\nimport WebSocket from 'isomorphic-ws';\nimport { type Socket } from 'node:net';\n\nimport { log } from '@dxos/log';\n\nconst PROTOCOL_TOKEN_PREFIX = 'base64url.bearer.authorization.dxos.org';\n\n// TODO: implement middleware which removes the token from the request\n\nexport const authenticateRequestWithTokenAuth = (\n request: IncomingMessage,\n socket: Socket,\n upgradeHead: Buffer,\n token: string,\n cb: (request: IncomingMessage, socket: Socket, upgradeHead: Buffer) => void,\n) => {\n const protocolHeader = request.headers['sec-websocket-protocol'];\n\n if (!protocolHeader) {\n log('upgrade unauthorized, header missing', { header: request.headers['sec-websocket-protocol'] });\n socket.write('HTTP/1.1 401 Unauthorized\\r\\n\\r\\n');\n socket.destroy();\n return;\n }\n\n const tokenHeader = protocolHeader.replace(new RegExp(`^${PROTOCOL_TOKEN_PREFIX}.`), '');\n\n // padding characters are not allowed as a websocket protocol.\n const encodedToken = Buffer.from(token).toString('base64').replace(/=*$/, '');\n\n if (tokenHeader !== encodedToken) {\n log('upgrade unauthorized', { token, foo: encodedToken });\n socket.write('HTTP/1.1 401 Unauthorized\\r\\n\\r\\n');\n socket.destroy();\n return;\n }\n\n cb(request, socket, upgradeHead);\n};\n\nexport class WebSocketWithTokenAuth extends WebSocket {\n constructor(url: string, token: string) {\n const encodedToken = Buffer.from(token).toString('base64').replace(/=*$/, '');\n\n const wsProtocols = [`base64url.bearer.authorization.dxos.org.${encodedToken}`];\n super(url, wsProtocols);\n log('encodedToken', {\n encodedToken,\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type IncomingMessage } from 'http';\nimport WebSocket from 'isomorphic-ws';\nimport { type Socket } from 'node:net';\n\nimport { log } from '@dxos/log';\nimport { createProtoRpcPeer, type ProtoRpcPeer, type ProtoRpcPeerOptions } from '@dxos/rpc';\n\nexport type ConnectionInfo = {\n request: IncomingMessage;\n};\n\nexport type ConnectionHandler<C, S> = {\n onOpen?: (rpc: ProtoRpcPeer<C>) => Promise<void>;\n onClose?: (rpc: ProtoRpcPeer<C>) => Promise<void>;\n} & Pick<ProtoRpcPeerOptions<C, S>, 'requested' | 'exposed' | 'handlers'>;\n\nexport type WebsocketRpcServerParams<C, S> = {\n onConnection: (info: ConnectionInfo) => Promise<ConnectionHandler<C, S>>;\n} & WebSocket.ServerOptions;\n\nexport class WebsocketRpcServer<C, S> {\n private _server?: WebSocket.Server;\n\n constructor(private readonly _params: WebsocketRpcServerParams<C, S>) {}\n handleUpgrade(request: IncomingMessage, socket: Socket, head: Buffer): void {\n this._server?.handleUpgrade(request, socket, head, (ws) => {\n this._server?.emit('connection', ws, request);\n });\n }\n\n async open(): Promise<void> {\n this._server = new WebSocket.Server({\n ...this._params,\n });\n this._server.on('connection', async (socket, request) => {\n log('connection', { url: request.url, headers: request.headers });\n const info: ConnectionInfo = {\n request,\n };\n const { onOpen, onClose, ...options } = await this._params.onConnection(info);\n const rpc = createProtoRpcPeer<C, S>({\n ...options,\n port: {\n send: (msg) => {\n socket.send(msg);\n },\n subscribe: (cb) => {\n socket.onmessage = async (msg: WebSocket.MessageEvent) => {\n if (typeof Blob !== 'undefined' && msg.data instanceof Blob) {\n cb(Buffer.from(await msg.data.arrayBuffer()));\n } else {\n cb(msg.data as any);\n }\n };\n },\n },\n });\n\n await rpc.open();\n await onOpen?.(rpc);\n socket.onclose = async () => {\n await onClose?.(rpc);\n await rpc.close();\n };\n });\n }\n\n async close(): Promise<void> {\n this._server?.close();\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["WebSocket", "Event", "Trigger", "log", "logInfo", "createProtoRpcPeer", "WebSocket", "log", "PROTOCOL_TOKEN_PREFIX", "authenticateRequestWithTokenAuth", "request", "socket", "upgradeHead", "token", "cb", "protocolHeader", "headers", "header", "write", "destroy", "tokenHeader", "replace", "RegExp", "encodedToken", "Buffer", "from", "toString", "foo", "WebSocketWithTokenAuth", "url", "wsProtocols", "WebsocketRpcClient", "_params", "_connectTrigger", "Trigger", "connected", "Event", "disconnected", "error", "_rpc", "createProtoRpcPeer", "requested", "exposed", "handlers", "noHandshake", "port", "send", "msg", "_socket", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "from", "arrayBuffer", "url", "open", "authenticationToken", "WebSocketWithTokenAuth", "WebSocket", "onopen", "log", "emit", "wake", "err", "onclose", "close", "onerror", "event", "message", "Error", "throw", "wait", "catch", "rpc", "WebSocket", "log", "createProtoRpcPeer", "WebsocketRpcServer", "_params", "handleUpgrade", "request", "socket", "head", "_server", "ws", "emit", "open", "Server", "on", "url", "headers", "info", "onOpen", "onClose", "options", "onConnection", "rpc", "port", "send", "msg", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "from", "arrayBuffer", "onclose", "close"]
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { Event, Trigger } from '@dxos/async';\nimport { log, logInfo } from '@dxos/log';\nimport { type ProtoRpcPeer, type ProtoRpcPeerOptions, createProtoRpcPeer } from '@dxos/rpc';\n\nimport { WebSocketWithTokenAuth } from './token-auth';\n\nexport type WebsocketRpcClientParams<C, S> = {\n url: string;\n authenticationToken?: string;\n} & Pick<ProtoRpcPeerOptions<C, S>, 'requested' | 'exposed' | 'handlers' | 'noHandshake'>;\n\nexport class WebsocketRpcClient<C, S> {\n private _socket?: WebSocket;\n private _rpc?: ProtoRpcPeer<C>;\n private readonly _connectTrigger = new Trigger();\n\n readonly connected = new Event();\n readonly disconnected = new Event();\n readonly error = new Event<Error>();\n\n constructor(private readonly _params: WebsocketRpcClientParams<C, S>) {\n this._rpc = createProtoRpcPeer({\n requested: this._params.requested,\n exposed: this._params.exposed,\n handlers: this._params.handlers,\n noHandshake: this._params.noHandshake,\n port: {\n send: (msg) => {\n this._socket!.send(msg);\n },\n subscribe: (cb) => {\n this._socket!.onmessage = async (msg: WebSocket.MessageEvent) => {\n if (typeof Blob !== 'undefined' && msg.data instanceof Blob) {\n cb(Buffer.from(await msg.data.arrayBuffer()));\n } else {\n cb(msg.data as any);\n }\n };\n },\n },\n });\n }\n\n @logInfo\n get url() {\n return this._params.url;\n }\n\n async open(): Promise<void> {\n if (this._params.authenticationToken) {\n this._socket = new WebSocketWithTokenAuth(this._params.url, this._params.authenticationToken);\n } else {\n this._socket = new WebSocket(this._params.url);\n }\n this._socket.onopen = async () => {\n log('Socket open');\n try {\n await this._rpc!.open();\n log(`RPC open ${this._params.url}`);\n this.connected.emit();\n this._connectTrigger.wake();\n } catch (err: any) {\n this.error.emit(err);\n }\n };\n\n this._socket.onclose = async () => {\n log(`Disconnected ${this._params.url}`);\n this.disconnected.emit();\n await this.close();\n };\n\n this._socket.onerror = (event: WebSocket.ErrorEvent) => {\n // Browsers do not include the error message in the event object, so we cannot discern 401 errors from other errors.\n log.error(event.message ?? 'Socket error', { url: this._params.url });\n const error = event.error ?? new Error(event.message);\n this.error.emit(error);\n this._connectTrigger.throw(error);\n };\n\n await this._connectTrigger.wait();\n }\n\n async close(): Promise<void> {\n try {\n await this._rpc?.close();\n } catch (err) {\n log.catch(err);\n }\n this._socket?.close();\n }\n\n get rpc() {\n return this._rpc!.rpc;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// Implement WS header-based auth similar to https://github.com/kubernetes/kubernetes/commit/714f97d7baf4975ad3aa47735a868a81a984d1f0\n// https://stackoverflow.com/questions/4361173/http-headers-in-websockets-client-api/77060459#77060459\n\nimport { type IncomingMessage } from 'http';\nimport { type Socket } from 'node:net';\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { log } from '@dxos/log';\n\nconst PROTOCOL_TOKEN_PREFIX = 'base64url.bearer.authorization.dxos.org';\n\n// TODO: implement middleware which removes the token from the request\n\nexport const authenticateRequestWithTokenAuth = (\n request: IncomingMessage,\n socket: Socket,\n upgradeHead: Buffer,\n token: string,\n cb: (request: IncomingMessage, socket: Socket, upgradeHead: Buffer) => void,\n) => {\n const protocolHeader = request.headers['sec-websocket-protocol'];\n\n if (!protocolHeader) {\n log('upgrade unauthorized, header missing', { header: request.headers['sec-websocket-protocol'] });\n socket.write('HTTP/1.1 401 Unauthorized\\r\\n\\r\\n');\n socket.destroy();\n return;\n }\n\n const tokenHeader = protocolHeader.replace(new RegExp(`^${PROTOCOL_TOKEN_PREFIX}.`), '');\n\n // padding characters are not allowed as a websocket protocol.\n const encodedToken = Buffer.from(token).toString('base64').replace(/=*$/, '');\n\n if (tokenHeader !== encodedToken) {\n log('upgrade unauthorized', { token, foo: encodedToken });\n socket.write('HTTP/1.1 401 Unauthorized\\r\\n\\r\\n');\n socket.destroy();\n return;\n }\n\n cb(request, socket, upgradeHead);\n};\n\nexport class WebSocketWithTokenAuth extends WebSocket {\n constructor(url: string, token: string) {\n const encodedToken = Buffer.from(token).toString('base64').replace(/=*$/, '');\n\n const wsProtocols = [`base64url.bearer.authorization.dxos.org.${encodedToken}`];\n super(url, wsProtocols);\n log('encodedToken', {\n encodedToken,\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type IncomingMessage } from 'http';\nimport { type Socket } from 'node:net';\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { log } from '@dxos/log';\nimport { type ProtoRpcPeer, type ProtoRpcPeerOptions, createProtoRpcPeer } from '@dxos/rpc';\n\nexport type ConnectionInfo = {\n request: IncomingMessage;\n};\n\nexport type ConnectionHandler<C, S> = {\n onOpen?: (rpc: ProtoRpcPeer<C>) => Promise<void>;\n onClose?: (rpc: ProtoRpcPeer<C>) => Promise<void>;\n} & Pick<ProtoRpcPeerOptions<C, S>, 'requested' | 'exposed' | 'handlers'>;\n\nexport type WebsocketRpcServerParams<C, S> = {\n onConnection: (info: ConnectionInfo) => Promise<ConnectionHandler<C, S>>;\n} & WebSocket.ServerOptions;\n\nexport class WebsocketRpcServer<C, S> {\n private _server?: WebSocket.Server;\n\n constructor(private readonly _params: WebsocketRpcServerParams<C, S>) {}\n handleUpgrade(request: IncomingMessage, socket: Socket, head: Buffer): void {\n this._server?.handleUpgrade(request, socket, head, (ws) => {\n this._server?.emit('connection', ws, request);\n });\n }\n\n async open(): Promise<void> {\n this._server = new WebSocket.Server({\n ...this._params,\n });\n this._server.on('connection', async (socket, request) => {\n log('connection', { url: request.url, headers: request.headers });\n const info: ConnectionInfo = {\n request,\n };\n const { onOpen, onClose, ...options } = await this._params.onConnection(info);\n const rpc = createProtoRpcPeer<C, S>({\n ...options,\n port: {\n send: (msg) => {\n socket.send(msg);\n },\n subscribe: (cb) => {\n socket.onmessage = async (msg: WebSocket.MessageEvent) => {\n if (typeof Blob !== 'undefined' && msg.data instanceof Blob) {\n cb(Buffer.from(await msg.data.arrayBuffer()));\n } else {\n cb(msg.data as any);\n }\n };\n },\n },\n });\n\n await rpc.open();\n await onOpen?.(rpc);\n socket.onclose = async () => {\n await onClose?.(rpc);\n await rpc.close();\n };\n });\n }\n\n async close(): Promise<void> {\n this._server?.close();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["WebSocket", "Event", "Trigger", "log", "logInfo", "createProtoRpcPeer", "WebSocket", "log", "PROTOCOL_TOKEN_PREFIX", "authenticateRequestWithTokenAuth", "request", "socket", "upgradeHead", "token", "cb", "protocolHeader", "headers", "header", "write", "destroy", "tokenHeader", "replace", "RegExp", "encodedToken", "Buffer", "from", "toString", "foo", "WebSocketWithTokenAuth", "url", "wsProtocols", "WebsocketRpcClient", "url", "_params", "open", "authenticationToken", "_socket", "WebSocketWithTokenAuth", "WebSocket", "onopen", "log", "_rpc", "connected", "emit", "_connectTrigger", "wake", "err", "error", "onclose", "disconnected", "close", "onerror", "event", "message", "Error", "throw", "wait", "catch", "rpc", "Trigger", "Event", "createProtoRpcPeer", "requested", "exposed", "handlers", "noHandshake", "port", "send", "msg", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "from", "arrayBuffer", "WebSocket", "log", "createProtoRpcPeer", "WebsocketRpcServer", "handleUpgrade", "request", "socket", "head", "_server", "ws", "emit", "open", "Server", "_params", "on", "url", "headers", "info", "onOpen", "onClose", "options", "onConnection", "rpc", "port", "send", "msg", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "from", "arrayBuffer", "onclose", "close", "_define_property"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/core/mesh/websocket-rpc/src/token-auth.ts":{"bytes":6772,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/websocket-rpc/src/client.ts":{"bytes":12235,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true},{"path":"packages/core/mesh/websocket-rpc/src/token-auth.ts","kind":"import-statement","original":"./token-auth"}],"format":"esm"},"packages/core/mesh/websocket-rpc/src/server.ts":{"bytes":7372,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/websocket-rpc/src/index.ts":{"bytes":646,"imports":[{"path":"packages/core/mesh/websocket-rpc/src/client.ts","kind":"import-statement","original":"./client"},{"path":"packages/core/mesh/websocket-rpc/src/server.ts","kind":"import-statement","original":"./server"},{"path":"packages/core/mesh/websocket-rpc/src/token-auth.ts","kind":"import-statement","original":"./token-auth"}],"format":"esm"}},"outputs":{"packages/core/mesh/websocket-rpc/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":12503},"packages/core/mesh/websocket-rpc/dist/lib/browser/index.mjs":{"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true}],"exports":["WebSocketWithTokenAuth","WebsocketRpcClient","WebsocketRpcServer","authenticateRequestWithTokenAuth"],"entryPoint":"packages/core/mesh/websocket-rpc/src/index.ts","inputs":{"packages/core/mesh/websocket-rpc/src/client.ts":{"bytesInOutput":3480},"packages/core/mesh/websocket-rpc/src/token-auth.ts":{"bytesInOutput":1669},"packages/core/mesh/websocket-rpc/src/index.ts":{"bytesInOutput":0},"packages/core/mesh/websocket-rpc/src/server.ts":{"bytesInOutput":1688}},"bytes":7230}}}
1
+ {"inputs":{"src/token-auth.ts":{"bytes":6763,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"src/client.ts":{"bytes":12851,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true},{"path":"src/token-auth.ts","kind":"import-statement","original":"./token-auth"}],"format":"esm"},"src/server.ts":{"bytes":7774,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":633,"imports":[{"path":"src/client.ts","kind":"import-statement","original":"./client"},{"path":"src/server.ts","kind":"import-statement","original":"./server"},{"path":"src/token-auth.ts","kind":"import-statement","original":"./token-auth"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":12739},"dist/lib/browser/index.mjs":{"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true}],"exports":["WebSocketWithTokenAuth","WebsocketRpcClient","WebsocketRpcServer","authenticateRequestWithTokenAuth"],"entryPoint":"src/index.ts","inputs":{"src/client.ts":{"bytesInOutput":4054},"src/token-auth.ts":{"bytesInOutput":1656},"src/index.ts":{"bytesInOutput":0},"src/server.ts":{"bytesInOutput":2020}},"bytes":7991}}}
@@ -1,15 +1,15 @@
1
1
  import { createRequire } from 'node:module';const require = createRequire(import.meta.url);
2
2
 
3
- // packages/core/mesh/websocket-rpc/src/client.ts
3
+ // src/client.ts
4
4
  import WebSocket2 from "isomorphic-ws";
5
5
  import { Event, Trigger } from "@dxos/async";
6
6
  import { log as log2, logInfo } from "@dxos/log";
7
7
  import { createProtoRpcPeer } from "@dxos/rpc";
8
8
 
9
- // packages/core/mesh/websocket-rpc/src/token-auth.ts
9
+ // src/token-auth.ts
10
10
  import WebSocket from "isomorphic-ws";
11
11
  import { log } from "@dxos/log";
12
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/mesh/websocket-rpc/src/token-auth.ts";
12
+ var __dxlog_file = "/__w/dxos/dxos/packages/core/mesh/websocket-rpc/src/token-auth.ts";
13
13
  var PROTOCOL_TOKEN_PREFIX = "base64url.bearer.authorization.dxos.org";
14
14
  var authenticateRequestWithTokenAuth = (request, socket, upgradeHead, token, cb) => {
15
15
  const protocolHeader = request.headers["sec-websocket-protocol"];
@@ -18,7 +18,7 @@ var authenticateRequestWithTokenAuth = (request, socket, upgradeHead, token, cb)
18
18
  header: request.headers["sec-websocket-protocol"]
19
19
  }, {
20
20
  F: __dxlog_file,
21
- L: 28,
21
+ L: 29,
22
22
  S: void 0,
23
23
  C: (f, a) => f(...a)
24
24
  });
@@ -34,7 +34,7 @@ var authenticateRequestWithTokenAuth = (request, socket, upgradeHead, token, cb)
34
34
  foo: encodedToken
35
35
  }, {
36
36
  F: __dxlog_file,
37
- L: 40,
37
+ L: 41,
38
38
  S: void 0,
39
39
  C: (f, a) => f(...a)
40
40
  });
@@ -55,49 +55,35 @@ var WebSocketWithTokenAuth = class extends WebSocket {
55
55
  encodedToken
56
56
  }, {
57
57
  F: __dxlog_file,
58
- L: 55,
58
+ L: 56,
59
59
  S: this,
60
60
  C: (f, a) => f(...a)
61
61
  });
62
62
  }
63
63
  };
64
64
 
65
- // packages/core/mesh/websocket-rpc/src/client.ts
65
+ // src/client.ts
66
+ function _define_property(obj, key, value) {
67
+ if (key in obj) {
68
+ Object.defineProperty(obj, key, {
69
+ value,
70
+ enumerable: true,
71
+ configurable: true,
72
+ writable: true
73
+ });
74
+ } else {
75
+ obj[key] = value;
76
+ }
77
+ return obj;
78
+ }
66
79
  function _ts_decorate(decorators, target, key, desc) {
67
80
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
68
81
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
69
82
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
70
83
  return c > 3 && r && Object.defineProperty(target, key, r), r;
71
84
  }
72
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/mesh/websocket-rpc/src/client.ts";
85
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/core/mesh/websocket-rpc/src/client.ts";
73
86
  var WebsocketRpcClient = class {
74
- constructor(_params) {
75
- this._params = _params;
76
- this._connectTrigger = new Trigger();
77
- this.connected = new Event();
78
- this.disconnected = new Event();
79
- this.error = new Event();
80
- this._rpc = createProtoRpcPeer({
81
- requested: this._params.requested,
82
- exposed: this._params.exposed,
83
- handlers: this._params.handlers,
84
- noHandshake: this._params.noHandshake,
85
- port: {
86
- send: (msg) => {
87
- this._socket.send(msg);
88
- },
89
- subscribe: (cb) => {
90
- this._socket.onmessage = async (msg) => {
91
- if (typeof Blob !== "undefined" && msg.data instanceof Blob) {
92
- cb(Buffer.from(await msg.data.arrayBuffer()));
93
- } else {
94
- cb(msg.data);
95
- }
96
- };
97
- }
98
- }
99
- });
100
- }
101
87
  get url() {
102
88
  return this._params.url;
103
89
  }
@@ -169,20 +155,64 @@ var WebsocketRpcClient = class {
169
155
  get rpc() {
170
156
  return this._rpc.rpc;
171
157
  }
158
+ constructor(_params) {
159
+ _define_property(this, "_params", void 0);
160
+ _define_property(this, "_socket", void 0);
161
+ _define_property(this, "_rpc", void 0);
162
+ _define_property(this, "_connectTrigger", void 0);
163
+ _define_property(this, "connected", void 0);
164
+ _define_property(this, "disconnected", void 0);
165
+ _define_property(this, "error", void 0);
166
+ this._params = _params;
167
+ this._connectTrigger = new Trigger();
168
+ this.connected = new Event();
169
+ this.disconnected = new Event();
170
+ this.error = new Event();
171
+ this._rpc = createProtoRpcPeer({
172
+ requested: this._params.requested,
173
+ exposed: this._params.exposed,
174
+ handlers: this._params.handlers,
175
+ noHandshake: this._params.noHandshake,
176
+ port: {
177
+ send: (msg) => {
178
+ this._socket.send(msg);
179
+ },
180
+ subscribe: (cb) => {
181
+ this._socket.onmessage = async (msg) => {
182
+ if (typeof Blob !== "undefined" && msg.data instanceof Blob) {
183
+ cb(Buffer.from(await msg.data.arrayBuffer()));
184
+ } else {
185
+ cb(msg.data);
186
+ }
187
+ };
188
+ }
189
+ }
190
+ });
191
+ }
172
192
  };
173
193
  _ts_decorate([
174
194
  logInfo
175
195
  ], WebsocketRpcClient.prototype, "url", null);
176
196
 
177
- // packages/core/mesh/websocket-rpc/src/server.ts
197
+ // src/server.ts
178
198
  import WebSocket3 from "isomorphic-ws";
179
199
  import { log as log3 } from "@dxos/log";
180
200
  import { createProtoRpcPeer as createProtoRpcPeer2 } from "@dxos/rpc";
181
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/mesh/websocket-rpc/src/server.ts";
182
- var WebsocketRpcServer = class {
183
- constructor(_params) {
184
- this._params = _params;
201
+ function _define_property2(obj, key, value) {
202
+ if (key in obj) {
203
+ Object.defineProperty(obj, key, {
204
+ value,
205
+ enumerable: true,
206
+ configurable: true,
207
+ writable: true
208
+ });
209
+ } else {
210
+ obj[key] = value;
185
211
  }
212
+ return obj;
213
+ }
214
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/core/mesh/websocket-rpc/src/server.ts";
215
+ var WebsocketRpcServer = class {
186
216
  handleUpgrade(request, socket, head) {
187
217
  this._server?.handleUpgrade(request, socket, head, (ws) => {
188
218
  this._server?.emit("connection", ws, request);
@@ -198,7 +228,7 @@ var WebsocketRpcServer = class {
198
228
  headers: request.headers
199
229
  }, {
200
230
  F: __dxlog_file3,
201
- L: 40,
231
+ L: 41,
202
232
  S: this,
203
233
  C: (f, a) => f(...a)
204
234
  });
@@ -234,6 +264,11 @@ var WebsocketRpcServer = class {
234
264
  async close() {
235
265
  this._server?.close();
236
266
  }
267
+ constructor(_params) {
268
+ _define_property2(this, "_params", void 0);
269
+ _define_property2(this, "_server", void 0);
270
+ this._params = _params;
271
+ }
237
272
  };
238
273
  export {
239
274
  WebSocketWithTokenAuth,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/client.ts", "../../../src/token-auth.ts", "../../../src/server.ts"],
4
- "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { Event, Trigger } from '@dxos/async';\nimport { log, logInfo } from '@dxos/log';\nimport { createProtoRpcPeer, type ProtoRpcPeer, type ProtoRpcPeerOptions } from '@dxos/rpc';\n\nimport { WebSocketWithTokenAuth } from './token-auth';\n\nexport type WebsocketRpcClientParams<C, S> = {\n url: string;\n authenticationToken?: string;\n} & Pick<ProtoRpcPeerOptions<C, S>, 'requested' | 'exposed' | 'handlers' | 'noHandshake'>;\n\nexport class WebsocketRpcClient<C, S> {\n private _socket?: WebSocket;\n private _rpc?: ProtoRpcPeer<C>;\n private readonly _connectTrigger = new Trigger();\n\n readonly connected = new Event();\n readonly disconnected = new Event();\n readonly error = new Event<Error>();\n\n constructor(private readonly _params: WebsocketRpcClientParams<C, S>) {\n this._rpc = createProtoRpcPeer({\n requested: this._params.requested,\n exposed: this._params.exposed,\n handlers: this._params.handlers,\n noHandshake: this._params.noHandshake,\n port: {\n send: (msg) => {\n this._socket!.send(msg);\n },\n subscribe: (cb) => {\n this._socket!.onmessage = async (msg: WebSocket.MessageEvent) => {\n if (typeof Blob !== 'undefined' && msg.data instanceof Blob) {\n cb(Buffer.from(await msg.data.arrayBuffer()));\n } else {\n cb(msg.data as any);\n }\n };\n },\n },\n });\n }\n\n @logInfo\n get url() {\n return this._params.url;\n }\n\n async open(): Promise<void> {\n if (this._params.authenticationToken) {\n this._socket = new WebSocketWithTokenAuth(this._params.url, this._params.authenticationToken);\n } else {\n this._socket = new WebSocket(this._params.url);\n }\n this._socket.onopen = async () => {\n log('Socket open');\n try {\n await this._rpc!.open();\n log(`RPC open ${this._params.url}`);\n this.connected.emit();\n this._connectTrigger.wake();\n } catch (err: any) {\n this.error.emit(err);\n }\n };\n\n this._socket.onclose = async () => {\n log(`Disconnected ${this._params.url}`);\n this.disconnected.emit();\n await this.close();\n };\n\n this._socket.onerror = (event: WebSocket.ErrorEvent) => {\n // Browsers do not include the error message in the event object, so we cannot discern 401 errors from other errors.\n log.error(event.message ?? 'Socket error', { url: this._params.url });\n const error = event.error ?? new Error(event.message);\n this.error.emit(error);\n this._connectTrigger.throw(error);\n };\n\n await this._connectTrigger.wait();\n }\n\n async close(): Promise<void> {\n try {\n await this._rpc?.close();\n } catch (err) {\n log.catch(err);\n }\n this._socket?.close();\n }\n\n get rpc() {\n return this._rpc!.rpc;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// Implement WS header-based auth similar to https://github.com/kubernetes/kubernetes/commit/714f97d7baf4975ad3aa47735a868a81a984d1f0\n// https://stackoverflow.com/questions/4361173/http-headers-in-websockets-client-api/77060459#77060459\n\nimport { type IncomingMessage } from 'http';\nimport WebSocket from 'isomorphic-ws';\nimport { type Socket } from 'node:net';\n\nimport { log } from '@dxos/log';\n\nconst PROTOCOL_TOKEN_PREFIX = 'base64url.bearer.authorization.dxos.org';\n\n// TODO: implement middleware which removes the token from the request\n\nexport const authenticateRequestWithTokenAuth = (\n request: IncomingMessage,\n socket: Socket,\n upgradeHead: Buffer,\n token: string,\n cb: (request: IncomingMessage, socket: Socket, upgradeHead: Buffer) => void,\n) => {\n const protocolHeader = request.headers['sec-websocket-protocol'];\n\n if (!protocolHeader) {\n log('upgrade unauthorized, header missing', { header: request.headers['sec-websocket-protocol'] });\n socket.write('HTTP/1.1 401 Unauthorized\\r\\n\\r\\n');\n socket.destroy();\n return;\n }\n\n const tokenHeader = protocolHeader.replace(new RegExp(`^${PROTOCOL_TOKEN_PREFIX}.`), '');\n\n // padding characters are not allowed as a websocket protocol.\n const encodedToken = Buffer.from(token).toString('base64').replace(/=*$/, '');\n\n if (tokenHeader !== encodedToken) {\n log('upgrade unauthorized', { token, foo: encodedToken });\n socket.write('HTTP/1.1 401 Unauthorized\\r\\n\\r\\n');\n socket.destroy();\n return;\n }\n\n cb(request, socket, upgradeHead);\n};\n\nexport class WebSocketWithTokenAuth extends WebSocket {\n constructor(url: string, token: string) {\n const encodedToken = Buffer.from(token).toString('base64').replace(/=*$/, '');\n\n const wsProtocols = [`base64url.bearer.authorization.dxos.org.${encodedToken}`];\n super(url, wsProtocols);\n log('encodedToken', {\n encodedToken,\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type IncomingMessage } from 'http';\nimport WebSocket from 'isomorphic-ws';\nimport { type Socket } from 'node:net';\n\nimport { log } from '@dxos/log';\nimport { createProtoRpcPeer, type ProtoRpcPeer, type ProtoRpcPeerOptions } from '@dxos/rpc';\n\nexport type ConnectionInfo = {\n request: IncomingMessage;\n};\n\nexport type ConnectionHandler<C, S> = {\n onOpen?: (rpc: ProtoRpcPeer<C>) => Promise<void>;\n onClose?: (rpc: ProtoRpcPeer<C>) => Promise<void>;\n} & Pick<ProtoRpcPeerOptions<C, S>, 'requested' | 'exposed' | 'handlers'>;\n\nexport type WebsocketRpcServerParams<C, S> = {\n onConnection: (info: ConnectionInfo) => Promise<ConnectionHandler<C, S>>;\n} & WebSocket.ServerOptions;\n\nexport class WebsocketRpcServer<C, S> {\n private _server?: WebSocket.Server;\n\n constructor(private readonly _params: WebsocketRpcServerParams<C, S>) {}\n handleUpgrade(request: IncomingMessage, socket: Socket, head: Buffer): void {\n this._server?.handleUpgrade(request, socket, head, (ws) => {\n this._server?.emit('connection', ws, request);\n });\n }\n\n async open(): Promise<void> {\n this._server = new WebSocket.Server({\n ...this._params,\n });\n this._server.on('connection', async (socket, request) => {\n log('connection', { url: request.url, headers: request.headers });\n const info: ConnectionInfo = {\n request,\n };\n const { onOpen, onClose, ...options } = await this._params.onConnection(info);\n const rpc = createProtoRpcPeer<C, S>({\n ...options,\n port: {\n send: (msg) => {\n socket.send(msg);\n },\n subscribe: (cb) => {\n socket.onmessage = async (msg: WebSocket.MessageEvent) => {\n if (typeof Blob !== 'undefined' && msg.data instanceof Blob) {\n cb(Buffer.from(await msg.data.arrayBuffer()));\n } else {\n cb(msg.data as any);\n }\n };\n },\n },\n });\n\n await rpc.open();\n await onOpen?.(rpc);\n socket.onclose = async () => {\n await onClose?.(rpc);\n await rpc.close();\n };\n });\n }\n\n async close(): Promise<void> {\n this._server?.close();\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["WebSocket", "Event", "Trigger", "log", "logInfo", "createProtoRpcPeer", "WebSocket", "log", "PROTOCOL_TOKEN_PREFIX", "authenticateRequestWithTokenAuth", "request", "socket", "upgradeHead", "token", "cb", "protocolHeader", "headers", "header", "write", "destroy", "tokenHeader", "replace", "RegExp", "encodedToken", "Buffer", "from", "toString", "foo", "WebSocketWithTokenAuth", "url", "wsProtocols", "WebsocketRpcClient", "_params", "_connectTrigger", "Trigger", "connected", "Event", "disconnected", "error", "_rpc", "createProtoRpcPeer", "requested", "exposed", "handlers", "noHandshake", "port", "send", "msg", "_socket", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "from", "arrayBuffer", "url", "open", "authenticationToken", "WebSocketWithTokenAuth", "WebSocket", "onopen", "log", "emit", "wake", "err", "onclose", "close", "onerror", "event", "message", "Error", "throw", "wait", "catch", "rpc", "WebSocket", "log", "createProtoRpcPeer", "WebsocketRpcServer", "_params", "handleUpgrade", "request", "socket", "head", "_server", "ws", "emit", "open", "Server", "on", "url", "headers", "info", "onOpen", "onClose", "options", "onConnection", "rpc", "port", "send", "msg", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "from", "arrayBuffer", "onclose", "close"]
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { Event, Trigger } from '@dxos/async';\nimport { log, logInfo } from '@dxos/log';\nimport { type ProtoRpcPeer, type ProtoRpcPeerOptions, createProtoRpcPeer } from '@dxos/rpc';\n\nimport { WebSocketWithTokenAuth } from './token-auth';\n\nexport type WebsocketRpcClientParams<C, S> = {\n url: string;\n authenticationToken?: string;\n} & Pick<ProtoRpcPeerOptions<C, S>, 'requested' | 'exposed' | 'handlers' | 'noHandshake'>;\n\nexport class WebsocketRpcClient<C, S> {\n private _socket?: WebSocket;\n private _rpc?: ProtoRpcPeer<C>;\n private readonly _connectTrigger = new Trigger();\n\n readonly connected = new Event();\n readonly disconnected = new Event();\n readonly error = new Event<Error>();\n\n constructor(private readonly _params: WebsocketRpcClientParams<C, S>) {\n this._rpc = createProtoRpcPeer({\n requested: this._params.requested,\n exposed: this._params.exposed,\n handlers: this._params.handlers,\n noHandshake: this._params.noHandshake,\n port: {\n send: (msg) => {\n this._socket!.send(msg);\n },\n subscribe: (cb) => {\n this._socket!.onmessage = async (msg: WebSocket.MessageEvent) => {\n if (typeof Blob !== 'undefined' && msg.data instanceof Blob) {\n cb(Buffer.from(await msg.data.arrayBuffer()));\n } else {\n cb(msg.data as any);\n }\n };\n },\n },\n });\n }\n\n @logInfo\n get url() {\n return this._params.url;\n }\n\n async open(): Promise<void> {\n if (this._params.authenticationToken) {\n this._socket = new WebSocketWithTokenAuth(this._params.url, this._params.authenticationToken);\n } else {\n this._socket = new WebSocket(this._params.url);\n }\n this._socket.onopen = async () => {\n log('Socket open');\n try {\n await this._rpc!.open();\n log(`RPC open ${this._params.url}`);\n this.connected.emit();\n this._connectTrigger.wake();\n } catch (err: any) {\n this.error.emit(err);\n }\n };\n\n this._socket.onclose = async () => {\n log(`Disconnected ${this._params.url}`);\n this.disconnected.emit();\n await this.close();\n };\n\n this._socket.onerror = (event: WebSocket.ErrorEvent) => {\n // Browsers do not include the error message in the event object, so we cannot discern 401 errors from other errors.\n log.error(event.message ?? 'Socket error', { url: this._params.url });\n const error = event.error ?? new Error(event.message);\n this.error.emit(error);\n this._connectTrigger.throw(error);\n };\n\n await this._connectTrigger.wait();\n }\n\n async close(): Promise<void> {\n try {\n await this._rpc?.close();\n } catch (err) {\n log.catch(err);\n }\n this._socket?.close();\n }\n\n get rpc() {\n return this._rpc!.rpc;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// Implement WS header-based auth similar to https://github.com/kubernetes/kubernetes/commit/714f97d7baf4975ad3aa47735a868a81a984d1f0\n// https://stackoverflow.com/questions/4361173/http-headers-in-websockets-client-api/77060459#77060459\n\nimport { type IncomingMessage } from 'http';\nimport { type Socket } from 'node:net';\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { log } from '@dxos/log';\n\nconst PROTOCOL_TOKEN_PREFIX = 'base64url.bearer.authorization.dxos.org';\n\n// TODO: implement middleware which removes the token from the request\n\nexport const authenticateRequestWithTokenAuth = (\n request: IncomingMessage,\n socket: Socket,\n upgradeHead: Buffer,\n token: string,\n cb: (request: IncomingMessage, socket: Socket, upgradeHead: Buffer) => void,\n) => {\n const protocolHeader = request.headers['sec-websocket-protocol'];\n\n if (!protocolHeader) {\n log('upgrade unauthorized, header missing', { header: request.headers['sec-websocket-protocol'] });\n socket.write('HTTP/1.1 401 Unauthorized\\r\\n\\r\\n');\n socket.destroy();\n return;\n }\n\n const tokenHeader = protocolHeader.replace(new RegExp(`^${PROTOCOL_TOKEN_PREFIX}.`), '');\n\n // padding characters are not allowed as a websocket protocol.\n const encodedToken = Buffer.from(token).toString('base64').replace(/=*$/, '');\n\n if (tokenHeader !== encodedToken) {\n log('upgrade unauthorized', { token, foo: encodedToken });\n socket.write('HTTP/1.1 401 Unauthorized\\r\\n\\r\\n');\n socket.destroy();\n return;\n }\n\n cb(request, socket, upgradeHead);\n};\n\nexport class WebSocketWithTokenAuth extends WebSocket {\n constructor(url: string, token: string) {\n const encodedToken = Buffer.from(token).toString('base64').replace(/=*$/, '');\n\n const wsProtocols = [`base64url.bearer.authorization.dxos.org.${encodedToken}`];\n super(url, wsProtocols);\n log('encodedToken', {\n encodedToken,\n });\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { type IncomingMessage } from 'http';\nimport { type Socket } from 'node:net';\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { log } from '@dxos/log';\nimport { type ProtoRpcPeer, type ProtoRpcPeerOptions, createProtoRpcPeer } from '@dxos/rpc';\n\nexport type ConnectionInfo = {\n request: IncomingMessage;\n};\n\nexport type ConnectionHandler<C, S> = {\n onOpen?: (rpc: ProtoRpcPeer<C>) => Promise<void>;\n onClose?: (rpc: ProtoRpcPeer<C>) => Promise<void>;\n} & Pick<ProtoRpcPeerOptions<C, S>, 'requested' | 'exposed' | 'handlers'>;\n\nexport type WebsocketRpcServerParams<C, S> = {\n onConnection: (info: ConnectionInfo) => Promise<ConnectionHandler<C, S>>;\n} & WebSocket.ServerOptions;\n\nexport class WebsocketRpcServer<C, S> {\n private _server?: WebSocket.Server;\n\n constructor(private readonly _params: WebsocketRpcServerParams<C, S>) {}\n handleUpgrade(request: IncomingMessage, socket: Socket, head: Buffer): void {\n this._server?.handleUpgrade(request, socket, head, (ws) => {\n this._server?.emit('connection', ws, request);\n });\n }\n\n async open(): Promise<void> {\n this._server = new WebSocket.Server({\n ...this._params,\n });\n this._server.on('connection', async (socket, request) => {\n log('connection', { url: request.url, headers: request.headers });\n const info: ConnectionInfo = {\n request,\n };\n const { onOpen, onClose, ...options } = await this._params.onConnection(info);\n const rpc = createProtoRpcPeer<C, S>({\n ...options,\n port: {\n send: (msg) => {\n socket.send(msg);\n },\n subscribe: (cb) => {\n socket.onmessage = async (msg: WebSocket.MessageEvent) => {\n if (typeof Blob !== 'undefined' && msg.data instanceof Blob) {\n cb(Buffer.from(await msg.data.arrayBuffer()));\n } else {\n cb(msg.data as any);\n }\n };\n },\n },\n });\n\n await rpc.open();\n await onOpen?.(rpc);\n socket.onclose = async () => {\n await onClose?.(rpc);\n await rpc.close();\n };\n });\n }\n\n async close(): Promise<void> {\n this._server?.close();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["WebSocket", "Event", "Trigger", "log", "logInfo", "createProtoRpcPeer", "WebSocket", "log", "PROTOCOL_TOKEN_PREFIX", "authenticateRequestWithTokenAuth", "request", "socket", "upgradeHead", "token", "cb", "protocolHeader", "headers", "header", "write", "destroy", "tokenHeader", "replace", "RegExp", "encodedToken", "Buffer", "from", "toString", "foo", "WebSocketWithTokenAuth", "url", "wsProtocols", "WebsocketRpcClient", "url", "_params", "open", "authenticationToken", "_socket", "WebSocketWithTokenAuth", "WebSocket", "onopen", "log", "_rpc", "connected", "emit", "_connectTrigger", "wake", "err", "error", "onclose", "disconnected", "close", "onerror", "event", "message", "Error", "throw", "wait", "catch", "rpc", "Trigger", "Event", "createProtoRpcPeer", "requested", "exposed", "handlers", "noHandshake", "port", "send", "msg", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "from", "arrayBuffer", "WebSocket", "log", "createProtoRpcPeer", "WebsocketRpcServer", "handleUpgrade", "request", "socket", "head", "_server", "ws", "emit", "open", "Server", "_params", "on", "url", "headers", "info", "onOpen", "onClose", "options", "onConnection", "rpc", "port", "send", "msg", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "from", "arrayBuffer", "onclose", "close", "_define_property"]
7
7
  }
@@ -1 +1 @@
1
- {"inputs":{"packages/core/mesh/websocket-rpc/src/token-auth.ts":{"bytes":6772,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/websocket-rpc/src/client.ts":{"bytes":12235,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true},{"path":"packages/core/mesh/websocket-rpc/src/token-auth.ts","kind":"import-statement","original":"./token-auth"}],"format":"esm"},"packages/core/mesh/websocket-rpc/src/server.ts":{"bytes":7372,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true}],"format":"esm"},"packages/core/mesh/websocket-rpc/src/index.ts":{"bytes":646,"imports":[{"path":"packages/core/mesh/websocket-rpc/src/client.ts","kind":"import-statement","original":"./client"},{"path":"packages/core/mesh/websocket-rpc/src/server.ts","kind":"import-statement","original":"./server"},{"path":"packages/core/mesh/websocket-rpc/src/token-auth.ts","kind":"import-statement","original":"./token-auth"}],"format":"esm"}},"outputs":{"packages/core/mesh/websocket-rpc/dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":12503},"packages/core/mesh/websocket-rpc/dist/lib/node-esm/index.mjs":{"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true}],"exports":["WebSocketWithTokenAuth","WebsocketRpcClient","WebsocketRpcServer","authenticateRequestWithTokenAuth"],"entryPoint":"packages/core/mesh/websocket-rpc/src/index.ts","inputs":{"packages/core/mesh/websocket-rpc/src/client.ts":{"bytesInOutput":3480},"packages/core/mesh/websocket-rpc/src/token-auth.ts":{"bytesInOutput":1669},"packages/core/mesh/websocket-rpc/src/index.ts":{"bytesInOutput":0},"packages/core/mesh/websocket-rpc/src/server.ts":{"bytesInOutput":1688}},"bytes":7289}}}
1
+ {"inputs":{"src/token-auth.ts":{"bytes":6763,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true}],"format":"esm"},"src/client.ts":{"bytes":12851,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true},{"path":"src/token-auth.ts","kind":"import-statement","original":"./token-auth"}],"format":"esm"},"src/server.ts":{"bytes":7774,"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":633,"imports":[{"path":"src/client.ts","kind":"import-statement","original":"./client"},{"path":"src/server.ts","kind":"import-statement","original":"./server"},{"path":"src/token-auth.ts","kind":"import-statement","original":"./token-auth"}],"format":"esm"}},"outputs":{"dist/lib/node-esm/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":12739},"dist/lib/node-esm/index.mjs":{"imports":[{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"isomorphic-ws","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/rpc","kind":"import-statement","external":true}],"exports":["WebSocketWithTokenAuth","WebsocketRpcClient","WebsocketRpcServer","authenticateRequestWithTokenAuth"],"entryPoint":"src/index.ts","inputs":{"src/client.ts":{"bytesInOutput":4054},"src/token-auth.ts":{"bytesInOutput":1656},"src/index.ts":{"bytesInOutput":0},"src/server.ts":{"bytesInOutput":2020}},"bytes":8050}}}
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/client.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAW,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAyC,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAI5F,MAAM,MAAM,wBAAwB,CAAC,CAAC,EAAE,CAAC,IAAI;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,CAAC,CAAC;AAE1F,qBAAa,kBAAkB,CAAC,CAAC,EAAE,CAAC;IAStB,OAAO,CAAC,QAAQ,CAAC,OAAO;IARpC,OAAO,CAAC,OAAO,CAAC,CAAY;IAC5B,OAAO,CAAC,IAAI,CAAC,CAAkB;IAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAEjD,QAAQ,CAAC,SAAS,cAAe;IACjC,QAAQ,CAAC,YAAY,cAAe;IACpC,QAAQ,CAAC,KAAK,eAAsB;gBAEP,OAAO,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC;IAuBpE,IACI,GAAG,WAEN;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmCrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,IAAI,GAAG,MAEN;CACF"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/client.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAW,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAqB,KAAK,mBAAmB,EAAsB,MAAM,WAAW,CAAC;AAI5F,MAAM,MAAM,wBAAwB,CAAC,CAAC,EAAE,CAAC,IAAI;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,aAAa,CAAC,CAAC;AAE1F,qBAAa,kBAAkB,CAAC,CAAC,EAAE,CAAC;IAStB,OAAO,CAAC,QAAQ,CAAC,OAAO;IARpC,OAAO,CAAC,OAAO,CAAC,CAAY;IAC5B,OAAO,CAAC,IAAI,CAAC,CAAkB;IAC/B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAEjD,QAAQ,CAAC,SAAS,cAAe;IACjC,QAAQ,CAAC,YAAY,cAAe;IACpC,QAAQ,CAAC,KAAK,eAAsB;gBAEP,OAAO,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC;IAuBpE,IACI,GAAG,WAEN;IAEK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmCrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,IAAI,GAAG,MAEN;CACF"}
@@ -1,6 +1,6 @@
1
1
  import { type IncomingMessage } from 'http';
2
- import WebSocket from 'isomorphic-ws';
3
2
  import { type Socket } from 'node:net';
3
+ import WebSocket from 'isomorphic-ws';
4
4
  import { type ProtoRpcPeer, type ProtoRpcPeerOptions } from '@dxos/rpc';
5
5
  export type ConnectionInfo = {
6
6
  request: IncomingMessage;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,SAAS,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAGvC,OAAO,EAAsB,KAAK,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAE5F,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,eAAe,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,CAAC,EAAE,CAAC,IAAI;IACpC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC;AAE1E,MAAM,MAAM,wBAAwB,CAAC,CAAC,EAAE,CAAC,IAAI;IAC3C,YAAY,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;CAC1E,GAAG,SAAS,CAAC,aAAa,CAAC;AAE5B,qBAAa,kBAAkB,CAAC,CAAC,EAAE,CAAC;IAGtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,OAAO,CAAC,CAAmB;gBAEN,OAAO,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC;IACpE,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAMrE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqCrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,SAAS,MAAM,eAAe,CAAC;AAGtC,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,mBAAmB,EAAsB,MAAM,WAAW,CAAC;AAE5F,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,eAAe,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,CAAC,EAAE,CAAC,IAAI;IACpC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC;AAE1E,MAAM,MAAM,wBAAwB,CAAC,CAAC,EAAE,CAAC,IAAI;IAC3C,YAAY,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;CAC1E,GAAG,SAAS,CAAC,aAAa,CAAC;AAE5B,qBAAa,kBAAkB,CAAC,CAAC,EAAE,CAAC;IAGtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,OAAO,CAAC,CAAmB;gBAEN,OAAO,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC;IACpE,aAAa,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAMrE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqCrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -1,6 +1,6 @@
1
1
  import { type IncomingMessage } from 'http';
2
- import WebSocket from 'isomorphic-ws';
3
2
  import { type Socket } from 'node:net';
3
+ import WebSocket from 'isomorphic-ws';
4
4
  export declare const authenticateRequestWithTokenAuth: (request: IncomingMessage, socket: Socket, upgradeHead: Buffer, token: string, cb: (request: IncomingMessage, socket: Socket, upgradeHead: Buffer) => void) => void;
5
5
  export declare class WebSocketWithTokenAuth extends WebSocket {
6
6
  constructor(url: string, token: string);
@@ -1 +1 @@
1
- {"version":3,"file":"token-auth.d.ts","sourceRoot":"","sources":["../../../src/token-auth.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,SAAS,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAQvC,eAAO,MAAM,gCAAgC,GAC3C,SAAS,eAAe,EACxB,QAAQ,MAAM,EACd,aAAa,MAAM,EACnB,OAAO,MAAM,EACb,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,SAwB5E,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,SAAS;gBACvC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CASvC"}
1
+ {"version":3,"file":"token-auth.d.ts","sourceRoot":"","sources":["../../../src/token-auth.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,MAAM,CAAC;AAC5C,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,SAAS,MAAM,eAAe,CAAC;AAQtC,eAAO,MAAM,gCAAgC,GAC3C,SAAS,eAAe,EACxB,QAAQ,MAAM,EACd,aAAa,MAAM,EACnB,OAAO,MAAM,EACb,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,SAwB5E,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,SAAS;gBACvC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CASvC"}