@dxos/echo-pipeline 0.5.2 → 0.5.3-main.088a2c8
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.
- package/dist/lib/browser/{chunk-VQQD32DM.mjs → chunk-VUJXFVSK.mjs} +49 -30
- package/dist/lib/browser/{chunk-VQQD32DM.mjs.map → chunk-VUJXFVSK.mjs.map} +3 -3
- package/dist/lib/browser/index.mjs +435 -288
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +3 -1
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/node/{chunk-P7L7ICAH.cjs → chunk-6733E3WM.cjs} +50 -32
- package/dist/lib/node/{chunk-P7L7ICAH.cjs.map → chunk-6733E3WM.cjs.map} +3 -3
- package/dist/lib/node/index.cjs +446 -299
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +13 -11
- package/dist/lib/node/testing/index.cjs.map +3 -3
- package/dist/types/src/automerge/automerge-host.d.ts +4 -11
- package/dist/types/src/automerge/automerge-host.d.ts.map +1 -1
- package/dist/types/src/automerge/echo-network-adapter.d.ts +6 -0
- package/dist/types/src/automerge/echo-network-adapter.d.ts.map +1 -1
- package/dist/types/src/automerge/echo-replicator.d.ts +2 -0
- package/dist/types/src/automerge/echo-replicator.d.ts.map +1 -1
- package/dist/types/src/automerge/index.d.ts +1 -1
- package/dist/types/src/automerge/leveldb-storage-adapter.d.ts +2 -2
- package/dist/types/src/automerge/mesh-echo-replicator.d.ts +23 -0
- package/dist/types/src/automerge/mesh-echo-replicator.d.ts.map +1 -0
- package/dist/types/src/automerge/migrations.d.ts +2 -2
- package/dist/types/src/space/space-manager.d.ts +3 -2
- package/dist/types/src/space/space-manager.d.ts.map +1 -1
- package/dist/types/src/space/space-protocol.d.ts +2 -0
- package/dist/types/src/space/space-protocol.d.ts.map +1 -1
- package/dist/types/src/space/space.d.ts +4 -3
- package/dist/types/src/space/space.d.ts.map +1 -1
- package/dist/types/src/testing/test-agent-builder.d.ts.map +1 -1
- package/package.json +33 -33
- package/src/automerge/automerge-host.test.ts +22 -9
- package/src/automerge/automerge-host.ts +62 -88
- package/src/automerge/echo-network-adapter.ts +19 -0
- package/src/automerge/echo-replicator.ts +3 -0
- package/src/automerge/index.ts +1 -1
- package/src/automerge/leveldb-storage-adapter.ts +2 -2
- package/src/automerge/mesh-echo-replicator.ts +232 -0
- package/src/automerge/migrations.ts +2 -2
- package/src/space/space-manager.ts +4 -1
- package/src/space/space-protocol.ts +11 -8
- package/src/space/space.ts +8 -3
- package/src/testing/test-agent-builder.ts +1 -0
- package/dist/types/src/automerge/mesh-network-adapter.d.ts +0 -18
- package/dist/types/src/automerge/mesh-network-adapter.d.ts.map +0 -1
- package/src/automerge/mesh-network-adapter.ts +0 -107
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type SublevelDB } from '@dxos/kv-store';
|
|
2
2
|
import { type Directory } from '@dxos/random-access-storage';
|
|
3
3
|
export declare const levelMigration: ({ db, directory }: {
|
|
4
|
-
db:
|
|
4
|
+
db: SublevelDB;
|
|
5
5
|
directory: Directory;
|
|
6
6
|
}) => Promise<void>;
|
|
7
7
|
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type DelegateInvitationCredential } from '@dxos/credentials';
|
|
1
|
+
import { type DelegateInvitationCredential, type MemberInfo } from '@dxos/credentials';
|
|
2
2
|
import { type FeedStore } from '@dxos/feed-store';
|
|
3
3
|
import { PublicKey } from '@dxos/keys';
|
|
4
4
|
import { type NetworkManager } from '@dxos/network-manager';
|
|
@@ -31,6 +31,7 @@ export type ConstructSpaceParams = {
|
|
|
31
31
|
onAuthorizedConnection: (session: Teleport) => void;
|
|
32
32
|
onAuthFailure?: (session: Teleport) => void;
|
|
33
33
|
onDelegatedInvitationStatusChange: (invitation: DelegateInvitationCredential, isActive: boolean) => Promise<void>;
|
|
34
|
+
onMemberRolesChanged: (member: MemberInfo[]) => Promise<void>;
|
|
34
35
|
};
|
|
35
36
|
/**
|
|
36
37
|
* Manages a collection of ECHO (Data) Spaces.
|
|
@@ -47,6 +48,6 @@ export declare class SpaceManager {
|
|
|
47
48
|
get spaces(): ComplexMap<PublicKey, Space>;
|
|
48
49
|
open(): Promise<void>;
|
|
49
50
|
close(): Promise<void>;
|
|
50
|
-
constructSpace({ metadata, swarmIdentity, onAuthorizedConnection, onAuthFailure, onDelegatedInvitationStatusChange, memberKey, }: ConstructSpaceParams): Promise<Space>;
|
|
51
|
+
constructSpace({ metadata, swarmIdentity, onAuthorizedConnection, onAuthFailure, onDelegatedInvitationStatusChange, onMemberRolesChanged, memberKey, }: ConstructSpaceParams): Promise<Space>;
|
|
51
52
|
}
|
|
52
53
|
//# sourceMappingURL=space-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"space-manager.d.ts","sourceRoot":"","sources":["../../../../src/space/space-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"space-manager.d.ts","sourceRoot":"","sources":["../../../../src/space/space-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,4BAA4B,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEvF,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAClC,cAAc,EAAE,cAAc,CAAC;IAC/B,aAAa,EAAE,aAAa,CAAC;IAE7B;;OAEG;IACH,aAAa,EAAE,aAAa,CAAC;IAE7B,SAAS,EAAE,SAAS,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,aAAa,CAAC;IACxB,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB;;OAEG;IACH,sBAAsB,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;IACpD,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC5C,iCAAiC,EAAE,CAAC,UAAU,EAAE,4BAA4B,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClH,oBAAoB,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D,CAAC;AAEF;;GAEG;AACH,qBACa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoD;IAC5E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAE9C,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,kBAAkB;IAUtG,IAAI,MAAM,iCAET;IAGK,IAAI;IAGJ,KAAK;IAIL,cAAc,CAAC,EACnB,QAAQ,EACR,aAAa,EACb,sBAAsB,EACtB,aAAa,EACb,iCAAiC,EACjC,oBAAoB,EACpB,SAAS,GACV,EAAE,oBAAoB;CAkCxB"}
|
|
@@ -40,6 +40,7 @@ export declare class SpaceProtocol {
|
|
|
40
40
|
private readonly _spaceKey;
|
|
41
41
|
private readonly _feeds;
|
|
42
42
|
private readonly _sessions;
|
|
43
|
+
private readonly _topology;
|
|
43
44
|
private _connection?;
|
|
44
45
|
get sessions(): ReadonlyMap<PublicKey, SpaceProtocolSession>;
|
|
45
46
|
get feeds(): ReadonlySet<FeedWrapper<FeedMessage>>;
|
|
@@ -47,6 +48,7 @@ export declare class SpaceProtocol {
|
|
|
47
48
|
constructor({ topic, swarmIdentity, networkManager, onSessionAuth, onAuthFailure, blobStore }: SpaceProtocolOptions);
|
|
48
49
|
addFeed(feed: FeedWrapper<FeedMessage>): void;
|
|
49
50
|
start(): Promise<void>;
|
|
51
|
+
updateTopology(): void;
|
|
50
52
|
stop(): Promise<void>;
|
|
51
53
|
private _createProtocolProvider;
|
|
52
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"space-protocol.d.ts","sourceRoot":"","sources":["../../../../src/space/space-protocol.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAEL,KAAK,cAAc,EAEnB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EAExB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,KAAK,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAE,KAAK,SAAS,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAI1E,OAAO,EAAiB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAC;AAE7E,eAAO,MAAM,kBAAkB,EAAE,YAA+D,CAAC;AACjG,eAAO,MAAM,kBAAkB,EAAE,YAAwE,CAAC;AAG1G,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,SAAS,CAAC;IACnB,kBAAkB,EAAE,YAAY,CAAC;IACjC,uBAAuB,EAAE,YAAY,CAAC;CACvC;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,SAAS,CAAC;IACjB,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAE/B,SAAS,EAAE,SAAS,CAAC;IAErB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC5C,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;CAC7C,CAAC;AAEF;;GAEG;AACH,qBACa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA8B;IAC9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA8B;IAE9D,SAAgB,QAAQ,EAAE,QAAQ,CAAC;IAInC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAG5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IAEtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmE;IAE7F,OAAO,CAAC,WAAW,CAAC,CAAkB;IAEtC,IAAI,QAAQ,IAAI,WAAW,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAE3D;IAED,IAAI,KAAK,IAAI,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAEjD;IAGD,OAAO,KAAK,WAAW,GAEtB;gBAEW,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,oBAAoB;IAanH,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC;IAUhC,KAAK;
|
|
1
|
+
{"version":3,"file":"space-protocol.d.ts","sourceRoot":"","sources":["../../../../src/space/space-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Event } from '@dxos/async';
|
|
2
|
-
import {
|
|
3
|
-
import { type FeedInfo, type
|
|
2
|
+
import { type Context, Resource } from '@dxos/context';
|
|
3
|
+
import { type DelegateInvitationCredential, type FeedInfo, type MemberInfo } 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';
|
|
7
7
|
import { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';
|
|
8
8
|
import { type Timeframe } from '@dxos/timeframe';
|
|
9
|
-
import {
|
|
9
|
+
import { type AsyncCallback, Callback } from '@dxos/util';
|
|
10
10
|
import { type SpaceProtocol } from './space-protocol';
|
|
11
11
|
import { type SnapshotManager } from '../db-host';
|
|
12
12
|
import { type MetadataStore } from '../metadata';
|
|
@@ -22,6 +22,7 @@ export type SpaceParams = {
|
|
|
22
22
|
memberKey: PublicKey;
|
|
23
23
|
snapshotId?: string | undefined;
|
|
24
24
|
onDelegatedInvitationStatusChange: (invitation: DelegateInvitationCredential, isActive: boolean) => Promise<void>;
|
|
25
|
+
onMemberRolesChanged: (member: MemberInfo[]) => Promise<void>;
|
|
25
26
|
};
|
|
26
27
|
export type CreatePipelineParams = {
|
|
27
28
|
start: Timeframe;
|
|
@@ -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,
|
|
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,EAAkB,QAAQ,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,KAAK,4BAA4B,EAAE,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACtG,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,KAAK,aAAa,EAAE,QAAQ,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;IAEhC,iCAAiC,EAAE,CAAC,UAAU,EAAE,4BAA4B,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClH,oBAAoB,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,SAAS,CAAC;CAElB,CAAC;AAEF;;GAEG;AAEH,qBAEa,KAAM,SAAQ,QAAQ;IACjC,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,YAAY,CAAC,CAA2B;IAChD,OAAO,CAAC,SAAS,CAAC,CAA2B;gBAEjC,MAAM,EAAE,WAAW;IAkD/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;cAKJ,KAAK,CAAC,GAAG,EAAE,OAAO;cAWlB,MAAM;CAShC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-agent-builder.d.ts","sourceRoot":"","sources":["../../../../src/testing/test-agent-builder.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAuB,0BAA0B,EAA0B,MAAM,iBAAiB,CAAC;AAC1G,OAAO,EAA0B,cAAc,EAAoC,MAAM,uBAAuB,CAAC;AACjH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAGxE,OAAO,EAA8B,KAAK,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAGjE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAA0C,YAAY,EAAE,aAAa,EAAE,KAAK,KAAK,EAAE,MAAM,UAAU,CAAC;AAE3G,MAAM,MAAM,sBAAsB,GAAG,MAAM,cAAc,CAAC;AAE1D,eAAO,MAAM,4BAA4B,kBACvB,0BAA0B,KAAG,sBAKzC,CAAC;AAEP,eAAO,MAAM,+BAA+B,cAC9B,MAAM,KAAG,sBAKjB,CAAC;AAEP,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;CACjD,CAAC;AAEF;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwD;IAChF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAyB;gBAErD,EAAE,OAAO,EAAE,sBAAsB,EAAE,GAAE,uBAA4B;IAMvE,KAAK;IAIX,IAAI,MAAM,gBAET;IAED,QAAQ,CAAC,SAAS,EAAE,SAAS;IAIvB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC;CAYvC;AAED;;GAEG;AACH,qBAAa,SAAS;IAuBlB,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY;aACb,WAAW,EAAE,SAAS;aACtB,SAAS,EAAE,SAAS;IAzBtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoD;IAE5E,SAAgB,OAAO,EAAE,OAAO,CAAC;IACjC,SAAgB,OAAO,EAAE,OAAO,CAAC;IACjC,SAAgB,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAElD,OAAO,CAAC,cAAc,CAAC,CAAgB;IACvC,IAAI,aAAa,kBAEhB;IAED,OAAO,CAAC,cAAc,CAAC,CAAgB;IACvC,IAAI,aAAa,kBAEhB;IAED,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,IAAI,SAAS,cAEZ;gBAGkB,uBAAuB,EAAE,sBAAsB,EAC/C,YAAY,EAAE,eAAe,EAC9B,WAAW,EAAE,SAAS,EACtB,SAAS,EAAE,SAAS;IAOhC,KAAK;IAIX,IAAI,MAAM,YAET;IAED,QAAQ,CAAC,QAAQ,EAAE,SAAS;IAI5B,OAAO,CAAC,aAAa,CAAC,CAAe;IACrC,IAAI,YAAY,iBAQf;IAEK,WAAW,CACf,WAAW,GAAE,SAA4B,EACzC,QAAQ,CAAC,EAAE,SAAS,EACpB,UAAU,CAAC,EAAE,SAAS,EACtB,OAAO,CAAC,EAAE,SAAS,EACnB,YAAY,UAAQ,GACnB,OAAO,CAAC,KAAK,CAAC;
|
|
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.
|
|
3
|
+
"version": "0.5.3-main.088a2c8",
|
|
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.
|
|
43
|
-
"@dxos/automerge": "0.5.
|
|
44
|
-
"@dxos/codec-protobuf": "0.5.
|
|
45
|
-
"@dxos/context": "0.5.
|
|
46
|
-
"@dxos/
|
|
47
|
-
"@dxos/
|
|
48
|
-
"@dxos/debug": "0.5.
|
|
49
|
-
"@dxos/echo-protocol": "0.5.
|
|
50
|
-
"@dxos/echo-schema": "0.5.
|
|
51
|
-
"@dxos/hypercore": "0.5.
|
|
52
|
-
"@dxos/
|
|
53
|
-
"@dxos/
|
|
54
|
-
"@dxos/
|
|
55
|
-
"@dxos/
|
|
56
|
-
"@dxos/
|
|
57
|
-
"@dxos/
|
|
58
|
-
"@dxos/messaging": "0.5.
|
|
59
|
-
"@dxos/
|
|
60
|
-
"@dxos/network-manager": "0.5.
|
|
61
|
-
"@dxos/
|
|
62
|
-
"@dxos/
|
|
63
|
-
"@dxos/
|
|
64
|
-
"@dxos/
|
|
65
|
-
"@dxos/teleport
|
|
66
|
-
"@dxos/teleport": "0.5.
|
|
67
|
-
"@dxos/teleport-extension-
|
|
68
|
-
"@dxos/teleport-extension-replicator": "0.5.
|
|
69
|
-
"@dxos/teleport-extension-
|
|
70
|
-
"@dxos/
|
|
71
|
-
"@dxos/
|
|
72
|
-
"@dxos/
|
|
73
|
-
"@dxos/util": "0.5.
|
|
42
|
+
"@dxos/async": "0.5.3-main.088a2c8",
|
|
43
|
+
"@dxos/automerge": "0.5.3-main.088a2c8",
|
|
44
|
+
"@dxos/codec-protobuf": "0.5.3-main.088a2c8",
|
|
45
|
+
"@dxos/context": "0.5.3-main.088a2c8",
|
|
46
|
+
"@dxos/crypto": "0.5.3-main.088a2c8",
|
|
47
|
+
"@dxos/credentials": "0.5.3-main.088a2c8",
|
|
48
|
+
"@dxos/debug": "0.5.3-main.088a2c8",
|
|
49
|
+
"@dxos/echo-protocol": "0.5.3-main.088a2c8",
|
|
50
|
+
"@dxos/echo-schema": "0.5.3-main.088a2c8",
|
|
51
|
+
"@dxos/hypercore": "0.5.3-main.088a2c8",
|
|
52
|
+
"@dxos/feed-store": "0.5.3-main.088a2c8",
|
|
53
|
+
"@dxos/invariant": "0.5.3-main.088a2c8",
|
|
54
|
+
"@dxos/indexing": "0.5.3-main.088a2c8",
|
|
55
|
+
"@dxos/kv-store": "0.5.3-main.088a2c8",
|
|
56
|
+
"@dxos/keyring": "0.5.3-main.088a2c8",
|
|
57
|
+
"@dxos/keys": "0.5.3-main.088a2c8",
|
|
58
|
+
"@dxos/messaging": "0.5.3-main.088a2c8",
|
|
59
|
+
"@dxos/log": "0.5.3-main.088a2c8",
|
|
60
|
+
"@dxos/network-manager": "0.5.3-main.088a2c8",
|
|
61
|
+
"@dxos/protocols": "0.5.3-main.088a2c8",
|
|
62
|
+
"@dxos/node-std": "0.5.3-main.088a2c8",
|
|
63
|
+
"@dxos/random-access-storage": "0.5.3-main.088a2c8",
|
|
64
|
+
"@dxos/rpc": "0.5.3-main.088a2c8",
|
|
65
|
+
"@dxos/teleport": "0.5.3-main.088a2c8",
|
|
66
|
+
"@dxos/teleport-extension-gossip": "0.5.3-main.088a2c8",
|
|
67
|
+
"@dxos/teleport-extension-object-sync": "0.5.3-main.088a2c8",
|
|
68
|
+
"@dxos/teleport-extension-replicator": "0.5.3-main.088a2c8",
|
|
69
|
+
"@dxos/teleport-extension-automerge-replicator": "0.5.3-main.088a2c8",
|
|
70
|
+
"@dxos/timeframe": "0.5.3-main.088a2c8",
|
|
71
|
+
"@dxos/typings": "0.5.3-main.088a2c8",
|
|
72
|
+
"@dxos/tracing": "0.5.3-main.088a2c8",
|
|
73
|
+
"@dxos/util": "0.5.3-main.088a2c8"
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
76
|
"fast-check": "^3.15.1",
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
} from '@dxos/automerge/automerge-repo';
|
|
18
18
|
import { IndexMetadataStore } from '@dxos/indexing';
|
|
19
19
|
import { invariant } from '@dxos/invariant';
|
|
20
|
+
import { PublicKey } from '@dxos/keys';
|
|
20
21
|
import { createTestLevel } from '@dxos/kv-store/testing';
|
|
21
22
|
import { log } from '@dxos/log';
|
|
22
23
|
import { TestBuilder as TeleportBuilder, TestPeer as TeleportPeer } from '@dxos/teleport/testing';
|
|
@@ -24,8 +25,9 @@ import { afterTest, describe, openAndClose, test } from '@dxos/test';
|
|
|
24
25
|
import { arrayToBuffer, bufferToArray } from '@dxos/util';
|
|
25
26
|
|
|
26
27
|
import { AutomergeHost } from './automerge-host';
|
|
28
|
+
import { EchoNetworkAdapter } from './echo-network-adapter';
|
|
27
29
|
import { LevelDBStorageAdapter } from './leveldb-storage-adapter';
|
|
28
|
-
import {
|
|
30
|
+
import { MeshEchoReplicator } from './mesh-echo-replicator';
|
|
29
31
|
|
|
30
32
|
describe('AutomergeHost', () => {
|
|
31
33
|
test('can create documents', async () => {
|
|
@@ -267,16 +269,24 @@ describe('AutomergeHost', () => {
|
|
|
267
269
|
});
|
|
268
270
|
|
|
269
271
|
test('integration test with teleport', async () => {
|
|
270
|
-
const
|
|
271
|
-
|
|
272
|
+
const [spaceKey] = PublicKey.randomSequence();
|
|
273
|
+
|
|
274
|
+
const createAutomergeRepo = async () => {
|
|
275
|
+
const meshAdapter = new MeshEchoReplicator();
|
|
276
|
+
const echoAdapter = new EchoNetworkAdapter({
|
|
277
|
+
getContainingSpaceForDocument: async () => spaceKey,
|
|
278
|
+
});
|
|
272
279
|
const repo = new Repo({
|
|
273
|
-
network: [
|
|
280
|
+
network: [echoAdapter],
|
|
274
281
|
});
|
|
275
|
-
|
|
282
|
+
await echoAdapter.open();
|
|
283
|
+
await echoAdapter.whenConnected();
|
|
284
|
+
await echoAdapter.addReplicator(meshAdapter);
|
|
276
285
|
return { repo, meshAdapter };
|
|
277
286
|
};
|
|
278
|
-
const peer1 = createAutomergeRepo();
|
|
279
|
-
const peer2 = createAutomergeRepo();
|
|
287
|
+
const peer1 = await createAutomergeRepo();
|
|
288
|
+
const peer2 = await createAutomergeRepo();
|
|
289
|
+
|
|
280
290
|
const handle = peer1.repo.create();
|
|
281
291
|
|
|
282
292
|
const teleportBuilder = new TeleportBuilder();
|
|
@@ -294,8 +304,11 @@ describe('AutomergeHost', () => {
|
|
|
294
304
|
handle.change((doc: any) => {
|
|
295
305
|
doc.text = text;
|
|
296
306
|
});
|
|
297
|
-
|
|
298
|
-
|
|
307
|
+
await waitForExpect(async () => {
|
|
308
|
+
const docOnPeer2 = peer2.repo.find(handle.url);
|
|
309
|
+
const doc = await asyncTimeout(docOnPeer2.doc(), 1000);
|
|
310
|
+
expect(doc.text).toEqual(text);
|
|
311
|
+
}, 1000);
|
|
299
312
|
}
|
|
300
313
|
|
|
301
314
|
const offlineText = 'This has been written while the connection was off';
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { Event } from '@dxos/async';
|
|
6
|
-
import {
|
|
6
|
+
import { next as automerge, getBackend, getHeads, type Doc, type Heads } from '@dxos/automerge/automerge';
|
|
7
7
|
import {
|
|
8
|
-
type DocHandle,
|
|
9
8
|
Repo,
|
|
9
|
+
type DocHandle,
|
|
10
|
+
type DocHandleChangePayload,
|
|
10
11
|
type DocumentId,
|
|
11
12
|
type PeerId,
|
|
12
13
|
type StorageAdapterInterface,
|
|
13
|
-
type DocHandleChangePayload,
|
|
14
14
|
} from '@dxos/automerge/automerge-repo';
|
|
15
15
|
import { type Stream } from '@dxos/codec-protobuf';
|
|
16
16
|
import { Context, type Lifecycle } from '@dxos/context';
|
|
@@ -18,7 +18,7 @@ import { type SpaceDoc } from '@dxos/echo-protocol';
|
|
|
18
18
|
import { type IndexMetadataStore } from '@dxos/indexing';
|
|
19
19
|
import { invariant } from '@dxos/invariant';
|
|
20
20
|
import { PublicKey } from '@dxos/keys';
|
|
21
|
-
import { type
|
|
21
|
+
import { type SublevelDB } from '@dxos/kv-store';
|
|
22
22
|
import { log } from '@dxos/log';
|
|
23
23
|
import { idCodec } from '@dxos/protocols';
|
|
24
24
|
import {
|
|
@@ -28,22 +28,20 @@ import {
|
|
|
28
28
|
type SyncRepoResponse,
|
|
29
29
|
} from '@dxos/protocols/proto/dxos/echo/service';
|
|
30
30
|
import { type Directory } from '@dxos/random-access-storage';
|
|
31
|
-
import { type AutomergeReplicator } from '@dxos/teleport-extension-automerge-replicator';
|
|
32
31
|
import { trace } from '@dxos/tracing';
|
|
33
|
-
import {
|
|
32
|
+
import { mapValues } from '@dxos/util';
|
|
34
33
|
|
|
35
34
|
import { EchoNetworkAdapter } from './echo-network-adapter';
|
|
36
35
|
import { type EchoReplicator } from './echo-replicator';
|
|
37
|
-
import { type BeforeSaveParams
|
|
36
|
+
import { LevelDBStorageAdapter, type BeforeSaveParams } from './leveldb-storage-adapter';
|
|
38
37
|
import { LocalHostNetworkAdapter } from './local-host-network-adapter';
|
|
39
|
-
import { MeshNetworkAdapter } from './mesh-network-adapter';
|
|
40
38
|
import { levelMigration } from './migrations';
|
|
41
39
|
|
|
42
40
|
// TODO: Remove
|
|
43
41
|
export type { DocumentId };
|
|
44
42
|
|
|
45
43
|
export type AutomergeHostParams = {
|
|
46
|
-
db:
|
|
44
|
+
db: SublevelDB;
|
|
47
45
|
/**
|
|
48
46
|
* For migration purposes.
|
|
49
47
|
*/
|
|
@@ -57,22 +55,18 @@ export class AutomergeHost {
|
|
|
57
55
|
private readonly _indexMetadataStore: IndexMetadataStore;
|
|
58
56
|
private readonly _ctx = new Context();
|
|
59
57
|
private readonly _directory?: Directory;
|
|
60
|
-
private readonly _db:
|
|
61
|
-
private readonly _echoNetworkAdapter = new EchoNetworkAdapter(
|
|
58
|
+
private readonly _db: SublevelDB;
|
|
59
|
+
private readonly _echoNetworkAdapter = new EchoNetworkAdapter({
|
|
60
|
+
getContainingSpaceForDocument: this._getContainingSpaceForDocument.bind(this),
|
|
61
|
+
});
|
|
62
62
|
|
|
63
63
|
private _repo!: Repo;
|
|
64
|
-
private _meshNetwork!: MeshNetworkAdapter;
|
|
65
64
|
private _clientNetwork!: LocalHostNetworkAdapter;
|
|
66
65
|
private _storage!: StorageAdapterInterface & Lifecycle;
|
|
67
66
|
|
|
68
67
|
@trace.info()
|
|
69
68
|
private _peerId!: string;
|
|
70
69
|
|
|
71
|
-
/**
|
|
72
|
-
* spaceKey -> deviceKey[]
|
|
73
|
-
*/
|
|
74
|
-
private readonly _authorizedDevices = new ComplexMap<PublicKey, ComplexSet<PublicKey>>(PublicKey.hash);
|
|
75
|
-
|
|
76
70
|
public _requestedDocs = new Set<string>();
|
|
77
71
|
|
|
78
72
|
constructor({ directory, db, indexMetadataStore }: AutomergeHostParams) {
|
|
@@ -94,72 +88,16 @@ export class AutomergeHost {
|
|
|
94
88
|
await this._storage.open?.();
|
|
95
89
|
this._peerId = `host-${PublicKey.random().toHex()}` as PeerId;
|
|
96
90
|
|
|
97
|
-
this._meshNetwork = new MeshNetworkAdapter();
|
|
98
91
|
this._clientNetwork = new LocalHostNetworkAdapter();
|
|
99
92
|
|
|
100
93
|
this._repo = new Repo({
|
|
101
94
|
peerId: this._peerId as PeerId,
|
|
102
|
-
network: [this._clientNetwork, this.
|
|
95
|
+
network: [this._clientNetwork, this._echoNetworkAdapter],
|
|
103
96
|
storage: this._storage,
|
|
104
97
|
|
|
105
|
-
|
|
106
|
-
// Hosts, running in the worker, don't share documents unless requested by other peers.
|
|
107
|
-
sharePolicy: async (peerId /* device key */, documentId /* space key */) => {
|
|
108
|
-
if (peerId.startsWith('client-')) {
|
|
109
|
-
return false; // Only send docs to clients if they are requested.
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (!documentId) {
|
|
113
|
-
return false;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
const peerMetadata = this.repo.peerMetadataByPeerId[peerId];
|
|
117
|
-
if ((peerMetadata as any)?.dxos_peerSource === 'EchoNetworkAdapter') {
|
|
118
|
-
return this._echoNetworkAdapter.shouldAdvertize(peerId, { documentId });
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
const doc = this._repo.handles[documentId]?.docSync();
|
|
122
|
-
if (!doc) {
|
|
123
|
-
const isRequested = this._requestedDocs.has(`automerge:${documentId}`);
|
|
124
|
-
log('doc share policy check', { peerId, documentId, isRequested });
|
|
125
|
-
return isRequested;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
try {
|
|
129
|
-
const spaceKey = getSpaceKeyFromDoc(doc);
|
|
130
|
-
if (!spaceKey) {
|
|
131
|
-
log('space key not found for share policy check', { peerId, documentId });
|
|
132
|
-
return false;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const authorizedDevices = this._authorizedDevices.get(PublicKey.from(spaceKey));
|
|
136
|
-
|
|
137
|
-
// TODO(mykola): Hack, stop abusing `peerMetadata` field.
|
|
138
|
-
const deviceKeyHex = (peerMetadata as any)?.dxos_deviceKey;
|
|
139
|
-
if (!deviceKeyHex) {
|
|
140
|
-
log('device key not found for share policy check', { peerId, documentId });
|
|
141
|
-
return false;
|
|
142
|
-
}
|
|
143
|
-
const deviceKey = PublicKey.from(deviceKeyHex);
|
|
144
|
-
|
|
145
|
-
const isAuthorized = authorizedDevices?.has(deviceKey) ?? false;
|
|
146
|
-
log('share policy check', {
|
|
147
|
-
localPeer: this._peerId,
|
|
148
|
-
remotePeer: peerId,
|
|
149
|
-
documentId,
|
|
150
|
-
deviceKey,
|
|
151
|
-
spaceKey,
|
|
152
|
-
isAuthorized,
|
|
153
|
-
});
|
|
154
|
-
return isAuthorized;
|
|
155
|
-
} catch (err) {
|
|
156
|
-
log.catch(err);
|
|
157
|
-
return false;
|
|
158
|
-
}
|
|
159
|
-
},
|
|
98
|
+
sharePolicy: this._sharePolicy.bind(this),
|
|
160
99
|
});
|
|
161
100
|
this._clientNetwork.ready();
|
|
162
|
-
this._meshNetwork.ready();
|
|
163
101
|
await this._echoNetworkAdapter.open();
|
|
164
102
|
|
|
165
103
|
await this._clientNetwork.whenConnected();
|
|
@@ -185,6 +123,41 @@ export class AutomergeHost {
|
|
|
185
123
|
await this._echoNetworkAdapter.removeReplicator(replicator);
|
|
186
124
|
}
|
|
187
125
|
|
|
126
|
+
// TODO(dmaretskyi): Share based on HALO permissions and space affinity.
|
|
127
|
+
// Hosts, running in the worker, don't share documents unless requested by other peers.
|
|
128
|
+
// NOTE: If both peers return sharePolicy=false the replication will not happen
|
|
129
|
+
// https://github.com/automerge/automerge-repo/pull/292
|
|
130
|
+
private async _sharePolicy(
|
|
131
|
+
peerId: PeerId /* device key */,
|
|
132
|
+
documentId?: DocumentId /* space key */,
|
|
133
|
+
): Promise<boolean> {
|
|
134
|
+
if (peerId.startsWith('client-')) {
|
|
135
|
+
return false; // Only send docs to clients if they are requested.
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (!documentId) {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Workaround for https://github.com/automerge/automerge-repo/pull/292
|
|
143
|
+
// NOTE: This must override the per-connection policy.
|
|
144
|
+
const doc = this._repo.handles[documentId]?.docSync();
|
|
145
|
+
if (!doc) {
|
|
146
|
+
// TODO(dmaretskyi): Verify that this works as intended.
|
|
147
|
+
// TODO(dmaretskyi): Move to MESH replicator?
|
|
148
|
+
const isRequested = this._requestedDocs.has(`automerge:${documentId}`);
|
|
149
|
+
log('doc share policy check', { peerId, documentId, isRequested });
|
|
150
|
+
return isRequested;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const peerMetadata = this.repo.peerMetadataByPeerId[peerId];
|
|
154
|
+
if ((peerMetadata as any)?.dxos_peerSource === 'EchoNetworkAdapter') {
|
|
155
|
+
return this._echoNetworkAdapter.shouldAdvertize(peerId, { documentId });
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
|
|
188
161
|
private async _beforeSave({ path, batch }: BeforeSaveParams) {
|
|
189
162
|
const handle = this._repo.handles[path[0] as DocumentId];
|
|
190
163
|
if (!handle) {
|
|
@@ -241,6 +214,20 @@ export class AutomergeHost {
|
|
|
241
214
|
return this._repo.peers;
|
|
242
215
|
}
|
|
243
216
|
|
|
217
|
+
private async _getContainingSpaceForDocument(documentId: string): Promise<PublicKey | null> {
|
|
218
|
+
const doc = this._repo.handles[documentId as any]?.docSync();
|
|
219
|
+
if (!doc) {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const spaceKeyHex = getSpaceKeyFromDoc(doc);
|
|
224
|
+
if (!spaceKeyHex) {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return PublicKey.from(spaceKeyHex);
|
|
229
|
+
}
|
|
230
|
+
|
|
244
231
|
//
|
|
245
232
|
// Methods for client-services.
|
|
246
233
|
//
|
|
@@ -269,19 +256,6 @@ export class AutomergeHost {
|
|
|
269
256
|
async getHostInfo(): Promise<HostInfo> {
|
|
270
257
|
return this._clientNetwork.getHostInfo();
|
|
271
258
|
}
|
|
272
|
-
|
|
273
|
-
//
|
|
274
|
-
// Mesh replication.
|
|
275
|
-
//
|
|
276
|
-
|
|
277
|
-
createExtension(): AutomergeReplicator {
|
|
278
|
-
return this._meshNetwork.createExtension();
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
authorizeDevice(spaceKey: PublicKey, deviceKey: PublicKey) {
|
|
282
|
-
log('authorizeDevice', { spaceKey, deviceKey });
|
|
283
|
-
defaultMap(this._authorizedDevices, spaceKey, () => new ComplexSet(PublicKey.hash)).add(deviceKey);
|
|
284
|
-
}
|
|
285
259
|
}
|
|
286
260
|
|
|
287
261
|
export const getSpaceKeyFromDoc = (doc: any): string | null => {
|
|
@@ -6,10 +6,15 @@ import { Trigger, synchronized } from '@dxos/async';
|
|
|
6
6
|
import { type Message, NetworkAdapter, type PeerId, type PeerMetadata } from '@dxos/automerge/automerge-repo';
|
|
7
7
|
import { LifecycleState } from '@dxos/context';
|
|
8
8
|
import { invariant } from '@dxos/invariant';
|
|
9
|
+
import { type PublicKey } from '@dxos/keys';
|
|
9
10
|
import { log } from '@dxos/log';
|
|
10
11
|
|
|
11
12
|
import { type EchoReplicator, type ReplicatorConnection, type ShouldAdvertizeParams } from './echo-replicator';
|
|
12
13
|
|
|
14
|
+
export type EchoNetworkAdapterParams = {
|
|
15
|
+
getContainingSpaceForDocument: (documentId: string) => Promise<PublicKey | null>;
|
|
16
|
+
};
|
|
17
|
+
|
|
13
18
|
/**
|
|
14
19
|
* Manages a set of {@link EchoReplicator} instances.
|
|
15
20
|
*/
|
|
@@ -22,6 +27,10 @@ export class EchoNetworkAdapter extends NetworkAdapter {
|
|
|
22
27
|
private _lifecycleState: LifecycleState = LifecycleState.CLOSED;
|
|
23
28
|
private readonly _connected = new Trigger();
|
|
24
29
|
|
|
30
|
+
constructor(private readonly _params: EchoNetworkAdapterParams) {
|
|
31
|
+
super();
|
|
32
|
+
}
|
|
33
|
+
|
|
25
34
|
override connect(peerId: PeerId, peerMetadata?: PeerMetadata | undefined): void {
|
|
26
35
|
this.peerId = peerId;
|
|
27
36
|
this.peerMetadata = peerMetadata;
|
|
@@ -51,6 +60,7 @@ export class EchoNetworkAdapter extends NetworkAdapter {
|
|
|
51
60
|
invariant(this._lifecycleState === LifecycleState.CLOSED);
|
|
52
61
|
this._lifecycleState = LifecycleState.OPEN;
|
|
53
62
|
|
|
63
|
+
log('emit ready');
|
|
54
64
|
this.emit('ready', {
|
|
55
65
|
network: this,
|
|
56
66
|
});
|
|
@@ -74,20 +84,26 @@ export class EchoNetworkAdapter extends NetworkAdapter {
|
|
|
74
84
|
|
|
75
85
|
@synchronized
|
|
76
86
|
async addReplicator(replicator: EchoReplicator) {
|
|
87
|
+
invariant(this._lifecycleState === LifecycleState.OPEN);
|
|
77
88
|
invariant(this.peerId);
|
|
78
89
|
invariant(!this._replicators.has(replicator));
|
|
79
90
|
|
|
91
|
+
this._replicators.add(replicator);
|
|
80
92
|
await replicator.connect({
|
|
81
93
|
peerId: this.peerId,
|
|
82
94
|
onConnectionOpen: this._onConnectionOpen.bind(this),
|
|
83
95
|
onConnectionClosed: this._onConnectionClosed.bind(this),
|
|
96
|
+
getContainingSpaceForDocument: this._params.getContainingSpaceForDocument,
|
|
84
97
|
});
|
|
85
98
|
}
|
|
86
99
|
|
|
87
100
|
@synchronized
|
|
88
101
|
async removeReplicator(replicator: EchoReplicator) {
|
|
102
|
+
invariant(this._lifecycleState === LifecycleState.OPEN);
|
|
89
103
|
invariant(this._replicators.has(replicator));
|
|
104
|
+
('');
|
|
90
105
|
await replicator.disconnect();
|
|
106
|
+
this._replicators.delete(replicator);
|
|
91
107
|
}
|
|
92
108
|
|
|
93
109
|
async shouldAdvertize(peerId: PeerId, params: ShouldAdvertizeParams): Promise<boolean> {
|
|
@@ -100,6 +116,7 @@ export class EchoNetworkAdapter extends NetworkAdapter {
|
|
|
100
116
|
}
|
|
101
117
|
|
|
102
118
|
private _onConnectionOpen(connection: ReplicatorConnection) {
|
|
119
|
+
log('Connection opened', { peerId: connection.peerId });
|
|
103
120
|
invariant(!this._connections.has(connection.peerId as PeerId));
|
|
104
121
|
const reader = connection.readable.getReader();
|
|
105
122
|
const writer = connection.writable.getWriter();
|
|
@@ -124,6 +141,7 @@ export class EchoNetworkAdapter extends NetworkAdapter {
|
|
|
124
141
|
}
|
|
125
142
|
});
|
|
126
143
|
|
|
144
|
+
log('emit peer-candidate', { peerId: connection.peerId });
|
|
127
145
|
this.emit('peer-candidate', {
|
|
128
146
|
peerId: connection.peerId as PeerId,
|
|
129
147
|
peerMetadata: {
|
|
@@ -134,6 +152,7 @@ export class EchoNetworkAdapter extends NetworkAdapter {
|
|
|
134
152
|
}
|
|
135
153
|
|
|
136
154
|
private _onConnectionClosed(connection: ReplicatorConnection) {
|
|
155
|
+
log('Connection closed', { peerId: connection.peerId });
|
|
137
156
|
const entry = this._connections.get(connection.peerId as PeerId);
|
|
138
157
|
invariant(entry);
|
|
139
158
|
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
//
|
|
4
4
|
|
|
5
5
|
import { type Message } from '@dxos/automerge/automerge-repo';
|
|
6
|
+
import { type PublicKey } from '@dxos/keys';
|
|
6
7
|
|
|
7
8
|
export interface EchoReplicator {
|
|
8
9
|
/**
|
|
@@ -25,6 +26,8 @@ export interface EchoReplicatorContext {
|
|
|
25
26
|
onConnectionOpen(connection: ReplicatorConnection): void;
|
|
26
27
|
|
|
27
28
|
onConnectionClosed(connection: ReplicatorConnection): void;
|
|
29
|
+
|
|
30
|
+
getContainingSpaceForDocument(documentId: string): Promise<PublicKey | null>;
|
|
28
31
|
}
|
|
29
32
|
|
|
30
33
|
export interface ReplicatorConnection {
|
package/src/automerge/index.ts
CHANGED
|
@@ -7,5 +7,5 @@ export * from './automerge-storage-adapter';
|
|
|
7
7
|
export * from './automerge-doc-loader';
|
|
8
8
|
export * from './leveldb-storage-adapter';
|
|
9
9
|
export * from './local-host-network-adapter';
|
|
10
|
-
export * from './mesh-
|
|
10
|
+
export * from './mesh-echo-replicator';
|
|
11
11
|
export * from './echo-replicator';
|
|
@@ -6,11 +6,11 @@ import { type MixedEncoding } from 'level-transcoder';
|
|
|
6
6
|
|
|
7
7
|
import { type StorageAdapterInterface, type Chunk, type StorageKey } from '@dxos/automerge/automerge-repo';
|
|
8
8
|
import { LifecycleState, Resource } from '@dxos/context';
|
|
9
|
-
import { type BatchLevel, type
|
|
9
|
+
import { type BatchLevel, type SublevelDB } from '@dxos/kv-store';
|
|
10
10
|
import { type MaybePromise } from '@dxos/util';
|
|
11
11
|
|
|
12
12
|
export type LevelDBStorageAdapterParams = {
|
|
13
|
-
db:
|
|
13
|
+
db: SublevelDB;
|
|
14
14
|
callbacks?: StorageCallbacks;
|
|
15
15
|
};
|
|
16
16
|
|