@dxos/teleport-extension-object-sync 0.8.3 → 0.8.4-main.1c7ec43d41

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.
@@ -1,6 +1,6 @@
1
1
  import "@dxos/node-std/globals";
2
2
 
3
- // packages/core/mesh/teleport-extension-object-sync/src/blob-sync-extension.ts
3
+ // src/blob-sync-extension.ts
4
4
  import { DeferredTask, sleep, synchronized } from "@dxos/async";
5
5
  import { Context } from "@dxos/context";
6
6
  import { invariant } from "@dxos/invariant";
@@ -9,16 +9,70 @@ 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
+ var __dxlog_file = "/__w/dxos/dxos/packages/core/mesh/teleport-extension-object-sync/src/blob-sync-extension.ts";
12
13
  function _ts_decorate(decorators, target, key, desc) {
13
14
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
14
15
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
15
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;
16
17
  return c > 3 && r && Object.defineProperty(target, key, r), r;
17
18
  }
18
- var __dxlog_file = "/home/runner/work/dxos/dxos/packages/core/mesh/teleport-extension-object-sync/src/blob-sync-extension.ts";
19
- var MIN_WANT_LIST_UPDATE_INTERVAL = false ? 5 : 500;
19
+ var MIN_WANT_LIST_UPDATE_INTERVAL = process.env.NODE_ENV === "test" ? 5 : 500;
20
20
  var MAX_CONCURRENT_UPLOADS = 20;
21
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
+ };
22
76
  constructor(_params) {
23
77
  super({
24
78
  exposed: {
@@ -31,97 +85,21 @@ var BlobSyncExtension = class extends RpcExtension {
31
85
  encodingOptions: {
32
86
  preserveAny: true
33
87
  }
34
- }), this._params = _params, this._ctx = new Context({
35
- onError: (err) => log.catch(err, void 0, {
36
- F: __dxlog_file,
37
- L: 35,
38
- S: this,
39
- C: (f, a) => f(...a)
40
- })
41
- }, {
42
- F: __dxlog_file,
43
- L: 35
44
- }), this._lastWantListUpdate = 0, this._localWantList = {
45
- blobs: []
46
- }, this._updateWantList = new DeferredTask(this._ctx, async () => {
47
- if (this._lastWantListUpdate + MIN_WANT_LIST_UPDATE_INTERVAL > Date.now()) {
48
- await sleep(this._lastWantListUpdate + MIN_WANT_LIST_UPDATE_INTERVAL - Date.now());
49
- if (this._ctx.disposed) {
50
- return;
51
- }
52
- }
53
- log("want", {
54
- list: this._localWantList
55
- }, {
56
- F: __dxlog_file,
57
- L: 49,
58
- S: this,
59
- C: (f, a) => f(...a)
60
- });
61
- await this.rpc.BlobSyncService.want(this._localWantList);
62
- this._lastWantListUpdate = Date.now();
63
- }), this._currentUploads = 0, this._upload = new DeferredTask(this._ctx, async () => {
64
- if (this._currentUploads >= MAX_CONCURRENT_UPLOADS) {
65
- return;
66
- }
67
- const blobChunks = await this._pickBlobChunks(MAX_CONCURRENT_UPLOADS - this._currentUploads);
68
- if (!blobChunks) {
69
- return;
70
- }
71
- for (const blobChunk of blobChunks) {
72
- if (this._ctx.disposed) {
73
- break;
74
- }
75
- this._currentUploads++;
76
- this.push(blobChunk).catch((err) => {
77
- if (err instanceof RpcClosedError) {
78
- return;
79
- }
80
- log.warn("push failed", {
81
- err
82
- }, {
83
- F: __dxlog_file,
84
- L: 76,
85
- S: this,
86
- C: (f, a) => f(...a)
87
- });
88
- }).finally(() => {
89
- this._currentUploads--;
90
- this.reconcileUploads();
91
- });
92
- }
93
- }), this.remoteWantList = {
94
- blobs: []
95
- };
88
+ }), this._params = _params;
96
89
  }
97
90
  async onOpen(context) {
98
- log("open", void 0, {
99
- F: __dxlog_file,
100
- L: 108,
101
- S: this,
102
- C: (f, a) => f(...a)
103
- });
91
+ log("open", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 93, S: this });
104
92
  await super.onOpen(context);
105
93
  await this._params.onOpen();
106
94
  }
107
95
  async onClose(err) {
108
- log("close", void 0, {
109
- F: __dxlog_file,
110
- L: 114,
111
- S: this,
112
- C: (f, a) => f(...a)
113
- });
96
+ log("close", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 98, S: this });
114
97
  await this._ctx.dispose();
115
98
  await this._params.onClose();
116
99
  await super.onClose(err);
117
100
  }
118
101
  async onAbort(err) {
119
- log("abort", void 0, {
120
- F: __dxlog_file,
121
- L: 121,
122
- S: this,
123
- C: (f, a) => f(...a)
124
- });
102
+ log("abort", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 104, S: this });
125
103
  await this._ctx.dispose();
126
104
  await this._params.onAbort();
127
105
  await super.onAbort(err);
@@ -132,24 +110,14 @@ var BlobSyncExtension = class extends RpcExtension {
132
110
  want: async (wantList) => {
133
111
  log("remote want", {
134
112
  remoteWantList: wantList
135
- }, {
136
- F: __dxlog_file,
137
- L: 131,
138
- S: this,
139
- C: (f, a) => f(...a)
140
- });
113
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 113, S: this });
141
114
  this.remoteWantList = wantList;
142
115
  this.reconcileUploads();
143
116
  },
144
117
  push: async (data) => {
145
118
  log("received", {
146
119
  data
147
- }, {
148
- F: __dxlog_file,
149
- L: 136,
150
- S: this,
151
- C: (f, a) => f(...a)
152
- });
120
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 120, S: this });
153
121
  await this._params.onPush(data);
154
122
  }
155
123
  }
@@ -161,12 +129,7 @@ var BlobSyncExtension = class extends RpcExtension {
161
129
  }
162
130
  log("push", {
163
131
  data
164
- }, {
165
- F: __dxlog_file,
166
- L: 148,
167
- S: this,
168
- C: (f, a) => f(...a)
169
- });
132
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 132, S: this });
170
133
  await this.rpc.BlobSyncService.push(data);
171
134
  }
172
135
  updateWantList(wantList) {
@@ -198,43 +161,14 @@ var BlobSyncExtension = class extends RpcExtension {
198
161
  if (!meta) {
199
162
  continue;
200
163
  }
201
- invariant(meta.bitfield, void 0, {
202
- F: __dxlog_file,
203
- L: 187,
204
- S: this,
205
- A: [
206
- "meta.bitfield",
207
- ""
208
- ]
209
- });
210
- invariant(meta.chunkSize, void 0, {
211
- F: __dxlog_file,
212
- L: 188,
213
- S: this,
214
- A: [
215
- "meta.chunkSize",
216
- ""
217
- ]
218
- });
219
- invariant(meta.length, void 0, {
220
- F: __dxlog_file,
221
- L: 189,
222
- S: this,
223
- A: [
224
- "meta.length",
225
- ""
226
- ]
227
- });
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", ""] });
228
167
  if (header.chunkSize && header.chunkSize !== meta.chunkSize) {
229
168
  log.warn("Invalid chunk size", {
230
169
  header,
231
170
  meta
232
- }, {
233
- F: __dxlog_file,
234
- L: 192,
235
- S: this,
236
- C: (f, a) => f(...a)
237
- });
171
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 170, S: this });
238
172
  continue;
239
173
  }
240
174
  const requestBitfield = header.bitfield ?? BitField.ones(meta.length / meta.chunkSize);
@@ -264,31 +198,29 @@ _ts_decorate([
264
198
  synchronized
265
199
  ], BlobSyncExtension.prototype, "push", null);
266
200
 
267
- // packages/core/mesh/teleport-extension-object-sync/src/blob-sync.ts
268
- import { trackLeaks, Trigger, Mutex } from "@dxos/async";
269
- import { cancelWithContext, Context as Context2 } from "@dxos/context";
201
+ // src/blob-sync.ts
202
+ import { Mutex, Trigger, trackLeaks } from "@dxos/async";
203
+ import { Context as Context2, cancelWithContext } from "@dxos/context";
270
204
  import { invariant as invariant2 } from "@dxos/invariant";
271
205
  import { PublicKey } from "@dxos/keys";
272
206
  import { log as log2 } from "@dxos/log";
273
207
  import { BlobMeta } from "@dxos/protocols/proto/dxos/echo/blob";
274
208
  import { BitField as BitField2, ComplexMap } from "@dxos/util";
209
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/core/mesh/teleport-extension-object-sync/src/blob-sync.ts";
275
210
  function _ts_decorate2(decorators, target, key, desc) {
276
211
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
277
212
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
278
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;
279
214
  return c > 3 && r && Object.defineProperty(target, key, r), r;
280
215
  }
281
- var __dxlog_file2 = "/home/runner/work/dxos/dxos/packages/core/mesh/teleport-extension-object-sync/src/blob-sync.ts";
282
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();
283
222
  constructor(_params) {
284
223
  this._params = _params;
285
- this._ctx = new Context2(void 0, {
286
- F: __dxlog_file2,
287
- L: 30
288
- });
289
- this._mutex = new Mutex();
290
- this._downloadRequests = new ComplexMap((key) => PublicKey.from(key).toHex());
291
- this._extensions = /* @__PURE__ */ new Set();
292
224
  }
293
225
  async open() {
294
226
  }
@@ -303,12 +235,7 @@ var BlobSync = class {
303
235
  async download(ctx, id) {
304
236
  log2("download", {
305
237
  id
306
- }, {
307
- F: __dxlog_file2,
308
- L: 53,
309
- S: this,
310
- C: (f, a) => f(...a)
311
- });
238
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 36, S: this });
312
239
  const request = await this._mutex.executeSynchronized(async () => {
313
240
  const existingRequest = this._downloadRequests.get(id);
314
241
  if (existingRequest) {
@@ -349,31 +276,16 @@ var BlobSync = class {
349
276
  const extension = new BlobSyncExtension({
350
277
  blobStore: this._params.blobStore,
351
278
  onOpen: async () => {
352
- log2("extension opened", void 0, {
353
- F: __dxlog_file2,
354
- L: 105,
355
- S: this,
356
- C: (f, a) => f(...a)
357
- });
279
+ log2("extension opened", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 81, S: this });
358
280
  this._extensions.add(extension);
359
281
  extension.updateWantList(this._getWantList());
360
282
  },
361
283
  onClose: async () => {
362
- log2("extension closed", void 0, {
363
- F: __dxlog_file2,
364
- L: 110,
365
- S: this,
366
- C: (f, a) => f(...a)
367
- });
284
+ log2("extension closed", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 86, S: this });
368
285
  this._extensions.delete(extension);
369
286
  },
370
287
  onAbort: async () => {
371
- log2("extension aborted", void 0, {
372
- F: __dxlog_file2,
373
- L: 114,
374
- S: this,
375
- C: (f, a) => f(...a)
376
- });
288
+ log2("extension aborted", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 90, S: this });
377
289
  this._extensions.delete(extension);
378
290
  },
379
291
  onPush: async (blobChunk) => {
@@ -382,26 +294,13 @@ var BlobSync = class {
382
294
  }
383
295
  log2("received", {
384
296
  blobChunk
385
- }, {
386
- F: __dxlog_file2,
387
- L: 121,
388
- S: this,
389
- C: (f, a) => f(...a)
390
- });
297
+ }, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 97, S: this });
391
298
  const meta = await this._params.blobStore.setChunk(blobChunk);
392
299
  if (meta.state === BlobMeta.State.FULLY_PRESENT) {
393
300
  this._downloadRequests.get(blobChunk.id)?.trigger.wake();
394
301
  this._downloadRequests.delete(blobChunk.id);
395
302
  } else {
396
- invariant2(meta.bitfield, void 0, {
397
- F: __dxlog_file2,
398
- L: 127,
399
- S: this,
400
- A: [
401
- "meta.bitfield",
402
- ""
403
- ]
404
- });
303
+ invariant2(meta.bitfield, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 105, S: this, A: ["meta.bitfield", ""] });
405
304
  this._downloadRequests.get(blobChunk.id).want.bitfield = BitField2.invert(meta.bitfield);
406
305
  }
407
306
  this._updateExtensionsWantList();
@@ -436,7 +335,7 @@ BlobSync = _ts_decorate2([
436
335
  trackLeaks("open", "close")
437
336
  ], BlobSync);
438
337
 
439
- // packages/core/mesh/teleport-extension-object-sync/src/blob-store.ts
338
+ // src/blob-store.ts
440
339
  import path from "@dxos/node-std/path";
441
340
  import { synchronized as synchronized2 } from "@dxos/async";
442
341
  import { subtleCrypto } from "@dxos/crypto";
@@ -445,16 +344,17 @@ import { PublicKey as PublicKey2 } from "@dxos/keys";
445
344
  import { schema as schema2 } from "@dxos/protocols/proto";
446
345
  import { BlobMeta as BlobMeta2 } from "@dxos/protocols/proto/dxos/echo/blob";
447
346
  import { BitField as BitField3, arrayToBuffer } from "@dxos/util";
347
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/core/mesh/teleport-extension-object-sync/src/blob-store.ts";
448
348
  function _ts_decorate3(decorators, target, key, desc) {
449
349
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
450
350
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
451
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;
452
352
  return c > 3 && r && Object.defineProperty(target, key, r), r;
453
353
  }
454
- var __dxlog_file3 = "/home/runner/work/dxos/dxos/packages/core/mesh/teleport-extension-object-sync/src/blob-store.ts";
455
354
  var DEFAULT_CHUNK_SIZE = 4096;
456
355
  var BlobMetaCodec = schema2.getCodecForType("dxos.echo.blob.BlobMeta");
457
356
  var BlobStore = class {
357
+ _directory;
458
358
  constructor(_directory) {
459
359
  this._directory = _directory;
460
360
  }
@@ -481,24 +381,8 @@ var BlobStore = class {
481
381
  }
482
382
  const beginChunk = Math.floor(offset / metadata.chunkSize);
483
383
  const endChunk = Math.ceil((offset + length) / metadata.chunkSize);
484
- invariant3(metadata.bitfield, "Bitfield not present", {
485
- F: __dxlog_file3,
486
- L: 61,
487
- S: this,
488
- A: [
489
- "metadata.bitfield",
490
- "'Bitfield not present'"
491
- ]
492
- });
493
- invariant3(metadata.bitfield.length * 8 >= endChunk, "Invalid bitfield length", {
494
- F: __dxlog_file3,
495
- L: 62,
496
- S: this,
497
- A: [
498
- "metadata.bitfield.length * 8 >= endChunk",
499
- "'Invalid bitfield length'"
500
- ]
501
- });
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'"] });
502
386
  const present = BitField3.count(metadata.bitfield, beginChunk, endChunk) === endChunk - beginChunk;
503
387
  if (!present) {
504
388
  throw new Error("Blob not available");
@@ -538,15 +422,7 @@ var BlobStore = class {
538
422
  async setChunk(chunk) {
539
423
  let meta = await this._getMeta(chunk.id);
540
424
  if (!meta) {
541
- invariant3(chunk.totalLength, "totalLength is not present", {
542
- F: __dxlog_file3,
543
- L: 124,
544
- S: this,
545
- A: [
546
- "chunk.totalLength",
547
- "'totalLength is not present'"
548
- ]
549
- });
425
+ invariant3(chunk.totalLength, "totalLength is not present", { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 95, S: this, A: ["chunk.totalLength", "'totalLength is not present'"] });
550
426
  meta = {
551
427
  id: chunk.id,
552
428
  state: BlobMeta2.State.PARTIALLY_PRESENT,
@@ -559,24 +435,8 @@ var BlobStore = class {
559
435
  if (chunk.chunkSize && chunk.chunkSize !== meta.chunkSize) {
560
436
  throw new Error("Invalid chunk size");
561
437
  }
562
- invariant3(meta.bitfield, "Bitfield not present", {
563
- F: __dxlog_file3,
564
- L: 139,
565
- S: this,
566
- A: [
567
- "meta.bitfield",
568
- "'Bitfield not present'"
569
- ]
570
- });
571
- invariant3(chunk.chunkOffset !== void 0, "chunkOffset is not present", {
572
- F: __dxlog_file3,
573
- L: 140,
574
- S: this,
575
- A: [
576
- "chunk.chunkOffset !== undefined",
577
- "'chunkOffset is not present'"
578
- ]
579
- });
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'"] });
580
440
  await this._getDataFile(chunk.id).write(chunk.chunkOffset, arrayToBuffer(chunk.payload));
581
441
  BitField3.set(meta.bitfield, Math.floor(chunk.chunkOffset / meta.chunkSize), true);
582
442
  if (BitField3.count(meta.bitfield, 0, meta.length) * meta.chunkSize >= meta.length) {
@@ -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
+ }
@@ -0,0 +1 @@
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}}}
@@ -1 +1 @@
1
- {"version":3,"file":"blob-store.d.ts","sourceRoot":"","sources":["../../../src/blob-store.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAChE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mDAAmD,CAAC;AACnF,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG7D,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAIvC,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,SAAS;IAG5C,OAAO,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAI5D;;OAEG;IAEG,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,UAAU,CAAC;IAqClE,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAwB3B,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC;IAqBxC,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;YAuCrC,UAAU;YAUV,QAAQ;IAWtB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;CAGrB"}
1
+ {"version":3,"file":"blob-store.d.ts","sourceRoot":"","sources":["../../../src/blob-store.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAChE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,mDAAmD,CAAC;AACnF,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAG7D,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAIvC,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,UAAU;IAAvC,YAA6B,UAAU,EAAE,SAAS,EAAI;IAGhD,OAAO,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAE3D;IAED;;OAEG;IAEG,GAAG,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAkCvE;IAGK,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAqBhC;IAGK,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAiB7C;IAIK,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqClD;YAEa,UAAU;YAUV,QAAQ;IAWtB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;CAGrB"}
@@ -1,7 +1,7 @@
1
1
  import { type BlobChunk, type BlobSyncService, type WantList } from '@dxos/protocols/proto/dxos/mesh/teleport/blobsync';
2
2
  import { type ExtensionContext, RpcExtension } from '@dxos/teleport';
3
3
  import { type BlobStore } from './blob-store';
4
- export type BlobSyncExtensionParams = {
4
+ export type BlobSyncExtensionProps = {
5
5
  blobStore: BlobStore;
6
6
  onOpen: () => Promise<void>;
7
7
  onClose: () => Promise<void>;
@@ -23,7 +23,7 @@ export declare class BlobSyncExtension extends RpcExtension<ServiceBundle, Servi
23
23
  * Set of id's remote peer wants.
24
24
  */
25
25
  remoteWantList: WantList;
26
- constructor(_params: BlobSyncExtensionParams);
26
+ constructor(_params: BlobSyncExtensionProps);
27
27
  onOpen(context: ExtensionContext): Promise<void>;
28
28
  onClose(err?: Error | undefined): Promise<void>;
29
29
  onAbort(err?: Error | undefined): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"blob-sync-extension.d.ts","sourceRoot":"","sources":["../../../src/blob-sync-extension.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,mDAAmD,CAAC;AACxH,OAAO,EAAE,KAAK,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGrE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,MAAM,uBAAuB,GAAG;IACpC,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C,CAAC;AAMF;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,YAAY,CAAC,aAAa,EAAE,aAAa,CAAC;IAyD7E,OAAO,CAAC,QAAQ,CAAC,OAAO;IAxD1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqD;IAE1E,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,cAAc,CAA2B;IAEjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAY7B;IAEH,OAAO,CAAC,eAAe,CAAK;IAE5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CA2BrB;IAEH;;OAEG;IACI,cAAc,EAAE,QAAQ,CAAiB;gBAG7B,OAAO,EAAE,uBAAuB;IAgBpC,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhD,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;cAO9C,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC;IAiB/C,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1C,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAQxC,gBAAgB,IAAI,IAAI;YAOV,eAAe;CAuD9B;AAED,KAAK,aAAa,GAAG;IACnB,eAAe,EAAE,eAAe,CAAC;CAClC,CAAC"}
1
+ {"version":3,"file":"blob-sync-extension.d.ts","sourceRoot":"","sources":["../../../src/blob-sync-extension.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,mDAAmD,CAAC;AACxH,OAAO,EAAE,KAAK,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGrE,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C,CAAC;AAMF;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,YAAY,CAAC,aAAa,EAAE,aAAa,CAAC;IAyD7E,OAAO,CAAC,QAAQ,CAAC,OAAO;IAxD1B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqD;IAE1E,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,cAAc,CAA2B;IAEjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAY7B;IAEH,OAAO,CAAC,eAAe,CAAK;IAE5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CA2BrB;IAEH;;OAEG;IACI,cAAc,EAAE,QAAQ,CAAiB;IAEhD,YACmB,OAAO,EAAE,sBAAsB,EAcjD;IAEc,MAAM,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAI9D;IAEc,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7D;IAEc,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAK7D;IAED,UAAgB,WAAW,IAAI,OAAO,CAAC,aAAa,CAAC,CAcpD;IAGK,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAMzC;IAED,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAMvC;IAED,gBAAgB,IAAI,IAAI,CAKvB;YAEa,eAAe;CAuD9B;AAED,KAAK,aAAa,GAAG;IACnB,eAAe,EAAE,eAAe,CAAC;CAClC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import { Context } from '@dxos/context';
2
2
  import { type BlobStore } from './blob-store';
3
3
  import { BlobSyncExtension } from './blob-sync-extension';
4
- export type BlobSyncParams = {
4
+ export type BlobSyncProps = {
5
5
  blobStore: BlobStore;
6
6
  };
7
7
  export declare class BlobSync {
@@ -10,7 +10,7 @@ export declare class BlobSync {
10
10
  private readonly _mutex;
11
11
  private readonly _downloadRequests;
12
12
  private readonly _extensions;
13
- constructor(_params: BlobSyncParams);
13
+ constructor(_params: BlobSyncProps);
14
14
  open(): Promise<void>;
15
15
  close(): Promise<void>;
16
16
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"blob-sync.d.ts","sourceRoot":"","sources":["../../../src/blob-sync.ts"],"names":[],"mappings":"AAKA,OAAO,EAAqB,OAAO,EAAE,MAAM,eAAe,CAAC;AAQ3D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,SAAS,CAAC;CACtB,CAAC;AASF,qBACa,QAAQ;IAUP,OAAO,CAAC,QAAQ,CAAC,OAAO;IATpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IAEtC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAEhC;IAEF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgC;gBAE/B,OAAO,EAAE,cAAc;IAE9C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAErB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B;;;;OAIG;IACG,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiD3D,eAAe,IAAI,iBAAiB;IAqCpC;;OAEG;IACG,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrD,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,yBAAyB;CAKlC"}
1
+ {"version":3,"file":"blob-sync.d.ts","sourceRoot":"","sources":["../../../src/blob-sync.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAqB,MAAM,eAAe,CAAC;AAQ3D,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,SAAS,CAAC;CACtB,CAAC;AASF,qBACa,QAAQ;IAUP,OAAO,CAAC,QAAQ,CAAC,OAAO;IATpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IAEtC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAEhC;IAEF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgC;IAE5D,YAA6B,OAAO,EAAE,aAAa,EAAI;IAEjD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAG;IAExB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;IAED;;;;OAIG;IACG,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C1D;IAED,eAAe,IAAI,iBAAiB,CAmCnC;IAED;;OAEG;IACG,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpD;IAED,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,yBAAyB;CAKlC"}