@dxos/client-services 0.6.12-main.f9d0246 → 0.6.12-staging.0b4bb48

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 (92) hide show
  1. package/dist/lib/browser/{chunk-7ONARHVD.mjs → chunk-YCJNCCXZ.mjs} +5107 -5210
  2. package/dist/lib/browser/chunk-YCJNCCXZ.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3 -3
  4. package/dist/lib/browser/index.mjs.map +3 -3
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +5 -4
  7. package/dist/lib/browser/testing/index.mjs.map +2 -2
  8. package/dist/lib/node/{chunk-UPLMIG6W.cjs → chunk-Z2ZTFILR.cjs} +4889 -4992
  9. package/dist/lib/node/chunk-Z2ZTFILR.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +46 -46
  11. package/dist/lib/node/index.cjs.map +3 -3
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/testing/index.cjs +12 -11
  14. package/dist/lib/node/testing/index.cjs.map +2 -2
  15. package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts.map +1 -1
  16. package/dist/types/src/packlets/identity/authenticator.test.d.ts +2 -0
  17. package/dist/types/src/packlets/identity/authenticator.test.d.ts.map +1 -0
  18. package/dist/types/src/packlets/identity/identity-manager.d.ts +7 -19
  19. package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
  20. package/dist/types/src/packlets/identity/identity.d.ts +1 -7
  21. package/dist/types/src/packlets/identity/identity.d.ts.map +1 -1
  22. package/dist/types/src/packlets/invitations/invitation-host-extension.d.ts.map +1 -1
  23. package/dist/types/src/packlets/services/automerge-host.test.d.ts +2 -0
  24. package/dist/types/src/packlets/services/automerge-host.test.d.ts.map +1 -0
  25. package/dist/types/src/packlets/services/service-context.d.ts +4 -3
  26. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  27. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  28. package/dist/types/src/packlets/spaces/data-space-manager.d.ts +2 -1
  29. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  30. package/dist/types/src/packlets/spaces/data-space.d.ts +2 -1
  31. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  32. package/dist/types/src/packlets/spaces/edge-feed-replicator.d.ts +0 -3
  33. package/dist/types/src/packlets/spaces/edge-feed-replicator.d.ts.map +1 -1
  34. package/dist/types/src/packlets/spaces/epoch-migrations.d.ts +1 -1
  35. package/dist/types/src/packlets/spaces/epoch-migrations.d.ts.map +1 -1
  36. package/dist/types/src/packlets/storage/storage.d.ts.map +1 -1
  37. package/dist/types/src/packlets/testing/test-builder.d.ts +2 -1
  38. package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
  39. package/dist/types/src/packlets/worker/worker-runtime.d.ts.map +1 -1
  40. package/dist/types/src/version.d.ts +1 -1
  41. package/dist/types/src/version.d.ts.map +1 -1
  42. package/package.json +39 -43
  43. package/src/packlets/devices/devices-service.test.ts +5 -4
  44. package/src/packlets/diagnostics/diagnostics-broadcast.ts +0 -1
  45. package/src/packlets/identity/{authenticator.node.test.ts → authenticator.test.ts} +3 -2
  46. package/src/packlets/identity/identity-manager.test.ts +6 -5
  47. package/src/packlets/identity/identity-manager.ts +19 -35
  48. package/src/packlets/identity/identity-service.test.ts +8 -4
  49. package/src/packlets/identity/identity.test.ts +239 -128
  50. package/src/packlets/identity/identity.ts +8 -38
  51. package/src/packlets/invitations/device-invitation-protocol.test.ts +4 -7
  52. package/src/packlets/invitations/invitation-host-extension.ts +3 -0
  53. package/src/packlets/invitations/invitations-handler.test.ts +7 -14
  54. package/src/packlets/invitations/invitations-handler.ts +1 -1
  55. package/src/packlets/invitations/space-invitation-protocol.test.ts +3 -4
  56. package/src/packlets/logging/logging.test.ts +2 -1
  57. package/src/packlets/network/network-service.test.ts +3 -2
  58. package/src/packlets/services/automerge-host.test.ts +60 -0
  59. package/src/packlets/services/service-context.test.ts +1 -3
  60. package/src/packlets/services/service-context.ts +12 -24
  61. package/src/packlets/services/service-host.test.ts +12 -8
  62. package/src/packlets/services/service-host.ts +2 -2
  63. package/src/packlets/services/service-registry.test.ts +2 -1
  64. package/src/packlets/spaces/data-space-manager.test.ts +2 -2
  65. package/src/packlets/spaces/data-space-manager.ts +1 -4
  66. package/src/packlets/spaces/data-space.ts +2 -7
  67. package/src/packlets/spaces/edge-feed-replicator.ts +20 -70
  68. package/src/packlets/spaces/epoch-migrations.ts +2 -2
  69. package/src/packlets/spaces/notarization-plugin.test.ts +3 -2
  70. package/src/packlets/spaces/spaces-service.test.ts +9 -5
  71. package/src/packlets/storage/storage.ts +1 -0
  72. package/src/packlets/system/system-service.test.ts +2 -1
  73. package/src/packlets/testing/test-builder.ts +2 -1
  74. package/src/packlets/worker/worker-runtime.ts +2 -2
  75. package/src/version.ts +1 -1
  76. package/dist/lib/browser/chunk-7ONARHVD.mjs.map +0 -7
  77. package/dist/lib/node/chunk-UPLMIG6W.cjs.map +0 -7
  78. package/dist/lib/node-esm/chunk-DSRREBQH.mjs +0 -7819
  79. package/dist/lib/node-esm/chunk-DSRREBQH.mjs.map +0 -7
  80. package/dist/lib/node-esm/index.mjs +0 -416
  81. package/dist/lib/node-esm/index.mjs.map +0 -7
  82. package/dist/lib/node-esm/meta.json +0 -1
  83. package/dist/lib/node-esm/testing/index.mjs +0 -418
  84. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  85. package/dist/types/src/packlets/identity/authenticator.node.test.d.ts +0 -2
  86. package/dist/types/src/packlets/identity/authenticator.node.test.d.ts.map +0 -1
  87. package/dist/types/src/packlets/spaces/edge-feed-replicator.test.d.ts +0 -2
  88. package/dist/types/src/packlets/spaces/edge-feed-replicator.test.d.ts.map +0 -1
  89. package/dist/types/src/testing/setup.d.ts +0 -3
  90. package/dist/types/src/testing/setup.d.ts.map +0 -1
  91. package/src/packlets/spaces/edge-feed-replicator.test.ts +0 -254
  92. package/src/testing/setup.ts +0 -11
@@ -1,254 +0,0 @@
1
- //
2
- // Copyright 2022 DXOS.org
3
- //
4
-
5
- import { decode as decodeCbor, encode as encodeCbor } from 'cbor-x';
6
- import { getRandomPort } from 'get-port-please';
7
- import { describe, test, onTestFinished, vi, expect } from 'vitest';
8
-
9
- import { Trigger, sleep } from '@dxos/async';
10
- import { Context } from '@dxos/context';
11
- import { valueEncoding } from '@dxos/echo-pipeline';
12
- import { EdgeClient, EdgeIdentityChangedError } from '@dxos/edge-client';
13
- import { createTestEdgeWsServer } from '@dxos/edge-client/testing';
14
- import { FeedFactory, FeedStore } from '@dxos/feed-store';
15
- import { type FeedWrapper } from '@dxos/feed-store';
16
- import { Keyring } from '@dxos/keyring';
17
- import { PublicKey, SpaceId } from '@dxos/keys';
18
- import { type FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
19
- import { createStorage } from '@dxos/random-access-storage';
20
- import { openAndClose } from '@dxos/test-utils';
21
- import { Timeframe } from '@dxos/timeframe';
22
- import { range } from '@dxos/util';
23
-
24
- import { EdgeFeedReplicator } from './edge-feed-replicator';
25
-
26
- describe('EdgeFeedReplicator', () => {
27
- test('requests metadata after connection is open', async () => {
28
- const { endpoint, admitConnection, messageSink } = await createEdge();
29
- const { messenger, sendSpy } = await createClient(endpoint);
30
-
31
- await attachReplicator(messenger);
32
-
33
- await sleep(50);
34
-
35
- expect(sendSpy).not.toHaveBeenCalled();
36
- expect(messageSink.length).toEqual(0);
37
-
38
- admitConnection.wake();
39
- await expect.poll(() => sendSpy.mock.calls.length).toEqual(1);
40
- expect(messageSink.length).toEqual(1);
41
- expect(messageSink[0].type).toEqual('get-metadata');
42
- });
43
-
44
- test('replicates if added to a connected client', async () => {
45
- const { endpoint, admitConnection, messageSink } = await createEdge();
46
- const { messenger } = await createClient(endpoint);
47
- admitConnection.wake();
48
- await expect.poll(() => messenger.isConnected).toBeTruthy();
49
-
50
- await attachReplicator(messenger);
51
- await expect.poll(() => messageSink.length).toEqual(1);
52
- });
53
-
54
- test('sends a block', async () => {
55
- const { endpoint, admitConnection, messageSink } = await createEdge();
56
- const { messenger } = await createClient(endpoint);
57
-
58
- const { feed } = await attachReplicator(messenger);
59
-
60
- admitConnection.wake();
61
- await appendMessage(feed);
62
-
63
- await expect.poll(() => messageSink.length).toEqual(2);
64
- expect(messageSink[1].type).toEqual('data');
65
- });
66
-
67
- test('re-requests metadata on reconnect', async () => {
68
- const { endpoint, admitConnection, messageSink } = await createEdge();
69
- const { messenger } = await createClient(endpoint);
70
-
71
- await attachReplicator(messenger);
72
-
73
- admitConnection.wake();
74
- await expect.poll(() => messageSink.length).toEqual(1);
75
-
76
- updateIdentity(messenger);
77
- await messenger.reconnect.waitForCount(1);
78
-
79
- await expect.poll(() => messageSink.length).toEqual(2);
80
- expect(messageSink[1].type).toEqual('get-metadata');
81
- });
82
-
83
- test('recovers after query sending failure during identity change', async () => {
84
- const { endpoint, admitConnection, messageSink } = await createEdge();
85
- const { messenger, sendSpy } = await createClient(endpoint);
86
-
87
- await attachReplicator(messenger);
88
-
89
- sendSpy.mockImplementationOnce(() => {
90
- throw new EdgeIdentityChangedError(); // Hard to mock the exact race condition for when this error is thrown
91
- });
92
- admitConnection.wake();
93
-
94
- await expect.poll(() => sendSpy.mock.calls.length).toEqual(1);
95
- expect(messageSink.length).toEqual(0);
96
- updateIdentity(messenger);
97
-
98
- await expect.poll(() => messageSink.length).toEqual(1);
99
- expect(messageSink[0].type).toEqual('get-metadata');
100
- });
101
-
102
- test('recovers after response sending failure during identity change', async () => {
103
- const { endpoint, admitConnection, messageSink, sendResponseMessage } = await createEdge();
104
- const { messenger, sendSpy } = await createClient(endpoint);
105
-
106
- const { feed } = await attachReplicator(messenger);
107
- await appendMessage(feed);
108
-
109
- sendSpy.mockImplementationOnce(async (request: any) => {
110
- sendResponseMessage(request, encodeCbor({ type: 'metadata', feedKey: feed.key.toHex(), length: 0 }));
111
- return Promise.resolve();
112
- });
113
- sendSpy.mockImplementationOnce(async () => {
114
- throw new EdgeIdentityChangedError();
115
- });
116
- admitConnection.wake();
117
-
118
- await expect.poll(() => sendSpy.mock.calls.length).toEqual(2);
119
- expect(messageSink.length).toEqual(0);
120
- updateIdentity(messenger);
121
-
122
- await expect.poll(() => messageSink.length).toEqual(2);
123
- expect(messageSink[1].type).toEqual('data');
124
- });
125
-
126
- test('propagates errors unrelated to reconnect', async () => {
127
- const { endpoint, admitConnection } = await createEdge();
128
- const { messenger, sendSpy } = await createClient(endpoint);
129
-
130
- const { replicator } = await attachReplicator(messenger, { skipOpen: true });
131
- const raised = new Trigger();
132
- await replicator.open(new Context({ onError: () => raised.wake() }));
133
- onTestFinished(async () => {
134
- await replicator.close();
135
- });
136
-
137
- sendSpy.mockImplementationOnce(() => {
138
- throw new Error();
139
- });
140
- admitConnection.wake();
141
-
142
- await raised.wait();
143
- });
144
-
145
- test('identity update before connected', async () => {
146
- const { endpoint, admitConnection, messageSink } = await createEdge();
147
- const { messenger } = await createClient(endpoint);
148
-
149
- await attachReplicator(messenger);
150
- updateIdentity(messenger);
151
- await sleep(100);
152
- admitConnection.wake();
153
-
154
- await expect.poll(() => messageSink.length).toEqual(2);
155
- expect(messageSink.map((m) => m.type)).toStrictEqual(range(2, () => 'get-metadata'));
156
- });
157
-
158
- test('block appended during reconnect', async () => {
159
- const { endpoint, admitConnection, feedLength } = await createEdge();
160
- const { messenger } = await createClient(endpoint);
161
-
162
- const { feed } = await attachReplicator(messenger);
163
- admitConnection.wake();
164
- await sleep(10);
165
-
166
- admitConnection.reset();
167
- updateIdentity(messenger);
168
- await appendMessage(feed);
169
- await sleep(20);
170
- admitConnection.wake();
171
-
172
- await expect.poll(() => feedLength()).toEqual(1);
173
- });
174
-
175
- test('reconnect during block append', async () => {
176
- const { endpoint, admitConnection, feedLength } = await createEdge();
177
- const { messenger } = await createClient(endpoint);
178
-
179
- const { feed } = await attachReplicator(messenger);
180
- admitConnection.wake();
181
- await sleep(10);
182
-
183
- void appendMessage(feed);
184
- updateIdentity(messenger);
185
-
186
- await expect.poll(() => feedLength()).toEqual(1);
187
- });
188
-
189
- const createEdge = async () => {
190
- const port = await getRandomPort('127.0.0.1');
191
- let lastBlockIndex = -1;
192
- const admitConnection = new Trigger();
193
- const { cleanup, endpoint, messageSink, sendResponseMessage } = await createTestEdgeWsServer(port, {
194
- admitConnection,
195
- payloadDecoder: decodeCbor,
196
- messageHandler: async (message: any) => {
197
- if (message.type === 'get-metadata') {
198
- return encodeCbor({ type: 'metadata', feedKey: message.feedKey, length: lastBlockIndex + 1 });
199
- } else {
200
- lastBlockIndex = Math.max(lastBlockIndex, message.blocks[message.blocks.length - 1].index);
201
- }
202
- },
203
- });
204
- onTestFinished(cleanup);
205
-
206
- return {
207
- endpoint,
208
- messageSink,
209
- admitConnection,
210
- sendResponseMessage,
211
- feedLength: () => lastBlockIndex + 1,
212
- };
213
- };
214
-
215
- const createClient = async (endpoint: string) => {
216
- const peerKey = PublicKey.random().toHex();
217
- const messenger = new EdgeClient(peerKey, peerKey, { socketEndpoint: endpoint });
218
- const sendSpy = vi.spyOn(messenger, 'send');
219
- await openAndClose(messenger);
220
- return { messenger, sendSpy };
221
- };
222
-
223
- const attachReplicator = async (messenger: EdgeClient, options?: { skipOpen?: boolean }) => {
224
- const spaceId = SpaceId.random();
225
- const feed = await createNewFeed();
226
- const replicator = new EdgeFeedReplicator({ messenger, spaceId });
227
- await replicator.addFeed(feed);
228
- if (!options?.skipOpen) {
229
- await openAndClose(replicator);
230
- }
231
- return { feed, replicator };
232
- };
233
-
234
- const createNewFeed = async () => {
235
- const storage = createStorage();
236
- const keyring = new Keyring();
237
- const feedStore = new FeedStore<FeedMessage>({
238
- factory: new FeedFactory<FeedMessage>({
239
- root: storage.createDirectory(),
240
- signer: keyring,
241
- hypercore: { valueEncoding },
242
- }),
243
- });
244
- onTestFinished(() => feedStore.close());
245
- return feedStore.openFeed(await keyring.createKey(), { writable: true });
246
- };
247
-
248
- const updateIdentity = (messenger: EdgeClient) => {
249
- const identityKey = PublicKey.random().toHex();
250
- messenger.setIdentity({ peerKey: messenger.peerKey, identityKey });
251
- };
252
-
253
- const appendMessage = (feed: FeedWrapper<FeedMessage>) => feed.append({ timeframe: new Timeframe() });
254
- });
@@ -1,11 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { runTestSignalServer } from '@dxos/signal';
6
-
7
- const port = 12004;
8
-
9
- export default async () => {
10
- await runTestSignalServer({ port, killExisting: true });
11
- };