rac-delta 1.0.9 → 1.0.10

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.
@@ -16,13 +16,13 @@ export interface HasherService {
16
16
  */
17
17
  hashFile(filePath: string, rootDir: string, chunkSize: number): Promise<FileEntry>;
18
18
  /**
19
- * Will process a stream of Chunks and return an array of hashed Chunks
19
+ * Will process a stream of Chunks and return in a callback each processed chunk
20
20
  *
21
21
  * @param stream
22
22
  * @param chunkSize The size (in bytes) chunks will need to be processed and emited.
23
- * @param onChunk callback that returns the processed bytes
23
+ * @param onChunk callback that returns the processed chunk
24
24
  */
25
- hashStream(stream: AsyncChunkStream, chunkSize: number, onChunk?: (chunk: Uint8Array, hash: string) => void): Promise<Chunk[]>;
25
+ hashStream(stream: AsyncChunkStream, chunkSize: number, onChunk: (data: Buffer, chunk: Chunk) => void): Promise<void>;
26
26
  /**
27
27
  * Returns a hash of a buffer
28
28
  *
@@ -1 +1 @@
1
- {"version":3,"file":"hasher-service.d.ts","sourceRoot":"","sources":["../../../src/core/services/hasher-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC;IAExC,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B;;;;;;;;OAQG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAEnF;;;;;;OAMG;IACH,UAAU,CACR,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAClD,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAEpB;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE9C;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtE;;;;;OAKG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjE,qBAAqB,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;CACnD"}
1
+ {"version":3,"file":"hasher-service.d.ts","sourceRoot":"","sources":["../../../src/core/services/hasher-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC;IAExC,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,aAAa;IAC5B;;;;;;;;OAQG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAEnF;;;;;;OAMG;IACH,UAAU,CACR,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,GAC5C,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE9C;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtE;;;;;OAKG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjE,qBAAqB,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;CACnD"}
@@ -1,10 +1,9 @@
1
1
  import { HasherService, StreamingHasher } from '../../core/services';
2
2
  import { AsyncChunkStream } from '../../core/services';
3
3
  import { FileEntry, Chunk } from '../../core/models';
4
- import { Nullish } from '../../core/types';
5
4
  export declare class HashWasmHasherService implements HasherService {
6
5
  hashFile(filePath: string, rootDir: string, chunkSize: number): Promise<FileEntry>;
7
- hashStream(stream: AsyncChunkStream, chunkSize: number, onChunk?: Nullish<(chunk: Uint8Array, hash: string) => void>): Promise<Chunk[]>;
6
+ hashStream(stream: AsyncChunkStream, chunkSize: number, onChunk: (data: Buffer, chunk: Chunk) => void): Promise<void>;
8
7
  verifyChunk(data: Uint8Array, expectedHash: string): Promise<boolean>;
9
8
  hashBuffer(data: Uint8Array): Promise<string>;
10
9
  verifyFile(path: string, expectedHash: string): Promise<boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"hash-wasm-hasher-service.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/services/hash-wasm-hasher-service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,qBAAa,qBAAsB,YAAW,aAAa;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAiDlF,UAAU,CACd,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAC3D,OAAO,CAAC,KAAK,EAAE,CAAC;IAwEb,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQrE,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAM7C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBhE,qBAAqB,IAAI,OAAO,CAAC,eAAe,CAAC;CAYxD"}
1
+ {"version":3,"file":"hash-wasm-hasher-service.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/services/hash-wasm-hasher-service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAErE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAGrD,qBAAa,qBAAsB,YAAW,aAAa;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAiDlF,UAAU,CACd,MAAM,EAAE,gBAAgB,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,IAAI,GAC5C,OAAO,CAAC,IAAI,CAAC;IAkEV,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQrE,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAM7C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBhE,qBAAqB,IAAI,OAAO,CAAC,eAAe,CAAC;CAYxD"}
@@ -50,52 +50,45 @@ class HashWasmHasherService {
50
50
  if (!chunkSize || chunkSize <= 0) {
51
51
  throw new Error('chunkSize must be a positive number.');
52
52
  }
53
- const chunks = [];
54
53
  let offset = 0;
55
- let buffer = Buffer.alloc(0);
54
+ let buffer = Buffer.allocUnsafe(chunkSize);
55
+ let bufferLen = 0;
56
56
  try {
57
57
  for await (const data of stream) {
58
58
  let input = Buffer.isBuffer(data) ? data : Buffer.from(data);
59
59
  while (input.length > 0) {
60
- const remainingSpace = chunkSize - buffer.length;
61
- const take = Math.min(remainingSpace, input.length);
62
- buffer = Buffer.concat([buffer, input.subarray(0, take)]);
60
+ const take = Math.min(chunkSize - bufferLen, input.length);
61
+ input.copy(buffer, bufferLen, 0, take);
62
+ bufferLen += take;
63
63
  input = input.subarray(take);
64
- if (buffer.length === chunkSize) {
64
+ if (bufferLen === chunkSize) {
65
+ const chunkView = buffer.subarray(0, bufferLen);
66
+ const chunk = Buffer.from(chunkView);
65
67
  const chunkHasher = await (0, hash_wasm_1.createBLAKE3)();
66
- chunkHasher.update(buffer);
68
+ chunkHasher.update(chunk);
67
69
  const chunkHash = chunkHasher.digest('hex');
68
- if (onChunk) {
69
- // onChunk could be a promise
70
- await Promise.resolve(onChunk(buffer, chunkHash));
71
- }
72
- chunks.push({
73
- hash: chunkHash,
74
- offset,
75
- size: buffer.length,
76
- });
77
- offset += buffer.length;
78
- buffer = Buffer.alloc(0);
70
+ // onChunk could be a promise
71
+ await Promise.resolve(onChunk(chunk, { hash: chunkHash, offset, size: bufferLen }));
72
+ offset += bufferLen;
73
+ bufferLen = 0;
79
74
  }
80
75
  }
81
76
  }
82
- if (buffer.length > 0) {
77
+ if (bufferLen > 0) {
78
+ const chunkView = buffer.subarray(0, bufferLen);
79
+ const chunk = Buffer.from(chunkView);
83
80
  const chunkHasher = await (0, hash_wasm_1.createBLAKE3)();
84
- chunkHasher.update(buffer);
81
+ chunkHasher.update(chunk);
85
82
  const chunkHash = chunkHasher.digest('hex');
86
- if (onChunk) {
87
- await Promise.resolve(onChunk(buffer, chunkHash));
88
- }
89
- chunks.push({
83
+ await Promise.resolve(onChunk(chunk, {
90
84
  hash: chunkHash,
91
85
  offset,
92
- size: buffer.length,
93
- });
86
+ size: bufferLen,
87
+ }));
94
88
  }
95
89
  if (stream.close) {
96
90
  await stream.close();
97
91
  }
98
- return chunks;
99
92
  }
100
93
  catch (err) {
101
94
  if (err instanceof Error) {
@@ -1 +1 @@
1
- {"version":3,"file":"memory-delta-service.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/services/memory-delta-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAc,MAAM,mBAAmB,CAAC;AAE9E,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,qBAAa,kBAAmB,YAAW,YAAY;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAE5C,wBAAwB,CAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,SAAI,EACf,cAAc,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,GACjC,OAAO,CAAC,OAAO,CAAC;IA8Cb,yBAAyB,CAC7B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC;YAqBN,SAAS;IAuBxB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS;IAiE3D,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,GAAG,SAAS;IA0CpD,gBAAgB,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC;IAkBtF,kBAAkB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;CAG/F"}
1
+ {"version":3,"file":"memory-delta-service.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/services/memory-delta-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAqB,MAAM,mBAAmB,CAAC;AAErF,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,qBAAa,kBAAmB,YAAW,YAAY;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,aAAa;IAE5C,wBAAwB,CAC5B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,SAAI,EACf,cAAc,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,GACjC,OAAO,CAAC,OAAO,CAAC;IA8Cb,yBAAyB,CAC7B,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC;YAwBN,SAAS;IAuBxB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS;IAiE3D,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,GAAG,SAAS;IA0CpD,gBAAgB,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,GAAG,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC;IAkBtF,kBAAkB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI,EAAE,WAAW,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;CAG/F"}
@@ -47,8 +47,10 @@ class MemoryDeltaService {
47
47
  }
48
48
  async createFileEntryFromStream(stream, path, chunkSize) {
49
49
  const fileHasher = await this.hasher.createStreamingHasher();
50
- const chunks = await this.hasher.hashStream(stream, chunkSize, (chunk) => {
51
- fileHasher.update(chunk);
50
+ const chunks = [];
51
+ await this.hasher.hashStream(stream, chunkSize, (data, chunk) => {
52
+ fileHasher.update(data);
53
+ chunks.push(chunk);
52
54
  });
53
55
  const fileHash = fileHasher.digest('hex');
54
56
  const totalSize = chunks.reduce((total, chunk) => total + chunk.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.9",
4
+ "version": "1.0.10",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "repository": {