neozipkit 0.2.1 → 0.3.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 (301) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +410 -186
  3. package/contracts/ABI.txt +889 -0
  4. package/contracts/Bytecode.txt +1 -0
  5. package/contracts/COMPILATION_NOTES.md +59 -0
  6. package/contracts/QUICK_DEPLOY.md +286 -0
  7. package/contracts/README.md +235 -131
  8. package/contracts/VERIFICATION.md +308 -0
  9. package/contracts/deploy-interactive.js +448 -0
  10. package/contracts/deployment-arbitrum-sepolia.json +12 -0
  11. package/contracts/deployment-arbitrum.json +12 -0
  12. package/contracts/deployment-eth-sepolia.json +12 -0
  13. package/contracts/hardhat.config.js +114 -0
  14. package/contracts/package.json +20 -0
  15. package/contracts/scripts/compile-and-extract.js +119 -0
  16. package/contracts/scripts/verify-contract.js +223 -0
  17. package/contracts/src/{NZIP-NFT-Private.sol → NZIP-NFT-v2.0.sol} +66 -151
  18. package/contracts/src/NZIP-NFT.sol +9 -15
  19. package/dist/blockchain/browser/TokenVerifierBrowser.d.ts +67 -0
  20. package/dist/blockchain/browser/TokenVerifierBrowser.d.ts.map +1 -0
  21. package/dist/blockchain/browser/TokenVerifierBrowser.js +313 -0
  22. package/dist/blockchain/browser/TokenVerifierBrowser.js.map +1 -0
  23. package/dist/blockchain/browser/WalletManagerBrowser.d.ts +98 -0
  24. package/dist/blockchain/browser/WalletManagerBrowser.d.ts.map +1 -0
  25. package/dist/blockchain/browser/WalletManagerBrowser.js +434 -0
  26. package/dist/blockchain/browser/WalletManagerBrowser.js.map +1 -0
  27. package/dist/blockchain/browser/ZipkitMinterBrowser.d.ts +58 -0
  28. package/dist/blockchain/browser/ZipkitMinterBrowser.d.ts.map +1 -0
  29. package/dist/blockchain/browser/ZipkitMinterBrowser.js +317 -0
  30. package/dist/blockchain/browser/ZipkitMinterBrowser.js.map +1 -0
  31. package/dist/blockchain/browser/index.d.ts +11 -0
  32. package/dist/blockchain/browser/index.d.ts.map +1 -0
  33. package/dist/blockchain/browser/index.js +16 -0
  34. package/dist/blockchain/browser/index.js.map +1 -0
  35. package/dist/blockchain/core/WalletManager.d.ts +124 -0
  36. package/dist/blockchain/core/WalletManager.d.ts.map +1 -0
  37. package/dist/blockchain/{ZipKitWallet.js → core/WalletManager.js} +157 -177
  38. package/dist/blockchain/core/WalletManager.js.map +1 -0
  39. package/dist/blockchain/{ZipKitMinter.d.ts → core/ZipkitMinter.d.ts} +46 -11
  40. package/dist/blockchain/core/ZipkitMinter.d.ts.map +1 -0
  41. package/dist/blockchain/core/ZipkitMinter.js +548 -0
  42. package/dist/blockchain/core/ZipkitMinter.js.map +1 -0
  43. package/dist/blockchain/{ZipKitOTS.d.ts → core/ZipkitOTS.d.ts} +6 -15
  44. package/dist/blockchain/core/ZipkitOTS.d.ts.map +1 -0
  45. package/dist/blockchain/{ZipKitOTS.js → core/ZipkitOTS.js} +26 -84
  46. package/dist/blockchain/core/ZipkitOTS.js.map +1 -0
  47. package/dist/blockchain/core/ZipkitVerifier.d.ts +177 -0
  48. package/dist/blockchain/core/ZipkitVerifier.d.ts.map +1 -0
  49. package/dist/blockchain/core/ZipkitVerifier.js +632 -0
  50. package/dist/blockchain/core/ZipkitVerifier.js.map +1 -0
  51. package/dist/blockchain/core/contracts.d.ts +83 -0
  52. package/dist/blockchain/core/contracts.d.ts.map +1 -0
  53. package/dist/blockchain/core/contracts.js +341 -0
  54. package/dist/blockchain/core/contracts.js.map +1 -0
  55. package/dist/blockchain/core/index.d.ts +12 -0
  56. package/dist/blockchain/core/index.d.ts.map +1 -0
  57. package/dist/blockchain/core/index.js +59 -0
  58. package/dist/blockchain/core/index.js.map +1 -0
  59. package/dist/blockchain/index.d.ts +11 -7
  60. package/dist/blockchain/index.d.ts.map +1 -0
  61. package/dist/blockchain/index.js +18 -34
  62. package/dist/blockchain/index.js.map +1 -0
  63. package/dist/blockchain/node/WalletManagerNode.d.ts +47 -0
  64. package/dist/blockchain/node/WalletManagerNode.d.ts.map +1 -0
  65. package/dist/blockchain/node/WalletManagerNode.js +203 -0
  66. package/dist/blockchain/node/WalletManagerNode.js.map +1 -0
  67. package/dist/blockchain/node/index.d.ts +12 -0
  68. package/dist/blockchain/node/index.d.ts.map +1 -0
  69. package/dist/blockchain/node/index.js +24 -0
  70. package/dist/blockchain/node/index.js.map +1 -0
  71. package/dist/browser/ZipkitBrowser.d.ts +27 -0
  72. package/dist/browser/ZipkitBrowser.d.ts.map +1 -0
  73. package/dist/browser/{ZipKitBrowser.js → ZipkitBrowser.js} +96 -43
  74. package/dist/browser/ZipkitBrowser.js.map +1 -0
  75. package/dist/browser/index.d.ts +12 -0
  76. package/dist/browser/index.d.ts.map +1 -0
  77. package/dist/browser/index.js +42 -0
  78. package/dist/browser/index.js.map +1 -0
  79. package/dist/browser-esm/index.d.ts +12 -0
  80. package/dist/browser-esm/index.js +59559 -0
  81. package/dist/browser-esm/index.js.map +7 -0
  82. package/dist/browser-umd/index.d.ts +12 -0
  83. package/dist/browser-umd/index.js +59576 -0
  84. package/dist/browser-umd/index.js.map +7 -0
  85. package/dist/browser-umd/index.min.js +63 -0
  86. package/dist/browser.d.ts +8 -14
  87. package/dist/browser.js +13 -28
  88. package/dist/core/ZipCompress.d.ts +99 -0
  89. package/dist/core/ZipCompress.d.ts.map +1 -0
  90. package/dist/core/ZipCompress.js +309 -0
  91. package/dist/core/ZipCompress.js.map +1 -0
  92. package/dist/core/ZipDecompress.d.ts +58 -0
  93. package/dist/core/ZipDecompress.d.ts.map +1 -0
  94. package/dist/core/ZipDecompress.js +172 -0
  95. package/dist/core/ZipDecompress.js.map +1 -0
  96. package/dist/{shared → core}/ZipEntry.d.ts +8 -1
  97. package/dist/core/ZipEntry.d.ts.map +1 -0
  98. package/dist/{shared → core}/ZipEntry.js +225 -82
  99. package/dist/core/ZipEntry.js.map +1 -0
  100. package/dist/core/Zipkit.d.ts +315 -0
  101. package/dist/core/Zipkit.d.ts.map +1 -0
  102. package/dist/core/Zipkit.js +647 -0
  103. package/dist/core/Zipkit.js.map +1 -0
  104. package/dist/core/components/HashCalculator.d.ts +138 -0
  105. package/dist/core/components/HashCalculator.d.ts.map +1 -0
  106. package/dist/core/components/HashCalculator.js +360 -0
  107. package/dist/core/components/HashCalculator.js.map +1 -0
  108. package/dist/core/components/Logger.d.ts +73 -0
  109. package/dist/core/components/Logger.d.ts.map +1 -0
  110. package/dist/core/components/Logger.js +156 -0
  111. package/dist/core/components/Logger.js.map +1 -0
  112. package/dist/core/components/ProgressTracker.d.ts +43 -0
  113. package/dist/core/components/ProgressTracker.d.ts.map +1 -0
  114. package/dist/core/components/ProgressTracker.js +112 -0
  115. package/dist/core/components/ProgressTracker.js.map +1 -0
  116. package/dist/{shared → core}/components/Support.d.ts +1 -0
  117. package/dist/core/components/Support.d.ts.map +1 -0
  118. package/dist/{shared → core}/components/Support.js +1 -0
  119. package/dist/core/components/Support.js.map +1 -0
  120. package/dist/{shared → core}/components/Util.d.ts +7 -2
  121. package/dist/core/components/Util.d.ts.map +1 -0
  122. package/dist/{shared → core}/components/Util.js +14 -34
  123. package/dist/core/components/Util.js.map +1 -0
  124. package/dist/{shared → core}/constants/Errors.d.ts +1 -2
  125. package/dist/core/constants/Errors.d.ts.map +1 -0
  126. package/dist/{shared → core}/constants/Errors.js +1 -3
  127. package/dist/core/constants/Errors.js.map +1 -0
  128. package/dist/{shared → core}/constants/Headers.d.ts +3 -0
  129. package/dist/core/constants/Headers.d.ts.map +1 -0
  130. package/dist/{shared → core}/constants/Headers.js +20 -17
  131. package/dist/core/constants/Headers.js.map +1 -0
  132. package/dist/core/encryption/Manager.d.ts +58 -0
  133. package/dist/core/encryption/Manager.d.ts.map +1 -0
  134. package/dist/core/encryption/Manager.js +121 -0
  135. package/dist/core/encryption/Manager.js.map +1 -0
  136. package/dist/core/encryption/ZipCrypto.d.ts +172 -0
  137. package/dist/core/encryption/ZipCrypto.d.ts.map +1 -0
  138. package/dist/core/encryption/ZipCrypto.js +554 -0
  139. package/dist/core/encryption/ZipCrypto.js.map +1 -0
  140. package/dist/core/encryption/index.d.ts +9 -0
  141. package/dist/core/encryption/index.d.ts.map +1 -0
  142. package/dist/core/encryption/index.js +17 -0
  143. package/dist/core/encryption/index.js.map +1 -0
  144. package/dist/core/encryption/types.d.ts +29 -0
  145. package/dist/core/encryption/types.d.ts.map +1 -0
  146. package/dist/core/encryption/types.js +12 -0
  147. package/dist/core/encryption/types.js.map +1 -0
  148. package/dist/core/index.d.ts +24 -0
  149. package/dist/core/index.d.ts.map +1 -0
  150. package/dist/core/index.js +57 -0
  151. package/dist/core/index.js.map +1 -0
  152. package/dist/core/version.d.ts +5 -0
  153. package/dist/core/version.d.ts.map +1 -0
  154. package/dist/core/version.js +31 -0
  155. package/dist/core/version.js.map +1 -0
  156. package/dist/index.d.ts +8 -18
  157. package/dist/index.d.ts.map +1 -0
  158. package/dist/index.js +29 -35
  159. package/dist/index.js.map +1 -0
  160. package/dist/node/ZipCompressNode.d.ts +123 -0
  161. package/dist/node/ZipCompressNode.d.ts.map +1 -0
  162. package/dist/node/ZipCompressNode.js +576 -0
  163. package/dist/node/ZipCompressNode.js.map +1 -0
  164. package/dist/node/ZipDecompressNode.d.ts +120 -0
  165. package/dist/node/ZipDecompressNode.d.ts.map +1 -0
  166. package/dist/node/ZipDecompressNode.js +461 -0
  167. package/dist/node/ZipDecompressNode.js.map +1 -0
  168. package/dist/node/ZipkitNode.d.ts +406 -0
  169. package/dist/node/ZipkitNode.d.ts.map +1 -0
  170. package/dist/node/ZipkitNode.js +1305 -0
  171. package/dist/node/ZipkitNode.js.map +1 -0
  172. package/dist/node/index.d.ts +26 -0
  173. package/dist/node/index.d.ts.map +1 -0
  174. package/dist/node/index.js +65 -0
  175. package/dist/node/index.js.map +1 -0
  176. package/dist/types/index.d.ts +59 -0
  177. package/dist/types/index.d.ts.map +1 -0
  178. package/dist/types/index.js +36 -1
  179. package/dist/types/index.js.map +1 -0
  180. package/examples/README.md +269 -0
  181. package/examples/blockchain-tokenize.ts +354 -0
  182. package/examples/create-zip.ts +172 -0
  183. package/examples/extract-zip.ts +158 -0
  184. package/examples/list-zip.ts +161 -0
  185. package/examples/test-files/data.json +116 -0
  186. package/examples/test-files/document.md +80 -0
  187. package/examples/test-files/document.txt +2 -0
  188. package/examples/test-files/file1.txt +48 -0
  189. package/examples/test-files/file2.txt +80 -0
  190. package/examples/tsconfig.json +44 -0
  191. package/examples/unzip-token.ts +491 -0
  192. package/examples/verify-tokenized-zip.ts +305 -0
  193. package/examples/zip-token.ts +604 -0
  194. package/package.json +108 -24
  195. package/src/blockchain/README.md +59 -66
  196. package/src/{browser/TokenVerifierBrowser.ts-remove → blockchain/browser/TokenVerifierBrowser.ts} +125 -79
  197. package/src/blockchain/browser/WalletManagerBrowser.ts +486 -0
  198. package/src/blockchain/browser/ZipkitMinterBrowser.ts +400 -0
  199. package/src/blockchain/browser/index.ts +13 -0
  200. package/src/blockchain/{ZipKitWallet.ts → core/WalletManager.ts} +241 -143
  201. package/src/blockchain/core/ZipkitMinter.ts +716 -0
  202. package/src/blockchain/{ZipKitOTS.ts → core/ZipkitOTS.ts} +28 -62
  203. package/src/blockchain/core/ZipkitVerifier.ts +853 -0
  204. package/src/blockchain/core/contracts.ts +370 -0
  205. package/src/blockchain/core/index.ts +71 -0
  206. package/src/blockchain/index.ts +21 -55
  207. package/src/blockchain/node/WalletManagerNode.ts +171 -0
  208. package/src/blockchain/node/index.ts +40 -0
  209. package/src/browser/{ZipKitBrowser.ts → ZipkitBrowser.ts} +104 -41
  210. package/src/browser/index.esm.ts +37 -0
  211. package/src/browser/index.ts +25 -0
  212. package/src/core/ZipCompress.ts +398 -0
  213. package/src/core/ZipDecompress.ts +212 -0
  214. package/src/{shared → core}/ZipEntry.ts +240 -90
  215. package/src/core/Zipkit.ts +794 -0
  216. package/src/core/components/HashCalculator.ts +384 -0
  217. package/src/core/components/Logger.ts +180 -0
  218. package/src/core/components/ProgressTracker.ts +134 -0
  219. package/src/{shared → core}/components/Util.ts +12 -34
  220. package/src/{shared → core}/constants/Errors.ts +0 -4
  221. package/src/{shared → core}/constants/Headers.ts +19 -17
  222. package/src/core/encryption/Manager.ts +137 -0
  223. package/src/core/encryption/ZipCrypto.ts +650 -0
  224. package/src/core/encryption/index.ts +15 -0
  225. package/src/core/encryption/types.ts +33 -0
  226. package/src/core/index.ts +34 -0
  227. package/src/core/version.ts +33 -0
  228. package/src/index.ts +54 -25
  229. package/src/node/ZipCompressNode.ts +632 -0
  230. package/src/node/ZipDecompressNode.ts +508 -0
  231. package/src/node/ZipkitNode.ts +1559 -0
  232. package/src/node/index.ts +69 -0
  233. package/src/types/index.ts +131 -1
  234. package/src/types/modules.d.ts +1 -11
  235. package/src/types/opentimestamps.d.ts +1 -23
  236. package/contracts/INTEGRATION.md +0 -338
  237. package/contracts/NETWORKS.md +0 -156
  238. package/contracts/NZIP-NFT-bytecode.txt +0 -1
  239. package/contracts/constants.ts +0 -952
  240. package/contracts/deploy-bytecode.mjs +0 -94
  241. package/dist/blockchain/CertificateToken.d.ts +0 -48
  242. package/dist/blockchain/CertificateToken.js +0 -386
  243. package/dist/blockchain/ZipKitMinter.js +0 -347
  244. package/dist/blockchain/ZipKitNFT.d.ts +0 -3
  245. package/dist/blockchain/ZipKitNFT.js +0 -7
  246. package/dist/blockchain/ZipKitVerifier.d.ts +0 -69
  247. package/dist/blockchain/ZipKitVerifier.js +0 -289
  248. package/dist/blockchain/ZipKitWallet.d.ts +0 -69
  249. package/dist/blockchain/contracts.d.ts +0 -14
  250. package/dist/blockchain/contracts.js +0 -77
  251. package/dist/blockchain/types.d.ts +0 -47
  252. package/dist/blockchain/types.js +0 -30
  253. package/dist/browser/ZipKitBrowser.d.ts +0 -18
  254. package/dist/browser/ZipKitStampBrowser.d.ts +0 -2
  255. package/dist/browser/ZipKitStampBrowser.js +0 -12
  256. package/dist/browser-index.d.ts +0 -18
  257. package/dist/browser-index.js +0 -57
  258. package/dist/server/ZipKitServer.d.ts +0 -74
  259. package/dist/server/ZipKitServer.js +0 -310
  260. package/dist/shared/ZipKit.d.ts +0 -243
  261. package/dist/shared/ZipKit.js +0 -772
  262. package/dist/shared/components/CertificateOTS.d.ts +0 -15
  263. package/dist/shared/components/CertificateOTS.js +0 -116
  264. package/dist/shared/components/FileSys.d.ts +0 -2
  265. package/dist/shared/components/FileSys.js +0 -113
  266. package/dist/shared/components/HashAccumulator.d.ts +0 -55
  267. package/dist/shared/components/HashAccumulator.js +0 -100
  268. package/dist/shared/components/ZipCrypto.d.ts +0 -3
  269. package/dist/shared/components/ZipCrypto.js +0 -78
  270. package/dist/shared/components/merkleTree.d.ts +0 -66
  271. package/dist/shared/components/merkleTree.js +0 -136
  272. package/dist/shared/types/index.d.ts +0 -21
  273. package/dist/shared/types/index.js +0 -3
  274. package/dist/shared/types.d.ts +0 -33
  275. package/dist/shared/types.js +0 -8
  276. package/dist/shared/version.d.ts +0 -2
  277. package/dist/shared/version.js +0 -6
  278. package/src/blockchain/CertificateToken.ts +0 -444
  279. package/src/blockchain/ZipKitMinter.ts +0 -470
  280. package/src/blockchain/ZipKitNFT.ts +0 -12
  281. package/src/blockchain/ZipKitVerifier.ts +0 -382
  282. package/src/blockchain/contracts.ts +0 -88
  283. package/src/blockchain/types.ts +0 -91
  284. package/src/browser/CertificateGeneratorBrowser.ts-remove +0 -498
  285. package/src/browser/ZipKitStampBrowser.ts +0 -9
  286. package/src/browser-index.ts +0 -36
  287. package/src/server/README.md +0 -25
  288. package/src/server/ZipKitServer.ts +0 -305
  289. package/src/shared/ZipKit.ts +0 -881
  290. package/src/shared/components/CertificateOTS.ts +0 -132
  291. package/src/shared/components/FileSys.ts +0 -87
  292. package/src/shared/components/HashAccumulator.ts +0 -113
  293. package/src/shared/components/ZipCrypto.ts +0 -91
  294. package/src/shared/components/merkleTree.ts +0 -162
  295. package/src/shared/types/index.ts +0 -25
  296. package/src/shared/types/modules.d.ts +0 -22
  297. package/src/shared/types/opentimestamps.d.ts +0 -23
  298. package/src/shared/types.d.ts +0 -8
  299. package/src/shared/types.ts +0 -43
  300. package/src/shared/version.ts +0 -3
  301. /package/src/{shared → core}/components/Support.ts +0 -0
@@ -0,0 +1,576 @@
1
+ "use strict";
2
+ // ======================================
3
+ // ZipCompressNode.ts - Node.js File-Based Compression
4
+ // Copyright (c) 2025 NeoWare, Inc. All rights reserved.
5
+ // ======================================
6
+ //
7
+ // LOGGING INSTRUCTIONS:
8
+ // ---------------------
9
+ // To enable/disable logging, set loggingEnabled to true/false in the class:
10
+ // private static loggingEnabled: boolean = true; // Enable logging
11
+ // private static loggingEnabled: boolean = false; // Disable logging
12
+ //
13
+ // Logging respects the global Logger level (debug, info, warn, error, silent).
14
+ // Logger level is automatically set to 'debug' when loggingEnabled is true.
15
+ //
16
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
20
+ desc = { enumerable: true, get: function() { return m[k]; } };
21
+ }
22
+ Object.defineProperty(o, k2, desc);
23
+ }) : (function(o, m, k, k2) {
24
+ if (k2 === undefined) k2 = k;
25
+ o[k2] = m[k];
26
+ }));
27
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
28
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
29
+ }) : function(o, v) {
30
+ o["default"] = v;
31
+ });
32
+ var __importStar = (this && this.__importStar) || (function () {
33
+ var ownKeys = function(o) {
34
+ ownKeys = Object.getOwnPropertyNames || function (o) {
35
+ var ar = [];
36
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
37
+ return ar;
38
+ };
39
+ return ownKeys(o);
40
+ };
41
+ return function (mod) {
42
+ if (mod && mod.__esModule) return mod;
43
+ var result = {};
44
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
45
+ __setModuleDefault(result, mod);
46
+ return result;
47
+ };
48
+ })();
49
+ var __importDefault = (this && this.__importDefault) || function (mod) {
50
+ return (mod && mod.__esModule) ? mod : { "default": mod };
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ exports.ZipCompressNode = void 0;
54
+ const Logger_1 = require("../core/components/Logger");
55
+ const Headers_1 = require("../core/constants/Headers");
56
+ const HashCalculator_1 = require("../core/components/HashCalculator");
57
+ const ZipCrypto_1 = require("../core/encryption/ZipCrypto");
58
+ const zstd_js_1 = require("@oneidentity/zstd-js");
59
+ const Errors_1 = __importDefault(require("../core/constants/Errors"));
60
+ const fs = __importStar(require("fs"));
61
+ const path = __importStar(require("path"));
62
+ const pako = require('pako');
63
+ // We'll initialize zstd when needed
64
+ let zstdCodec = null;
65
+ // Async initialization function for zstd
66
+ async function initZstd() {
67
+ if (!zstdCodec) {
68
+ zstdCodec = await (0, zstd_js_1.ZstdInit)();
69
+ }
70
+ return zstdCodec;
71
+ }
72
+ /**
73
+ * ZipCompressNode - Node.js file-based compression operations
74
+ *
75
+ * Independent compression implementation for Node.js environments.
76
+ * All compression logic is implemented directly without delegating to ZipCompress.
77
+ *
78
+ * @example
79
+ * ```typescript
80
+ * const zipkitNode = new ZipkitNode();
81
+ * const compressNode = new ZipCompressNode(zipkitNode);
82
+ * const compressed = await compressNode.compressFile('/path/to/file.txt', entry);
83
+ * ```
84
+ */
85
+ class ZipCompressNode {
86
+ /**
87
+ * Internal logging method - only logs if class logging is enabled
88
+ */
89
+ log(...args) {
90
+ if (ZipCompressNode.loggingEnabled) {
91
+ Logger_1.Logger.debug(`[ZipCompressNode]`, ...args);
92
+ }
93
+ }
94
+ /**
95
+ * Creates a new ZipCompressNode instance
96
+ * @param zipkitNode - ZipkitNode instance to use for ZIP operations
97
+ */
98
+ constructor(zipkitNode) {
99
+ this.zipkitNode = zipkitNode;
100
+ // If logging is enabled, ensure Logger level is set to debug
101
+ if (ZipCompressNode.loggingEnabled) {
102
+ Logger_1.Logger.setLevel('debug');
103
+ }
104
+ }
105
+ // ============================================================================
106
+ // Compression Methods
107
+ // ============================================================================
108
+ /**
109
+ * Compress data for a ZIP entry (Buffer-based only)
110
+ * @param entry - ZIP entry to compress
111
+ * @param data - Buffer containing data to compress
112
+ * @param options - Compression options
113
+ * @param onOutputBuffer - Optional callback for streaming output
114
+ * @returns Buffer containing compressed data
115
+ */
116
+ async compressData(entry, data, options, onOutputBuffer) {
117
+ // Set uncompressed size if not already set
118
+ if (!entry.uncompressedSize || entry.uncompressedSize === 0) {
119
+ entry.uncompressedSize = data.length;
120
+ }
121
+ const totalSize = data.length;
122
+ const bufferSize = options?.bufferSize || this.zipkitNode.getBufferSize();
123
+ // Determine compression method
124
+ let compressionMethod;
125
+ if (options?.level === 0) {
126
+ compressionMethod = Headers_1.CMP_METHOD.STORED;
127
+ }
128
+ else if (options?.useZstd) {
129
+ // ZSTD fallback to STORED if file too small
130
+ if (totalSize < 100) {
131
+ compressionMethod = Headers_1.CMP_METHOD.STORED;
132
+ }
133
+ else {
134
+ compressionMethod = Headers_1.CMP_METHOD.ZSTD;
135
+ }
136
+ }
137
+ else {
138
+ compressionMethod = Headers_1.CMP_METHOD.DEFLATED;
139
+ }
140
+ entry.cmpMethod = compressionMethod;
141
+ // Initialize hash calculator
142
+ const needsHashCalculation = (!entry.crc || entry.crc === 0) || (options?.useSHA256 && !entry.sha256);
143
+ const hashCalculator = needsHashCalculation ? new HashCalculator_1.HashCalculator({ useSHA256: options?.useSHA256 && !entry.sha256 || false }) : null;
144
+ // Calculate hashes if needed
145
+ let buffer = Buffer.alloc(0);
146
+ if (hashCalculator) {
147
+ hashCalculator.update(data);
148
+ if (!entry.crc || entry.crc === 0) {
149
+ entry.crc = hashCalculator.finalizeCRC32();
150
+ }
151
+ if (options?.useSHA256 && !entry.sha256) {
152
+ entry.sha256 = hashCalculator.finalizeSHA256();
153
+ }
154
+ }
155
+ // Compress based on method
156
+ if (compressionMethod === Headers_1.CMP_METHOD.STORED) {
157
+ buffer = data;
158
+ entry.compressedSize = data.length;
159
+ }
160
+ else if (compressionMethod === Headers_1.CMP_METHOD.ZSTD) {
161
+ buffer = await this.zstdCompress(data, options, bufferSize, entry, onOutputBuffer);
162
+ }
163
+ else {
164
+ // DEFLATED
165
+ buffer = await this.deflateCompress(data, options, bufferSize, entry, onOutputBuffer);
166
+ }
167
+ // Only set compressed size if it hasn't been set already
168
+ if (entry.compressedSize === undefined || entry.compressedSize === 0) {
169
+ entry.compressedSize = buffer.length;
170
+ }
171
+ // Apply encryption if password is provided
172
+ if (options?.password && buffer.length > 0) {
173
+ buffer = this.encryptCompressedData(buffer, entry, options.password);
174
+ }
175
+ return buffer;
176
+ }
177
+ /**
178
+ * Compresses data using deflate algorithm with chunked processing
179
+ * @param data - Data to compress (Buffer or chunked reader)
180
+ * @param options - Compression options
181
+ * @param bufferSize - Size of buffer to read (default: 512KB)
182
+ * @param entry - Optional ZIP entry for hash calculation
183
+ * @param onOutputBuffer - Optional callback for streaming output
184
+ * @returns Compressed data buffer
185
+ */
186
+ async deflateCompress(data, options, bufferSize, entry, onOutputBuffer) {
187
+ const effectiveBufferSize = bufferSize || options?.bufferSize || this.zipkitNode.getBufferSize();
188
+ // Initialize hash calculator for incremental hash calculation during chunk reads
189
+ const needsHashCalculation = entry && ((!entry.crc || entry.crc === 0) || (options?.useSHA256 && !entry.sha256));
190
+ const hashCalculator = needsHashCalculation ? new HashCalculator_1.HashCalculator({ useSHA256: options?.useSHA256 && !entry.sha256 || false }) : null;
191
+ if (options?.level === 0) {
192
+ // Store without compression
193
+ if (Buffer.isBuffer(data)) {
194
+ // For buffer, calculate hashes if needed
195
+ if (hashCalculator && entry) {
196
+ hashCalculator.update(data);
197
+ if (!entry.crc || entry.crc === 0) {
198
+ entry.crc = hashCalculator.finalizeCRC32();
199
+ }
200
+ if (options?.useSHA256 && !entry.sha256) {
201
+ entry.sha256 = hashCalculator.finalizeSHA256();
202
+ }
203
+ }
204
+ return data;
205
+ }
206
+ else {
207
+ // For chunked reader, process in chunks and call onOutputBuffer
208
+ let position = 0;
209
+ let totalProcessed = 0;
210
+ while (position < data.totalSize) {
211
+ const readSize = Math.min(effectiveBufferSize, data.totalSize - position);
212
+ const chunk = data.onReadChunk(position, readSize);
213
+ // [READ] -> [HASH] -> [OUTPUT] sequence
214
+ if (hashCalculator) {
215
+ hashCalculator.update(chunk);
216
+ }
217
+ if (onOutputBuffer) {
218
+ await onOutputBuffer(chunk);
219
+ }
220
+ totalProcessed += chunk.length;
221
+ position += chunk.length;
222
+ }
223
+ // Finalize hashes
224
+ if (hashCalculator && entry) {
225
+ if (!entry.crc || entry.crc === 0) {
226
+ entry.crc = hashCalculator.finalizeCRC32();
227
+ }
228
+ if (options?.useSHA256 && !entry.sha256) {
229
+ entry.sha256 = hashCalculator.finalizeSHA256();
230
+ }
231
+ }
232
+ return Buffer.alloc(0);
233
+ }
234
+ }
235
+ try {
236
+ const level = options?.level;
237
+ const isBuffer = Buffer.isBuffer(data);
238
+ const totalSize = isBuffer ? data.length : data.totalSize;
239
+ const compressedChunks = [];
240
+ let totalProcessed = 0;
241
+ let totalCompressedSize = 0;
242
+ let position = 0;
243
+ if (isBuffer) {
244
+ // Buffer-based processing
245
+ if (hashCalculator && entry) {
246
+ hashCalculator.update(data);
247
+ // Always set CRC if hash calculator was used (it calculated the correct CRC)
248
+ entry.crc = hashCalculator.finalizeCRC32();
249
+ if (options?.useSHA256 && !entry.sha256) {
250
+ entry.sha256 = hashCalculator.finalizeSHA256();
251
+ }
252
+ }
253
+ const result = pako.deflateRaw(data, { level: level ?? 6 });
254
+ const compressed = Buffer.from(result.buffer, result.byteOffset, result.byteLength);
255
+ if (onOutputBuffer) {
256
+ await onOutputBuffer(compressed);
257
+ }
258
+ return compressed;
259
+ }
260
+ else {
261
+ // Chunked reader processing - use streaming deflator to maintain state across chunks
262
+ const deflator = new pako.Deflate({ level: level ?? 6, raw: true });
263
+ const compressedChunks = [];
264
+ let resultOffset = 0; // Track how much of deflator.result we've already processed
265
+ while (position < totalSize) {
266
+ const readSize = Math.min(effectiveBufferSize, totalSize - position);
267
+ const chunk = data.onReadChunk(position, readSize);
268
+ const isLast = position + readSize >= totalSize;
269
+ // [READ] -> [HASH] sequence
270
+ if (hashCalculator) {
271
+ hashCalculator.update(chunk);
272
+ }
273
+ // Push chunk to streaming deflator (maintains state across chunks)
274
+ deflator.push(chunk, isLast);
275
+ // Collect compressed chunks from deflator
276
+ // deflator.result accumulates compressed data, so we need to process only new data
277
+ if (deflator.result && deflator.result.length > resultOffset) {
278
+ const newCompressed = Buffer.from(deflator.result.subarray(resultOffset));
279
+ compressedChunks.push(newCompressed);
280
+ totalCompressedSize += newCompressed.length;
281
+ resultOffset = deflator.result.length;
282
+ if (onOutputBuffer) {
283
+ await onOutputBuffer(newCompressed);
284
+ }
285
+ }
286
+ totalProcessed += chunk.length;
287
+ position += chunk.length;
288
+ }
289
+ // Finalize hashes after all chunks processed and compressed
290
+ if (hashCalculator && entry) {
291
+ // Always set CRC if hash calculator was used (it calculated the correct CRC)
292
+ entry.crc = hashCalculator.finalizeCRC32();
293
+ if (options?.useSHA256 && !entry.sha256) {
294
+ entry.sha256 = hashCalculator.finalizeSHA256();
295
+ }
296
+ }
297
+ // For chunked processing, return empty buffer (data already written via onOutputBuffer)
298
+ if (entry) {
299
+ entry.compressedSize = totalCompressedSize;
300
+ }
301
+ return Buffer.alloc(0);
302
+ }
303
+ }
304
+ catch (e) {
305
+ Logger_1.Logger.error('Error during chunked deflate compression:', e);
306
+ throw new Error(Errors_1.default.COMPRESSION_ERROR);
307
+ }
308
+ }
309
+ /**
310
+ * Compresses data using deflate algorithm (legacy method for small buffers)
311
+ * @param inbuf - Data to compress
312
+ * @param options - Compression options
313
+ * @returns Compressed data buffer
314
+ */
315
+ deflate(inbuf, options) {
316
+ if (options?.level == 0) {
317
+ return inbuf; // Store without compression
318
+ }
319
+ try {
320
+ const level = options?.level;
321
+ const result = pako.deflateRaw(inbuf, {
322
+ level: level ?? 6
323
+ });
324
+ return Buffer.from(result.buffer, result.byteOffset, result.byteLength);
325
+ }
326
+ catch (e) {
327
+ Logger_1.Logger.error('Error during compression:', e);
328
+ throw new Error(Errors_1.default.COMPRESSION_ERROR);
329
+ }
330
+ }
331
+ /**
332
+ * Compresses data using Zstandard (zstd) algorithm
333
+ * @param input - Buffer to compress OR chunked reader object with totalSize and readChunk callback
334
+ * @param options - Compression options
335
+ * @param bufferSize - Size of buffer to read if using chunked reader (default: 512KB)
336
+ * @param entry - Optional ZIP entry for hash calculation
337
+ * @param onOutputBuffer - Optional callback for streaming output
338
+ * @returns Compressed data buffer
339
+ */
340
+ async zstdCompress(input, options, bufferSize, entry, onOutputBuffer) {
341
+ const effectiveBufferSize = bufferSize || options?.bufferSize || this.zipkitNode.getBufferSize();
342
+ const isBuffer = Buffer.isBuffer(input);
343
+ const totalSize = isBuffer ? input.length : input.totalSize;
344
+ if (options?.level == 0) {
345
+ // For store mode, return as-is
346
+ if (isBuffer) {
347
+ return input;
348
+ }
349
+ else {
350
+ // Read all chunks
351
+ const chunks = [];
352
+ let position = 0;
353
+ while (position < totalSize) {
354
+ const size = Math.min(effectiveBufferSize, totalSize - position);
355
+ const chunk = input.readChunk(position, size);
356
+ chunks.push(chunk);
357
+ position += size;
358
+ }
359
+ return Buffer.concat(chunks);
360
+ }
361
+ }
362
+ try {
363
+ // Ensure zstd is initialized
364
+ const codec = await initZstd();
365
+ // Zstd compression levels range from 1 (fastest) to 22 (highest compression)
366
+ // Map our 1-9 level to a reasonable zstd range (1-19)
367
+ const level = options?.level ?? 6;
368
+ const zstdLevel = Math.min(Math.max(1, Math.floor(level * 2.1)), 19);
369
+ // Get the full buffer (zstd doesn't support true streaming compression)
370
+ const inbuf = isBuffer ? input : (() => {
371
+ const chunks = [];
372
+ let position = 0;
373
+ while (position < totalSize) {
374
+ const size = Math.min(effectiveBufferSize, totalSize - position);
375
+ const chunk = input.readChunk(position, size);
376
+ chunks.push(chunk);
377
+ position += size;
378
+ }
379
+ return Buffer.concat(chunks);
380
+ })();
381
+ // Validate input
382
+ if (!inbuf || inbuf.length === 0) {
383
+ throw new Error('ZSTD compression: empty input buffer');
384
+ }
385
+ // Convert Buffer to Uint8Array for WASM module (same fix as decompression)
386
+ const inputArray = new Uint8Array(inbuf.buffer, inbuf.byteOffset, inbuf.byteLength);
387
+ // Compress the data with zstd
388
+ const compressedData = codec.ZstdSimple.compress(inputArray, zstdLevel);
389
+ const compressedBuffer = Buffer.from(compressedData);
390
+ // Set the compressed size in the entry for ZIP file structure
391
+ if (entry) {
392
+ entry.compressedSize = compressedBuffer.length;
393
+ }
394
+ if (onOutputBuffer) {
395
+ await onOutputBuffer(compressedBuffer);
396
+ }
397
+ return compressedBuffer;
398
+ }
399
+ catch (e) {
400
+ Logger_1.Logger.error('Error during zstd compression:', e);
401
+ throw new Error(Errors_1.default.COMPRESSION_ERROR);
402
+ }
403
+ }
404
+ /**
405
+ * Encrypt compressed data using PKZIP encryption
406
+ * Creates encryption header, encrypts compressed data, and updates entry flags
407
+ * @param compressedData - Compressed data to encrypt
408
+ * @param entry - ZIP entry to encrypt
409
+ * @param password - Password for encryption
410
+ * @returns Encrypted buffer (encrypted header + encrypted compressed data)
411
+ */
412
+ encryptCompressedData(compressedData, entry, password) {
413
+ // Create ZipCrypto instance
414
+ const zipCrypto = new ZipCrypto_1.ZipCrypto();
415
+ // Encrypt the compressed data (includes header creation and encryption)
416
+ const encryptedData = zipCrypto.encryptBuffer(entry, compressedData, password);
417
+ // Set encryption flags on entry
418
+ entry.isEncrypted = true;
419
+ entry.bitFlags |= Headers_1.GP_FLAG.ENCRYPTED;
420
+ // Update compressed size to include encryption header (12 bytes)
421
+ entry.compressedSize = encryptedData.length;
422
+ return encryptedData;
423
+ }
424
+ // ============================================================================
425
+ // File-Based Compression Methods
426
+ // ============================================================================
427
+ /**
428
+ * Compress a file from disk
429
+ *
430
+ * Reads file from disk, sets entry metadata from file stats, and compresses the data.
431
+ *
432
+ * @param filePath - Path to the file to compress
433
+ * @param entry - ZIP entry to compress (filename should already be set)
434
+ * @param options - Optional compression options
435
+ * @returns Promise resolving to Buffer containing compressed data
436
+ * @throws Error if file not found or not a file
437
+ */
438
+ async compressFile(filePath, entry, options) {
439
+ // Validate file exists
440
+ if (!fs.existsSync(filePath)) {
441
+ throw new Error(`File not found: ${filePath}`);
442
+ }
443
+ const stats = fs.statSync(filePath);
444
+ if (!stats.isFile()) {
445
+ throw new Error(`Path is not a file: ${filePath}`);
446
+ }
447
+ // Set entry metadata from file stats
448
+ entry.uncompressedSize = stats.size;
449
+ entry.timeDateDOS = entry.setDateTime(stats.mtime);
450
+ // Read file data
451
+ const fileData = fs.readFileSync(filePath);
452
+ // Compress the buffer using compressData (buffer-based compression)
453
+ return await this.compressData(entry, fileData, options);
454
+ }
455
+ /**
456
+ * Compress a file from disk using streaming for large files
457
+ *
458
+ * Streams file in chunks for memory-efficient compression of large files.
459
+ * All chunk reading logic is handled in this server class.
460
+ *
461
+ * @param filePath - Path to the file to compress
462
+ * @param entry - ZIP entry to compress (filename should already be set)
463
+ * @param options - Optional compression options
464
+ * @param onOutputBuffer - Optional callback for streaming output
465
+ * @returns Promise resolving to Buffer containing compressed data
466
+ * @throws Error if file not found or not a file
467
+ */
468
+ async compressFileStream(filePath, entry, options, onOutputBuffer) {
469
+ // Validate file exists
470
+ if (!fs.existsSync(filePath)) {
471
+ throw new Error(`File not found: ${filePath}`);
472
+ }
473
+ const stats = fs.statSync(filePath);
474
+ if (!stats.isFile()) {
475
+ throw new Error(`Path is not a file: ${filePath}`);
476
+ }
477
+ // Set entry metadata from file stats
478
+ entry.uncompressedSize = stats.size;
479
+ entry.timeDateDOS = entry.setDateTime(stats.mtime);
480
+ // Determine buffer size for chunked reading
481
+ const bufferSize = options?.bufferSize || this.zipkitNode.getBufferSize();
482
+ // Create chunked reader for streaming compression
483
+ // All chunk reading logic is in this server class
484
+ const chunkedReader = {
485
+ totalSize: stats.size,
486
+ onReadChunk: (position, size) => {
487
+ const fd = fs.openSync(filePath, 'r');
488
+ try {
489
+ const buffer = Buffer.alloc(size);
490
+ const bytesRead = fs.readSync(fd, buffer, 0, size, position);
491
+ return buffer.subarray(0, bytesRead);
492
+ }
493
+ finally {
494
+ fs.closeSync(fd);
495
+ }
496
+ },
497
+ onOutChunk: (chunk) => {
498
+ // Output chunks are accumulated in compression methods
499
+ }
500
+ };
501
+ // Determine compression method and call appropriate method
502
+ const compressionMethod = options?.level === 0 ? 'STORED' :
503
+ options?.useZstd ? 'ZSTD' : 'DEFLATED';
504
+ // Set entry compression method before compression
505
+ if (compressionMethod === 'STORED') {
506
+ entry.cmpMethod = Headers_1.CMP_METHOD.STORED;
507
+ }
508
+ else if (compressionMethod === 'ZSTD') {
509
+ entry.cmpMethod = Headers_1.CMP_METHOD.ZSTD;
510
+ }
511
+ else {
512
+ entry.cmpMethod = Headers_1.CMP_METHOD.DEFLATED;
513
+ }
514
+ if (compressionMethod === 'STORED') {
515
+ // For STORED, read file and pass as buffer
516
+ const fileData = fs.readFileSync(filePath);
517
+ return await this.compressData(entry, fileData, options, onOutputBuffer);
518
+ }
519
+ else if (compressionMethod === 'ZSTD') {
520
+ // ZSTD requires full buffer, so read file first
521
+ const fileData = fs.readFileSync(filePath);
522
+ return await this.compressData(entry, fileData, options, onOutputBuffer);
523
+ }
524
+ else {
525
+ // DEFLATED: Use deflateCompress with chunked reader
526
+ return await this.deflateCompress(chunkedReader, options, bufferSize, entry, onOutputBuffer);
527
+ }
528
+ }
529
+ /**
530
+ * Compress multiple files from disk to a ZIP file
531
+ *
532
+ * Batch compression from file paths. Creates entries for each file and writes
533
+ * to output ZIP file. This is a simplified implementation - full implementation
534
+ * would need to write ZIP structure incrementally.
535
+ *
536
+ * @param filePaths - Array of file paths to compress
537
+ * @param outputPath - Path where the ZIP file should be created
538
+ * @param options - Optional compression options
539
+ * @returns Promise that resolves when ZIP creation is complete
540
+ * @throws Error if any file not found
541
+ */
542
+ async compressFiles(filePaths, outputPath, options) {
543
+ // This is a placeholder for future implementation
544
+ // Full implementation would need to:
545
+ // 1. Create ZIP file structure
546
+ // 2. Write local headers and compressed data for each file
547
+ // 3. Write central directory
548
+ // 4. Write end of central directory record
549
+ // For now, this is a simplified version that compresses files but doesn't write ZIP structure
550
+ const entries = [];
551
+ const compressedData = [];
552
+ for (const filePath of filePaths) {
553
+ if (!fs.existsSync(filePath)) {
554
+ throw new Error(`File not found: ${filePath}`);
555
+ }
556
+ const stats = fs.statSync(filePath);
557
+ if (!stats.isFile()) {
558
+ continue; // Skip directories
559
+ }
560
+ // Create entry
561
+ const entryName = path.relative(process.cwd(), filePath) || path.basename(filePath);
562
+ const entry = this.zipkitNode.createZipEntry(entryName);
563
+ // Compress file
564
+ const compressed = await this.compressFile(filePath, entry, options);
565
+ entries.push(entry);
566
+ compressedData.push(compressed);
567
+ }
568
+ // For now, this is a placeholder
569
+ // Full implementation would write ZIP structure to outputPath
570
+ throw new Error('compressFiles() - Full implementation pending. Use neozip CLI for now.');
571
+ }
572
+ }
573
+ exports.ZipCompressNode = ZipCompressNode;
574
+ // Class-level logging control - set to true to enable logging
575
+ ZipCompressNode.loggingEnabled = false;
576
+ //# sourceMappingURL=ZipCompressNode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZipCompressNode.js","sourceRoot":"","sources":["../../src/node/ZipCompressNode.ts"],"names":[],"mappings":"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"}