@dxos/echo-pipeline 0.5.6 → 0.5.7-main.1b7f312

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 (34) hide show
  1. package/dist/lib/browser/{chunk-GANAND63.mjs → chunk-BE5QQHWH.mjs} +43 -15
  2. package/dist/lib/browser/{chunk-GANAND63.mjs.map → chunk-BE5QQHWH.mjs.map} +3 -3
  3. package/dist/lib/browser/index.mjs +12 -8
  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 +4 -4
  7. package/dist/lib/browser/testing/index.mjs.map +3 -3
  8. package/dist/lib/node/{chunk-M475BGBI.cjs → chunk-ZELCNJ3D.cjs} +54 -25
  9. package/dist/lib/node/chunk-ZELCNJ3D.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +33 -29
  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 +13 -13
  14. package/dist/lib/node/testing/index.cjs.map +3 -3
  15. package/dist/types/src/automerge/automerge-host.d.ts.map +1 -1
  16. package/dist/types/src/automerge/migrations.d.ts.map +1 -1
  17. package/dist/types/src/space/space-manager.d.ts +2 -2
  18. package/dist/types/src/space/space-manager.d.ts.map +1 -1
  19. package/dist/types/src/space/space-protocol.d.ts +2 -2
  20. package/dist/types/src/space/space-protocol.d.ts.map +1 -1
  21. package/dist/types/src/space/space.d.ts +9 -1
  22. package/dist/types/src/space/space.d.ts.map +1 -1
  23. package/dist/types/src/testing/test-agent-builder.d.ts +2 -2
  24. package/dist/types/src/testing/test-agent-builder.d.ts.map +1 -1
  25. package/package.json +33 -33
  26. package/src/automerge/automerge-doc-loader.test.ts +2 -1
  27. package/src/automerge/automerge-host.ts +12 -5
  28. package/src/automerge/migrations.ts +2 -1
  29. package/src/space/space-manager.ts +6 -4
  30. package/src/space/space-protocol.test.ts +3 -3
  31. package/src/space/space-protocol.ts +3 -3
  32. package/src/space/space.ts +30 -1
  33. package/src/testing/test-agent-builder.ts +4 -4
  34. package/dist/lib/node/chunk-M475BGBI.cjs.map +0 -7
@@ -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.5.6",
3
+ "version": "0.5.7-main.1b7f312",
4
4
  "description": "ECHO database.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -39,38 +39,38 @@
39
39
  "crc-32": "^1.2.2",
40
40
  "level": "^8.0.1",
41
41
  "level-transcoder": "^1.0.1",
42
- "@dxos/async": "0.5.6",
43
- "@dxos/automerge": "0.5.6",
44
- "@dxos/codec-protobuf": "0.5.6",
45
- "@dxos/context": "0.5.6",
46
- "@dxos/credentials": "0.5.6",
47
- "@dxos/crypto": "0.5.6",
48
- "@dxos/debug": "0.5.6",
49
- "@dxos/echo-protocol": "0.5.6",
50
- "@dxos/feed-store": "0.5.6",
51
- "@dxos/echo-schema": "0.5.6",
52
- "@dxos/hypercore": "0.5.6",
53
- "@dxos/indexing": "0.5.6",
54
- "@dxos/invariant": "0.5.6",
55
- "@dxos/keyring": "0.5.6",
56
- "@dxos/keys": "0.5.6",
57
- "@dxos/kv-store": "0.5.6",
58
- "@dxos/messaging": "0.5.6",
59
- "@dxos/network-manager": "0.5.6",
60
- "@dxos/log": "0.5.6",
61
- "@dxos/node-std": "0.5.6",
62
- "@dxos/random-access-storage": "0.5.6",
63
- "@dxos/rpc": "0.5.6",
64
- "@dxos/teleport": "0.5.6",
65
- "@dxos/protocols": "0.5.6",
66
- "@dxos/teleport-extension-automerge-replicator": "0.5.6",
67
- "@dxos/teleport-extension-gossip": "0.5.6",
68
- "@dxos/teleport-extension-object-sync": "0.5.6",
69
- "@dxos/teleport-extension-replicator": "0.5.6",
70
- "@dxos/tracing": "0.5.6",
71
- "@dxos/timeframe": "0.5.6",
72
- "@dxos/typings": "0.5.6",
73
- "@dxos/util": "0.5.6"
42
+ "@dxos/automerge": "0.5.7-main.1b7f312",
43
+ "@dxos/codec-protobuf": "0.5.7-main.1b7f312",
44
+ "@dxos/async": "0.5.7-main.1b7f312",
45
+ "@dxos/credentials": "0.5.7-main.1b7f312",
46
+ "@dxos/context": "0.5.7-main.1b7f312",
47
+ "@dxos/crypto": "0.5.7-main.1b7f312",
48
+ "@dxos/debug": "0.5.7-main.1b7f312",
49
+ "@dxos/echo-protocol": "0.5.7-main.1b7f312",
50
+ "@dxos/echo-schema": "0.5.7-main.1b7f312",
51
+ "@dxos/feed-store": "0.5.7-main.1b7f312",
52
+ "@dxos/hypercore": "0.5.7-main.1b7f312",
53
+ "@dxos/invariant": "0.5.7-main.1b7f312",
54
+ "@dxos/keyring": "0.5.7-main.1b7f312",
55
+ "@dxos/indexing": "0.5.7-main.1b7f312",
56
+ "@dxos/kv-store": "0.5.7-main.1b7f312",
57
+ "@dxos/log": "0.5.7-main.1b7f312",
58
+ "@dxos/keys": "0.5.7-main.1b7f312",
59
+ "@dxos/messaging": "0.5.7-main.1b7f312",
60
+ "@dxos/network-manager": "0.5.7-main.1b7f312",
61
+ "@dxos/protocols": "0.5.7-main.1b7f312",
62
+ "@dxos/node-std": "0.5.7-main.1b7f312",
63
+ "@dxos/random-access-storage": "0.5.7-main.1b7f312",
64
+ "@dxos/rpc": "0.5.7-main.1b7f312",
65
+ "@dxos/teleport": "0.5.7-main.1b7f312",
66
+ "@dxos/teleport-extension-automerge-replicator": "0.5.7-main.1b7f312",
67
+ "@dxos/teleport-extension-gossip": "0.5.7-main.1b7f312",
68
+ "@dxos/teleport-extension-object-sync": "0.5.7-main.1b7f312",
69
+ "@dxos/teleport-extension-replicator": "0.5.7-main.1b7f312",
70
+ "@dxos/tracing": "0.5.7-main.1b7f312",
71
+ "@dxos/timeframe": "0.5.7-main.1b7f312",
72
+ "@dxos/typings": "0.5.7-main.1b7f312",
73
+ "@dxos/util": "0.5.7-main.1b7f312"
74
74
  },
75
75
  "devDependencies": {
76
76
  "fast-check": "^3.19.0",
@@ -8,6 +8,7 @@ import { sleep } from '@dxos/async';
8
8
  import { Repo } from '@dxos/automerge/automerge-repo';
9
9
  import { Context } from '@dxos/context';
10
10
  import { type SpaceDoc } from '@dxos/echo-protocol';
11
+ import { generateEchoId } from '@dxos/echo-schema';
11
12
  import { PublicKey } from '@dxos/keys';
12
13
  import { describe, test } from '@dxos/test';
13
14
 
@@ -19,7 +20,7 @@ import {
19
20
 
20
21
  const ctx = new Context();
21
22
  const SPACE_KEY = PublicKey.random();
22
- const randomId = () => PublicKey.random().toHex();
23
+ const randomId = () => generateEchoId();
23
24
  describe('AutomergeDocumentLoader', () => {
24
25
  test('space access is set on root doc handle and it is accessible', async () => {
25
26
  const { loader, spaceRootDocHandle } = await setupTest();
@@ -76,6 +76,9 @@ export class AutomergeHost {
76
76
  }
77
77
 
78
78
  async open() {
79
+ // TODO(burdon): Should this be stable?
80
+ this._peerId = `host-${PublicKey.random().toHex()}` as PeerId;
81
+
79
82
  // TODO(mykola): remove this before 0.6 release.
80
83
  this._directory && (await levelMigration({ db: this._db, directory: this._directory }));
81
84
  this._storage = new LevelDBStorageAdapter({
@@ -86,20 +89,24 @@ export class AutomergeHost {
86
89
  },
87
90
  });
88
91
  await this._storage.open?.();
89
- this._peerId = `host-${PublicKey.random().toHex()}` as PeerId;
90
92
 
91
93
  this._clientNetwork = new LocalHostNetworkAdapter();
92
94
 
95
+ // Construct the automerge repo.
93
96
  this._repo = new Repo({
94
97
  peerId: this._peerId as PeerId,
95
- network: [this._clientNetwork, this._echoNetworkAdapter],
96
- storage: this._storage,
97
-
98
98
  sharePolicy: this._sharePolicy.bind(this),
99
+ storage: this._storage,
100
+ network: [
101
+ // Downstream client.
102
+ this._clientNetwork,
103
+ // Upstream swarm.
104
+ this._echoNetworkAdapter,
105
+ ],
99
106
  });
107
+
100
108
  this._clientNetwork.ready();
101
109
  await this._echoNetworkAdapter.open();
102
-
103
110
  await this._clientNetwork.whenConnected();
104
111
  await this._echoNetworkAdapter.whenConnected();
105
112
  }
@@ -12,7 +12,7 @@ import { AutomergeStorageAdapter } from './automerge-storage-adapter';
12
12
  import { encodingOptions } from './leveldb-storage-adapter';
13
13
 
14
14
  export const levelMigration = async ({ db, directory }: { db: SublevelDB; directory: Directory }) => {
15
- // Note: Make automigration from previous storage to leveldb here.
15
+ // Note: Make auto-migration from previous storage to leveldb here.
16
16
  const isNewLevel = !(await db
17
17
  .iterator<StorageKey, Uint8Array>({
18
18
  ...encodingOptions,
@@ -32,6 +32,7 @@ export const levelMigration = async ({ db, directory }: { db: SublevelDB; direct
32
32
  if (chunks.length === 0) {
33
33
  return;
34
34
  }
35
+
35
36
  const batch = db.batch();
36
37
  log.info('found chunks on old storage adapter', { chunks: chunks.length });
37
38
  for (const { key, data } of await oldStorageAdapter.loadRange([])) {
@@ -8,7 +8,7 @@ import { failUndefined } from '@dxos/debug';
8
8
  import { type FeedStore } from '@dxos/feed-store';
9
9
  import { PublicKey } from '@dxos/keys';
10
10
  import { log } from '@dxos/log';
11
- import { type NetworkManager } from '@dxos/network-manager';
11
+ import { type SwarmNetworkManager } from '@dxos/network-manager';
12
12
  import { trace } from '@dxos/protocols';
13
13
  import type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
14
14
  import { type SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';
@@ -16,14 +16,14 @@ import { type Teleport } from '@dxos/teleport';
16
16
  import { type BlobStore } from '@dxos/teleport-extension-object-sync';
17
17
  import { ComplexMap } from '@dxos/util';
18
18
 
19
- import { Space } from './space';
19
+ import { Space, createIdFromSpaceKey } from './space';
20
20
  import { SpaceProtocol, type SwarmIdentity } from './space-protocol';
21
21
  import { SnapshotManager, type SnapshotStore } from '../db-host';
22
22
  import { type MetadataStore } from '../metadata';
23
23
 
24
24
  export type SpaceManagerParams = {
25
25
  feedStore: FeedStore<FeedMessage>;
26
- networkManager: NetworkManager;
26
+ networkManager: SwarmNetworkManager;
27
27
  metadataStore: MetadataStore;
28
28
 
29
29
  /**
@@ -54,7 +54,7 @@ export type ConstructSpaceParams = {
54
54
  export class SpaceManager {
55
55
  private readonly _spaces = new ComplexMap<PublicKey, Space>(PublicKey.hash);
56
56
  private readonly _feedStore: FeedStore<FeedMessage>;
57
- private readonly _networkManager: NetworkManager;
57
+ private readonly _networkManager: SwarmNetworkManager;
58
58
  private readonly _metadataStore: MetadataStore;
59
59
  private readonly _snapshotStore: SnapshotStore;
60
60
  private readonly _blobStore: BlobStore;
@@ -98,6 +98,7 @@ export class SpaceManager {
98
98
  const genesisFeed = await this._feedStore.openFeed(metadata.genesisFeedKey ?? failUndefined());
99
99
 
100
100
  const spaceKey = metadata.key;
101
+ const spaceId = await createIdFromSpaceKey(spaceKey);
101
102
  const protocol = new SpaceProtocol({
102
103
  topic: spaceKey,
103
104
  swarmIdentity,
@@ -109,6 +110,7 @@ export class SpaceManager {
109
110
  const snapshotManager = new SnapshotManager(this._snapshotStore, this._blobStore, protocol.blobSync);
110
111
 
111
112
  const space = new Space({
113
+ id: spaceId,
112
114
  spaceKey,
113
115
  protocol,
114
116
  genesisFeed,
@@ -7,7 +7,7 @@ import waitForExpect from 'wait-for-expect';
7
7
 
8
8
  import { PublicKey } from '@dxos/keys';
9
9
  import { MemorySignalManager, MemorySignalManagerContext } from '@dxos/messaging';
10
- import { MemoryTransportFactory, NetworkManager } from '@dxos/network-manager';
10
+ import { MemoryTransportFactory, SwarmNetworkManager } from '@dxos/network-manager';
11
11
  import { StorageType, createStorage } from '@dxos/random-access-storage';
12
12
  import { BlobStore } from '@dxos/teleport-extension-object-sync';
13
13
  import { describe, test, afterTest } from '@dxos/test';
@@ -56,7 +56,7 @@ describe('space/space-protocol', () => {
56
56
  credentialAuthenticator: async () => false, // Reject everyone.
57
57
  },
58
58
  blobStore: new BlobStore(createStorage({ type: StorageType.RAM }).createDirectory()),
59
- networkManager: new NetworkManager({
59
+ networkManager: new SwarmNetworkManager({
60
60
  signalManager: new MemorySignalManager(signalContext),
61
61
  transportFactory: MemoryTransportFactory,
62
62
  }),
@@ -70,7 +70,7 @@ describe('space/space-protocol', () => {
70
70
  credentialAuthenticator: MOCK_AUTH_VERIFIER,
71
71
  },
72
72
  blobStore: new BlobStore(createStorage({ type: StorageType.RAM }).createDirectory()),
73
- networkManager: new NetworkManager({
73
+ networkManager: new SwarmNetworkManager({
74
74
  signalManager: new MemorySignalManager(signalContext),
75
75
  transportFactory: MemoryTransportFactory,
76
76
  }),
@@ -9,7 +9,7 @@ import { PublicKey } from '@dxos/keys';
9
9
  import { log, logInfo } from '@dxos/log';
10
10
  import {
11
11
  MMSTTopology,
12
- type NetworkManager,
12
+ type SwarmNetworkManager,
13
13
  type SwarmConnection,
14
14
  type WireProtocol,
15
15
  type WireProtocolParams,
@@ -37,7 +37,7 @@ export interface SwarmIdentity {
37
37
  export type SpaceProtocolOptions = {
38
38
  topic: PublicKey; // TODO(burdon): Rename?
39
39
  swarmIdentity: SwarmIdentity;
40
- networkManager: NetworkManager;
40
+ networkManager: SwarmNetworkManager;
41
41
 
42
42
  blobStore: BlobStore;
43
43
 
@@ -54,7 +54,7 @@ export type SpaceProtocolOptions = {
54
54
  */
55
55
  @trace.resource()
56
56
  export class SpaceProtocol {
57
- private readonly _networkManager: NetworkManager;
57
+ private readonly _networkManager: SwarmNetworkManager;
58
58
  private readonly _swarmIdentity: SwarmIdentity;
59
59
  private readonly _onSessionAuth?: (session: Teleport) => void;
60
60
  private readonly _onAuthFailure?: (session: Teleport) => void;
@@ -5,9 +5,10 @@
5
5
  import { Event, Mutex, synchronized, trackLeaks } from '@dxos/async';
6
6
  import { type Context, LifecycleState, Resource } from '@dxos/context';
7
7
  import { type DelegateInvitationCredential, type FeedInfo, type MemberInfo } from '@dxos/credentials';
8
+ import { subtleCrypto } from '@dxos/crypto';
8
9
  import { type FeedOptions, type FeedWrapper } from '@dxos/feed-store';
9
10
  import { invariant } from '@dxos/invariant';
10
- import { type PublicKey } from '@dxos/keys';
11
+ import { SpaceId, type PublicKey } from '@dxos/keys';
11
12
  import { log, logInfo } from '@dxos/log';
12
13
  import type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
13
14
  import { AdmittedFeed, type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';
@@ -25,6 +26,7 @@ import { type PipelineAccessor } from '../pipeline';
25
26
  type FeedProvider = (feedKey: PublicKey, opts?: FeedOptions) => Promise<FeedWrapper<FeedMessage>>;
26
27
 
27
28
  export type SpaceParams = {
29
+ id: SpaceId;
28
30
  spaceKey: PublicKey;
29
31
  protocol: SpaceProtocol;
30
32
  genesisFeed: FeedWrapper<FeedMessage>;
@@ -59,6 +61,7 @@ export class Space extends Resource {
59
61
  @trace.info()
60
62
  public readonly protocol: SpaceProtocol;
61
63
 
64
+ private readonly _id: SpaceId;
62
65
  private readonly _key: PublicKey;
63
66
  private readonly _genesisFeedKey: PublicKey;
64
67
  private readonly _feedProvider: FeedProvider;
@@ -73,6 +76,7 @@ export class Space extends Resource {
73
76
  constructor(params: SpaceParams) {
74
77
  super();
75
78
  invariant(params.spaceKey && params.feedProvider);
79
+ this._id = params.id;
76
80
  this._key = params.spaceKey;
77
81
  this._genesisFeedKey = params.genesisFeed.key;
78
82
  this._feedProvider = params.feedProvider;
@@ -120,6 +124,12 @@ export class Space extends Resource {
120
124
  this.protocol.addFeed(params.genesisFeed);
121
125
  }
122
126
 
127
+ @logInfo
128
+ @trace.info()
129
+ get id() {
130
+ return this._id;
131
+ }
132
+
123
133
  @logInfo
124
134
  @trace.info()
125
135
  get key() {
@@ -199,3 +209,22 @@ export class Space extends Resource {
199
209
  log('closed');
200
210
  }
201
211
  }
212
+
213
+ /**
214
+ * Space keys are generated by creating a keypair, and then taking the first 20 bytes of the SHA-256 hash of the public key and encoding them to multibase RFC4648 base-32 format (prefixed with B, see Multibase Table).
215
+ * Inspired by how ethereum addresses are derived.
216
+ */
217
+ export const createIdFromSpaceKey = async (spaceKey: PublicKey): Promise<SpaceId> => {
218
+ // Sanity check.
219
+ invariant(spaceKey.length === EXPECTED_SPACE_KEY_LENGTH);
220
+
221
+ const digest = await subtleCrypto.digest('SHA-256', spaceKey.asUint8Array());
222
+
223
+ const bytes = new Uint8Array(digest).slice(0, SpaceId.byteLength);
224
+ return SpaceId.encode(bytes);
225
+ };
226
+
227
+ /**
228
+ * Length of the ECDSA P-256 public key from WebCrypto exported as "raw".
229
+ */
230
+ const EXPECTED_SPACE_KEY_LENGTH = 65;
@@ -8,7 +8,7 @@ import { type FeedStore } from '@dxos/feed-store';
8
8
  import { type Keyring } from '@dxos/keyring';
9
9
  import { PublicKey } from '@dxos/keys';
10
10
  import { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';
11
- import { MemoryTransportFactory, NetworkManager, createSimplePeerTransportFactory } from '@dxos/network-manager';
11
+ import { MemoryTransportFactory, SwarmNetworkManager, createSimplePeerTransportFactory } from '@dxos/network-manager';
12
12
  import type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
13
13
  import { type SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';
14
14
  import { AdmittedFeed } from '@dxos/protocols/proto/dxos/halo/credentials';
@@ -22,12 +22,12 @@ import { SnapshotStore } from '../db-host';
22
22
  import { MetadataStore } from '../metadata';
23
23
  import { MOCK_AUTH_PROVIDER, MOCK_AUTH_VERIFIER, SpaceManager, SpaceProtocol, type Space } from '../space';
24
24
 
25
- export type NetworkManagerProvider = () => NetworkManager;
25
+ export type NetworkManagerProvider = () => SwarmNetworkManager;
26
26
 
27
27
  export const MemoryNetworkManagerProvider =
28
28
  (signalContext: MemorySignalManagerContext): NetworkManagerProvider =>
29
29
  () =>
30
- new NetworkManager({
30
+ new SwarmNetworkManager({
31
31
  signalManager: new MemorySignalManager(signalContext),
32
32
  transportFactory: MemoryTransportFactory,
33
33
  });
@@ -35,7 +35,7 @@ export const MemoryNetworkManagerProvider =
35
35
  export const WebsocketNetworkManagerProvider =
36
36
  (signalUrl: string): NetworkManagerProvider =>
37
37
  () =>
38
- new NetworkManager({
38
+ new SwarmNetworkManager({
39
39
  signalManager: new WebsocketSignalManager([{ server: signalUrl }]),
40
40
  transportFactory: createSimplePeerTransportFactory(),
41
41
  });