scanoss 0.2.21 → 0.2.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cspell.json +3 -1
- package/build/main/bin/cli-bin.js +11 -4
- package/build/main/commands/fingerprint.d.ts +1 -0
- package/build/main/commands/fingerprint.js +49 -0
- package/build/main/commands/scan.js +4 -5
- package/build/main/index.d.ts +1 -0
- package/build/main/index.js +2 -1
- package/build/main/lib/dependencies/DependencyScanner.d.ts +1 -0
- package/build/main/lib/dependencies/DependencyScanner.js +18 -4
- package/build/main/lib/dependencies/LocalDependency/DependencyTypes.d.ts +1 -1
- package/build/main/lib/dependencies/LocalDependency/parsers/npmParser.js +3 -3
- package/build/main/lib/dependencies/LocalDependency/parsers/pyParser.js +7 -3
- package/build/main/lib/grpc/GrpcDependencyService.js +1 -2
- package/build/main/lib/scanner/Dispatcher/DispatchableItem.d.ts +4 -4
- package/build/main/lib/scanner/Dispatcher/DispatchableItem.js +5 -5
- package/build/main/lib/scanner/Scanner.d.ts +17 -19
- package/build/main/lib/scanner/Scanner.js +44 -33
- package/build/main/lib/scanner/ScannerCfg.js +3 -3
- package/build/main/lib/scanner/ScannerTypes.d.ts +1 -0
- package/build/main/lib/scanner/ScannerTypes.js +1 -1
- package/build/main/lib/scanner/WfpProvider/FingerprintPacket.d.ts +12 -0
- package/build/main/lib/scanner/WfpProvider/FingerprintPacket.js +38 -0
- package/build/main/lib/scanner/WfpProvider/WfpCalculator/WfpCalculator.d.ts +20 -0
- package/build/main/lib/scanner/WfpProvider/WfpCalculator/WfpCalculator.js +334 -0
- package/build/main/lib/scanner/WfpProvider/WfpProvider.d.ts +32 -0
- package/build/main/lib/scanner/WfpProvider/WfpProvider.js +63 -0
- package/build/main/lib/scanner/WfpProvider/WfpSplitter/WfpSplitter.d.ts +20 -0
- package/build/main/lib/scanner/WfpProvider/WfpSplitter/WfpSplitter.js +94 -0
- package/build/main/lib/scanner/Winnower/WinnowerExtractor.js +1 -1
- package/build/module/bin/cli-bin.js +11 -4
- package/build/module/commands/fingerprint.d.ts +1 -0
- package/build/module/commands/fingerprint.js +42 -0
- package/build/module/commands/scan.js +4 -5
- package/build/module/index.d.ts +1 -0
- package/build/module/index.js +2 -1
- package/build/module/lib/dependencies/DependencyScanner.d.ts +1 -0
- package/build/module/lib/dependencies/DependencyScanner.js +18 -4
- package/build/module/lib/dependencies/LocalDependency/DependencyTypes.d.ts +1 -1
- package/build/module/lib/dependencies/LocalDependency/parsers/npmParser.js +3 -3
- package/build/module/lib/dependencies/LocalDependency/parsers/pyParser.js +7 -3
- package/build/module/lib/grpc/GrpcDependencyService.js +1 -2
- package/build/module/lib/scanner/Dispatcher/DispatchableItem.d.ts +4 -4
- package/build/module/lib/scanner/Dispatcher/DispatchableItem.js +6 -6
- package/build/module/lib/scanner/Scanner.d.ts +17 -19
- package/build/module/lib/scanner/Scanner.js +50 -39
- package/build/module/lib/scanner/ScannerCfg.js +3 -3
- package/build/module/lib/scanner/ScannerTypes.d.ts +1 -0
- package/build/module/lib/scanner/ScannerTypes.js +1 -1
- package/build/module/lib/scanner/WfpProvider/FingerprintPacket.d.ts +12 -0
- package/build/module/lib/scanner/WfpProvider/FingerprintPacket.js +37 -0
- package/build/module/lib/scanner/WfpProvider/WfpCalculator/WfpCalculator.d.ts +20 -0
- package/build/module/lib/scanner/WfpProvider/WfpCalculator/WfpCalculator.js +330 -0
- package/build/module/lib/scanner/WfpProvider/WfpProvider.d.ts +32 -0
- package/build/module/lib/scanner/WfpProvider/WfpProvider.js +65 -0
- package/build/module/lib/scanner/WfpProvider/WfpSplitter/WfpSplitter.d.ts +20 -0
- package/build/module/lib/scanner/WfpProvider/WfpSplitter/WfpSplitter.js +93 -0
- package/build/module/lib/scanner/Winnower/WinnowerExtractor.js +1 -1
- package/build/tsconfig.module.tsbuildinfo +1 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package-lock.json +18588 -0
- package/package.json +1 -1
- package/src/bin/cli-bin.ts +11 -4
- package/src/commands/fingerprint.ts +55 -0
- package/src/commands/scan.ts +3 -3
- package/src/index.js +1 -0
- package/src/index.ts +1 -0
- package/src/lib/dependencies/DependencyScanner.ts +21 -3
- package/src/lib/dependencies/LocalDependency/DependencyTypes.ts +1 -1
- package/src/lib/dependencies/LocalDependency/parsers/npmParser.ts +2 -2
- package/src/lib/dependencies/LocalDependency/parsers/pyParser.ts +5 -2
- package/src/lib/grpc/GrpcDependencyService.ts +0 -1
- package/src/lib/scanner/Dispatcher/DispatchableItem.ts +7 -8
- package/src/lib/scanner/Scanner.ts +64 -53
- package/src/lib/scanner/ScannerCfg.ts +2 -2
- package/src/lib/scanner/ScannerTypes.ts +1 -0
- package/src/lib/scanner/{Winnower/WinnowerResponse.ts → WfpProvider/FingerprintPacket.ts} +11 -5
- package/src/lib/scanner/{Winnower/Winnower.ts → WfpProvider/WfpCalculator/WfpCalculator.ts} +32 -119
- package/src/lib/scanner/WfpProvider/WfpProvider.ts +91 -0
- package/src/lib/scanner/WfpProvider/WfpSplitter/WfpSplitter.ts +120 -0
- package/src/lib/scanner/Winnower/WinnowerExtractor.ts +0 -1
- package/yarn.lock +5289 -5202
|
@@ -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 FingerprintPacket_1 = require("../FingerprintPacket");
|
|
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 FingerprintPacket_1.FingerprintPacket(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 FingerprintPacket_1.FingerprintPacket(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ZwQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2Nhbm5lci9XZnBQcm92aWRlci9XZnBDYWxjdWxhdG9yL1dmcENhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNENBQW9CO0FBQ3BCLG1EQUF3QztBQUV4QyxpRUFBOEQ7QUFDOUQsaURBQThDO0FBRzlDLDREQUF5RDtBQUN6RCxnREFBZ0U7QUFHaEUsTUFBTSxZQUFZLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E0TnBCLENBQUM7QUFFRixNQUFhLGFBQWMsU0FBUSx5QkFBVztJQU81QyxZQUFZLFVBQVUsR0FBRyxJQUFJLHVCQUFVLEVBQUU7UUFDdkMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBSTtRQUNGLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLHVCQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsRUFBRTtZQUNoRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xELE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELGFBQWE7UUFDWCx3REFBd0Q7UUFDeEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxxQ0FBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3ZGLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNoQixNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksZ0JBQWdCLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUN0RixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ1I7WUFDRCxzRUFBc0U7WUFDdEUsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRTtnQkFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO2dCQUNwRCxPQUFPLENBQUMsQ0FBQyxDQUFDO2FBQ1g7WUFDRCxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQztZQUN4QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLGdCQUFnQjtnQkFBRSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsQ0FBQztTQUNyRjtRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRVMsZ0JBQWdCLENBQUMsT0FBTztRQUNoQyxNQUFNLFdBQVcsR0FBRyxJQUFJLHFDQUFpQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsS0FBSyxDQUFDLG9CQUFvQjtRQUN4QixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDNUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDL0MsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3RCxNQUFNLE9BQU8sR0FBRyxNQUFNLFlBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sU0FBUyxHQUFHLElBQUksNkJBQWEsQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ25ILE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZTtRQUNuQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxPQUFPO1FBQzNCLE1BQU0sYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDeEQsSUFBSSxhQUFhO1lBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDckQ7WUFDSCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMseUNBQXlDLENBQUMsQ0FBQztTQUV6RDtJQUNILENBQUM7SUFHTSxLQUFLLENBQUMsTUFBeUI7UUFFcEMsSUFBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRO1lBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxPQUFPLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUV4RCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDWixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFckIsSUFBRyxNQUFNLENBQUMsYUFBYTtZQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUtNLEtBQUs7UUFDVixJQUFJLENBQUMsT0FBTyxDQUFDLHVDQUF1QyxDQUFDLENBQUE7UUFDckQsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQUVNLE1BQU07UUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxDQUFDLENBQUE7UUFDdEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU0sSUFBSTtRQUNULElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztDQUVGO0FBdEhELHNDQXNIQyJ9
|
|
@@ -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 { FingerprintPacket } from "./FingerprintPacket";
|
|
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(fingerprintPacket: FingerprintPacket): 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 FingerprintPacket_1 = require("./FingerprintPacket");
|
|
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 FingerprintPacket_1.FingerprintPacket(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 FingerprintPacket_1.FingerprintPacket(this.wfp, this.folderRoot));
|
|
43
|
+
this.pendingFiles = false;
|
|
44
|
+
this.emit(ScannerTypes_1.ScannerEvents.WINNOWING_FINISHED);
|
|
45
|
+
}
|
|
46
|
+
sendFingerprint(fingerprintPacket) {
|
|
47
|
+
this.emit(ScannerTypes_1.ScannerEvents.WINNOWING_NEW_CONTENT, fingerprintPacket);
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ZwUHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NjYW5uZXIvV2ZwUHJvdmlkZXIvV2ZwUHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbUNBQXNDO0FBRXRDLGtEQUE2RTtBQUM3RSwyREFBd0Q7QUFVeEQsTUFBc0IsV0FBWSxTQUFRLHFCQUFZO0lBUzFDLElBQUk7UUFDWixJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLEdBQUcsNEJBQWEsQ0FBQyxjQUFjLENBQUM7SUFDcEQsQ0FBQztJQUVELGdFQUFnRTtJQUN0RCxpQkFBaUIsQ0FBQyxXQUFtQjtRQUM3Qyx3RkFBd0Y7UUFDeEYsSUFBSSxXQUFXLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUU7WUFDMUQsSUFBSSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDO1lBQzlELElBQUksc0JBQXNCLEdBQUcsSUFBSSxDQUFDO1lBQ2xDLE9BQU8sc0JBQXNCLEVBQUU7Z0JBQzdCLElBQUksV0FBVyxDQUFDLHFCQUFxQixDQUFDLEtBQUssSUFBSTtvQkFBRSxzQkFBc0IsR0FBRyxLQUFLLENBQUM7Z0JBQ2hGLHFCQUFxQixJQUFJLENBQUMsQ0FBQzthQUM1QjtZQUNELHFCQUFxQixJQUFJLENBQUMsQ0FBQztZQUMzQiw2Q0FBNkM7WUFDN0MsV0FBVyxHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7WUFDOUQsNkNBQTZDO1lBQzdDLFdBQVcsSUFBSSxJQUFJLENBQUM7U0FDckI7UUFFRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRTtZQUM3RSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUkscUNBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUN2RSxJQUFJLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQztTQUNmO1FBQ0QsSUFBSSxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUM7UUFFeEIsSUFBRyxJQUFJLENBQUMsR0FBRyxLQUFLLFdBQVc7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFUyxlQUFlO1FBQ3ZCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxxQ0FBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ2xHLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFHUyxlQUFlLENBQUMsaUJBQW9DO1FBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQWEsQ0FBQyxxQkFBcUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFUyxPQUFPLENBQUMsTUFBYztRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLDRCQUFhLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFUyxTQUFTLENBQUMsUUFBZ0I7UUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyw0QkFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFUyxnQkFBZ0IsQ0FBQyxJQUFtQjtRQUM1QyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUM1QixDQUFDO0lBUU0sZUFBZTtRQUNwQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztDQUVGO0FBNUVELGtDQTRFQyJ9
|
|
@@ -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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
|
|
@@ -30,4 +30,4 @@ class WinnowerExtractor {
|
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
exports.WinnowerExtractor = WinnowerExtractor;
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
33
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2lubm93ZXJFeHRyYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NjYW5uZXIvV2lubm93ZXIvV2lubm93ZXJFeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNENBQW9CO0FBRXBCLE1BQWEsaUJBQWlCO0lBVTVCO1FBQ0UsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVPLElBQUk7UUFDVixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRU0sUUFBUSxDQUFDLElBQVk7UUFDMUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLFlBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFBQSxDQUFDO0lBRUssZUFBZTtRQUNwQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUMsQ0FBQztZQUMvQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0csSUFBSSxDQUFDLFlBQVksSUFBRSxDQUFDLENBQUM7UUFDckIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0Y7QUFsQ0QsOENBa0NDIn0=
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { program } from 'commander';
|
|
3
3
|
import { depHandler } from '../commands/dep';
|
|
4
|
+
import { fingerprintHandler } from '../commands/fingerprint';
|
|
4
5
|
import { scanHandler } from '../commands/scan';
|
|
5
6
|
function CLIErrorHandler(e) {
|
|
6
7
|
console.error(' ');
|
|
@@ -9,14 +10,14 @@ function CLIErrorHandler(e) {
|
|
|
9
10
|
}
|
|
10
11
|
async function main() {
|
|
11
12
|
program
|
|
12
|
-
.version("0.2.
|
|
13
|
+
.version("0.2.24")
|
|
13
14
|
.description('The SCANOSS JS package provides a simple, easy to consume module for interacting with SCANOSS APIs/Engine.');
|
|
14
15
|
program
|
|
15
16
|
.command('scan <source>')
|
|
16
17
|
.description('Scan a folder/file')
|
|
17
|
-
|
|
18
|
+
.option('-w, --wfp', 'Scan a .wfp file instead of a folder')
|
|
18
19
|
.option('-c, --concurrency <number>', 'Number of concurrent connections to use while scanning (optional -default 10)')
|
|
19
|
-
.option('--filter <path>', 'Loads an user defined filter (optional)')
|
|
20
|
+
.option('-f, --filter <path>', 'Loads an user defined filter (optional)')
|
|
20
21
|
.option('-o, --output <filename>', 'Output result file name (optional - default stdout)')
|
|
21
22
|
.option('-F, --flags <flags>', 'Scanning engine flags (1: disable snippet matching, 2 enable snippet ids, 4: disable dependencies, 8: disable licenses, 16: disable copyrights,32: disable vulnerabilities, 64: disable quality, 128: disable cryptography,256: disable best match, 512: Report identified files)')
|
|
22
23
|
.option('-P, --post-size <postsize>', 'Number of kilobytes to limit the post to while scanning (optional - default 64)')
|
|
@@ -36,6 +37,12 @@ async function main() {
|
|
|
36
37
|
.option('-a, --grpc-host <host>', 'SCANOSS GRPC HOST (optional - default: scanoss.com)')
|
|
37
38
|
.option('-p, --grpc-port <port>', 'SCANOSS GRPC PORT (optional - default: 443)')
|
|
38
39
|
.action((source, options) => { depHandler(source, options).catch((e) => { CLIErrorHandler(e); }); });
|
|
40
|
+
program
|
|
41
|
+
.command('fingerprint <source>')
|
|
42
|
+
.description('Generates fingerprints for a folder/file')
|
|
43
|
+
.option('-o, --output <filename>', 'Output result file name (optional - default stdout)')
|
|
44
|
+
.option('-p, --block-size <size>', 'Maximum size in Kb for each fingerprint block (optional - default 64Kb)')
|
|
45
|
+
.action((source, options) => { fingerprintHandler(source, options).catch((e) => { CLIErrorHandler(e); }); });
|
|
39
46
|
await program.parseAsync(process.argv);
|
|
40
47
|
}
|
|
41
48
|
try {
|
|
@@ -45,4 +52,4 @@ catch (e) {
|
|
|
45
52
|
console.error(e);
|
|
46
53
|
process.exit(1);
|
|
47
54
|
}
|
|
48
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWJpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9iaW4vY2xpLWJpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9DLFNBQVMsZUFBZSxDQUFDLENBQVE7SUFDL0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQztBQUtELEtBQUssVUFBVSxJQUFJO0lBQ2pCLE9BQU87U0FDSixPQUFPLENBQUMsUUFBUSxDQUFDO1NBQ2pCLFdBQVcsQ0FBQyw0R0FBNEcsQ0FBQyxDQUFBO0lBRTVILE9BQU87U0FDSixPQUFPLENBQUMsZUFBZSxDQUFDO1NBQ3hCLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQztTQUNqQyxNQUFNLENBQUMsV0FBVyxFQUFFLHNDQUFzQyxDQUFDO1NBQzNELE1BQU0sQ0FBQyw0QkFBNEIsRUFBRSwrRUFBK0UsQ0FBQztTQUNySCxNQUFNLENBQUMscUJBQXFCLEVBQUUseUNBQXlDLENBQUM7U0FDeEUsTUFBTSxDQUFDLHlCQUF5QixFQUFFLHFEQUFxRCxDQUFDO1NBQ3hGLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRSxtUkFBbVIsQ0FBQztTQUNsVCxNQUFNLENBQUMsNEJBQTRCLEVBQUUsaUZBQWlGLENBQUM7U0FDdkgsTUFBTSxDQUFDLHlCQUF5QixFQUFFLDJEQUEyRCxDQUFDO1NBQzlGLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxvRUFBb0UsQ0FBQztTQUN2RyxNQUFNLENBQUMsdUJBQXVCLEVBQUUseUVBQXlFLENBQUM7U0FDMUcsTUFBTSxDQUFDLGlCQUFpQixFQUFFLHVFQUF1RSxDQUFDO1NBQ2xHLE1BQU0sQ0FBQyxlQUFlLEVBQUUsOEJBQThCLENBQUM7U0FDdkQsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLEdBQUUsV0FBVyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQSxDQUFBLENBQUMsQ0FBQyxDQUFBLENBQUEsQ0FBQyxDQUFDO1NBQzlGLFdBQVcsQ0FBQyxPQUFPLEVBQUU7OzBEQUVnQyxDQUNyRCxDQUFDO0lBRUYsT0FBTztTQUNOLE9BQU8sQ0FBQyxjQUFjLENBQUM7U0FDdkIsV0FBVyxDQUFDLGdDQUFnQyxDQUFDO1NBQzdDLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxxREFBcUQsQ0FBQztTQUN4RixNQUFNLENBQUMsd0JBQXdCLEVBQUUscURBQXFELENBQUM7U0FDdkYsTUFBTSxDQUFDLHdCQUF3QixFQUFFLDhDQUE4QyxDQUFDO1NBQ2hGLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsRUFBRSxHQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUEsQ0FBQSxDQUFDLENBQUMsQ0FBQSxDQUFBLENBQUMsQ0FBQyxDQUFBO0lBRTlGLE9BQU87U0FDTixPQUFPLENBQUMsc0JBQXNCLENBQUM7U0FDL0IsV0FBVyxDQUFDLDBDQUEwQyxDQUFDO1NBQ3ZELE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxxREFBcUQsQ0FBQztTQUN4RixNQUFNLENBQUMseUJBQXlCLEVBQUUseUVBQXlFLENBQUM7U0FDNUcsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLEdBQUUsa0JBQWtCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFBLENBQUEsQ0FBQyxDQUFDLENBQUEsQ0FBQSxDQUFDLENBQUMsQ0FBQTtJQUV0RyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzNDLENBQUM7QUFHRCxJQUFJO0lBQ0YsSUFBSSxFQUFFLENBQUM7Q0FDUjtBQUFDLE9BQU8sQ0FBQyxFQUFFO0lBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ2pCIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function fingerprintHandler(rootPath: string, options: any): Promise<void>;
|