@dxos/echo-pipeline 0.5.9-main.a2de4fa → 0.5.9-main.a75fa71
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-I2J5TTHJ.mjs → chunk-HS77A4I4.mjs} +174 -23
- package/dist/lib/browser/{chunk-I2J5TTHJ.mjs.map → chunk-HS77A4I4.mjs.map} +4 -4
- package/dist/lib/browser/index.mjs +91 -42
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +11 -7
- package/dist/lib/browser/testing/index.mjs.map +1 -1
- package/dist/lib/node/{chunk-QPCNQ4ZK.cjs → chunk-Y5U7UXEL.cjs} +185 -34
- package/dist/lib/node/{chunk-QPCNQ4ZK.cjs.map → chunk-Y5U7UXEL.cjs.map} +4 -4
- package/dist/lib/node/index.cjs +126 -77
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +21 -17
- package/dist/lib/node/testing/index.cjs.map +1 -1
- package/dist/types/src/automerge/automerge-host.d.ts +40 -2
- package/dist/types/src/automerge/automerge-host.d.ts.map +1 -1
- package/dist/types/src/automerge/echo-network-adapter.d.ts +2 -0
- package/dist/types/src/automerge/echo-network-adapter.d.ts.map +1 -1
- package/dist/types/src/space/admission-discovery-extension.d.ts +30 -0
- package/dist/types/src/space/admission-discovery-extension.d.ts.map +1 -0
- package/dist/types/src/space/index.d.ts +1 -0
- package/dist/types/src/space/index.d.ts.map +1 -1
- package/dist/types/src/space/space-manager.d.ts +8 -0
- package/dist/types/src/space/space-manager.d.ts.map +1 -1
- package/package.json +33 -33
- package/src/automerge/automerge-host.ts +96 -18
- package/src/automerge/echo-network-adapter.ts +10 -4
- package/src/automerge/mesh-echo-replicator.ts +1 -1
- package/src/space/admission-discovery-extension.ts +90 -0
- package/src/space/index.ts +1 -0
- package/src/space/space-manager.ts +46 -1
|
@@ -3,6 +3,8 @@ import {
|
|
|
3
3
|
AuthExtension,
|
|
4
4
|
AuthStatus,
|
|
5
5
|
Buffer,
|
|
6
|
+
CredentialRetrieverExtension,
|
|
7
|
+
CredentialServerExtension,
|
|
6
8
|
DataServiceImpl,
|
|
7
9
|
MOCK_AUTH_PROVIDER,
|
|
8
10
|
MOCK_AUTH_VERIFIER,
|
|
@@ -23,14 +25,13 @@ import {
|
|
|
23
25
|
mapTimeframeToFeedIndexes,
|
|
24
26
|
startAfter,
|
|
25
27
|
valueEncoding
|
|
26
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-HS77A4I4.mjs";
|
|
27
29
|
|
|
28
30
|
// packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts
|
|
29
|
-
import { Event } from "@dxos/async";
|
|
30
|
-
import { next as automerge, getBackend, getHeads } from "@dxos/automerge/automerge";
|
|
31
|
+
import { Event, asyncTimeout } from "@dxos/async";
|
|
32
|
+
import { next as automerge, getBackend, getHeads, isAutomerge, save } from "@dxos/automerge/automerge";
|
|
31
33
|
import { Repo } from "@dxos/automerge/automerge-repo";
|
|
32
|
-
import { Context } from "@dxos/context";
|
|
33
|
-
import { invariant as invariant3 } from "@dxos/invariant";
|
|
34
|
+
import { Context, cancelWithContext } from "@dxos/context";
|
|
34
35
|
import { PublicKey } from "@dxos/keys";
|
|
35
36
|
import { objectPointerCodec } from "@dxos/protocols";
|
|
36
37
|
import { trace } from "@dxos/tracing";
|
|
@@ -318,10 +319,7 @@ var EchoNetworkAdapter = class extends NetworkAdapter {
|
|
|
318
319
|
_emitPeerCandidate(connection) {
|
|
319
320
|
this.emit("peer-candidate", {
|
|
320
321
|
peerId: connection.peerId,
|
|
321
|
-
peerMetadata:
|
|
322
|
-
// TODO(dmaretskyi): Refactor this.
|
|
323
|
-
dxos_peerSource: "EchoNetworkAdapter"
|
|
324
|
-
}
|
|
322
|
+
peerMetadata: createEchoPeerMetadata()
|
|
325
323
|
});
|
|
326
324
|
}
|
|
327
325
|
};
|
|
@@ -337,6 +335,11 @@ _ts_decorate([
|
|
|
337
335
|
_ts_decorate([
|
|
338
336
|
synchronized
|
|
339
337
|
], EchoNetworkAdapter.prototype, "removeReplicator", null);
|
|
338
|
+
var createEchoPeerMetadata = () => ({
|
|
339
|
+
// TODO(dmaretskyi): Refactor this.
|
|
340
|
+
dxos_peerSource: "EchoNetworkAdapter"
|
|
341
|
+
});
|
|
342
|
+
var isEchoPeerMetadata = (metadata) => metadata?.dxos_peerSource === "EchoNetworkAdapter";
|
|
340
343
|
|
|
341
344
|
// packages/core/echo/echo-pipeline/src/automerge/leveldb-storage-adapter.ts
|
|
342
345
|
import { LifecycleState as LifecycleState2, Resource } from "@dxos/context";
|
|
@@ -586,7 +589,10 @@ function _ts_decorate2(decorators, target, key, desc) {
|
|
|
586
589
|
var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts";
|
|
587
590
|
var AutomergeHost = class {
|
|
588
591
|
constructor({ db, indexMetadataStore }) {
|
|
589
|
-
this._ctx = new Context(
|
|
592
|
+
this._ctx = new Context(void 0, {
|
|
593
|
+
F: __dxlog_file3,
|
|
594
|
+
L: 71
|
|
595
|
+
});
|
|
590
596
|
this._echoNetworkAdapter = new EchoNetworkAdapter({
|
|
591
597
|
getContainingSpaceForDocument: this._getContainingSpaceForDocument.bind(this)
|
|
592
598
|
});
|
|
@@ -625,6 +631,9 @@ var AutomergeHost = class {
|
|
|
625
631
|
await this._echoNetworkAdapter.close();
|
|
626
632
|
await this._ctx.dispose();
|
|
627
633
|
}
|
|
634
|
+
/**
|
|
635
|
+
* @deprecated To be abstracted away.
|
|
636
|
+
*/
|
|
628
637
|
get repo() {
|
|
629
638
|
return this._repo;
|
|
630
639
|
}
|
|
@@ -634,6 +643,39 @@ var AutomergeHost = class {
|
|
|
634
643
|
async removeReplicator(replicator) {
|
|
635
644
|
await this._echoNetworkAdapter.removeReplicator(replicator);
|
|
636
645
|
}
|
|
646
|
+
/**
|
|
647
|
+
* Loads the document handle from the repo and waits for it to be ready.
|
|
648
|
+
*/
|
|
649
|
+
async loadDoc(ctx, documentId, opts) {
|
|
650
|
+
let handle;
|
|
651
|
+
if (typeof documentId === "string") {
|
|
652
|
+
handle = this._repo.handles[documentId];
|
|
653
|
+
}
|
|
654
|
+
if (!handle) {
|
|
655
|
+
handle = this._repo.find(documentId);
|
|
656
|
+
}
|
|
657
|
+
if (!handle.isReady()) {
|
|
658
|
+
if (!opts?.timeout) {
|
|
659
|
+
await cancelWithContext(ctx, handle.whenReady());
|
|
660
|
+
} else {
|
|
661
|
+
await cancelWithContext(ctx, asyncTimeout(handle.whenReady(), opts.timeout));
|
|
662
|
+
}
|
|
663
|
+
}
|
|
664
|
+
return handle;
|
|
665
|
+
}
|
|
666
|
+
/**
|
|
667
|
+
* Create new persisted document.
|
|
668
|
+
*/
|
|
669
|
+
createDoc(initialValue, opts) {
|
|
670
|
+
if (opts?.preserveHistory) {
|
|
671
|
+
if (!isAutomerge(initialValue)) {
|
|
672
|
+
throw new TypeError("Initial value must be an Automerge document");
|
|
673
|
+
}
|
|
674
|
+
return this._repo.import(save(initialValue));
|
|
675
|
+
} else {
|
|
676
|
+
return this._repo.create(initialValue);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
637
679
|
// TODO(dmaretskyi): Share based on HALO permissions and space affinity.
|
|
638
680
|
// Hosts, running in the worker, don't share documents unless requested by other peers.
|
|
639
681
|
// NOTE: If both peers return sharePolicy=false the replication will not happen
|
|
@@ -646,7 +688,7 @@ var AutomergeHost = class {
|
|
|
646
688
|
return false;
|
|
647
689
|
}
|
|
648
690
|
const peerMetadata = this.repo.peerMetadataByPeerId[peerId];
|
|
649
|
-
if (peerMetadata
|
|
691
|
+
if (isEchoPeerMetadata(peerMetadata)) {
|
|
650
692
|
return this._echoNetworkAdapter.shouldAdvertize(peerId, {
|
|
651
693
|
documentId
|
|
652
694
|
});
|
|
@@ -718,31 +760,36 @@ var AutomergeHost = class {
|
|
|
718
760
|
}
|
|
719
761
|
return PublicKey.from(spaceKeyHex);
|
|
720
762
|
}
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
763
|
+
/**
|
|
764
|
+
* Flush documents to disk.
|
|
765
|
+
*/
|
|
724
766
|
async flush({ states }) {
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
});
|
|
735
|
-
const handle = this.repo.handles[documentId] ?? this._repo.find(documentId);
|
|
736
|
-
await waitForHeads(handle, heads);
|
|
737
|
-
}) ?? []);
|
|
767
|
+
if (states) {
|
|
768
|
+
await Promise.all(states.map(async ({ heads, documentId }) => {
|
|
769
|
+
if (!heads) {
|
|
770
|
+
return;
|
|
771
|
+
}
|
|
772
|
+
const handle = this.repo.handles[documentId] ?? this._repo.find(documentId);
|
|
773
|
+
await waitForHeads(handle, heads);
|
|
774
|
+
}) ?? []);
|
|
775
|
+
}
|
|
738
776
|
await this._repo.flush(states?.map(({ documentId }) => documentId));
|
|
739
777
|
}
|
|
778
|
+
/**
|
|
779
|
+
* Host <-> Client sync.
|
|
780
|
+
*/
|
|
740
781
|
syncRepo(request) {
|
|
741
782
|
return this._clientNetwork.syncRepo(request);
|
|
742
783
|
}
|
|
784
|
+
/**
|
|
785
|
+
* Host <-> Client sync.
|
|
786
|
+
*/
|
|
743
787
|
sendSyncMessage(request) {
|
|
744
788
|
return this._clientNetwork.sendSyncMessage(request);
|
|
745
789
|
}
|
|
790
|
+
/**
|
|
791
|
+
* Host <-> Client sync.
|
|
792
|
+
*/
|
|
746
793
|
async getHostInfo() {
|
|
747
794
|
return this._clientNetwork.getHostInfo();
|
|
748
795
|
}
|
|
@@ -796,10 +843,10 @@ var changeIsPresentInDoc = (doc, changeHash) => {
|
|
|
796
843
|
|
|
797
844
|
// packages/core/echo/echo-pipeline/src/automerge/automerge-doc-loader.ts
|
|
798
845
|
import { Event as Event2 } from "@dxos/async";
|
|
799
|
-
import { cancelWithContext } from "@dxos/context";
|
|
846
|
+
import { cancelWithContext as cancelWithContext2 } from "@dxos/context";
|
|
800
847
|
import { warnAfterTimeout } from "@dxos/debug";
|
|
801
848
|
import { SpaceDocVersion } from "@dxos/echo-protocol";
|
|
802
|
-
import { invariant as
|
|
849
|
+
import { invariant as invariant3 } from "@dxos/invariant";
|
|
803
850
|
import { log as log2 } from "@dxos/log";
|
|
804
851
|
import { trace as trace2 } from "@dxos/tracing";
|
|
805
852
|
function _ts_decorate3(decorators, target, key, desc) {
|
|
@@ -846,7 +893,7 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
846
893
|
} else {
|
|
847
894
|
const existingDocHandle = await this._initDocHandle(ctx, spaceState.rootUrl);
|
|
848
895
|
const doc = existingDocHandle.docSync();
|
|
849
|
-
|
|
896
|
+
invariant3(doc, void 0, {
|
|
850
897
|
F: __dxlog_file4,
|
|
851
898
|
L: 77,
|
|
852
899
|
S: this,
|
|
@@ -868,7 +915,7 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
868
915
|
let hasUrlsToLoad = false;
|
|
869
916
|
const urlsToLoad = {};
|
|
870
917
|
for (const objectId of objectIds) {
|
|
871
|
-
|
|
918
|
+
invariant3(this._spaceRootDocHandle, void 0, {
|
|
872
919
|
F: __dxlog_file4,
|
|
873
920
|
L: 90,
|
|
874
921
|
S: this,
|
|
@@ -881,7 +928,7 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
881
928
|
continue;
|
|
882
929
|
}
|
|
883
930
|
const spaceRootDoc = this._spaceRootDocHandle.docSync();
|
|
884
|
-
|
|
931
|
+
invariant3(spaceRootDoc, void 0, {
|
|
885
932
|
F: __dxlog_file4,
|
|
886
933
|
L: 95,
|
|
887
934
|
S: this,
|
|
@@ -919,7 +966,7 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
919
966
|
linksAwaitingLoad.forEach(([objectId]) => this._objectsPendingDocumentLoad.delete(objectId));
|
|
920
967
|
}
|
|
921
968
|
getSpaceRootDocHandle() {
|
|
922
|
-
|
|
969
|
+
invariant3(this._spaceRootDocHandle, void 0, {
|
|
923
970
|
F: __dxlog_file4,
|
|
924
971
|
L: 122,
|
|
925
972
|
S: this,
|
|
@@ -931,7 +978,7 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
931
978
|
return this._spaceRootDocHandle;
|
|
932
979
|
}
|
|
933
980
|
createDocumentForObject(objectId) {
|
|
934
|
-
|
|
981
|
+
invariant3(this._spaceRootDocHandle, void 0, {
|
|
935
982
|
F: __dxlog_file4,
|
|
936
983
|
L: 127,
|
|
937
984
|
S: this,
|
|
@@ -1009,7 +1056,7 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
1009
1056
|
while (true) {
|
|
1010
1057
|
try {
|
|
1011
1058
|
await warnAfterTimeout(5e3, "Automerge root doc load timeout (CoreDatabase)", async () => {
|
|
1012
|
-
await
|
|
1059
|
+
await cancelWithContext2(ctx, docHandle.whenReady());
|
|
1013
1060
|
});
|
|
1014
1061
|
break;
|
|
1015
1062
|
} catch (err) {
|
|
@@ -1112,7 +1159,7 @@ AutomergeDocumentLoaderImpl = _ts_decorate3([
|
|
|
1112
1159
|
// packages/core/echo/echo-pipeline/src/automerge/mesh-echo-replicator.ts
|
|
1113
1160
|
import { cbor as cbor2 } from "@dxos/automerge/automerge-repo";
|
|
1114
1161
|
import { Resource as Resource2 } from "@dxos/context";
|
|
1115
|
-
import { invariant as
|
|
1162
|
+
import { invariant as invariant4 } from "@dxos/invariant";
|
|
1116
1163
|
import { PublicKey as PublicKey2 } from "@dxos/keys";
|
|
1117
1164
|
import { log as log3 } from "@dxos/log";
|
|
1118
1165
|
import { AutomergeReplicator } from "@dxos/teleport-extension-automerge-replicator";
|
|
@@ -1143,7 +1190,7 @@ var MeshEchoReplicator = class {
|
|
|
1143
1190
|
this._context = null;
|
|
1144
1191
|
}
|
|
1145
1192
|
createExtension() {
|
|
1146
|
-
|
|
1193
|
+
invariant4(this._context, void 0, {
|
|
1147
1194
|
F: __dxlog_file5,
|
|
1148
1195
|
L: 54,
|
|
1149
1196
|
S: this,
|
|
@@ -1163,7 +1210,7 @@ var MeshEchoReplicator = class {
|
|
|
1163
1210
|
S: this,
|
|
1164
1211
|
C: (f, a) => f(...a)
|
|
1165
1212
|
});
|
|
1166
|
-
|
|
1213
|
+
invariant4(this._context, void 0, {
|
|
1167
1214
|
F: __dxlog_file5,
|
|
1168
1215
|
L: 60,
|
|
1169
1216
|
S: this,
|
|
@@ -1190,8 +1237,8 @@ var MeshEchoReplicator = class {
|
|
|
1190
1237
|
C: (f, a) => f(...a)
|
|
1191
1238
|
});
|
|
1192
1239
|
this._context?.onConnectionClosed(connection);
|
|
1193
|
-
await connection.disable();
|
|
1194
1240
|
this._connectionsPerPeer.delete(connection.peerId);
|
|
1241
|
+
await connection.disable();
|
|
1195
1242
|
this._connections.delete(connection);
|
|
1196
1243
|
},
|
|
1197
1244
|
shouldAdvertize: async (params) => {
|
|
@@ -1204,7 +1251,7 @@ var MeshEchoReplicator = class {
|
|
|
1204
1251
|
S: this,
|
|
1205
1252
|
C: (f, a) => f(...a)
|
|
1206
1253
|
});
|
|
1207
|
-
|
|
1254
|
+
invariant4(this._context, void 0, {
|
|
1208
1255
|
F: __dxlog_file5,
|
|
1209
1256
|
L: 79,
|
|
1210
1257
|
S: this,
|
|
@@ -1344,7 +1391,7 @@ var MeshReplicatorConnection = class extends Resource2 {
|
|
|
1344
1391
|
});
|
|
1345
1392
|
}
|
|
1346
1393
|
get peerId() {
|
|
1347
|
-
|
|
1394
|
+
invariant4(this._remotePeerId != null, "Remote peer has not connected yet.", {
|
|
1348
1395
|
F: __dxlog_file5,
|
|
1349
1396
|
L: 215,
|
|
1350
1397
|
S: this,
|
|
@@ -1363,7 +1410,7 @@ var MeshReplicatorConnection = class extends Resource2 {
|
|
|
1363
1410
|
* Call after the remote peer has connected.
|
|
1364
1411
|
*/
|
|
1365
1412
|
async enable() {
|
|
1366
|
-
|
|
1413
|
+
invariant4(this._remotePeerId != null, "Remote peer has not connected yet.", {
|
|
1367
1414
|
F: __dxlog_file5,
|
|
1368
1415
|
L: 228,
|
|
1369
1416
|
S: this,
|
|
@@ -1386,6 +1433,8 @@ export {
|
|
|
1386
1433
|
AuthStatus,
|
|
1387
1434
|
AutomergeDocumentLoaderImpl,
|
|
1388
1435
|
AutomergeHost,
|
|
1436
|
+
CredentialRetrieverExtension,
|
|
1437
|
+
CredentialServerExtension,
|
|
1389
1438
|
DataServiceImpl,
|
|
1390
1439
|
LevelDBStorageAdapter,
|
|
1391
1440
|
LocalHostNetworkAdapter,
|