@dxos/edge-client 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/lib/chunk-edge-ws-muxer.mjs +322 -0
  2. package/dist/lib/chunk-edge-ws-muxer.mjs.map +1 -0
  3. package/dist/lib/cors-proxy.mjs +29 -0
  4. package/dist/lib/cors-proxy.mjs.map +1 -0
  5. package/dist/lib/edge-ws-muxer.mjs +2 -0
  6. package/dist/lib/index.mjs +1769 -0
  7. package/dist/lib/index.mjs.map +1 -0
  8. package/dist/lib/service.mjs +138 -0
  9. package/dist/lib/service.mjs.map +1 -0
  10. package/dist/lib/testing.mjs +160 -0
  11. package/dist/lib/testing.mjs.map +1 -0
  12. package/dist/types/src/base-http-client.d.ts +18 -0
  13. package/dist/types/src/base-http-client.d.ts.map +1 -1
  14. package/dist/types/src/browser-rendering.d.ts +0 -7
  15. package/dist/types/src/browser-rendering.d.ts.map +1 -1
  16. package/dist/types/src/edge-client.d.ts +22 -2
  17. package/dist/types/src/edge-client.d.ts.map +1 -1
  18. package/dist/types/src/edge-http-client.d.ts +86 -2
  19. package/dist/types/src/edge-http-client.d.ts.map +1 -1
  20. package/dist/types/src/edge-ws-connection.d.ts +19 -0
  21. package/dist/types/src/edge-ws-connection.d.ts.map +1 -1
  22. package/dist/types/src/edge-ws-connection.test.d.ts +2 -0
  23. package/dist/types/src/edge-ws-connection.test.d.ts.map +1 -0
  24. package/dist/types/src/index.d.ts +1 -0
  25. package/dist/types/src/index.d.ts.map +1 -1
  26. package/dist/types/src/protocol.d.ts +2 -1
  27. package/dist/types/src/protocol.d.ts.map +1 -1
  28. package/dist/types/src/testing/test-utils.d.ts.map +1 -1
  29. package/dist/types/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +20 -20
  31. package/src/base-http-client.ts +71 -3
  32. package/src/browser-rendering.ts +0 -9
  33. package/src/edge-client.ts +21 -3
  34. package/src/edge-http-client.test.ts +121 -0
  35. package/src/edge-http-client.ts +156 -2
  36. package/src/edge-ws-connection.test.ts +219 -0
  37. package/src/edge-ws-connection.ts +97 -28
  38. package/src/index.ts +1 -0
  39. package/src/protocol.ts +11 -2
  40. package/src/testing/test-utils.ts +5 -1
  41. package/dist/lib/neutral/chunk-J5LGTIGS.mjs +0 -10
  42. package/dist/lib/neutral/chunk-J5LGTIGS.mjs.map +0 -7
  43. package/dist/lib/neutral/chunk-L5ZHLJ4B.mjs +0 -310
  44. package/dist/lib/neutral/chunk-L5ZHLJ4B.mjs.map +0 -7
  45. package/dist/lib/neutral/chunk-WQKMEZJR.mjs +0 -30
  46. package/dist/lib/neutral/chunk-WQKMEZJR.mjs.map +0 -7
  47. package/dist/lib/neutral/cors-proxy.mjs +0 -8
  48. package/dist/lib/neutral/cors-proxy.mjs.map +0 -7
  49. package/dist/lib/neutral/edge-ws-muxer.mjs +0 -12
  50. package/dist/lib/neutral/edge-ws-muxer.mjs.map +0 -7
  51. package/dist/lib/neutral/index.mjs +0 -1524
  52. package/dist/lib/neutral/index.mjs.map +0 -7
  53. package/dist/lib/neutral/meta.json +0 -1
  54. package/dist/lib/neutral/service/index.mjs +0 -134
  55. package/dist/lib/neutral/service/index.mjs.map +0 -7
  56. package/dist/lib/neutral/testing/index.mjs +0 -161
  57. package/dist/lib/neutral/testing/index.mjs.map +0 -7
@@ -1,161 +0,0 @@
1
- import {
2
- WebSocketMuxer,
3
- protocol,
4
- toUint8Array
5
- } from "../chunk-L5ZHLJ4B.mjs";
6
- import "../chunk-J5LGTIGS.mjs";
7
-
8
- // src/testing/test-server.ts
9
- import http from "@dxos/node-std/http";
10
- import { log } from "@dxos/log";
11
- var __dxlog_file = "/__w/dxos/dxos/packages/core/mesh/edge-client/src/testing/test-server.ts";
12
- var createTestServer = (responseHandler2) => {
13
- const server = http.createServer(responseHandler2);
14
- return new Promise((resolve) => {
15
- server.listen(0, () => {
16
- const address = server.address();
17
- const port = typeof address === "object" && address ? address.port : 0;
18
- resolve({
19
- url: `http://localhost:${port}`,
20
- close: () => server.close()
21
- });
22
- });
23
- });
24
- };
25
- var responseHandler = (cb) => {
26
- let attempt = 0;
27
- return (req, res) => {
28
- const data = cb(++attempt) ?? {};
29
- if (data === false) {
30
- log("simulating failure", {
31
- attempt
32
- }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 24, S: void 0 });
33
- res.statusCode = 500;
34
- res.statusMessage = "Simulating failure";
35
- res.end("");
36
- } else {
37
- res.writeHead(200, {
38
- "Content-Type": "application/json"
39
- });
40
- res.end(JSON.stringify({
41
- success: true,
42
- data
43
- }));
44
- }
45
- };
46
- };
47
-
48
- // src/testing/test-utils.ts
49
- import WebSocket from "isomorphic-ws";
50
- import { Trigger } from "@dxos/async";
51
- import { log as log2 } from "@dxos/log";
52
- import { EdgeWebsocketProtocol } from "@dxos/protocols";
53
- import { buf } from "@dxos/protocols/buf";
54
- import { MessageSchema, TextMessageSchema } from "@dxos/protocols/buf/dxos/edge/messenger_pb";
55
- var __dxlog_file2 = "/__w/dxos/dxos/packages/core/mesh/edge-client/src/testing/test-utils.ts";
56
- var DEFAULT_PORT = 8080;
57
- var createTestEdgeWsServer = async (port = DEFAULT_PORT, params) => {
58
- const wsServer = new WebSocket.Server({
59
- port,
60
- verifyClient: createConnectionDelayHandler(params),
61
- handleProtocols: () => EdgeWebsocketProtocol.V1
62
- });
63
- let connection;
64
- const messageSink = [];
65
- const messageSourceLog = [];
66
- const closeTrigger = new Trigger();
67
- const sendResponseMessage = createResponseSender(() => connection.muxer);
68
- wsServer.on("connection", (ws) => {
69
- const muxer = new WebSocketMuxer(ws);
70
- connection = {
71
- ws,
72
- muxer
73
- };
74
- ws.on("error", (err) => log2.catch(err, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 31, S: void 0 }));
75
- ws.on("message", async (data) => {
76
- if (String(data) === "__ping__") {
77
- ws.send("__pong__");
78
- return;
79
- }
80
- const message = muxer.receiveData(await toUint8Array(data));
81
- if (!message) {
82
- return;
83
- }
84
- const { request, requestPayload } = await decodePayload(message, params);
85
- messageSourceLog.push(request.source);
86
- if (params?.messageHandler) {
87
- const responsePayload = await params.messageHandler(requestPayload);
88
- if (responsePayload && connection) {
89
- sendResponseMessage(request, responsePayload);
90
- }
91
- }
92
- log2("message", {
93
- payload: requestPayload
94
- }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 49, S: void 0 });
95
- messageSink.push(requestPayload);
96
- });
97
- ws.on("close", () => {
98
- connection = void 0;
99
- closeTrigger.wake();
100
- });
101
- });
102
- return {
103
- server: wsServer,
104
- messageSink,
105
- messageSourceLog,
106
- endpoint: `ws://127.0.0.1:${port}`,
107
- cleanup: () => wsServer.close(),
108
- currentConnection: () => connection,
109
- sendResponseMessage,
110
- sendMessage: (msg) => {
111
- return connection.muxer.send(msg);
112
- },
113
- closeConnection: () => {
114
- closeTrigger.reset();
115
- connection.ws.close(1011);
116
- return closeTrigger.wait();
117
- }
118
- };
119
- };
120
- var createConnectionDelayHandler = (params) => {
121
- return (_, callback) => {
122
- if (params?.admitConnection) {
123
- log2("delaying edge connection admission", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 80, S: void 0 });
124
- void params.admitConnection.wait().then(() => {
125
- callback(true);
126
- log2("edge connection admitted", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 83, S: void 0 });
127
- });
128
- } else {
129
- callback(true);
130
- }
131
- };
132
- };
133
- var createResponseSender = (connection) => {
134
- return (request, responsePayload) => {
135
- const recipient = request.source;
136
- void connection().send(buf.create(MessageSchema, {
137
- source: {
138
- identityDid: recipient.identityDid,
139
- peerKey: recipient.peerKey
140
- },
141
- serviceId: request.serviceId,
142
- payload: {
143
- value: responsePayload
144
- }
145
- }));
146
- };
147
- };
148
- var decodePayload = async (request, params) => {
149
- const requestPayload = params?.payloadDecoder ? params.payloadDecoder(request.payload.value) : protocol.getPayload(request, TextMessageSchema);
150
- return {
151
- request,
152
- requestPayload
153
- };
154
- };
155
- export {
156
- DEFAULT_PORT,
157
- createTestEdgeWsServer,
158
- createTestServer,
159
- responseHandler
160
- };
161
- //# sourceMappingURL=index.mjs.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/testing/test-server.ts", "../../../../src/testing/test-utils.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\nimport http from 'node:http';\n\nimport { log } from '@dxos/log';\n\nexport type TestServer = {\n url: string;\n close: () => void;\n};\n\nexport type ResponseHandler = (req: http.IncomingMessage, res: http.ServerResponse) => void;\n\nexport const createTestServer = (responseHandler: ResponseHandler) => {\n const server = http.createServer(responseHandler);\n\n return new Promise<TestServer>((resolve) => {\n server.listen(0, () => {\n const address = server.address();\n const port = typeof address === 'object' && address ? address.port : 0;\n resolve({\n url: `http://localhost:${port}`,\n close: () => server.close(),\n });\n });\n });\n};\n\nexport const responseHandler = (cb: (attempt: number) => false | object): ResponseHandler => {\n let attempt = 0;\n return (req, res) => {\n const data = cb(++attempt) ?? {};\n if (data === false) {\n log('simulating failure', { attempt });\n res.statusCode = 500;\n res.statusMessage = 'Simulating failure';\n res.end('');\n } else {\n res.writeHead(200, { 'Content-Type': 'application/json' });\n res.end(JSON.stringify({ success: true, data }));\n }\n };\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport WebSocket from 'isomorphic-ws';\n\nimport { Trigger } from '@dxos/async';\nimport { log } from '@dxos/log';\nimport { EdgeWebsocketProtocol } from '@dxos/protocols';\nimport { buf } from '@dxos/protocols/buf';\nimport { type Message, MessageSchema, TextMessageSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';\n\nimport { protocol } from '../defs';\nimport { WebSocketMuxer } from '../edge-ws-muxer';\nimport { toUint8Array } from '../protocol';\n\nexport const DEFAULT_PORT = 8080;\n\ntype TestEdgeWsServerProps = {\n admitConnection?: Trigger;\n payloadDecoder?: (payload: Uint8Array) => any;\n messageHandler?: (payload: any) => Promise<Uint8Array | undefined>;\n};\n\nexport const createTestEdgeWsServer = async (port = DEFAULT_PORT, params?: TestEdgeWsServerProps) => {\n const wsServer = new WebSocket.Server({\n port,\n verifyClient: createConnectionDelayHandler(params),\n handleProtocols: () => EdgeWebsocketProtocol.V1,\n });\n\n let connection: { ws: WebSocket; muxer: WebSocketMuxer } | undefined;\n\n const messageSink: any[] = [];\n const messageSourceLog: any[] = [];\n const closeTrigger = new Trigger();\n const sendResponseMessage = createResponseSender(() => connection!.muxer);\n\n wsServer.on('connection', (ws: WebSocket) => {\n const muxer = new WebSocketMuxer(ws);\n connection = { ws, muxer };\n ws.on('error', (err: Error) => log.catch(err));\n ws.on('message', async (data: any) => {\n if (String(data) === '__ping__') {\n ws.send('__pong__');\n return;\n }\n const message = muxer.receiveData(await toUint8Array(data));\n if (!message) {\n return;\n }\n const { request, requestPayload } = await decodePayload(message, params);\n messageSourceLog.push(request.source);\n if (params?.messageHandler) {\n const responsePayload = await params.messageHandler(requestPayload);\n if (responsePayload && connection) {\n sendResponseMessage(request, responsePayload);\n }\n }\n log('message', { payload: requestPayload });\n messageSink.push(requestPayload);\n });\n\n ws.on('close', () => {\n connection = undefined;\n closeTrigger.wake();\n });\n });\n\n return {\n server: wsServer,\n messageSink,\n messageSourceLog,\n endpoint: `ws://127.0.0.1:${port}`,\n cleanup: () => wsServer.close(),\n currentConnection: () => connection,\n sendResponseMessage,\n sendMessage: (msg: Message) => {\n return connection!.muxer.send(msg);\n },\n closeConnection: () => {\n closeTrigger.reset();\n connection!.ws.close(1011);\n return closeTrigger.wait();\n },\n };\n};\n\nconst createConnectionDelayHandler = (params: TestEdgeWsServerProps | undefined) => {\n return (_: any, callback: (admit: boolean) => void) => {\n if (params?.admitConnection) {\n log('delaying edge connection admission');\n void params.admitConnection.wait().then(() => {\n callback(true);\n log('edge connection admitted');\n });\n } else {\n callback(true);\n }\n };\n};\n\nconst createResponseSender = (connection: () => WebSocketMuxer) => {\n return (request: Message, responsePayload: Uint8Array) => {\n const recipient = request.source!;\n void connection().send(\n buf.create(MessageSchema, {\n source: {\n identityDid: recipient.identityDid,\n peerKey: recipient.peerKey,\n },\n serviceId: request.serviceId!,\n payload: { value: responsePayload },\n }),\n );\n };\n};\n\nconst decodePayload = async (request: Message, params: TestEdgeWsServerProps | undefined) => {\n const requestPayload = params?.payloadDecoder\n ? params.payloadDecoder(request.payload!.value!)\n : protocol.getPayload(request, TextMessageSchema);\n return { request, requestPayload };\n};\n"],
5
- "mappings": "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",
6
- "names": ["http", "log", "createTestServer", "resolve", "server", "listen", "responseHandler", "address", "port", "url", "close", "req", "res", "data", "attempt", "statusCode", "statusMessage", "end", "writeHead", "stringify", "WebSocket", "Trigger", "log", "EdgeWebsocketProtocol", "buf", "MessageSchema", "TextMessageSchema", "__dxlog_file", "DEFAULT_PORT", "wsServer", "WebSocket", "port", "verifyClient", "createConnectionDelayHandler", "handleProtocols", "connection", "closeTrigger", "sendResponseMessage", "ws", "WebSocketMuxer", "muxer", "on", "data", "messageSourceLog", "params", "messageHandler", "responsePayload", "request", "log", "messageSink", "push", "wake", "endpoint", "cleanup", "currentConnection", "sendMessage", "msg", "closeConnection", "close", "admitConnection", "callback", "create", "source", "identityDid", "recipient", "peerKey", "serviceId", "payload", "requestPayload"]
7
- }