@dxos/teleport-extension-object-sync 0.8.4-main.ae835ea → 0.8.4-main.bc2380dfbc
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +102 -5
- package/dist/lib/{browser → neutral}/index.mjs +30 -183
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/{browser → neutral}/meta.json +1 -1
- package/dist/types/src/blob-store.d.ts.map +1 -1
- package/dist/types/src/blob-sync-extension.d.ts +2 -2
- package/dist/types/src/blob-sync-extension.d.ts.map +1 -1
- package/dist/types/src/blob-sync.d.ts +2 -2
- package/dist/types/src/blob-sync.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +19 -19
- package/src/blob-sync-extension.ts +2 -2
- package/src/blob-sync.node.test.ts +0 -1
- package/src/blob-sync.ts +2 -2
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -647
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
package/LICENSE
CHANGED
|
@@ -1,8 +1,105 @@
|
|
|
1
|
-
|
|
2
|
-
Copyright (c) 2022 DXOS
|
|
1
|
+
# Functional Source License, Version 1.1, ALv2 Future License
|
|
3
2
|
|
|
4
|
-
|
|
3
|
+
## Abbreviation
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
FSL-1.1-Apache-2.0
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
## Notice
|
|
8
|
+
|
|
9
|
+
Copyright 2026 DXOS
|
|
10
|
+
|
|
11
|
+
## Terms and Conditions
|
|
12
|
+
|
|
13
|
+
### Licensor ("We")
|
|
14
|
+
|
|
15
|
+
The party offering the Software under these Terms and Conditions.
|
|
16
|
+
|
|
17
|
+
### The Software
|
|
18
|
+
|
|
19
|
+
The "Software" is each version of the software that we make available under
|
|
20
|
+
these Terms and Conditions, as indicated by our inclusion of these Terms and
|
|
21
|
+
Conditions with the Software.
|
|
22
|
+
|
|
23
|
+
### License Grant
|
|
24
|
+
|
|
25
|
+
Subject to your compliance with this License Grant and the Patents,
|
|
26
|
+
Redistribution and Trademark clauses below, we hereby grant you the right to
|
|
27
|
+
use, copy, modify, create derivative works, publicly perform, publicly display
|
|
28
|
+
and redistribute the Software for any Permitted Purpose identified below.
|
|
29
|
+
|
|
30
|
+
### Permitted Purpose
|
|
31
|
+
|
|
32
|
+
A Permitted Purpose is any purpose other than a Competing Use. A Competing Use
|
|
33
|
+
means making the Software available to others in a commercial product or
|
|
34
|
+
service that:
|
|
35
|
+
|
|
36
|
+
1. substitutes for the Software;
|
|
37
|
+
|
|
38
|
+
2. substitutes for any other product or service we offer using the Software
|
|
39
|
+
that exists as of the date we make the Software available; or
|
|
40
|
+
|
|
41
|
+
3. offers the same or substantially similar functionality as the Software.
|
|
42
|
+
|
|
43
|
+
Permitted Purposes specifically include using the Software:
|
|
44
|
+
|
|
45
|
+
1. for your internal use and access;
|
|
46
|
+
|
|
47
|
+
2. for non-commercial education;
|
|
48
|
+
|
|
49
|
+
3. for non-commercial research; and
|
|
50
|
+
|
|
51
|
+
4. in connection with professional services that you provide to a licensee
|
|
52
|
+
using the Software in accordance with these Terms and Conditions.
|
|
53
|
+
|
|
54
|
+
### Patents
|
|
55
|
+
|
|
56
|
+
To the extent your use for a Permitted Purpose would necessarily infringe our
|
|
57
|
+
patents, the license grant above includes a license under our patents. If you
|
|
58
|
+
make a claim against any party that the Software infringes or contributes to
|
|
59
|
+
the infringement of any patent, then your patent license to the Software ends
|
|
60
|
+
immediately.
|
|
61
|
+
|
|
62
|
+
### Redistribution
|
|
63
|
+
|
|
64
|
+
The Terms and Conditions apply to all copies, modifications and derivatives of
|
|
65
|
+
the Software.
|
|
66
|
+
|
|
67
|
+
If you redistribute any copies, modifications or derivatives of the Software,
|
|
68
|
+
you must include a copy of or a link to these Terms and Conditions and not
|
|
69
|
+
remove any copyright notices provided in or with the Software.
|
|
70
|
+
|
|
71
|
+
### Disclaimer
|
|
72
|
+
|
|
73
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR
|
|
74
|
+
IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR
|
|
75
|
+
PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT.
|
|
76
|
+
|
|
77
|
+
IN NO EVENT WILL WE HAVE ANY LIABILITY TO YOU ARISING OUT OF OR RELATED TO THE
|
|
78
|
+
SOFTWARE, INCLUDING INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
|
|
79
|
+
EVEN IF WE HAVE BEEN INFORMED OF THEIR POSSIBILITY IN ADVANCE.
|
|
80
|
+
|
|
81
|
+
### Trademarks
|
|
82
|
+
|
|
83
|
+
Except for displaying the License Details and identifying us as the origin of
|
|
84
|
+
the Software, you have no right under these Terms and Conditions to use our
|
|
85
|
+
trademarks, trade names, service marks or product names.
|
|
86
|
+
|
|
87
|
+
## Grant of Future License
|
|
88
|
+
|
|
89
|
+
We hereby irrevocably grant you an additional license to use the Software under
|
|
90
|
+
the Apache License, Version 2.0 that is effective on the second anniversary of
|
|
91
|
+
the date we make the Software available. On or after that date, you may use the
|
|
92
|
+
Software under the Apache License, Version 2.0, in which case the following
|
|
93
|
+
will apply:
|
|
94
|
+
|
|
95
|
+
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
|
96
|
+
this file except in compliance with the License.
|
|
97
|
+
|
|
98
|
+
You may obtain a copy of the License at
|
|
99
|
+
|
|
100
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
101
|
+
|
|
102
|
+
Unless required by applicable law or agreed to in writing, software distributed
|
|
103
|
+
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
|
104
|
+
CONDITIONS OF ANY KIND, either express or implied. See the License for the
|
|
105
|
+
specific language governing permissions and limitations under the License.
|
|
@@ -9,28 +9,20 @@ 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
|
|
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
22
|
_params;
|
|
23
23
|
_ctx = new Context({
|
|
24
|
-
onError: (err) => log.catch(err, void 0, {
|
|
25
|
-
|
|
26
|
-
L: 35,
|
|
27
|
-
S: this,
|
|
28
|
-
C: (f, a) => f(...a)
|
|
29
|
-
})
|
|
30
|
-
}, {
|
|
31
|
-
F: __dxlog_file,
|
|
32
|
-
L: 35
|
|
33
|
-
});
|
|
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 });
|
|
34
26
|
_lastWantListUpdate = 0;
|
|
35
27
|
_localWantList = {
|
|
36
28
|
blobs: []
|
|
@@ -44,12 +36,7 @@ var BlobSyncExtension = class extends RpcExtension {
|
|
|
44
36
|
}
|
|
45
37
|
log("want", {
|
|
46
38
|
list: this._localWantList
|
|
47
|
-
}, {
|
|
48
|
-
F: __dxlog_file,
|
|
49
|
-
L: 49,
|
|
50
|
-
S: this,
|
|
51
|
-
C: (f, a) => f(...a)
|
|
52
|
-
});
|
|
39
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 40, S: this });
|
|
53
40
|
await this.rpc.BlobSyncService.want(this._localWantList);
|
|
54
41
|
this._lastWantListUpdate = Date.now();
|
|
55
42
|
});
|
|
@@ -73,12 +60,7 @@ var BlobSyncExtension = class extends RpcExtension {
|
|
|
73
60
|
}
|
|
74
61
|
log.warn("push failed", {
|
|
75
62
|
err
|
|
76
|
-
}, {
|
|
77
|
-
F: __dxlog_file,
|
|
78
|
-
L: 76,
|
|
79
|
-
S: this,
|
|
80
|
-
C: (f, a) => f(...a)
|
|
81
|
-
});
|
|
63
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 64, S: this });
|
|
82
64
|
}).finally(() => {
|
|
83
65
|
this._currentUploads--;
|
|
84
66
|
this.reconcileUploads();
|
|
@@ -106,33 +88,18 @@ var BlobSyncExtension = class extends RpcExtension {
|
|
|
106
88
|
}), this._params = _params;
|
|
107
89
|
}
|
|
108
90
|
async onOpen(context) {
|
|
109
|
-
log("open", void 0, {
|
|
110
|
-
F: __dxlog_file,
|
|
111
|
-
L: 108,
|
|
112
|
-
S: this,
|
|
113
|
-
C: (f, a) => f(...a)
|
|
114
|
-
});
|
|
91
|
+
log("open", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 93, S: this });
|
|
115
92
|
await super.onOpen(context);
|
|
116
93
|
await this._params.onOpen();
|
|
117
94
|
}
|
|
118
95
|
async onClose(err) {
|
|
119
|
-
log("close", void 0, {
|
|
120
|
-
F: __dxlog_file,
|
|
121
|
-
L: 114,
|
|
122
|
-
S: this,
|
|
123
|
-
C: (f, a) => f(...a)
|
|
124
|
-
});
|
|
96
|
+
log("close", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 98, S: this });
|
|
125
97
|
await this._ctx.dispose();
|
|
126
98
|
await this._params.onClose();
|
|
127
99
|
await super.onClose(err);
|
|
128
100
|
}
|
|
129
101
|
async onAbort(err) {
|
|
130
|
-
log("abort", void 0, {
|
|
131
|
-
F: __dxlog_file,
|
|
132
|
-
L: 121,
|
|
133
|
-
S: this,
|
|
134
|
-
C: (f, a) => f(...a)
|
|
135
|
-
});
|
|
102
|
+
log("abort", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 104, S: this });
|
|
136
103
|
await this._ctx.dispose();
|
|
137
104
|
await this._params.onAbort();
|
|
138
105
|
await super.onAbort(err);
|
|
@@ -143,24 +110,14 @@ var BlobSyncExtension = class extends RpcExtension {
|
|
|
143
110
|
want: async (wantList) => {
|
|
144
111
|
log("remote want", {
|
|
145
112
|
remoteWantList: wantList
|
|
146
|
-
}, {
|
|
147
|
-
F: __dxlog_file,
|
|
148
|
-
L: 131,
|
|
149
|
-
S: this,
|
|
150
|
-
C: (f, a) => f(...a)
|
|
151
|
-
});
|
|
113
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 113, S: this });
|
|
152
114
|
this.remoteWantList = wantList;
|
|
153
115
|
this.reconcileUploads();
|
|
154
116
|
},
|
|
155
117
|
push: async (data) => {
|
|
156
118
|
log("received", {
|
|
157
119
|
data
|
|
158
|
-
}, {
|
|
159
|
-
F: __dxlog_file,
|
|
160
|
-
L: 136,
|
|
161
|
-
S: this,
|
|
162
|
-
C: (f, a) => f(...a)
|
|
163
|
-
});
|
|
120
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 120, S: this });
|
|
164
121
|
await this._params.onPush(data);
|
|
165
122
|
}
|
|
166
123
|
}
|
|
@@ -172,12 +129,7 @@ var BlobSyncExtension = class extends RpcExtension {
|
|
|
172
129
|
}
|
|
173
130
|
log("push", {
|
|
174
131
|
data
|
|
175
|
-
}, {
|
|
176
|
-
F: __dxlog_file,
|
|
177
|
-
L: 148,
|
|
178
|
-
S: this,
|
|
179
|
-
C: (f, a) => f(...a)
|
|
180
|
-
});
|
|
132
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 132, S: this });
|
|
181
133
|
await this.rpc.BlobSyncService.push(data);
|
|
182
134
|
}
|
|
183
135
|
updateWantList(wantList) {
|
|
@@ -209,43 +161,14 @@ var BlobSyncExtension = class extends RpcExtension {
|
|
|
209
161
|
if (!meta) {
|
|
210
162
|
continue;
|
|
211
163
|
}
|
|
212
|
-
invariant(meta.bitfield, void 0, {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
S: this,
|
|
216
|
-
A: [
|
|
217
|
-
"meta.bitfield",
|
|
218
|
-
""
|
|
219
|
-
]
|
|
220
|
-
});
|
|
221
|
-
invariant(meta.chunkSize, void 0, {
|
|
222
|
-
F: __dxlog_file,
|
|
223
|
-
L: 188,
|
|
224
|
-
S: this,
|
|
225
|
-
A: [
|
|
226
|
-
"meta.chunkSize",
|
|
227
|
-
""
|
|
228
|
-
]
|
|
229
|
-
});
|
|
230
|
-
invariant(meta.length, void 0, {
|
|
231
|
-
F: __dxlog_file,
|
|
232
|
-
L: 189,
|
|
233
|
-
S: this,
|
|
234
|
-
A: [
|
|
235
|
-
"meta.length",
|
|
236
|
-
""
|
|
237
|
-
]
|
|
238
|
-
});
|
|
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", ""] });
|
|
239
167
|
if (header.chunkSize && header.chunkSize !== meta.chunkSize) {
|
|
240
168
|
log.warn("Invalid chunk size", {
|
|
241
169
|
header,
|
|
242
170
|
meta
|
|
243
|
-
}, {
|
|
244
|
-
F: __dxlog_file,
|
|
245
|
-
L: 192,
|
|
246
|
-
S: this,
|
|
247
|
-
C: (f, a) => f(...a)
|
|
248
|
-
});
|
|
171
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file, L: 170, S: this });
|
|
249
172
|
continue;
|
|
250
173
|
}
|
|
251
174
|
const requestBitfield = header.bitfield ?? BitField.ones(meta.length / meta.chunkSize);
|
|
@@ -283,19 +206,16 @@ import { PublicKey } from "@dxos/keys";
|
|
|
283
206
|
import { log as log2 } from "@dxos/log";
|
|
284
207
|
import { BlobMeta } from "@dxos/protocols/proto/dxos/echo/blob";
|
|
285
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";
|
|
286
210
|
function _ts_decorate2(decorators, target, key, desc) {
|
|
287
211
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
288
212
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
289
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;
|
|
290
214
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
291
215
|
}
|
|
292
|
-
var __dxlog_file2 = "/__w/dxos/dxos/packages/core/mesh/teleport-extension-object-sync/src/blob-sync.ts";
|
|
293
216
|
var BlobSync = class {
|
|
294
217
|
_params;
|
|
295
|
-
_ctx = new Context2(void 0, {
|
|
296
|
-
F: __dxlog_file2,
|
|
297
|
-
L: 30
|
|
298
|
-
});
|
|
218
|
+
_ctx = new Context2(void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 20 });
|
|
299
219
|
_mutex = new Mutex();
|
|
300
220
|
_downloadRequests = new ComplexMap((key) => PublicKey.from(key).toHex());
|
|
301
221
|
_extensions = /* @__PURE__ */ new Set();
|
|
@@ -315,12 +235,7 @@ var BlobSync = class {
|
|
|
315
235
|
async download(ctx, id) {
|
|
316
236
|
log2("download", {
|
|
317
237
|
id
|
|
318
|
-
}, {
|
|
319
|
-
F: __dxlog_file2,
|
|
320
|
-
L: 53,
|
|
321
|
-
S: this,
|
|
322
|
-
C: (f, a) => f(...a)
|
|
323
|
-
});
|
|
238
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 36, S: this });
|
|
324
239
|
const request = await this._mutex.executeSynchronized(async () => {
|
|
325
240
|
const existingRequest = this._downloadRequests.get(id);
|
|
326
241
|
if (existingRequest) {
|
|
@@ -361,31 +276,16 @@ var BlobSync = class {
|
|
|
361
276
|
const extension = new BlobSyncExtension({
|
|
362
277
|
blobStore: this._params.blobStore,
|
|
363
278
|
onOpen: async () => {
|
|
364
|
-
log2("extension opened", void 0, {
|
|
365
|
-
F: __dxlog_file2,
|
|
366
|
-
L: 105,
|
|
367
|
-
S: this,
|
|
368
|
-
C: (f, a) => f(...a)
|
|
369
|
-
});
|
|
279
|
+
log2("extension opened", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 81, S: this });
|
|
370
280
|
this._extensions.add(extension);
|
|
371
281
|
extension.updateWantList(this._getWantList());
|
|
372
282
|
},
|
|
373
283
|
onClose: async () => {
|
|
374
|
-
log2("extension closed", void 0, {
|
|
375
|
-
F: __dxlog_file2,
|
|
376
|
-
L: 110,
|
|
377
|
-
S: this,
|
|
378
|
-
C: (f, a) => f(...a)
|
|
379
|
-
});
|
|
284
|
+
log2("extension closed", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 86, S: this });
|
|
380
285
|
this._extensions.delete(extension);
|
|
381
286
|
},
|
|
382
287
|
onAbort: async () => {
|
|
383
|
-
log2("extension aborted", void 0, {
|
|
384
|
-
F: __dxlog_file2,
|
|
385
|
-
L: 114,
|
|
386
|
-
S: this,
|
|
387
|
-
C: (f, a) => f(...a)
|
|
388
|
-
});
|
|
288
|
+
log2("extension aborted", void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 90, S: this });
|
|
389
289
|
this._extensions.delete(extension);
|
|
390
290
|
},
|
|
391
291
|
onPush: async (blobChunk) => {
|
|
@@ -394,26 +294,13 @@ var BlobSync = class {
|
|
|
394
294
|
}
|
|
395
295
|
log2("received", {
|
|
396
296
|
blobChunk
|
|
397
|
-
}, {
|
|
398
|
-
F: __dxlog_file2,
|
|
399
|
-
L: 121,
|
|
400
|
-
S: this,
|
|
401
|
-
C: (f, a) => f(...a)
|
|
402
|
-
});
|
|
297
|
+
}, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 97, S: this });
|
|
403
298
|
const meta = await this._params.blobStore.setChunk(blobChunk);
|
|
404
299
|
if (meta.state === BlobMeta.State.FULLY_PRESENT) {
|
|
405
300
|
this._downloadRequests.get(blobChunk.id)?.trigger.wake();
|
|
406
301
|
this._downloadRequests.delete(blobChunk.id);
|
|
407
302
|
} else {
|
|
408
|
-
invariant2(meta.bitfield, void 0, {
|
|
409
|
-
F: __dxlog_file2,
|
|
410
|
-
L: 127,
|
|
411
|
-
S: this,
|
|
412
|
-
A: [
|
|
413
|
-
"meta.bitfield",
|
|
414
|
-
""
|
|
415
|
-
]
|
|
416
|
-
});
|
|
303
|
+
invariant2(meta.bitfield, void 0, { "~LogMeta": "~LogMeta", F: __dxlog_file2, L: 105, S: this, A: ["meta.bitfield", ""] });
|
|
417
304
|
this._downloadRequests.get(blobChunk.id).want.bitfield = BitField2.invert(meta.bitfield);
|
|
418
305
|
}
|
|
419
306
|
this._updateExtensionsWantList();
|
|
@@ -457,13 +344,13 @@ import { PublicKey as PublicKey2 } from "@dxos/keys";
|
|
|
457
344
|
import { schema as schema2 } from "@dxos/protocols/proto";
|
|
458
345
|
import { BlobMeta as BlobMeta2 } from "@dxos/protocols/proto/dxos/echo/blob";
|
|
459
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";
|
|
460
348
|
function _ts_decorate3(decorators, target, key, desc) {
|
|
461
349
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
462
350
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
463
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;
|
|
464
352
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
465
353
|
}
|
|
466
|
-
var __dxlog_file3 = "/__w/dxos/dxos/packages/core/mesh/teleport-extension-object-sync/src/blob-store.ts";
|
|
467
354
|
var DEFAULT_CHUNK_SIZE = 4096;
|
|
468
355
|
var BlobMetaCodec = schema2.getCodecForType("dxos.echo.blob.BlobMeta");
|
|
469
356
|
var BlobStore = class {
|
|
@@ -494,24 +381,8 @@ var BlobStore = class {
|
|
|
494
381
|
}
|
|
495
382
|
const beginChunk = Math.floor(offset / metadata.chunkSize);
|
|
496
383
|
const endChunk = Math.ceil((offset + length) / metadata.chunkSize);
|
|
497
|
-
invariant3(metadata.bitfield, "Bitfield not present", {
|
|
498
|
-
|
|
499
|
-
L: 61,
|
|
500
|
-
S: this,
|
|
501
|
-
A: [
|
|
502
|
-
"metadata.bitfield",
|
|
503
|
-
"'Bitfield not present'"
|
|
504
|
-
]
|
|
505
|
-
});
|
|
506
|
-
invariant3(metadata.bitfield.length * 8 >= endChunk, "Invalid bitfield length", {
|
|
507
|
-
F: __dxlog_file3,
|
|
508
|
-
L: 62,
|
|
509
|
-
S: this,
|
|
510
|
-
A: [
|
|
511
|
-
"metadata.bitfield.length * 8 >= endChunk",
|
|
512
|
-
"'Invalid bitfield length'"
|
|
513
|
-
]
|
|
514
|
-
});
|
|
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'"] });
|
|
515
386
|
const present = BitField3.count(metadata.bitfield, beginChunk, endChunk) === endChunk - beginChunk;
|
|
516
387
|
if (!present) {
|
|
517
388
|
throw new Error("Blob not available");
|
|
@@ -551,15 +422,7 @@ var BlobStore = class {
|
|
|
551
422
|
async setChunk(chunk) {
|
|
552
423
|
let meta = await this._getMeta(chunk.id);
|
|
553
424
|
if (!meta) {
|
|
554
|
-
invariant3(chunk.totalLength, "totalLength is not present", {
|
|
555
|
-
F: __dxlog_file3,
|
|
556
|
-
L: 124,
|
|
557
|
-
S: this,
|
|
558
|
-
A: [
|
|
559
|
-
"chunk.totalLength",
|
|
560
|
-
"'totalLength is not present'"
|
|
561
|
-
]
|
|
562
|
-
});
|
|
425
|
+
invariant3(chunk.totalLength, "totalLength is not present", { "~LogMeta": "~LogMeta", F: __dxlog_file3, L: 95, S: this, A: ["chunk.totalLength", "'totalLength is not present'"] });
|
|
563
426
|
meta = {
|
|
564
427
|
id: chunk.id,
|
|
565
428
|
state: BlobMeta2.State.PARTIALLY_PRESENT,
|
|
@@ -572,24 +435,8 @@ var BlobStore = class {
|
|
|
572
435
|
if (chunk.chunkSize && chunk.chunkSize !== meta.chunkSize) {
|
|
573
436
|
throw new Error("Invalid chunk size");
|
|
574
437
|
}
|
|
575
|
-
invariant3(meta.bitfield, "Bitfield not present", {
|
|
576
|
-
|
|
577
|
-
L: 139,
|
|
578
|
-
S: this,
|
|
579
|
-
A: [
|
|
580
|
-
"meta.bitfield",
|
|
581
|
-
"'Bitfield not present'"
|
|
582
|
-
]
|
|
583
|
-
});
|
|
584
|
-
invariant3(chunk.chunkOffset !== void 0, "chunkOffset is not present", {
|
|
585
|
-
F: __dxlog_file3,
|
|
586
|
-
L: 140,
|
|
587
|
-
S: this,
|
|
588
|
-
A: [
|
|
589
|
-
"chunk.chunkOffset !== undefined",
|
|
590
|
-
"'chunkOffset is not present'"
|
|
591
|
-
]
|
|
592
|
-
});
|
|
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'"] });
|
|
593
440
|
await this._getDataFile(chunk.id).write(chunk.chunkOffset, arrayToBuffer(chunk.payload));
|
|
594
441
|
BitField3.set(meta.bitfield, Math.floor(chunk.chunkOffset / meta.chunkSize), true);
|
|
595
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", "_ctx", "_mutex", "Context", "Mutex", "__dxlog_file", "_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", "BlobMetaCodec", "getCodecForType", "BlobStore", "_directory", "_getMeta", "metadata", "Error", "offset", "length", "file", "_getDataFile", "id", "read", "options", "undefined", "endChunk", "Math", "ceil", "chunkSize", "bitfield", "__dxlog_file", "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":
|
|
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":29861},"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;
|
|
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
|
|
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:
|
|
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,
|
|
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
|
|
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:
|
|
13
|
+
constructor(_params: BlobSyncProps);
|
|
14
14
|
open(): Promise<void>;
|
|
15
15
|
close(): Promise<void>;
|
|
16
16
|
/**
|