@dxos/echo-pipeline 0.4.10-main.c42bfdb → 0.4.10-main.ccba876
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-RA6MLCZM.mjs → chunk-SYE4EK33.mjs} +17 -9
- package/dist/lib/browser/chunk-SYE4EK33.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +237 -141
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +8 -2
- package/dist/lib/browser/testing/index.mjs.map +4 -4
- package/dist/lib/node/{chunk-KGIYLJBT.cjs → chunk-WCTX6RNS.cjs} +19 -11
- package/dist/lib/node/chunk-WCTX6RNS.cjs.map +7 -0
- package/dist/lib/node/index.cjs +241 -150
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +18 -13
- package/dist/lib/node/testing/index.cjs.map +4 -4
- package/dist/types/src/automerge/automerge-host.d.ts +18 -9
- package/dist/types/src/automerge/automerge-host.d.ts.map +1 -1
- package/dist/types/src/automerge/level.test.d.ts +2 -0
- package/dist/types/src/automerge/level.test.d.ts.map +1 -0
- package/dist/types/src/automerge/leveldb-storage-adapter.d.ts +27 -0
- package/dist/types/src/automerge/leveldb-storage-adapter.d.ts.map +1 -0
- package/dist/types/src/automerge/migrations.d.ts +7 -0
- package/dist/types/src/automerge/migrations.d.ts.map +1 -0
- package/dist/types/src/automerge/storage-adapter.test.d.ts +2 -0
- package/dist/types/src/automerge/storage-adapter.test.d.ts.map +1 -0
- package/dist/types/src/automerge/types.d.ts +5 -0
- package/dist/types/src/automerge/types.d.ts.map +1 -1
- package/dist/types/src/metadata/metadata-store.d.ts +2 -1
- package/dist/types/src/metadata/metadata-store.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/dist/types/src/testing/level.d.ts +3 -0
- package/dist/types/src/testing/level.d.ts.map +1 -0
- package/package.json +33 -30
- package/src/automerge/automerge-host.test.ts +19 -5
- package/src/automerge/automerge-host.ts +37 -27
- package/src/automerge/level.test.ts +43 -0
- package/src/automerge/leveldb-storage-adapter.ts +105 -0
- package/src/automerge/migrations.ts +41 -0
- package/src/automerge/storage-adapter.test.ts +90 -0
- package/src/automerge/types.ts +5 -3
- package/src/metadata/metadata-store.ts +17 -8
- package/src/testing/index.ts +1 -0
- package/src/testing/level.ts +11 -0
- package/dist/lib/browser/chunk-RA6MLCZM.mjs.map +0 -7
- package/dist/lib/node/chunk-KGIYLJBT.cjs.map +0 -7
|
@@ -2,6 +2,7 @@ import "@dxos/node-std/globals";
|
|
|
2
2
|
import {
|
|
3
3
|
AuthExtension,
|
|
4
4
|
AuthStatus,
|
|
5
|
+
Buffer,
|
|
5
6
|
DataServiceImpl,
|
|
6
7
|
MOCK_AUTH_PROVIDER,
|
|
7
8
|
MOCK_AUTH_VERIFIER,
|
|
@@ -16,128 +17,105 @@ import {
|
|
|
16
17
|
TimeframeClock,
|
|
17
18
|
codec,
|
|
18
19
|
createMappedFeedWriter,
|
|
20
|
+
hasInvitationExpired,
|
|
19
21
|
mapFeedIndexesToTimeframe,
|
|
20
22
|
mapTimeframeToFeedIndexes,
|
|
21
23
|
startAfter,
|
|
22
24
|
valueEncoding
|
|
23
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-SYE4EK33.mjs";
|
|
24
26
|
|
|
25
27
|
// packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts
|
|
26
28
|
import { next as automerge, getHeads } from "@dxos/automerge/automerge";
|
|
27
29
|
import { Repo } from "@dxos/automerge/automerge-repo";
|
|
28
|
-
import { IndexedDBStorageAdapter } from "@dxos/automerge/automerge-repo-storage-indexeddb";
|
|
29
30
|
import { Context } from "@dxos/context";
|
|
30
31
|
import { PublicKey } from "@dxos/keys";
|
|
31
|
-
import { log as
|
|
32
|
+
import { log as log4 } from "@dxos/log";
|
|
32
33
|
import { idCodec } from "@dxos/protocols";
|
|
33
|
-
import { StorageType } from "@dxos/random-access-storage";
|
|
34
34
|
import { trace } from "@dxos/tracing";
|
|
35
35
|
import { ComplexMap, ComplexSet, defaultMap, mapValues } from "@dxos/util";
|
|
36
36
|
|
|
37
|
-
// packages/core/echo/echo-pipeline/src/automerge/
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
this._directory = _directory;
|
|
37
|
+
// packages/core/echo/echo-pipeline/src/automerge/leveldb-storage-adapter.ts
|
|
38
|
+
var LevelDBStorageAdapter = class {
|
|
39
|
+
constructor(_params) {
|
|
40
|
+
this._params = _params;
|
|
42
41
|
this._state = "opened";
|
|
43
42
|
}
|
|
44
|
-
async load(
|
|
43
|
+
async load(keyArray) {
|
|
45
44
|
if (this._state !== "opened") {
|
|
46
45
|
return void 0;
|
|
47
46
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
if (!size || size === 0) {
|
|
52
|
-
return void 0;
|
|
53
|
-
}
|
|
54
|
-
const buffer = await file.read(0, size);
|
|
55
|
-
return bufferToArray(buffer);
|
|
47
|
+
return this._params.db.get(keyArray, {
|
|
48
|
+
...encodingOptions
|
|
49
|
+
}).catch((err) => err.code === "LEVEL_NOT_FOUND" ? void 0 : Promise.reject(err));
|
|
56
50
|
}
|
|
57
|
-
async save(
|
|
51
|
+
async save(keyArray, binary) {
|
|
58
52
|
if (this._state !== "opened") {
|
|
59
53
|
return void 0;
|
|
60
54
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
await
|
|
55
|
+
await this._params.callbacks?.beforeSave?.(keyArray);
|
|
56
|
+
await this._params.db.put(keyArray, Buffer.from(binary), {
|
|
57
|
+
...encodingOptions
|
|
58
|
+
});
|
|
59
|
+
await this._params.callbacks?.afterSave?.(keyArray);
|
|
66
60
|
}
|
|
67
|
-
async remove(
|
|
61
|
+
async remove(keyArray) {
|
|
68
62
|
if (this._state !== "opened") {
|
|
69
63
|
return void 0;
|
|
70
64
|
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
65
|
+
await this._params.db.del(keyArray, {
|
|
66
|
+
...encodingOptions
|
|
67
|
+
});
|
|
74
68
|
}
|
|
75
69
|
async loadRange(keyPrefix) {
|
|
76
70
|
if (this._state !== "opened") {
|
|
77
71
|
return [];
|
|
78
72
|
}
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
73
|
+
const result = [];
|
|
74
|
+
for await (const [key, value] of this._params.db.iterator({
|
|
75
|
+
gte: keyPrefix,
|
|
76
|
+
lte: [
|
|
77
|
+
...keyPrefix,
|
|
78
|
+
"\uFFFF"
|
|
79
|
+
],
|
|
80
|
+
...encodingOptions
|
|
81
|
+
})) {
|
|
82
|
+
result.push({
|
|
83
|
+
key,
|
|
84
|
+
data: value
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
90
88
|
}
|
|
91
89
|
async removeRange(keyPrefix) {
|
|
92
90
|
if (this._state !== "opened") {
|
|
93
91
|
return void 0;
|
|
94
92
|
}
|
|
95
|
-
const
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
93
|
+
const batch = this._params.db.batch();
|
|
94
|
+
for await (const [key] of this._params.db.iterator({
|
|
95
|
+
gte: keyPrefix,
|
|
96
|
+
lte: [
|
|
97
|
+
...keyPrefix,
|
|
98
|
+
"\uFFFF"
|
|
99
|
+
],
|
|
100
|
+
...encodingOptions
|
|
101
|
+
})) {
|
|
102
|
+
batch.del(key, {
|
|
103
|
+
...encodingOptions
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
await batch.write();
|
|
101
107
|
}
|
|
102
|
-
|
|
108
|
+
close() {
|
|
103
109
|
this._state = "closed";
|
|
104
110
|
}
|
|
105
|
-
_getFilename(key) {
|
|
106
|
-
return key.map((k) => k.replaceAll("%", "%25").replaceAll("-", "%2D")).join("-");
|
|
107
|
-
}
|
|
108
|
-
_getKeyFromFilename(filename) {
|
|
109
|
-
return filename.split("-").map((k) => k.replaceAll("%2D", "-").replaceAll("%25", "%"));
|
|
110
|
-
}
|
|
111
111
|
};
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
async load(key) {
|
|
120
|
-
return this._storage.load(key);
|
|
121
|
-
}
|
|
122
|
-
async save(key, value) {
|
|
123
|
-
await this._callbacks.beforeSave?.(key);
|
|
124
|
-
await this._storage.save(key, value);
|
|
125
|
-
await this._callbacks.afterSave?.(key);
|
|
126
|
-
}
|
|
127
|
-
async remove(key) {
|
|
128
|
-
return this._storage.remove(key);
|
|
129
|
-
}
|
|
130
|
-
async loadRange(keyPrefix) {
|
|
131
|
-
return this._storage.loadRange(keyPrefix);
|
|
132
|
-
}
|
|
133
|
-
async removeRange(keyPrefix) {
|
|
134
|
-
return this._storage.removeRange(keyPrefix);
|
|
135
|
-
}
|
|
136
|
-
async close() {
|
|
137
|
-
if (this._storage instanceof AutomergeStorageAdapter) {
|
|
138
|
-
return this._storage.close();
|
|
139
|
-
}
|
|
140
|
-
}
|
|
112
|
+
var keyEncoder = {
|
|
113
|
+
encode: (key) => Buffer.from(key.map((k) => k.replaceAll("%", "%25").replaceAll("-", "%2D")).join("-")),
|
|
114
|
+
decode: (key) => Buffer.from(key).toString().split("-").map((k) => k.replaceAll("%2D", "-").replaceAll("%25", "%"))
|
|
115
|
+
};
|
|
116
|
+
var encodingOptions = {
|
|
117
|
+
keyEncoding: keyEncoder,
|
|
118
|
+
valueEncoding: "buffer"
|
|
141
119
|
};
|
|
142
120
|
|
|
143
121
|
// packages/core/echo/echo-pipeline/src/automerge/local-host-network-adapter.ts
|
|
@@ -372,6 +350,118 @@ var MeshNetworkAdapter = class extends NetworkAdapter2 {
|
|
|
372
350
|
}
|
|
373
351
|
};
|
|
374
352
|
|
|
353
|
+
// packages/core/echo/echo-pipeline/src/automerge/migrations.ts
|
|
354
|
+
import { IndexedDBStorageAdapter } from "@dxos/automerge/automerge-repo-storage-indexeddb";
|
|
355
|
+
import { log as log3 } from "@dxos/log";
|
|
356
|
+
import { StorageType } from "@dxos/random-access-storage";
|
|
357
|
+
|
|
358
|
+
// packages/core/echo/echo-pipeline/src/automerge/automerge-storage-adapter.ts
|
|
359
|
+
import { arrayToBuffer, bufferToArray } from "@dxos/util";
|
|
360
|
+
var AutomergeStorageAdapter = class {
|
|
361
|
+
constructor(_directory) {
|
|
362
|
+
this._directory = _directory;
|
|
363
|
+
this._state = "opened";
|
|
364
|
+
}
|
|
365
|
+
async load(key) {
|
|
366
|
+
if (this._state !== "opened") {
|
|
367
|
+
return void 0;
|
|
368
|
+
}
|
|
369
|
+
const filename = this._getFilename(key);
|
|
370
|
+
const file = this._directory.getOrCreateFile(filename);
|
|
371
|
+
const { size } = await file.stat();
|
|
372
|
+
if (!size || size === 0) {
|
|
373
|
+
return void 0;
|
|
374
|
+
}
|
|
375
|
+
const buffer = await file.read(0, size);
|
|
376
|
+
return bufferToArray(buffer);
|
|
377
|
+
}
|
|
378
|
+
async save(key, data) {
|
|
379
|
+
if (this._state !== "opened") {
|
|
380
|
+
return void 0;
|
|
381
|
+
}
|
|
382
|
+
const filename = this._getFilename(key);
|
|
383
|
+
const file = this._directory.getOrCreateFile(filename);
|
|
384
|
+
await file.write(0, arrayToBuffer(data));
|
|
385
|
+
await file.truncate?.(data.length);
|
|
386
|
+
await file.flush?.();
|
|
387
|
+
}
|
|
388
|
+
async remove(key) {
|
|
389
|
+
if (this._state !== "opened") {
|
|
390
|
+
return void 0;
|
|
391
|
+
}
|
|
392
|
+
const filename = this._getFilename(key);
|
|
393
|
+
const file = this._directory.getOrCreateFile(filename);
|
|
394
|
+
await file.destroy();
|
|
395
|
+
}
|
|
396
|
+
async loadRange(keyPrefix) {
|
|
397
|
+
if (this._state !== "opened") {
|
|
398
|
+
return [];
|
|
399
|
+
}
|
|
400
|
+
const filename = this._getFilename(keyPrefix);
|
|
401
|
+
const entries = await this._directory.list();
|
|
402
|
+
return Promise.all(entries.filter((entry) => entry.startsWith(filename)).map(async (entry) => {
|
|
403
|
+
const file = this._directory.getOrCreateFile(entry);
|
|
404
|
+
const { size } = await file.stat();
|
|
405
|
+
const buffer = await file.read(0, size);
|
|
406
|
+
return {
|
|
407
|
+
key: this._getKeyFromFilename(entry),
|
|
408
|
+
data: bufferToArray(buffer)
|
|
409
|
+
};
|
|
410
|
+
}));
|
|
411
|
+
}
|
|
412
|
+
async removeRange(keyPrefix) {
|
|
413
|
+
if (this._state !== "opened") {
|
|
414
|
+
return void 0;
|
|
415
|
+
}
|
|
416
|
+
const filename = this._getFilename(keyPrefix);
|
|
417
|
+
const entries = await this._directory.list();
|
|
418
|
+
await Promise.all(entries.filter((entry) => entry.startsWith(filename)).map(async (entry) => {
|
|
419
|
+
const file = this._directory.getOrCreateFile(entry);
|
|
420
|
+
await file.destroy();
|
|
421
|
+
}));
|
|
422
|
+
}
|
|
423
|
+
async close() {
|
|
424
|
+
this._state = "closed";
|
|
425
|
+
}
|
|
426
|
+
_getFilename(key) {
|
|
427
|
+
return key.map((k) => k.replaceAll("%", "%25").replaceAll("-", "%2D")).join("-");
|
|
428
|
+
}
|
|
429
|
+
_getKeyFromFilename(filename) {
|
|
430
|
+
return filename.split("-").map((k) => k.replaceAll("%2D", "-").replaceAll("%25", "%"));
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
|
|
434
|
+
// packages/core/echo/echo-pipeline/src/automerge/migrations.ts
|
|
435
|
+
var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/migrations.ts";
|
|
436
|
+
var levelMigration = async ({ db, directory }) => {
|
|
437
|
+
const isNewLevel = !await db.iterator({
|
|
438
|
+
...encodingOptions
|
|
439
|
+
}).next();
|
|
440
|
+
if (!isNewLevel) {
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
const oldStorageAdapter = directory.type === StorageType.IDB ? new IndexedDBStorageAdapter(directory.path, "data") : new AutomergeStorageAdapter(directory);
|
|
444
|
+
const chunks = await oldStorageAdapter.loadRange([]);
|
|
445
|
+
if (chunks.length === 0) {
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
const batch = db.batch();
|
|
449
|
+
log3.info("found chunks on old storage adapter", {
|
|
450
|
+
chunks: chunks.length
|
|
451
|
+
}, {
|
|
452
|
+
F: __dxlog_file3,
|
|
453
|
+
L: 36,
|
|
454
|
+
S: void 0,
|
|
455
|
+
C: (f, a) => f(...a)
|
|
456
|
+
});
|
|
457
|
+
for (const { key, data } of await oldStorageAdapter.loadRange([])) {
|
|
458
|
+
data && batch.put(key, data, {
|
|
459
|
+
...encodingOptions
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
await batch.write();
|
|
463
|
+
};
|
|
464
|
+
|
|
375
465
|
// packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts
|
|
376
466
|
function _ts_decorate(decorators, target, key, desc) {
|
|
377
467
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -383,9 +473,9 @@ function _ts_decorate(decorators, target, key, desc) {
|
|
|
383
473
|
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
384
474
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
385
475
|
}
|
|
386
|
-
var
|
|
476
|
+
var __dxlog_file4 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/automerge-host.ts";
|
|
387
477
|
var AutomergeHost = class {
|
|
388
|
-
constructor({ directory, metadata }) {
|
|
478
|
+
constructor({ directory, db, metadata }) {
|
|
389
479
|
this._ctx = new Context();
|
|
390
480
|
/**
|
|
391
481
|
* spaceKey -> deviceKey[]
|
|
@@ -393,19 +483,24 @@ var AutomergeHost = class {
|
|
|
393
483
|
this._authorizedDevices = new ComplexMap(PublicKey.hash);
|
|
394
484
|
this._updatingMetadata = /* @__PURE__ */ new Map();
|
|
395
485
|
this._requestedDocs = /* @__PURE__ */ new Set();
|
|
486
|
+
this._directory = directory;
|
|
487
|
+
this._db = db;
|
|
396
488
|
this._metadata = metadata;
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
this.
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
489
|
+
}
|
|
490
|
+
async open() {
|
|
491
|
+
this._directory && await levelMigration({
|
|
492
|
+
db: await this._db,
|
|
493
|
+
directory: this._directory
|
|
494
|
+
});
|
|
495
|
+
this._storage = new LevelDBStorageAdapter({
|
|
496
|
+
db: await this._db,
|
|
404
497
|
callbacks: {
|
|
405
498
|
beforeSave: (params) => this._beforeSave(params)
|
|
406
499
|
}
|
|
407
500
|
});
|
|
408
501
|
this._peerId = `host-${PublicKey.random().toHex()}`;
|
|
502
|
+
this._meshNetwork = new MeshNetworkAdapter();
|
|
503
|
+
this._clientNetwork = new LocalHostNetworkAdapter();
|
|
409
504
|
this._repo = new Repo({
|
|
410
505
|
peerId: this._peerId,
|
|
411
506
|
network: [
|
|
@@ -425,13 +520,13 @@ var AutomergeHost = class {
|
|
|
425
520
|
const doc = this._repo.handles[documentId]?.docSync();
|
|
426
521
|
if (!doc) {
|
|
427
522
|
const isRequested = this._requestedDocs.has(`automerge:${documentId}`);
|
|
428
|
-
|
|
523
|
+
log4("doc share policy check", {
|
|
429
524
|
peerId,
|
|
430
525
|
documentId,
|
|
431
526
|
isRequested
|
|
432
527
|
}, {
|
|
433
|
-
F:
|
|
434
|
-
L:
|
|
528
|
+
F: __dxlog_file4,
|
|
529
|
+
L: 111,
|
|
435
530
|
S: this,
|
|
436
531
|
C: (f, a) => f(...a)
|
|
437
532
|
});
|
|
@@ -440,12 +535,12 @@ var AutomergeHost = class {
|
|
|
440
535
|
try {
|
|
441
536
|
const spaceKey = getSpaceKeyFromDoc(doc);
|
|
442
537
|
if (!spaceKey) {
|
|
443
|
-
|
|
538
|
+
log4("space key not found for share policy check", {
|
|
444
539
|
peerId,
|
|
445
540
|
documentId
|
|
446
541
|
}, {
|
|
447
|
-
F:
|
|
448
|
-
L:
|
|
542
|
+
F: __dxlog_file4,
|
|
543
|
+
L: 118,
|
|
449
544
|
S: this,
|
|
450
545
|
C: (f, a) => f(...a)
|
|
451
546
|
});
|
|
@@ -454,12 +549,12 @@ var AutomergeHost = class {
|
|
|
454
549
|
const authorizedDevices = this._authorizedDevices.get(PublicKey.from(spaceKey));
|
|
455
550
|
const deviceKeyHex = this.repo.peerMetadataByPeerId[peerId]?.dxos_deviceKey;
|
|
456
551
|
if (!deviceKeyHex) {
|
|
457
|
-
|
|
552
|
+
log4("device key not found for share policy check", {
|
|
458
553
|
peerId,
|
|
459
554
|
documentId
|
|
460
555
|
}, {
|
|
461
|
-
F:
|
|
462
|
-
L:
|
|
556
|
+
F: __dxlog_file4,
|
|
557
|
+
L: 127,
|
|
463
558
|
S: this,
|
|
464
559
|
C: (f, a) => f(...a)
|
|
465
560
|
});
|
|
@@ -467,7 +562,7 @@ var AutomergeHost = class {
|
|
|
467
562
|
}
|
|
468
563
|
const deviceKey = PublicKey.from(deviceKeyHex);
|
|
469
564
|
const isAuthorized = authorizedDevices?.has(deviceKey) ?? false;
|
|
470
|
-
|
|
565
|
+
log4("share policy check", {
|
|
471
566
|
localPeer: this._peerId,
|
|
472
567
|
remotePeer: peerId,
|
|
473
568
|
documentId,
|
|
@@ -475,16 +570,16 @@ var AutomergeHost = class {
|
|
|
475
570
|
spaceKey,
|
|
476
571
|
isAuthorized
|
|
477
572
|
}, {
|
|
478
|
-
F:
|
|
479
|
-
L:
|
|
573
|
+
F: __dxlog_file4,
|
|
574
|
+
L: 133,
|
|
480
575
|
S: this,
|
|
481
576
|
C: (f, a) => f(...a)
|
|
482
577
|
});
|
|
483
578
|
return isAuthorized;
|
|
484
579
|
} catch (err) {
|
|
485
|
-
|
|
486
|
-
F:
|
|
487
|
-
L:
|
|
580
|
+
log4.catch(err, void 0, {
|
|
581
|
+
F: __dxlog_file4,
|
|
582
|
+
L: 143,
|
|
488
583
|
S: this,
|
|
489
584
|
C: (f, a) => f(...a)
|
|
490
585
|
});
|
|
@@ -503,6 +598,11 @@ var AutomergeHost = class {
|
|
|
503
598
|
});
|
|
504
599
|
}
|
|
505
600
|
}
|
|
601
|
+
async close() {
|
|
602
|
+
this._storage.close?.();
|
|
603
|
+
await this._clientNetwork.close();
|
|
604
|
+
await this._ctx.dispose();
|
|
605
|
+
}
|
|
506
606
|
get repo() {
|
|
507
607
|
return this._repo;
|
|
508
608
|
}
|
|
@@ -540,9 +640,9 @@ var AutomergeHost = class {
|
|
|
540
640
|
const markingDirtyPromise = this._metadata.markDirty(idToLastHash).then(() => {
|
|
541
641
|
this._updatingMetadata.delete(event.handle.documentId);
|
|
542
642
|
}).catch((err) => {
|
|
543
|
-
this._ctx.disposed &&
|
|
544
|
-
F:
|
|
545
|
-
L:
|
|
643
|
+
this._ctx.disposed && log4.catch(err, void 0, {
|
|
644
|
+
F: __dxlog_file4,
|
|
645
|
+
L: 207,
|
|
546
646
|
S: this,
|
|
547
647
|
C: (f, a) => f(...a)
|
|
548
648
|
});
|
|
@@ -574,11 +674,6 @@ var AutomergeHost = class {
|
|
|
574
674
|
_automergePeers() {
|
|
575
675
|
return this._repo.peers;
|
|
576
676
|
}
|
|
577
|
-
async close() {
|
|
578
|
-
await this._storage.close();
|
|
579
|
-
await this._clientNetwork.close();
|
|
580
|
-
await this._ctx.dispose();
|
|
581
|
-
}
|
|
582
677
|
//
|
|
583
678
|
// Methods for client-services.
|
|
584
679
|
//
|
|
@@ -602,12 +697,12 @@ var AutomergeHost = class {
|
|
|
602
697
|
return this._meshNetwork.createExtension();
|
|
603
698
|
}
|
|
604
699
|
authorizeDevice(spaceKey, deviceKey) {
|
|
605
|
-
|
|
700
|
+
log4("authorizeDevice", {
|
|
606
701
|
spaceKey,
|
|
607
702
|
deviceKey
|
|
608
703
|
}, {
|
|
609
|
-
F:
|
|
610
|
-
L:
|
|
704
|
+
F: __dxlog_file4,
|
|
705
|
+
L: 274,
|
|
611
706
|
S: this,
|
|
612
707
|
C: (f, a) => f(...a)
|
|
613
708
|
});
|
|
@@ -661,8 +756,8 @@ import { Event } from "@dxos/async";
|
|
|
661
756
|
import { cancelWithContext } from "@dxos/context";
|
|
662
757
|
import { warnAfterTimeout } from "@dxos/debug";
|
|
663
758
|
import { invariant as invariant3 } from "@dxos/invariant";
|
|
664
|
-
import { log as
|
|
665
|
-
var
|
|
759
|
+
import { log as log5 } from "@dxos/log";
|
|
760
|
+
var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/core/echo/echo-pipeline/src/automerge/automerge-doc-loader.ts";
|
|
666
761
|
var AutomergeDocumentLoaderImpl = class {
|
|
667
762
|
constructor(_spaceKey, _repo) {
|
|
668
763
|
this._spaceKey = _spaceKey;
|
|
@@ -682,10 +777,10 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
682
777
|
return;
|
|
683
778
|
}
|
|
684
779
|
if (!spaceState.rootUrl) {
|
|
685
|
-
|
|
780
|
+
log5.error("Database opened with no rootUrl", {
|
|
686
781
|
spaceKey: this._spaceKey
|
|
687
782
|
}, {
|
|
688
|
-
F:
|
|
783
|
+
F: __dxlog_file5,
|
|
689
784
|
L: 66,
|
|
690
785
|
S: this,
|
|
691
786
|
C: (f, a) => f(...a)
|
|
@@ -695,7 +790,7 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
695
790
|
const existingDocHandle = await this._initDocHandle(ctx, spaceState.rootUrl);
|
|
696
791
|
const doc = existingDocHandle.docSync();
|
|
697
792
|
invariant3(doc, void 0, {
|
|
698
|
-
F:
|
|
793
|
+
F: __dxlog_file5,
|
|
699
794
|
L: 71,
|
|
700
795
|
S: this,
|
|
701
796
|
A: [
|
|
@@ -711,7 +806,7 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
711
806
|
}
|
|
712
807
|
loadObjectDocument(objectId) {
|
|
713
808
|
invariant3(this._spaceRootDocHandle, void 0, {
|
|
714
|
-
F:
|
|
809
|
+
F: __dxlog_file5,
|
|
715
810
|
L: 80,
|
|
716
811
|
S: this,
|
|
717
812
|
A: [
|
|
@@ -724,7 +819,7 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
724
819
|
}
|
|
725
820
|
const spaceRootDoc = this._spaceRootDocHandle.docSync();
|
|
726
821
|
invariant3(spaceRootDoc, void 0, {
|
|
727
|
-
F:
|
|
822
|
+
F: __dxlog_file5,
|
|
728
823
|
L: 85,
|
|
729
824
|
S: this,
|
|
730
825
|
A: [
|
|
@@ -735,10 +830,10 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
735
830
|
const documentUrl = (spaceRootDoc.links ?? {})[objectId];
|
|
736
831
|
if (documentUrl == null) {
|
|
737
832
|
this._objectsPendingDocumentLoad.add(objectId);
|
|
738
|
-
|
|
833
|
+
log5.info("loading delayed until object links are initialized", {
|
|
739
834
|
objectId
|
|
740
835
|
}, {
|
|
741
|
-
F:
|
|
836
|
+
F: __dxlog_file5,
|
|
742
837
|
L: 89,
|
|
743
838
|
S: this,
|
|
744
839
|
C: (f, a) => f(...a)
|
|
@@ -759,7 +854,7 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
759
854
|
}
|
|
760
855
|
getSpaceRootDocHandle() {
|
|
761
856
|
invariant3(this._spaceRootDocHandle, void 0, {
|
|
762
|
-
F:
|
|
857
|
+
F: __dxlog_file5,
|
|
763
858
|
L: 107,
|
|
764
859
|
S: this,
|
|
765
860
|
A: [
|
|
@@ -771,7 +866,7 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
771
866
|
}
|
|
772
867
|
createDocumentForObject(objectId) {
|
|
773
868
|
invariant3(this._spaceRootDocHandle, void 0, {
|
|
774
|
-
F:
|
|
869
|
+
F: __dxlog_file5,
|
|
775
870
|
L: 112,
|
|
776
871
|
S: this,
|
|
777
872
|
A: [
|
|
@@ -810,11 +905,11 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
810
905
|
};
|
|
811
906
|
const objectDocumentHandle = this._objectDocumentHandles.get(objectId);
|
|
812
907
|
if (objectDocumentHandle != null && objectDocumentHandle.url !== automergeUrl) {
|
|
813
|
-
|
|
908
|
+
log5.warn("object already inlined in a different document, ignoring the link", {
|
|
814
909
|
...logMeta,
|
|
815
910
|
actualDocumentUrl: objectDocumentHandle.url
|
|
816
911
|
}, {
|
|
817
|
-
F:
|
|
912
|
+
F: __dxlog_file5,
|
|
818
913
|
L: 142,
|
|
819
914
|
S: this,
|
|
820
915
|
C: (f, a) => f(...a)
|
|
@@ -822,8 +917,8 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
822
917
|
continue;
|
|
823
918
|
}
|
|
824
919
|
if (objectDocumentHandle?.url === automergeUrl) {
|
|
825
|
-
|
|
826
|
-
F:
|
|
920
|
+
log5.warn("object document was already loaded", logMeta, {
|
|
921
|
+
F: __dxlog_file5,
|
|
827
922
|
L: 149,
|
|
828
923
|
S: this,
|
|
829
924
|
C: (f, a) => f(...a)
|
|
@@ -831,8 +926,8 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
831
926
|
continue;
|
|
832
927
|
}
|
|
833
928
|
const handle = this._repo.find(automergeUrl);
|
|
834
|
-
|
|
835
|
-
F:
|
|
929
|
+
log5.debug("document loading triggered", logMeta, {
|
|
930
|
+
F: __dxlog_file5,
|
|
836
931
|
L: 153,
|
|
837
932
|
S: this,
|
|
838
933
|
C: (f, a) => f(...a)
|
|
@@ -851,11 +946,11 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
851
946
|
break;
|
|
852
947
|
} catch (err) {
|
|
853
948
|
if (`${err}`.includes("Timeout")) {
|
|
854
|
-
|
|
949
|
+
log5.info("wraparound", {
|
|
855
950
|
id: docHandle.documentId,
|
|
856
951
|
state: docHandle.state
|
|
857
952
|
}, {
|
|
858
|
-
F:
|
|
953
|
+
F: __dxlog_file5,
|
|
859
954
|
L: 169,
|
|
860
955
|
S: this,
|
|
861
956
|
C: (f, a) => f(...a)
|
|
@@ -896,8 +991,8 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
896
991
|
docUrl: handle.url
|
|
897
992
|
};
|
|
898
993
|
if (this.onObjectDocumentLoaded.listenerCount() === 0) {
|
|
899
|
-
|
|
900
|
-
F:
|
|
994
|
+
log5.info("document loaded after all listeners were removed", logMeta, {
|
|
995
|
+
F: __dxlog_file5,
|
|
901
996
|
L: 205,
|
|
902
997
|
S: this,
|
|
903
998
|
C: (f, a) => f(...a)
|
|
@@ -906,8 +1001,8 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
906
1001
|
}
|
|
907
1002
|
const objectDocHandle = this._objectDocumentHandles.get(objectId);
|
|
908
1003
|
if (objectDocHandle?.url !== handle.url) {
|
|
909
|
-
|
|
910
|
-
F:
|
|
1004
|
+
log5.warn("object was rebound while a document was loading, discarding handle", logMeta, {
|
|
1005
|
+
F: __dxlog_file5,
|
|
911
1006
|
L: 210,
|
|
912
1007
|
S: this,
|
|
913
1008
|
C: (f, a) => f(...a)
|
|
@@ -920,13 +1015,13 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
920
1015
|
});
|
|
921
1016
|
} catch (err) {
|
|
922
1017
|
const shouldRetryLoading = this.onObjectDocumentLoaded.listenerCount() > 0;
|
|
923
|
-
|
|
1018
|
+
log5.warn("failed to load a document", {
|
|
924
1019
|
objectId,
|
|
925
1020
|
automergeUrl: handle.url,
|
|
926
1021
|
retryLoading: shouldRetryLoading,
|
|
927
1022
|
err
|
|
928
1023
|
}, {
|
|
929
|
-
F:
|
|
1024
|
+
F: __dxlog_file5,
|
|
930
1025
|
L: 216,
|
|
931
1026
|
S: this,
|
|
932
1027
|
C: (f, a) => f(...a)
|
|
@@ -976,6 +1071,7 @@ export {
|
|
|
976
1071
|
decodeReference,
|
|
977
1072
|
encodeReference,
|
|
978
1073
|
getSpaceKeyFromDoc,
|
|
1074
|
+
hasInvitationExpired,
|
|
979
1075
|
isEncodedReferenceObject,
|
|
980
1076
|
mapFeedIndexesToTimeframe,
|
|
981
1077
|
mapTimeframeToFeedIndexes,
|