@dxos/edge-client 0.6.12 → 0.6.13-main.548ca8d
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/chunk-ZWJXA37R.mjs +113 -0
- package/dist/lib/browser/chunk-ZWJXA37R.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +347 -178
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +125 -0
- package/dist/lib/browser/testing/index.mjs.map +7 -0
- package/dist/lib/node/chunk-ANV2HBEH.cjs +136 -0
- package/dist/lib/node/chunk-ANV2HBEH.cjs.map +7 -0
- package/dist/lib/node/index.cjs +346 -175
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +155 -0
- package/dist/lib/node/testing/index.cjs.map +7 -0
- package/dist/lib/node-esm/chunk-HNVT57AU.mjs +115 -0
- package/dist/lib/node-esm/chunk-HNVT57AU.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +647 -0
- package/dist/lib/node-esm/index.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -0
- package/dist/lib/node-esm/testing/index.mjs +126 -0
- package/dist/lib/node-esm/testing/index.mjs.map +7 -0
- package/dist/types/src/auth.d.ts +22 -0
- package/dist/types/src/auth.d.ts.map +1 -0
- package/dist/types/src/defs.d.ts.map +1 -1
- package/dist/types/src/edge-client.d.ts +24 -13
- package/dist/types/src/edge-client.d.ts.map +1 -1
- package/dist/types/src/edge-http-client.d.ts +35 -0
- package/dist/types/src/edge-http-client.d.ts.map +1 -0
- package/dist/types/src/errors.d.ts +4 -1
- package/dist/types/src/errors.d.ts.map +1 -1
- package/dist/types/src/index.d.ts +3 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/protocol.d.ts +2 -2
- package/dist/types/src/protocol.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +2 -0
- package/dist/types/src/testing/index.d.ts.map +1 -0
- package/dist/types/src/testing/test-utils.d.ts +21 -0
- package/dist/types/src/testing/test-utils.d.ts.map +1 -0
- package/dist/types/src/utils.d.ts +2 -0
- package/dist/types/src/utils.d.ts.map +1 -0
- package/package.json +29 -14
- package/src/auth.ts +135 -0
- package/src/defs.ts +2 -3
- package/src/edge-client.test.ts +50 -18
- package/src/edge-client.ts +79 -23
- package/src/edge-http-client.ts +151 -0
- package/src/errors.ts +8 -2
- package/src/index.ts +3 -0
- package/src/persistent-lifecycle.test.ts +2 -2
- package/src/protocol.test.ts +1 -2
- package/src/protocol.ts +2 -2
- package/src/testing/index.ts +5 -0
- package/src/testing/test-utils.ts +114 -0
- package/src/utils.ts +10 -0
- package/src/websocket.test.ts +5 -4
- package/dist/types/src/test-utils.d.ts +0 -11
- package/dist/types/src/test-utils.d.ts.map +0 -1
- package/src/test-utils.ts +0 -49
package/src/protocol.ts
CHANGED
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
|
|
5
5
|
import { invariant } from '@dxos/invariant';
|
|
6
6
|
import { buf, bufWkt } from '@dxos/protocols/buf';
|
|
7
|
-
import { type Message, MessageSchema, type
|
|
7
|
+
import { type Message, MessageSchema, type PeerSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';
|
|
8
8
|
import { bufferToArray } from '@dxos/util';
|
|
9
9
|
|
|
10
|
-
export type PeerData =
|
|
10
|
+
export type PeerData = buf.MessageInitShape<typeof PeerSchema>;
|
|
11
11
|
|
|
12
12
|
export const getTypename = (typeName: string) => `type.googleapis.com/${typeName}`;
|
|
13
13
|
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import WebSocket from 'isomorphic-ws';
|
|
6
|
+
|
|
7
|
+
import { Trigger } from '@dxos/async';
|
|
8
|
+
import { log } from '@dxos/log';
|
|
9
|
+
import { buf } from '@dxos/protocols/buf';
|
|
10
|
+
import { MessageSchema, TextMessageSchema, type Message } from '@dxos/protocols/buf/dxos/edge/messenger_pb';
|
|
11
|
+
|
|
12
|
+
import { protocol } from '../defs';
|
|
13
|
+
import { toUint8Array } from '../protocol';
|
|
14
|
+
|
|
15
|
+
export const DEFAULT_PORT = 8080;
|
|
16
|
+
|
|
17
|
+
type TestEdgeWsServerParams = {
|
|
18
|
+
admitConnection?: Trigger;
|
|
19
|
+
payloadDecoder?: (payload: Uint8Array) => any;
|
|
20
|
+
messageHandler?: (payload: any) => Promise<Uint8Array | undefined>;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const createTestEdgeWsServer = async (port = DEFAULT_PORT, params?: TestEdgeWsServerParams) => {
|
|
24
|
+
const server = new WebSocket.Server({ port, verifyClient: createConnectionDelayHandler(params) });
|
|
25
|
+
|
|
26
|
+
let connection: WebSocket | undefined;
|
|
27
|
+
|
|
28
|
+
const messageSink: any[] = [];
|
|
29
|
+
const closeTrigger = new Trigger();
|
|
30
|
+
const sendResponseMessage = createResponseSender(() => connection!);
|
|
31
|
+
|
|
32
|
+
server.on('connection', (ws) => {
|
|
33
|
+
connection = ws;
|
|
34
|
+
ws.on('error', (err) => log.catch(err));
|
|
35
|
+
ws.on('message', async (data) => {
|
|
36
|
+
if (String(data) === '__ping__') {
|
|
37
|
+
ws.send('__pong__');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const { request, requestPayload } = await decodeRequest(params, data);
|
|
41
|
+
if (params?.messageHandler) {
|
|
42
|
+
const responsePayload = await params.messageHandler(requestPayload);
|
|
43
|
+
if (responsePayload && connection) {
|
|
44
|
+
sendResponseMessage(request, responsePayload);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
log('message', { payload: requestPayload });
|
|
48
|
+
messageSink.push(requestPayload);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
ws.on('close', () => {
|
|
52
|
+
connection = undefined;
|
|
53
|
+
closeTrigger.wake();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
server,
|
|
59
|
+
messageSink,
|
|
60
|
+
endpoint: `ws://localhost:${port}`,
|
|
61
|
+
cleanup: () => server.close(),
|
|
62
|
+
currentConnection: () => connection,
|
|
63
|
+
sendResponseMessage,
|
|
64
|
+
sendMessage: (msg: Message) => {
|
|
65
|
+
connection!.send(buf.toBinary(MessageSchema, msg));
|
|
66
|
+
},
|
|
67
|
+
closeConnection: () => {
|
|
68
|
+
closeTrigger.reset();
|
|
69
|
+
connection!.close(1011);
|
|
70
|
+
return closeTrigger.wait();
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const createConnectionDelayHandler = (params: TestEdgeWsServerParams | undefined) => {
|
|
76
|
+
return (_: any, callback: (admit: boolean) => void) => {
|
|
77
|
+
if (params?.admitConnection) {
|
|
78
|
+
log('delaying edge connection admission');
|
|
79
|
+
void params.admitConnection.wait().then(() => {
|
|
80
|
+
callback(true);
|
|
81
|
+
log('edge connection admitted');
|
|
82
|
+
});
|
|
83
|
+
} else {
|
|
84
|
+
callback(true);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
const createResponseSender = (connection: () => WebSocket) => {
|
|
90
|
+
return (request: Message, responsePayload: Uint8Array) => {
|
|
91
|
+
const recipient = request.source!;
|
|
92
|
+
connection().send(
|
|
93
|
+
buf.toBinary(
|
|
94
|
+
MessageSchema,
|
|
95
|
+
buf.create(MessageSchema, {
|
|
96
|
+
source: {
|
|
97
|
+
identityKey: recipient.identityKey,
|
|
98
|
+
peerKey: recipient.peerKey,
|
|
99
|
+
},
|
|
100
|
+
serviceId: request.serviceId!,
|
|
101
|
+
payload: { value: responsePayload },
|
|
102
|
+
}),
|
|
103
|
+
),
|
|
104
|
+
);
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const decodeRequest = async (params: TestEdgeWsServerParams | undefined, data: any) => {
|
|
109
|
+
const request = buf.fromBinary(MessageSchema, await toUint8Array(data));
|
|
110
|
+
const requestPayload = params?.payloadDecoder
|
|
111
|
+
? params.payloadDecoder(request.payload!.value!)
|
|
112
|
+
: protocol.getPayload(request, TextMessageSchema);
|
|
113
|
+
return { request, requestPayload };
|
|
114
|
+
};
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2024 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
export const getEdgeUrlWithProtocol = (baseUrl: string, protocol: 'http' | 'ws') => {
|
|
6
|
+
const isSecure = baseUrl.startsWith('https') || baseUrl.startsWith('wss');
|
|
7
|
+
const url = new URL(baseUrl);
|
|
8
|
+
url.protocol = protocol + (isSecure ? 's' : '');
|
|
9
|
+
return url.toString();
|
|
10
|
+
};
|
package/src/websocket.test.ts
CHANGED
|
@@ -2,17 +2,18 @@
|
|
|
2
2
|
// Copyright 2024 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
-
import { expect } from 'chai';
|
|
6
5
|
import WebSocket from 'isomorphic-ws';
|
|
6
|
+
import { describe, expect, test, onTestFinished } from 'vitest';
|
|
7
7
|
|
|
8
8
|
import { Trigger, TriggerState } from '@dxos/async';
|
|
9
|
-
import { describe, test } from '@dxos/test';
|
|
10
9
|
|
|
11
|
-
import {
|
|
10
|
+
import { createTestEdgeWsServer } from './testing';
|
|
12
11
|
|
|
13
12
|
describe('WebSocket', () => {
|
|
14
13
|
test('swap `onclose` handler ', async () => {
|
|
15
|
-
const { endpoint } = await
|
|
14
|
+
const { endpoint, cleanup } = await createTestEdgeWsServer(8003);
|
|
15
|
+
onTestFinished(cleanup);
|
|
16
|
+
|
|
16
17
|
const ws = new WebSocket(endpoint);
|
|
17
18
|
const opened = new Trigger();
|
|
18
19
|
ws.onopen = () => {
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import WebSocket from 'isomorphic-ws';
|
|
2
|
-
export declare const DEFAULT_PORT = 8080;
|
|
3
|
-
export declare const createTestWsServer: (port?: number) => Promise<{
|
|
4
|
-
server: WebSocket.Server;
|
|
5
|
-
/**
|
|
6
|
-
* Close the server connection.
|
|
7
|
-
*/
|
|
8
|
-
error: () => Promise<void>;
|
|
9
|
-
endpoint: string;
|
|
10
|
-
}>;
|
|
11
|
-
//# sourceMappingURL=test-utils.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../src/test-utils.ts"],"names":[],"mappings":"AAIA,OAAO,SAAS,MAAM,eAAe,CAAC;AAWtC,eAAO,MAAM,YAAY,OAAO,CAAC;AAEjC,eAAO,MAAM,kBAAkB;;IAsB3B;;OAEG;;;EAON,CAAC"}
|
package/src/test-utils.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2024 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import WebSocket from 'isomorphic-ws';
|
|
6
|
-
|
|
7
|
-
import { Trigger } from '@dxos/async';
|
|
8
|
-
import { log } from '@dxos/log';
|
|
9
|
-
import { buf } from '@dxos/protocols/buf';
|
|
10
|
-
import { MessageSchema, TextMessageSchema } from '@dxos/protocols/buf/dxos/edge/messenger_pb';
|
|
11
|
-
import { afterTest } from '@dxos/test';
|
|
12
|
-
|
|
13
|
-
import { protocol } from './defs';
|
|
14
|
-
import { toUint8Array } from './protocol';
|
|
15
|
-
|
|
16
|
-
export const DEFAULT_PORT = 8080;
|
|
17
|
-
|
|
18
|
-
export const createTestWsServer = async (port = DEFAULT_PORT) => {
|
|
19
|
-
const server = new WebSocket.Server({ port });
|
|
20
|
-
let connection: WebSocket;
|
|
21
|
-
const closeTrigger = new Trigger();
|
|
22
|
-
server.on('connection', (ws) => {
|
|
23
|
-
connection = ws;
|
|
24
|
-
ws.on('error', (err) => log.catch(err));
|
|
25
|
-
ws.on('message', async (data) => {
|
|
26
|
-
if (String(data) === '__ping__') {
|
|
27
|
-
ws.send('__pong__');
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
30
|
-
log('message', {
|
|
31
|
-
payload: protocol.getPayload(buf.fromBinary(MessageSchema, await toUint8Array(data)), TextMessageSchema),
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
ws.on('close', () => closeTrigger.wake());
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
afterTest(() => server.close());
|
|
38
|
-
return {
|
|
39
|
-
server,
|
|
40
|
-
/**
|
|
41
|
-
* Close the server connection.
|
|
42
|
-
*/
|
|
43
|
-
error: async () => {
|
|
44
|
-
connection.close(1011);
|
|
45
|
-
await closeTrigger.wait();
|
|
46
|
-
},
|
|
47
|
-
endpoint: `ws://localhost:${port}`,
|
|
48
|
-
};
|
|
49
|
-
};
|