@dxos/websocket-rpc 0.8.4-main.dedc0f3 → 0.8.4-main.e8ec1fe
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/dist/lib/browser/index.mjs +35 -65
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/node-esm/index.mjs +35 -65
- package/dist/lib/node-esm/index.mjs.map +3 -3
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/src/e2e.node.test.ts +1 -1
- package/src/server.ts +2 -2
|
@@ -63,19 +63,6 @@ var WebSocketWithTokenAuth = class extends WebSocket {
|
|
|
63
63
|
};
|
|
64
64
|
|
|
65
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
|
-
}
|
|
79
66
|
function _ts_decorate(decorators, target, key, desc) {
|
|
80
67
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
81
68
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -84,6 +71,36 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
84
71
|
}
|
|
85
72
|
var __dxlog_file2 = "/__w/dxos/dxos/packages/core/mesh/websocket-rpc/src/client.ts";
|
|
86
73
|
var WebsocketRpcClient = class {
|
|
74
|
+
_params;
|
|
75
|
+
_socket;
|
|
76
|
+
_rpc;
|
|
77
|
+
_connectTrigger = new Trigger();
|
|
78
|
+
connected = new Event();
|
|
79
|
+
disconnected = new Event();
|
|
80
|
+
error = new Event();
|
|
81
|
+
constructor(_params) {
|
|
82
|
+
this._params = _params;
|
|
83
|
+
this._rpc = createProtoRpcPeer({
|
|
84
|
+
requested: this._params.requested,
|
|
85
|
+
exposed: this._params.exposed,
|
|
86
|
+
handlers: this._params.handlers,
|
|
87
|
+
noHandshake: this._params.noHandshake,
|
|
88
|
+
port: {
|
|
89
|
+
send: (msg) => {
|
|
90
|
+
this._socket.send(msg);
|
|
91
|
+
},
|
|
92
|
+
subscribe: (cb) => {
|
|
93
|
+
this._socket.onmessage = async (msg) => {
|
|
94
|
+
if (typeof Blob !== "undefined" && msg.data instanceof Blob) {
|
|
95
|
+
cb(Buffer.from(await msg.data.arrayBuffer()));
|
|
96
|
+
} else {
|
|
97
|
+
cb(msg.data);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
87
104
|
get url() {
|
|
88
105
|
return this._params.url;
|
|
89
106
|
}
|
|
@@ -155,40 +172,6 @@ var WebsocketRpcClient = class {
|
|
|
155
172
|
get rpc() {
|
|
156
173
|
return this._rpc.rpc;
|
|
157
174
|
}
|
|
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
|
-
}
|
|
192
175
|
};
|
|
193
176
|
_ts_decorate([
|
|
194
177
|
logInfo
|
|
@@ -198,21 +181,13 @@ _ts_decorate([
|
|
|
198
181
|
import WebSocket3 from "isomorphic-ws";
|
|
199
182
|
import { log as log3 } from "@dxos/log";
|
|
200
183
|
import { createProtoRpcPeer as createProtoRpcPeer2 } from "@dxos/rpc";
|
|
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;
|
|
211
|
-
}
|
|
212
|
-
return obj;
|
|
213
|
-
}
|
|
214
184
|
var __dxlog_file3 = "/__w/dxos/dxos/packages/core/mesh/websocket-rpc/src/server.ts";
|
|
215
185
|
var WebsocketRpcServer = class {
|
|
186
|
+
_params;
|
|
187
|
+
_server;
|
|
188
|
+
constructor(_params) {
|
|
189
|
+
this._params = _params;
|
|
190
|
+
}
|
|
216
191
|
handleUpgrade(request, socket, head) {
|
|
217
192
|
this._server?.handleUpgrade(request, socket, head, (ws) => {
|
|
218
193
|
this._server?.emit("connection", ws, request);
|
|
@@ -264,11 +239,6 @@ var WebsocketRpcServer = class {
|
|
|
264
239
|
async close() {
|
|
265
240
|
this._server?.close();
|
|
266
241
|
}
|
|
267
|
-
constructor(_params) {
|
|
268
|
-
_define_property2(this, "_params", void 0);
|
|
269
|
-
_define_property2(this, "_server", void 0);
|
|
270
|
-
this._params = _params;
|
|
271
|
-
}
|
|
272
242
|
};
|
|
273
243
|
export {
|
|
274
244
|
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 { 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": ";;;AAIA,OAAOA,gBAAe;AAEtB,SAASC,OAAOC,eAAe;AAC/B,SAASC,OAAAA,MAAKC,eAAe;AAC7B,SAAsDC,0BAA0B;;;ACEhF,OAAOC,eAAe;AAEtB,SAASC,WAAW;;AAEpB,IAAMC,wBAAwB;AAIvB,IAAMC,mCAAmC,CAC9CC,SACAC,QACAC,aACAC,OACAC,OAAAA;AAEA,QAAMC,iBAAiBL,QAAQM,QAAQ,wBAAA;AAEvC,MAAI,CAACD,gBAAgB;AACnBR,QAAI,wCAAwC;MAAEU,QAAQP,QAAQM,QAAQ,wBAAA;IAA0B,GAAA;;;;;;AAChGL,WAAOO,MAAM,mCAAA;AACbP,WAAOQ,QAAO;AACd;EACF;AAEA,QAAMC,cAAcL,eAAeM,QAAQ,IAAIC,OAAO,IAAId,qBAAAA,GAAwB,GAAG,EAAA;AAGrF,QAAMe,eAAeC,OAAOC,KAAKZ,KAAAA,EAAOa,SAAS,QAAA,EAAUL,QAAQ,OAAO,EAAA;AAE1E,MAAID,gBAAgBG,cAAc;AAChChB,QAAI,wBAAwB;MAAEM;MAAOc,KAAKJ;IAAa,GAAA;;;;;;AACvDZ,WAAOO,MAAM,mCAAA;AACbP,WAAOQ,QAAO;AACd;EACF;AAEAL,KAAGJ,SAASC,QAAQC,WAAAA;AACtB;AAEO,IAAMgB,yBAAN,cAAqCtB,UAAAA;EAC1C,YAAYuB,KAAahB,OAAe;AACtC,UAAMU,eAAeC,OAAOC,KAAKZ,KAAAA,EAAOa,SAAS,QAAA,EAAUL,QAAQ,OAAO,EAAA;AAE1E,UAAMS,cAAc;MAAC,2CAA2CP,YAAAA;;AAChE,UAAMM,KAAKC,WAAAA;AACXvB,QAAI,gBAAgB;MAClBgB;IACF,GAAA;;;;;;EACF;AACF
|
|
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", "
|
|
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: WebSocket) => {\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: WebSocket, request: IncomingMessage) => {\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", "_socket", "_rpc", "_connectTrigger", "Trigger", "connected", "Event", "disconnected", "error", "_params", "createProtoRpcPeer", "requested", "exposed", "handlers", "noHandshake", "port", "send", "msg", "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", "_server", "_params", "handleUpgrade", "request", "socket", "head", "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"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
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":
|
|
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":12081,"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":7415,"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":12578},"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":3469},"src/token-auth.ts":{"bytesInOutput":1656},"src/index.ts":{"bytesInOutput":0},"src/server.ts":{"bytesInOutput":1697}},"bytes":7083}}}
|
|
@@ -63,19 +63,6 @@ var WebSocketWithTokenAuth = class extends WebSocket {
|
|
|
63
63
|
};
|
|
64
64
|
|
|
65
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
|
-
}
|
|
79
66
|
function _ts_decorate(decorators, target, key, desc) {
|
|
80
67
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
81
68
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
@@ -84,6 +71,36 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
84
71
|
}
|
|
85
72
|
var __dxlog_file2 = "/__w/dxos/dxos/packages/core/mesh/websocket-rpc/src/client.ts";
|
|
86
73
|
var WebsocketRpcClient = class {
|
|
74
|
+
_params;
|
|
75
|
+
_socket;
|
|
76
|
+
_rpc;
|
|
77
|
+
_connectTrigger = new Trigger();
|
|
78
|
+
connected = new Event();
|
|
79
|
+
disconnected = new Event();
|
|
80
|
+
error = new Event();
|
|
81
|
+
constructor(_params) {
|
|
82
|
+
this._params = _params;
|
|
83
|
+
this._rpc = createProtoRpcPeer({
|
|
84
|
+
requested: this._params.requested,
|
|
85
|
+
exposed: this._params.exposed,
|
|
86
|
+
handlers: this._params.handlers,
|
|
87
|
+
noHandshake: this._params.noHandshake,
|
|
88
|
+
port: {
|
|
89
|
+
send: (msg) => {
|
|
90
|
+
this._socket.send(msg);
|
|
91
|
+
},
|
|
92
|
+
subscribe: (cb) => {
|
|
93
|
+
this._socket.onmessage = async (msg) => {
|
|
94
|
+
if (typeof Blob !== "undefined" && msg.data instanceof Blob) {
|
|
95
|
+
cb(Buffer.from(await msg.data.arrayBuffer()));
|
|
96
|
+
} else {
|
|
97
|
+
cb(msg.data);
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
87
104
|
get url() {
|
|
88
105
|
return this._params.url;
|
|
89
106
|
}
|
|
@@ -155,40 +172,6 @@ var WebsocketRpcClient = class {
|
|
|
155
172
|
get rpc() {
|
|
156
173
|
return this._rpc.rpc;
|
|
157
174
|
}
|
|
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
|
-
}
|
|
192
175
|
};
|
|
193
176
|
_ts_decorate([
|
|
194
177
|
logInfo
|
|
@@ -198,21 +181,13 @@ _ts_decorate([
|
|
|
198
181
|
import WebSocket3 from "isomorphic-ws";
|
|
199
182
|
import { log as log3 } from "@dxos/log";
|
|
200
183
|
import { createProtoRpcPeer as createProtoRpcPeer2 } from "@dxos/rpc";
|
|
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;
|
|
211
|
-
}
|
|
212
|
-
return obj;
|
|
213
|
-
}
|
|
214
184
|
var __dxlog_file3 = "/__w/dxos/dxos/packages/core/mesh/websocket-rpc/src/server.ts";
|
|
215
185
|
var WebsocketRpcServer = class {
|
|
186
|
+
_params;
|
|
187
|
+
_server;
|
|
188
|
+
constructor(_params) {
|
|
189
|
+
this._params = _params;
|
|
190
|
+
}
|
|
216
191
|
handleUpgrade(request, socket, head) {
|
|
217
192
|
this._server?.handleUpgrade(request, socket, head, (ws) => {
|
|
218
193
|
this._server?.emit("connection", ws, request);
|
|
@@ -264,11 +239,6 @@ var WebsocketRpcServer = class {
|
|
|
264
239
|
async close() {
|
|
265
240
|
this._server?.close();
|
|
266
241
|
}
|
|
267
|
-
constructor(_params) {
|
|
268
|
-
_define_property2(this, "_params", void 0);
|
|
269
|
-
_define_property2(this, "_server", void 0);
|
|
270
|
-
this._params = _params;
|
|
271
|
-
}
|
|
272
242
|
};
|
|
273
243
|
export {
|
|
274
244
|
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 { 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": ";;;AAIA,OAAOA,gBAAe;AAEtB,SAASC,OAAOC,eAAe;AAC/B,SAASC,OAAAA,MAAKC,eAAe;AAC7B,SAAsDC,0BAA0B;;;ACEhF,OAAOC,eAAe;AAEtB,SAASC,WAAW;;AAEpB,IAAMC,wBAAwB;AAIvB,IAAMC,mCAAmC,CAC9CC,SACAC,QACAC,aACAC,OACAC,OAAAA;AAEA,QAAMC,iBAAiBL,QAAQM,QAAQ,wBAAA;AAEvC,MAAI,CAACD,gBAAgB;AACnBR,QAAI,wCAAwC;MAAEU,QAAQP,QAAQM,QAAQ,wBAAA;IAA0B,GAAA;;;;;;AAChGL,WAAOO,MAAM,mCAAA;AACbP,WAAOQ,QAAO;AACd;EACF;AAEA,QAAMC,cAAcL,eAAeM,QAAQ,IAAIC,OAAO,IAAId,qBAAAA,GAAwB,GAAG,EAAA;AAGrF,QAAMe,eAAeC,OAAOC,KAAKZ,KAAAA,EAAOa,SAAS,QAAA,EAAUL,QAAQ,OAAO,EAAA;AAE1E,MAAID,gBAAgBG,cAAc;AAChChB,QAAI,wBAAwB;MAAEM;MAAOc,KAAKJ;IAAa,GAAA;;;;;;AACvDZ,WAAOO,MAAM,mCAAA;AACbP,WAAOQ,QAAO;AACd;EACF;AAEAL,KAAGJ,SAASC,QAAQC,WAAAA;AACtB;AAEO,IAAMgB,yBAAN,cAAqCtB,UAAAA;EAC1C,YAAYuB,KAAahB,OAAe;AACtC,UAAMU,eAAeC,OAAOC,KAAKZ,KAAAA,EAAOa,SAAS,QAAA,EAAUL,QAAQ,OAAO,EAAA;AAE1E,UAAMS,cAAc;MAAC,2CAA2CP,YAAAA;;AAChE,UAAMM,KAAKC,WAAAA;AACXvB,QAAI,gBAAgB;MAClBgB;IACF,GAAA;;;;;;EACF;AACF
|
|
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", "
|
|
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: WebSocket) => {\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: WebSocket, request: IncomingMessage) => {\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", "_socket", "_rpc", "_connectTrigger", "Trigger", "connected", "Event", "disconnected", "error", "_params", "createProtoRpcPeer", "requested", "exposed", "handlers", "noHandshake", "port", "send", "msg", "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", "_server", "_params", "handleUpgrade", "request", "socket", "head", "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"]
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
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":
|
|
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":12081,"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":7415,"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":12578},"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":3469},"src/token-auth.ts":{"bytesInOutput":1656},"src/index.ts":{"bytesInOutput":0},"src/server.ts":{"bytesInOutput":1697}},"bytes":7142}}}
|