@dxos/echo-pipeline 0.3.11-main.e0dc42b → 0.3.11-main.e26c0a5
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-W3SSYW3X.mjs → chunk-CTE522SL.mjs} +247 -61
- package/dist/lib/browser/chunk-CTE522SL.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +1 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +33 -11
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node/{chunk-KTFCZMAY.cjs → chunk-ZLVSOBWV.cjs} +243 -60
- package/dist/lib/node/chunk-ZLVSOBWV.cjs.map +7 -0
- package/dist/lib/node/index.cjs +26 -26
- package/dist/lib/node/index.cjs.map +1 -1
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +46 -25
- package/dist/lib/node/testing/index.cjs.map +4 -4
- package/dist/types/src/automerge/automerge-host.d.ts +37 -2
- package/dist/types/src/automerge/automerge-host.d.ts.map +1 -1
- package/dist/types/src/automerge/index.d.ts +1 -1
- package/dist/types/src/automerge/index.d.ts.map +1 -1
- package/dist/types/src/metadata/metadata-store.d.ts +1 -3
- package/dist/types/src/metadata/metadata-store.d.ts.map +1 -1
- package/dist/types/src/space/space-manager.d.ts +2 -2
- package/dist/types/src/space/space-manager.d.ts.map +1 -1
- package/dist/types/src/space/space-protocol.d.ts.map +1 -1
- package/dist/types/src/space/space.d.ts.map +1 -1
- package/dist/types/src/testing/change-metadata.d.ts +8 -0
- package/dist/types/src/testing/change-metadata.d.ts.map +1 -0
- package/dist/types/src/testing/database-test-rig.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +1 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/package.json +33 -33
- package/src/automerge/automerge-host.test.ts +319 -34
- package/src/automerge/automerge-host.ts +137 -20
- package/src/automerge/index.ts +1 -1
- package/src/metadata/metadata-store.ts +12 -2
- package/src/pipeline/pipeline-stress.test.ts +9 -2
- package/src/space/space-manager.ts +3 -3
- package/src/space/space-protocol.ts +4 -0
- package/src/space/space.ts +5 -0
- package/src/testing/change-metadata.ts +27 -0
- package/src/testing/database-test-rig.ts +4 -1
- package/src/testing/index.ts +1 -0
- package/src/testing/test-agent-builder.ts +1 -1
- package/dist/lib/browser/chunk-W3SSYW3X.mjs.map +0 -7
- package/dist/lib/node/chunk-KTFCZMAY.cjs.map +0 -7
|
@@ -519,12 +519,12 @@ var emptyLargeSpaceMetadata = () => ({});
|
|
|
519
519
|
var EchoMetadata = schema4.getCodecForType("dxos.echo.metadata.EchoMetadata");
|
|
520
520
|
var LargeSpaceMetadata = schema4.getCodecForType("dxos.echo.metadata.LargeSpaceMetadata");
|
|
521
521
|
var MetadataStore = class {
|
|
522
|
-
constructor(
|
|
523
|
-
this._directory = _directory;
|
|
522
|
+
constructor(directory) {
|
|
524
523
|
this._metadata = emptyEchoMetadata();
|
|
525
524
|
this._spaceLargeMetadata = new ComplexMap3(PublicKey3.hash);
|
|
526
525
|
this._metadataFile = void 0;
|
|
527
526
|
this.update = new Event();
|
|
527
|
+
this._directory = directory;
|
|
528
528
|
}
|
|
529
529
|
get metadata() {
|
|
530
530
|
return this._metadata;
|
|
@@ -553,7 +553,7 @@ var MetadataStore = class {
|
|
|
553
553
|
name: file.filename
|
|
554
554
|
}, {
|
|
555
555
|
F: __dxlog_file4,
|
|
556
|
-
L:
|
|
556
|
+
L: 85,
|
|
557
557
|
S: this,
|
|
558
558
|
C: (f, a) => f(...a)
|
|
559
559
|
});
|
|
@@ -573,6 +573,9 @@ var MetadataStore = class {
|
|
|
573
573
|
await file.close();
|
|
574
574
|
}
|
|
575
575
|
}
|
|
576
|
+
/**
|
|
577
|
+
* @internal
|
|
578
|
+
*/
|
|
576
579
|
async _writeFile(file, codec2, data) {
|
|
577
580
|
const encoded = arrayToBuffer(codec2.encode(data));
|
|
578
581
|
const checksum = CRC32.buf(encoded);
|
|
@@ -586,7 +589,7 @@ var MetadataStore = class {
|
|
|
586
589
|
checksum
|
|
587
590
|
}, {
|
|
588
591
|
F: __dxlog_file4,
|
|
589
|
-
L:
|
|
592
|
+
L: 120,
|
|
590
593
|
S: this,
|
|
591
594
|
C: (f, a) => f(...a)
|
|
592
595
|
});
|
|
@@ -618,7 +621,7 @@ var MetadataStore = class {
|
|
|
618
621
|
err
|
|
619
622
|
}, {
|
|
620
623
|
F: __dxlog_file4,
|
|
621
|
-
L:
|
|
624
|
+
L: 151,
|
|
622
625
|
S: this,
|
|
623
626
|
C: (f, a) => f(...a)
|
|
624
627
|
});
|
|
@@ -635,7 +638,7 @@ var MetadataStore = class {
|
|
|
635
638
|
err
|
|
636
639
|
}, {
|
|
637
640
|
F: __dxlog_file4,
|
|
638
|
-
L:
|
|
641
|
+
L: 163,
|
|
639
642
|
S: this,
|
|
640
643
|
C: (f, a) => f(...a)
|
|
641
644
|
});
|
|
@@ -665,7 +668,7 @@ var MetadataStore = class {
|
|
|
665
668
|
err
|
|
666
669
|
}, {
|
|
667
670
|
F: __dxlog_file4,
|
|
668
|
-
L:
|
|
671
|
+
L: 192,
|
|
669
672
|
S: this,
|
|
670
673
|
C: (f, a) => f(...a)
|
|
671
674
|
});
|
|
@@ -686,7 +689,7 @@ var MetadataStore = class {
|
|
|
686
689
|
const space = this.spaces.find((space2) => space2.key === spaceKey);
|
|
687
690
|
invariant4(space, "Space not found", {
|
|
688
691
|
F: __dxlog_file4,
|
|
689
|
-
L:
|
|
692
|
+
L: 214,
|
|
690
693
|
S: this,
|
|
691
694
|
A: [
|
|
692
695
|
"space",
|
|
@@ -710,7 +713,7 @@ var MetadataStore = class {
|
|
|
710
713
|
async clear() {
|
|
711
714
|
log3("clearing all metadata", void 0, {
|
|
712
715
|
F: __dxlog_file4,
|
|
713
|
-
L:
|
|
716
|
+
L: 233,
|
|
714
717
|
S: this,
|
|
715
718
|
C: (f, a) => f(...a)
|
|
716
719
|
});
|
|
@@ -723,7 +726,7 @@ var MetadataStore = class {
|
|
|
723
726
|
async setIdentityRecord(record) {
|
|
724
727
|
invariant4(!this._metadata.identity, "Cannot overwrite existing identity in metadata", {
|
|
725
728
|
F: __dxlog_file4,
|
|
726
|
-
L:
|
|
729
|
+
L: 243,
|
|
727
730
|
S: this,
|
|
728
731
|
A: [
|
|
729
732
|
"!this._metadata.identity",
|
|
@@ -737,7 +740,7 @@ var MetadataStore = class {
|
|
|
737
740
|
async addSpace(record) {
|
|
738
741
|
invariant4(!(this._metadata.spaces ?? []).find((space) => space.key === record.key), "Cannot overwrite existing space in metadata", {
|
|
739
742
|
F: __dxlog_file4,
|
|
740
|
-
L:
|
|
743
|
+
L: 251,
|
|
741
744
|
S: this,
|
|
742
745
|
A: [
|
|
743
746
|
"!(this._metadata.spaces ?? []).find((space) => space.key === record.key)",
|
|
@@ -1478,7 +1481,7 @@ var __dxlog_file9 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipelin
|
|
|
1478
1481
|
var MESSAGES_PER_SNAPSHOT = 10;
|
|
1479
1482
|
var AUTOMATIC_SNAPSHOT_DEBOUNCE_INTERVAL = 5e3;
|
|
1480
1483
|
var TIMEFRAME_SAVE_DEBOUNCE_INTERVAL = 5e3;
|
|
1481
|
-
var DataPipeline = class
|
|
1484
|
+
var DataPipeline = class {
|
|
1482
1485
|
constructor(_params) {
|
|
1483
1486
|
this._params = _params;
|
|
1484
1487
|
this._ctx = new Context4();
|
|
@@ -1952,7 +1955,7 @@ var __dxlog_file10 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeli
|
|
|
1952
1955
|
var TIMEFRAME_SAVE_DEBOUNCE_INTERVAL2 = 500;
|
|
1953
1956
|
var CONTROL_PIPELINE_SNAPSHOT_DELAY = 1e4;
|
|
1954
1957
|
var USE_SNAPSHOTS = true;
|
|
1955
|
-
var ControlPipeline = class
|
|
1958
|
+
var ControlPipeline = class {
|
|
1956
1959
|
constructor({ spaceKey, genesisFeed, feedProvider, metadataStore }) {
|
|
1957
1960
|
this._ctx = new Context5();
|
|
1958
1961
|
this._lastTimeframeSaveTime = Date.now();
|
|
@@ -2198,7 +2201,7 @@ function _ts_decorate6(decorators, target, key, desc) {
|
|
|
2198
2201
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
2199
2202
|
}
|
|
2200
2203
|
var __dxlog_file11 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/space/space.ts";
|
|
2201
|
-
var Space = class
|
|
2204
|
+
var Space = class {
|
|
2202
2205
|
constructor(params) {
|
|
2203
2206
|
this._addFeedLock = new Lock();
|
|
2204
2207
|
this.onCredentialProcessed = new Callback2();
|
|
@@ -2206,7 +2209,7 @@ var Space = class Space2 {
|
|
|
2206
2209
|
this._isOpen = false;
|
|
2207
2210
|
invariant9(params.spaceKey && params.feedProvider, void 0, {
|
|
2208
2211
|
F: __dxlog_file11,
|
|
2209
|
-
L:
|
|
2212
|
+
L: 78,
|
|
2210
2213
|
S: this,
|
|
2211
2214
|
A: [
|
|
2212
2215
|
"params.spaceKey && params.feedProvider",
|
|
@@ -2250,7 +2253,7 @@ var Space = class Space2 {
|
|
|
2250
2253
|
credential
|
|
2251
2254
|
}, {
|
|
2252
2255
|
F: __dxlog_file11,
|
|
2253
|
-
L:
|
|
2256
|
+
L: 116,
|
|
2254
2257
|
S: this,
|
|
2255
2258
|
C: (f, a) => f(...a)
|
|
2256
2259
|
});
|
|
@@ -2315,7 +2318,7 @@ var Space = class Space2 {
|
|
|
2315
2318
|
setControlFeed(feed) {
|
|
2316
2319
|
invariant9(!this._controlFeed, "Control feed already set.", {
|
|
2317
2320
|
F: __dxlog_file11,
|
|
2318
|
-
L:
|
|
2321
|
+
L: 191,
|
|
2319
2322
|
S: this,
|
|
2320
2323
|
A: [
|
|
2321
2324
|
"!this._controlFeed",
|
|
@@ -2329,7 +2332,7 @@ var Space = class Space2 {
|
|
|
2329
2332
|
setDataFeed(feed) {
|
|
2330
2333
|
invariant9(!this._dataFeed, "Data feed already set.", {
|
|
2331
2334
|
F: __dxlog_file11,
|
|
2332
|
-
L:
|
|
2335
|
+
L: 198,
|
|
2333
2336
|
S: this,
|
|
2334
2337
|
A: [
|
|
2335
2338
|
"!this._dataFeed",
|
|
@@ -2355,7 +2358,7 @@ var Space = class Space2 {
|
|
|
2355
2358
|
async open(ctx) {
|
|
2356
2359
|
log10("opening...", void 0, {
|
|
2357
2360
|
F: __dxlog_file11,
|
|
2358
|
-
L:
|
|
2361
|
+
L: 220,
|
|
2359
2362
|
S: this,
|
|
2360
2363
|
C: (f, a) => f(...a)
|
|
2361
2364
|
});
|
|
@@ -2368,7 +2371,7 @@ var Space = class Space2 {
|
|
|
2368
2371
|
this._isOpen = true;
|
|
2369
2372
|
log10("opened", void 0, {
|
|
2370
2373
|
F: __dxlog_file11,
|
|
2371
|
-
L:
|
|
2374
|
+
L: 231,
|
|
2372
2375
|
S: this,
|
|
2373
2376
|
C: (f, a) => f(...a)
|
|
2374
2377
|
});
|
|
@@ -2378,7 +2381,7 @@ var Space = class Space2 {
|
|
|
2378
2381
|
key: this._key
|
|
2379
2382
|
}, {
|
|
2380
2383
|
F: __dxlog_file11,
|
|
2381
|
-
L:
|
|
2384
|
+
L: 236,
|
|
2382
2385
|
S: this,
|
|
2383
2386
|
C: (f, a) => f(...a)
|
|
2384
2387
|
});
|
|
@@ -2392,7 +2395,7 @@ var Space = class Space2 {
|
|
|
2392
2395
|
this._isOpen = false;
|
|
2393
2396
|
log10("closed", void 0, {
|
|
2394
2397
|
F: __dxlog_file11,
|
|
2395
|
-
L:
|
|
2398
|
+
L: 249,
|
|
2396
2399
|
S: this,
|
|
2397
2400
|
C: (f, a) => f(...a)
|
|
2398
2401
|
});
|
|
@@ -2400,13 +2403,13 @@ var Space = class Space2 {
|
|
|
2400
2403
|
async initializeDataPipeline() {
|
|
2401
2404
|
log10("initializeDataPipeline", void 0, {
|
|
2402
2405
|
F: __dxlog_file11,
|
|
2403
|
-
L:
|
|
2406
|
+
L: 254,
|
|
2404
2407
|
S: this,
|
|
2405
2408
|
C: (f, a) => f(...a)
|
|
2406
2409
|
});
|
|
2407
2410
|
invariant9(this._isOpen, "Space must be open to initialize data pipeline.", {
|
|
2408
2411
|
F: __dxlog_file11,
|
|
2409
|
-
L:
|
|
2412
|
+
L: 255,
|
|
2410
2413
|
S: this,
|
|
2411
2414
|
A: [
|
|
2412
2415
|
"this._isOpen",
|
|
@@ -2416,6 +2419,15 @@ var Space = class Space2 {
|
|
|
2416
2419
|
await this._dataPipeline.open();
|
|
2417
2420
|
}
|
|
2418
2421
|
};
|
|
2422
|
+
_ts_decorate6([
|
|
2423
|
+
trace3.info()
|
|
2424
|
+
], Space.prototype, "protocol", void 0);
|
|
2425
|
+
_ts_decorate6([
|
|
2426
|
+
trace3.info()
|
|
2427
|
+
], Space.prototype, "_controlPipeline", void 0);
|
|
2428
|
+
_ts_decorate6([
|
|
2429
|
+
trace3.info()
|
|
2430
|
+
], Space.prototype, "_dataPipeline", void 0);
|
|
2419
2431
|
_ts_decorate6([
|
|
2420
2432
|
logInfo,
|
|
2421
2433
|
trace3.info()
|
|
@@ -2443,6 +2455,7 @@ import { MMSTTopology } from "@dxos/network-manager";
|
|
|
2443
2455
|
import { Teleport } from "@dxos/teleport";
|
|
2444
2456
|
import { BlobSync } from "@dxos/teleport-extension-object-sync";
|
|
2445
2457
|
import { ReplicatorExtension } from "@dxos/teleport-extension-replicator";
|
|
2458
|
+
import { trace as trace4 } from "@dxos/tracing";
|
|
2446
2459
|
import { ComplexMap as ComplexMap5 } from "@dxos/util";
|
|
2447
2460
|
function _ts_decorate7(decorators, target, key, desc) {
|
|
2448
2461
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -2486,7 +2499,7 @@ var SpaceProtocol = class {
|
|
|
2486
2499
|
key: feed.key
|
|
2487
2500
|
}, {
|
|
2488
2501
|
F: __dxlog_file12,
|
|
2489
|
-
L:
|
|
2502
|
+
L: 103,
|
|
2490
2503
|
S: this,
|
|
2491
2504
|
C: (f, a) => f(...a)
|
|
2492
2505
|
});
|
|
@@ -2509,7 +2522,7 @@ var SpaceProtocol = class {
|
|
|
2509
2522
|
await this.blobSync.open();
|
|
2510
2523
|
log11("starting...", void 0, {
|
|
2511
2524
|
F: __dxlog_file12,
|
|
2512
|
-
L:
|
|
2525
|
+
L: 129,
|
|
2513
2526
|
S: this,
|
|
2514
2527
|
C: (f, a) => f(...a)
|
|
2515
2528
|
});
|
|
@@ -2523,7 +2536,7 @@ var SpaceProtocol = class {
|
|
|
2523
2536
|
});
|
|
2524
2537
|
log11("started", void 0, {
|
|
2525
2538
|
F: __dxlog_file12,
|
|
2526
|
-
L:
|
|
2539
|
+
L: 139,
|
|
2527
2540
|
S: this,
|
|
2528
2541
|
C: (f, a) => f(...a)
|
|
2529
2542
|
});
|
|
@@ -2533,14 +2546,14 @@ var SpaceProtocol = class {
|
|
|
2533
2546
|
if (this._connection) {
|
|
2534
2547
|
log11("stopping...", void 0, {
|
|
2535
2548
|
F: __dxlog_file12,
|
|
2536
|
-
L:
|
|
2549
|
+
L: 146,
|
|
2537
2550
|
S: this,
|
|
2538
2551
|
C: (f, a) => f(...a)
|
|
2539
2552
|
});
|
|
2540
2553
|
await this._connection.close();
|
|
2541
2554
|
log11("stopped", void 0, {
|
|
2542
2555
|
F: __dxlog_file12,
|
|
2543
|
-
L:
|
|
2556
|
+
L: 148,
|
|
2544
2557
|
S: this,
|
|
2545
2558
|
C: (f, a) => f(...a)
|
|
2546
2559
|
});
|
|
@@ -2564,11 +2577,18 @@ var SpaceProtocol = class {
|
|
|
2564
2577
|
}
|
|
2565
2578
|
};
|
|
2566
2579
|
_ts_decorate7([
|
|
2567
|
-
logInfo2
|
|
2580
|
+
logInfo2,
|
|
2581
|
+
trace4.info()
|
|
2568
2582
|
], SpaceProtocol.prototype, "_topic", void 0);
|
|
2583
|
+
_ts_decorate7([
|
|
2584
|
+
trace4.info()
|
|
2585
|
+
], SpaceProtocol.prototype, "_spaceKey", void 0);
|
|
2569
2586
|
_ts_decorate7([
|
|
2570
2587
|
logInfo2
|
|
2571
2588
|
], SpaceProtocol.prototype, "_ownPeerKey", null);
|
|
2589
|
+
SpaceProtocol = _ts_decorate7([
|
|
2590
|
+
trace4.resource()
|
|
2591
|
+
], SpaceProtocol);
|
|
2572
2592
|
var AuthStatus;
|
|
2573
2593
|
(function(AuthStatus2) {
|
|
2574
2594
|
AuthStatus2["INITIAL"] = "INITIAL";
|
|
@@ -2582,7 +2602,7 @@ var SpaceProtocolSession = class {
|
|
|
2582
2602
|
this.replicator = new ReplicatorExtension().setOptions({
|
|
2583
2603
|
upload: true
|
|
2584
2604
|
});
|
|
2585
|
-
this._authStatus =
|
|
2605
|
+
this._authStatus = "INITIAL";
|
|
2586
2606
|
this._wireParams = wireParams;
|
|
2587
2607
|
this._swarmIdentity = swarmIdentity;
|
|
2588
2608
|
this._onSessionAuth = onSessionAuth;
|
|
@@ -2607,15 +2627,15 @@ var SpaceProtocolSession = class {
|
|
|
2607
2627
|
onAuthSuccess: () => {
|
|
2608
2628
|
log11("Peer authenticated", void 0, {
|
|
2609
2629
|
F: __dxlog_file12,
|
|
2610
|
-
L:
|
|
2630
|
+
L: 245,
|
|
2611
2631
|
S: this,
|
|
2612
2632
|
C: (f, a) => f(...a)
|
|
2613
2633
|
});
|
|
2614
|
-
this._authStatus =
|
|
2634
|
+
this._authStatus = "SUCCESS";
|
|
2615
2635
|
this._onSessionAuth?.(this._teleport);
|
|
2616
2636
|
},
|
|
2617
2637
|
onAuthFailure: () => {
|
|
2618
|
-
this._authStatus =
|
|
2638
|
+
this._authStatus = "FAILURE";
|
|
2619
2639
|
this._onAuthFailure?.(this._teleport);
|
|
2620
2640
|
}
|
|
2621
2641
|
}));
|
|
@@ -2625,7 +2645,7 @@ var SpaceProtocolSession = class {
|
|
|
2625
2645
|
async close() {
|
|
2626
2646
|
log11("close", void 0, {
|
|
2627
2647
|
F: __dxlog_file12,
|
|
2628
|
-
L:
|
|
2648
|
+
L: 261,
|
|
2629
2649
|
S: this,
|
|
2630
2650
|
C: (f, a) => f(...a)
|
|
2631
2651
|
});
|
|
@@ -2647,7 +2667,7 @@ import { synchronized as synchronized5, trackLeaks as trackLeaks4 } from "@dxos/
|
|
|
2647
2667
|
import { failUndefined as failUndefined2 } from "@dxos/debug";
|
|
2648
2668
|
import { PublicKey as PublicKey7 } from "@dxos/keys";
|
|
2649
2669
|
import { log as log12 } from "@dxos/log";
|
|
2650
|
-
import { trace as
|
|
2670
|
+
import { trace as trace5 } from "@dxos/protocols";
|
|
2651
2671
|
import { ComplexMap as ComplexMap6 } from "@dxos/util";
|
|
2652
2672
|
function _ts_decorate8(decorators, target, key, desc) {
|
|
2653
2673
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -2660,7 +2680,7 @@ function _ts_decorate8(decorators, target, key, desc) {
|
|
|
2660
2680
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
2661
2681
|
}
|
|
2662
2682
|
var __dxlog_file13 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/space/space-manager.ts";
|
|
2663
|
-
var SpaceManager = class
|
|
2683
|
+
var SpaceManager = class {
|
|
2664
2684
|
constructor({ feedStore, networkManager, modelFactory, metadataStore, snapshotStore, blobStore }) {
|
|
2665
2685
|
this._spaces = new ComplexMap6(PublicKey7.hash);
|
|
2666
2686
|
this._instanceId = PublicKey7.random().toHex();
|
|
@@ -2682,8 +2702,8 @@ var SpaceManager = class SpaceManager2 {
|
|
|
2682
2702
|
...this._spaces.values()
|
|
2683
2703
|
].map((space) => space.close()));
|
|
2684
2704
|
}
|
|
2685
|
-
async constructSpace({ metadata, swarmIdentity,
|
|
2686
|
-
log12.trace("dxos.echo.space-manager.construct-space",
|
|
2705
|
+
async constructSpace({ metadata, swarmIdentity, onAuthorizedConnection, onAuthFailure, memberKey }) {
|
|
2706
|
+
log12.trace("dxos.echo.space-manager.construct-space", trace5.begin({
|
|
2687
2707
|
id: this._instanceId
|
|
2688
2708
|
}), {
|
|
2689
2709
|
F: __dxlog_file13,
|
|
@@ -2705,7 +2725,7 @@ var SpaceManager = class SpaceManager2 {
|
|
|
2705
2725
|
topic: spaceKey,
|
|
2706
2726
|
swarmIdentity,
|
|
2707
2727
|
networkManager: this._networkManager,
|
|
2708
|
-
onSessionAuth:
|
|
2728
|
+
onSessionAuth: onAuthorizedConnection,
|
|
2709
2729
|
onAuthFailure,
|
|
2710
2730
|
blobStore: this._blobStore
|
|
2711
2731
|
});
|
|
@@ -2721,7 +2741,7 @@ var SpaceManager = class SpaceManager2 {
|
|
|
2721
2741
|
memberKey
|
|
2722
2742
|
});
|
|
2723
2743
|
this._spaces.set(space.key, space);
|
|
2724
|
-
log12.trace("dxos.echo.space-manager.construct-space",
|
|
2744
|
+
log12.trace("dxos.echo.space-manager.construct-space", trace5.end({
|
|
2725
2745
|
id: this._instanceId
|
|
2726
2746
|
}), {
|
|
2727
2747
|
F: __dxlog_file13,
|
|
@@ -2743,26 +2763,120 @@ SpaceManager = _ts_decorate8([
|
|
|
2743
2763
|
], SpaceManager);
|
|
2744
2764
|
|
|
2745
2765
|
// packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts
|
|
2766
|
+
import { Trigger as Trigger2 } from "@dxos/async";
|
|
2767
|
+
import { next as automerge } from "@dxos/automerge/automerge";
|
|
2746
2768
|
import { Repo, NetworkAdapter, StorageAdapter, cbor } from "@dxos/automerge/automerge-repo";
|
|
2769
|
+
import { IndexedDBStorageAdapter } from "@dxos/automerge/automerge-repo-storage-indexeddb";
|
|
2747
2770
|
import { Stream as Stream2 } from "@dxos/codec-protobuf";
|
|
2748
2771
|
import { invariant as invariant10 } from "@dxos/invariant";
|
|
2772
|
+
import { PublicKey as PublicKey8 } from "@dxos/keys";
|
|
2749
2773
|
import { log as log13 } from "@dxos/log";
|
|
2774
|
+
import { StorageType } from "@dxos/random-access-storage";
|
|
2750
2775
|
import { AutomergeReplicator } from "@dxos/teleport-extension-automerge-replicator";
|
|
2751
|
-
import {
|
|
2776
|
+
import { trace as trace6 } from "@dxos/tracing";
|
|
2777
|
+
import { ComplexMap as ComplexMap7, ComplexSet, arrayToBuffer as arrayToBuffer2, bufferToArray, defaultMap, mapValues } from "@dxos/util";
|
|
2778
|
+
function _ts_decorate9(decorators, target, key, desc) {
|
|
2779
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
2780
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
2781
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
2782
|
+
else
|
|
2783
|
+
for (var i = decorators.length - 1; i >= 0; i--)
|
|
2784
|
+
if (d = decorators[i])
|
|
2785
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
2786
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
2787
|
+
}
|
|
2752
2788
|
var __dxlog_file14 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts";
|
|
2753
2789
|
var AutomergeHost = class {
|
|
2754
2790
|
constructor(storageDirectory) {
|
|
2791
|
+
/**
|
|
2792
|
+
* spaceKey -> deviceKey[]
|
|
2793
|
+
*/
|
|
2794
|
+
this._authorizedDevices = new ComplexMap7(PublicKey8.hash);
|
|
2755
2795
|
this._meshNetwork = new MeshNetworkAdapter();
|
|
2756
2796
|
this._clientNetwork = new LocalHostNetworkAdapter();
|
|
2757
|
-
this._storage = new AutomergeStorageAdapter(storageDirectory);
|
|
2797
|
+
this._storage = storageDirectory.type === StorageType.IDB ? new IndexedDBStorageAdapter(storageDirectory.path, "data") : new AutomergeStorageAdapter(storageDirectory);
|
|
2758
2798
|
this._repo = new Repo({
|
|
2799
|
+
peerId: `host-${PublicKey8.random().toHex()}`,
|
|
2759
2800
|
network: [
|
|
2760
2801
|
this._clientNetwork,
|
|
2761
2802
|
this._meshNetwork
|
|
2762
2803
|
],
|
|
2763
2804
|
storage: this._storage,
|
|
2764
2805
|
// TODO(dmaretskyi): Share based on HALO permissions and space affinity.
|
|
2765
|
-
|
|
2806
|
+
// Hosts, running in the worker, don't share documents unless requested by other peers.
|
|
2807
|
+
sharePolicy: async (peerId, documentId) => {
|
|
2808
|
+
if (peerId.startsWith("client-")) {
|
|
2809
|
+
return true;
|
|
2810
|
+
}
|
|
2811
|
+
if (!documentId) {
|
|
2812
|
+
return false;
|
|
2813
|
+
}
|
|
2814
|
+
const doc = this._repo.handles[documentId]?.docSync();
|
|
2815
|
+
if (!doc) {
|
|
2816
|
+
log13("doc not found for share policy check", {
|
|
2817
|
+
peerId,
|
|
2818
|
+
documentId
|
|
2819
|
+
}, {
|
|
2820
|
+
F: __dxlog_file14,
|
|
2821
|
+
L: 68,
|
|
2822
|
+
S: this,
|
|
2823
|
+
C: (f, a) => f(...a)
|
|
2824
|
+
});
|
|
2825
|
+
return false;
|
|
2826
|
+
}
|
|
2827
|
+
try {
|
|
2828
|
+
if (!doc.experimental_spaceKey) {
|
|
2829
|
+
log13.warn("space key not found for share policy check", {
|
|
2830
|
+
peerId,
|
|
2831
|
+
documentId
|
|
2832
|
+
}, {
|
|
2833
|
+
F: __dxlog_file14,
|
|
2834
|
+
L: 74,
|
|
2835
|
+
S: this,
|
|
2836
|
+
C: (f, a) => f(...a)
|
|
2837
|
+
});
|
|
2838
|
+
return false;
|
|
2839
|
+
}
|
|
2840
|
+
const spaceKey = PublicKey8.from(doc.experimental_spaceKey);
|
|
2841
|
+
const authorizedDevices = this._authorizedDevices.get(spaceKey);
|
|
2842
|
+
const deviceKeyHex = this.repo.peerMetadataByPeerId[peerId]?.dxos_deviceKey;
|
|
2843
|
+
if (!deviceKeyHex) {
|
|
2844
|
+
log13.warn("device key not found for share policy check", {
|
|
2845
|
+
peerId,
|
|
2846
|
+
documentId
|
|
2847
|
+
}, {
|
|
2848
|
+
F: __dxlog_file14,
|
|
2849
|
+
L: 84,
|
|
2850
|
+
S: this,
|
|
2851
|
+
C: (f, a) => f(...a)
|
|
2852
|
+
});
|
|
2853
|
+
return false;
|
|
2854
|
+
}
|
|
2855
|
+
const deviceKey = PublicKey8.from(deviceKeyHex);
|
|
2856
|
+
const isAuthorized = authorizedDevices?.has(deviceKey) ?? false;
|
|
2857
|
+
log13.info("share policy check", {
|
|
2858
|
+
peerId,
|
|
2859
|
+
documentId,
|
|
2860
|
+
deviceKey,
|
|
2861
|
+
spaceKey,
|
|
2862
|
+
isAuthorized
|
|
2863
|
+
}, {
|
|
2864
|
+
F: __dxlog_file14,
|
|
2865
|
+
L: 90,
|
|
2866
|
+
S: this,
|
|
2867
|
+
C: (f, a) => f(...a)
|
|
2868
|
+
});
|
|
2869
|
+
return isAuthorized;
|
|
2870
|
+
} catch (err) {
|
|
2871
|
+
log13.catch(err, void 0, {
|
|
2872
|
+
F: __dxlog_file14,
|
|
2873
|
+
L: 93,
|
|
2874
|
+
S: this,
|
|
2875
|
+
C: (f, a) => f(...a)
|
|
2876
|
+
});
|
|
2877
|
+
return false;
|
|
2878
|
+
}
|
|
2879
|
+
}
|
|
2766
2880
|
});
|
|
2767
2881
|
this._clientNetwork.ready();
|
|
2768
2882
|
this._meshNetwork.ready();
|
|
@@ -2770,7 +2884,18 @@ var AutomergeHost = class {
|
|
|
2770
2884
|
get repo() {
|
|
2771
2885
|
return this._repo;
|
|
2772
2886
|
}
|
|
2887
|
+
_automergeDocs() {
|
|
2888
|
+
return mapValues(this._repo.handles, (handle) => ({
|
|
2889
|
+
state: handle.state,
|
|
2890
|
+
hasDoc: !!handle.docSync(),
|
|
2891
|
+
heads: handle.docSync() ? automerge.getHeads(handle.docSync()) : null
|
|
2892
|
+
}));
|
|
2893
|
+
}
|
|
2894
|
+
_automergePeers() {
|
|
2895
|
+
return this._repo.peers;
|
|
2896
|
+
}
|
|
2773
2897
|
async close() {
|
|
2898
|
+
this._storage instanceof AutomergeStorageAdapter && await this._storage.close();
|
|
2774
2899
|
await this._clientNetwork.close();
|
|
2775
2900
|
}
|
|
2776
2901
|
//
|
|
@@ -2782,7 +2907,7 @@ var AutomergeHost = class {
|
|
|
2782
2907
|
sendSyncMessage(request) {
|
|
2783
2908
|
return this._clientNetwork.sendSyncMessage(request);
|
|
2784
2909
|
}
|
|
2785
|
-
getHostInfo() {
|
|
2910
|
+
async getHostInfo() {
|
|
2786
2911
|
return this._clientNetwork.getHostInfo();
|
|
2787
2912
|
}
|
|
2788
2913
|
//
|
|
@@ -2791,11 +2916,28 @@ var AutomergeHost = class {
|
|
|
2791
2916
|
createExtension() {
|
|
2792
2917
|
return this._meshNetwork.createExtension();
|
|
2793
2918
|
}
|
|
2919
|
+
authorizeDevice(spaceKey, deviceKey) {
|
|
2920
|
+
defaultMap(this._authorizedDevices, spaceKey, () => new ComplexSet(PublicKey8.hash)).add(deviceKey);
|
|
2921
|
+
}
|
|
2794
2922
|
};
|
|
2923
|
+
_ts_decorate9([
|
|
2924
|
+
trace6.info({
|
|
2925
|
+
depth: null
|
|
2926
|
+
})
|
|
2927
|
+
], AutomergeHost.prototype, "_automergeDocs", null);
|
|
2928
|
+
_ts_decorate9([
|
|
2929
|
+
trace6.info({
|
|
2930
|
+
depth: null
|
|
2931
|
+
})
|
|
2932
|
+
], AutomergeHost.prototype, "_automergePeers", null);
|
|
2933
|
+
AutomergeHost = _ts_decorate9([
|
|
2934
|
+
trace6.resource()
|
|
2935
|
+
], AutomergeHost);
|
|
2795
2936
|
var LocalHostNetworkAdapter = class extends NetworkAdapter {
|
|
2796
2937
|
constructor() {
|
|
2797
2938
|
super(...arguments);
|
|
2798
2939
|
this._peers = /* @__PURE__ */ new Map();
|
|
2940
|
+
this._connected = new Trigger2();
|
|
2799
2941
|
}
|
|
2800
2942
|
/**
|
|
2801
2943
|
* Emits `ready` event. That signals to `Repo` that it can start using the adapter.
|
|
@@ -2807,12 +2949,13 @@ var LocalHostNetworkAdapter = class extends NetworkAdapter {
|
|
|
2807
2949
|
}
|
|
2808
2950
|
connect(peerId) {
|
|
2809
2951
|
this.peerId = peerId;
|
|
2952
|
+
this._connected.wake();
|
|
2810
2953
|
}
|
|
2811
2954
|
send(message) {
|
|
2812
2955
|
const peer = this._peers.get(message.targetId);
|
|
2813
2956
|
invariant10(peer, "Peer not found.", {
|
|
2814
2957
|
F: __dxlog_file14,
|
|
2815
|
-
L:
|
|
2958
|
+
L: 187,
|
|
2816
2959
|
S: this,
|
|
2817
2960
|
A: [
|
|
2818
2961
|
"peer",
|
|
@@ -2832,7 +2975,7 @@ var LocalHostNetworkAdapter = class extends NetworkAdapter {
|
|
|
2832
2975
|
return new Stream2(({ next, close }) => {
|
|
2833
2976
|
invariant10(!this._peers.has(peerId), "Peer already connected.", {
|
|
2834
2977
|
F: __dxlog_file14,
|
|
2835
|
-
L:
|
|
2978
|
+
L: 205,
|
|
2836
2979
|
S: this,
|
|
2837
2980
|
A: [
|
|
2838
2981
|
"!this._peers.has(peerId)",
|
|
@@ -2854,19 +2997,35 @@ var LocalHostNetworkAdapter = class extends NetworkAdapter {
|
|
|
2854
2997
|
});
|
|
2855
2998
|
}
|
|
2856
2999
|
});
|
|
2857
|
-
this.
|
|
2858
|
-
|
|
2859
|
-
})
|
|
3000
|
+
this._connected.wait({
|
|
3001
|
+
timeout: 1e3
|
|
3002
|
+
}).then(() => {
|
|
3003
|
+
this.emit("peer-candidate", {
|
|
3004
|
+
peerMetadata: {},
|
|
3005
|
+
peerId
|
|
3006
|
+
});
|
|
3007
|
+
}).catch((err) => log13.catch(err, void 0, {
|
|
3008
|
+
F: __dxlog_file14,
|
|
3009
|
+
L: 230,
|
|
3010
|
+
S: this,
|
|
3011
|
+
C: (f, a) => f(...a)
|
|
3012
|
+
}));
|
|
2860
3013
|
});
|
|
2861
3014
|
}
|
|
2862
3015
|
async sendSyncMessage({ id, syncMessage }) {
|
|
3016
|
+
await this._connected.wait({
|
|
3017
|
+
timeout: 1e3
|
|
3018
|
+
});
|
|
2863
3019
|
const message = cbor.decode(syncMessage);
|
|
2864
3020
|
this.emit("message", message);
|
|
2865
3021
|
}
|
|
2866
|
-
getHostInfo() {
|
|
3022
|
+
async getHostInfo() {
|
|
3023
|
+
await this._connected.wait({
|
|
3024
|
+
timeout: 1e3
|
|
3025
|
+
});
|
|
2867
3026
|
invariant10(this.peerId, "Peer id not set.", {
|
|
2868
3027
|
F: __dxlog_file14,
|
|
2869
|
-
L:
|
|
3028
|
+
L: 242,
|
|
2870
3029
|
S: this,
|
|
2871
3030
|
A: [
|
|
2872
3031
|
"this.peerId",
|
|
@@ -2902,7 +3061,7 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
|
|
|
2902
3061
|
const extension = this._extensions.get(receiverId);
|
|
2903
3062
|
invariant10(extension, "Extension not found.", {
|
|
2904
3063
|
F: __dxlog_file14,
|
|
2905
|
-
L:
|
|
3064
|
+
L: 277,
|
|
2906
3065
|
S: this,
|
|
2907
3066
|
A: [
|
|
2908
3067
|
"extension",
|
|
@@ -2913,7 +3072,7 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
|
|
|
2913
3072
|
payload: cbor.encode(message)
|
|
2914
3073
|
}).catch((err) => log13.catch(err, void 0, {
|
|
2915
3074
|
F: __dxlog_file14,
|
|
2916
|
-
L:
|
|
3075
|
+
L: 278,
|
|
2917
3076
|
S: this,
|
|
2918
3077
|
C: (f, a) => f(...a)
|
|
2919
3078
|
}));
|
|
@@ -2923,7 +3082,7 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
|
|
|
2923
3082
|
createExtension() {
|
|
2924
3083
|
invariant10(this.peerId, "Peer id not set.", {
|
|
2925
3084
|
F: __dxlog_file14,
|
|
2926
|
-
L:
|
|
3085
|
+
L: 286,
|
|
2927
3086
|
S: this,
|
|
2928
3087
|
A: [
|
|
2929
3088
|
"this.peerId",
|
|
@@ -2934,13 +3093,17 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
|
|
|
2934
3093
|
const extension = new AutomergeReplicator({
|
|
2935
3094
|
peerId: this.peerId
|
|
2936
3095
|
}, {
|
|
2937
|
-
onStartReplication: async (info) => {
|
|
3096
|
+
onStartReplication: async (info, remotePeerId) => {
|
|
2938
3097
|
if (this._extensions.has(info.id)) {
|
|
2939
3098
|
return;
|
|
2940
3099
|
}
|
|
2941
3100
|
peerInfo = info;
|
|
2942
3101
|
this._extensions.set(info.id, extension);
|
|
2943
3102
|
this.emit("peer-candidate", {
|
|
3103
|
+
// TODO(mykola): Hack, stop abusing `peerMetadata` field.
|
|
3104
|
+
peerMetadata: {
|
|
3105
|
+
dxos_deviceKey: remotePeerId.toHex()
|
|
3106
|
+
},
|
|
2944
3107
|
peerId: info.id
|
|
2945
3108
|
});
|
|
2946
3109
|
},
|
|
@@ -2949,9 +3112,13 @@ var MeshNetworkAdapter = class extends NetworkAdapter {
|
|
|
2949
3112
|
this.emit("message", message);
|
|
2950
3113
|
},
|
|
2951
3114
|
onClose: async () => {
|
|
2952
|
-
|
|
3115
|
+
if (!peerInfo) {
|
|
3116
|
+
return;
|
|
3117
|
+
}
|
|
3118
|
+
this.emit("peer-disconnected", {
|
|
2953
3119
|
peerId: peerInfo.id
|
|
2954
3120
|
});
|
|
3121
|
+
this._extensions.delete(peerInfo.id);
|
|
2955
3122
|
}
|
|
2956
3123
|
});
|
|
2957
3124
|
return extension;
|
|
@@ -2961,8 +3128,12 @@ var AutomergeStorageAdapter = class extends StorageAdapter {
|
|
|
2961
3128
|
constructor(_directory) {
|
|
2962
3129
|
super();
|
|
2963
3130
|
this._directory = _directory;
|
|
3131
|
+
this._state = "opened";
|
|
2964
3132
|
}
|
|
2965
3133
|
async load(key) {
|
|
3134
|
+
if (this._state !== "opened") {
|
|
3135
|
+
return void 0;
|
|
3136
|
+
}
|
|
2966
3137
|
const filename = this._getFilename(key);
|
|
2967
3138
|
const file = this._directory.getOrCreateFile(filename);
|
|
2968
3139
|
const { size } = await file.stat();
|
|
@@ -2973,6 +3144,9 @@ var AutomergeStorageAdapter = class extends StorageAdapter {
|
|
|
2973
3144
|
return bufferToArray(buffer);
|
|
2974
3145
|
}
|
|
2975
3146
|
async save(key, data) {
|
|
3147
|
+
if (this._state !== "opened") {
|
|
3148
|
+
return void 0;
|
|
3149
|
+
}
|
|
2976
3150
|
const filename = this._getFilename(key);
|
|
2977
3151
|
const file = this._directory.getOrCreateFile(filename);
|
|
2978
3152
|
await file.write(0, arrayToBuffer2(data));
|
|
@@ -2980,11 +3154,17 @@ var AutomergeStorageAdapter = class extends StorageAdapter {
|
|
|
2980
3154
|
await file.flush?.();
|
|
2981
3155
|
}
|
|
2982
3156
|
async remove(key) {
|
|
3157
|
+
if (this._state !== "opened") {
|
|
3158
|
+
return void 0;
|
|
3159
|
+
}
|
|
2983
3160
|
const filename = this._getFilename(key);
|
|
2984
3161
|
const file = this._directory.getOrCreateFile(filename);
|
|
2985
|
-
await file.
|
|
3162
|
+
await file.destroy();
|
|
2986
3163
|
}
|
|
2987
3164
|
async loadRange(keyPrefix) {
|
|
3165
|
+
if (this._state !== "opened") {
|
|
3166
|
+
return [];
|
|
3167
|
+
}
|
|
2988
3168
|
const filename = this._getFilename(keyPrefix);
|
|
2989
3169
|
const entries = await this._directory.list();
|
|
2990
3170
|
return Promise.all(entries.filter((entry) => entry.startsWith(filename)).map(async (entry) => {
|
|
@@ -2998,13 +3178,19 @@ var AutomergeStorageAdapter = class extends StorageAdapter {
|
|
|
2998
3178
|
}));
|
|
2999
3179
|
}
|
|
3000
3180
|
async removeRange(keyPrefix) {
|
|
3181
|
+
if (this._state !== "opened") {
|
|
3182
|
+
return void 0;
|
|
3183
|
+
}
|
|
3001
3184
|
const filename = this._getFilename(keyPrefix);
|
|
3002
3185
|
const entries = await this._directory.list();
|
|
3003
3186
|
await Promise.all(entries.filter((entry) => entry.startsWith(filename)).map(async (entry) => {
|
|
3004
|
-
const file = this._directory.getOrCreateFile(
|
|
3005
|
-
await file.
|
|
3187
|
+
const file = this._directory.getOrCreateFile(entry);
|
|
3188
|
+
await file.destroy();
|
|
3006
3189
|
}));
|
|
3007
3190
|
}
|
|
3191
|
+
async close() {
|
|
3192
|
+
this._state = "closed";
|
|
3193
|
+
}
|
|
3008
3194
|
_getFilename(key) {
|
|
3009
3195
|
return key.map((k) => k.replaceAll("%", "%25").replaceAll("-", "%2D")).join("-");
|
|
3010
3196
|
}
|
|
@@ -3040,4 +3226,4 @@ export {
|
|
|
3040
3226
|
SpaceManager,
|
|
3041
3227
|
AutomergeHost
|
|
3042
3228
|
};
|
|
3043
|
-
//# sourceMappingURL=chunk-
|
|
3229
|
+
//# sourceMappingURL=chunk-CTE522SL.mjs.map
|