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.
- package/CHANGELOG.md +21 -0
- package/LICENSE +23 -0
- package/README.md +98 -0
- package/build/main/bin/cli-bin.d.ts +2 -0
- package/build/main/bin/cli-bin.js +58 -0
- package/build/main/commands/dep.d.ts +1 -0
- package/build/main/commands/dep.js +38 -0
- package/build/main/commands/fingerprint.d.ts +1 -0
- package/build/main/commands/fingerprint.js +49 -0
- package/build/main/commands/helpers.d.ts +1 -0
- package/build/main/commands/helpers.js +22 -0
- package/build/main/commands/scan.d.ts +1 -0
- package/build/main/commands/scan.js +91 -0
- package/build/main/index.d.ts +7 -0
- package/build/main/index.js +20 -0
- package/build/main/lib/dependencies/DependencyScanner.d.ts +11 -0
- package/build/main/lib/dependencies/DependencyScanner.js +94 -0
- package/build/main/lib/dependencies/DependencyScannerCfg.d.ts +4 -0
- package/build/main/lib/dependencies/DependencyScannerCfg.js +11 -0
- package/build/main/lib/dependencies/DependencyTypes.d.ts +21 -0
- package/build/main/lib/dependencies/DependencyTypes.js +3 -0
- package/build/main/lib/dependencies/LocalDependency/DependencyTypes.d.ts +16 -0
- package/build/main/lib/dependencies/LocalDependency/DependencyTypes.js +3 -0
- package/build/main/lib/dependencies/LocalDependency/LocalDependency.d.ts +6 -0
- package/build/main/lib/dependencies/LocalDependency/LocalDependency.js +51 -0
- package/build/main/lib/dependencies/LocalDependency/parsers/golangParser.d.ts +2 -0
- package/build/main/lib/dependencies/LocalDependency/parsers/golangParser.js +63 -0
- package/build/main/lib/dependencies/LocalDependency/parsers/mavenParser.d.ts +2 -0
- package/build/main/lib/dependencies/LocalDependency/parsers/mavenParser.js +173 -0
- package/build/main/lib/dependencies/LocalDependency/parsers/npmParser.d.ts +3 -0
- package/build/main/lib/dependencies/LocalDependency/parsers/npmParser.js +50 -0
- package/build/main/lib/dependencies/LocalDependency/parsers/pyParser.d.ts +2 -0
- package/build/main/lib/dependencies/LocalDependency/parsers/pyParser.js +65 -0
- package/build/main/lib/dependencies/LocalDependency/parsers/rubyParser.d.ts +3 -0
- package/build/main/lib/dependencies/LocalDependency/parsers/rubyParser.js +133 -0
- package/build/main/lib/dependencies/LocalDependency/parsers/utils.d.ts +2 -0
- package/build/main/lib/dependencies/LocalDependency/parsers/utils.js +20 -0
- package/build/main/lib/filters/defaultFilter.d.ts +16 -0
- package/build/main/lib/filters/defaultFilter.js +195 -0
- package/build/main/lib/filters/filtering.d.ts +32 -0
- package/build/main/lib/filters/filtering.js +229 -0
- package/build/main/lib/grpc/GrpcDependencyService.d.ts +11 -0
- package/build/main/lib/grpc/GrpcDependencyService.js +87 -0
- package/build/main/lib/grpc/scanoss/api/common/v2/scanoss-common_grpc_pb.d.ts +0 -0
- package/build/main/lib/grpc/scanoss/api/common/v2/scanoss-common_grpc_pb.js +2 -0
- package/build/main/lib/grpc/scanoss/api/common/v2/scanoss-common_pb.d.ts +1 -0
- package/build/main/lib/grpc/scanoss/api/common/v2/scanoss-common_pb.js +404 -0
- package/build/main/lib/grpc/scanoss/api/components/v2/scanoss-components_grpc_pb.d.ts +62 -0
- package/build/main/lib/grpc/scanoss/api/components/v2/scanoss-components_grpc_pb.js +128 -0
- package/build/main/lib/grpc/scanoss/api/components/v2/scanoss-components_pb.d.ts +1 -0
- package/build/main/lib/grpc/scanoss/api/components/v2/scanoss-components_pb.js +1403 -0
- package/build/main/lib/grpc/scanoss/api/dependencies/v2/scanoss-dependencies_grpc_pb.d.ts +42 -0
- package/build/main/lib/grpc/scanoss/api/dependencies/v2/scanoss-dependencies_grpc_pb.js +98 -0
- package/build/main/lib/grpc/scanoss/api/dependencies/v2/scanoss-dependencies_pb.d.ts +1 -0
- package/build/main/lib/grpc/scanoss/api/dependencies/v2/scanoss-dependencies_pb.js +1197 -0
- package/build/main/lib/grpc/scanoss/api/scanning/v2/scanoss-scanning_grpc_pb.d.ts +21 -0
- package/build/main/lib/grpc/scanoss/api/scanning/v2/scanoss-scanning_grpc_pb.js +66 -0
- package/build/main/lib/grpc/scanoss/api/scanning/v2/scanoss-scanning_pb.d.ts +1 -0
- package/build/main/lib/grpc/scanoss/api/scanning/v2/scanoss-scanning_pb.js +14 -0
- package/build/main/lib/scanner/Dispatcher/DispatchableItem.d.ts +19 -0
- package/build/main/lib/scanner/Dispatcher/DispatchableItem.js +44 -0
- package/build/main/lib/scanner/Dispatcher/Dispatcher.d.ts +19 -0
- package/build/main/lib/scanner/Dispatcher/Dispatcher.js +122 -0
- package/build/main/lib/scanner/Dispatcher/DispatcherResponse.d.ts +12 -0
- package/build/main/lib/scanner/Dispatcher/DispatcherResponse.js +34 -0
- package/build/main/lib/scanner/Dispatcher/GlobalControllerAborter.d.ts +10 -0
- package/build/main/lib/scanner/Dispatcher/GlobalControllerAborter.js +33 -0
- package/build/main/lib/scanner/Scannable/ScannableItem.d.ts +15 -0
- package/build/main/lib/scanner/Scannable/ScannableItem.js +28 -0
- package/build/main/lib/scanner/Scanner.d.ts +46 -0
- package/build/main/lib/scanner/Scanner.js +280 -0
- package/build/main/lib/scanner/ScannerCfg.d.ts +13 -0
- package/build/main/lib/scanner/ScannerCfg.js +27 -0
- package/build/main/lib/scanner/ScannerQueue.d.ts +3 -0
- package/build/main/lib/scanner/ScannerQueue.js +8 -0
- package/build/main/lib/scanner/ScannerTypes.d.ts +39 -0
- package/build/main/lib/scanner/ScannerTypes.js +40 -0
- package/build/main/lib/scanner/WfpProvider/FingerprintPackage.d.ts +9 -0
- package/build/main/lib/scanner/WfpProvider/FingerprintPackage.js +32 -0
- 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/WfpProviderFactory.d.ts +6 -0
- package/build/main/lib/scanner/WfpProvider/WfpProviderFactory.js +16 -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/Winnower.d.ts +36 -0
- package/build/main/lib/scanner/Winnower/Winnower.js +407 -0
- package/build/main/lib/scanner/Winnower/WinnowerExtractor.d.ts +10 -0
- package/build/main/lib/scanner/Winnower/WinnowerExtractor.js +33 -0
- package/build/main/lib/scanner/Winnower/WinnowerResponse.d.ts +11 -0
- package/build/main/lib/scanner/Winnower/WinnowerResponse.js +32 -0
- package/build/main/lib/tree/File.d.ts +6 -0
- package/build/main/lib/tree/File.js +23 -0
- package/build/main/lib/tree/Folder.d.ts +10 -0
- package/build/main/lib/tree/Folder.js +54 -0
- package/build/main/lib/tree/Node.d.ts +15 -0
- package/build/main/lib/tree/Node.js +23 -0
- package/build/main/lib/tree/Tree.d.ts +19 -0
- package/build/main/lib/tree/Tree.js +76 -0
- package/build/module/bin/cli-bin.d.ts +2 -0
- package/build/module/bin/cli-bin.js +56 -0
- package/build/module/commands/dep.d.ts +1 -0
- package/build/module/commands/dep.js +31 -0
- package/build/module/commands/fingerprint.d.ts +1 -0
- package/build/module/commands/fingerprint.js +42 -0
- package/build/module/commands/helpers.d.ts +1 -0
- package/build/module/commands/helpers.js +15 -0
- package/build/module/commands/scan.d.ts +1 -0
- package/build/module/commands/scan.js +84 -0
- package/build/module/index.d.ts +7 -0
- package/build/module/index.js +8 -0
- package/build/module/lib/dependencies/DependencyScanner.d.ts +11 -0
- package/build/module/lib/dependencies/DependencyScanner.js +92 -0
- package/build/module/lib/dependencies/DependencyScannerCfg.d.ts +4 -0
- package/build/module/lib/dependencies/DependencyScannerCfg.js +5 -0
- package/build/module/lib/dependencies/DependencyTypes.d.ts +21 -0
- package/build/module/lib/dependencies/DependencyTypes.js +2 -0
- package/build/module/lib/dependencies/LocalDependency/DependencyTypes.d.ts +16 -0
- package/build/module/lib/dependencies/LocalDependency/DependencyTypes.js +2 -0
- package/build/module/lib/dependencies/LocalDependency/LocalDependency.d.ts +6 -0
- package/build/module/lib/dependencies/LocalDependency/LocalDependency.js +45 -0
- package/build/module/lib/dependencies/LocalDependency/parsers/golangParser.d.ts +2 -0
- package/build/module/lib/dependencies/LocalDependency/parsers/golangParser.js +55 -0
- package/build/module/lib/dependencies/LocalDependency/parsers/mavenParser.d.ts +2 -0
- package/build/module/lib/dependencies/LocalDependency/parsers/mavenParser.js +166 -0
- package/build/module/lib/dependencies/LocalDependency/parsers/npmParser.d.ts +3 -0
- package/build/module/lib/dependencies/LocalDependency/parsers/npmParser.js +42 -0
- package/build/module/lib/dependencies/LocalDependency/parsers/pyParser.d.ts +2 -0
- package/build/module/lib/dependencies/LocalDependency/parsers/pyParser.js +57 -0
- package/build/module/lib/dependencies/LocalDependency/parsers/rubyParser.d.ts +3 -0
- package/build/module/lib/dependencies/LocalDependency/parsers/rubyParser.js +130 -0
- package/build/module/lib/dependencies/LocalDependency/parsers/utils.d.ts +2 -0
- package/build/module/lib/dependencies/LocalDependency/parsers/utils.js +15 -0
- package/build/module/lib/filters/defaultFilter.d.ts +16 -0
- package/build/module/lib/filters/defaultFilter.js +192 -0
- package/build/module/lib/filters/filtering.d.ts +32 -0
- package/build/module/lib/filters/filtering.js +210 -0
- package/build/module/lib/grpc/GrpcDependencyService.d.ts +11 -0
- package/build/module/lib/grpc/GrpcDependencyService.js +66 -0
- package/build/module/lib/grpc/scanoss/api/common/v2/scanoss-common_grpc_pb.d.ts +0 -0
- package/build/module/lib/grpc/scanoss/api/common/v2/scanoss-common_grpc_pb.js +2 -0
- package/build/module/lib/grpc/scanoss/api/common/v2/scanoss-common_pb.d.ts +1 -0
- package/build/module/lib/grpc/scanoss/api/common/v2/scanoss-common_pb.js +404 -0
- package/build/module/lib/grpc/scanoss/api/components/v2/scanoss-components_grpc_pb.d.ts +62 -0
- package/build/module/lib/grpc/scanoss/api/components/v2/scanoss-components_grpc_pb.js +128 -0
- package/build/module/lib/grpc/scanoss/api/components/v2/scanoss-components_pb.d.ts +1 -0
- package/build/module/lib/grpc/scanoss/api/components/v2/scanoss-components_pb.js +1403 -0
- package/build/module/lib/grpc/scanoss/api/dependencies/v2/scanoss-dependencies_grpc_pb.d.ts +42 -0
- package/build/module/lib/grpc/scanoss/api/dependencies/v2/scanoss-dependencies_grpc_pb.js +98 -0
- package/build/module/lib/grpc/scanoss/api/dependencies/v2/scanoss-dependencies_pb.d.ts +1 -0
- package/build/module/lib/grpc/scanoss/api/dependencies/v2/scanoss-dependencies_pb.js +1197 -0
- package/build/module/lib/grpc/scanoss/api/scanning/v2/scanoss-scanning_grpc_pb.d.ts +21 -0
- package/build/module/lib/grpc/scanoss/api/scanning/v2/scanoss-scanning_grpc_pb.js +66 -0
- package/build/module/lib/grpc/scanoss/api/scanning/v2/scanoss-scanning_pb.d.ts +1 -0
- package/build/module/lib/grpc/scanoss/api/scanning/v2/scanoss-scanning_pb.js +14 -0
- package/build/module/lib/scanner/Dispatcher/DispatchableItem.d.ts +19 -0
- package/build/module/lib/scanner/Dispatcher/DispatchableItem.js +43 -0
- package/build/module/lib/scanner/Dispatcher/Dispatcher.d.ts +19 -0
- package/build/module/lib/scanner/Dispatcher/Dispatcher.js +121 -0
- package/build/module/lib/scanner/Dispatcher/DispatcherResponse.d.ts +12 -0
- package/build/module/lib/scanner/Dispatcher/DispatcherResponse.js +33 -0
- package/build/module/lib/scanner/Dispatcher/GlobalControllerAborter.d.ts +10 -0
- package/build/module/lib/scanner/Dispatcher/GlobalControllerAborter.js +28 -0
- package/build/module/lib/scanner/Scannable/ScannableItem.d.ts +15 -0
- package/build/module/lib/scanner/Scannable/ScannableItem.js +29 -0
- package/build/module/lib/scanner/Scanner.d.ts +46 -0
- package/build/module/lib/scanner/Scanner.js +288 -0
- package/build/module/lib/scanner/ScannerCfg.d.ts +13 -0
- package/build/module/lib/scanner/ScannerCfg.js +21 -0
- package/build/module/lib/scanner/ScannerQueue.d.ts +3 -0
- package/build/module/lib/scanner/ScannerQueue.js +4 -0
- package/build/module/lib/scanner/ScannerTypes.d.ts +39 -0
- package/build/module/lib/scanner/ScannerTypes.js +37 -0
- package/build/module/lib/scanner/WfpProvider/FingerprintPackage.d.ts +9 -0
- package/build/module/lib/scanner/WfpProvider/FingerprintPackage.js +30 -0
- 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/WfpProviderFactory.d.ts +6 -0
- package/build/module/lib/scanner/WfpProvider/WfpProviderFactory.js +12 -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/Winnower.d.ts +36 -0
- package/build/module/lib/scanner/Winnower/Winnower.js +411 -0
- package/build/module/lib/scanner/Winnower/WinnowerExtractor.d.ts +10 -0
- package/build/module/lib/scanner/Winnower/WinnowerExtractor.js +30 -0
- package/build/module/lib/scanner/Winnower/WinnowerResponse.d.ts +11 -0
- package/build/module/lib/scanner/Winnower/WinnowerResponse.js +31 -0
- package/build/module/lib/tree/File.d.ts +6 -0
- package/build/module/lib/tree/File.js +17 -0
- package/build/module/lib/tree/Folder.d.ts +10 -0
- package/build/module/lib/tree/Folder.js +49 -0
- package/build/module/lib/tree/Node.d.ts +15 -0
- package/build/module/lib/tree/Node.js +23 -0
- package/build/module/lib/tree/Tree.d.ts +19 -0
- package/build/module/lib/tree/Tree.js +73 -0
- package/package.json +121 -0
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
import EventEmitter from 'events';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import { Worker } from 'worker_threads';
|
|
4
|
+
import { ScannableItem } from '../Scannable/ScannableItem';
|
|
5
|
+
import { ScannerCfg } from '../ScannerCfg';
|
|
6
|
+
import { ScannerEvents, WinnowingMode } from '../ScannerTypes';
|
|
7
|
+
import { WinnowerExtractor } from './WinnowerExtractor';
|
|
8
|
+
import { WinnowerResponse } from './WinnowerResponse';
|
|
9
|
+
const stringWorker = `
|
|
10
|
+
const { parentPort } = require('worker_threads');
|
|
11
|
+
|
|
12
|
+
parentPort.on('message', async (scannableItem) => {
|
|
13
|
+
|
|
14
|
+
let fingerprint;
|
|
15
|
+
if ( scannableItem.winnowingMode === "FULL_WINNOWING") {
|
|
16
|
+
fingerprint = wfp_for_content(
|
|
17
|
+
scannableItem.content,
|
|
18
|
+
scannableItem.contentSource,
|
|
19
|
+
scannableItem.maxSizeWfp
|
|
20
|
+
);
|
|
21
|
+
} else {
|
|
22
|
+
fingerprint = wfp_only_md5(
|
|
23
|
+
scannableItem.content,
|
|
24
|
+
scannableItem.contentSource
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
scannableItem.fingerprint = fingerprint;
|
|
29
|
+
|
|
30
|
+
parentPort.postMessage(scannableItem);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
const crypto = require('crypto');
|
|
35
|
+
|
|
36
|
+
const isWin = process.platform === 'win32';
|
|
37
|
+
const pathSeparator = isWin ? String.fromCharCode(92) : '/';
|
|
38
|
+
|
|
39
|
+
// Winnowing configuration. DO NOT CHANGE.
|
|
40
|
+
const GRAM = 30;
|
|
41
|
+
const WINDOW = 64;
|
|
42
|
+
|
|
43
|
+
// ASCII characters
|
|
44
|
+
const ASCII_0 = 48;
|
|
45
|
+
const ASCII_9 = 57;
|
|
46
|
+
const ASCII_A = 65;
|
|
47
|
+
const ASCII_Z = 90;
|
|
48
|
+
const ASCII_a = 97;
|
|
49
|
+
const ASCII_z = 122;
|
|
50
|
+
const ASCII_LF = 10;
|
|
51
|
+
|
|
52
|
+
function normalize(byte) {
|
|
53
|
+
if (byte < ASCII_0 || byte > ASCII_z) {
|
|
54
|
+
return 0;
|
|
55
|
+
}
|
|
56
|
+
if (byte <= ASCII_9 || byte >= ASCII_a) {
|
|
57
|
+
return byte;
|
|
58
|
+
}
|
|
59
|
+
if (byte >= ASCII_A && byte <= ASCII_Z) {
|
|
60
|
+
return byte + 32;
|
|
61
|
+
}
|
|
62
|
+
return 0;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
function min_hex_array(array) {
|
|
66
|
+
let min = 'ffffffff';
|
|
67
|
+
for (let i = 0; i < array.length; i++) {
|
|
68
|
+
if (array[i] < min) {
|
|
69
|
+
min = array[i];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return min;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function wfp_for_content(content, contentSource, maxSize) {
|
|
76
|
+
let wfp = wfp_only_md5(content, contentSource);
|
|
77
|
+
wfp += calc_wfp(content, maxSize);
|
|
78
|
+
return wfp;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function wfp_only_md5(contents, contentSource) {
|
|
82
|
+
const file_md5 = crypto.createHash('md5').update(contents).digest('hex');
|
|
83
|
+
let wfp = 'file=' + String(file_md5) + ',' + String(contents.length) + ',' + String(contentSource)+ String.fromCharCode(10);
|
|
84
|
+
return wfp;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function calc_wfp(contents, maxSize) {
|
|
88
|
+
let gram = '';
|
|
89
|
+
const window = [];
|
|
90
|
+
let normalized = 0;
|
|
91
|
+
let line = 1;
|
|
92
|
+
let min_hash = 'ffffffff';
|
|
93
|
+
let last_hash = 'ffffffff';
|
|
94
|
+
let last_line = 0;
|
|
95
|
+
let output = '';
|
|
96
|
+
let gram_crc32 = 0;
|
|
97
|
+
let wfp = '';
|
|
98
|
+
|
|
99
|
+
for (let i = 0; i < contents.length; i++) {
|
|
100
|
+
if(wfp.length > maxSize)
|
|
101
|
+
return wfp;
|
|
102
|
+
|
|
103
|
+
const byte = contents[i];
|
|
104
|
+
if (byte == ASCII_LF) {
|
|
105
|
+
line += 1;
|
|
106
|
+
normalized = 0;
|
|
107
|
+
} else {
|
|
108
|
+
normalized = normalize(byte);
|
|
109
|
+
}
|
|
110
|
+
// Is this an useful byte?
|
|
111
|
+
if (normalized) {
|
|
112
|
+
gram += String.fromCharCode(normalized);
|
|
113
|
+
|
|
114
|
+
if (gram.length >= GRAM) {
|
|
115
|
+
gram_crc32 = crc32c_hex(gram);
|
|
116
|
+
window.push(gram_crc32);
|
|
117
|
+
|
|
118
|
+
if (window.length >= WINDOW) {
|
|
119
|
+
min_hash = min_hex_array(window);
|
|
120
|
+
if (min_hash !== last_hash) {
|
|
121
|
+
// Hashing the hash will result in a better balanced output data set
|
|
122
|
+
// as it will counter the winnowing effect which selects the "minimum"
|
|
123
|
+
// hash in each window
|
|
124
|
+
const min_hash_bytes_le = parseHexString(
|
|
125
|
+
toLittleEndianCRCHex(min_hash)
|
|
126
|
+
);
|
|
127
|
+
const crc_hex = crc32c_for_bytes_hex(min_hash_bytes_le);
|
|
128
|
+
|
|
129
|
+
if (last_line != line) {
|
|
130
|
+
if (output.length > 0) {
|
|
131
|
+
wfp += String(output) + String.fromCharCode(10);
|
|
132
|
+
}
|
|
133
|
+
output = String(line) + '=' + String(crc_hex);
|
|
134
|
+
} else {
|
|
135
|
+
output += ',' + String(crc_hex);
|
|
136
|
+
}
|
|
137
|
+
last_line = line;
|
|
138
|
+
last_hash = min_hash;
|
|
139
|
+
}
|
|
140
|
+
window.shift();
|
|
141
|
+
}
|
|
142
|
+
gram = gram.slice(1);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (output.length > 0) {
|
|
147
|
+
wfp += String(output) + String.fromCharCode(10);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return wfp;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function parseHexString(str) {
|
|
154
|
+
const result = [];
|
|
155
|
+
while (str.length >= 2) {
|
|
156
|
+
result.push(parseInt(str.substring(0, 2), 16));
|
|
157
|
+
str = str.substring(2, str.length);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return result;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
*
|
|
165
|
+
* @param {string} hex
|
|
166
|
+
*/
|
|
167
|
+
function toLittleEndianCRCHex(hex) {
|
|
168
|
+
return (
|
|
169
|
+
hex.charAt(6) +
|
|
170
|
+
hex.charAt(7) +
|
|
171
|
+
hex.charAt(4) +
|
|
172
|
+
hex.charAt(5) +
|
|
173
|
+
hex.charAt(2) +
|
|
174
|
+
hex.charAt(3) +
|
|
175
|
+
hex.charAt(0) +
|
|
176
|
+
hex.charAt(1)
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
let CRC_TABLE = [];
|
|
181
|
+
|
|
182
|
+
function makeCRCTable() {
|
|
183
|
+
let c;
|
|
184
|
+
const crcTable = [];
|
|
185
|
+
for (let n = 0; n < 256; n++) {
|
|
186
|
+
c = n;
|
|
187
|
+
for (let k = 0; k < 8; k++) {
|
|
188
|
+
c = c & 1 ? 0x82f63b78 ^ (c >>> 1) : c >>> 1;
|
|
189
|
+
}
|
|
190
|
+
crcTable[n] = c;
|
|
191
|
+
}
|
|
192
|
+
return crcTable;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function crc32c(str) {
|
|
196
|
+
if (CRC_TABLE.length == 0) {
|
|
197
|
+
CRC_TABLE = makeCRCTable();
|
|
198
|
+
}
|
|
199
|
+
let crc = 0 ^ -1;
|
|
200
|
+
|
|
201
|
+
for (let i = 0; i < str.length; i++) {
|
|
202
|
+
crc = (crc >>> 8) ^ CRC_TABLE[(crc ^ str.charCodeAt(i)) & 0xff];
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return (crc ^ -1) >>> 0;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function crc32c_for_bytes(bytes) {
|
|
209
|
+
if (CRC_TABLE.length == 0) {
|
|
210
|
+
CRC_TABLE = makeCRCTable();
|
|
211
|
+
}
|
|
212
|
+
let crc = 0 ^ -1;
|
|
213
|
+
|
|
214
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
215
|
+
crc = (crc >>> 8) ^ CRC_TABLE[(crc ^ bytes[i]) & 0xff];
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
return (crc ^ -1) >>> 0;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function crc32c_for_bytes_hex(bytes) {
|
|
222
|
+
return crc32c_for_bytes(bytes).toString(16).padStart(8, '0');
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function crc32c_hex(str) {
|
|
226
|
+
return crc32c(str).toString(16).padStart(8, '0');
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
`;
|
|
230
|
+
export class Winnower extends EventEmitter {
|
|
231
|
+
scannerCfg;
|
|
232
|
+
fileList;
|
|
233
|
+
fileListIndex;
|
|
234
|
+
folderRoot;
|
|
235
|
+
wfp;
|
|
236
|
+
worker;
|
|
237
|
+
continue;
|
|
238
|
+
isRunning;
|
|
239
|
+
winnowingMode;
|
|
240
|
+
readingFromFile;
|
|
241
|
+
winnowingExtractor;
|
|
242
|
+
constructor(scannerCfg = new ScannerCfg()) {
|
|
243
|
+
super();
|
|
244
|
+
this.scannerCfg = scannerCfg;
|
|
245
|
+
}
|
|
246
|
+
init() {
|
|
247
|
+
this.wfp = '';
|
|
248
|
+
this.folderRoot = '';
|
|
249
|
+
this.continue = true;
|
|
250
|
+
this.isRunning = false;
|
|
251
|
+
this.readingFromFile = false;
|
|
252
|
+
this.fileList = [];
|
|
253
|
+
this.fileListIndex = 0;
|
|
254
|
+
this.winnowingMode = WinnowingMode.FULL_WINNOWING;
|
|
255
|
+
}
|
|
256
|
+
prepareWorker() {
|
|
257
|
+
this.worker = new Worker(stringWorker, { eval: true });
|
|
258
|
+
this.worker.on('message', async (scannableItem) => {
|
|
259
|
+
await this.winnowerPacker(scannableItem.fingerprint);
|
|
260
|
+
await this.nextStepMachine();
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
recoveryIndex() {
|
|
264
|
+
// Files: contains all files winnowed but not packed yet
|
|
265
|
+
const files = new WinnowerResponse(this.wfp, this.folderRoot).getFilesWinnowed();
|
|
266
|
+
if (files.length) {
|
|
267
|
+
const lastFileWinnowed = files[files.length - 1];
|
|
268
|
+
let i = 0;
|
|
269
|
+
while (i <= files.length && lastFileWinnowed !== this.fileList[this.fileListIndex - i]) {
|
|
270
|
+
i += 1;
|
|
271
|
+
}
|
|
272
|
+
// If file already winnowed cannot be found in fileList emit an error.
|
|
273
|
+
if (i > files.length) {
|
|
274
|
+
this.emit(ScannerEvents.ERROR, new Error('Cannot recovery index on winnower'));
|
|
275
|
+
return -1;
|
|
276
|
+
}
|
|
277
|
+
this.fileListIndex -= i;
|
|
278
|
+
if (this.fileList[this.fileListIndex] === lastFileWinnowed)
|
|
279
|
+
this.fileListIndex += 1;
|
|
280
|
+
}
|
|
281
|
+
return 0;
|
|
282
|
+
}
|
|
283
|
+
forceStopWorker() {
|
|
284
|
+
this.worker.removeAllListeners();
|
|
285
|
+
this.worker.terminate();
|
|
286
|
+
}
|
|
287
|
+
// returns true if the a winnowing packet was sended
|
|
288
|
+
winnowerPacker(winnowingResult) {
|
|
289
|
+
// When the fingerprint of one file is bigger than 64Kb, truncate to the last 64Kb line.
|
|
290
|
+
if (winnowingResult.length > this.scannerCfg.WFP_FILE_MAX_SIZE) {
|
|
291
|
+
let truncateStringOnIndex = this.scannerCfg.WFP_FILE_MAX_SIZE;
|
|
292
|
+
let keepRemovingCharacters = true;
|
|
293
|
+
while (keepRemovingCharacters) {
|
|
294
|
+
if (winnowingResult[truncateStringOnIndex] === '\n')
|
|
295
|
+
keepRemovingCharacters = false;
|
|
296
|
+
truncateStringOnIndex -= 1;
|
|
297
|
+
}
|
|
298
|
+
truncateStringOnIndex += 1;
|
|
299
|
+
// eslint-disable-next-line no-param-reassign
|
|
300
|
+
winnowingResult = winnowingResult.substring(0, truncateStringOnIndex);
|
|
301
|
+
// eslint-disable-next-line no-param-reassign
|
|
302
|
+
winnowingResult += '\n';
|
|
303
|
+
}
|
|
304
|
+
if (this.wfp.length + winnowingResult.length >= this.scannerCfg.WFP_FILE_MAX_SIZE) {
|
|
305
|
+
this.processPackedWfp(this.wfp);
|
|
306
|
+
this.wfp = '';
|
|
307
|
+
}
|
|
308
|
+
this.wfp += winnowingResult;
|
|
309
|
+
if (this.wfp !== winnowingResult)
|
|
310
|
+
return false;
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
processPackedWfp(content) {
|
|
314
|
+
const wnRsp = new WinnowerResponse(content, this.folderRoot);
|
|
315
|
+
this.emit(ScannerEvents.WINNOWING_NEW_CONTENT, wnRsp);
|
|
316
|
+
}
|
|
317
|
+
async getNextScannableItem() {
|
|
318
|
+
if (this.fileListIndex >= this.fileList.length)
|
|
319
|
+
return null;
|
|
320
|
+
const path = this.fileList[this.fileListIndex];
|
|
321
|
+
const contentSource = path.replace(`${this.folderRoot}`, '');
|
|
322
|
+
const content = await fs.promises.readFile(path);
|
|
323
|
+
this.fileListIndex += 1;
|
|
324
|
+
const scannable = new ScannableItem(content, contentSource, this.winnowingMode, this.scannerCfg.WFP_FILE_MAX_SIZE);
|
|
325
|
+
return scannable;
|
|
326
|
+
}
|
|
327
|
+
async nextStepMachine() {
|
|
328
|
+
if (!this.continue)
|
|
329
|
+
return;
|
|
330
|
+
const scannableItem = await this.getNextScannableItem();
|
|
331
|
+
if (scannableItem)
|
|
332
|
+
this.worker.postMessage(scannableItem);
|
|
333
|
+
else
|
|
334
|
+
this.finishWinnowing();
|
|
335
|
+
}
|
|
336
|
+
startWinnowingFromFile(filePath) {
|
|
337
|
+
this.emit(ScannerEvents.WINNOWER_LOG, '[ SCANNER ]: Starting Winnowing from file...');
|
|
338
|
+
this.readingFromFile = true;
|
|
339
|
+
this.isRunning = true;
|
|
340
|
+
this.winnowingExtractor = new WinnowerExtractor();
|
|
341
|
+
this.winnowingExtractor.loadFile(filePath);
|
|
342
|
+
this.extractionProcess(this.scannerCfg.DISPATCHER_QUEUE_SIZE_MAX_LIMIT);
|
|
343
|
+
}
|
|
344
|
+
async extractionProcess(n) {
|
|
345
|
+
let winBlock = '-';
|
|
346
|
+
while (winBlock !== '' && n >= 0) { // this.continue will change on method pause();
|
|
347
|
+
winBlock = this.winnowingExtractor.extractWinBlock(); // TODO Make async funcion
|
|
348
|
+
if (winBlock !== '') {
|
|
349
|
+
if (this.winnowerPacker(winBlock))
|
|
350
|
+
n -= 1;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
// Last winnowing block
|
|
354
|
+
if (winBlock === '')
|
|
355
|
+
this.finishWinnowing();
|
|
356
|
+
}
|
|
357
|
+
async startWinnowing(scanInput) {
|
|
358
|
+
this.emit(ScannerEvents.WINNOWER_LOG, '[ SCANNER ]: Starting Winnowing...');
|
|
359
|
+
this.init();
|
|
360
|
+
this.prepareWorker();
|
|
361
|
+
if (scanInput.winnowingMode)
|
|
362
|
+
this.setWinnowingMode(scanInput.winnowingMode);
|
|
363
|
+
this.readingFromFile = false;
|
|
364
|
+
this.isRunning = true;
|
|
365
|
+
this.folderRoot = scanInput.folderRoot;
|
|
366
|
+
this.fileList = scanInput.fileList;
|
|
367
|
+
this.nextStepMachine();
|
|
368
|
+
}
|
|
369
|
+
finishWinnowing() {
|
|
370
|
+
if (this.wfp.length !== 0) {
|
|
371
|
+
this.processPackedWfp(this.wfp);
|
|
372
|
+
}
|
|
373
|
+
this.isRunning = false;
|
|
374
|
+
this.emit(ScannerEvents.WINNOWER_LOG, '[ SCANNER ]: Winnowing Finished...');
|
|
375
|
+
this.forceStopWorker();
|
|
376
|
+
}
|
|
377
|
+
pause() {
|
|
378
|
+
this.emit(ScannerEvents.WINNOWER_LOG, '[ SCANNER ]: Winnowing paused...');
|
|
379
|
+
this.continue = false;
|
|
380
|
+
if (!this.readingFromFile) {
|
|
381
|
+
this.forceStopWorker();
|
|
382
|
+
this.prepareWorker();
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
resume() {
|
|
386
|
+
this.emit(ScannerEvents.WINNOWER_LOG, '[ SCANNER ]: Winnowing resumed...');
|
|
387
|
+
this.continue = true;
|
|
388
|
+
if (!this.readingFromFile) {
|
|
389
|
+
this.recoveryIndex();
|
|
390
|
+
this.nextStepMachine();
|
|
391
|
+
}
|
|
392
|
+
else {
|
|
393
|
+
this.extractionProcess(this.scannerCfg.DISPATCHER_QUEUE_SIZE_MAX_LIMIT * 2);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
stop() {
|
|
397
|
+
this.continue = false;
|
|
398
|
+
this.isRunning = false;
|
|
399
|
+
this.winnowingExtractor = null;
|
|
400
|
+
this.forceStopWorker();
|
|
401
|
+
this.prepareWorker();
|
|
402
|
+
this.init();
|
|
403
|
+
}
|
|
404
|
+
hasPendingFiles() {
|
|
405
|
+
return this.isRunning;
|
|
406
|
+
}
|
|
407
|
+
setWinnowingMode(mode) {
|
|
408
|
+
this.winnowingMode = mode;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2lubm93ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NjYW5uZXIvV2lubm93ZXIvV2lubm93ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxZQUFZLE1BQU0sUUFBUSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLElBQUksQ0FBQztBQUNwQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLGFBQWEsRUFBZ0IsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDN0UsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFJdEQsTUFBTSxZQUFZLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E0TnBCLENBQUM7QUFFRixNQUFNLE9BQU8sUUFBUyxTQUFRLFlBQVk7SUFDaEMsVUFBVSxDQUFhO0lBRXZCLFFBQVEsQ0FBTTtJQUVkLGFBQWEsQ0FBUztJQUV0QixVQUFVLENBQVM7SUFFbkIsR0FBRyxDQUFTO0lBRVosTUFBTSxDQUFTO0lBRWYsUUFBUSxDQUFVO0lBRWxCLFNBQVMsQ0FBVTtJQUVuQixhQUFhLENBQWdCO0lBRTdC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
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
export class WinnowerExtractor {
|
|
3
|
+
winnowing;
|
|
4
|
+
winnowingFilePath;
|
|
5
|
+
blocksIndex;
|
|
6
|
+
currentBlock;
|
|
7
|
+
constructor() {
|
|
8
|
+
this.init();
|
|
9
|
+
}
|
|
10
|
+
init() {
|
|
11
|
+
this.winnowing = '';
|
|
12
|
+
this.currentBlock = 0;
|
|
13
|
+
}
|
|
14
|
+
loadFile(path) {
|
|
15
|
+
this.init();
|
|
16
|
+
this.winnowingFilePath = path;
|
|
17
|
+
this.winnowing = fs.readFileSync(path, 'utf-8');
|
|
18
|
+
const reg = /file=/g;
|
|
19
|
+
this.blocksIndex = [...((this.winnowing).matchAll(reg))].map(x => x.index);
|
|
20
|
+
}
|
|
21
|
+
;
|
|
22
|
+
extractWinBlock() {
|
|
23
|
+
let res = '';
|
|
24
|
+
if (this.currentBlock < this.blocksIndex.length - 1)
|
|
25
|
+
res = this.winnowing.substring(this.blocksIndex[this.currentBlock], this.blocksIndex[this.currentBlock + 1]);
|
|
26
|
+
this.currentBlock += 1;
|
|
27
|
+
return res;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2lubm93ZXJFeHRyYWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NjYW5uZXIvV2lubm93ZXIvV2lubm93ZXJFeHRyYWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXBCLE1BQU0sT0FBTyxpQkFBaUI7SUFFcEIsU0FBUyxDQUFTO0lBRWxCLGlCQUFpQixDQUFTO0lBRTFCLFdBQVcsQ0FBZ0I7SUFFM0IsWUFBWSxDQUFTO0lBRTdCO1FBQ0UsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2QsQ0FBQztJQUVPLElBQUk7UUFDVixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRU0sUUFBUSxDQUFDLElBQVk7UUFDMUIsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1osSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFBQSxDQUFDO0lBRUssZUFBZTtRQUNwQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUMsQ0FBQztZQUMvQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0csSUFBSSxDQUFDLFlBQVksSUFBRSxDQUFDLENBQUM7UUFDckIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare class WinnowerResponse {
|
|
2
|
+
private wfpContent;
|
|
3
|
+
private engineFlags;
|
|
4
|
+
private scanRoot;
|
|
5
|
+
constructor(wfpContent: any, scanRoot?: string);
|
|
6
|
+
isEqual(winnowerResponse: any): boolean;
|
|
7
|
+
getContent(): string;
|
|
8
|
+
setEngineFlags(engineFlags: number): void;
|
|
9
|
+
getEngineFlags(): number;
|
|
10
|
+
getFilesWinnowed(): any[] | "";
|
|
11
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export class WinnowerResponse {
|
|
2
|
+
wfpContent;
|
|
3
|
+
engineFlags;
|
|
4
|
+
scanRoot;
|
|
5
|
+
constructor(wfpContent, scanRoot = '') {
|
|
6
|
+
this.wfpContent = wfpContent;
|
|
7
|
+
this.scanRoot = scanRoot;
|
|
8
|
+
}
|
|
9
|
+
isEqual(winnowerResponse) {
|
|
10
|
+
return this.getContent() === winnowerResponse.getContent();
|
|
11
|
+
}
|
|
12
|
+
getContent() {
|
|
13
|
+
return this.wfpContent;
|
|
14
|
+
}
|
|
15
|
+
setEngineFlags(engineFlags) {
|
|
16
|
+
this.engineFlags = engineFlags;
|
|
17
|
+
}
|
|
18
|
+
getEngineFlags() {
|
|
19
|
+
return this.engineFlags;
|
|
20
|
+
}
|
|
21
|
+
getFilesWinnowed() {
|
|
22
|
+
const files = [];
|
|
23
|
+
const regExp = new RegExp(/,(\/.*)/g);
|
|
24
|
+
let result;
|
|
25
|
+
// eslint-disable-next-line no-cond-assign
|
|
26
|
+
while ((result = regExp.exec(this.wfpContent)))
|
|
27
|
+
files.push(this.scanRoot + result[1]);
|
|
28
|
+
return files || '';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2lubm93ZXJSZXNwb25zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2Nhbm5lci9XaW5ub3dlci9XaW5ub3dlclJlc3BvbnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxnQkFBZ0I7SUFDbkIsVUFBVSxDQUFTO0lBRW5CLFdBQVcsQ0FBUztJQUVwQixRQUFRLENBQVM7SUFFekIsWUFBWSxVQUFVLEVBQUUsUUFBUSxHQUFHLEVBQUU7UUFDbkMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDM0IsQ0FBQztJQUVNLE9BQU8sQ0FBQyxnQkFBZ0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssZ0JBQWdCLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDN0QsQ0FBQztJQUVNLFVBQVU7UUFDZixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVNLGNBQWMsQ0FBQyxXQUFtQjtRQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0lBRU0sY0FBYztRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDakIsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsSUFBSSxNQUFNLENBQUM7UUFDWCwwQ0FBMEM7UUFDMUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0RixPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDckIsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { NodeType } from './Node';
|
|
2
|
+
import Node from './Node';
|
|
3
|
+
export default class File extends Node {
|
|
4
|
+
constructor(name, path) {
|
|
5
|
+
super(name, path);
|
|
6
|
+
this.type = NodeType.FILE;
|
|
7
|
+
}
|
|
8
|
+
getNode(path) {
|
|
9
|
+
if (path === this.getPath())
|
|
10
|
+
return this;
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
getFiles() {
|
|
14
|
+
return [this.getPath()];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdHJlZS9GaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDbEMsT0FBTyxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBRzFCLE1BQU0sQ0FBQyxPQUFPLE9BQU8sSUFBSyxTQUFRLElBQUk7SUFDcEMsWUFBWSxJQUFZLEVBQUUsSUFBWTtRQUNwQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztJQUM1QixDQUFDO0lBRU0sT0FBTyxDQUFDLElBQVk7UUFDekIsSUFBSSxJQUFJLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3pDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVNLFFBQVE7UUFDYixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUVGIn0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import Node from './Node';
|
|
2
|
+
export default class Folder extends Node {
|
|
3
|
+
private children;
|
|
4
|
+
constructor(path: string, label: string);
|
|
5
|
+
addChild(node: Node): void;
|
|
6
|
+
getChildren(): Node[];
|
|
7
|
+
getNode(path: string): Node;
|
|
8
|
+
private checkMyPath;
|
|
9
|
+
getFiles(): Array<string>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { NodeType } from "./Node";
|
|
2
|
+
import Node from './Node';
|
|
3
|
+
export default class Folder extends Node {
|
|
4
|
+
children;
|
|
5
|
+
constructor(path, label) {
|
|
6
|
+
super(path, label);
|
|
7
|
+
this.type = NodeType.FOLDER;
|
|
8
|
+
this.children = [];
|
|
9
|
+
}
|
|
10
|
+
addChild(node) {
|
|
11
|
+
this.children.push(node);
|
|
12
|
+
}
|
|
13
|
+
getChildren() {
|
|
14
|
+
return this.children;
|
|
15
|
+
}
|
|
16
|
+
getNode(path) {
|
|
17
|
+
if (!this.checkMyPath(path))
|
|
18
|
+
return null;
|
|
19
|
+
if (path === this.getPath())
|
|
20
|
+
return this;
|
|
21
|
+
for (const child of this.children) {
|
|
22
|
+
const node = child.getNode(path);
|
|
23
|
+
if (node !== null)
|
|
24
|
+
return node;
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
// Returns true only if my path is contained in the path (parameter)
|
|
29
|
+
checkMyPath(path) {
|
|
30
|
+
if (!path.includes(this.getPath()))
|
|
31
|
+
return false;
|
|
32
|
+
// Only if first filter is passed.
|
|
33
|
+
const myPathExploded = this.getPath().split('/');
|
|
34
|
+
const pathExploded = path.split('/');
|
|
35
|
+
for (let i = 0; i < myPathExploded.length; i += 1) {
|
|
36
|
+
if (myPathExploded[i] !== pathExploded[i])
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
getFiles() {
|
|
42
|
+
const files = [];
|
|
43
|
+
this.children.forEach((child) => {
|
|
44
|
+
files.push(...child.getFiles());
|
|
45
|
+
});
|
|
46
|
+
return files;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRm9sZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi90cmVlL0ZvbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2xDLE9BQU8sSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUUxQixNQUFNLENBQUMsT0FBTyxPQUFPLE1BQU8sU0FBUSxJQUFJO0lBQzlCLFFBQVEsQ0FBUztJQUV6QixZQUFZLElBQVksRUFBRSxLQUFhO1FBQ3JDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFTSxRQUFRLENBQUMsSUFBVTtRQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRU0sV0FBVztRQUNoQixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdkIsQ0FBQztJQUVNLE9BQU8sQ0FBQyxJQUFZO1FBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3pDLElBQUksSUFBSSxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN6QyxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqQyxJQUFJLElBQUksS0FBSyxJQUFJO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1NBQ2hDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsb0VBQW9FO0lBQzVELFdBQVcsQ0FBQyxJQUFZO1FBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ2pELGtDQUFrQztRQUNsQyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNqRCxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUFFLE9BQU8sS0FBSyxDQUFDO1NBQ3pEO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU0sUUFBUTtRQUNiLE1BQU0sS0FBSyxHQUFrQixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUM5QixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiJ9
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export default abstract class Node {
|
|
2
|
+
protected type: NodeType;
|
|
3
|
+
protected rPath: string;
|
|
4
|
+
protected label: string;
|
|
5
|
+
protected action: string;
|
|
6
|
+
constructor(path: string, label: string);
|
|
7
|
+
abstract getNode(path: string): Node;
|
|
8
|
+
abstract getFiles(): Array<string>;
|
|
9
|
+
getName(): string;
|
|
10
|
+
getPath(): string;
|
|
11
|
+
}
|
|
12
|
+
export declare enum NodeType {
|
|
13
|
+
FOLDER = "FOLDER",
|
|
14
|
+
FILE = "FILE"
|
|
15
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export default class Node {
|
|
2
|
+
type;
|
|
3
|
+
rPath; // Relative path to the folder or file
|
|
4
|
+
label;
|
|
5
|
+
action;
|
|
6
|
+
constructor(path, label) {
|
|
7
|
+
this.rPath = path;
|
|
8
|
+
this.label = label;
|
|
9
|
+
}
|
|
10
|
+
getName() {
|
|
11
|
+
return this.label;
|
|
12
|
+
}
|
|
13
|
+
getPath() {
|
|
14
|
+
return this.rPath;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export var NodeType;
|
|
18
|
+
(function (NodeType) {
|
|
19
|
+
NodeType["FOLDER"] = "FOLDER";
|
|
20
|
+
NodeType["FILE"] = "FILE";
|
|
21
|
+
})(NodeType || (NodeType = {}));
|
|
22
|
+
;
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdHJlZS9Ob2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxPQUFPLE9BQWdCLElBQUk7SUFDdEIsSUFBSSxDQUFXO0lBRWYsS0FBSyxDQUFTLENBQUMsc0NBQXNDO0lBRXJELEtBQUssQ0FBUztJQUVkLE1BQU0sQ0FBUztJQUV6QixZQUFZLElBQVksRUFBRSxLQUFhO1FBQ3JDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFRTSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFTSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FFRjtBQUVELE1BQU0sQ0FBTixJQUFZLFFBR1g7QUFIRCxXQUFZLFFBQVE7SUFDbEIsNkJBQWlCLENBQUE7SUFDakIseUJBQWEsQ0FBQTtBQUNmLENBQUMsRUFIVyxRQUFRLEtBQVIsUUFBUSxRQUduQjtBQUFBLENBQUMifQ==
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import Node from './Node';
|
|
2
|
+
import Folder from './Folder';
|
|
3
|
+
import { FilterList } from '../filters/filtering';
|
|
4
|
+
export declare class Tree {
|
|
5
|
+
private rootFolder;
|
|
6
|
+
private rootName;
|
|
7
|
+
private rootPath;
|
|
8
|
+
private filter;
|
|
9
|
+
constructor(path: string);
|
|
10
|
+
buildTree(): Node;
|
|
11
|
+
loadFilter(f: FilterList): void;
|
|
12
|
+
private buildTreeRec;
|
|
13
|
+
private dirFirstFileAfter;
|
|
14
|
+
loadTree(data: any): void;
|
|
15
|
+
private deserialize;
|
|
16
|
+
getRootFolder(): Folder;
|
|
17
|
+
getRootPath(): string;
|
|
18
|
+
getFileList(): Array<string>;
|
|
19
|
+
}
|