rac-delta 1.0.16 → 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/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 +26 -30
- package/dist/infrastructure/services/memory-reconstruction-service.d.ts.map +1 -1
- package/dist/infrastructure/services/memory-reconstruction-service.js +6 -5
- 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,
|
|
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"}
|
|
@@ -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"}
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.StorageChunkSource = void 0;
|
|
4
4
|
const stream_to_buffer_1 = require("../../core/utils/stream-to-buffer");
|
|
5
5
|
const exceptions_1 = require("../../core/exceptions");
|
|
6
|
-
const stream_1 = require("stream");
|
|
7
6
|
class StorageChunkSource {
|
|
8
7
|
storage;
|
|
9
8
|
urlsMap;
|
|
@@ -40,17 +39,17 @@ class StorageChunkSource {
|
|
|
40
39
|
await Promise.all(workers);
|
|
41
40
|
return results;
|
|
42
41
|
}
|
|
43
|
-
async *streamChunks(hashes, { concurrency = 4, preserveOrder = true, } = {}) {
|
|
42
|
+
async *streamChunks(hashes, { concurrency = 4, preserveOrder = true, maxPrefetch = 12, } = {}) {
|
|
44
43
|
if (hashes.length === 0) {
|
|
45
44
|
return;
|
|
46
45
|
}
|
|
47
|
-
const controller = new AbortController();
|
|
48
46
|
const queue = hashes.map((hash, index) => ({ hash, index }));
|
|
49
47
|
const results = new Map();
|
|
50
48
|
let nextIndexToEmit = 0;
|
|
51
49
|
let activeWorkers = 0;
|
|
52
50
|
let workersDone = false;
|
|
53
51
|
const pendingResolvers = [];
|
|
52
|
+
const pendingSlotResolvers = [];
|
|
54
53
|
let workerError = null;
|
|
55
54
|
const signalNext = () => {
|
|
56
55
|
const resolver = pendingResolvers.shift();
|
|
@@ -58,46 +57,45 @@ class StorageChunkSource {
|
|
|
58
57
|
resolver();
|
|
59
58
|
}
|
|
60
59
|
};
|
|
60
|
+
const signalSlot = () => {
|
|
61
|
+
const resolver = pendingSlotResolvers.shift();
|
|
62
|
+
if (resolver) {
|
|
63
|
+
resolver();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
61
66
|
const waitForData = async () => {
|
|
62
|
-
while ((preserveOrder && !results.has(nextIndexToEmit) && workerError
|
|
63
|
-
(!preserveOrder && results.size === 0 && workerError
|
|
67
|
+
while ((preserveOrder && !results.has(nextIndexToEmit) && !workerError) ||
|
|
68
|
+
(!preserveOrder && results.size === 0 && !workerError)) {
|
|
64
69
|
await new Promise((resolve) => pendingResolvers.push(resolve));
|
|
65
70
|
}
|
|
66
71
|
};
|
|
67
72
|
const worker = async () => {
|
|
68
73
|
activeWorkers++;
|
|
69
74
|
try {
|
|
70
|
-
while (queue.length > 0 && !
|
|
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
|
+
}
|
|
71
82
|
const { hash, index } = queue.shift();
|
|
72
83
|
try {
|
|
73
|
-
const url = this.urlsMap?.get(hash);
|
|
74
|
-
if (!url && this.storage.type === 'url') {
|
|
75
|
-
throw new Error(`No URL found for hash: ${hash}`);
|
|
76
|
-
}
|
|
77
84
|
const stream = this.storage.type === 'hash'
|
|
78
85
|
? await this.storage.getChunk(hash)
|
|
79
|
-
: await this.storage.getChunkByUrl(
|
|
86
|
+
: await this.storage.getChunkByUrl(this.urlsMap?.get(hash));
|
|
80
87
|
if (!stream) {
|
|
81
|
-
throw new exceptions_1.ChunkNotFoundException(
|
|
88
|
+
throw new exceptions_1.ChunkNotFoundException(`Chunk ${hash} not found in storage`);
|
|
82
89
|
}
|
|
83
|
-
|
|
84
|
-
stream.on('error', (err) => {
|
|
85
|
-
workerError = err instanceof Error ? err : new Error(String(err));
|
|
86
|
-
controller.abort();
|
|
87
|
-
signalNext();
|
|
88
|
-
});
|
|
89
|
-
pass.on('error', (err) => {
|
|
90
|
+
stream.once('error', (err) => {
|
|
90
91
|
workerError = err instanceof Error ? err : new Error(String(err));
|
|
91
|
-
controller.abort();
|
|
92
92
|
signalNext();
|
|
93
93
|
});
|
|
94
|
-
|
|
95
|
-
results.set(index, { hash, data: pass });
|
|
94
|
+
results.set(index, { hash, data: stream });
|
|
96
95
|
signalNext();
|
|
97
96
|
}
|
|
98
|
-
catch (
|
|
99
|
-
workerError =
|
|
100
|
-
controller.abort();
|
|
97
|
+
catch (err) {
|
|
98
|
+
workerError = err instanceof Error ? err : new Error(String(err));
|
|
101
99
|
signalNext();
|
|
102
100
|
return;
|
|
103
101
|
}
|
|
@@ -107,8 +105,8 @@ class StorageChunkSource {
|
|
|
107
105
|
activeWorkers--;
|
|
108
106
|
if (activeWorkers === 0) {
|
|
109
107
|
workersDone = true;
|
|
110
|
-
signalNext();
|
|
111
108
|
}
|
|
109
|
+
signalNext();
|
|
112
110
|
}
|
|
113
111
|
};
|
|
114
112
|
const workers = Array.from({ length: Math.min(concurrency, queue.length) }, worker);
|
|
@@ -116,24 +114,23 @@ class StorageChunkSource {
|
|
|
116
114
|
while (true) {
|
|
117
115
|
await waitForData();
|
|
118
116
|
if (workerError) {
|
|
119
|
-
// ensure workers settle so their promise rejections don't become unhandled
|
|
120
117
|
await Promise.allSettled(workers);
|
|
121
118
|
throw workerError;
|
|
122
119
|
}
|
|
123
|
-
// Emit strictly in order
|
|
124
120
|
if (preserveOrder) {
|
|
125
121
|
while (results.has(nextIndexToEmit)) {
|
|
126
122
|
yield results.get(nextIndexToEmit);
|
|
127
123
|
results.delete(nextIndexToEmit);
|
|
124
|
+
signalSlot();
|
|
128
125
|
nextIndexToEmit++;
|
|
129
126
|
}
|
|
130
127
|
}
|
|
131
|
-
// Emit as soon as any result is ready
|
|
132
128
|
if (!preserveOrder) {
|
|
133
129
|
const [index, value] = results.entries().next().value ?? [];
|
|
134
130
|
if (value !== undefined && index !== undefined) {
|
|
135
131
|
yield value;
|
|
136
132
|
results.delete(index);
|
|
133
|
+
signalSlot();
|
|
137
134
|
}
|
|
138
135
|
}
|
|
139
136
|
if (workersDone && results.size === 0) {
|
|
@@ -142,7 +139,6 @@ class StorageChunkSource {
|
|
|
142
139
|
}
|
|
143
140
|
}
|
|
144
141
|
finally {
|
|
145
|
-
controller.abort();
|
|
146
142
|
await Promise.allSettled(workers);
|
|
147
143
|
}
|
|
148
144
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-reconstruction-service.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/services/memory-reconstruction-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAyB,MAAM,QAAQ,CAAC;AAIzD,OAAO,EACL,WAAW,EAEX,aAAa,EACb,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAS,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,qBAAa,2BAA4B,YAAW,qBAAqB;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAE5C,cAAc,CAClB,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC;IAmFV,eAAe,CACnB,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,qBAIR,GACA,OAAO,CAAC,IAAI,CAAC;IAgDV,mBAAmB,CACvB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,WAAW,EACxB,cAAc,SAAI,GACjB,OAAO,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"memory-reconstruction-service.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/services/memory-reconstruction-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAyB,MAAM,QAAQ,CAAC;AAIzD,OAAO,EACL,WAAW,EAEX,aAAa,EACb,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAS,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,qBAAa,2BAA4B,YAAW,qBAAqB;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAE5C,cAAc,CAClB,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,WAAW,EACxB,OAAO,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACvC,OAAO,CAAC,IAAI,CAAC;IAmFV,eAAe,CACnB,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,qBAIR,GACA,OAAO,CAAC,IAAI,CAAC;IAgDV,mBAAmB,CACvB,KAAK,EAAE,SAAS,EAChB,WAAW,EAAE,WAAW,EACxB,cAAc,SAAI,GACjB,OAAO,CAAC,QAAQ,CAAC;YA+CN,UAAU;IASxB,oEAAoE;YACtD,kBAAkB;IAiChC,oFAAoF;YACtE,iBAAiB;IAmF/B;;;OAGG;YACW,qBAAqB;YA2BrB,YAAY;YAcZ,aAAa;YAyCZ,gBAAgB;CAmChC"}
|
|
@@ -113,8 +113,11 @@ class MemoryReconstructionService {
|
|
|
113
113
|
// This will reconstruct to stream, not to disk
|
|
114
114
|
async reconstructToStream(entry, chunkSource, maxConcurrency = 5) {
|
|
115
115
|
const chunks = entry.chunks ?? [];
|
|
116
|
-
const pass = new stream_1.PassThrough({ highWaterMark:
|
|
116
|
+
const pass = new stream_1.PassThrough({ highWaterMark: 1024 * 1024 });
|
|
117
117
|
const iterator = this.fetchChunksSmart(chunks, chunkSource, true);
|
|
118
|
+
pass.once('error', (err) => {
|
|
119
|
+
pass.destroy(err);
|
|
120
|
+
});
|
|
118
121
|
(async () => {
|
|
119
122
|
const active = new Set();
|
|
120
123
|
const pipeChunk = async (data) => {
|
|
@@ -125,11 +128,9 @@ class MemoryReconstructionService {
|
|
|
125
128
|
}
|
|
126
129
|
else {
|
|
127
130
|
await new Promise((resolve, reject) => {
|
|
128
|
-
const onError = (err) => reject(err);
|
|
129
|
-
data.once('error', onError);
|
|
130
|
-
pass.once('error', onError);
|
|
131
|
-
data.once('end', resolve);
|
|
132
131
|
data.pipe(pass, { end: false });
|
|
132
|
+
data.once('error', reject);
|
|
133
|
+
data.once('end', resolve);
|
|
133
134
|
});
|
|
134
135
|
}
|
|
135
136
|
};
|
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": {
|