rac-delta 1.0.17 → 1.0.19
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 +22 -2
- 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;CAuIpD"}
|
|
@@ -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,7 +73,17 @@ class StorageChunkSource {
|
|
|
66
73
|
activeWorkers++;
|
|
67
74
|
try {
|
|
68
75
|
while (queue.length > 0 && !workerError) {
|
|
69
|
-
|
|
76
|
+
while (results.size >= maxPrefetch && !workerError) {
|
|
77
|
+
await new Promise((resolve) => pendingSlotResolvers.push(resolve));
|
|
78
|
+
}
|
|
79
|
+
if (workerError) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const item = queue.shift();
|
|
83
|
+
if (!item) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const { hash, index } = item;
|
|
70
87
|
try {
|
|
71
88
|
const stream = this.storage.type === 'hash'
|
|
72
89
|
? await this.storage.getChunk(hash)
|
|
@@ -94,6 +111,7 @@ class StorageChunkSource {
|
|
|
94
111
|
workersDone = true;
|
|
95
112
|
}
|
|
96
113
|
signalNext();
|
|
114
|
+
signalSlot();
|
|
97
115
|
}
|
|
98
116
|
};
|
|
99
117
|
const workers = Array.from({ length: Math.min(concurrency, queue.length) }, worker);
|
|
@@ -108,6 +126,7 @@ class StorageChunkSource {
|
|
|
108
126
|
while (results.has(nextIndexToEmit)) {
|
|
109
127
|
yield results.get(nextIndexToEmit);
|
|
110
128
|
results.delete(nextIndexToEmit);
|
|
129
|
+
signalSlot();
|
|
111
130
|
nextIndexToEmit++;
|
|
112
131
|
}
|
|
113
132
|
}
|
|
@@ -116,6 +135,7 @@ class StorageChunkSource {
|
|
|
116
135
|
if (value !== undefined && index !== undefined) {
|
|
117
136
|
yield value;
|
|
118
137
|
results.delete(index);
|
|
138
|
+
signalSlot();
|
|
119
139
|
}
|
|
120
140
|
}
|
|
121
141
|
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.19",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"repository": {
|