@dxos/client-services 0.4.10-main.d658471 → 0.4.10-main.d6ef25d

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 (80) hide show
  1. package/dist/lib/browser/{chunk-MYKBSRL5.mjs → chunk-BASAWGAA.mjs} +1232 -972
  2. package/dist/lib/browser/chunk-BASAWGAA.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +13 -3
  4. package/dist/lib/browser/index.mjs.map +1 -1
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/packlets/testing/index.mjs +9 -4
  7. package/dist/lib/browser/packlets/testing/index.mjs.map +3 -3
  8. package/dist/lib/node/{chunk-UBE57IO7.cjs → chunk-4PLPSVK3.cjs} +1094 -917
  9. package/dist/lib/node/chunk-4PLPSVK3.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +49 -39
  11. package/dist/lib/node/index.cjs.map +1 -1
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/packlets/testing/index.cjs +14 -9
  14. package/dist/lib/node/packlets/testing/index.cjs.map +3 -3
  15. package/dist/types/src/index.d.ts +1 -0
  16. package/dist/types/src/index.d.ts.map +1 -1
  17. package/dist/types/src/packlets/diagnostics/browser-diagnostics-broadcast.d.ts +5 -0
  18. package/dist/types/src/packlets/diagnostics/browser-diagnostics-broadcast.d.ts.map +1 -0
  19. package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts +5 -0
  20. package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts.map +1 -0
  21. package/dist/types/src/packlets/diagnostics/diagnostics-collector.d.ts +15 -0
  22. package/dist/types/src/packlets/diagnostics/diagnostics-collector.d.ts.map +1 -0
  23. package/dist/types/src/packlets/{services → diagnostics}/diagnostics.d.ts +1 -1
  24. package/dist/types/src/packlets/diagnostics/diagnostics.d.ts.map +1 -0
  25. package/dist/types/src/packlets/diagnostics/index.d.ts +4 -0
  26. package/dist/types/src/packlets/diagnostics/index.d.ts.map +1 -0
  27. package/dist/types/src/packlets/indexing/util.d.ts +2 -1
  28. package/dist/types/src/packlets/indexing/util.d.ts.map +1 -1
  29. package/dist/types/src/packlets/invitations/index.d.ts +1 -0
  30. package/dist/types/src/packlets/invitations/index.d.ts.map +1 -1
  31. package/dist/types/src/packlets/invitations/invitation-extension.d.ts +1 -0
  32. package/dist/types/src/packlets/invitations/invitation-extension.d.ts.map +1 -1
  33. package/dist/types/src/packlets/invitations/invitations-handler.d.ts +4 -2
  34. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  35. package/dist/types/src/packlets/invitations/invitations-manager.d.ts +42 -0
  36. package/dist/types/src/packlets/invitations/invitations-manager.d.ts.map +1 -0
  37. package/dist/types/src/packlets/invitations/invitations-service.d.ts +7 -23
  38. package/dist/types/src/packlets/invitations/invitations-service.d.ts.map +1 -1
  39. package/dist/types/src/packlets/services/index.d.ts +1 -1
  40. package/dist/types/src/packlets/services/index.d.ts.map +1 -1
  41. package/dist/types/src/packlets/services/service-context.d.ts +2 -0
  42. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  43. package/dist/types/src/packlets/services/service-host.d.ts +5 -1
  44. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  45. package/dist/types/src/packlets/services/util.d.ts +1 -0
  46. package/dist/types/src/packlets/services/util.d.ts.map +1 -1
  47. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  48. package/dist/types/src/packlets/system/system-service.d.ts +1 -1
  49. package/dist/types/src/packlets/system/system-service.d.ts.map +1 -1
  50. package/dist/types/src/packlets/testing/test-builder.d.ts +3 -1
  51. package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
  52. package/dist/types/src/version.d.ts +1 -1
  53. package/package.json +35 -34
  54. package/src/index.ts +1 -0
  55. package/src/packlets/diagnostics/browser-diagnostics-broadcast.ts +94 -0
  56. package/src/packlets/diagnostics/diagnostics-broadcast.ts +20 -0
  57. package/src/packlets/diagnostics/diagnostics-collector.ts +65 -0
  58. package/src/packlets/{services → diagnostics}/diagnostics.ts +2 -2
  59. package/src/packlets/diagnostics/index.ts +7 -0
  60. package/src/packlets/indexing/util.ts +15 -8
  61. package/src/packlets/invitations/index.ts +1 -0
  62. package/src/packlets/invitations/invitation-extension.ts +28 -1
  63. package/src/packlets/invitations/invitations-handler.ts +74 -34
  64. package/src/packlets/invitations/invitations-manager.ts +197 -0
  65. package/src/packlets/invitations/invitations-service.ts +21 -168
  66. package/src/packlets/services/automerge-host.test.ts +10 -4
  67. package/src/packlets/services/index.ts +1 -1
  68. package/src/packlets/services/service-context.test.ts +4 -1
  69. package/src/packlets/services/service-context.ts +16 -3
  70. package/src/packlets/services/service-host.ts +34 -19
  71. package/src/packlets/services/util.ts +2 -0
  72. package/src/packlets/spaces/data-space-manager.test.ts +4 -4
  73. package/src/packlets/spaces/data-space.ts +1 -1
  74. package/src/packlets/storage/level.ts +1 -1
  75. package/src/packlets/system/system-service.ts +1 -1
  76. package/src/packlets/testing/test-builder.ts +20 -4
  77. package/src/version.ts +1 -1
  78. package/dist/lib/browser/chunk-MYKBSRL5.mjs.map +0 -7
  79. package/dist/lib/node/chunk-UBE57IO7.cjs.map +0 -7
  80. package/dist/types/src/packlets/services/diagnostics.d.ts.map +0 -1
@@ -8,9 +8,15 @@ import { Event, synchronized } from '@dxos/async';
8
8
  import { clientServiceBundle, defaultKey, type ClientServices, Properties } from '@dxos/client-protocol';
9
9
  import { type Config } from '@dxos/config';
10
10
  import { Context } from '@dxos/context';
11
- import { DataServiceImpl, type ObjectStructure, encodeReference, type SpaceDoc } from '@dxos/echo-pipeline';
12
- import * as E from '@dxos/echo-schema';
13
- import { IndexServiceImpl } from '@dxos/indexing';
11
+ import {
12
+ DataServiceImpl,
13
+ type ObjectStructure,
14
+ encodeReference,
15
+ type SpaceDoc,
16
+ type LevelDB,
17
+ } from '@dxos/echo-pipeline';
18
+ import { getTypeReference } from '@dxos/echo-schema';
19
+ import { QueryServiceImpl } from '@dxos/indexing';
14
20
  import { invariant } from '@dxos/invariant';
15
21
  import { PublicKey } from '@dxos/keys';
16
22
  import { log } from '@dxos/log';
@@ -23,11 +29,15 @@ import { TRACE_PROCESSOR, trace as Trace } from '@dxos/tracing';
23
29
  import { assignDeep } from '@dxos/util';
24
30
  import { WebsocketRpcClient } from '@dxos/websocket-rpc';
25
31
 
26
- import { createDiagnostics } from './diagnostics';
27
32
  import { ServiceContext, type ServiceContextRuntimeParams } from './service-context';
28
33
  import { ServiceRegistry } from './service-registry';
29
34
  import { DevicesServiceImpl } from '../devices';
30
35
  import { DevtoolsHostEvents, DevtoolsServiceImpl } from '../devtools';
36
+ import {
37
+ type CollectDiagnosticsBroadcastHandler,
38
+ createCollectDiagnosticsBroadcastHandler,
39
+ createDiagnostics,
40
+ } from '../diagnostics';
31
41
  import { IdentityServiceImpl, type CreateIdentityOptions } from '../identity';
32
42
  import { InvitationsServiceImpl } from '../invitations';
33
43
  import { Lock, type ResourceLock } from '../locks';
@@ -46,6 +56,7 @@ export type ClientServicesHostParams = {
46
56
  signalManager?: SignalManager;
47
57
  connectionLog?: boolean;
48
58
  storage?: Storage;
59
+ level?: LevelDB;
49
60
  lockKey?: string;
50
61
  callbacks?: ClientServicesHostCallbacks;
51
62
  runtimeParams?: ServiceContextRuntimeParams;
@@ -72,6 +83,7 @@ export class ClientServicesHost {
72
83
  private readonly _systemService: SystemServiceImpl;
73
84
  private readonly _loggingService: LoggingServiceImpl;
74
85
  private readonly _tracingService = TRACE_PROCESSOR.createTraceSender();
86
+ private _queryService!: QueryServiceImpl;
75
87
 
76
88
  private _config?: Config;
77
89
  private readonly _statusUpdate = new Event<void>();
@@ -84,6 +96,7 @@ export class ClientServicesHost {
84
96
 
85
97
  private _serviceContext!: ServiceContext;
86
98
  private readonly _runtimeParams?: ServiceContextRuntimeParams;
99
+ private diagnosticsBroadcastHandler: CollectDiagnosticsBroadcastHandler;
87
100
 
88
101
  @Trace.info()
89
102
  private _opening = false;
@@ -96,12 +109,14 @@ export class ClientServicesHost {
96
109
  transportFactory,
97
110
  signalManager,
98
111
  storage,
112
+ level,
99
113
  // TODO(wittjosiah): Turn this on by default.
100
114
  lockKey,
101
115
  callbacks,
102
116
  runtimeParams,
103
117
  }: ClientServicesHostParams = {}) {
104
118
  this._storage = storage;
119
+ this._level = level;
105
120
  this._callbacks = callbacks;
106
121
  this._runtimeParams = runtimeParams;
107
122
 
@@ -141,6 +156,7 @@ export class ClientServicesHost {
141
156
  },
142
157
  });
143
158
 
159
+ this.diagnosticsBroadcastHandler = createCollectDiagnosticsBroadcastHandler(this._systemService);
144
160
  this._loggingService = new LoggingServiceImpl();
145
161
 
146
162
  this._serviceRegistry = new ServiceRegistry<ClientServices>(clientServiceBundle, {
@@ -233,6 +249,8 @@ export class ClientServicesHost {
233
249
  if (!this._level) {
234
250
  this._level = await createLevel(this._config.get('runtime.client.storage', {})!);
235
251
  }
252
+ await this._level.open();
253
+
236
254
  await this._resourceLock?.acquire();
237
255
 
238
256
  await this._loggingService.open();
@@ -245,6 +263,12 @@ export class ClientServicesHost {
245
263
  this._runtimeParams,
246
264
  );
247
265
 
266
+ this._queryService = new QueryServiceImpl({
267
+ indexer: this._serviceContext.indexer,
268
+ automergeHost: this._serviceContext.automergeHost,
269
+ });
270
+ await this._queryService.open(ctx);
271
+
248
272
  this._serviceRegistry.setServices({
249
273
  SystemService: this._systemService,
250
274
 
@@ -255,11 +279,7 @@ export class ClientServicesHost {
255
279
  (profile) => this._serviceContext.broadcastProfileUpdate(profile),
256
280
  ),
257
281
 
258
- InvitationsService: new InvitationsServiceImpl(
259
- this._serviceContext.invitations,
260
- (invitation) => this._serviceContext.getInvitationHandler(invitation),
261
- this._serviceContext.metadataStore,
262
- ),
282
+ InvitationsService: new InvitationsServiceImpl(this._serviceContext.invitationsManager),
263
283
 
264
284
  DevicesService: new DevicesServiceImpl(this._serviceContext.identityManager),
265
285
 
@@ -274,10 +294,7 @@ export class ClientServicesHost {
274
294
 
275
295
  DataService: new DataServiceImpl(this._serviceContext.automergeHost),
276
296
 
277
- IndexService: new IndexServiceImpl({
278
- indexer: this._serviceContext.indexer,
279
- automergeHost: this._serviceContext.automergeHost,
280
- }),
297
+ QueryService: this._queryService,
281
298
 
282
299
  NetworkService: new NetworkServiceImpl(this._serviceContext.networkManager, this._serviceContext.signalManager),
283
300
 
@@ -293,11 +310,6 @@ export class ClientServicesHost {
293
310
  });
294
311
 
295
312
  await this._serviceContext.open(ctx);
296
- // TODO(nf): move to InvitationManager in ServiceContext?
297
- invariant(this.serviceRegistry.services.InvitationsService);
298
- const loadedInvitations = await this.serviceRegistry.services.InvitationsService.loadPersistentInvitations();
299
-
300
- log('loaded persistent invitations', { count: loadedInvitations.invitations?.length });
301
313
 
302
314
  const devtoolsProxy = this._config?.get('runtime.client.devtoolsProxy');
303
315
  if (devtoolsProxy) {
@@ -309,6 +321,7 @@ export class ClientServicesHost {
309
321
  });
310
322
  void this._devtoolsProxy.open();
311
323
  }
324
+ this.diagnosticsBroadcastHandler.start();
312
325
 
313
326
  this._opening = false;
314
327
  this._open = true;
@@ -327,9 +340,11 @@ export class ClientServicesHost {
327
340
 
328
341
  const deviceKey = this._serviceContext.identityManager.identity?.deviceKey;
329
342
  log('closing...', { deviceKey });
343
+ this.diagnosticsBroadcastHandler.stop();
330
344
  await this._devtoolsProxy?.close();
331
345
  this._serviceRegistry.setServices({ SystemService: this._systemService });
332
346
  await this._loggingService.close();
347
+ await this._queryService.close();
333
348
  await this._serviceContext.close();
334
349
  await this._level?.close();
335
350
  this._open = false;
@@ -364,7 +379,7 @@ export class ClientServicesHost {
364
379
  // TODO(dmaretskyi): Better API for low-level data access.
365
380
  const properties: ObjectStructure = {
366
381
  system: {
367
- type: encodeReference(E.getTypeReference(Properties)!),
382
+ type: encodeReference(getTypeReference(Properties)!),
368
383
  },
369
384
  data: {
370
385
  [defaultKey]: identity.identityKey.toHex(),
@@ -5,6 +5,8 @@
5
5
  import { PublicKey } from '@dxos/keys';
6
6
  import { humanize } from '@dxos/util';
7
7
 
8
+ export const ClientServicesProviderResource = Symbol.for('dxos.resource.ClientServices');
9
+
8
10
  // TODO(burdon): Move to util.
9
11
 
10
12
  export type JsonStringifyOptions = {
@@ -20,7 +20,7 @@ describe('DataSpaceManager', () => {
20
20
 
21
21
  const peer = builder.createPeer();
22
22
  await peer.createIdentity();
23
- await openAndClose(peer.dataSpaceManager);
23
+ await openAndClose(peer.automergeHost, peer.dataSpaceManager);
24
24
 
25
25
  const space = await peer.dataSpaceManager.createSpace();
26
26
 
@@ -42,7 +42,7 @@ describe('DataSpaceManager', () => {
42
42
  const peer2 = builder.createPeer();
43
43
  await peer2.createIdentity();
44
44
 
45
- await openAndClose(peer1.dataSpaceManager, peer2.dataSpaceManager);
45
+ await openAndClose(peer1.automergeHost, peer1.dataSpaceManager, peer2.automergeHost, peer2.dataSpaceManager);
46
46
 
47
47
  const space1 = await peer1.dataSpaceManager.createSpace();
48
48
  await space1.inner.controlPipeline.state.waitUntilTimeframe(space1.inner.controlPipeline.state.endTimeframe);
@@ -111,7 +111,7 @@ describe('DataSpaceManager', () => {
111
111
  await peer2.createIdentity();
112
112
  await peer2.dataSpaceManager.open();
113
113
 
114
- await openAndClose(peer1.dataSpaceManager, peer2.dataSpaceManager);
114
+ await openAndClose(peer1.automergeHost, peer1.dataSpaceManager, peer2.automergeHost, peer2.dataSpaceManager);
115
115
 
116
116
  const space1 = await peer1.dataSpaceManager.createSpace();
117
117
  await space1.inner.controlPipeline.state.waitUntilTimeframe(space1.inner.controlPipeline.state.endTimeframe);
@@ -153,7 +153,7 @@ describe('DataSpaceManager', () => {
153
153
 
154
154
  const peer = builder.createPeer();
155
155
  await peer.createIdentity();
156
- await openAndClose(peer.dataSpaceManager);
156
+ await openAndClose(peer.automergeHost, peer.dataSpaceManager);
157
157
 
158
158
  const space = await peer.dataSpaceManager.createSpace();
159
159
  await space.inner.controlPipeline.state.waitUntilTimeframe(space.inner.controlPipeline.state.endTimeframe);
@@ -6,7 +6,6 @@ import { Event, asyncTimeout, scheduleTask, sleep, synchronized, trackLeaks } fr
6
6
  import { AUTH_TIMEOUT } from '@dxos/client-protocol';
7
7
  import { cancelWithContext, Context, ContextDisposedError } from '@dxos/context';
8
8
  import { timed, warnAfterTimeout } from '@dxos/debug';
9
- import { TYPE_PROPERTIES } from '@dxos/echo-db';
10
9
  import {
11
10
  type MetadataStore,
12
11
  type Space,
@@ -15,6 +14,7 @@ import {
15
14
  type SpaceDoc,
16
15
  } from '@dxos/echo-pipeline';
17
16
  import { AutomergeDocumentLoaderImpl } from '@dxos/echo-pipeline';
17
+ import { TYPE_PROPERTIES } from '@dxos/echo-schema';
18
18
  import { type FeedStore } from '@dxos/feed-store';
19
19
  import { failedInvariant, invariant } from '@dxos/invariant';
20
20
  import { type Keyring } from '@dxos/keyring';
@@ -12,7 +12,7 @@ import { getRootPath, isPersistent } from './util';
12
12
 
13
13
  export const createLevel = async (config: Runtime.Client.Storage) => {
14
14
  const persistent = isPersistent(config);
15
- const storagePath = persistent ? getRootPath(config) : path.join('tmp', 'level', PublicKey.random().toHex());
15
+ const storagePath = persistent ? path.join(getRootPath(config), 'level') : `/tmp/dxos-${PublicKey.random().toHex()}`;
16
16
  const level = new Level<string, string>(storagePath);
17
17
  await level.open();
18
18
  return level;
@@ -16,7 +16,7 @@ import {
16
16
  } from '@dxos/protocols/proto/dxos/client/services';
17
17
  import { jsonKeyReplacer, type MaybePromise } from '@dxos/util';
18
18
 
19
- import { type Diagnostics } from '../services';
19
+ import { type Diagnostics } from '../diagnostics';
20
20
  import { getPlatform } from '../services/platform';
21
21
 
22
22
  export type SystemServiceOptions = {
@@ -6,9 +6,16 @@ import { type Config } from '@dxos/config';
6
6
  import { Context } from '@dxos/context';
7
7
  import { createCredentialSignerWithChain, CredentialGenerator } from '@dxos/credentials';
8
8
  import { failUndefined } from '@dxos/debug';
9
- import { AutomergeHost, MetadataStore, SnapshotStore, SpaceManager, valueEncoding } from '@dxos/echo-pipeline';
9
+ import {
10
+ AutomergeHost,
11
+ MetadataStore,
12
+ type LevelDB,
13
+ SnapshotStore,
14
+ SpaceManager,
15
+ valueEncoding,
16
+ } from '@dxos/echo-pipeline';
17
+ import { createTestLevel } from '@dxos/echo-pipeline/testing';
10
18
  import { FeedFactory, FeedStore } from '@dxos/feed-store';
11
- import { createTestLevel } from '@dxos/indexing/testing';
12
19
  import { Keyring } from '@dxos/keyring';
13
20
  import { MemorySignalManager, MemorySignalManagerContext } from '@dxos/messaging';
14
21
  import { MemoryTransportFactory, NetworkManager } from '@dxos/network-manager';
@@ -42,7 +49,8 @@ export const createServiceContext = async ({
42
49
  signalManager,
43
50
  transportFactory: MemoryTransportFactory,
44
51
  });
45
- const level = await createTestLevel();
52
+ const level = createTestLevel();
53
+ await level.open();
46
54
 
47
55
  return new ServiceContext(storage, level, networkManager, signalManager);
48
56
  };
@@ -85,6 +93,7 @@ export type TestPeerOpts = {
85
93
 
86
94
  export type TestPeerProps = {
87
95
  storage?: Storage;
96
+ level?: LevelDB;
88
97
  feedStore?: FeedStore<any>;
89
98
  metadataStore?: MetadataStore;
90
99
  keyring?: Keyring;
@@ -117,6 +126,10 @@ export class TestPeer {
117
126
  return (this._props.keyring ??= new Keyring(this.storage.createDirectory('keyring')));
118
127
  }
119
128
 
129
+ get level() {
130
+ return (this._props.level ??= createTestLevel());
131
+ }
132
+
120
133
  get feedStore() {
121
134
  return (this._props.feedStore ??= new FeedStore({
122
135
  factory: new FeedFactory({
@@ -163,7 +176,9 @@ export class TestPeer {
163
176
  }
164
177
 
165
178
  get automergeHost() {
166
- return (this._props.automergeHost ??= new AutomergeHost({ directory: this.storage.createDirectory('automerge') }));
179
+ return (this._props.automergeHost ??= new AutomergeHost({
180
+ db: this.level.sublevel('automerge'),
181
+ }));
167
182
  }
168
183
 
169
184
  get dataSpaceManager() {
@@ -182,6 +197,7 @@ export class TestPeer {
182
197
  }
183
198
 
184
199
  async destroy() {
200
+ await this.level.close();
185
201
  await this.storage.reset();
186
202
  }
187
203
  }
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const DXOS_VERSION = "0.4.10-main.d658471";
1
+ export const DXOS_VERSION = "0.4.10-main.d6ef25d";