@dxos/client-services 0.1.56-main.d9d1c3e → 0.1.56-main.da2eab1

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 (40) hide show
  1. package/dist/lib/browser/{chunk-P6TNW4K5.mjs → chunk-CXJ3H4F5.mjs} +278 -287
  2. package/dist/lib/browser/chunk-CXJ3H4F5.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +8 -13
  4. package/dist/lib/browser/index.mjs.map +2 -2
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/packlets/testing/index.mjs +30 -45
  7. package/dist/lib/browser/packlets/testing/index.mjs.map +2 -2
  8. package/dist/lib/node/index.cjs +298 -312
  9. package/dist/lib/node/index.cjs.map +3 -3
  10. package/dist/lib/node/meta.json +1 -1
  11. package/dist/lib/node/packlets/testing/index.cjs +310 -330
  12. package/dist/lib/node/packlets/testing/index.cjs.map +3 -3
  13. package/dist/types/src/packlets/identity/identity-manager.d.ts +5 -0
  14. package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
  15. package/dist/types/src/packlets/identity/identity-service.d.ts +7 -3
  16. package/dist/types/src/packlets/identity/identity-service.d.ts.map +1 -1
  17. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  18. package/dist/types/src/packlets/services/diagnostics.d.ts.map +1 -1
  19. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  20. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  21. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  22. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  23. package/dist/types/src/version.d.ts +1 -1
  24. package/package.json +34 -34
  25. package/src/packlets/identity/identity-manager.test.ts +11 -0
  26. package/src/packlets/identity/identity-manager.ts +18 -1
  27. package/src/packlets/identity/identity-service.test.ts +15 -1
  28. package/src/packlets/identity/identity-service.ts +23 -14
  29. package/src/packlets/invitations/invitations-handler.ts +2 -0
  30. package/src/packlets/services/diagnostics.ts +2 -1
  31. package/src/packlets/services/service-context.test.ts +59 -0
  32. package/src/packlets/services/service-context.ts +7 -4
  33. package/src/packlets/services/service-host.test.ts +1 -1
  34. package/src/packlets/services/service-host.ts +11 -7
  35. package/src/packlets/spaces/data-space-manager.test.ts +80 -22
  36. package/src/packlets/spaces/data-space-manager.ts +5 -1
  37. package/src/packlets/spaces/data-space.ts +16 -4
  38. package/src/packlets/vault/worker-runtime.ts +1 -1
  39. package/src/version.ts +1 -1
  40. package/dist/lib/browser/chunk-P6TNW4K5.mjs.map +0 -7
@@ -13,9 +13,11 @@ import { writeMessages } from '@dxos/feed-store';
13
13
  import { PublicKey } from '@dxos/keys';
14
14
  import { log } from '@dxos/log';
15
15
  import { SpaceState } from '@dxos/protocols/proto/dxos/client/services';
16
+ import { SpaceSnapshot } from '@dxos/protocols/proto/dxos/echo/snapshot';
16
17
  import { Epoch } from '@dxos/protocols/proto/dxos/halo/credentials';
17
18
  import { StorageType } from '@dxos/random-access-storage';
18
19
  import { afterTest, describe, openAndClose, test } from '@dxos/test';
20
+ import { Timeframe } from '@dxos/timeframe';
19
21
  import { range } from '@dxos/util';
20
22
 
21
23
  import { TestBuilder, syncItemsLocal } from '../testing';
@@ -156,33 +158,34 @@ describe('DataSpaceManager', () => {
156
158
  });
157
159
 
158
160
  describe('Epochs', () => {
159
- test('Epoch truncates feeds', async () => {
160
- const builder = new TestBuilder();
161
- afterTest(async () => builder.destroy());
161
+ test
162
+ .skip('Epoch truncates feeds', async () => {
163
+ const builder = new TestBuilder();
164
+ afterTest(async () => builder.destroy());
162
165
 
163
- const peer = builder.createPeer({
164
- storageType: typeof window === 'undefined' ? StorageType.NODE : StorageType.WEBFS,
165
- });
166
- await peer.createIdentity();
167
- await openAndClose(peer.dataSpaceManager);
168
- const space = await peer.dataSpaceManager.createSpace();
169
- await space.inner.controlPipeline.state.waitUntilTimeframe(space.inner.controlPipeline.state.endTimeframe);
166
+ const peer = builder.createPeer({
167
+ storageType: typeof window === 'undefined' ? StorageType.NODE : StorageType.WEBFS,
168
+ });
169
+ await peer.createIdentity();
170
+ await openAndClose(peer.dataSpaceManager);
171
+ const space = await peer.dataSpaceManager.createSpace();
172
+ await space.inner.controlPipeline.state.waitUntilTimeframe(space.inner.controlPipeline.state.endTimeframe);
170
173
 
171
- const feedDataPath = path.join(space.inner.dataPipeline.pipelineState!.feeds[0].key.toHex(), 'data');
172
- const directory = peer.storage.createDirectory('feeds');
173
- const file = directory.getOrCreateFile(feedDataPath);
174
- afterTest(() => file.close());
174
+ const feedDataPath = path.join(space.inner.dataPipeline.pipelineState!.feeds[0].key.toHex(), 'data');
175
+ const directory = peer.storage.createDirectory('feeds');
176
+ const file = directory.getOrCreateFile(feedDataPath);
177
+ afterTest(() => file.close());
175
178
 
176
- expect((await file.stat()).size === 0).to.be.true;
179
+ expect((await file.stat()).size === 0).to.be.true;
177
180
 
178
- for (const _ in range(10)) {
179
- await testLocalDatabase(space.dataPipeline);
180
- }
181
+ for (const _ in range(10)) {
182
+ await testLocalDatabase(space.dataPipeline);
183
+ }
181
184
 
182
- expect((await file.stat()).size !== 0).to.be.true;
183
- await space.createEpoch();
184
- expect((await file.stat()).size === 0).to.be.true;
185
- })
185
+ expect((await file.stat()).size !== 0).to.be.true;
186
+ await space.createEpoch();
187
+ expect((await file.stat()).size === 0).to.be.true;
188
+ })
186
189
  .onlyEnvironments('nodejs', 'chromium', 'firefox')
187
190
  .tag('flaky');
188
191
 
@@ -228,6 +231,61 @@ describe('DataSpaceManager', () => {
228
231
  expect(epochs).to.deep.equal([epochsNumber]);
229
232
  }
230
233
  });
234
+
235
+ test('Items are cleared before epoch applied', async () => {
236
+ const builder = new TestBuilder();
237
+ afterTest(async () => builder.destroy());
238
+ const peer = builder.createPeer();
239
+ await peer.createIdentity();
240
+ await openAndClose(peer.dataSpaceManager);
241
+
242
+ // Create space and fill it with Items.
243
+ const space = await peer.dataSpaceManager.createSpace();
244
+ await space.inner.controlPipeline.state.waitUntilTimeframe(space.inner.controlPipeline.state.endTimeframe);
245
+ const itemsNumber = 2;
246
+ for (const _ of range(itemsNumber)) {
247
+ await testLocalDatabase(space.dataPipeline);
248
+ }
249
+
250
+ // Create empty Epoch and check if it clears items.
251
+ {
252
+ const processedFirstEpoch = space.dataPipeline.onNewEpoch.waitFor(
253
+ (epoch) => epoch.subject.assertion.number === 1,
254
+ );
255
+
256
+ // Empty snapshot.
257
+ const snapshot: SpaceSnapshot = {
258
+ spaceKey: space.key.asUint8Array(),
259
+ timeframe: space.inner.dataPipeline.pipelineState!.timeframe,
260
+ database: {},
261
+ };
262
+
263
+ const snapshotCid = await peer.snapshotStore.saveSnapshot(snapshot);
264
+
265
+ const epoch: Epoch = {
266
+ previousId: space.dataPipeline.currentEpoch?.id,
267
+ timeframe: space.inner.dataPipeline.pipelineState!.timeframe,
268
+ number: (space.dataPipeline.currentEpoch?.subject.assertion as Epoch).number + 1,
269
+ snapshotCid,
270
+ };
271
+
272
+ const receipt = await space.inner.controlPipeline.writer.write({
273
+ credential: {
274
+ credential: await peer.props.signingContext!.credentialSigner.createCredential({
275
+ subject: space.key,
276
+ assertion: {
277
+ '@type': 'dxos.halo.credentials.Epoch',
278
+ ...epoch,
279
+ },
280
+ }),
281
+ },
282
+ });
283
+ await space.inner.controlPipeline.state.waitUntilTimeframe(new Timeframe([[receipt.feedKey, receipt.seq]]));
284
+ await processedFirstEpoch;
285
+ }
286
+
287
+ expect(Array.from(space.dataPipeline.itemManager.entities.keys()).length).to.equal(0);
288
+ });
231
289
  });
232
290
 
233
291
  describe('activation', () => {
@@ -193,7 +193,11 @@ export class DataSpaceManager {
193
193
  const controlFeed =
194
194
  metadata.controlFeedKey && (await this._feedStore.openFeed(metadata.controlFeedKey, { writable: true }));
195
195
  const dataFeed =
196
- metadata.dataFeedKey && (await this._feedStore.openFeed(metadata.dataFeedKey, { writable: true, sparse: true }));
196
+ metadata.dataFeedKey &&
197
+ (await this._feedStore.openFeed(metadata.dataFeedKey, {
198
+ writable: true,
199
+ sparse: true,
200
+ }));
197
201
 
198
202
  const space: Space = await this._spaceManager.constructSpace({
199
203
  metadata,
@@ -55,6 +55,12 @@ export type DataSpaceParams = {
55
55
  cache?: SpaceCache;
56
56
  };
57
57
 
58
+ /**
59
+ * Delete feed blocks after an epoch is created.
60
+ */
61
+ // TODO(dmaretskyi): Disabled till better times https://github.com/dxos/dxos/issues/3949.
62
+ const ENABLE_FEED_PURGE = false;
63
+
58
64
  @trackLeaks('open', 'close')
59
65
  export class DataSpace {
60
66
  private _ctx = new Context();
@@ -323,10 +329,16 @@ export class DataSpace {
323
329
  });
324
330
 
325
331
  await this.inner.controlPipeline.state.waitUntilTimeframe(new Timeframe([[receipt.feedKey, receipt.seq]]));
326
- for (const feed of this.inner.dataPipeline.pipelineState?.feeds ?? []) {
327
- const indexBeforeEpoch = epoch.timeframe.get(feed.key);
328
- if (indexBeforeEpoch) {
329
- await feed.clear(0, indexBeforeEpoch + 1);
332
+
333
+ // Clear feed blocks before epoch.
334
+ if (ENABLE_FEED_PURGE) {
335
+ for (const feed of this.inner.dataPipeline.pipelineState?.feeds ?? []) {
336
+ const indexBeforeEpoch = epoch.timeframe.get(feed.key);
337
+ if (indexBeforeEpoch === undefined) {
338
+ continue;
339
+ }
340
+
341
+ await feed.safeClear(0, indexBeforeEpoch + 1);
330
342
  }
331
343
  }
332
344
  }
@@ -63,7 +63,7 @@ export class WorkerRuntime {
63
63
  log('started');
64
64
  } catch (err: any) {
65
65
  this._ready.wake(err);
66
- log.catch(err);
66
+ log.catch('starting', err);
67
67
  }
68
68
  }
69
69
 
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const DXOS_VERSION = "0.1.56-main.d9d1c3e";
1
+ export const DXOS_VERSION = "0.1.56-main.da2eab1";