@rushstack/zipsync 0.1.0

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.
Files changed (89) hide show
  1. package/CHANGELOG.json +31 -0
  2. package/CHANGELOG.md +11 -0
  3. package/LICENSE +24 -0
  4. package/README.md +48 -0
  5. package/bin/zipsync +2 -0
  6. package/lib/ZipSyncCommandLineParser.d.ts +17 -0
  7. package/lib/ZipSyncCommandLineParser.d.ts.map +1 -0
  8. package/lib/ZipSyncCommandLineParser.js +97 -0
  9. package/lib/ZipSyncCommandLineParser.js.map +1 -0
  10. package/lib/benchmark.test.d.ts +2 -0
  11. package/lib/benchmark.test.d.ts.map +1 -0
  12. package/lib/benchmark.test.js.map +1 -0
  13. package/lib/compress.d.ts +8 -0
  14. package/lib/compress.d.ts.map +1 -0
  15. package/lib/compress.js +121 -0
  16. package/lib/compress.js.map +1 -0
  17. package/lib/crc32.d.ts +3 -0
  18. package/lib/crc32.d.ts.map +1 -0
  19. package/lib/crc32.js +69 -0
  20. package/lib/crc32.js.map +1 -0
  21. package/lib/crc32.test.d.ts +2 -0
  22. package/lib/crc32.test.d.ts.map +1 -0
  23. package/lib/crc32.test.js.map +1 -0
  24. package/lib/fs.d.ts +13 -0
  25. package/lib/fs.d.ts.map +1 -0
  26. package/lib/fs.js +57 -0
  27. package/lib/fs.js.map +1 -0
  28. package/lib/hash.d.ts +3 -0
  29. package/lib/hash.d.ts.map +1 -0
  30. package/lib/hash.js +43 -0
  31. package/lib/hash.js.map +1 -0
  32. package/lib/index.d.ts +3 -0
  33. package/lib/index.d.ts.map +1 -0
  34. package/lib/index.js +10 -0
  35. package/lib/index.js.map +1 -0
  36. package/lib/index.test.d.ts +2 -0
  37. package/lib/index.test.d.ts.map +1 -0
  38. package/lib/index.test.js.map +1 -0
  39. package/lib/pack.d.ts +55 -0
  40. package/lib/pack.d.ts.map +1 -0
  41. package/lib/pack.js +415 -0
  42. package/lib/pack.js.map +1 -0
  43. package/lib/packWorker.d.ts +31 -0
  44. package/lib/packWorker.d.ts.map +1 -0
  45. package/lib/packWorker.js +60 -0
  46. package/lib/packWorker.js.map +1 -0
  47. package/lib/packWorkerAsync.d.ts +4 -0
  48. package/lib/packWorkerAsync.d.ts.map +1 -0
  49. package/lib/packWorkerAsync.js +79 -0
  50. package/lib/packWorkerAsync.js.map +1 -0
  51. package/lib/perf.d.ts +7 -0
  52. package/lib/perf.d.ts.map +1 -0
  53. package/lib/perf.js +56 -0
  54. package/lib/perf.js.map +1 -0
  55. package/lib/start.d.ts +2 -0
  56. package/lib/start.d.ts.map +1 -0
  57. package/lib/start.js +19 -0
  58. package/lib/start.js.map +1 -0
  59. package/lib/start.test.d.ts +2 -0
  60. package/lib/start.test.d.ts.map +1 -0
  61. package/lib/start.test.js.map +1 -0
  62. package/lib/testUtils.d.ts +9 -0
  63. package/lib/testUtils.d.ts.map +1 -0
  64. package/lib/testUtils.js +77 -0
  65. package/lib/testUtils.js.map +1 -0
  66. package/lib/unpack.d.ts +41 -0
  67. package/lib/unpack.d.ts.map +1 -0
  68. package/lib/unpack.js +370 -0
  69. package/lib/unpack.js.map +1 -0
  70. package/lib/unpackWorker.d.ts +31 -0
  71. package/lib/unpackWorker.d.ts.map +1 -0
  72. package/lib/unpackWorker.js +56 -0
  73. package/lib/unpackWorker.js.map +1 -0
  74. package/lib/unpackWorkerAsync.d.ts +4 -0
  75. package/lib/unpackWorkerAsync.d.ts.map +1 -0
  76. package/lib/unpackWorkerAsync.js +79 -0
  77. package/lib/unpackWorkerAsync.js.map +1 -0
  78. package/lib/workerAsync.test.d.ts +2 -0
  79. package/lib/workerAsync.test.d.ts.map +1 -0
  80. package/lib/workerAsync.test.js.map +1 -0
  81. package/lib/zipSyncUtils.d.ts +20 -0
  82. package/lib/zipSyncUtils.d.ts.map +1 -0
  83. package/lib/zipSyncUtils.js +9 -0
  84. package/lib/zipSyncUtils.js.map +1 -0
  85. package/lib/zipUtils.d.ts +127 -0
  86. package/lib/zipUtils.d.ts.map +1 -0
  87. package/lib/zipUtils.js +304 -0
  88. package/lib/zipUtils.js.map +1 -0
  89. package/package.json +31 -0
package/CHANGELOG.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@rushstack/zipsync",
3
+ "entries": [
4
+ {
5
+ "version": "0.1.0",
6
+ "tag": "@rushstack/zipsync_v0.1.0",
7
+ "date": "Tue, 30 Sep 2025 20:33:51 GMT",
8
+ "comments": {
9
+ "minor": [
10
+ {
11
+ "comment": "Add zipsync tool to pack and unpack build cache entries."
12
+ }
13
+ ],
14
+ "dependency": [
15
+ {
16
+ "comment": "Updating dependency \"@rushstack/terminal\" to `0.17.0`"
17
+ },
18
+ {
19
+ "comment": "Updating dependency \"@rushstack/ts-command-line\" to `5.0.4`"
20
+ },
21
+ {
22
+ "comment": "Updating dependency \"@rushstack/lookup-by-path\" to `0.8.0`"
23
+ },
24
+ {
25
+ "comment": "Updating dependency \"@rushstack/heft\" to `0.75.0`"
26
+ }
27
+ ]
28
+ }
29
+ }
30
+ ]
31
+ }
package/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ # Change Log - @rushstack/zipsync
2
+
3
+ This log was last generated on Tue, 30 Sep 2025 20:33:51 GMT and should not be manually modified.
4
+
5
+ ## 0.1.0
6
+ Tue, 30 Sep 2025 20:33:51 GMT
7
+
8
+ ### Minor changes
9
+
10
+ - Add zipsync tool to pack and unpack build cache entries.
11
+
package/LICENSE ADDED
@@ -0,0 +1,24 @@
1
+ @rushstack/zipsync
2
+
3
+ Copyright (c) Microsoft Corporation. All rights reserved.
4
+
5
+ MIT License
6
+
7
+ Permission is hereby granted, free of charge, to any person obtaining
8
+ a copy of this software and associated documentation files (the
9
+ "Software"), to deal in the Software without restriction, including
10
+ without limitation the rights to use, copy, modify, merge, publish,
11
+ distribute, sublicense, and/or sell copies of the Software, and to
12
+ permit persons to whom the Software is furnished to do so, subject to
13
+ the following conditions:
14
+
15
+ The above copyright notice and this permission notice shall be
16
+ included in all copies or substantial portions of the Software.
17
+
18
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,48 @@
1
+ # @rushstack/zipsync
2
+
3
+ zipsync is a focused tool for packing and unpacking build cache entries using a constrained subset of the ZIP format for high performance. It optimizes the common scenario where most files already exist in the target location and are unchanged.
4
+
5
+ ## Goals & Rationale
6
+
7
+ - **Optimize partial unpack**: Most builds reuse the majority of previously produced outputs. Skipping rewrites preserves filesystem and page cache state.
8
+ - **Only write when needed**: Fewer syscalls.
9
+ - **Integrated cleanup**: Removes the need for a separate `rm -rf` pass; extra files and empty directories are pruned automatically.
10
+ - **ZIP subset**: Compatibility with malware scanners.
11
+ - **Fast inspection**: The central directory can be enumerated without inflating the entire archive (unlike tar+gzip).
12
+
13
+ ## How It Works
14
+
15
+ ### Pack Flow
16
+
17
+ ```
18
+ for each file F
19
+ write LocalFileHeader(F)
20
+ stream chunks:
21
+ read -> hash + crc + maybe compress -> write
22
+ finalize compressor
23
+ write DataDescriptor(F)
24
+ add metadata entry (same pattern)
25
+ write central directory records
26
+ ```
27
+
28
+ ### Unpack Flow
29
+
30
+ ```
31
+ load archive -> parse central dir -> read metadata
32
+ scan filesystem & delete extraneous entries
33
+ for each entry (except metadata):
34
+ if unchanged (sha1 matches) => skip
35
+ else extract (decompress if needed)
36
+ ```
37
+
38
+ ## Why ZIP (vs tar + gzip)
39
+
40
+ Pros for this scenario:
41
+
42
+ - Central directory enables cheap listing without decompressing entire payload.
43
+ - Widely understood / tooling-friendly (system explorers, scanners, CI tooling).
44
+ - Per-file compression keeps selective unpack simple (no need to inflate all bytes).
45
+
46
+ Trade-offs:
47
+
48
+ - Tar+gzip can exploit cross-file redundancy for better compressed size in datasets with many similar files.
package/bin/zipsync ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ require('../lib/start.js');
@@ -0,0 +1,17 @@
1
+ import { CommandLineParser } from '@rushstack/ts-command-line/lib/providers/CommandLineParser';
2
+ import type { ConsoleTerminalProvider } from '@rushstack/terminal/lib/ConsoleTerminalProvider';
3
+ import type { ITerminal } from '@rushstack/terminal/lib/ITerminal';
4
+ export declare class ZipSyncCommandLineParser extends CommandLineParser {
5
+ private readonly _debugParameter;
6
+ private readonly _verboseParameter;
7
+ private readonly _modeParameter;
8
+ private readonly _archivePathParameter;
9
+ private readonly _baseDirParameter;
10
+ private readonly _targetDirectoriesParameter;
11
+ private readonly _compressionParameter;
12
+ private readonly _terminal;
13
+ private readonly _terminalProvider;
14
+ constructor(terminalProvider: ConsoleTerminalProvider, terminal: ITerminal);
15
+ protected onExecuteAsync(): Promise<void>;
16
+ }
17
+ //# sourceMappingURL=ZipSyncCommandLineParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZipSyncCommandLineParser.d.ts","sourceRoot":"","sources":["../src/ZipSyncCommandLineParser.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4DAA4D,CAAC;AAO/F,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iDAAiD,CAAC;AAC/F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAKnE,qBAAa,wBAAyB,SAAQ,iBAAiB;IAC7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA2B;IAC3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA2B;IAC7D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAoD;IACnF,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAsC;IAC5E,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAsC;IACxE,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAiC;IAC7E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAgE;IACtG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA0B;gBAEzC,gBAAgB,EAAE,uBAAuB,EAAE,QAAQ,EAAE,SAAS;cAgExD,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CA+BzD"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
3
+ // See LICENSE in the project root for license information.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.ZipSyncCommandLineParser = void 0;
6
+ const CommandLineParser_1 = require("@rushstack/ts-command-line/lib/providers/CommandLineParser");
7
+ const index_1 = require("./index");
8
+ class ZipSyncCommandLineParser extends CommandLineParser_1.CommandLineParser {
9
+ constructor(terminalProvider, terminal) {
10
+ super({
11
+ toolFilename: 'zipsync',
12
+ toolDescription: ''
13
+ });
14
+ this._terminal = terminal;
15
+ this._terminalProvider = terminalProvider;
16
+ this._debugParameter = this.defineFlagParameter({
17
+ parameterLongName: '--debug',
18
+ parameterShortName: '-d',
19
+ description: 'Show the full call stack if an error occurs while executing the tool'
20
+ });
21
+ this._verboseParameter = this.defineFlagParameter({
22
+ parameterLongName: '--verbose',
23
+ parameterShortName: '-v',
24
+ description: 'Show verbose output'
25
+ });
26
+ this._modeParameter = this.defineChoiceParameter({
27
+ parameterLongName: '--mode',
28
+ parameterShortName: '-m',
29
+ description: 'The mode of operation: "pack" to create a zip archive, or "unpack" to extract files from a zip archive',
30
+ alternatives: ['pack', 'unpack'],
31
+ required: true
32
+ });
33
+ this._archivePathParameter = this.defineStringParameter({
34
+ parameterLongName: '--archive-path',
35
+ parameterShortName: '-a',
36
+ description: 'Zip file path',
37
+ argumentName: 'ARCHIVE_PATH',
38
+ required: true
39
+ });
40
+ this._targetDirectoriesParameter = this.defineStringListParameter({
41
+ parameterLongName: '--target-directory',
42
+ parameterShortName: '-t',
43
+ description: 'Target directories to pack or unpack',
44
+ argumentName: 'TARGET_DIRECTORIES',
45
+ required: true
46
+ });
47
+ this._baseDirParameter = this.defineStringParameter({
48
+ parameterLongName: '--base-dir',
49
+ parameterShortName: '-b',
50
+ description: 'Base directory for relative paths within the archive',
51
+ argumentName: 'BASE_DIR',
52
+ required: true
53
+ });
54
+ this._compressionParameter = this.defineChoiceParameter({
55
+ parameterLongName: '--compression',
56
+ parameterShortName: '-z',
57
+ description: 'Compression strategy when packing. "deflate" and "zlib" attempts compression for every file (keeps only if smaller); "auto" first skips likely-compressed types before attempting "deflate" compression; "store" disables compression.',
58
+ alternatives: ['store', 'deflate', 'zstd', 'auto'],
59
+ required: true
60
+ });
61
+ }
62
+ async onExecuteAsync() {
63
+ if (this._debugParameter.value) {
64
+ // eslint-disable-next-line no-debugger
65
+ debugger;
66
+ this._terminalProvider.debugEnabled = true;
67
+ this._terminalProvider.verboseEnabled = true;
68
+ }
69
+ if (this._verboseParameter.value) {
70
+ this._terminalProvider.verboseEnabled = true;
71
+ }
72
+ try {
73
+ if (this._modeParameter.value === 'pack') {
74
+ (0, index_1.pack)({
75
+ terminal: this._terminal,
76
+ archivePath: this._archivePathParameter.value,
77
+ targetDirectories: this._targetDirectoriesParameter.values,
78
+ baseDir: this._baseDirParameter.value,
79
+ compression: this._compressionParameter.value
80
+ });
81
+ }
82
+ else if (this._modeParameter.value === 'unpack') {
83
+ (0, index_1.unpack)({
84
+ terminal: this._terminal,
85
+ archivePath: this._archivePathParameter.value,
86
+ targetDirectories: this._targetDirectoriesParameter.values,
87
+ baseDir: this._baseDirParameter.value
88
+ });
89
+ }
90
+ }
91
+ catch (error) {
92
+ this._terminal.writeErrorLine('\n' + error.stack);
93
+ }
94
+ }
95
+ }
96
+ exports.ZipSyncCommandLineParser = ZipSyncCommandLineParser;
97
+ //# sourceMappingURL=ZipSyncCommandLineParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZipSyncCommandLineParser.js","sourceRoot":"","sources":["../src/ZipSyncCommandLineParser.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { CommandLineParser } from '@rushstack/ts-command-line/lib/providers/CommandLineParser';\nimport type {\n CommandLineFlagParameter,\n IRequiredCommandLineStringParameter,\n IRequiredCommandLineChoiceParameter,\n CommandLineStringListParameter\n} from '@rushstack/ts-command-line/lib/index';\nimport type { ConsoleTerminalProvider } from '@rushstack/terminal/lib/ConsoleTerminalProvider';\nimport type { ITerminal } from '@rushstack/terminal/lib/ITerminal';\n\nimport type { IZipSyncMode, ZipSyncOptionCompression } from './zipSyncUtils';\nimport { pack, unpack } from './index';\n\nexport class ZipSyncCommandLineParser extends CommandLineParser {\n private readonly _debugParameter: CommandLineFlagParameter;\n private readonly _verboseParameter: CommandLineFlagParameter;\n private readonly _modeParameter: IRequiredCommandLineChoiceParameter<IZipSyncMode>;\n private readonly _archivePathParameter: IRequiredCommandLineStringParameter;\n private readonly _baseDirParameter: IRequiredCommandLineStringParameter;\n private readonly _targetDirectoriesParameter: CommandLineStringListParameter;\n private readonly _compressionParameter: IRequiredCommandLineChoiceParameter<ZipSyncOptionCompression>;\n private readonly _terminal: ITerminal;\n private readonly _terminalProvider: ConsoleTerminalProvider;\n\n public constructor(terminalProvider: ConsoleTerminalProvider, terminal: ITerminal) {\n super({\n toolFilename: 'zipsync',\n toolDescription: ''\n });\n\n this._terminal = terminal;\n this._terminalProvider = terminalProvider;\n\n this._debugParameter = this.defineFlagParameter({\n parameterLongName: '--debug',\n parameterShortName: '-d',\n description: 'Show the full call stack if an error occurs while executing the tool'\n });\n\n this._verboseParameter = this.defineFlagParameter({\n parameterLongName: '--verbose',\n parameterShortName: '-v',\n description: 'Show verbose output'\n });\n\n this._modeParameter = this.defineChoiceParameter<IZipSyncMode>({\n parameterLongName: '--mode',\n parameterShortName: '-m',\n description:\n 'The mode of operation: \"pack\" to create a zip archive, or \"unpack\" to extract files from a zip archive',\n alternatives: ['pack', 'unpack'],\n required: true\n });\n\n this._archivePathParameter = this.defineStringParameter({\n parameterLongName: '--archive-path',\n parameterShortName: '-a',\n description: 'Zip file path',\n argumentName: 'ARCHIVE_PATH',\n required: true\n });\n\n this._targetDirectoriesParameter = this.defineStringListParameter({\n parameterLongName: '--target-directory',\n parameterShortName: '-t',\n description: 'Target directories to pack or unpack',\n argumentName: 'TARGET_DIRECTORIES',\n required: true\n });\n\n this._baseDirParameter = this.defineStringParameter({\n parameterLongName: '--base-dir',\n parameterShortName: '-b',\n description: 'Base directory for relative paths within the archive',\n argumentName: 'BASE_DIR',\n required: true\n });\n\n this._compressionParameter = this.defineChoiceParameter<ZipSyncOptionCompression>({\n parameterLongName: '--compression',\n parameterShortName: '-z',\n description:\n 'Compression strategy when packing. \"deflate\" and \"zlib\" attempts compression for every file (keeps only if smaller); \"auto\" first skips likely-compressed types before attempting \"deflate\" compression; \"store\" disables compression.',\n alternatives: ['store', 'deflate', 'zstd', 'auto'],\n required: true\n });\n }\n\n protected override async onExecuteAsync(): Promise<void> {\n if (this._debugParameter.value) {\n // eslint-disable-next-line no-debugger\n debugger;\n this._terminalProvider.debugEnabled = true;\n this._terminalProvider.verboseEnabled = true;\n }\n if (this._verboseParameter.value) {\n this._terminalProvider.verboseEnabled = true;\n }\n try {\n if (this._modeParameter.value === 'pack') {\n pack({\n terminal: this._terminal,\n archivePath: this._archivePathParameter.value,\n targetDirectories: this._targetDirectoriesParameter.values,\n baseDir: this._baseDirParameter.value,\n compression: this._compressionParameter.value\n });\n } else if (this._modeParameter.value === 'unpack') {\n unpack({\n terminal: this._terminal,\n archivePath: this._archivePathParameter.value,\n targetDirectories: this._targetDirectoriesParameter.values,\n baseDir: this._baseDirParameter.value\n });\n }\n } catch (error) {\n this._terminal.writeErrorLine('\\n' + error.stack);\n }\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=benchmark.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.test.d.ts","sourceRoot":"","sources":["../src/benchmark.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"benchmark.test.js","sourceRoot":"","sources":["../src/benchmark.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n/* eslint-disable no-console */\n\nimport { execSync } from 'child_process';\nimport { tmpdir, cpus, platform, release, arch, totalmem } from 'os';\nimport * as path from 'path';\nimport * as fs from 'fs';\nimport { createHash, randomUUID } from 'crypto';\n\nimport { NoOpTerminalProvider, Terminal } from '@rushstack/terminal';\n\nimport type { ZipSyncOptionCompression } from './zipSyncUtils';\nimport { pack } from './pack';\nimport { unpack } from './unpack';\n\nconst compressionOptions = ['store', 'deflate', 'zstd', 'auto'] satisfies ZipSyncOptionCompression[];\n\n// create a tempdir and setup dummy files there for benchmarking\nconst NUM_FILES = 1000; // number of files per subdir\nlet tempDir: string;\nconst runId = randomUUID();\nasync function setupDemoDataAsync(): Promise<void> {\n console.log('Setting up demo data for benchmark...');\n tempDir = path.join(tmpdir(), `zipsync-benchmark-${runId}`);\n fs.mkdirSync(tempDir, { recursive: true });\n\n const demoSubDir1 = path.join(tempDir, 'demo-data', 'subdir1');\n fs.mkdirSync(demoSubDir1, { recursive: true });\n const demoSubDir2 = path.join(tempDir, 'demo-data', 'subdir2');\n fs.mkdirSync(demoSubDir2, { recursive: true });\n\n for (let i = 0; i < NUM_FILES; i++) {\n const filePath1 = path.join(demoSubDir1, `file${i}.txt`);\n fs.writeFileSync(filePath1, `This is file ${i} in subdir1\\n`.repeat(1000), { encoding: 'utf-8' });\n const filePath2 = path.join(demoSubDir2, `file${i}.txt`);\n fs.writeFileSync(filePath2, `This is file ${i} in subdir2\\n`.repeat(1000), { encoding: 'utf-8' });\n }\n\n console.log(`Demo data setup complete in ${tempDir}`);\n}\n\nasync function cleanupDemoDataAsync(): Promise<void> {\n if (tempDir && fs.existsSync(tempDir)) {\n fs.rmSync(tempDir, { recursive: true, force: true });\n console.log(`Cleaned up temp directory: ${tempDir}`);\n }\n}\n\nbeforeAll(async () => {\n await setupDemoDataAsync();\n});\n\nafterAll(async () => {\n await cleanupDemoDataAsync();\n});\n\n// Collect timings for table output after all tests\ninterface IMeasurement {\n name: string;\n kind: string;\n phase: 'pack' | 'unpack';\n ms: number;\n // Only for pack phase: archive size in bytes and compression ratio (archiveSize / uncompressedSourceSize)\n sizeBytes?: number;\n}\nconst measurements: IMeasurement[] = [];\n// Allow specifying iterations via env BENCH_ITERATIONS. Defaults to 0 to avoid running the benchmark unless explicitly enabled.\nfunction detectIterations(): number {\n let iter = 0;\n const envParsed: number = parseInt(process.env.BENCH_ITERATIONS || '', 10);\n if (!isNaN(envParsed) && envParsed > 0) {\n iter = envParsed;\n }\n return iter;\n}\nconst ITERATIONS: number = detectIterations();\n\nfunction measureFn(callback: () => void): number {\n const start: number = performance.now();\n callback();\n return performance.now() - start;\n}\n\ninterface IBenchContext {\n archive: string;\n demoDir: string; // source demo data directory\n unpackDir: string;\n}\n\ninterface IBenchCommands {\n // Function that performs the packing. Receives archive path and demoDir.\n pack: (ctx: IBenchContext) => void;\n // Function that performs the unpack. Receives archive and unpackDir.\n unpack: (ctx: IBenchContext) => void;\n archive: string;\n unpackDir: string;\n populateUnpackDir?: 'full' | 'partial';\n cleanBeforeUnpack?: boolean;\n}\n\nfunction bench(kind: string, commands: IBenchCommands): void {\n const demoDataPath = path.join(tempDir, 'demo-data');\n const srcDir = demoDataPath;\n // Compute total uncompressed source size once per bench invocation\n // We intentionally no longer compute total source size for ratio; only archive size is tracked.\n function verifyUnpack(unpackDir: string): void {\n // Compare file listings and hashes\n function buildMap(root: string): Map<string, { size: number; hash: string }> {\n const map = new Map<string, { size: number; hash: string }>();\n function walk(current: string): void {\n for (const entry of fs.readdirSync(current, { withFileTypes: true })) {\n const full = path.join(current, entry.name);\n if (entry.isDirectory()) {\n walk(full);\n } else if (entry.isFile()) {\n const rel = path.relative(root, full).replace(/\\\\/g, '/');\n const buf = fs.readFileSync(full);\n const hash = createHash('sha256').update(buf).digest('hex');\n map.set(rel, { size: buf.length, hash });\n }\n }\n }\n walk(root);\n return map;\n }\n const srcMap = buildMap(srcDir);\n const dstMap = buildMap(unpackDir);\n if (srcMap.size !== dstMap.size) {\n throw new Error(\n `Verification failed (${kind}): file count mismatch src=${srcMap.size} dst=${dstMap.size}`\n );\n }\n for (const [rel, meta] of srcMap) {\n const other = dstMap.get(rel);\n if (!other) throw new Error(`Verification failed (${kind}): missing file ${rel}`);\n if (other.size !== meta.size || other.hash !== meta.hash) {\n throw new Error(`Verification failed (${kind}): content mismatch in ${rel}`);\n }\n }\n }\n for (let i = 0; i < ITERATIONS; i++) {\n // Ensure previous artifacts removed\n if (fs.existsSync(commands.archive)) fs.rmSync(commands.archive, { force: true });\n if (commands.populateUnpackDir === 'full') {\n fs.cpSync(srcDir, commands.unpackDir, { recursive: true });\n } else if (commands.populateUnpackDir === 'partial') {\n // Copy half the files\n for (let j = 0; j < NUM_FILES / 2; j++) {\n const file1 = path.join(srcDir, 'subdir1', `file${j}.txt`);\n const file2 = path.join(srcDir, 'subdir2', `file${j}.txt`);\n const dest1 = path.join(commands.unpackDir, 'subdir1', `file${j}.txt`);\n const dest2 = path.join(commands.unpackDir, 'subdir2', `file${j}.txt`);\n fs.mkdirSync(path.dirname(dest1), { recursive: true });\n fs.mkdirSync(path.dirname(dest2), { recursive: true });\n fs.copyFileSync(file1, dest1);\n fs.copyFileSync(file2, dest2);\n }\n }\n\n let archiveSize: number | undefined;\n const packMs: number = measureFn(() => {\n commands.pack({ archive: commands.archive, demoDir: demoDataPath, unpackDir: commands.unpackDir });\n try {\n const stat = fs.statSync(commands.archive);\n archiveSize = stat.size;\n } catch {\n // ignore if archive not found\n }\n });\n measurements.push({\n name: `${kind}#${i + 1}`,\n kind,\n phase: 'pack',\n ms: packMs,\n sizeBytes: archiveSize\n });\n\n const unpackMs: number = measureFn(() => {\n if (commands.cleanBeforeUnpack) {\n fs.rmSync(commands.unpackDir, { recursive: true, force: true });\n fs.mkdirSync(commands.unpackDir, { recursive: true });\n }\n commands.unpack({ archive: commands.archive, demoDir: demoDataPath, unpackDir: commands.unpackDir });\n });\n measurements.push({ name: `${kind}#${i + 1}`, kind, phase: 'unpack', ms: unpackMs });\n verifyUnpack(commands.unpackDir);\n }\n}\n\nfunction benchZipSyncScenario(\n kind: string,\n compression: ZipSyncOptionCompression,\n existingFiles: 'all' | 'none' | 'partial'\n): void {\n if (!tempDir) throw new Error('Temp directory is not set up.');\n const terminal = new Terminal(new NoOpTerminalProvider());\n bench(kind, {\n pack: ({ archive, demoDir }) => {\n const { filesPacked } = pack({\n archivePath: archive,\n targetDirectories: ['subdir1', 'subdir2'],\n baseDir: demoDir,\n compression,\n terminal\n });\n console.log(`Files packed: ${filesPacked}`);\n },\n unpack: ({ archive, unpackDir }) => {\n const { filesDeleted, filesExtracted, filesSkipped, foldersDeleted, otherEntriesDeleted } = unpack({\n archivePath: archive,\n targetDirectories: ['subdir1', 'subdir2'],\n baseDir: unpackDir,\n terminal\n });\n console.log(\n `Files extracted: ${filesExtracted}, files skipped: ${filesSkipped}, files deleted: ${filesDeleted}, folders deleted: ${foldersDeleted}, other entries deleted: ${otherEntriesDeleted}`\n );\n },\n archive: path.join(tempDir, `archive-zipsync-${compression}.zip`),\n unpackDir: path.join(tempDir, `unpacked-zipsync-${compression}-${existingFiles}`),\n populateUnpackDir: existingFiles === 'all' ? 'full' : existingFiles === 'partial' ? 'partial' : undefined,\n cleanBeforeUnpack: false // cleaning is handled internally by zipsync\n });\n}\n\n// the benchmarks are skipped by default because they require external tools (tar, zip) to be installed\ndescribe(`archive benchmarks (iterations=${ITERATIONS})`, () => {\n it('tar', () => {\n if (!isTarAvailable()) {\n console.log('Skipping tar test because tar is not available');\n return;\n }\n if (!tempDir) throw new Error('Temp directory is not set up.');\n bench('tar', {\n pack: ({ archive, demoDir }) => execSync(`tar -cf \"${archive}\" -C \"${demoDir}\" .`),\n unpack: ({ archive, unpackDir }) => execSync(`tar -xf \"${archive}\" -C \"${unpackDir}\"`),\n archive: path.join(tempDir, 'archive.tar'),\n unpackDir: path.join(tempDir, 'unpacked-tar'),\n populateUnpackDir: 'full',\n cleanBeforeUnpack: true\n });\n });\n it('tar-gz', () => {\n if (!isTarAvailable()) {\n console.log('Skipping tar test because tar is not available');\n return;\n }\n if (!tempDir) throw new Error('Temp directory is not set up.');\n bench('tar-gz', {\n pack: ({ archive, demoDir }) => execSync(`tar -czf \"${archive}\" -C \"${demoDir}\" .`),\n unpack: ({ archive, unpackDir }) => execSync(`tar -xzf \"${archive}\" -C \"${unpackDir}\"`),\n archive: path.join(tempDir, 'archive.tar.gz'),\n unpackDir: path.join(tempDir, 'unpacked-tar-gz'),\n populateUnpackDir: 'full',\n cleanBeforeUnpack: true\n });\n });\n it('zip-store', () => {\n if (!isZipAvailable()) {\n console.log('Skipping zip test because zip is not available');\n return;\n }\n if (!tempDir) throw new Error('Temp directory is not set up.');\n bench('zip-store', {\n pack: ({ archive, demoDir }) => execSync(`zip -r -Z store \"${archive}\" .`, { cwd: demoDir }),\n unpack: ({ archive, unpackDir }) => execSync(`unzip \"${archive}\" -d \"${unpackDir}\"`),\n archive: path.join(tempDir, 'archive.zip'),\n unpackDir: path.join(tempDir, 'unpacked-zip'),\n populateUnpackDir: 'full',\n cleanBeforeUnpack: true\n });\n });\n it('zip-deflate', () => {\n if (!isZipAvailable()) {\n console.log('Skipping zip test because zip is not available');\n return;\n }\n if (!tempDir) throw new Error('Temp directory is not set up.');\n bench('zip-deflate', {\n pack: ({ archive, demoDir }) => execSync(`zip -r -Z deflate -9 \"${archive}\" .`, { cwd: demoDir }),\n unpack: ({ archive, unpackDir }) => execSync(`unzip \"${archive}\" -d \"${unpackDir}\"`),\n archive: path.join(tempDir, 'archive-deflate.zip'),\n unpackDir: path.join(tempDir, 'unpacked-zip-deflate'),\n populateUnpackDir: 'full',\n cleanBeforeUnpack: true\n });\n });\n const existingFileOptions: ['all', 'none', 'partial'] = ['all', 'none', 'partial'];\n compressionOptions.forEach((compression) => {\n if (compression === 'zstd') {\n const [major, minor] = process.versions.node.split('.').map((x) => parseInt(x, 10));\n if (major < 22 || (major === 22 && minor < 15)) {\n console.warn(`Skipping zstd test on Node ${process.versions.node}`);\n return;\n }\n }\n existingFileOptions.forEach((existingFiles) => {\n it(`zipsync-${compression}-${existingFiles}-existing`, () => {\n benchZipSyncScenario(`zipsync-${compression}-${existingFiles}-existing`, compression, existingFiles);\n });\n });\n });\n});\n\nafterAll(() => {\n if (!measurements.length) return;\n interface IStats {\n kind: string;\n phase: string;\n n: number;\n min: number;\n max: number;\n mean: number;\n p95: number;\n std: number;\n sizeMean?: number; // only for pack\n }\n const groups: Map<string, { times: number[]; sizes: number[] }> = new Map();\n for (const m of measurements) {\n const key: string = `${m.kind}|${m.phase}`;\n let bucket = groups.get(key);\n if (!bucket) {\n bucket = { times: [], sizes: [] };\n groups.set(key, bucket);\n }\n bucket.times.push(m.ms);\n if (typeof m.sizeBytes === 'number') bucket.sizes.push(m.sizeBytes);\n }\n const stats: IStats[] = [];\n function percentile(sorted: number[], p: number): number {\n if (!sorted.length) return 0;\n const idx: number = Math.min(sorted.length - 1, Math.ceil((p / 100) * sorted.length) - 1);\n return sorted[idx];\n }\n for (const [key, bucket] of groups) {\n const [kind, phase] = key.split('|');\n bucket.times.sort((a, b) => a - b);\n const arr = bucket.times;\n const n = arr.length;\n const min = arr[0];\n const max = arr[n - 1];\n const sum = arr.reduce((a, b) => a + b, 0);\n const mean = sum / n;\n const variance = arr.reduce((a, b) => a + (b - mean) * (b - mean), 0) / n;\n const std = Math.sqrt(variance);\n const p95 = percentile(arr, 95);\n const sizeMean = bucket.sizes.length\n ? bucket.sizes.reduce((a, b) => a + b, 0) / bucket.sizes.length\n : undefined;\n stats.push({ kind, phase, n, min, max, mean, std, p95, sizeMean });\n }\n // Organize into groups\n const groupsDef: Array<{ title: string; baseline: string; members: string[] }> = [\n {\n title: 'Compressed (baseline: tar-gz)',\n baseline: 'tar-gz',\n members: [\n 'tar-gz',\n 'zip-deflate',\n 'zipsync-zstd-all-existing',\n 'zipsync-zstd-none-existing',\n 'zipsync-zstd-partial-existing',\n 'zipsync-deflate-all-existing',\n 'zipsync-deflate-none-existing',\n 'zipsync-deflate-partial-existing',\n 'zipsync-auto-all-existing',\n 'zipsync-auto-none-existing',\n 'zipsync-auto-partial-existing'\n ]\n },\n {\n title: 'Uncompressed (baseline: tar)',\n baseline: 'tar',\n members: [\n 'tar',\n 'zip-store',\n 'zipsync-store-all-existing',\n 'zipsync-store-none-existing',\n 'zipsync-store-partial-existing'\n ]\n }\n ];\n // Build per-group markdown tables (no Group column) for each phase\n function buildGroupTable(\n group: { title: string; baseline: string; members: string[] },\n phase: 'pack' | 'unpack'\n ): string[] {\n // Human readable bytes formatter\n function formatBytes(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB'];\n let value = bytes;\n let i = 0;\n while (value >= 1024 && i < units.length - 1) {\n value /= 1024;\n i++;\n }\n const formatted = value >= 100 ? value.toFixed(0) : value >= 10 ? value.toFixed(1) : value.toFixed(2);\n return `${formatted} ${units[i]}`;\n }\n const headers =\n phase === 'pack'\n ? ['Archive', 'min (ms)', 'mean (ms)', 'p95 (ms)', 'max (ms)', 'std (ms)', 'speed (x)', 'size']\n : ['Archive', 'min (ms)', 'mean (ms)', 'p95 (ms)', 'max (ms)', 'std (ms)', 'speed (x)'];\n const lines: string[] = [];\n lines.push('| ' + headers.join(' | ') + ' |');\n const align: string[] = headers.map((header, idx) => (idx === 0 ? '---' : '---:'));\n lines.push('| ' + align.join(' | ') + ' |');\n const baselineStats: IStats | undefined = stats.find(\n (s) => s.kind === group.baseline && s.phase === phase\n );\n for (const member of group.members) {\n const s: IStats | undefined = stats.find((st) => st.kind === member && st.phase === phase);\n if (!s) continue;\n const isBaseline: boolean = member === group.baseline;\n const speedFactor: number = baselineStats ? baselineStats.mean / s.mean : 1;\n const cols: string[] = [\n (isBaseline ? '**' : '') + s.kind + (isBaseline ? '**' : ''),\n s.min.toFixed(2),\n s.mean.toFixed(2),\n s.p95.toFixed(2),\n s.max.toFixed(2),\n s.std.toFixed(2),\n speedFactor.toFixed(2) + 'x'\n ];\n if (phase === 'pack') {\n cols.push(s.sizeMean !== undefined ? formatBytes(Math.round(s.sizeMean)) : '');\n }\n lines.push('| ' + cols.join(' | ') + ' |');\n }\n return lines;\n }\n const outputLines: string[] = [];\n outputLines.push('# Benchmark Results');\n outputLines.push('');\n outputLines.push(\n `\nThis document contains performance measurements for packing and unpacking a synthetic dataset using tar, zip, and zipsync.\n\nThe dataset consists of two directory trees (subdir1, subdir2) populated with ${NUM_FILES} text files each.\n\nzipsync scenarios\n* \"all-existing\": unpack directory is fully populated with existing files\n* \"none-existing\": unpack directory is empty\n* \"partial-existing\": unpack directory contains half of the files\n\nzip and tar scenarios clean the unpack directory before unpacking. This time is included in the measurements because\nzipsync internally handles cleaning as part of its operation.\n`\n );\n outputLines.push('');\n // System info\n try {\n const cpuList = cpus();\n const cpuModelRaw: string | undefined = cpuList[0]?.model;\n const cpuModel: string = cpuModelRaw ? cpuModelRaw.replace(/\\|/g, ' ').trim() : 'unknown';\n const logicalCores: number = cpuList.length || 0;\n const memGB: string = (totalmem() / 1024 ** 3).toFixed(1);\n outputLines.push('**System**');\n outputLines.push('');\n outputLines.push('| OS | Arch | Node | CPU | Logical Cores | Memory |');\n outputLines.push('| --- | --- | --- | --- | ---: | --- |');\n outputLines.push(\n `| ${platform()} ${release()} | ${arch()} | ${process.version} | ${cpuModel} | ${logicalCores} | ${memGB} GB |`\n );\n outputLines.push('');\n } catch {\n // ignore system info errors\n }\n outputLines.push(`Iterations: ${ITERATIONS}`);\n outputLines.push('');\n for (const g of groupsDef) {\n outputLines.push(`## ${g.title}`);\n outputLines.push('');\n outputLines.push('### Unpack Phase');\n outputLines.push('');\n outputLines.push(...buildGroupTable(g, 'unpack'));\n outputLines.push('');\n outputLines.push('### Pack Phase');\n outputLines.push('');\n outputLines.push(...buildGroupTable(g, 'pack'));\n outputLines.push('');\n }\n const resultText = outputLines.join('\\n');\n console.log(resultText);\n try {\n const resultFile = path.join(__dirname, '..', 'temp', `benchmark-results.md`);\n fs.writeFileSync(resultFile, resultText, { encoding: 'utf-8' });\n console.log(`Benchmark results written to: ${resultFile}`);\n } catch (e) {\n console.warn('Failed to write benchmark results file:', (e as Error).message);\n }\n});\nfunction isZipAvailable(): boolean {\n try {\n const checkZip = process.platform === 'win32' ? 'where zip' : 'command -v zip';\n const checkUnzip = process.platform === 'win32' ? 'where unzip' : 'command -v unzip';\n execSync(checkZip, { stdio: 'ignore' });\n execSync(checkUnzip, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\nfunction isTarAvailable(): boolean {\n try {\n const checkTar = process.platform === 'win32' ? 'where tar' : 'command -v tar';\n execSync(checkTar, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n"]}
@@ -0,0 +1,8 @@
1
+ type OutputChunkHandler = (chunk: Uint8Array, lengthBytes: number) => void;
2
+ export type IIncrementalZlib = Disposable & {
3
+ update: (inputBuffer: Uint8Array) => void;
4
+ };
5
+ export type IncrementalZlibMode = 'deflate' | 'inflate' | 'zstd-compress' | 'zstd-decompress';
6
+ export declare function createIncrementalZlib(outputBuffer: Uint8Array, handleOutputChunk: OutputChunkHandler, mode: IncrementalZlibMode): IIncrementalZlib;
7
+ export {};
8
+ //# sourceMappingURL=compress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compress.d.ts","sourceRoot":"","sources":["../src/compress.ts"],"names":[],"mappings":"AAMA,KAAK,kBAAkB,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;AA4E3E,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG;IAC1C,MAAM,EAAE,CAAC,WAAW,EAAE,UAAU,KAAK,IAAI,CAAC;CAC3C,CAAC;AAQF,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,SAAS,GAAG,eAAe,GAAG,iBAAiB,CAAC;AAE9F,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,UAAU,EACxB,iBAAiB,EAAE,kBAAkB,EACrC,IAAI,EAAE,mBAAmB,GACxB,gBAAgB,CAmHlB"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
3
+ // See LICENSE in the project root for license information.
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.createIncrementalZlib = createIncrementalZlib;
9
+ const node_zlib_1 = __importDefault(require("node:zlib"));
10
+ const kError = (() => {
11
+ // Create an instance of Deflate so that we can get our hands on the internal error symbol
12
+ // It isn't exported.
13
+ const reference = node_zlib_1.default.createDeflateRaw();
14
+ const kErrorResult = Object.getOwnPropertySymbols(reference).find((x) => x.toString().includes('kError'));
15
+ if (kErrorResult === undefined) {
16
+ throw new Error('Unable to find the internal error symbol in node:zlib');
17
+ }
18
+ reference.close();
19
+ return kErrorResult;
20
+ // Casting `symbol` to the exact symbol of this definition
21
+ })();
22
+ function createIncrementalZlib(outputBuffer, handleOutputChunk, mode) {
23
+ // The zlib constructors all allocate a buffer of size chunkSize using Buffer.allocUnsafe
24
+ // We want to ensure that that invocation doesn't allocate a buffer.
25
+ // Unfortunately the minimum value of `chunkSize` to the constructor is non-zero
26
+ let compressor;
27
+ const savedAllocUnsafe = Buffer.allocUnsafe;
28
+ try {
29
+ //@ts-expect-error
30
+ Buffer.allocUnsafe = () => outputBuffer;
31
+ switch (mode) {
32
+ case 'inflate':
33
+ compressor = node_zlib_1.default.createInflateRaw({
34
+ chunkSize: outputBuffer.byteLength
35
+ });
36
+ break;
37
+ case 'deflate':
38
+ compressor = node_zlib_1.default.createDeflateRaw({
39
+ chunkSize: outputBuffer.byteLength,
40
+ level: node_zlib_1.default.constants.Z_BEST_COMPRESSION
41
+ });
42
+ break;
43
+ case 'zstd-compress':
44
+ // available in Node 22.15+
45
+ compressor = node_zlib_1.default.createZstdCompress({
46
+ chunkSize: outputBuffer.byteLength
47
+ });
48
+ break;
49
+ case 'zstd-decompress':
50
+ // available in Node 22.15+
51
+ compressor = node_zlib_1.default.createZstdDecompress({
52
+ chunkSize: outputBuffer.byteLength
53
+ });
54
+ break;
55
+ default:
56
+ // Unsupported mode (types currently restrict to 'deflate' | 'inflate')
57
+ break;
58
+ }
59
+ }
60
+ finally {
61
+ Buffer.allocUnsafe = savedAllocUnsafe;
62
+ }
63
+ if (!compressor) {
64
+ throw new Error('Failed to create zlib instance');
65
+ }
66
+ const handle = compressor._handle;
67
+ return {
68
+ [Symbol.dispose]: () => {
69
+ if (compressor._handle) {
70
+ compressor._handle.close();
71
+ compressor._handle = undefined;
72
+ }
73
+ },
74
+ update: function processInputChunk(inputBuffer) {
75
+ let error;
76
+ // Directive to the compressor on reaching the end of the current input buffer
77
+ // Default value is to expect more data
78
+ let flushFlag = compressor._defaultFlushFlag;
79
+ let bytesInInputBuffer = inputBuffer.byteLength;
80
+ if (bytesInInputBuffer <= 0) {
81
+ // Ensure the value is non-negative
82
+ // We will call the compressor one last time with 0 bytes of input
83
+ bytesInInputBuffer = 0;
84
+ // Tell the compressor to flush anything in its internal buffer and write any needed trailer.
85
+ flushFlag = compressor._finishFlushFlag;
86
+ }
87
+ let availInBefore = bytesInInputBuffer;
88
+ let inOff = 0;
89
+ let availOutAfter = 0;
90
+ let availInAfter;
91
+ const state = compressor._writeState;
92
+ do {
93
+ handle.writeSync(flushFlag, inputBuffer, // in
94
+ inOff, // in_off
95
+ availInBefore, // in_len
96
+ outputBuffer, // out
97
+ 0, // out_off
98
+ outputBuffer.byteLength // out_len
99
+ );
100
+ if (error) {
101
+ throw error;
102
+ }
103
+ else if (compressor[kError]) {
104
+ throw compressor[kError];
105
+ }
106
+ availOutAfter = state[0];
107
+ availInAfter = state[1];
108
+ const inDelta = availInBefore - availInAfter;
109
+ const have = outputBuffer.byteLength - availOutAfter;
110
+ if (have > 0) {
111
+ handleOutputChunk(outputBuffer, have);
112
+ }
113
+ // These values get reset if we have new data,
114
+ // so we can update them even if we're done
115
+ inOff += inDelta;
116
+ availInBefore = availInAfter;
117
+ } while (availOutAfter === 0);
118
+ }
119
+ };
120
+ }
121
+ //# sourceMappingURL=compress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compress.js","sourceRoot":"","sources":["../src/compress.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport type { Transform } from 'node:stream';\nimport zlib from 'node:zlib';\n\ntype OutputChunkHandler = (chunk: Uint8Array, lengthBytes: number) => void;\n\nconst kError: unique symbol = (() => {\n // Create an instance of Deflate so that we can get our hands on the internal error symbol\n // It isn't exported.\n const reference: zlib.Deflate = zlib.createDeflateRaw();\n const kErrorResult: symbol | undefined = Object.getOwnPropertySymbols(reference).find((x) =>\n x.toString().includes('kError')\n );\n if (kErrorResult === undefined) {\n throw new Error('Unable to find the internal error symbol in node:zlib');\n }\n reference.close();\n return kErrorResult;\n // Casting `symbol` to the exact symbol of this definition\n})() as typeof kError;\n\n/**\n * Internal members of all Zlib compressors.\n * Needed to\n */\ninterface IZlibInternals {\n /**\n * The native binding to Zlib.\n */\n _handle: IHandle | undefined;\n /**\n * The flush flag passed to each call other than the last one for this implementation.\n * Varies by compressor.\n */\n _defaultFlushFlag: number;\n /**\n * The flush flag passed to the final call for this implementation.\n * Varies by compressor.\n */\n _finishFlushFlag: number;\n /**\n * The number of bytes read from the input and written to the output.\n */\n _writeState: [number, number];\n /**\n * The internal error state\n */\n [kError]: Error | undefined;\n}\n\ntype Compressor = Transform & IZlibInternals;\n\ninterface IHandle {\n /**\n * Closes the handle and releases resources.\n * Ensure that this is always invoked.\n */\n close(): void;\n /**\n * Compresses up to `inLen` bytes from `chunk` starting at `inOff`.\n * Writes up to `outLen` bytes to `output` starting at `outOff`.\n * @param flushFlag - The flush flag to the compressor implementation. Defines the behavior when reaching the end of the input.\n * @param chunk - The buffer containing the data to be compressed\n * @param inOff - The offset in bytes to start reading from `chunk`\n * @param inLen - The maximum number of bytes to read from `chunk`\n * @param output - The buffer to write the compressed data to\n * @param outOff - The offset in bytes to start writing to `output` at\n * @param outLen - The maximum number of bytes to write to `output`.\n */\n writeSync(\n flushFlag: number,\n chunk: Uint8Array,\n inOff: number,\n inLen: number,\n output: Uint8Array,\n outOff: number,\n outLen: number\n ): void;\n}\n\nexport type IIncrementalZlib = Disposable & {\n update: (inputBuffer: Uint8Array) => void;\n};\n\n// zstd is available in Node 22+\ntype IExtendedZlib = typeof zlib & {\n createZstdCompress: (options?: zlib.ZlibOptions) => Transform;\n createZstdDecompress: (options?: zlib.ZlibOptions) => Transform;\n};\n\nexport type IncrementalZlibMode = 'deflate' | 'inflate' | 'zstd-compress' | 'zstd-decompress';\n\nexport function createIncrementalZlib(\n outputBuffer: Uint8Array,\n handleOutputChunk: OutputChunkHandler,\n mode: IncrementalZlibMode\n): IIncrementalZlib {\n // The zlib constructors all allocate a buffer of size chunkSize using Buffer.allocUnsafe\n // We want to ensure that that invocation doesn't allocate a buffer.\n // Unfortunately the minimum value of `chunkSize` to the constructor is non-zero\n\n let compressor: Compressor | undefined;\n\n const savedAllocUnsafe: typeof Buffer.allocUnsafe = Buffer.allocUnsafe;\n\n try {\n //@ts-expect-error\n Buffer.allocUnsafe = () => outputBuffer;\n switch (mode) {\n case 'inflate':\n compressor = zlib.createInflateRaw({\n chunkSize: outputBuffer.byteLength\n }) as unknown as Transform & IZlibInternals;\n break;\n case 'deflate':\n compressor = zlib.createDeflateRaw({\n chunkSize: outputBuffer.byteLength,\n level: zlib.constants.Z_BEST_COMPRESSION\n }) as unknown as Transform & IZlibInternals;\n break;\n case 'zstd-compress':\n // available in Node 22.15+\n compressor = (zlib as IExtendedZlib).createZstdCompress({\n chunkSize: outputBuffer.byteLength\n }) as unknown as Transform & IZlibInternals;\n break;\n case 'zstd-decompress':\n // available in Node 22.15+\n compressor = (zlib as IExtendedZlib).createZstdDecompress({\n chunkSize: outputBuffer.byteLength\n }) as unknown as Transform & IZlibInternals;\n break;\n default:\n // Unsupported mode (types currently restrict to 'deflate' | 'inflate')\n break;\n }\n } finally {\n Buffer.allocUnsafe = savedAllocUnsafe;\n }\n\n if (!compressor) {\n throw new Error('Failed to create zlib instance');\n }\n\n const handle: IHandle = compressor._handle!;\n\n return {\n [Symbol.dispose]: () => {\n if (compressor._handle) {\n compressor._handle.close();\n compressor._handle = undefined;\n }\n },\n update: function processInputChunk(inputBuffer: Uint8Array): void {\n let error: Error | undefined;\n\n // Directive to the compressor on reaching the end of the current input buffer\n // Default value is to expect more data\n let flushFlag: number = compressor._defaultFlushFlag;\n\n let bytesInInputBuffer: number = inputBuffer.byteLength;\n\n if (bytesInInputBuffer <= 0) {\n // Ensure the value is non-negative\n // We will call the compressor one last time with 0 bytes of input\n bytesInInputBuffer = 0;\n // Tell the compressor to flush anything in its internal buffer and write any needed trailer.\n flushFlag = compressor._finishFlushFlag;\n }\n\n let availInBefore: number = bytesInInputBuffer;\n let inOff: number = 0;\n let availOutAfter: number = 0;\n let availInAfter: number | undefined;\n\n const state: [number, number] = compressor._writeState;\n\n do {\n handle.writeSync(\n flushFlag,\n inputBuffer, // in\n inOff, // in_off\n availInBefore, // in_len\n outputBuffer, // out\n 0, // out_off\n outputBuffer.byteLength // out_len\n );\n\n if (error) {\n throw error;\n } else if (compressor[kError]) {\n throw compressor[kError];\n }\n\n availOutAfter = state[0];\n availInAfter = state[1];\n\n const inDelta: number = availInBefore - availInAfter;\n\n const have: number = outputBuffer.byteLength - availOutAfter;\n if (have > 0) {\n handleOutputChunk(outputBuffer, have);\n }\n\n // These values get reset if we have new data,\n // so we can update them even if we're done\n inOff += inDelta;\n availInBefore = availInAfter;\n } while (availOutAfter === 0);\n }\n };\n}\n"]}
package/lib/crc32.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export declare function fallbackCrc32(data: Buffer<ArrayBufferLike>, value?: number): number;
2
+ export declare const crc32Builder: (data: Buffer<ArrayBufferLike>, value?: number) => number;
3
+ //# sourceMappingURL=crc32.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crc32.d.ts","sourceRoot":"","sources":["../src/crc32.ts"],"names":[],"mappings":"AAwBA,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,eAAe,CAAC,EAAE,KAAK,GAAE,MAAU,GAAG,MAAM,CAWtF;AAED,eAAO,MAAM,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MACjD,CAAC"}
package/lib/crc32.js ADDED
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
3
+ // See LICENSE in the project root for license information.
4
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
+ if (k2 === undefined) k2 = k;
6
+ var desc = Object.getOwnPropertyDescriptor(m, k);
7
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
+ desc = { enumerable: true, get: function() { return m[k]; } };
9
+ }
10
+ Object.defineProperty(o, k2, desc);
11
+ }) : (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ o[k2] = m[k];
14
+ }));
15
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
16
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
17
+ }) : function(o, v) {
18
+ o["default"] = v;
19
+ });
20
+ var __importStar = (this && this.__importStar) || (function () {
21
+ var ownKeys = function(o) {
22
+ ownKeys = Object.getOwnPropertyNames || function (o) {
23
+ var ar = [];
24
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
25
+ return ar;
26
+ };
27
+ return ownKeys(o);
28
+ };
29
+ return function (mod) {
30
+ if (mod && mod.__esModule) return mod;
31
+ var result = {};
32
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
33
+ __setModuleDefault(result, mod);
34
+ return result;
35
+ };
36
+ })();
37
+ var _a;
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.crc32Builder = void 0;
40
+ exports.fallbackCrc32 = fallbackCrc32;
41
+ const zlib = __importStar(require("node:zlib"));
42
+ let crcTable;
43
+ function initCrcTable() {
44
+ if (crcTable) {
45
+ return crcTable;
46
+ }
47
+ crcTable = new Uint32Array(256);
48
+ for (let i = 0; i < 256; i++) {
49
+ let crcEntry = i;
50
+ for (let j = 0; j < 8; j++) {
51
+ // eslint-disable-next-line no-bitwise
52
+ crcEntry = crcEntry & 1 ? 0xedb88320 ^ (crcEntry >>> 1) : crcEntry >>> 1;
53
+ }
54
+ crcTable[i] = crcEntry;
55
+ }
56
+ return crcTable;
57
+ }
58
+ function fallbackCrc32(data, value = 0) {
59
+ const table = initCrcTable();
60
+ value = (value ^ 0xffffffff) >>> 0;
61
+ for (let i = 0; i < data.length; i++) {
62
+ // eslint-disable-next-line no-bitwise
63
+ value = table[(value ^ data[i]) & 0xff] ^ (value >>> 8);
64
+ }
65
+ value = (value ^ 0xffffffff) >>> 0;
66
+ return value;
67
+ }
68
+ exports.crc32Builder = (_a = zlib.crc32) !== null && _a !== void 0 ? _a : fallbackCrc32;
69
+ //# sourceMappingURL=crc32.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crc32.js","sourceRoot":"","sources":["../src/crc32.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuB3D,sCAWC;AAhCD,gDAAkC;AAElC,IAAI,QAAiC,CAAC;AAEtC,SAAS,YAAY;IACnB,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,QAAQ,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;IAChC,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,QAAQ,GAAW,CAAC,CAAC;QACzB,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,sCAAsC;YACtC,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC;QAC3E,CAAC;QACD,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;IACzB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAgB,aAAa,CAAC,IAA6B,EAAE,QAAgB,CAAC;IAC5E,MAAM,KAAK,GAAgB,YAAY,EAAE,CAAC;IAC1C,KAAK,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAEnC,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,sCAAsC;QACtC,KAAK,GAAG,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,KAAK,CAAC;AACf,CAAC;AAEY,QAAA,YAAY,GACvB,MAAA,IAAI,CAAC,KAAK,mCAAI,aAAa,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport * as zlib from 'node:zlib';\n\nlet crcTable: Uint32Array | undefined;\n\nfunction initCrcTable(): Uint32Array {\n if (crcTable) {\n return crcTable;\n }\n\n crcTable = new Uint32Array(256);\n for (let i: number = 0; i < 256; i++) {\n let crcEntry: number = i;\n for (let j: number = 0; j < 8; j++) {\n // eslint-disable-next-line no-bitwise\n crcEntry = crcEntry & 1 ? 0xedb88320 ^ (crcEntry >>> 1) : crcEntry >>> 1;\n }\n crcTable[i] = crcEntry;\n }\n return crcTable;\n}\n\nexport function fallbackCrc32(data: Buffer<ArrayBufferLike>, value: number = 0): number {\n const table: Uint32Array = initCrcTable();\n value = (value ^ 0xffffffff) >>> 0;\n\n for (let i: number = 0; i < data.length; i++) {\n // eslint-disable-next-line no-bitwise\n value = table[(value ^ data[i]) & 0xff] ^ (value >>> 8);\n }\n\n value = (value ^ 0xffffffff) >>> 0;\n return value;\n}\n\nexport const crc32Builder: (data: Buffer<ArrayBufferLike>, value?: number) => number =\n zlib.crc32 ?? fallbackCrc32;\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=crc32.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crc32.test.d.ts","sourceRoot":"","sources":["../src/crc32.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crc32.test.js","sourceRoot":"","sources":["../src/crc32.test.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE3D,2CAA6B;AAE7B,mCAAwC;AAExC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,sCAAsC;YACtC,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;YACzF,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG;YACf,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC;YACnC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,eAAe;YAChC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,CAAC;QAEF,IAAI,WAAW,GAAW,CAAC,CAAC;QAC5B,IAAI,OAAO,GAAW,CAAC,CAAC;QAExB,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,WAAW,GAAG,IAAA,qBAAa,EAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC/C,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtC,CAAC;QAED,WAAW,GAAG,WAAW,KAAK,CAAC,CAAC;QAChC,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC;QAExB,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport * as zlib from 'zlib';\n\nimport { fallbackCrc32 } from './crc32';\n\ndescribe('crc32', () => {\n it('fallbackCrc32 should match zlib.crc32', () => {\n if (!zlib.crc32) {\n // eslint-disable-next-line no-console\n console.log('Skipping test because zlib.crc32 is not available in this Node.js version');\n return;\n }\n\n const testData = [\n Buffer.from('hello world', 'utf-8'),\n Buffer.alloc(0), // empty buffer\n Buffer.from('hello crc32', 'utf-8'),\n Buffer.from([-1, 2, 3, 4, 5, 255, 0, 128])\n ];\n\n let fallbackCrc: number = 0;\n let zlibCrc: number = 0;\n\n for (const data of testData) {\n fallbackCrc = fallbackCrc32(data, fallbackCrc);\n zlibCrc = zlib.crc32(data, zlibCrc);\n }\n\n fallbackCrc = fallbackCrc >>> 0;\n zlibCrc = zlibCrc >>> 0;\n\n expect(fallbackCrc).toBe(zlibCrc);\n });\n});\n"]}