@dxos/edge-client 0.8.4-main.ae835ea → 0.8.4-main.bc2380dfbc
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/LICENSE +102 -5
- package/dist/lib/{browser/chunk-VESGVCLQ.mjs → neutral/chunk-ZIQ5T3A7.mjs} +6 -40
- package/dist/lib/{browser/chunk-VESGVCLQ.mjs.map → neutral/chunk-ZIQ5T3A7.mjs.map} +2 -2
- package/dist/lib/{browser → neutral}/edge-ws-muxer.mjs +1 -1
- package/dist/lib/{browser → neutral}/index.mjs +208 -360
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/{browser → neutral}/testing/index.mjs +6 -31
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/types/src/auth.d.ts.map +1 -1
- package/dist/types/src/edge-client.d.ts +5 -2
- package/dist/types/src/edge-client.d.ts.map +1 -1
- package/dist/types/src/edge-http-client.d.ts +69 -31
- package/dist/types/src/edge-http-client.d.ts.map +1 -1
- package/dist/types/src/edge-identity.d.ts.map +1 -1
- package/dist/types/src/edge-ws-connection.d.ts +1 -0
- package/dist/types/src/edge-ws-connection.d.ts.map +1 -1
- package/dist/types/src/edge-ws-muxer.d.ts.map +1 -1
- package/dist/types/src/errors.d.ts.map +1 -1
- package/dist/types/src/http-client.d.ts +2 -2
- package/dist/types/src/http-client.d.ts.map +1 -1
- package/dist/types/src/protocol.d.ts +1 -1
- package/dist/types/src/protocol.d.ts.map +1 -1
- package/dist/types/src/testing/test-server.d.ts.map +1 -1
- package/dist/types/src/testing/test-utils.d.ts +2 -2
- package/dist/types/src/testing/test-utils.d.ts.map +1 -1
- package/dist/types/src/utils.d.ts +1 -1
- package/dist/types/src/utils.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +29 -32
- package/src/edge-client.test.ts +16 -11
- package/src/edge-client.ts +19 -3
- package/src/edge-http-client.test.ts +3 -2
- package/src/edge-http-client.ts +210 -66
- package/src/edge-ws-connection.ts +2 -1
- package/src/http-client.test.ts +3 -2
- package/src/http-client.ts +5 -1
- package/src/testing/test-utils.ts +4 -4
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-JTBFRYNM.mjs +0 -303
- package/dist/lib/node-esm/chunk-JTBFRYNM.mjs.map +0 -7
- package/dist/lib/node-esm/edge-ws-muxer.mjs +0 -12
- package/dist/lib/node-esm/edge-ws-muxer.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -1342
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/testing/index.mjs +0 -186
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- /package/dist/lib/{browser → neutral}/edge-ws-muxer.mjs.map +0 -0
package/package.json
CHANGED
|
@@ -1,68 +1,65 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/edge-client",
|
|
3
|
-
"version": "0.8.4-main.
|
|
3
|
+
"version": "0.8.4-main.bc2380dfbc",
|
|
4
4
|
"description": "EDGE Client",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
7
|
-
"
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/dxos/dxos"
|
|
10
|
+
},
|
|
11
|
+
"license": "FSL-1.1-Apache-2.0",
|
|
8
12
|
"author": "DXOS.org",
|
|
9
|
-
"sideEffects":
|
|
13
|
+
"sideEffects": false,
|
|
10
14
|
"type": "module",
|
|
11
15
|
"exports": {
|
|
12
16
|
".": {
|
|
13
17
|
"source": "./src/index.ts",
|
|
14
18
|
"types": "./dist/types/src/index.d.ts",
|
|
15
|
-
"
|
|
16
|
-
"node": "./dist/lib/node-esm/index.mjs"
|
|
19
|
+
"default": "./dist/lib/neutral/index.mjs"
|
|
17
20
|
},
|
|
18
21
|
"./muxer": {
|
|
19
22
|
"source": "./src/edge-ws-muxer.ts",
|
|
20
23
|
"types": "./dist/types/src/edge-ws-muxer.d.ts",
|
|
21
|
-
"
|
|
22
|
-
"node": "./dist/lib/node-esm/edge-ws-muxer.mjs"
|
|
24
|
+
"default": "./dist/lib/neutral/edge-ws-muxer.mjs"
|
|
23
25
|
},
|
|
24
26
|
"./testing": {
|
|
25
27
|
"source": "./src/testing/index.ts",
|
|
26
28
|
"types": "./dist/types/src/testing/index.d.ts",
|
|
27
|
-
"
|
|
28
|
-
"node": "./dist/lib/node-esm/testing/index.mjs"
|
|
29
|
+
"default": "./dist/lib/neutral/testing/index.mjs"
|
|
29
30
|
}
|
|
30
31
|
},
|
|
31
32
|
"types": "dist/types/src/index.d.ts",
|
|
32
|
-
"typesVersions": {
|
|
33
|
-
"*": {
|
|
34
|
-
"testing": [
|
|
35
|
-
"dist/types/src/testing/index.d.ts"
|
|
36
|
-
]
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
33
|
"files": [
|
|
40
34
|
"dist",
|
|
41
35
|
"src",
|
|
42
36
|
"README.md"
|
|
43
37
|
],
|
|
44
38
|
"dependencies": {
|
|
45
|
-
"@effect/platform": "
|
|
39
|
+
"@effect/platform": "0.94.4",
|
|
40
|
+
"@opentelemetry/api": "^1.9.1",
|
|
46
41
|
"isomorphic-ws": "^5.0.0",
|
|
47
|
-
"ws": "^8.
|
|
48
|
-
"@dxos/
|
|
49
|
-
"@dxos/context": "0.8.4-main.
|
|
50
|
-
"@dxos/debug": "0.8.4-main.
|
|
51
|
-
"@dxos/
|
|
52
|
-
"@dxos/
|
|
53
|
-
"@dxos/
|
|
54
|
-
"@dxos/
|
|
55
|
-
"@dxos/
|
|
56
|
-
"@dxos/
|
|
57
|
-
"@dxos/
|
|
58
|
-
"@dxos/
|
|
59
|
-
"@dxos/
|
|
42
|
+
"ws": "^8.17.1",
|
|
43
|
+
"@dxos/async": "0.8.4-main.bc2380dfbc",
|
|
44
|
+
"@dxos/context": "0.8.4-main.bc2380dfbc",
|
|
45
|
+
"@dxos/debug": "0.8.4-main.bc2380dfbc",
|
|
46
|
+
"@dxos/crypto": "0.8.4-main.bc2380dfbc",
|
|
47
|
+
"@dxos/effect": "0.8.4-main.bc2380dfbc",
|
|
48
|
+
"@dxos/invariant": "0.8.4-main.bc2380dfbc",
|
|
49
|
+
"@dxos/credentials": "0.8.4-main.bc2380dfbc",
|
|
50
|
+
"@dxos/keyring": "0.8.4-main.bc2380dfbc",
|
|
51
|
+
"@dxos/keys": "0.8.4-main.bc2380dfbc",
|
|
52
|
+
"@dxos/log": "0.8.4-main.bc2380dfbc",
|
|
53
|
+
"@dxos/node-std": "0.8.4-main.bc2380dfbc",
|
|
54
|
+
"@dxos/protocols": "0.8.4-main.bc2380dfbc",
|
|
55
|
+
"@dxos/tracing": "0.8.4-main.bc2380dfbc",
|
|
56
|
+
"@dxos/util": "0.8.4-main.bc2380dfbc"
|
|
60
57
|
},
|
|
61
58
|
"devDependencies": {
|
|
62
|
-
"@dxos/test-utils": "0.8.4-main.
|
|
59
|
+
"@dxos/test-utils": "0.8.4-main.bc2380dfbc"
|
|
63
60
|
},
|
|
64
61
|
"peerDependencies": {
|
|
65
|
-
"effect": "
|
|
62
|
+
"effect": "3.20.0"
|
|
66
63
|
},
|
|
67
64
|
"publishConfig": {
|
|
68
65
|
"access": "public"
|
package/src/edge-client.test.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { describe, expect, onTestFinished, test } from 'vitest';
|
|
6
6
|
|
|
7
7
|
import { Trigger } from '@dxos/async';
|
|
8
|
+
import { Context } from '@dxos/context';
|
|
8
9
|
import { Keyring } from '@dxos/keyring';
|
|
9
10
|
import { TextMessageSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';
|
|
10
11
|
import { EdgeStatus } from '@dxos/protocols/proto/dxos/client/services';
|
|
@@ -25,13 +26,13 @@ describe('EdgeClient', () => {
|
|
|
25
26
|
onTestFinished(cleanup);
|
|
26
27
|
|
|
27
28
|
const { client, reconnectTrigger } = await openNewClient(endpoint);
|
|
28
|
-
await client.send(textMessage('Hello world 1'));
|
|
29
|
+
await client.send(Context.default(), textMessage('Hello world 1'));
|
|
29
30
|
expect(client.isOpen).is.true;
|
|
30
31
|
|
|
31
32
|
reconnectTrigger.reset();
|
|
32
33
|
await closeConnection();
|
|
33
34
|
await reconnectTrigger.wait();
|
|
34
|
-
await expect(client.send(textMessage('Hello world 2'))).resolves.not.toThrow();
|
|
35
|
+
await expect(client.send(Context.default(), textMessage('Hello world 2'))).resolves.not.toThrow();
|
|
35
36
|
});
|
|
36
37
|
|
|
37
38
|
test('isConnected', async () => {
|
|
@@ -59,13 +60,13 @@ describe('EdgeClient', () => {
|
|
|
59
60
|
onTestFinished(cleanup);
|
|
60
61
|
|
|
61
62
|
const { client, reconnectTrigger } = await openNewClient(endpoint);
|
|
62
|
-
await client.send(textMessage('Hello world 1'));
|
|
63
|
+
await client.send(Context.default(), textMessage('Hello world 1'));
|
|
63
64
|
expect(client.isOpen).is.true;
|
|
64
65
|
|
|
65
66
|
reconnectTrigger.reset();
|
|
66
67
|
client.setIdentity(await createEphemeralEdgeIdentity());
|
|
67
68
|
await reconnectTrigger.wait();
|
|
68
|
-
await expect(client.send(textMessage('Hello world 2'))).resolves.not.toThrow();
|
|
69
|
+
await expect(client.send(Context.default(), textMessage('Hello world 2'))).resolves.not.toThrow();
|
|
69
70
|
});
|
|
70
71
|
|
|
71
72
|
test('send blocks until connection becomes ready', async () => {
|
|
@@ -75,7 +76,7 @@ describe('EdgeClient', () => {
|
|
|
75
76
|
|
|
76
77
|
const { client } = await openNewClient(endpoint);
|
|
77
78
|
setTimeout(() => admitConnection.wake(), 20);
|
|
78
|
-
await client.send(textMessage('Hello world 1'));
|
|
79
|
+
await client.send(Context.default(), textMessage('Hello world 1'));
|
|
79
80
|
await expect.poll(() => messageSink.length).toBe(1);
|
|
80
81
|
});
|
|
81
82
|
|
|
@@ -86,11 +87,13 @@ describe('EdgeClient', () => {
|
|
|
86
87
|
|
|
87
88
|
const { client } = await openNewClient(endpoint);
|
|
88
89
|
setTimeout(async () => client.setIdentity(await createEphemeralEdgeIdentity()));
|
|
89
|
-
await expect(client.send(textMessage('Hello world 1'))).rejects.toThrow(
|
|
90
|
+
await expect(client.send(Context.default(), textMessage('Hello world 1'))).rejects.toThrow(
|
|
91
|
+
EdgeIdentityChangedError,
|
|
92
|
+
);
|
|
90
93
|
|
|
91
94
|
// Test recovers.
|
|
92
95
|
setTimeout(() => admitConnection.wake(), 20);
|
|
93
|
-
await client.send(textMessage('Hello world 1'));
|
|
96
|
+
await client.send(Context.default(), textMessage('Hello world 1'));
|
|
94
97
|
await expect.poll(() => messageSink.length).toBe(1);
|
|
95
98
|
});
|
|
96
99
|
|
|
@@ -101,7 +104,9 @@ describe('EdgeClient', () => {
|
|
|
101
104
|
|
|
102
105
|
const { client } = await openNewClient(endpoint);
|
|
103
106
|
setTimeout(() => client.close());
|
|
104
|
-
await expect(client.send(textMessage('Hello world 1'))).rejects.toThrow(
|
|
107
|
+
await expect(client.send(Context.default(), textMessage('Hello world 1'))).rejects.toThrow(
|
|
108
|
+
EdgeConnectionClosedError,
|
|
109
|
+
);
|
|
105
110
|
});
|
|
106
111
|
|
|
107
112
|
test('onReconnect trigger', async () => {
|
|
@@ -129,12 +134,12 @@ describe('EdgeClient', () => {
|
|
|
129
134
|
onTestFinished(cleanup);
|
|
130
135
|
|
|
131
136
|
const { client, identity: oldIdentity } = await openNewClient(endpoint);
|
|
132
|
-
await client.send(textMessage('Hello world 1', oldIdentity));
|
|
137
|
+
await client.send(Context.default(), textMessage('Hello world 1', oldIdentity));
|
|
133
138
|
expect(client.isOpen).is.true;
|
|
134
139
|
|
|
135
140
|
const newIdentity = await createEphemeralEdgeIdentity();
|
|
136
141
|
client.setIdentity(newIdentity);
|
|
137
|
-
await client.send(textMessage('Hello world 2', newIdentity));
|
|
142
|
+
await client.send(Context.default(), textMessage('Hello world 2', newIdentity));
|
|
138
143
|
await expect.poll(() => messageSourceLog.length).toBe(2);
|
|
139
144
|
expect(messageSourceLog.map((m) => m.peerKey)).toStrictEqual([oldIdentity.peerKey, newIdentity.peerKey]);
|
|
140
145
|
});
|
|
@@ -147,7 +152,7 @@ describe('EdgeClient', () => {
|
|
|
147
152
|
|
|
148
153
|
const client = new EdgeClient(identity, { socketEndpoint: process.env.EDGE_ENDPOINT! });
|
|
149
154
|
await openAndClose(client);
|
|
150
|
-
await client.send(textMessage('Hello world 1'));
|
|
155
|
+
await client.send(Context.default(), textMessage('Hello world 1'));
|
|
151
156
|
expect(client.isOpen).is.true;
|
|
152
157
|
});
|
|
153
158
|
|
package/src/edge-client.ts
CHANGED
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
scheduleMicroTask,
|
|
11
11
|
scheduleTaskInterval,
|
|
12
12
|
} from '@dxos/async';
|
|
13
|
+
import { Context, TRACE_SPAN_ATTRIBUTE, type TraceContextData } from '@dxos/context';
|
|
13
14
|
import { type Lifecycle, Resource } from '@dxos/context';
|
|
14
15
|
import { log, logInfo } from '@dxos/log';
|
|
15
16
|
import { type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';
|
|
@@ -35,6 +36,8 @@ export type MessengerConfig = {
|
|
|
35
36
|
timeout?: number;
|
|
36
37
|
protocol?: Protocol;
|
|
37
38
|
disableAuth?: boolean;
|
|
39
|
+
/** Sent as `X-DXOS-Client-Tag` on the WebSocket upgrade (Node/`ws` only; ignored in browsers). */
|
|
40
|
+
clientTag?: string;
|
|
38
41
|
};
|
|
39
42
|
|
|
40
43
|
export interface EdgeConnection extends Required<Lifecycle> {
|
|
@@ -45,7 +48,7 @@ export interface EdgeConnection extends Required<Lifecycle> {
|
|
|
45
48
|
get isOpen(): boolean;
|
|
46
49
|
get status(): EdgeStatus;
|
|
47
50
|
setIdentity(identity: EdgeIdentity): void;
|
|
48
|
-
send(message: Message): Promise<void>;
|
|
51
|
+
send(ctx: Context, message: Message): Promise<void>;
|
|
49
52
|
onMessage(listener: MessageListener): () => void;
|
|
50
53
|
onReconnected(listener: ReconnectListener): () => void;
|
|
51
54
|
}
|
|
@@ -126,7 +129,7 @@ export class EdgeClient extends Resource implements EdgeConnection {
|
|
|
126
129
|
* Send message.
|
|
127
130
|
* NOTE: The message is guaranteed to be delivered but the service must respond with a message to confirm processing.
|
|
128
131
|
*/
|
|
129
|
-
public async send(message: Message) {
|
|
132
|
+
public async send(ctx: Context, message: Message) {
|
|
130
133
|
if (this._ready.state !== TriggerState.RESOLVED) {
|
|
131
134
|
log('waiting for websocket');
|
|
132
135
|
await this._ready.wait({ timeout: this._config.timeout ?? DEFAULT_TIMEOUT });
|
|
@@ -143,6 +146,15 @@ export class EdgeClient extends Resource implements EdgeConnection {
|
|
|
143
146
|
throw new EdgeIdentityChangedError();
|
|
144
147
|
}
|
|
145
148
|
|
|
149
|
+
const traceCtx = ctx.getAttribute(TRACE_SPAN_ATTRIBUTE) as TraceContextData | undefined;
|
|
150
|
+
if (traceCtx) {
|
|
151
|
+
message.traceContext = {
|
|
152
|
+
$typeName: 'dxos.edge.messenger.TraceContext',
|
|
153
|
+
traceparent: traceCtx.traceparent,
|
|
154
|
+
tracestate: traceCtx.tracestate,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
146
158
|
this._currentConnection.send(message);
|
|
147
159
|
}
|
|
148
160
|
|
|
@@ -219,7 +231,11 @@ export class EdgeClient extends Resource implements EdgeConnection {
|
|
|
219
231
|
log('Opening websocket', { url: url.toString(), protocolHeader });
|
|
220
232
|
const connection = new EdgeWsConnection(
|
|
221
233
|
identity,
|
|
222
|
-
{
|
|
234
|
+
{
|
|
235
|
+
url,
|
|
236
|
+
protocolHeader,
|
|
237
|
+
headers: this._config.clientTag ? { 'X-DXOS-Client-Tag': this._config.clientTag } : undefined,
|
|
238
|
+
},
|
|
223
239
|
{
|
|
224
240
|
onConnected: () => {
|
|
225
241
|
if (this._isActive(connection)) {
|
|
@@ -11,12 +11,13 @@ import { EdgeHttpClient } from './edge-http-client';
|
|
|
11
11
|
const DEV_SERVER = 'https://edge.dxos.workers.dev';
|
|
12
12
|
|
|
13
13
|
describe.skipIf(process.env.CI)('EdgeHttpClient', () => {
|
|
14
|
-
it.
|
|
14
|
+
it.skip('should get status', async ({ expect }) => {
|
|
15
15
|
const client = new EdgeHttpClient(DEV_SERVER);
|
|
16
16
|
const identity = await createEphemeralEdgeIdentity();
|
|
17
17
|
client.setIdentity(identity);
|
|
18
18
|
|
|
19
|
-
const
|
|
19
|
+
const { Context } = await import('@dxos/context');
|
|
20
|
+
const result = await client.getStatus(Context.default());
|
|
20
21
|
expect(result).toBeDefined();
|
|
21
22
|
});
|
|
22
23
|
});
|