rac-delta 1.0.17 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/services/reconstruction-service.d.ts +2 -0
- package/dist/core/services/reconstruction-service.d.ts.map +1 -1
- package/dist/infrastructure/adapters/s3-storage-adapter.d.ts.map +1 -1
- package/dist/infrastructure/adapters/s3-storage-adapter.js +1 -5
- package/dist/infrastructure/chunk-sources/storage-chunk-source.d.ts +2 -1
- package/dist/infrastructure/chunk-sources/storage-chunk-source.d.ts.map +1 -1
- package/dist/infrastructure/chunk-sources/storage-chunk-source.js +16 -1
- package/package.json +1 -1
|
@@ -59,10 +59,12 @@ export interface ChunkSource {
|
|
|
59
59
|
*
|
|
60
60
|
* @param options.concurrency Number of parallel fetches (default 8)
|
|
61
61
|
* @param options.preserveOrder Whether to yield in input order (default true)
|
|
62
|
+
* @param options.maxPrefetch Number of max chunk prefetchs to storage (default 12)
|
|
62
63
|
*/
|
|
63
64
|
streamChunks?(hashes: string[], options?: Nullish<{
|
|
64
65
|
concurrency?: number;
|
|
65
66
|
preserveOrder?: boolean;
|
|
67
|
+
maxPrefetch?: number;
|
|
66
68
|
}>): AsyncGenerator<{
|
|
67
69
|
hash: string;
|
|
68
70
|
data: Readable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconstruction-service.d.ts","sourceRoot":"","sources":["../../../src/core/services/reconstruction-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,eAAO,MAAM,yCAAyC,QAAoB,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtC;;;;;;;;;;;;;;OAcG;IACH,8BAA8B,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAEjD;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAElC;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,CACX,mBAAmB,EAAE,MAAM,EAC3B,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EACjC,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,KAC3B,IAAI,CAAC;CACX;AAED,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAExC;;OAEG;IACH,SAAS,CAAC,CACR,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,CAAC,EAAE,OAAO,CAAC;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAC1C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAEhC
|
|
1
|
+
{"version":3,"file":"reconstruction-service.d.ts","sourceRoot":"","sources":["../../../src/core/services/reconstruction-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAEnC,eAAO,MAAM,yCAAyC,QAAoB,CAAC;AAE3E,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtC;;;;;;;;;;;;;;OAcG;IACH,8BAA8B,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAEjD;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAElC;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,CACX,mBAAmB,EAAE,MAAM,EAC3B,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EACjC,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,KAC3B,IAAI,CAAC;CACX;AAED,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAExC;;OAEG;IACH,SAAS,CAAC,CACR,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,CAAC,EAAE,OAAO,CAAC;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAC1C,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAEhC;;;;;;;OAOG;IACH,YAAY,CAAC,CACX,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,CAAC,EAAE,OAAO,CAAC;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GACzF,cAAc,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,MAAM,WAAW,qBAAqB;IACpC;;;;;;;;OAQG;IACH,eAAe,CACb,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;;;;OAOG;IACH,cAAc,CACZ,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;;;OAMG;IACH,mBAAmB,CACjB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,WAAW,EACxB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,QAAQ,CAAC,CAAC;CACtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3-storage-adapter.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/adapters/s3-storage-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAe,MAAM,QAAQ,CAAC;AAW/C,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,qBAAa,gBAAiB,SAAQ,kBAAkB;IAG1C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;gBAED,MAAM,EAAE,eAAe;IAU9C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,OAAO,CAAC,UAAU;IAIZ,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"s3-storage-adapter.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/adapters/s3-storage-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAe,MAAM,QAAQ,CAAC;AAW/C,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,qBAAa,gBAAiB,SAAQ,kBAAkB;IAG1C,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAW;gBAED,MAAM,EAAE,eAAe;IAU9C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,OAAO,CAAC,UAAU;IAIZ,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAiBhD,QAAQ,CACZ,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,GAAG,MAAM,EACvB,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;KAAE,GAC9D,OAAO,CAAC,IAAI,CAAC;IAoBV,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY3C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA8B/B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAqBpD,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAe7C,cAAc,IAAI,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;CA6BhD"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.S3StorageAdapter = void 0;
|
|
4
|
-
const stream_1 = require("stream");
|
|
5
4
|
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
6
5
|
const adapters_1 = require("../../core/adapters");
|
|
7
6
|
class S3StorageAdapter extends adapters_1.HashStorageAdapter {
|
|
@@ -26,10 +25,7 @@ class S3StorageAdapter extends adapters_1.HashStorageAdapter {
|
|
|
26
25
|
try {
|
|
27
26
|
const key = this.resolveKey(hash);
|
|
28
27
|
const res = await this.s3.send(new client_s3_1.GetObjectCommand({ Bucket: this.config.bucket, Key: key }));
|
|
29
|
-
|
|
30
|
-
const pass = new stream_1.PassThrough({ highWaterMark: 1024 * 1024 });
|
|
31
|
-
s3Stream.pipe(pass);
|
|
32
|
-
return pass;
|
|
28
|
+
return res.Body;
|
|
33
29
|
}
|
|
34
30
|
catch (error) {
|
|
35
31
|
if (error instanceof client_s3_1.NoSuchKey) {
|
|
@@ -10,9 +10,10 @@ export declare class StorageChunkSource implements ChunkSource {
|
|
|
10
10
|
getChunks(hashes: string[], { concurrency }?: {
|
|
11
11
|
concurrency?: number;
|
|
12
12
|
}): Promise<Map<string, Buffer>>;
|
|
13
|
-
streamChunks(hashes: string[], { concurrency, preserveOrder, }?: {
|
|
13
|
+
streamChunks(hashes: string[], { concurrency, preserveOrder, maxPrefetch, }?: {
|
|
14
14
|
concurrency?: number;
|
|
15
15
|
preserveOrder?: boolean;
|
|
16
|
+
maxPrefetch?: number;
|
|
16
17
|
}): AsyncGenerator<{
|
|
17
18
|
hash: string;
|
|
18
19
|
data: Readable;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-chunk-source.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/chunk-sources/storage-chunk-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,cAAc,EAAqB,MAAM,qBAAqB,CAAC;AAG5F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,QAAQ,EAAe,MAAM,QAAQ,CAAC;AAE/C,qBAAa,kBAAmB,YAAW,WAAW;IAElD,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBADR,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAGnD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBvC,SAAS,CACb,MAAM,EAAE,MAAM,EAAE,EAChB,EAAE,WAAe,EAAE,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GACjD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAoBxB,YAAY,CACjB,MAAM,EAAE,MAAM,EAAE,EAChB,EACE,WAAe,EACf,aAAoB,
|
|
1
|
+
{"version":3,"file":"storage-chunk-source.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/chunk-sources/storage-chunk-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,cAAc,EAAqB,MAAM,qBAAqB,CAAC;AAG5F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,QAAQ,EAAe,MAAM,QAAQ,CAAC;AAE/C,qBAAa,kBAAmB,YAAW,WAAW;IAElD,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;gBADR,OAAO,EAAE,cAAc,EACvB,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAGnD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBvC,SAAS,CACb,MAAM,EAAE,MAAM,EAAE,EAChB,EAAE,WAAe,EAAE,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GACjD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAoBxB,YAAY,CACjB,MAAM,EAAE,MAAM,EAAE,EAChB,EACE,WAAe,EACf,aAAoB,EACpB,WAAgB,GACjB,GAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO,GAC9E,cAAc,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAC;CAiIpD"}
|
|
@@ -39,7 +39,7 @@ class StorageChunkSource {
|
|
|
39
39
|
await Promise.all(workers);
|
|
40
40
|
return results;
|
|
41
41
|
}
|
|
42
|
-
async *streamChunks(hashes, { concurrency = 4, preserveOrder = true, } = {}) {
|
|
42
|
+
async *streamChunks(hashes, { concurrency = 4, preserveOrder = true, maxPrefetch = 12, } = {}) {
|
|
43
43
|
if (hashes.length === 0) {
|
|
44
44
|
return;
|
|
45
45
|
}
|
|
@@ -49,6 +49,7 @@ class StorageChunkSource {
|
|
|
49
49
|
let activeWorkers = 0;
|
|
50
50
|
let workersDone = false;
|
|
51
51
|
const pendingResolvers = [];
|
|
52
|
+
const pendingSlotResolvers = [];
|
|
52
53
|
let workerError = null;
|
|
53
54
|
const signalNext = () => {
|
|
54
55
|
const resolver = pendingResolvers.shift();
|
|
@@ -56,6 +57,12 @@ class StorageChunkSource {
|
|
|
56
57
|
resolver();
|
|
57
58
|
}
|
|
58
59
|
};
|
|
60
|
+
const signalSlot = () => {
|
|
61
|
+
const resolver = pendingSlotResolvers.shift();
|
|
62
|
+
if (resolver) {
|
|
63
|
+
resolver();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
59
66
|
const waitForData = async () => {
|
|
60
67
|
while ((preserveOrder && !results.has(nextIndexToEmit) && !workerError) ||
|
|
61
68
|
(!preserveOrder && results.size === 0 && !workerError)) {
|
|
@@ -66,6 +73,12 @@ class StorageChunkSource {
|
|
|
66
73
|
activeWorkers++;
|
|
67
74
|
try {
|
|
68
75
|
while (queue.length > 0 && !workerError) {
|
|
76
|
+
while (results.size >= maxPrefetch && !workerError) {
|
|
77
|
+
await new Promise((resolve) => pendingSlotResolvers.push(resolve));
|
|
78
|
+
}
|
|
79
|
+
if (workerError) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
69
82
|
const { hash, index } = queue.shift();
|
|
70
83
|
try {
|
|
71
84
|
const stream = this.storage.type === 'hash'
|
|
@@ -108,6 +121,7 @@ class StorageChunkSource {
|
|
|
108
121
|
while (results.has(nextIndexToEmit)) {
|
|
109
122
|
yield results.get(nextIndexToEmit);
|
|
110
123
|
results.delete(nextIndexToEmit);
|
|
124
|
+
signalSlot();
|
|
111
125
|
nextIndexToEmit++;
|
|
112
126
|
}
|
|
113
127
|
}
|
|
@@ -116,6 +130,7 @@ class StorageChunkSource {
|
|
|
116
130
|
if (value !== undefined && index !== undefined) {
|
|
117
131
|
yield value;
|
|
118
132
|
results.delete(index);
|
|
133
|
+
signalSlot();
|
|
119
134
|
}
|
|
120
135
|
}
|
|
121
136
|
if (workersDone && results.size === 0) {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rac-delta",
|
|
3
3
|
"description": "Storage agnostic delta patching implementation of rac-delta protocol for NodeJs. With streaming support and file reconstruction.",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.18",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"repository": {
|