@dxos/echo-pipeline 0.4.10-main.0302e13 → 0.4.10-main.05dbd64

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 (74) hide show
  1. package/dist/lib/browser/{chunk-RTEEJ723.mjs → chunk-KMWJLYEQ.mjs} +77 -57
  2. package/dist/lib/browser/chunk-KMWJLYEQ.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +368 -246
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +10 -2
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node/{chunk-7VZVCCNF.cjs → chunk-YZA42CKA.cjs} +82 -62
  9. package/dist/lib/node/chunk-YZA42CKA.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +391 -270
  11. package/dist/lib/node/index.cjs.map +4 -4
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/testing/index.cjs +20 -13
  14. package/dist/lib/node/testing/index.cjs.map +4 -4
  15. package/dist/types/src/automerge/automerge-doc-loader.d.ts +2 -0
  16. package/dist/types/src/automerge/automerge-doc-loader.d.ts.map +1 -1
  17. package/dist/types/src/automerge/automerge-host.d.ts +21 -18
  18. package/dist/types/src/automerge/automerge-host.d.ts.map +1 -1
  19. package/dist/types/src/automerge/automerge-repo.test.d.ts +2 -0
  20. package/dist/types/src/automerge/automerge-repo.test.d.ts.map +1 -0
  21. package/dist/types/src/automerge/index.d.ts +2 -0
  22. package/dist/types/src/automerge/index.d.ts.map +1 -1
  23. package/dist/types/src/automerge/level.test.d.ts +2 -0
  24. package/dist/types/src/automerge/level.test.d.ts.map +1 -0
  25. package/dist/types/src/automerge/leveldb-storage-adapter.d.ts +30 -0
  26. package/dist/types/src/automerge/leveldb-storage-adapter.d.ts.map +1 -0
  27. package/dist/types/src/automerge/local-host-network-adapter.d.ts +8 -1
  28. package/dist/types/src/automerge/local-host-network-adapter.d.ts.map +1 -1
  29. package/dist/types/src/automerge/migrations.d.ts +7 -0
  30. package/dist/types/src/automerge/migrations.d.ts.map +1 -0
  31. package/dist/types/src/automerge/reference.d.ts +15 -0
  32. package/dist/types/src/automerge/reference.d.ts.map +1 -0
  33. package/dist/types/src/automerge/storage-adapter.test.d.ts +2 -0
  34. package/dist/types/src/automerge/storage-adapter.test.d.ts.map +1 -0
  35. package/dist/types/src/automerge/types.d.ts +8 -2
  36. package/dist/types/src/automerge/types.d.ts.map +1 -1
  37. package/dist/types/src/metadata/metadata-store.d.ts +2 -1
  38. package/dist/types/src/metadata/metadata-store.d.ts.map +1 -1
  39. package/dist/types/src/space/control-pipeline.d.ts +3 -1
  40. package/dist/types/src/space/control-pipeline.d.ts.map +1 -1
  41. package/dist/types/src/space/space-manager.d.ts +3 -1
  42. package/dist/types/src/space/space-manager.d.ts.map +1 -1
  43. package/dist/types/src/space/space.d.ts +6 -9
  44. package/dist/types/src/space/space.d.ts.map +1 -1
  45. package/dist/types/src/testing/index.d.ts +1 -0
  46. package/dist/types/src/testing/index.d.ts.map +1 -1
  47. package/dist/types/src/testing/level.d.ts +3 -0
  48. package/dist/types/src/testing/level.d.ts.map +1 -0
  49. package/dist/types/src/testing/test-agent-builder.d.ts +2 -2
  50. package/dist/types/src/testing/test-agent-builder.d.ts.map +1 -1
  51. package/package.json +33 -30
  52. package/src/automerge/automerge-doc-loader.ts +9 -0
  53. package/src/automerge/automerge-host.test.ts +22 -8
  54. package/src/automerge/automerge-host.ts +66 -118
  55. package/src/automerge/automerge-repo.test.ts +29 -0
  56. package/src/automerge/index.ts +2 -0
  57. package/src/automerge/level.test.ts +82 -0
  58. package/src/automerge/leveldb-storage-adapter.ts +117 -0
  59. package/src/automerge/local-host-network-adapter.ts +19 -13
  60. package/src/automerge/migrations.ts +41 -0
  61. package/src/automerge/reference.ts +31 -0
  62. package/src/automerge/storage-adapter.test.ts +90 -0
  63. package/src/automerge/types.ts +8 -5
  64. package/src/db-host/data-service.ts +1 -1
  65. package/src/metadata/metadata-store.ts +17 -8
  66. package/src/space/control-pipeline.ts +11 -1
  67. package/src/space/space-manager.ts +4 -0
  68. package/src/space/space.test.ts +7 -7
  69. package/src/space/space.ts +17 -22
  70. package/src/testing/index.ts +1 -0
  71. package/src/testing/level.ts +11 -0
  72. package/src/testing/test-agent-builder.ts +1 -0
  73. package/dist/lib/browser/chunk-RTEEJ723.mjs.map +0 -7
  74. package/dist/lib/node/chunk-7VZVCCNF.cjs.map +0 -7
@@ -1,6 +1,6 @@
1
1
  import { Event } from '@dxos/async';
2
- import { type Context } from '@dxos/context';
3
- import { type FeedInfo } from '@dxos/credentials';
2
+ import { Resource, type Context } from '@dxos/context';
3
+ import { type FeedInfo, type DelegateInvitationCredential } from '@dxos/credentials';
4
4
  import { type FeedOptions, type FeedWrapper } from '@dxos/feed-store';
5
5
  import { type PublicKey } from '@dxos/keys';
6
6
  import type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
@@ -21,6 +21,7 @@ export type SpaceParams = {
21
21
  snapshotManager: SnapshotManager;
22
22
  memberKey: PublicKey;
23
23
  snapshotId?: string | undefined;
24
+ onDelegatedInvitationStatusChange: (invitation: DelegateInvitationCredential, isActive: boolean) => Promise<void>;
24
25
  };
25
26
  export type CreatePipelineParams = {
26
27
  start: Timeframe;
@@ -28,7 +29,7 @@ export type CreatePipelineParams = {
28
29
  /**
29
30
  * Spaces are globally addressable databases with access control.
30
31
  */
31
- export declare class Space {
32
+ export declare class Space extends Resource {
32
33
  private readonly _addFeedMutex;
33
34
  readonly onCredentialProcessed: Callback<AsyncCallback<Credential>>;
34
35
  readonly stateUpdate: Event<void>;
@@ -38,7 +39,6 @@ export declare class Space {
38
39
  private readonly _feedProvider;
39
40
  private readonly _controlPipeline;
40
41
  private readonly _snapshotManager;
41
- private _isOpen;
42
42
  private _controlFeed?;
43
43
  private _dataFeed?;
44
44
  constructor(params: SpaceParams);
@@ -59,11 +59,8 @@ export declare class Space {
59
59
  * Use for diagnostics.
60
60
  */
61
61
  getControlFeeds(): FeedInfo[];
62
- /**
63
- * Use for diagnostics.
64
- */
65
- open(ctx: Context): Promise<void>;
66
- close(): Promise<void>;
62
+ protected _open(ctx: Context): Promise<void>;
63
+ protected _close(): Promise<void>;
67
64
  }
68
65
  export {};
69
66
  //# sourceMappingURL=space.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../../../../src/space/space.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAmC,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEtE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,6CAA6C,CAAC;AAC5F,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAG1D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGpD,KAAK,YAAY,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;AAElG,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IACtC,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,eAAe,CAAC;IACjC,SAAS,EAAE,SAAS,CAAC;IAGrB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,SAAS,CAAC;CAElB,CAAC;AAEF;;GAEG;AAEH,qBAEa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAE7C,SAAgB,qBAAqB,sCAA6C;IAClF,SAAgB,WAAW,cAAe;IAC1C,SACgB,QAAQ,EAAE,aAAa,CAAC;IAExC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAY;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAE7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IAEnD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IAEnD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAA2B;IAChD,OAAO,CAAC,SAAS,CAAC,CAA2B;gBAEjC,MAAM,EAAE,WAAW;IAqC/B,IAEI,GAAG,cAEN;IAED,IAAI,MAAM,YAET;IAED,IAAI,cAAc,IAAI,SAAS,CAE9B;IAED,IAAI,cAAc,0BAEjB;IAED,IAAI,WAAW,0BAEd;IAED,IAAI,UAAU,2CAEb;IAED;;OAEG;IACH,IAAI,eAAe,IAAI,gBAAgB,CAEtC;IAED,IAAI,eAAe,IAAI,eAAe,CAErC;IAEK,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC;IAO7C,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC;IAMhD;;OAEG;IACH,eAAe,IAAI,QAAQ,EAAE;IAI7B;;OAEG;IAMG,IAAI,CAAC,GAAG,EAAE,OAAO;IAejB,KAAK;CAaZ"}
1
+ {"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../../../../src/space/space.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  export * from './change-metadata';
2
2
  export * from './test-agent-builder';
3
3
  export * from './test-feed-builder';
4
+ export * from './level';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/index.ts"],"names":[],"mappings":"AAIA,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/index.ts"],"names":[],"mappings":"AAIA,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,SAAS,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type LevelDB } from '../automerge/types';
2
+ export declare const createTestLevel: () => LevelDB;
3
+ //# sourceMappingURL=level.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level.d.ts","sourceRoot":"","sources":["../../../../src/testing/level.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,eAAO,MAAM,eAAe,QAAO,OAA+E,CAAC"}
@@ -26,7 +26,7 @@ export declare class TestAgentBuilder {
26
26
  private readonly _storage;
27
27
  private readonly _networkManagerProvider;
28
28
  constructor({ storage, networkManagerProvider }?: TestAgentBuilderOptions);
29
- close(): Promise<void[][]>;
29
+ close(): Promise<Space[][]>;
30
30
  get agents(): TestAgent[];
31
31
  getAgent(deviceKey: PublicKey): TestAgent | undefined;
32
32
  createPeer(): Promise<TestAgent>;
@@ -50,7 +50,7 @@ export declare class TestAgent {
50
50
  private _blobStore?;
51
51
  get blobStore(): BlobStore;
52
52
  constructor(_networkManagerProvider: NetworkManagerProvider, _feedBuilder: TestFeedBuilder, identityKey: PublicKey, deviceKey: PublicKey);
53
- close(): Promise<void[]>;
53
+ close(): Promise<Space[]>;
54
54
  get spaces(): Space[];
55
55
  getSpace(spaceKey: PublicKey): Space | undefined;
56
56
  private _spaceManager?;
@@ -1 +1 @@
1
- {"version":3,"file":"test-agent-builder.d.ts","sourceRoot":"","sources":["../../../../src/testing/test-agent-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-agent-builder.d.ts","sourceRoot":"","sources":["../../../../src/testing/test-agent-builder.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/echo-pipeline",
3
- "version": "0.4.10-main.0302e13",
3
+ "version": "0.4.10-main.05dbd64",
4
4
  "description": "ECHO database.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -35,36 +35,39 @@
35
35
  "src"
36
36
  ],
37
37
  "dependencies": {
38
+ "abstract-level": "^1.0.2",
38
39
  "crc-32": "^1.2.2",
39
- "@dxos/automerge": "0.4.10-main.0302e13",
40
- "@dxos/async": "0.4.10-main.0302e13",
41
- "@dxos/codec-protobuf": "0.4.10-main.0302e13",
42
- "@dxos/credentials": "0.4.10-main.0302e13",
43
- "@dxos/crypto": "0.4.10-main.0302e13",
44
- "@dxos/debug": "0.4.10-main.0302e13",
45
- "@dxos/context": "0.4.10-main.0302e13",
46
- "@dxos/echo-db": "0.4.10-main.0302e13",
47
- "@dxos/feed-store": "0.4.10-main.0302e13",
48
- "@dxos/hypercore": "0.4.10-main.0302e13",
49
- "@dxos/invariant": "0.4.10-main.0302e13",
50
- "@dxos/keyring": "0.4.10-main.0302e13",
51
- "@dxos/keys": "0.4.10-main.0302e13",
52
- "@dxos/log": "0.4.10-main.0302e13",
53
- "@dxos/messaging": "0.4.10-main.0302e13",
54
- "@dxos/network-manager": "0.4.10-main.0302e13",
55
- "@dxos/node-std": "0.4.10-main.0302e13",
56
- "@dxos/random-access-storage": "0.4.10-main.0302e13",
57
- "@dxos/protocols": "0.4.10-main.0302e13",
58
- "@dxos/rpc": "0.4.10-main.0302e13",
59
- "@dxos/teleport": "0.4.10-main.0302e13",
60
- "@dxos/teleport-extension-automerge-replicator": "0.4.10-main.0302e13",
61
- "@dxos/teleport-extension-object-sync": "0.4.10-main.0302e13",
62
- "@dxos/teleport-extension-replicator": "0.4.10-main.0302e13",
63
- "@dxos/tracing": "0.4.10-main.0302e13",
64
- "@dxos/teleport-extension-gossip": "0.4.10-main.0302e13",
65
- "@dxos/timeframe": "0.4.10-main.0302e13",
66
- "@dxos/typings": "0.4.10-main.0302e13",
67
- "@dxos/util": "0.4.10-main.0302e13"
40
+ "level": "^8.0.1",
41
+ "level-transcoder": "^1.0.1",
42
+ "@dxos/async": "0.4.10-main.05dbd64",
43
+ "@dxos/context": "0.4.10-main.05dbd64",
44
+ "@dxos/automerge": "0.4.10-main.05dbd64",
45
+ "@dxos/codec-protobuf": "0.4.10-main.05dbd64",
46
+ "@dxos/credentials": "0.4.10-main.05dbd64",
47
+ "@dxos/crypto": "0.4.10-main.05dbd64",
48
+ "@dxos/debug": "0.4.10-main.05dbd64",
49
+ "@dxos/echo-schema": "0.4.10-main.05dbd64",
50
+ "@dxos/feed-store": "0.4.10-main.05dbd64",
51
+ "@dxos/keyring": "0.4.10-main.05dbd64",
52
+ "@dxos/invariant": "0.4.10-main.05dbd64",
53
+ "@dxos/hypercore": "0.4.10-main.05dbd64",
54
+ "@dxos/keys": "0.4.10-main.05dbd64",
55
+ "@dxos/log": "0.4.10-main.05dbd64",
56
+ "@dxos/messaging": "0.4.10-main.05dbd64",
57
+ "@dxos/node-std": "0.4.10-main.05dbd64",
58
+ "@dxos/protocols": "0.4.10-main.05dbd64",
59
+ "@dxos/network-manager": "0.4.10-main.05dbd64",
60
+ "@dxos/random-access-storage": "0.4.10-main.05dbd64",
61
+ "@dxos/teleport": "0.4.10-main.05dbd64",
62
+ "@dxos/teleport-extension-automerge-replicator": "0.4.10-main.05dbd64",
63
+ "@dxos/rpc": "0.4.10-main.05dbd64",
64
+ "@dxos/teleport-extension-gossip": "0.4.10-main.05dbd64",
65
+ "@dxos/teleport-extension-object-sync": "0.4.10-main.05dbd64",
66
+ "@dxos/teleport-extension-replicator": "0.4.10-main.05dbd64",
67
+ "@dxos/tracing": "0.4.10-main.05dbd64",
68
+ "@dxos/timeframe": "0.4.10-main.05dbd64",
69
+ "@dxos/util": "0.4.10-main.05dbd64",
70
+ "@dxos/typings": "0.4.10-main.05dbd64"
68
71
  },
69
72
  "devDependencies": {
70
73
  "fast-check": "^3.15.1",
@@ -9,6 +9,7 @@ import { warnAfterTimeout } from '@dxos/debug';
9
9
  import { invariant } from '@dxos/invariant';
10
10
  import { type PublicKey } from '@dxos/keys';
11
11
  import { log } from '@dxos/log';
12
+ import { trace } from '@dxos/tracing';
12
13
 
13
14
  import { type SpaceState, type SpaceDoc } from './types';
14
15
 
@@ -17,6 +18,8 @@ type SpaceDocumentLinks = SpaceDoc['links'];
17
18
  export interface AutomergeDocumentLoader {
18
19
  onObjectDocumentLoaded: Event<ObjectDocumentLoaded>;
19
20
 
21
+ getAllHandles(): DocHandle<SpaceDoc>[];
22
+
20
23
  loadSpaceRootDocHandle(ctx: Context, spaceState: SpaceState): Promise<void>;
21
24
  loadObjectDocument(objectId: string): void;
22
25
  getSpaceRootDocHandle(): DocHandle<SpaceDoc>;
@@ -33,6 +36,7 @@ export interface AutomergeDocumentLoader {
33
36
  /**
34
37
  * Manages object <-> docHandle binding and automerge document loading.
35
38
  */
39
+ @trace.resource()
36
40
  export class AutomergeDocumentLoaderImpl implements AutomergeDocumentLoader {
37
41
  private _spaceRootDocHandle: DocHandle<SpaceDoc> | null = null;
38
42
  /**
@@ -52,6 +56,11 @@ export class AutomergeDocumentLoaderImpl implements AutomergeDocumentLoader {
52
56
  private readonly _repo: Repo,
53
57
  ) {}
54
58
 
59
+ getAllHandles(): DocHandle<SpaceDoc>[] {
60
+ return [...new Set(this._objectDocumentHandles.values())];
61
+ }
62
+
63
+ @trace.span({ showInBrowserTimeline: true })
55
64
  public async loadSpaceRootDocHandle(ctx: Context, spaceState: SpaceState): Promise<void> {
56
65
  if (this._spaceRootDocHandle != null) {
57
66
  return;
@@ -25,35 +25,50 @@ import { arrayToBuffer, bufferToArray } from '@dxos/util';
25
25
  import { AutomergeHost } from './automerge-host';
26
26
  import { AutomergeStorageAdapter } from './automerge-storage-adapter';
27
27
  import { MeshNetworkAdapter } from './mesh-network-adapter';
28
+ import { createTestLevel } from '../testing';
28
29
 
29
30
  describe('AutomergeHost', () => {
30
- test('can create documents', () => {
31
- const host = new AutomergeHost({ directory: createStorage({ type: StorageType.RAM }).createDirectory() });
31
+ test('can create documents', async () => {
32
+ const level = createTestLevel();
33
+ await level.open();
34
+ afterTest(() => level.close());
35
+ const host = new AutomergeHost({
36
+ db: level.sublevel('automerge'),
37
+ });
38
+ await host.open();
39
+ afterTest(() => host.close());
32
40
 
33
41
  const handle = host.repo.create();
34
42
  handle.change((doc: any) => {
35
43
  doc.text = 'Hello world';
36
44
  });
45
+ await host.repo.flush();
37
46
  expect(handle.docSync().text).toEqual('Hello world');
38
47
  });
39
48
 
40
49
  test('changes are preserved in storage', async () => {
41
- const storageDirectory = createStorage({ type: StorageType.RAM }).createDirectory();
50
+ const level = createTestLevel();
51
+ await level.open();
52
+ afterTest(() => level.close());
42
53
 
43
- const host = new AutomergeHost({ directory: storageDirectory });
54
+ const host = new AutomergeHost({ db: level.sublevel('automerge') });
55
+ await host.open();
44
56
  const handle = host.repo.create();
45
57
  handle.change((doc: any) => {
46
58
  doc.text = 'Hello world';
47
59
  });
48
60
  const url = handle.url;
49
61
 
50
- // TODO(dmaretskyi): Is there a way to know when automerge has finished saving?
51
- await sleep(100);
62
+ await host.repo.flush();
63
+ await host.close();
52
64
 
53
- const host2 = new AutomergeHost({ directory: storageDirectory });
65
+ const host2 = new AutomergeHost({ db: level.sublevel('automerge') });
66
+ await host2.open();
67
+ afterTest(() => host2.close());
54
68
  const handle2 = host2.repo.find(url);
55
69
  await handle2.whenReady();
56
70
  expect(handle2.docSync().text).toEqual('Hello world');
71
+ await host2.repo.flush();
57
72
  });
58
73
 
59
74
  test('basic networking', async () => {
@@ -168,7 +183,6 @@ describe('AutomergeHost', () => {
168
183
  const secondHandle = host.create();
169
184
  secondHandle.change((doc: any) => (doc.text = 'Hello world'));
170
185
  await host.find(secondHandle.url).whenReady();
171
- // await sleep(100);
172
186
  allowedDocs.push(secondHandle.documentId);
173
187
 
174
188
  {
@@ -2,78 +2,82 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { next as automerge, getHeads } from '@dxos/automerge/automerge';
6
- import {
7
- Repo,
8
- type PeerId,
9
- type DocumentId,
10
- type StorageKey,
11
- type DocHandle,
12
- type DocHandleChangePayload,
13
- } from '@dxos/automerge/automerge-repo';
14
- import { IndexedDBStorageAdapter } from '@dxos/automerge/automerge-repo-storage-indexeddb';
5
+ import { asyncTimeout } from '@dxos/async';
6
+ import { next as automerge } from '@dxos/automerge/automerge';
7
+ import { Repo, type DocumentId, type PeerId, type StorageAdapterInterface } from '@dxos/automerge/automerge-repo';
15
8
  import { type Stream } from '@dxos/codec-protobuf';
16
- import { Context } from '@dxos/context';
9
+ import { Context, type Lifecycle } from '@dxos/context';
17
10
  import { PublicKey } from '@dxos/keys';
18
11
  import { log } from '@dxos/log';
19
- import { idCodec } from '@dxos/protocols';
20
- import { type HostInfo, type SyncRepoRequest, type SyncRepoResponse } from '@dxos/protocols/proto/dxos/echo/service';
21
- import { StorageType, type Directory } from '@dxos/random-access-storage';
12
+ import {
13
+ type FlushRequest,
14
+ type HostInfo,
15
+ type SyncRepoRequest,
16
+ type SyncRepoResponse,
17
+ } from '@dxos/protocols/proto/dxos/echo/service';
18
+ import { type Directory } from '@dxos/random-access-storage';
22
19
  import { type AutomergeReplicator } from '@dxos/teleport-extension-automerge-replicator';
23
20
  import { trace } from '@dxos/tracing';
24
21
  import { ComplexMap, ComplexSet, defaultMap, mapValues } from '@dxos/util';
25
22
 
26
- import { AutomergeStorageAdapter } from './automerge-storage-adapter';
27
- import { AutomergeStorageWrapper } from './automerge-storage–wrapper';
23
+ import { LevelDBStorageAdapter, type StorageCallbacks } from './leveldb-storage-adapter';
28
24
  import { LocalHostNetworkAdapter } from './local-host-network-adapter';
29
25
  import { MeshNetworkAdapter } from './mesh-network-adapter';
26
+ import { levelMigration } from './migrations';
27
+ import { type SubLevelDB } from './types';
30
28
 
29
+ // TODO: Remove
31
30
  export type { DocumentId };
32
31
 
33
- export interface MetadataMethods {
34
- markDirty(idToLastHash: Map<string, string>): Promise<void>;
35
- }
36
-
37
32
  export type AutomergeHostParams = {
38
- directory: Directory;
39
- metadata?: MetadataMethods;
33
+ db: SubLevelDB;
34
+ /**
35
+ * For migration purposes.
36
+ */
37
+ directory?: Directory;
38
+ storageCallbacks?: StorageCallbacks;
40
39
  };
41
40
 
42
41
  @trace.resource()
43
42
  export class AutomergeHost {
44
43
  private readonly _ctx = new Context();
45
- private readonly _repo: Repo;
46
- private readonly _meshNetwork: MeshNetworkAdapter;
47
- private readonly _clientNetwork: LocalHostNetworkAdapter;
48
- private readonly _storage: AutomergeStorageWrapper;
44
+ private readonly _directory?: Directory;
45
+ private readonly _db: SubLevelDB;
46
+ private readonly _storageCallbacks?: StorageCallbacks;
47
+
48
+ private _repo!: Repo;
49
+ private _meshNetwork!: MeshNetworkAdapter;
50
+ private _clientNetwork!: LocalHostNetworkAdapter;
51
+ private _storage!: StorageAdapterInterface & Lifecycle;
49
52
 
50
53
  @trace.info()
51
- private readonly _peerId: string;
54
+ private _peerId!: string;
52
55
 
53
56
  /**
54
57
  * spaceKey -> deviceKey[]
55
58
  */
56
59
  private readonly _authorizedDevices = new ComplexMap<PublicKey, ComplexSet<PublicKey>>(PublicKey.hash);
57
60
 
58
- private readonly _updatingMetadata = new Map<string, Promise<void>>();
59
- private readonly _metadata?: MetadataMethods;
60
-
61
61
  public _requestedDocs = new Set<string>();
62
62
 
63
- constructor({ directory, metadata }: AutomergeHostParams) {
64
- this._metadata = metadata;
65
- this._meshNetwork = new MeshNetworkAdapter();
66
- this._clientNetwork = new LocalHostNetworkAdapter();
63
+ constructor({ directory, db, storageCallbacks }: AutomergeHostParams) {
64
+ this._directory = directory;
65
+ this._db = db;
66
+ this._storageCallbacks = storageCallbacks;
67
+ }
67
68
 
68
- this._storage = new AutomergeStorageWrapper({
69
- storage:
70
- // TODO(mykola): Delete specific handling of IDB storage.
71
- directory.type === StorageType.IDB
72
- ? new IndexedDBStorageAdapter(directory.path, 'data')
73
- : new AutomergeStorageAdapter(directory),
74
- callbacks: { beforeSave: (params) => this._beforeSave(params) },
69
+ async open() {
70
+ // TODO(mykola): remove this before 0.6 release.
71
+ this._directory && (await levelMigration({ db: this._db, directory: this._directory }));
72
+ this._storage = new LevelDBStorageAdapter({
73
+ db: this._db,
74
+ callbacks: this._storageCallbacks,
75
75
  });
76
+ await this._storage.open?.();
76
77
  this._peerId = `host-${PublicKey.random().toHex()}` as PeerId;
78
+
79
+ this._meshNetwork = new MeshNetworkAdapter();
80
+ this._clientNetwork = new LocalHostNetworkAdapter();
77
81
  this._repo = new Repo({
78
82
  peerId: this._peerId as PeerId,
79
83
  network: [this._clientNetwork, this._meshNetwork],
@@ -133,61 +137,17 @@ export class AutomergeHost {
133
137
  this._clientNetwork.ready();
134
138
  this._meshNetwork.ready();
135
139
 
136
- {
137
- const listener = ({ handle }: { handle: DocHandle<any> }) => this._onDocument(handle);
138
- this._repo.on('document', listener);
139
- this._ctx.onDispose(() => {
140
- this._repo.off('document', listener);
141
- });
142
- }
143
- }
144
-
145
- get repo(): Repo {
146
- return this._repo;
147
- }
148
-
149
- private async _beforeSave(path: StorageKey) {
150
- const id = path[0];
151
- if (this._updatingMetadata.has(id)) {
152
- return this._updatingMetadata.get(id);
153
- }
140
+ await this._clientNetwork.whenConnected();
154
141
  }
155
142
 
156
- private _onDocument(handle: DocHandle<any>) {
157
- const listener = (event: DocHandleChangePayload<any>) => this._onUpdate(event);
158
- handle.on('change', listener);
159
- this._ctx.onDispose(() => {
160
- handle.off('change', listener);
161
- });
143
+ async close() {
144
+ await this._storage.close?.();
145
+ await this._clientNetwork.close();
146
+ await this._ctx.dispose();
162
147
  }
163
148
 
164
- private _onUpdate(event: DocHandleChangePayload<any>) {
165
- if (this._metadata == null) {
166
- return;
167
- }
168
-
169
- const objectIds = getInlineChanges(event);
170
- if (objectIds.length === 0) {
171
- return;
172
- }
173
-
174
- const heads = getHeads(event.doc);
175
- const lastAvailableHash = heads.join('');
176
- if (!lastAvailableHash) {
177
- return;
178
- }
179
-
180
- const encodedIds = objectIds.map((objectId) => idCodec.encode({ documentId: event.handle.documentId, objectId }));
181
- const idToLastHash = new Map(encodedIds.map((id) => [id, lastAvailableHash]));
182
- const markingDirtyPromise = this._metadata
183
- .markDirty(idToLastHash)
184
- .then(() => {
185
- this._updatingMetadata.delete(event.handle.documentId);
186
- })
187
- .catch((err: Error) => {
188
- this._ctx.disposed && log.catch(err);
189
- });
190
- this._updatingMetadata.set(event.handle.documentId, markingDirtyPromise);
149
+ get repo(): Repo {
150
+ return this._repo;
191
151
  }
192
152
 
193
153
  @trace.info({ depth: null })
@@ -197,8 +157,8 @@ export class AutomergeHost {
197
157
  hasDoc: !!handle.docSync(),
198
158
  heads: handle.docSync() ? automerge.getHeads(handle.docSync()) : null,
199
159
  data:
200
- handle.docSync()?.doc &&
201
- mapValues(handle.docSync()?.doc, (value, key) => {
160
+ handle.docSync() &&
161
+ mapValues(handle.docSync(), (value, key) => {
202
162
  try {
203
163
  switch (key) {
204
164
  case 'access':
@@ -221,15 +181,21 @@ export class AutomergeHost {
221
181
  return this._repo.peers;
222
182
  }
223
183
 
224
- async close() {
225
- await this._storage.close();
226
- await this._clientNetwork.close();
227
- await this._ctx.dispose();
228
- }
229
-
230
184
  //
231
185
  // Methods for client-services.
232
186
  //
187
+ @trace.span({ showInBrowserTimeline: true })
188
+ async flush({ documentIds }: FlushRequest): Promise<void> {
189
+ // Note: Wait for all requested documents to be loaded/synced from thin-client.
190
+ await Promise.all(documentIds?.map((id) => this._repo.find(id as DocumentId).whenReady()) ?? []);
191
+
192
+ // TODO(dmaretskyi): Workaround until the flush issue gets resolved.
193
+ try {
194
+ await asyncTimeout(this._repo.flush(documentIds as DocumentId[]), 500);
195
+ } catch (err) {
196
+ log.warn('flush error', { documentIds, err });
197
+ }
198
+ }
233
199
 
234
200
  syncRepo(request: SyncRepoRequest): Stream<SyncRepoResponse> {
235
201
  return this._clientNetwork.syncRepo(request);
@@ -257,24 +223,6 @@ export class AutomergeHost {
257
223
  }
258
224
  }
259
225
 
260
- // TODO(mykola): Reconcile with `getInlineAndLinkChanges` in AutomergeDB.
261
- const getInlineChanges = (event: DocHandleChangePayload<any>) => {
262
- const inlineChangedObjectIds = new Set<string>();
263
- for (const { path } of event.patches) {
264
- if (path.length < 2) {
265
- continue;
266
- }
267
- switch (path[0]) {
268
- case 'objects':
269
- if (path.length >= 2) {
270
- inlineChangedObjectIds.add(path[1]);
271
- }
272
- break;
273
- }
274
- }
275
- return [...inlineChangedObjectIds];
276
- };
277
-
278
226
  export const getSpaceKeyFromDoc = (doc: any): string | null => {
279
227
  // experimental_spaceKey is set on old documents, new ones are created with doc.access.spaceKey
280
228
  const rawSpaceKey = doc.access?.spaceKey ?? doc.experimental_spaceKey;
@@ -0,0 +1,29 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import { Repo } from '@dxos/automerge/automerge-repo';
6
+ import { randomBytes } from '@dxos/crypto';
7
+ import { StorageType, createStorage } from '@dxos/random-access-storage';
8
+ import { describe, test } from '@dxos/test';
9
+
10
+ import { AutomergeStorageAdapter } from './automerge-storage-adapter';
11
+
12
+ describe('AutomergeRepo', () => {
13
+ // Currently failing
14
+ test.skip('flush', async () => {
15
+ const repo = new Repo({
16
+ network: [],
17
+ storage: new AutomergeStorageAdapter(createStorage({ type: StorageType.NODE }).createDirectory()),
18
+ });
19
+ const handle = repo.create<{ field?: string }>();
20
+
21
+ for (let i = 0; i < 10; i++) {
22
+ const p = repo.flush([handle.documentId]);
23
+ handle.change((doc: any) => {
24
+ doc.field += randomBytes(1024).toString('hex');
25
+ });
26
+ await p;
27
+ }
28
+ });
29
+ });
@@ -5,6 +5,8 @@
5
5
  export * from './automerge-host';
6
6
  export * from './automerge-storage-adapter';
7
7
  export * from './automerge-doc-loader';
8
+ export * from './leveldb-storage-adapter';
8
9
  export * from './local-host-network-adapter';
9
10
  export * from './mesh-network-adapter';
10
11
  export * from './types';
12
+ export * from './reference';