scanoss 0.2.3

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 (204) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE +23 -0
  3. package/README.md +98 -0
  4. package/build/main/bin/cli-bin.d.ts +2 -0
  5. package/build/main/bin/cli-bin.js +58 -0
  6. package/build/main/commands/dep.d.ts +1 -0
  7. package/build/main/commands/dep.js +38 -0
  8. package/build/main/commands/fingerprint.d.ts +1 -0
  9. package/build/main/commands/fingerprint.js +49 -0
  10. package/build/main/commands/helpers.d.ts +1 -0
  11. package/build/main/commands/helpers.js +22 -0
  12. package/build/main/commands/scan.d.ts +1 -0
  13. package/build/main/commands/scan.js +91 -0
  14. package/build/main/index.d.ts +7 -0
  15. package/build/main/index.js +20 -0
  16. package/build/main/lib/dependencies/DependencyScanner.d.ts +11 -0
  17. package/build/main/lib/dependencies/DependencyScanner.js +94 -0
  18. package/build/main/lib/dependencies/DependencyScannerCfg.d.ts +4 -0
  19. package/build/main/lib/dependencies/DependencyScannerCfg.js +11 -0
  20. package/build/main/lib/dependencies/DependencyTypes.d.ts +21 -0
  21. package/build/main/lib/dependencies/DependencyTypes.js +3 -0
  22. package/build/main/lib/dependencies/LocalDependency/DependencyTypes.d.ts +16 -0
  23. package/build/main/lib/dependencies/LocalDependency/DependencyTypes.js +3 -0
  24. package/build/main/lib/dependencies/LocalDependency/LocalDependency.d.ts +6 -0
  25. package/build/main/lib/dependencies/LocalDependency/LocalDependency.js +51 -0
  26. package/build/main/lib/dependencies/LocalDependency/parsers/golangParser.d.ts +2 -0
  27. package/build/main/lib/dependencies/LocalDependency/parsers/golangParser.js +63 -0
  28. package/build/main/lib/dependencies/LocalDependency/parsers/mavenParser.d.ts +2 -0
  29. package/build/main/lib/dependencies/LocalDependency/parsers/mavenParser.js +173 -0
  30. package/build/main/lib/dependencies/LocalDependency/parsers/npmParser.d.ts +3 -0
  31. package/build/main/lib/dependencies/LocalDependency/parsers/npmParser.js +50 -0
  32. package/build/main/lib/dependencies/LocalDependency/parsers/pyParser.d.ts +2 -0
  33. package/build/main/lib/dependencies/LocalDependency/parsers/pyParser.js +65 -0
  34. package/build/main/lib/dependencies/LocalDependency/parsers/rubyParser.d.ts +3 -0
  35. package/build/main/lib/dependencies/LocalDependency/parsers/rubyParser.js +133 -0
  36. package/build/main/lib/dependencies/LocalDependency/parsers/utils.d.ts +2 -0
  37. package/build/main/lib/dependencies/LocalDependency/parsers/utils.js +20 -0
  38. package/build/main/lib/filters/defaultFilter.d.ts +16 -0
  39. package/build/main/lib/filters/defaultFilter.js +195 -0
  40. package/build/main/lib/filters/filtering.d.ts +32 -0
  41. package/build/main/lib/filters/filtering.js +229 -0
  42. package/build/main/lib/grpc/GrpcDependencyService.d.ts +11 -0
  43. package/build/main/lib/grpc/GrpcDependencyService.js +87 -0
  44. package/build/main/lib/grpc/scanoss/api/common/v2/scanoss-common_grpc_pb.d.ts +0 -0
  45. package/build/main/lib/grpc/scanoss/api/common/v2/scanoss-common_grpc_pb.js +2 -0
  46. package/build/main/lib/grpc/scanoss/api/common/v2/scanoss-common_pb.d.ts +1 -0
  47. package/build/main/lib/grpc/scanoss/api/common/v2/scanoss-common_pb.js +404 -0
  48. package/build/main/lib/grpc/scanoss/api/components/v2/scanoss-components_grpc_pb.d.ts +62 -0
  49. package/build/main/lib/grpc/scanoss/api/components/v2/scanoss-components_grpc_pb.js +128 -0
  50. package/build/main/lib/grpc/scanoss/api/components/v2/scanoss-components_pb.d.ts +1 -0
  51. package/build/main/lib/grpc/scanoss/api/components/v2/scanoss-components_pb.js +1403 -0
  52. package/build/main/lib/grpc/scanoss/api/dependencies/v2/scanoss-dependencies_grpc_pb.d.ts +42 -0
  53. package/build/main/lib/grpc/scanoss/api/dependencies/v2/scanoss-dependencies_grpc_pb.js +98 -0
  54. package/build/main/lib/grpc/scanoss/api/dependencies/v2/scanoss-dependencies_pb.d.ts +1 -0
  55. package/build/main/lib/grpc/scanoss/api/dependencies/v2/scanoss-dependencies_pb.js +1197 -0
  56. package/build/main/lib/grpc/scanoss/api/scanning/v2/scanoss-scanning_grpc_pb.d.ts +21 -0
  57. package/build/main/lib/grpc/scanoss/api/scanning/v2/scanoss-scanning_grpc_pb.js +66 -0
  58. package/build/main/lib/grpc/scanoss/api/scanning/v2/scanoss-scanning_pb.d.ts +1 -0
  59. package/build/main/lib/grpc/scanoss/api/scanning/v2/scanoss-scanning_pb.js +14 -0
  60. package/build/main/lib/scanner/Dispatcher/DispatchableItem.d.ts +19 -0
  61. package/build/main/lib/scanner/Dispatcher/DispatchableItem.js +44 -0
  62. package/build/main/lib/scanner/Dispatcher/Dispatcher.d.ts +19 -0
  63. package/build/main/lib/scanner/Dispatcher/Dispatcher.js +122 -0
  64. package/build/main/lib/scanner/Dispatcher/DispatcherResponse.d.ts +12 -0
  65. package/build/main/lib/scanner/Dispatcher/DispatcherResponse.js +34 -0
  66. package/build/main/lib/scanner/Dispatcher/GlobalControllerAborter.d.ts +10 -0
  67. package/build/main/lib/scanner/Dispatcher/GlobalControllerAborter.js +33 -0
  68. package/build/main/lib/scanner/Scannable/ScannableItem.d.ts +15 -0
  69. package/build/main/lib/scanner/Scannable/ScannableItem.js +28 -0
  70. package/build/main/lib/scanner/Scanner.d.ts +46 -0
  71. package/build/main/lib/scanner/Scanner.js +280 -0
  72. package/build/main/lib/scanner/ScannerCfg.d.ts +13 -0
  73. package/build/main/lib/scanner/ScannerCfg.js +27 -0
  74. package/build/main/lib/scanner/ScannerQueue.d.ts +3 -0
  75. package/build/main/lib/scanner/ScannerQueue.js +8 -0
  76. package/build/main/lib/scanner/ScannerTypes.d.ts +39 -0
  77. package/build/main/lib/scanner/ScannerTypes.js +40 -0
  78. package/build/main/lib/scanner/WfpProvider/FingerprintPackage.d.ts +9 -0
  79. package/build/main/lib/scanner/WfpProvider/FingerprintPackage.js +32 -0
  80. package/build/main/lib/scanner/WfpProvider/FingerprintPacket.d.ts +12 -0
  81. package/build/main/lib/scanner/WfpProvider/FingerprintPacket.js +38 -0
  82. package/build/main/lib/scanner/WfpProvider/WfpCalculator/WfpCalculator.d.ts +20 -0
  83. package/build/main/lib/scanner/WfpProvider/WfpCalculator/WfpCalculator.js +334 -0
  84. package/build/main/lib/scanner/WfpProvider/WfpProvider.d.ts +32 -0
  85. package/build/main/lib/scanner/WfpProvider/WfpProvider.js +63 -0
  86. package/build/main/lib/scanner/WfpProvider/WfpProviderFactory.d.ts +6 -0
  87. package/build/main/lib/scanner/WfpProvider/WfpProviderFactory.js +16 -0
  88. package/build/main/lib/scanner/WfpProvider/WfpSplitter/WfpSplitter.d.ts +20 -0
  89. package/build/main/lib/scanner/WfpProvider/WfpSplitter/WfpSplitter.js +94 -0
  90. package/build/main/lib/scanner/Winnower/Winnower.d.ts +36 -0
  91. package/build/main/lib/scanner/Winnower/Winnower.js +407 -0
  92. package/build/main/lib/scanner/Winnower/WinnowerExtractor.d.ts +10 -0
  93. package/build/main/lib/scanner/Winnower/WinnowerExtractor.js +33 -0
  94. package/build/main/lib/scanner/Winnower/WinnowerResponse.d.ts +11 -0
  95. package/build/main/lib/scanner/Winnower/WinnowerResponse.js +32 -0
  96. package/build/main/lib/tree/File.d.ts +6 -0
  97. package/build/main/lib/tree/File.js +23 -0
  98. package/build/main/lib/tree/Folder.d.ts +10 -0
  99. package/build/main/lib/tree/Folder.js +54 -0
  100. package/build/main/lib/tree/Node.d.ts +15 -0
  101. package/build/main/lib/tree/Node.js +23 -0
  102. package/build/main/lib/tree/Tree.d.ts +19 -0
  103. package/build/main/lib/tree/Tree.js +76 -0
  104. package/build/module/bin/cli-bin.d.ts +2 -0
  105. package/build/module/bin/cli-bin.js +56 -0
  106. package/build/module/commands/dep.d.ts +1 -0
  107. package/build/module/commands/dep.js +31 -0
  108. package/build/module/commands/fingerprint.d.ts +1 -0
  109. package/build/module/commands/fingerprint.js +42 -0
  110. package/build/module/commands/helpers.d.ts +1 -0
  111. package/build/module/commands/helpers.js +15 -0
  112. package/build/module/commands/scan.d.ts +1 -0
  113. package/build/module/commands/scan.js +84 -0
  114. package/build/module/index.d.ts +7 -0
  115. package/build/module/index.js +8 -0
  116. package/build/module/lib/dependencies/DependencyScanner.d.ts +11 -0
  117. package/build/module/lib/dependencies/DependencyScanner.js +92 -0
  118. package/build/module/lib/dependencies/DependencyScannerCfg.d.ts +4 -0
  119. package/build/module/lib/dependencies/DependencyScannerCfg.js +5 -0
  120. package/build/module/lib/dependencies/DependencyTypes.d.ts +21 -0
  121. package/build/module/lib/dependencies/DependencyTypes.js +2 -0
  122. package/build/module/lib/dependencies/LocalDependency/DependencyTypes.d.ts +16 -0
  123. package/build/module/lib/dependencies/LocalDependency/DependencyTypes.js +2 -0
  124. package/build/module/lib/dependencies/LocalDependency/LocalDependency.d.ts +6 -0
  125. package/build/module/lib/dependencies/LocalDependency/LocalDependency.js +45 -0
  126. package/build/module/lib/dependencies/LocalDependency/parsers/golangParser.d.ts +2 -0
  127. package/build/module/lib/dependencies/LocalDependency/parsers/golangParser.js +55 -0
  128. package/build/module/lib/dependencies/LocalDependency/parsers/mavenParser.d.ts +2 -0
  129. package/build/module/lib/dependencies/LocalDependency/parsers/mavenParser.js +166 -0
  130. package/build/module/lib/dependencies/LocalDependency/parsers/npmParser.d.ts +3 -0
  131. package/build/module/lib/dependencies/LocalDependency/parsers/npmParser.js +42 -0
  132. package/build/module/lib/dependencies/LocalDependency/parsers/pyParser.d.ts +2 -0
  133. package/build/module/lib/dependencies/LocalDependency/parsers/pyParser.js +57 -0
  134. package/build/module/lib/dependencies/LocalDependency/parsers/rubyParser.d.ts +3 -0
  135. package/build/module/lib/dependencies/LocalDependency/parsers/rubyParser.js +130 -0
  136. package/build/module/lib/dependencies/LocalDependency/parsers/utils.d.ts +2 -0
  137. package/build/module/lib/dependencies/LocalDependency/parsers/utils.js +15 -0
  138. package/build/module/lib/filters/defaultFilter.d.ts +16 -0
  139. package/build/module/lib/filters/defaultFilter.js +192 -0
  140. package/build/module/lib/filters/filtering.d.ts +32 -0
  141. package/build/module/lib/filters/filtering.js +210 -0
  142. package/build/module/lib/grpc/GrpcDependencyService.d.ts +11 -0
  143. package/build/module/lib/grpc/GrpcDependencyService.js +66 -0
  144. package/build/module/lib/grpc/scanoss/api/common/v2/scanoss-common_grpc_pb.d.ts +0 -0
  145. package/build/module/lib/grpc/scanoss/api/common/v2/scanoss-common_grpc_pb.js +2 -0
  146. package/build/module/lib/grpc/scanoss/api/common/v2/scanoss-common_pb.d.ts +1 -0
  147. package/build/module/lib/grpc/scanoss/api/common/v2/scanoss-common_pb.js +404 -0
  148. package/build/module/lib/grpc/scanoss/api/components/v2/scanoss-components_grpc_pb.d.ts +62 -0
  149. package/build/module/lib/grpc/scanoss/api/components/v2/scanoss-components_grpc_pb.js +128 -0
  150. package/build/module/lib/grpc/scanoss/api/components/v2/scanoss-components_pb.d.ts +1 -0
  151. package/build/module/lib/grpc/scanoss/api/components/v2/scanoss-components_pb.js +1403 -0
  152. package/build/module/lib/grpc/scanoss/api/dependencies/v2/scanoss-dependencies_grpc_pb.d.ts +42 -0
  153. package/build/module/lib/grpc/scanoss/api/dependencies/v2/scanoss-dependencies_grpc_pb.js +98 -0
  154. package/build/module/lib/grpc/scanoss/api/dependencies/v2/scanoss-dependencies_pb.d.ts +1 -0
  155. package/build/module/lib/grpc/scanoss/api/dependencies/v2/scanoss-dependencies_pb.js +1197 -0
  156. package/build/module/lib/grpc/scanoss/api/scanning/v2/scanoss-scanning_grpc_pb.d.ts +21 -0
  157. package/build/module/lib/grpc/scanoss/api/scanning/v2/scanoss-scanning_grpc_pb.js +66 -0
  158. package/build/module/lib/grpc/scanoss/api/scanning/v2/scanoss-scanning_pb.d.ts +1 -0
  159. package/build/module/lib/grpc/scanoss/api/scanning/v2/scanoss-scanning_pb.js +14 -0
  160. package/build/module/lib/scanner/Dispatcher/DispatchableItem.d.ts +19 -0
  161. package/build/module/lib/scanner/Dispatcher/DispatchableItem.js +43 -0
  162. package/build/module/lib/scanner/Dispatcher/Dispatcher.d.ts +19 -0
  163. package/build/module/lib/scanner/Dispatcher/Dispatcher.js +121 -0
  164. package/build/module/lib/scanner/Dispatcher/DispatcherResponse.d.ts +12 -0
  165. package/build/module/lib/scanner/Dispatcher/DispatcherResponse.js +33 -0
  166. package/build/module/lib/scanner/Dispatcher/GlobalControllerAborter.d.ts +10 -0
  167. package/build/module/lib/scanner/Dispatcher/GlobalControllerAborter.js +28 -0
  168. package/build/module/lib/scanner/Scannable/ScannableItem.d.ts +15 -0
  169. package/build/module/lib/scanner/Scannable/ScannableItem.js +29 -0
  170. package/build/module/lib/scanner/Scanner.d.ts +46 -0
  171. package/build/module/lib/scanner/Scanner.js +288 -0
  172. package/build/module/lib/scanner/ScannerCfg.d.ts +13 -0
  173. package/build/module/lib/scanner/ScannerCfg.js +21 -0
  174. package/build/module/lib/scanner/ScannerQueue.d.ts +3 -0
  175. package/build/module/lib/scanner/ScannerQueue.js +4 -0
  176. package/build/module/lib/scanner/ScannerTypes.d.ts +39 -0
  177. package/build/module/lib/scanner/ScannerTypes.js +37 -0
  178. package/build/module/lib/scanner/WfpProvider/FingerprintPackage.d.ts +9 -0
  179. package/build/module/lib/scanner/WfpProvider/FingerprintPackage.js +30 -0
  180. package/build/module/lib/scanner/WfpProvider/FingerprintPacket.d.ts +12 -0
  181. package/build/module/lib/scanner/WfpProvider/FingerprintPacket.js +37 -0
  182. package/build/module/lib/scanner/WfpProvider/WfpCalculator/WfpCalculator.d.ts +20 -0
  183. package/build/module/lib/scanner/WfpProvider/WfpCalculator/WfpCalculator.js +330 -0
  184. package/build/module/lib/scanner/WfpProvider/WfpProvider.d.ts +32 -0
  185. package/build/module/lib/scanner/WfpProvider/WfpProvider.js +65 -0
  186. package/build/module/lib/scanner/WfpProvider/WfpProviderFactory.d.ts +6 -0
  187. package/build/module/lib/scanner/WfpProvider/WfpProviderFactory.js +12 -0
  188. package/build/module/lib/scanner/WfpProvider/WfpSplitter/WfpSplitter.d.ts +20 -0
  189. package/build/module/lib/scanner/WfpProvider/WfpSplitter/WfpSplitter.js +93 -0
  190. package/build/module/lib/scanner/Winnower/Winnower.d.ts +36 -0
  191. package/build/module/lib/scanner/Winnower/Winnower.js +411 -0
  192. package/build/module/lib/scanner/Winnower/WinnowerExtractor.d.ts +10 -0
  193. package/build/module/lib/scanner/Winnower/WinnowerExtractor.js +30 -0
  194. package/build/module/lib/scanner/Winnower/WinnowerResponse.d.ts +11 -0
  195. package/build/module/lib/scanner/Winnower/WinnowerResponse.js +31 -0
  196. package/build/module/lib/tree/File.d.ts +6 -0
  197. package/build/module/lib/tree/File.js +17 -0
  198. package/build/module/lib/tree/Folder.d.ts +10 -0
  199. package/build/module/lib/tree/Folder.js +49 -0
  200. package/build/module/lib/tree/Node.d.ts +15 -0
  201. package/build/module/lib/tree/Node.js +23 -0
  202. package/build/module/lib/tree/Tree.d.ts +19 -0
  203. package/build/module/lib/tree/Tree.js +73 -0
  204. package/package.json +121 -0
@@ -0,0 +1,334 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WfpCalculator = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const worker_threads_1 = require("worker_threads");
9
+ const ScannableItem_1 = require("../../Scannable/ScannableItem");
10
+ const ScannerCfg_1 = require("../../ScannerCfg");
11
+ const FingerprintPackage_1 = require("../FingerprintPackage");
12
+ const WfpProvider_1 = require("../WfpProvider");
13
+ const stringWorker = `
14
+ const { parentPort } = require('worker_threads');
15
+
16
+ parentPort.on('message', async (scannableItem) => {
17
+
18
+ let fingerprint;
19
+ if ( scannableItem.winnowingMode === "FULL_WINNOWING") {
20
+ fingerprint = wfp_for_content(
21
+ scannableItem.content,
22
+ scannableItem.contentSource,
23
+ scannableItem.maxSizeWfp
24
+ );
25
+ } else {
26
+ fingerprint = wfp_only_md5(
27
+ scannableItem.content,
28
+ scannableItem.contentSource
29
+ );
30
+ }
31
+
32
+ scannableItem.fingerprint = fingerprint;
33
+
34
+ parentPort.postMessage(scannableItem);
35
+ });
36
+
37
+
38
+ const crypto = require('crypto');
39
+
40
+ const isWin = process.platform === 'win32';
41
+ const pathSeparator = isWin ? String.fromCharCode(92) : '/';
42
+
43
+ // Winnowing configuration. DO NOT CHANGE.
44
+ const GRAM = 30;
45
+ const WINDOW = 64;
46
+
47
+ // ASCII characters
48
+ const ASCII_0 = 48;
49
+ const ASCII_9 = 57;
50
+ const ASCII_A = 65;
51
+ const ASCII_Z = 90;
52
+ const ASCII_a = 97;
53
+ const ASCII_z = 122;
54
+ const ASCII_LF = 10;
55
+
56
+ function normalize(byte) {
57
+ if (byte < ASCII_0 || byte > ASCII_z) {
58
+ return 0;
59
+ }
60
+ if (byte <= ASCII_9 || byte >= ASCII_a) {
61
+ return byte;
62
+ }
63
+ if (byte >= ASCII_A && byte <= ASCII_Z) {
64
+ return byte + 32;
65
+ }
66
+ return 0;
67
+ }
68
+
69
+ function min_hex_array(array) {
70
+ let min = 'ffffffff';
71
+ for (let i = 0; i < array.length; i++) {
72
+ if (array[i] < min) {
73
+ min = array[i];
74
+ }
75
+ }
76
+ return min;
77
+ }
78
+
79
+ function wfp_for_content(content, contentSource, maxSize) {
80
+ let wfp = wfp_only_md5(content, contentSource);
81
+ wfp += calc_wfp(content, maxSize);
82
+ return wfp;
83
+ }
84
+
85
+ function wfp_only_md5(contents, contentSource) {
86
+ const file_md5 = crypto.createHash('md5').update(contents).digest('hex');
87
+ let wfp = 'file=' + String(file_md5) + ',' + String(contents.length) + ',' + String(contentSource)+ String.fromCharCode(10);
88
+ return wfp;
89
+ }
90
+
91
+ function calc_wfp(contents, maxSize) {
92
+ let gram = '';
93
+ const window = [];
94
+ let normalized = 0;
95
+ let line = 1;
96
+ let min_hash = 'ffffffff';
97
+ let last_hash = 'ffffffff';
98
+ let last_line = 0;
99
+ let output = '';
100
+ let gram_crc32 = 0;
101
+ let wfp = '';
102
+
103
+ for (let i = 0; i < contents.length; i++) {
104
+ if(wfp.length > maxSize)
105
+ return wfp;
106
+
107
+ const byte = contents[i];
108
+ if (byte == ASCII_LF) {
109
+ line += 1;
110
+ normalized = 0;
111
+ } else {
112
+ normalized = normalize(byte);
113
+ }
114
+ // Is this an useful byte?
115
+ if (normalized) {
116
+ gram += String.fromCharCode(normalized);
117
+
118
+ if (gram.length >= GRAM) {
119
+ gram_crc32 = crc32c_hex(gram);
120
+ window.push(gram_crc32);
121
+
122
+ if (window.length >= WINDOW) {
123
+ min_hash = min_hex_array(window);
124
+ if (min_hash !== last_hash) {
125
+ // Hashing the hash will result in a better balanced output data set
126
+ // as it will counter the winnowing effect which selects the "minimum"
127
+ // hash in each window
128
+ const min_hash_bytes_le = parseHexString(
129
+ toLittleEndianCRCHex(min_hash)
130
+ );
131
+ const crc_hex = crc32c_for_bytes_hex(min_hash_bytes_le);
132
+
133
+ if (last_line != line) {
134
+ if (output.length > 0) {
135
+ wfp += String(output) + String.fromCharCode(10);
136
+ }
137
+ output = String(line) + '=' + String(crc_hex);
138
+ } else {
139
+ output += ',' + String(crc_hex);
140
+ }
141
+ last_line = line;
142
+ last_hash = min_hash;
143
+ }
144
+ window.shift();
145
+ }
146
+ gram = gram.slice(1);
147
+ }
148
+ }
149
+ }
150
+ if (output.length > 0) {
151
+ wfp += String(output) + String.fromCharCode(10);
152
+ }
153
+
154
+ return wfp;
155
+ }
156
+
157
+ function parseHexString(str) {
158
+ const result = [];
159
+ while (str.length >= 2) {
160
+ result.push(parseInt(str.substring(0, 2), 16));
161
+ str = str.substring(2, str.length);
162
+ }
163
+
164
+ return result;
165
+ }
166
+
167
+ /**
168
+ *
169
+ * @param {string} hex
170
+ */
171
+ function toLittleEndianCRCHex(hex) {
172
+ return (
173
+ hex.charAt(6) +
174
+ hex.charAt(7) +
175
+ hex.charAt(4) +
176
+ hex.charAt(5) +
177
+ hex.charAt(2) +
178
+ hex.charAt(3) +
179
+ hex.charAt(0) +
180
+ hex.charAt(1)
181
+ );
182
+ }
183
+
184
+ let CRC_TABLE = [];
185
+
186
+ function makeCRCTable() {
187
+ let c;
188
+ const crcTable = [];
189
+ for (let n = 0; n < 256; n++) {
190
+ c = n;
191
+ for (let k = 0; k < 8; k++) {
192
+ c = c & 1 ? 0x82f63b78 ^ (c >>> 1) : c >>> 1;
193
+ }
194
+ crcTable[n] = c;
195
+ }
196
+ return crcTable;
197
+ }
198
+
199
+ function crc32c(str) {
200
+ if (CRC_TABLE.length == 0) {
201
+ CRC_TABLE = makeCRCTable();
202
+ }
203
+ let crc = 0 ^ -1;
204
+
205
+ for (let i = 0; i < str.length; i++) {
206
+ crc = (crc >>> 8) ^ CRC_TABLE[(crc ^ str.charCodeAt(i)) & 0xff];
207
+ }
208
+
209
+ return (crc ^ -1) >>> 0;
210
+ }
211
+
212
+ function crc32c_for_bytes(bytes) {
213
+ if (CRC_TABLE.length == 0) {
214
+ CRC_TABLE = makeCRCTable();
215
+ }
216
+ let crc = 0 ^ -1;
217
+
218
+ for (let i = 0; i < bytes.length; i++) {
219
+ crc = (crc >>> 8) ^ CRC_TABLE[(crc ^ bytes[i]) & 0xff];
220
+ }
221
+
222
+ return (crc ^ -1) >>> 0;
223
+ }
224
+
225
+ function crc32c_for_bytes_hex(bytes) {
226
+ return crc32c_for_bytes(bytes).toString(16).padStart(8, '0');
227
+ }
228
+
229
+ function crc32c_hex(str) {
230
+ return crc32c(str).toString(16).padStart(8, '0');
231
+ }
232
+
233
+ `;
234
+ class WfpCalculator extends WfpProvider_1.WfpProvider {
235
+ constructor(scannerCfg = new ScannerCfg_1.ScannerCfg()) {
236
+ super();
237
+ this.scannerCfg = scannerCfg;
238
+ }
239
+ init() {
240
+ super.init();
241
+ this.continue = true;
242
+ this.fileList = [];
243
+ this.fileListIndex = 0;
244
+ }
245
+ prepareWorker() {
246
+ this.worker = new worker_threads_1.Worker(stringWorker, { eval: true });
247
+ this.worker.on('message', async (scannableItem) => {
248
+ this.fingerprintPacker(scannableItem.fingerprint);
249
+ await this.nextStepMachine();
250
+ });
251
+ }
252
+ recoveryIndex() {
253
+ // Files: contains all files winnowed but not packed yet
254
+ const files = new FingerprintPackage_1.FingerprintPackage(this.wfp, this.folderRoot).getFilesFingerprinted();
255
+ if (files.length) {
256
+ const lastFileWinnowed = files[files.length - 1];
257
+ let i = 0;
258
+ while (i <= files.length && lastFileWinnowed !== this.fileList[this.fileListIndex - i]) {
259
+ i += 1;
260
+ }
261
+ // If file already winnowed cannot be found in fileList emit an error.
262
+ if (i > files.length) {
263
+ this.sendError('Cannot recovery index on winnower');
264
+ return -1;
265
+ }
266
+ this.fileListIndex -= i;
267
+ if (this.fileList[this.fileListIndex] === lastFileWinnowed)
268
+ this.fileListIndex += 1;
269
+ }
270
+ return 0;
271
+ }
272
+ forceStopWorker() {
273
+ this.worker.removeAllListeners();
274
+ this.worker.terminate();
275
+ }
276
+ processPackedWfp(content) {
277
+ const fingerprint = new FingerprintPackage_1.FingerprintPackage(content, this.folderRoot);
278
+ this.sendFingerprint(fingerprint);
279
+ }
280
+ async getNextScannableItem() {
281
+ if (this.fileListIndex >= this.fileList.length)
282
+ return null;
283
+ const path = this.fileList[this.fileListIndex];
284
+ const contentSource = path.replace(`${this.folderRoot}`, '');
285
+ const content = await fs_1.default.promises.readFile(path);
286
+ this.fileListIndex += 1;
287
+ const scannable = new ScannableItem_1.ScannableItem(content, contentSource, this.winnowingMode, this.scannerCfg.WFP_FILE_MAX_SIZE);
288
+ return scannable;
289
+ }
290
+ async nextStepMachine() {
291
+ if (!this.continue)
292
+ return;
293
+ const scannableItem = await this.getNextScannableItem();
294
+ if (scannableItem)
295
+ this.worker.postMessage(scannableItem);
296
+ else {
297
+ this.finishWinnowing();
298
+ this.forceStopWorker();
299
+ this.sendLog('[ SCANNER ]: WFP Calculator finished...');
300
+ }
301
+ }
302
+ start(params) {
303
+ if (!params.fileList)
304
+ this.sendError('File list is required');
305
+ this.sendLog('[ SCANNER ]: WFP Calculator starting...');
306
+ this.init();
307
+ this.prepareWorker();
308
+ if (params.winnowingMode)
309
+ this.setWinnowingMode(params.winnowingMode);
310
+ this.pendingFiles = true;
311
+ this.folderRoot = params.folderRoot;
312
+ this.fileList = params.fileList;
313
+ this.nextStepMachine();
314
+ }
315
+ pause() {
316
+ this.sendLog('[ SCANNER ]: WFP Calculator paused...');
317
+ this.continue = false;
318
+ }
319
+ resume() {
320
+ this.sendLog('[ SCANNER ]: WFP Calculator resumed...');
321
+ this.continue = true;
322
+ this.recoveryIndex();
323
+ this.nextStepMachine();
324
+ }
325
+ stop() {
326
+ this.continue = false;
327
+ this.pendingFiles = false;
328
+ this.forceStopWorker();
329
+ this.prepareWorker();
330
+ this.init();
331
+ }
332
+ }
333
+ exports.WfpCalculator = WfpCalculator;
334
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ZwQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2Nhbm5lci9XZnBQcm92aWRlci9XZnBDYWxjdWxhdG9yL1dmcENhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLG1EQUF3QztBQUV4QyxpRUFBOEQ7QUFDOUQsaURBQThDO0FBRzlDLDhEQUEyRDtBQUMzRCxnREFBZ0U7QUFHaEUsTUFBTSxZQUFZLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E0TnBCLENBQUM7QUFFRixNQUFhLGFBQWMsU0FBUSx5QkFBVztJQU81QyxZQUFZLFVBQVUsR0FBRyxJQUFJLHVCQUFVLEVBQUU7UUFDdkMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSTtRQUNGLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLHVCQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxD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
@@ -0,0 +1,32 @@
1
+ /// <reference types="node" />
2
+ import { Worker } from 'worker_threads';
3
+ import { EventEmitter } from "stream";
4
+ import { ScannerCfg } from "../ScannerCfg";
5
+ import { WinnowingMode } from "../ScannerTypes";
6
+ import { FingerprintPackage } from "./FingerprintPackage";
7
+ export interface IWfpProviderInput {
8
+ wfpPath?: string;
9
+ folderRoot?: string;
10
+ fileList?: Array<string>;
11
+ winnowingMode?: WinnowingMode;
12
+ }
13
+ export declare abstract class WfpProvider extends EventEmitter {
14
+ protected wfp: string;
15
+ protected scannerCfg: ScannerCfg;
16
+ protected folderRoot: string;
17
+ protected worker: Worker;
18
+ protected pendingFiles: boolean;
19
+ protected winnowingMode: WinnowingMode;
20
+ protected init(): void;
21
+ protected fingerprintPacker(fingerprint: string): boolean;
22
+ protected finishWinnowing(): void;
23
+ protected sendFingerprint(fingerprintPackage: FingerprintPackage): void;
24
+ protected sendLog(logMsg: string): void;
25
+ protected sendError(errorMsg: string): void;
26
+ protected setWinnowingMode(mode: WinnowingMode): void;
27
+ abstract start(params: IWfpProviderInput): void;
28
+ abstract stop(): void;
29
+ abstract pause(): void;
30
+ abstract resume(): void;
31
+ hasPendingFiles(): boolean;
32
+ }
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WfpProvider = void 0;
4
+ const stream_1 = require("stream");
5
+ const ScannerTypes_1 = require("../ScannerTypes");
6
+ const FingerprintPackage_1 = require("./FingerprintPackage");
7
+ class WfpProvider extends stream_1.EventEmitter {
8
+ init() {
9
+ this.wfp = '';
10
+ this.folderRoot = '';
11
+ this.pendingFiles = false;
12
+ this.winnowingMode = ScannerTypes_1.WinnowingMode.FULL_WINNOWING;
13
+ }
14
+ // returns true if the function emitted a new fingerprint packet
15
+ fingerprintPacker(fingerprint) {
16
+ // When the fingerprint of one file is bigger than 64Kb, truncate to the last 64Kb line.
17
+ if (fingerprint.length > this.scannerCfg.WFP_FILE_MAX_SIZE) {
18
+ let truncateStringOnIndex = this.scannerCfg.WFP_FILE_MAX_SIZE;
19
+ let keepRemovingCharacters = true;
20
+ while (keepRemovingCharacters) {
21
+ if (fingerprint[truncateStringOnIndex] === '\n')
22
+ keepRemovingCharacters = false;
23
+ truncateStringOnIndex -= 1;
24
+ }
25
+ truncateStringOnIndex += 1;
26
+ // eslint-disable-next-line no-param-reassign
27
+ fingerprint = fingerprint.substring(0, truncateStringOnIndex);
28
+ // eslint-disable-next-line no-param-reassign
29
+ fingerprint += '\n';
30
+ }
31
+ if (this.wfp.length + fingerprint.length >= this.scannerCfg.WFP_FILE_MAX_SIZE) {
32
+ this.sendFingerprint(new FingerprintPackage_1.FingerprintPackage(this.wfp, this.folderRoot));
33
+ this.wfp = '';
34
+ }
35
+ this.wfp += fingerprint;
36
+ if (this.wfp !== fingerprint)
37
+ return false;
38
+ return true;
39
+ }
40
+ finishWinnowing() {
41
+ if (this.wfp.length !== 0)
42
+ this.sendFingerprint(new FingerprintPackage_1.FingerprintPackage(this.wfp, this.folderRoot));
43
+ this.pendingFiles = false;
44
+ this.emit(ScannerTypes_1.ScannerEvents.WINNOWING_FINISHED);
45
+ }
46
+ sendFingerprint(fingerprintPackage) {
47
+ this.emit(ScannerTypes_1.ScannerEvents.WINNOWING_NEW_CONTENT, fingerprintPackage);
48
+ }
49
+ sendLog(logMsg) {
50
+ this.emit(ScannerTypes_1.ScannerEvents.WINNOWER_LOG, logMsg);
51
+ }
52
+ sendError(errorMsg) {
53
+ this.emit(ScannerTypes_1.ScannerEvents.ERROR, new Error(errorMsg));
54
+ }
55
+ setWinnowingMode(mode) {
56
+ this.winnowingMode = mode;
57
+ }
58
+ hasPendingFiles() {
59
+ return this.pendingFiles;
60
+ }
61
+ }
62
+ exports.WfpProvider = WfpProvider;
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ZwUHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NjYW5uZXIvV2ZwUHJvdmlkZXIvV2ZwUHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbUNBQXNDO0FBRXRDLGtEQUE2RTtBQUM3RSw2REFBMEQ7QUFVMUQsTUFBc0IsV0FBWSxTQUFRLHFCQUFZO0lBUzFDLElBQUk7UUFDWixJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsNEJBQWEsQ0FBQyxjQUFjLENBQUM7SUFDcEQsQ0FBQztJQUVELGdFQUFnRTtJQUN0RCxpQkFBaUIsQ0FBQyxXQUFtQjtRQUM3Qyx3RkFBd0Y7UUFDeEYsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUU7WUFDMUQsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDO1lBQzlELElBQUksc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1lBQ2xDLE9BQU8sc0JBQXNCLEVBQUU7Z0JBQzdCLElBQUksV0FBVyxDQUFDLHFCQUFxQixDQUFDLEtBQUssSUFBSTtvQkFBRSxzQkFBc0IsR0FBRyxLQUFLLENBQUM7Z0JBQ2hGLHFCQUFxQixJQUFJLENBQUMsQ0FBQzthQUM1QjtZQUNELHFCQUFxQixJQUFJLENBQUMsQ0FBQztZQUMzQiw2Q0FBNkM7WUFDN0MsV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7WUFDOUQsNkNBQTZDO1lBQzdDLFdBQVcsSUFBSSxJQUFJLENBQUM7U0FDckI7UUFFRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRTtZQUM3RSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksdUNBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztTQUNmO1FBQ0QsSUFBSSxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUM7UUFFeEIsSUFBRyxJQUFJLENBQUMsR0FBRyxLQUFLLFdBQVc7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFUyxlQUFlO1FBQ3ZCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSx1Q0FBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ25HLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFHUyxlQUFlLENBQUMsa0JBQXNDO1FBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQWEsQ0FBQyxxQkFBcUIsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFUyxPQUFPLENBQUMsTUFBYztRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLDRCQUFhLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFUyxTQUFTLENBQUMsUUFBZ0I7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyw0QkFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxJQUFtQjtRQUM1QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUM1QixDQUFDO0lBUU0sZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztDQUVGO0FBNUVELGtDQTRFQyJ9
@@ -0,0 +1,6 @@
1
+ import { ScannerInput } from "../ScannerTypes";
2
+ import { WfpCalculator } from "./WfpCalculator/WfpCalculator";
3
+ import { WfpSplitter } from "./WfpSplitter/WfpSplitter";
4
+ export declare class WfpProviderFactory {
5
+ static create(scannerInput: ScannerInput): WfpCalculator | WfpSplitter;
6
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WfpProviderFactory = void 0;
4
+ const WfpCalculator_1 = require("./WfpCalculator/WfpCalculator");
5
+ const WfpSplitter_1 = require("./WfpSplitter/WfpSplitter");
6
+ class WfpProviderFactory {
7
+ static create(scannerInput) {
8
+ if (scannerInput.fileScan)
9
+ return new WfpCalculator_1.WfpCalculator();
10
+ if (scannerInput.wfpScan)
11
+ return new WfpSplitter_1.WfpSplitter();
12
+ return null;
13
+ }
14
+ }
15
+ exports.WfpProviderFactory = WfpProviderFactory;
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ZwUHJvdmlkZXJGYWN0b3J5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9zY2FubmVyL1dmcFByb3ZpZGVyL1dmcFByb3ZpZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxpRUFBOEQ7QUFDOUQsMkRBQXdEO0FBRXhELE1BQWEsa0JBQWtCO0lBRTdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBMEI7UUFDdEMsSUFBSSxZQUFZLENBQUMsUUFBUTtZQUFFLE9BQU8sSUFBSSw2QkFBYSxFQUFFLENBQUM7UUFDdEQsSUFBSSxZQUFZLENBQUMsT0FBTztZQUFFLE9BQU8sSUFBSSx5QkFBVyxFQUFFLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBSUY7QUFWRCxnREFVQyJ9
@@ -0,0 +1,20 @@
1
+ import { IWfpProviderInput, WfpProvider } from "../WfpProvider";
2
+ import { ScannerCfg } from "../../ScannerCfg";
3
+ export declare class WfpSplitter extends WfpProvider {
4
+ private continue;
5
+ private wfpStream;
6
+ private chunkDataRead;
7
+ private fingerprints;
8
+ private fingerprintIndex;
9
+ private timer;
10
+ constructor(scannerCfg?: ScannerCfg);
11
+ start(params: IWfpProviderInput): void;
12
+ stop(): void;
13
+ pause(): void;
14
+ resume(): void;
15
+ private sendFingerprints;
16
+ private stopSendFingerprints;
17
+ private streamBufferFlush;
18
+ private setStreamListeners;
19
+ private splitFingerprints;
20
+ }
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WfpSplitter = void 0;
7
+ const WfpProvider_1 = require("../WfpProvider");
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const ScannerCfg_1 = require("../../ScannerCfg");
10
+ class WfpSplitter extends WfpProvider_1.WfpProvider {
11
+ constructor(scannerCfg = new ScannerCfg_1.ScannerCfg()) {
12
+ super();
13
+ this.scannerCfg = scannerCfg;
14
+ }
15
+ start(params) {
16
+ this.sendLog('[ SCANNER ]: WFP Splitter starting...');
17
+ this.init();
18
+ this.pendingFiles = true;
19
+ this.chunkDataRead = '';
20
+ this.fingerprints = [];
21
+ this.continue = true;
22
+ this.fingerprintIndex = 0;
23
+ const wfpPath = params.wfpPath;
24
+ if (!wfpPath)
25
+ this.sendError('WFP path is not defined');
26
+ this.wfpStream = fs_1.default.createReadStream(wfpPath, { encoding: 'utf8' });
27
+ this.setStreamListeners();
28
+ }
29
+ stop() {
30
+ this.continue = false;
31
+ }
32
+ pause() {
33
+ this.sendLog('[ SCANNER ]: WFP Splitter paused...');
34
+ this.continue = false;
35
+ }
36
+ resume() {
37
+ this.sendLog('[ SCANNER ]: WFP Splitter resumed...');
38
+ this.continue = true;
39
+ this.sendFingerprints();
40
+ this.streamBufferFlush();
41
+ }
42
+ sendFingerprints() {
43
+ if (this.timer === undefined) {
44
+ this.timer = setInterval(() => {
45
+ if (this.fingerprintIndex < this.fingerprints.length && this.continue) {
46
+ this.fingerprintPacker(this.fingerprints[this.fingerprintIndex]);
47
+ this.fingerprintIndex++;
48
+ }
49
+ else {
50
+ this.stopSendFingerprints();
51
+ }
52
+ });
53
+ }
54
+ }
55
+ stopSendFingerprints() {
56
+ clearInterval(this.timer);
57
+ this.timer = undefined;
58
+ if (this.fingerprintIndex === this.fingerprints.length) {
59
+ this.finishWinnowing();
60
+ this.sendLog('[ SCANNER ]: WFP Splitter finished...');
61
+ }
62
+ }
63
+ streamBufferFlush() {
64
+ // Use a loop to make sure we read all currently available data
65
+ while (this.continue && null !== (this.chunkDataRead = this.wfpStream.read(1 * 1024 * 1024))) { // Read chunks of 1MB
66
+ // Extract the first portion of the chunk until the first file=
67
+ // Then append the chunk to the last fingerprint.
68
+ if (!this.chunkDataRead.startsWith('file=')) {
69
+ const chunkOfData = this.chunkDataRead.substring(0, this.chunkDataRead.indexOf('file='));
70
+ this.fingerprints[this.fingerprints.length - 1] += chunkOfData;
71
+ }
72
+ this.fingerprints = [...this.fingerprints, ...this.splitFingerprints(this.chunkDataRead)];
73
+ this.sendFingerprints();
74
+ }
75
+ }
76
+ setStreamListeners() {
77
+ this.wfpStream.on('readable', () => {
78
+ this.streamBufferFlush();
79
+ });
80
+ this.wfpStream.on('end', () => { });
81
+ }
82
+ splitFingerprints(chunkOfData) {
83
+ const reg = /file=/g;
84
+ const blocksIndex = [...((chunkOfData).matchAll(reg))].map(x => x.index);
85
+ const fingerprints = [];
86
+ for (let i = 0; i < blocksIndex.length; i++) {
87
+ const fingerprint = chunkOfData.substring(blocksIndex[i], blocksIndex[i + 1]);
88
+ fingerprints.push(fingerprint);
89
+ }
90
+ return fingerprints;
91
+ }
92
+ }
93
+ exports.WfpSplitter = WfpSplitter;
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ZwU3BsaXR0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NjYW5uZXIvV2ZwUHJvdmlkZXIvV2ZwU3BsaXR0ZXIvV2ZwU3BsaXR0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0RBQWdFO0FBQ2hFLDRDQUFvQjtBQUNwQixpREFBOEM7QUFHOUMsTUFBYSxXQUFZLFNBQVEseUJBQVc7SUFjMUMsWUFBWSxVQUFVLEdBQUcsSUFBSSx1QkFBVSxFQUFFO1FBQ3ZDLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUF5QjtRQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFFdEQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztRQUMxQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBRXhELElBQUksQ0FBQyxTQUFTLEdBQUcsWUFBRSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTSxJQUFJO1FBQ1QsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7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
@@ -0,0 +1,36 @@
1
+ /// <reference types="node" />
2
+ import EventEmitter from 'events';
3
+ import { ScannableItem } from '../Scannable/ScannableItem';
4
+ import { ScannerCfg } from '../ScannerCfg';
5
+ import { ScannerInput, WinnowingMode } from '../ScannerTypes';
6
+ export declare class Winnower extends EventEmitter {
7
+ private scannerCfg;
8
+ private fileList;
9
+ private fileListIndex;
10
+ private folderRoot;
11
+ private wfp;
12
+ private worker;
13
+ private continue;
14
+ private isRunning;
15
+ private winnowingMode;
16
+ private readingFromFile;
17
+ private winnowingExtractor;
18
+ constructor(scannerCfg?: ScannerCfg);
19
+ init(): void;
20
+ prepareWorker(): void;
21
+ recoveryIndex(): 0 | -1;
22
+ forceStopWorker(): void;
23
+ private winnowerPacker;
24
+ processPackedWfp(content: any): void;
25
+ getNextScannableItem(): Promise<ScannableItem>;
26
+ nextStepMachine(): Promise<void>;
27
+ startWinnowingFromFile(filePath: string): void;
28
+ private extractionProcess;
29
+ startWinnowing(scanInput: ScannerInput): Promise<void>;
30
+ private finishWinnowing;
31
+ pause(): void;
32
+ resume(): void;
33
+ stop(): void;
34
+ hasPendingFiles(): boolean;
35
+ setWinnowingMode(mode: WinnowingMode): void;
36
+ }