@dxos/websocket-rpc 0.3.7 → 0.3.8-main.152ec6f
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.
|
@@ -15,7 +15,7 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
15
15
|
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
16
16
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
17
17
|
}
|
|
18
|
-
var __dxlog_file = "/
|
|
18
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/mesh/websocket-rpc/src/client.ts";
|
|
19
19
|
var WebsocketRpcClient = class {
|
|
20
20
|
constructor(_params) {
|
|
21
21
|
this._params = _params;
|
|
@@ -119,7 +119,7 @@ _ts_decorate([
|
|
|
119
119
|
import WebSocket2 from "isomorphic-ws";
|
|
120
120
|
import { log as log2 } from "@dxos/log";
|
|
121
121
|
import { createProtoRpcPeer as createProtoRpcPeer2 } from "@dxos/rpc";
|
|
122
|
-
var __dxlog_file2 = "/
|
|
122
|
+
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/mesh/websocket-rpc/src/server.ts";
|
|
123
123
|
var WebsocketRpcServer = class {
|
|
124
124
|
constructor(_params) {
|
|
125
125
|
this._params = _params;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/core/mesh/websocket-rpc/src/client.ts":{"bytes":
|
|
1
|
+
{"inputs":{"packages/core/mesh/websocket-rpc/src/client.ts":{"bytes":10806,"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}],"format":"esm"},"packages/core/mesh/websocket-rpc/src/server.ts":{"bytes":6370,"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":552,"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"}],"format":"esm"}},"outputs":{"packages/core/mesh/websocket-rpc/dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":8030},"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":"@dxos/rpc","kind":"import-statement","external":true}],"exports":["WebsocketRpcClient","WebsocketRpcServer"],"entryPoint":"packages/core/mesh/websocket-rpc/src/index.ts","inputs":{"packages/core/mesh/websocket-rpc/src/client.ts":{"bytesInOutput":3270},"packages/core/mesh/websocket-rpc/src/index.ts":{"bytesInOutput":0},"packages/core/mesh/websocket-rpc/src/server.ts":{"bytesInOutput":1474}},"bytes":4969}}}
|
package/dist/lib/node/index.cjs
CHANGED
|
@@ -26,20 +26,19 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
26
|
mod
|
|
27
27
|
));
|
|
28
28
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
var src_exports = {};
|
|
32
|
-
__export(src_exports, {
|
|
29
|
+
var node_exports = {};
|
|
30
|
+
__export(node_exports, {
|
|
33
31
|
WebsocketRpcClient: () => WebsocketRpcClient,
|
|
34
32
|
WebsocketRpcServer: () => WebsocketRpcServer
|
|
35
33
|
});
|
|
36
|
-
module.exports = __toCommonJS(
|
|
37
|
-
|
|
38
|
-
// packages/core/mesh/websocket-rpc/src/client.ts
|
|
34
|
+
module.exports = __toCommonJS(node_exports);
|
|
39
35
|
var import_isomorphic_ws = __toESM(require("isomorphic-ws"));
|
|
40
36
|
var import_async = require("@dxos/async");
|
|
41
37
|
var import_log = require("@dxos/log");
|
|
42
38
|
var import_rpc = require("@dxos/rpc");
|
|
39
|
+
var import_isomorphic_ws2 = __toESM(require("isomorphic-ws"));
|
|
40
|
+
var import_log2 = require("@dxos/log");
|
|
41
|
+
var import_rpc2 = require("@dxos/rpc");
|
|
43
42
|
function _ts_decorate(decorators, target, key, desc) {
|
|
44
43
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
45
44
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
@@ -50,7 +49,7 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
50
49
|
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
51
50
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
52
51
|
}
|
|
53
|
-
var __dxlog_file = "/
|
|
52
|
+
var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/mesh/websocket-rpc/src/client.ts";
|
|
54
53
|
var WebsocketRpcClient = class {
|
|
55
54
|
constructor(_params) {
|
|
56
55
|
this._params = _params;
|
|
@@ -149,12 +148,7 @@ var WebsocketRpcClient = class {
|
|
|
149
148
|
_ts_decorate([
|
|
150
149
|
import_log.logInfo
|
|
151
150
|
], WebsocketRpcClient.prototype, "url", null);
|
|
152
|
-
|
|
153
|
-
// packages/core/mesh/websocket-rpc/src/server.ts
|
|
154
|
-
var import_isomorphic_ws2 = __toESM(require("isomorphic-ws"));
|
|
155
|
-
var import_log2 = require("@dxos/log");
|
|
156
|
-
var import_rpc2 = require("@dxos/rpc");
|
|
157
|
-
var __dxlog_file2 = "/mnt/ramdisk/work/packages/core/mesh/websocket-rpc/src/server.ts";
|
|
151
|
+
var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/mesh/websocket-rpc/src/server.ts";
|
|
158
152
|
var WebsocketRpcServer = class {
|
|
159
153
|
constructor(_params) {
|
|
160
154
|
this._params = _params;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": ["WebsocketRpcClient", "constructor", "_params", "_connectTrigger", "Trigger", "connected", "Event", "disconnected", "error", "_rpc", "createProtoRpcPeer", "requested", "exposed", "handlers", "port", "send", "msg", "_socket", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "from", "arrayBuffer", "url", "open", "WebSocket", "onopen", "log", "emit", "wake", "err", "onclose", "close", "onerror", "event", "message", "Error", "throw", "wait", "catch", "rpc", "logInfo", "
|
|
3
|
+
"sources": ["../../../src/client.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\nexport type WebsocketRpcClientParams<C, S> = {\n url: string;\n} & Pick<ProtoRpcPeerOptions<C, S>, 'requested' | 'exposed' | 'handlers'>;\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 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() {\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 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() {\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 2023 DXOS.org\n//\n\nimport { type IncomingMessage } from 'http';\nimport WebSocket from 'isomorphic-ws';\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\n async open() {\n this._server = new WebSocket.Server({\n ...this._params,\n });\n this._server.on('connection', async (socket, request) => {\n log('connection', { request });\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() {\n this._server?.close();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_isomorphic_ws", "import_log", "import_rpc", "WebsocketRpcClient", "constructor", "_params", "_connectTrigger", "Trigger", "connected", "Event", "disconnected", "error", "_rpc", "createProtoRpcPeer", "requested", "exposed", "handlers", "port", "send", "msg", "_socket", "subscribe", "cb", "onmessage", "Blob", "data", "Buffer", "from", "arrayBuffer", "url", "open", "WebSocket", "onopen", "log", "emit", "wake", "err", "onclose", "close", "onerror", "event", "message", "Error", "throw", "wait", "catch", "rpc", "logInfo", "WebsocketRpcServer", "_server", "Server", "on", "socket", "request", "info", "onOpen", "onClose", "options", "onConnection"]
|
|
7
7
|
}
|
package/dist/lib/node/meta.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"inputs":{"packages/core/mesh/websocket-rpc/src/client.ts":{"bytes":
|
|
1
|
+
{"inputs":{"packages/core/mesh/websocket-rpc/src/client.ts":{"bytes":10806,"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}],"format":"esm"},"packages/core/mesh/websocket-rpc/src/server.ts":{"bytes":6370,"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":552,"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"}],"format":"esm"}},"outputs":{"packages/core/mesh/websocket-rpc/dist/lib/node/index.cjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":8028},"packages/core/mesh/websocket-rpc/dist/lib/node/index.cjs":{"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":"@dxos/rpc","kind":"import-statement","external":true}],"exports":["WebsocketRpcClient","WebsocketRpcServer"],"entryPoint":"packages/core/mesh/websocket-rpc/src/index.ts","inputs":{"packages/core/mesh/websocket-rpc/src/client.ts":{"bytesInOutput":3270},"packages/core/mesh/websocket-rpc/src/index.ts":{"bytesInOutput":0},"packages/core/mesh/websocket-rpc/src/server.ts":{"bytesInOutput":1474}},"bytes":4935}}}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/websocket-rpc",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.8-main.152ec6f",
|
|
4
4
|
"description": "websocket-rpc",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -19,15 +19,15 @@
|
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"isomorphic-ws": "^4.0.1",
|
|
21
21
|
"ws": "^7.4.4",
|
|
22
|
-
"@dxos/
|
|
23
|
-
"@dxos/
|
|
24
|
-
"@dxos/
|
|
25
|
-
"@dxos/
|
|
26
|
-
"@dxos/
|
|
27
|
-
"@dxos/
|
|
28
|
-
"@dxos/
|
|
29
|
-
"@dxos/rpc": "0.3.
|
|
30
|
-
"@dxos/util": "0.3.
|
|
22
|
+
"@dxos/codec-protobuf": "0.3.8-main.152ec6f",
|
|
23
|
+
"@dxos/context": "0.3.8-main.152ec6f",
|
|
24
|
+
"@dxos/log": "0.3.8-main.152ec6f",
|
|
25
|
+
"@dxos/async": "0.3.8-main.152ec6f",
|
|
26
|
+
"@dxos/keys": "0.3.8-main.152ec6f",
|
|
27
|
+
"@dxos/protocols": "0.3.8-main.152ec6f",
|
|
28
|
+
"@dxos/node-std": "0.3.8-main.152ec6f",
|
|
29
|
+
"@dxos/rpc": "0.3.8-main.152ec6f",
|
|
30
|
+
"@dxos/util": "0.3.8-main.152ec6f"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"@types/node": "^18.11.9",
|