@dxos/teleport-extension-object-sync 0.8.4-main.a4bbb77 → 0.8.4-main.abd8ff62ef

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.
@@ -9,57 +9,97 @@ import { RpcClosedError } from "@dxos/protocols";
9
9
  import { schema } from "@dxos/protocols/proto";
10
10
  import { RpcExtension } from "@dxos/teleport";
11
11
  import { BitField } from "@dxos/util";
12
- function _define_property(obj, key, value) {
13
- if (key in obj) {
14
- Object.defineProperty(obj, key, {
15
- value,
16
- enumerable: true,
17
- configurable: true,
18
- writable: true
19
- });
20
- } else {
21
- obj[key] = value;
22
- }
23
- return obj;
24
- }
12
+ var __dxlog_file = "/__w/dxos/dxos/packages/core/mesh/teleport-extension-object-sync/src/blob-sync-extension.ts";
25
13
  function _ts_decorate(decorators, target, key, desc) {
26
14
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
27
15
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
28
16
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
29
17
  return c > 3 && r && Object.defineProperty(target, key, r), r;
30
18
  }
31
- var __dxlog_file = "/__w/dxos/dxos/packages/core/mesh/teleport-extension-object-sync/src/blob-sync-extension.ts";
32
- var MIN_WANT_LIST_UPDATE_INTERVAL = false ? 5 : 500;
19
+ var MIN_WANT_LIST_UPDATE_INTERVAL = process.env.NODE_ENV === "test" ? 5 : 500;
33
20
  var MAX_CONCURRENT_UPLOADS = 20;
34
21
  var BlobSyncExtension = class extends RpcExtension {
22
+ _params;
23
+ _ctx = new Context({
24
+ onError: (err) => log.catch(err, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 26, S: this })
25
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 25 });
26
+ _lastWantListUpdate = 0;
27
+ _localWantList = {
28
+ blobs: []
29
+ };
30
+ _updateWantList = new DeferredTask(this._ctx, async () => {
31
+ if (this._lastWantListUpdate + MIN_WANT_LIST_UPDATE_INTERVAL > Date.now()) {
32
+ await sleep(this._lastWantListUpdate + MIN_WANT_LIST_UPDATE_INTERVAL - Date.now());
33
+ if (this._ctx.disposed) {
34
+ return;
35
+ }
36
+ }
37
+ log("want", {
38
+ list: this._localWantList
39
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 40, S: this });
40
+ await this.rpc.BlobSyncService.want(this._localWantList);
41
+ this._lastWantListUpdate = Date.now();
42
+ });
43
+ _currentUploads = 0;
44
+ _upload = new DeferredTask(this._ctx, async () => {
45
+ if (this._currentUploads >= MAX_CONCURRENT_UPLOADS) {
46
+ return;
47
+ }
48
+ const blobChunks = await this._pickBlobChunks(MAX_CONCURRENT_UPLOADS - this._currentUploads);
49
+ if (!blobChunks) {
50
+ return;
51
+ }
52
+ for (const blobChunk of blobChunks) {
53
+ if (this._ctx.disposed) {
54
+ break;
55
+ }
56
+ this._currentUploads++;
57
+ this.push(blobChunk).catch((err) => {
58
+ if (err instanceof RpcClosedError) {
59
+ return;
60
+ }
61
+ log.warn("push failed", {
62
+ err
63
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 64, S: this });
64
+ }).finally(() => {
65
+ this._currentUploads--;
66
+ this.reconcileUploads();
67
+ });
68
+ }
69
+ });
70
+ /**
71
+ * Set of id's remote peer wants.
72
+ */
73
+ remoteWantList = {
74
+ blobs: []
75
+ };
76
+ constructor(_params) {
77
+ super({
78
+ exposed: {
79
+ BlobSyncService: schema.getService("dxos.mesh.teleport.blobsync.BlobSyncService")
80
+ },
81
+ requested: {
82
+ BlobSyncService: schema.getService("dxos.mesh.teleport.blobsync.BlobSyncService")
83
+ },
84
+ timeout: 2e4,
85
+ encodingOptions: {
86
+ preserveAny: true
87
+ }
88
+ }), this._params = _params;
89
+ }
35
90
  async onOpen(context) {
36
- log("open", void 0, {
37
- F: __dxlog_file,
38
- L: 108,
39
- S: this,
40
- C: (f, a) => f(...a)
41
- });
91
+ log("open", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 93, S: this });
42
92
  await super.onOpen(context);
43
93
  await this._params.onOpen();
44
94
  }
45
95
  async onClose(err) {
46
- log("close", void 0, {
47
- F: __dxlog_file,
48
- L: 114,
49
- S: this,
50
- C: (f, a) => f(...a)
51
- });
96
+ log("close", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 98, S: this });
52
97
  await this._ctx.dispose();
53
98
  await this._params.onClose();
54
99
  await super.onClose(err);
55
100
  }
56
101
  async onAbort(err) {
57
- log("abort", void 0, {
58
- F: __dxlog_file,
59
- L: 121,
60
- S: this,
61
- C: (f, a) => f(...a)
62
- });
102
+ log("abort", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 104, S: this });
63
103
  await this._ctx.dispose();
64
104
  await this._params.onAbort();
65
105
  await super.onAbort(err);
@@ -70,24 +110,14 @@ var BlobSyncExtension = class extends RpcExtension {
70
110
  want: async (wantList) => {
71
111
  log("remote want", {
72
112
  remoteWantList: wantList
73
- }, {
74
- F: __dxlog_file,
75
- L: 131,
76
- S: this,
77
- C: (f, a) => f(...a)
78
- });
113
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 113, S: this });
79
114
  this.remoteWantList = wantList;
80
115
  this.reconcileUploads();
81
116
  },
82
117
  push: async (data) => {
83
118
  log("received", {
84
119
  data
85
- }, {
86
- F: __dxlog_file,
87
- L: 136,
88
- S: this,
89
- C: (f, a) => f(...a)
90
- });
120
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 120, S: this });
91
121
  await this._params.onPush(data);
92
122
  }
93
123
  }
@@ -99,12 +129,7 @@ var BlobSyncExtension = class extends RpcExtension {
99
129
  }
100
130
  log("push", {
101
131
  data
102
- }, {
103
- F: __dxlog_file,
104
- L: 148,
105
- S: this,
106
- C: (f, a) => f(...a)
107
- });
132
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 132, S: this });
108
133
  await this.rpc.BlobSyncService.push(data);
109
134
  }
110
135
  updateWantList(wantList) {
@@ -136,43 +161,14 @@ var BlobSyncExtension = class extends RpcExtension {
136
161
  if (!meta) {
137
162
  continue;
138
163
  }
139
- invariant(meta.bitfield, void 0, {
140
- F: __dxlog_file,
141
- L: 187,
142
- S: this,
143
- A: [
144
- "meta.bitfield",
145
- ""
146
- ]
147
- });
148
- invariant(meta.chunkSize, void 0, {
149
- F: __dxlog_file,
150
- L: 188,
151
- S: this,
152
- A: [
153
- "meta.chunkSize",
154
- ""
155
- ]
156
- });
157
- invariant(meta.length, void 0, {
158
- F: __dxlog_file,
159
- L: 189,
160
- S: this,
161
- A: [
162
- "meta.length",
163
- ""
164
- ]
165
- });
164
+ invariant(meta.bitfield, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 166, S: this, A: ["meta.bitfield", ""] });
165
+ invariant(meta.chunkSize, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 167, S: this, A: ["meta.chunkSize", ""] });
166
+ invariant(meta.length, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 168, S: this, A: ["meta.length", ""] });
166
167
  if (header.chunkSize && header.chunkSize !== meta.chunkSize) {
167
168
  log.warn("Invalid chunk size", {
168
169
  header,
169
170
  meta
170
- }, {
171
- F: __dxlog_file,
172
- L: 192,
173
- S: this,
174
- C: (f, a) => f(...a)
175
- });
171
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 170, S: this });
176
172
  continue;
177
173
  }
178
174
  const requestBitfield = header.bitfield ?? BitField.ones(meta.length / meta.chunkSize);
@@ -197,84 +193,6 @@ var BlobSyncExtension = class extends RpcExtension {
197
193
  }
198
194
  return chunks;
199
195
  }
200
- constructor(_params) {
201
- super({
202
- exposed: {
203
- BlobSyncService: schema.getService("dxos.mesh.teleport.blobsync.BlobSyncService")
204
- },
205
- requested: {
206
- BlobSyncService: schema.getService("dxos.mesh.teleport.blobsync.BlobSyncService")
207
- },
208
- timeout: 2e4,
209
- encodingOptions: {
210
- preserveAny: true
211
- }
212
- }), _define_property(this, "_params", void 0), _define_property(this, "_ctx", void 0), _define_property(this, "_lastWantListUpdate", void 0), _define_property(this, "_localWantList", void 0), _define_property(this, "_updateWantList", void 0), _define_property(this, "_currentUploads", void 0), _define_property(this, "_upload", void 0), /**
213
- * Set of id's remote peer wants.
214
- */
215
- _define_property(this, "remoteWantList", void 0), this._params = _params, this._ctx = new Context({
216
- onError: (err) => log.catch(err, void 0, {
217
- F: __dxlog_file,
218
- L: 35,
219
- S: this,
220
- C: (f, a) => f(...a)
221
- })
222
- }, {
223
- F: __dxlog_file,
224
- L: 35
225
- }), this._lastWantListUpdate = 0, this._localWantList = {
226
- blobs: []
227
- }, this._updateWantList = new DeferredTask(this._ctx, async () => {
228
- if (this._lastWantListUpdate + MIN_WANT_LIST_UPDATE_INTERVAL > Date.now()) {
229
- await sleep(this._lastWantListUpdate + MIN_WANT_LIST_UPDATE_INTERVAL - Date.now());
230
- if (this._ctx.disposed) {
231
- return;
232
- }
233
- }
234
- log("want", {
235
- list: this._localWantList
236
- }, {
237
- F: __dxlog_file,
238
- L: 49,
239
- S: this,
240
- C: (f, a) => f(...a)
241
- });
242
- await this.rpc.BlobSyncService.want(this._localWantList);
243
- this._lastWantListUpdate = Date.now();
244
- }), this._currentUploads = 0, this._upload = new DeferredTask(this._ctx, async () => {
245
- if (this._currentUploads >= MAX_CONCURRENT_UPLOADS) {
246
- return;
247
- }
248
- const blobChunks = await this._pickBlobChunks(MAX_CONCURRENT_UPLOADS - this._currentUploads);
249
- if (!blobChunks) {
250
- return;
251
- }
252
- for (const blobChunk of blobChunks) {
253
- if (this._ctx.disposed) {
254
- break;
255
- }
256
- this._currentUploads++;
257
- this.push(blobChunk).catch((err) => {
258
- if (err instanceof RpcClosedError) {
259
- return;
260
- }
261
- log.warn("push failed", {
262
- err
263
- }, {
264
- F: __dxlog_file,
265
- L: 76,
266
- S: this,
267
- C: (f, a) => f(...a)
268
- });
269
- }).finally(() => {
270
- this._currentUploads--;
271
- this.reconcileUploads();
272
- });
273
- }
274
- }), this.remoteWantList = {
275
- blobs: []
276
- };
277
- }
278
196
  };
279
197
  _ts_decorate([
280
198
  synchronized
@@ -288,27 +206,22 @@ import { PublicKey } from "@dxos/keys";
288
206
  import { log as log2 } from "@dxos/log";
289
207
  import { BlobMeta } from "@dxos/protocols/proto/dxos/echo/blob";
290
208
  import { BitField as BitField2, ComplexMap } from "@dxos/util";
291
- function _define_property2(obj, key, value) {
292
- if (key in obj) {
293
- Object.defineProperty(obj, key, {
294
- value,
295
- enumerable: true,
296
- configurable: true,
297
- writable: true
298
- });
299
- } else {
300
- obj[key] = value;
301
- }
302
- return obj;
303
- }
209
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/core/mesh/teleport-extension-object-sync/src/blob-sync.ts";
304
210
  function _ts_decorate2(decorators, target, key, desc) {
305
211
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
306
212
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
307
213
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
308
214
  return c > 3 && r && Object.defineProperty(target, key, r), r;
309
215
  }
310
- var __dxlog_file2 = "/__w/dxos/dxos/packages/core/mesh/teleport-extension-object-sync/src/blob-sync.ts";
311
216
  var BlobSync = class {
217
+ _params;
218
+ _ctx = new Context2(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 20 });
219
+ _mutex = new Mutex();
220
+ _downloadRequests = new ComplexMap((key) => PublicKey.from(key).toHex());
221
+ _extensions = /* @__PURE__ */ new Set();
222
+ constructor(_params) {
223
+ this._params = _params;
224
+ }
312
225
  async open() {
313
226
  }
314
227
  async close() {
@@ -322,12 +235,7 @@ var BlobSync = class {
322
235
  async download(ctx, id) {
323
236
  log2("download", {
324
237
  id
325
- }, {
326
- F: __dxlog_file2,
327
- L: 53,
328
- S: this,
329
- C: (f, a) => f(...a)
330
- });
238
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 36, S: this });
331
239
  const request = await this._mutex.executeSynchronized(async () => {
332
240
  const existingRequest = this._downloadRequests.get(id);
333
241
  if (existingRequest) {
@@ -368,31 +276,16 @@ var BlobSync = class {
368
276
  const extension = new BlobSyncExtension({
369
277
  blobStore: this._params.blobStore,
370
278
  onOpen: async () => {
371
- log2("extension opened", void 0, {
372
- F: __dxlog_file2,
373
- L: 105,
374
- S: this,
375
- C: (f, a) => f(...a)
376
- });
279
+ log2("extension opened", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 81, S: this });
377
280
  this._extensions.add(extension);
378
281
  extension.updateWantList(this._getWantList());
379
282
  },
380
283
  onClose: async () => {
381
- log2("extension closed", void 0, {
382
- F: __dxlog_file2,
383
- L: 110,
384
- S: this,
385
- C: (f, a) => f(...a)
386
- });
284
+ log2("extension closed", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 86, S: this });
387
285
  this._extensions.delete(extension);
388
286
  },
389
287
  onAbort: async () => {
390
- log2("extension aborted", void 0, {
391
- F: __dxlog_file2,
392
- L: 114,
393
- S: this,
394
- C: (f, a) => f(...a)
395
- });
288
+ log2("extension aborted", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 90, S: this });
396
289
  this._extensions.delete(extension);
397
290
  },
398
291
  onPush: async (blobChunk) => {
@@ -401,26 +294,13 @@ var BlobSync = class {
401
294
  }
402
295
  log2("received", {
403
296
  blobChunk
404
- }, {
405
- F: __dxlog_file2,
406
- L: 121,
407
- S: this,
408
- C: (f, a) => f(...a)
409
- });
297
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 97, S: this });
410
298
  const meta = await this._params.blobStore.setChunk(blobChunk);
411
299
  if (meta.state === BlobMeta.State.FULLY_PRESENT) {
412
300
  this._downloadRequests.get(blobChunk.id)?.trigger.wake();
413
301
  this._downloadRequests.delete(blobChunk.id);
414
302
  } else {
415
- invariant2(meta.bitfield, void 0, {
416
- F: __dxlog_file2,
417
- L: 127,
418
- S: this,
419
- A: [
420
- "meta.bitfield",
421
- ""
422
- ]
423
- });
303
+ invariant2(meta.bitfield, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 105, S: this, A: ["meta.bitfield", ""] });
424
304
  this._downloadRequests.get(blobChunk.id).want.bitfield = BitField2.invert(meta.bitfield);
425
305
  }
426
306
  this._updateExtensionsWantList();
@@ -450,21 +330,6 @@ var BlobSync = class {
450
330
  extension.updateWantList(this._getWantList());
451
331
  }
452
332
  }
453
- constructor(_params) {
454
- _define_property2(this, "_params", void 0);
455
- _define_property2(this, "_ctx", void 0);
456
- _define_property2(this, "_mutex", void 0);
457
- _define_property2(this, "_downloadRequests", void 0);
458
- _define_property2(this, "_extensions", void 0);
459
- this._params = _params;
460
- this._ctx = new Context2(void 0, {
461
- F: __dxlog_file2,
462
- L: 30
463
- });
464
- this._mutex = new Mutex();
465
- this._downloadRequests = new ComplexMap((key) => PublicKey.from(key).toHex());
466
- this._extensions = /* @__PURE__ */ new Set();
467
- }
468
333
  };
469
334
  BlobSync = _ts_decorate2([
470
335
  trackLeaks("open", "close")
@@ -479,29 +344,20 @@ import { PublicKey as PublicKey2 } from "@dxos/keys";
479
344
  import { schema as schema2 } from "@dxos/protocols/proto";
480
345
  import { BlobMeta as BlobMeta2 } from "@dxos/protocols/proto/dxos/echo/blob";
481
346
  import { BitField as BitField3, arrayToBuffer } from "@dxos/util";
482
- function _define_property3(obj, key, value) {
483
- if (key in obj) {
484
- Object.defineProperty(obj, key, {
485
- value,
486
- enumerable: true,
487
- configurable: true,
488
- writable: true
489
- });
490
- } else {
491
- obj[key] = value;
492
- }
493
- return obj;
494
- }
347
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/core/mesh/teleport-extension-object-sync/src/blob-store.ts";
495
348
  function _ts_decorate3(decorators, target, key, desc) {
496
349
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
497
350
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
498
351
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
499
352
  return c > 3 && r && Object.defineProperty(target, key, r), r;
500
353
  }
501
- var __dxlog_file3 = "/__w/dxos/dxos/packages/core/mesh/teleport-extension-object-sync/src/blob-store.ts";
502
354
  var DEFAULT_CHUNK_SIZE = 4096;
503
355
  var BlobMetaCodec = schema2.getCodecForType("dxos.echo.blob.BlobMeta");
504
356
  var BlobStore = class {
357
+ _directory;
358
+ constructor(_directory) {
359
+ this._directory = _directory;
360
+ }
505
361
  async getMeta(id) {
506
362
  return this._getMeta(id);
507
363
  }
@@ -525,24 +381,8 @@ var BlobStore = class {
525
381
  }
526
382
  const beginChunk = Math.floor(offset / metadata.chunkSize);
527
383
  const endChunk = Math.ceil((offset + length) / metadata.chunkSize);
528
- invariant3(metadata.bitfield, "Bitfield not present", {
529
- F: __dxlog_file3,
530
- L: 61,
531
- S: this,
532
- A: [
533
- "metadata.bitfield",
534
- "'Bitfield not present'"
535
- ]
536
- });
537
- invariant3(metadata.bitfield.length * 8 >= endChunk, "Invalid bitfield length", {
538
- F: __dxlog_file3,
539
- L: 62,
540
- S: this,
541
- A: [
542
- "metadata.bitfield.length * 8 >= endChunk",
543
- "'Invalid bitfield length'"
544
- ]
545
- });
384
+ invariant3(metadata.bitfield, "Bitfield not present", { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 47, S: this, A: ["metadata.bitfield", "'Bitfield not present'"] });
385
+ invariant3(metadata.bitfield.length * 8 >= endChunk, "Invalid bitfield length", { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 48, S: this, A: ["metadata.bitfield.length * 8 >= endChunk", "'Invalid bitfield length'"] });
546
386
  const present = BitField3.count(metadata.bitfield, beginChunk, endChunk) === endChunk - beginChunk;
547
387
  if (!present) {
548
388
  throw new Error("Blob not available");
@@ -582,15 +422,7 @@ var BlobStore = class {
582
422
  async setChunk(chunk) {
583
423
  let meta = await this._getMeta(chunk.id);
584
424
  if (!meta) {
585
- invariant3(chunk.totalLength, "totalLength is not present", {
586
- F: __dxlog_file3,
587
- L: 124,
588
- S: this,
589
- A: [
590
- "chunk.totalLength",
591
- "'totalLength is not present'"
592
- ]
593
- });
425
+ invariant3(chunk.totalLength, "totalLength is not present", { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 95, S: this, A: ["chunk.totalLength", "'totalLength is not present'"] });
594
426
  meta = {
595
427
  id: chunk.id,
596
428
  state: BlobMeta2.State.PARTIALLY_PRESENT,
@@ -603,24 +435,8 @@ var BlobStore = class {
603
435
  if (chunk.chunkSize && chunk.chunkSize !== meta.chunkSize) {
604
436
  throw new Error("Invalid chunk size");
605
437
  }
606
- invariant3(meta.bitfield, "Bitfield not present", {
607
- F: __dxlog_file3,
608
- L: 139,
609
- S: this,
610
- A: [
611
- "meta.bitfield",
612
- "'Bitfield not present'"
613
- ]
614
- });
615
- invariant3(chunk.chunkOffset !== void 0, "chunkOffset is not present", {
616
- F: __dxlog_file3,
617
- L: 140,
618
- S: this,
619
- A: [
620
- "chunk.chunkOffset !== undefined",
621
- "'chunkOffset is not present'"
622
- ]
623
- });
438
+ invariant3(meta.bitfield, "Bitfield not present", { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 108, S: this, A: ["meta.bitfield", "'Bitfield not present'"] });
439
+ invariant3(chunk.chunkOffset !== void 0, "chunkOffset is not present", { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 109, S: this, A: ["chunk.chunkOffset !== undefined", "'chunkOffset is not present'"] });
624
440
  await this._getDataFile(chunk.id).write(chunk.chunkOffset, arrayToBuffer(chunk.payload));
625
441
  BitField3.set(meta.bitfield, Math.floor(chunk.chunkOffset / meta.chunkSize), true);
626
442
  if (BitField3.count(meta.bitfield, 0, meta.length) * meta.chunkSize >= meta.length) {
@@ -653,10 +469,6 @@ var BlobStore = class {
653
469
  _getDataFile(id) {
654
470
  return this._directory.getOrCreateFile(path.join(arrayToBuffer(id).toString("hex"), "data"));
655
471
  }
656
- constructor(_directory) {
657
- _define_property3(this, "_directory", void 0);
658
- this._directory = _directory;
659
- }
660
472
  };
661
473
  _ts_decorate3([
662
474
  synchronized2
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/blob-sync-extension.ts", "../../../src/blob-sync.ts", "../../../src/blob-store.ts"],
4
+ "sourcesContent": ["//\n\n//\n// Copyright 2023 DXOS.org\n//\n\nimport { DeferredTask, sleep, synchronized } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { RpcClosedError } from '@dxos/protocols';\nimport { schema } from '@dxos/protocols/proto';\nimport { type BlobChunk, type BlobSyncService, type WantList } from '@dxos/protocols/proto/dxos/mesh/teleport/blobsync';\nimport { type ExtensionContext, RpcExtension } from '@dxos/teleport';\nimport { BitField } from '@dxos/util';\n\nimport { type BlobStore } from './blob-store';\n\nexport type BlobSyncExtensionProps = {\n blobStore: BlobStore;\n onOpen: () => Promise<void>;\n onClose: () => Promise<void>;\n onAbort: () => Promise<void>;\n onPush: (data: BlobChunk) => Promise<void>;\n};\n\nconst MIN_WANT_LIST_UPDATE_INTERVAL = process.env.NODE_ENV === 'test' ? 5 : 500;\n\nconst MAX_CONCURRENT_UPLOADS = 20;\n\n/**\n * Manages replication between a set of feeds for a single teleport session.\n */\nexport class BlobSyncExtension extends RpcExtension<ServiceBundle, ServiceBundle> {\n private readonly _ctx = new Context({ onError: (err) => log.catch(err) });\n\n private _lastWantListUpdate = 0;\n private _localWantList: WantList = { blobs: [] };\n\n private readonly _updateWantList = new DeferredTask(this._ctx, async () => {\n // Throttle want list updates.\n if (this._lastWantListUpdate + MIN_WANT_LIST_UPDATE_INTERVAL > Date.now()) {\n await sleep(this._lastWantListUpdate + MIN_WANT_LIST_UPDATE_INTERVAL - Date.now());\n if (this._ctx.disposed) {\n return;\n }\n }\n\n log('want', { list: this._localWantList });\n await this.rpc.BlobSyncService.want(this._localWantList);\n this._lastWantListUpdate = Date.now();\n });\n\n private _currentUploads = 0;\n\n private readonly _upload = new DeferredTask(this._ctx, async () => {\n if (this._currentUploads >= MAX_CONCURRENT_UPLOADS) {\n return;\n }\n const blobChunks = await this._pickBlobChunks(MAX_CONCURRENT_UPLOADS - this._currentUploads);\n if (!blobChunks) {\n return;\n }\n for (const blobChunk of blobChunks) {\n if (this._ctx.disposed) {\n break;\n }\n\n this._currentUploads++;\n\n this.push(blobChunk)\n .catch((err) => {\n if (err instanceof RpcClosedError) {\n return;\n }\n log.warn('push failed', { err });\n })\n .finally(() => {\n this._currentUploads--;\n this.reconcileUploads();\n });\n }\n });\n\n /**\n * Set of id's remote peer wants.\n */\n public remoteWantList: WantList = { blobs: [] };\n\n constructor(\n private readonly _params: BlobSyncExtensionProps, // to not conflict with the base class\n ) {\n super({\n exposed: {\n BlobSyncService: schema.getService('dxos.mesh.teleport.blobsync.BlobSyncService'),\n },\n requested: {\n BlobSyncService: schema.getService('dxos.mesh.teleport.blobsync.BlobSyncService'),\n },\n timeout: 20_000,\n encodingOptions: {\n preserveAny: true,\n },\n });\n }\n\n override async onOpen(context: ExtensionContext): Promise<void> {\n log('open');\n await super.onOpen(context);\n await this._params.onOpen();\n }\n\n override async onClose(err?: Error | undefined): Promise<void> {\n log('close');\n await this._ctx.dispose();\n await this._params.onClose();\n await super.onClose(err);\n }\n\n override async onAbort(err?: Error | undefined): Promise<void> {\n log('abort');\n await this._ctx.dispose();\n await this._params.onAbort();\n await super.onAbort(err);\n }\n\n protected async getHandlers(): Promise<ServiceBundle> {\n return {\n BlobSyncService: {\n want: async (wantList) => {\n log('remote want', { remoteWantList: wantList });\n this.remoteWantList = wantList;\n this.reconcileUploads();\n },\n push: async (data) => {\n log('received', { data });\n await this._params.onPush(data);\n },\n },\n };\n }\n\n @synchronized\n async push(data: BlobChunk): Promise<void> {\n if (this._ctx.disposed) {\n return;\n }\n log('push', { data });\n await this.rpc.BlobSyncService.push(data);\n }\n\n updateWantList(wantList: WantList): void {\n if (this._ctx.disposed) {\n return;\n }\n this._localWantList = wantList;\n this._updateWantList.schedule();\n }\n\n reconcileUploads(): void {\n if (this._ctx.disposed) {\n return;\n }\n this._upload.schedule();\n }\n\n private async _pickBlobChunks(amount = 1): Promise<BlobChunk[] | void> {\n if (this._ctx.disposed) {\n return;\n }\n\n if (!this.remoteWantList.blobs || this.remoteWantList.blobs?.length === 0) {\n return;\n }\n\n const shuffled = [...this.remoteWantList.blobs].sort(() => Math.random() - 0.5);\n\n const chunks: BlobChunk[] = [];\n\n for (const header of shuffled) {\n const meta = await this._params.blobStore.getMeta(header.id);\n\n if (!meta) {\n // Skip this header\n continue;\n }\n invariant(meta.bitfield);\n invariant(meta.chunkSize);\n invariant(meta.length);\n\n if (header.chunkSize && header.chunkSize !== meta.chunkSize) {\n log.warn('Invalid chunk size', { header, meta });\n continue;\n }\n\n const requestBitfield = header.bitfield ?? BitField.ones(meta.length / meta.chunkSize);\n\n const presentData = BitField.and(requestBitfield, meta.bitfield);\n const chunkIndices = BitField.findIndexes(presentData).sort(() => Math.random() - 0.5);\n\n for (const idx of chunkIndices) {\n const chunkData = await this._params.blobStore.get(header.id, {\n offset: idx * meta.chunkSize,\n length: Math.min(meta.chunkSize, meta.length - idx * meta.chunkSize),\n });\n chunks.push({\n id: header.id,\n totalLength: meta.length,\n chunkSize: meta.chunkSize,\n chunkOffset: idx * meta.chunkSize,\n payload: chunkData,\n });\n\n if (chunks.length >= amount) {\n return chunks;\n }\n }\n }\n\n return chunks;\n }\n}\n\ntype ServiceBundle = {\n BlobSyncService: BlobSyncService;\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Mutex, Trigger, trackLeaks } from '@dxos/async';\nimport { Context, cancelWithContext } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { BlobMeta } from '@dxos/protocols/proto/dxos/echo/blob';\nimport { type WantList } from '@dxos/protocols/proto/dxos/mesh/teleport/blobsync';\nimport { BitField, ComplexMap } from '@dxos/util';\n\nimport { type BlobStore } from './blob-store';\nimport { BlobSyncExtension } from './blob-sync-extension';\n\nexport type BlobSyncProps = {\n blobStore: BlobStore;\n};\n\ntype DownloadRequest = {\n trigger: Trigger<void>;\n counter: number;\n want: WantList.Entry;\n};\n\n// TODO(dmaretskyi): Rename to blob-sync.\n@trackLeaks('open', 'close')\nexport class BlobSync {\n private readonly _ctx = new Context();\n private readonly _mutex = new Mutex();\n\n private readonly _downloadRequests = new ComplexMap<Uint8Array, DownloadRequest>((key) =>\n PublicKey.from(key).toHex(),\n );\n\n private readonly _extensions = new Set<BlobSyncExtension>();\n\n constructor(private readonly _params: BlobSyncProps) {}\n\n async open(): Promise<void> {}\n\n async close(): Promise<void> {\n await this._ctx.dispose();\n }\n\n /**\n * Resolves when the object with the given id is fully downloaded in the blob store.\n *\n * @param id hex-encoded id of the object to download.\n */\n async download(ctx: Context, id: Uint8Array): Promise<void> {\n log('download', { id });\n const request = await this._mutex.executeSynchronized(async () => {\n const existingRequest = this._downloadRequests.get(id);\n\n if (existingRequest) {\n existingRequest.counter++;\n return existingRequest;\n }\n\n const meta = await this._params.blobStore.getMeta(id);\n const request: DownloadRequest = {\n trigger: new Trigger(),\n counter: 1,\n want: {\n id,\n chunkSize: meta?.chunkSize,\n bitfield: meta?.bitfield && Uint8Array.from(BitField.invert(meta.bitfield)),\n },\n };\n\n // Check if the object is already fully downloaded.\n if (meta?.state === BlobMeta.State.FULLY_PRESENT) {\n request.trigger.wake();\n } else {\n this._downloadRequests.set(id, request);\n this._updateExtensionsWantList();\n }\n\n return request;\n });\n\n ctx?.onDispose(() =>\n this._mutex.executeSynchronized(async () => {\n // Remove request if context is disposed and nobody else requests it.\n const request = this._downloadRequests.get(id);\n if (!request) {\n return;\n }\n if (--request.counter === 0) {\n this._downloadRequests.delete(id);\n }\n this._updateExtensionsWantList();\n }),\n );\n\n return ctx ? cancelWithContext(ctx, request.trigger.wait()) : request.trigger.wait();\n }\n\n createExtension(): BlobSyncExtension {\n const extension = new BlobSyncExtension({\n blobStore: this._params.blobStore,\n onOpen: async () => {\n log('extension opened');\n this._extensions.add(extension);\n extension.updateWantList(this._getWantList());\n },\n onClose: async () => {\n log('extension closed');\n this._extensions.delete(extension);\n },\n onAbort: async () => {\n log('extension aborted');\n this._extensions.delete(extension);\n },\n onPush: async (blobChunk) => {\n if (!this._downloadRequests.has(blobChunk.id)) {\n return;\n }\n log('received', { blobChunk });\n const meta = await this._params.blobStore.setChunk(blobChunk);\n if (meta.state === BlobMeta.State.FULLY_PRESENT) {\n this._downloadRequests.get(blobChunk.id)?.trigger.wake();\n this._downloadRequests.delete(blobChunk.id);\n } else {\n invariant(meta.bitfield);\n this._downloadRequests.get(blobChunk.id)!.want.bitfield = BitField.invert(meta.bitfield);\n }\n\n this._updateExtensionsWantList();\n this._reconcileUploads();\n },\n });\n return extension;\n }\n\n /**\n * Notify extensions that a blob with the given id was added to the blob store.\n */\n async notifyBlobAdded(_id: Uint8Array): Promise<void> {\n this._reconcileUploads();\n }\n\n private _getWantList(): WantList {\n return {\n blobs: Array.from(this._downloadRequests.values()).map((request) => request.want),\n };\n }\n\n private _reconcileUploads(): void {\n for (const extension of this._extensions) {\n extension.reconcileUploads();\n }\n }\n\n private _updateExtensionsWantList(): void {\n for (const extension of this._extensions) {\n extension.updateWantList(this._getWantList());\n }\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport path from 'node:path';\n\nimport { synchronized } from '@dxos/async';\nimport { subtleCrypto } from '@dxos/crypto';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { schema } from '@dxos/protocols/proto';\nimport { BlobMeta } from '@dxos/protocols/proto/dxos/echo/blob';\nimport { type BlobChunk } from '@dxos/protocols/proto/dxos/mesh/teleport/blobsync';\nimport { type Directory } from '@dxos/random-access-storage';\nimport { BitField, arrayToBuffer } from '@dxos/util';\n\nexport type GetOptions = {\n offset?: number;\n length?: number;\n};\n\nexport const DEFAULT_CHUNK_SIZE = 4096;\n\nconst BlobMetaCodec = schema.getCodecForType('dxos.echo.blob.BlobMeta');\n\nexport class BlobStore {\n constructor(private readonly _directory: Directory) {}\n\n @synchronized\n async getMeta(id: Uint8Array): Promise<BlobMeta | undefined> {\n return this._getMeta(id);\n }\n\n /**\n * @throws If range is not available.\n */\n @synchronized\n async get(id: Uint8Array, options: GetOptions = {}): Promise<Uint8Array> {\n const metadata = await this._getMeta(id);\n\n if (!metadata) {\n throw new Error('Blob not available');\n }\n\n const { offset = 0, length = metadata.length } = options;\n\n if (offset + length > metadata.length) {\n throw new Error('Invalid range');\n }\n\n if (metadata.state === BlobMeta.State.FULLY_PRESENT) {\n const file = this._getDataFile(id);\n return file.read(offset, length);\n } else if (options.offset === undefined && options.length === undefined) {\n throw new Error('Blob not available');\n }\n\n const beginChunk = Math.floor(offset / metadata.chunkSize);\n const endChunk = Math.ceil((offset + length) / metadata.chunkSize);\n\n invariant(metadata.bitfield, 'Bitfield not present');\n invariant(metadata.bitfield.length * 8 >= endChunk, 'Invalid bitfield length');\n\n const present = BitField.count(metadata.bitfield, beginChunk, endChunk) === endChunk - beginChunk;\n\n if (!present) {\n throw new Error('Blob not available');\n }\n\n const file = this._getDataFile(id);\n return file.read(offset, length);\n }\n\n @synchronized\n async list(): Promise<BlobMeta[]> {\n /*\n Weird path formatting:\n\n \"e9b9aa7a21c2c55a9eca333cd59975633157562ca0a0f4f243d4778f192c291e_meta\"\n \"e9b9aa7a21c2c55a9eca333cd59975633157562ca0a0f4f243d4778f192c291e_data\"\n \"5001de5a47191357c075aeee6451c4cc323f3a8ada24dd1191e83403608a38d5_meta\n */\n const files = new Set((await this._directory.list()).map((f) => f.split('_')[0]));\n\n const res: BlobMeta[] = [];\n\n for (const file of files) {\n const id = PublicKey.from(file).asUint8Array();\n const meta = await this._getMeta(id);\n if (meta) {\n res.push(meta);\n }\n }\n\n return res;\n }\n\n @synchronized\n async set(data: Uint8Array): Promise<BlobMeta> {\n const id = new Uint8Array(await subtleCrypto.digest('SHA-256', data as Uint8Array<ArrayBuffer>));\n const bitfield = BitField.ones(data.length / DEFAULT_CHUNK_SIZE);\n\n const meta: BlobMeta = {\n id,\n state: BlobMeta.State.FULLY_PRESENT,\n length: data.length,\n chunkSize: DEFAULT_CHUNK_SIZE,\n bitfield,\n created: new Date(),\n updated: new Date(),\n };\n\n await this._getDataFile(id).write(0, arrayToBuffer(data));\n await this._writeMeta(id, meta);\n return meta;\n }\n\n // TODO(dmaretskyi): Optimize locking.\n @synchronized\n async setChunk(chunk: BlobChunk): Promise<BlobMeta> {\n // Init metadata.\n let meta = await this._getMeta(chunk.id);\n if (!meta) {\n invariant(chunk.totalLength, 'totalLength is not present');\n meta = {\n id: chunk.id,\n state: BlobMeta.State.PARTIALLY_PRESENT,\n length: chunk.totalLength,\n chunkSize: chunk.chunkSize ?? DEFAULT_CHUNK_SIZE,\n created: new Date(),\n };\n meta.bitfield = BitField.zeros(meta.length / meta.chunkSize);\n }\n\n if (chunk.chunkSize && chunk.chunkSize !== meta.chunkSize) {\n throw new Error('Invalid chunk size');\n }\n\n invariant(meta.bitfield, 'Bitfield not present');\n invariant(chunk.chunkOffset !== undefined, 'chunkOffset is not present');\n\n // Write chunk.\n await this._getDataFile(chunk.id).write(chunk.chunkOffset, arrayToBuffer(chunk.payload));\n\n // Update bitfield.\n BitField.set(meta.bitfield, Math.floor(chunk.chunkOffset / meta.chunkSize), true);\n\n // Update metadata.\n if (BitField.count(meta.bitfield, 0, meta.length) * meta.chunkSize >= meta.length) {\n meta.state = BlobMeta.State.FULLY_PRESENT;\n }\n meta.updated = new Date();\n\n await this._writeMeta(chunk.id, meta);\n\n return meta;\n }\n\n private async _writeMeta(id: Uint8Array, meta: BlobMeta): Promise<void> {\n const encoded = arrayToBuffer(BlobMetaCodec.encode(meta));\n const data = Buffer.alloc(encoded.length + 4);\n data.writeUInt32LE(encoded.length, 0);\n encoded.copy(data, 4);\n\n // Write metadata.\n await this._getMetaFile(id).write(0, data);\n }\n\n private async _getMeta(id: Uint8Array): Promise<BlobMeta | undefined> {\n const file = this._getMetaFile(id);\n const size = (await file.stat()).size;\n if (size === 0) {\n return;\n }\n const data = await file.read(0, size);\n const protoSize = data.readUInt32LE(0);\n return BlobMetaCodec.decode(data.subarray(4, protoSize + 4));\n }\n\n private _getMetaFile(id: Uint8Array) {\n return this._directory.getOrCreateFile(path.join(arrayToBuffer(id).toString('hex'), 'meta'));\n }\n\n private _getDataFile(id: Uint8Array) {\n return this._directory.getOrCreateFile(path.join(arrayToBuffer(id).toString('hex'), 'data'));\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Context", "invariant", "log", "RpcClosedError", "schema", "RpcExtension", "BitField", "MIN_WANT_LIST_UPDATE_INTERVAL", "MAX_CONCURRENT_UPLOADS", "_ctx", "onError", "err", "_lastWantListUpdate", "_localWantList", "_updateWantList", "Date", "disposed", "list", "BlobSyncService", "_currentUploads", "_upload", "DeferredTask", "blobChunks", "push", "finally", "reconcileUploads", "exposed", "requested", "timeout", "encodingOptions", "onOpen", "context", "_params", "dispose", "onClose", "onAbort", "wantList", "remoteWantList", "data", "updateWantList", "schedule", "sort", "Math", "chunks", "header", "meta", "chunkSize", "length", "warn", "presentData", "and", "requestBitfield", "bitfield", "chunkIndices", "findIndexes", "chunkData", "offset", "min", "id", "totalLength", "chunkOffset", "idx", "payload", "Context", "cancelWithContext", "invariant", "PublicKey", "log", "BlobMeta", "BitField", "ComplexMap", "BlobSyncExtension", "__dxlog_file", "_ctx", "_mutex", "Context", "Mutex", "_downloadRequests", "_extensions", "Set", "_params", "close", "id", "request", "executeSynchronized", "existingRequest", "counter", "trigger", "want", "chunkSize", "bitfield", "meta", "BitField", "wake", "_updateExtensionsWantList", "ctx", "delete", "createExtension", "extension", "blobStore", "onOpen", "log", "updateWantList", "_getWantList", "onClose", "onAbort", "onPush", "blobChunk", "setChunk", "state", "BlobMeta", "State", "FULLY_PRESENT", "get", "invariant", "invert", "_reconcileUploads", "blobs", "reconcileUploads", "synchronized", "subtleCrypto", "invariant", "PublicKey", "schema", "BlobMeta", "BitField", "arrayToBuffer", "DEFAULT_CHUNK_SIZE", "__dxlog_file", "BlobMetaCodec", "getCodecForType", "BlobStore", "_directory", "_getMeta", "metadata", "Error", "offset", "length", "file", "_getDataFile", "id", "read", "options", "undefined", "endChunk", "Math", "ceil", "chunkSize", "bitfield", "present", "count", "beginChunk", "res", "from", "meta", "push", "ones", "data", "state", "created", "updated", "Date", "_writeMeta", "totalLength", "chunk", "chunkOffset", "FULLY_PRESENT", "encoded", "Buffer", "writeUInt32LE", "size", "protoSize", "readUInt32LE", "decode", "subarray", "_getMetaFile"]
7
+ }
@@ -1 +1 @@
1
- {"inputs":{"src/blob-sync-extension.ts":{"bytes":25935,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"@dxos/teleport","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"src/blob-sync.ts":{"bytes":19069,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/echo/blob","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"src/blob-sync-extension.ts","kind":"import-statement","original":"./blob-sync-extension"}],"format":"esm"},"src/blob-store.ts":{"bytes":22575,"imports":[{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/crypto","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/echo/blob","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":690,"imports":[{"path":"src/blob-sync-extension.ts","kind":"import-statement","original":"./blob-sync-extension"},{"path":"src/blob-sync.ts","kind":"import-statement","original":"./blob-sync"},{"path":"src/blob-store.ts","kind":"import-statement","original":"./blob-store"}],"format":"esm"}},"outputs":{"dist/lib/browser/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":30847},"dist/lib/browser/index.mjs":{"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"@dxos/teleport","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/echo/blob","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/crypto","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/echo/blob","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["BlobStore","BlobSync","BlobSyncExtension","DEFAULT_CHUNK_SIZE"],"entryPoint":"src/index.ts","inputs":{"src/blob-sync-extension.ts":{"bytesInOutput":8057},"src/index.ts":{"bytesInOutput":0},"src/blob-sync.ts":{"bytesInOutput":5920},"src/blob-store.ts":{"bytesInOutput":6818}},"bytes":21016}}}
1
+ {"inputs":{"src/blob-sync-extension.ts":{"bytes":23472,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"@dxos/teleport","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"src/blob-sync.ts":{"bytes":17635,"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/echo/blob","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"src/blob-sync-extension.ts","kind":"import-statement","original":"./blob-sync-extension"}],"format":"esm"},"src/blob-store.ts":{"bytes":21664,"imports":[{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/crypto","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/echo/blob","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"format":"esm"},"src/index.ts":{"bytes":586,"imports":[{"path":"src/blob-sync-extension.ts","kind":"import-statement","original":"./blob-sync-extension"},{"path":"src/blob-sync.ts","kind":"import-statement","original":"./blob-sync"},{"path":"src/blob-store.ts","kind":"import-statement","original":"./blob-store"}],"format":"esm"}},"outputs":{"dist/lib/neutral/index.mjs.map":{"imports":[],"exports":[],"inputs":{},"bytes":29903},"dist/lib/neutral/index.mjs":{"imports":[{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"@dxos/teleport","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/context","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/log","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/echo/blob","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true},{"path":"@dxos/node-std/path","kind":"import-statement","external":true},{"path":"@dxos/async","kind":"import-statement","external":true},{"path":"@dxos/crypto","kind":"import-statement","external":true},{"path":"@dxos/invariant","kind":"import-statement","external":true},{"path":"@dxos/keys","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto","kind":"import-statement","external":true},{"path":"@dxos/protocols/proto/dxos/echo/blob","kind":"import-statement","external":true},{"path":"@dxos/util","kind":"import-statement","external":true}],"exports":["BlobStore","BlobSync","BlobSyncExtension","DEFAULT_CHUNK_SIZE"],"entryPoint":"src/index.ts","inputs":{"src/blob-sync-extension.ts":{"bytesInOutput":6834},"src/index.ts":{"bytesInOutput":0},"src/blob-sync.ts":{"bytesInOutput":5122},"src/blob-store.ts":{"bytesInOutput":6375}},"bytes":18552}}}