scanoss 0.2.10 → 0.2.11

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 (150) hide show
  1. package/LICENSE +20 -18
  2. package/build/main/bin/cli-bin.js +7 -1
  3. package/build/main/commands/dep.d.ts +1 -0
  4. package/build/main/commands/dep.js +26 -0
  5. package/build/main/index.d.ts +2 -0
  6. package/build/main/index.js +3 -1
  7. package/build/main/lib/dependencies/Dependency.d.ts +9 -0
  8. package/build/main/lib/dependencies/Dependency.js +50 -0
  9. package/build/main/lib/dependencies/DependencyTypes.d.ts +19 -0
  10. package/build/main/lib/dependencies/DependencyTypes.js +3 -0
  11. package/build/main/lib/dependencies/PurlGenerator.d.ts +2 -0
  12. package/build/main/lib/dependencies/PurlGenerator.js +39 -0
  13. package/build/main/lib/dependencies/parsers/golangParser.d.ts +0 -0
  14. package/build/main/lib/dependencies/parsers/golangParser.js +3 -0
  15. package/build/main/lib/dependencies/parsers/mavenParser.d.ts +2 -0
  16. package/build/main/lib/dependencies/parsers/mavenParser.js +44 -0
  17. package/build/main/lib/dependencies/parsers/npmParser.d.ts +3 -0
  18. package/build/main/lib/dependencies/parsers/npmParser.js +45 -0
  19. package/build/main/lib/dependencies/parsers/pyParser.d.ts +2 -0
  20. package/build/main/lib/dependencies/parsers/pyParser.js +51 -0
  21. package/build/main/lib/dependencies/parsers/rubyParser.d.ts +3 -0
  22. package/build/main/lib/dependencies/parsers/rubyParser.js +135 -0
  23. package/build/main/lib/dependencies/parsers/types.d.ts +15 -0
  24. package/build/main/lib/dependencies/parsers/types.js +33 -0
  25. package/build/main/lib/dependencies/parsers/utils.d.ts +2 -0
  26. package/build/main/lib/dependencies/parsers/utils.js +20 -0
  27. package/build/main/lib/dependencies/src/PurlGenerator.d.ts +2 -0
  28. package/build/main/lib/dependencies/src/PurlGenerator.js +62 -0
  29. package/build/main/lib/dependencies/src/parsers/golangParser.d.ts +0 -0
  30. package/build/main/lib/dependencies/src/parsers/golangParser.js +3 -0
  31. package/build/main/lib/dependencies/src/parsers/mavenParser.d.ts +2 -0
  32. package/build/main/lib/dependencies/src/parsers/mavenParser.js +44 -0
  33. package/build/main/lib/dependencies/src/parsers/npmParser.d.ts +3 -0
  34. package/build/main/lib/dependencies/src/parsers/npmParser.js +45 -0
  35. package/build/main/lib/dependencies/src/parsers/pyParser.d.ts +2 -0
  36. package/build/main/lib/dependencies/src/parsers/pyParser.js +51 -0
  37. package/build/main/lib/dependencies/src/parsers/rubyParser.d.ts +3 -0
  38. package/build/main/lib/dependencies/src/parsers/rubyParser.js +135 -0
  39. package/build/main/lib/dependencies/src/parsers/types.d.ts +15 -0
  40. package/build/main/lib/dependencies/src/parsers/types.js +33 -0
  41. package/build/main/lib/dependencies/src/parsers/utils.d.ts +2 -0
  42. package/build/main/lib/dependencies/src/parsers/utils.js +19 -0
  43. package/build/main/lib/dependencyScan/dependencyScan.d.ts +2 -0
  44. package/build/main/lib/dependencyScan/dependencyScan.js +37 -0
  45. package/build/main/lib/dependencyScan/parser.d.ts +7 -0
  46. package/build/main/lib/dependencyScan/parser.js +41 -0
  47. package/build/main/lib/dependencyScan/utils.d.ts +1 -0
  48. package/build/main/lib/dependencyScan/utils.js +16 -0
  49. package/build/main/lib/scanner/Dependency/dependency.d.ts +9 -0
  50. package/build/main/lib/scanner/Dependency/dependency.js +46 -0
  51. package/build/main/lib/scanner/Dependency/dependencyScan.d.ts +9 -0
  52. package/build/main/lib/scanner/Dependency/dependencyScan.js +48 -0
  53. package/build/main/lib/scanner/Dependency/parser.d.ts +7 -0
  54. package/build/main/lib/scanner/Dependency/parser.js +41 -0
  55. package/build/main/lib/scanner/Dependency/utils.d.ts +1 -0
  56. package/build/main/lib/scanner/Dependency/utils.js +16 -0
  57. package/build/main/lib/tree/Tree.js +2 -2
  58. package/build/module/bin/cli-bin.js +7 -1
  59. package/build/module/commands/dep.d.ts +1 -0
  60. package/build/module/commands/dep.js +19 -0
  61. package/build/module/index.d.ts +2 -0
  62. package/build/module/index.js +3 -1
  63. package/build/module/lib/dependencies/Dependency.d.ts +9 -0
  64. package/build/module/lib/dependencies/Dependency.js +45 -0
  65. package/build/module/lib/dependencies/DependencyTypes.d.ts +19 -0
  66. package/build/module/lib/dependencies/DependencyTypes.js +2 -0
  67. package/build/module/lib/dependencies/PurlGenerator.d.ts +2 -0
  68. package/build/module/lib/dependencies/PurlGenerator.js +32 -0
  69. package/build/module/lib/dependencies/parsers/golangParser.d.ts +0 -0
  70. package/build/module/lib/dependencies/parsers/golangParser.js +3 -0
  71. package/build/module/lib/dependencies/parsers/mavenParser.d.ts +2 -0
  72. package/build/module/lib/dependencies/parsers/mavenParser.js +37 -0
  73. package/build/module/lib/dependencies/parsers/npmParser.d.ts +3 -0
  74. package/build/module/lib/dependencies/parsers/npmParser.js +37 -0
  75. package/build/module/lib/dependencies/parsers/pyParser.d.ts +2 -0
  76. package/build/module/lib/dependencies/parsers/pyParser.js +44 -0
  77. package/build/module/lib/dependencies/parsers/rubyParser.d.ts +3 -0
  78. package/build/module/lib/dependencies/parsers/rubyParser.js +132 -0
  79. package/build/module/lib/dependencies/parsers/types.d.ts +15 -0
  80. package/build/module/lib/dependencies/parsers/types.js +32 -0
  81. package/build/module/lib/dependencies/parsers/utils.d.ts +2 -0
  82. package/build/module/lib/dependencies/parsers/utils.js +15 -0
  83. package/build/module/lib/dependencies/src/PurlGenerator.d.ts +2 -0
  84. package/build/module/lib/dependencies/src/PurlGenerator.js +55 -0
  85. package/build/module/lib/dependencies/src/parsers/golangParser.d.ts +0 -0
  86. package/build/module/lib/dependencies/src/parsers/golangParser.js +3 -0
  87. package/build/module/lib/dependencies/src/parsers/mavenParser.d.ts +2 -0
  88. package/build/module/lib/dependencies/src/parsers/mavenParser.js +37 -0
  89. package/build/module/lib/dependencies/src/parsers/npmParser.d.ts +3 -0
  90. package/build/module/lib/dependencies/src/parsers/npmParser.js +37 -0
  91. package/build/module/lib/dependencies/src/parsers/pyParser.d.ts +2 -0
  92. package/build/module/lib/dependencies/src/parsers/pyParser.js +44 -0
  93. package/build/module/lib/dependencies/src/parsers/rubyParser.d.ts +3 -0
  94. package/build/module/lib/dependencies/src/parsers/rubyParser.js +132 -0
  95. package/build/module/lib/dependencies/src/parsers/types.d.ts +15 -0
  96. package/build/module/lib/dependencies/src/parsers/types.js +32 -0
  97. package/build/module/lib/dependencies/src/parsers/utils.d.ts +2 -0
  98. package/build/module/lib/dependencies/src/parsers/utils.js +14 -0
  99. package/build/module/lib/dependencyScan/dependencyScan.d.ts +2 -0
  100. package/build/module/lib/dependencyScan/dependencyScan.js +29 -0
  101. package/build/module/lib/dependencyScan/parser.d.ts +7 -0
  102. package/build/module/lib/dependencyScan/parser.js +38 -0
  103. package/build/module/lib/dependencyScan/utils.d.ts +1 -0
  104. package/build/module/lib/dependencyScan/utils.js +12 -0
  105. package/build/module/lib/scanner/Dependency/dependency.d.ts +9 -0
  106. package/build/module/lib/scanner/Dependency/dependency.js +38 -0
  107. package/build/module/lib/scanner/Dependency/dependencyScan.d.ts +9 -0
  108. package/build/module/lib/scanner/Dependency/dependencyScan.js +40 -0
  109. package/build/module/lib/scanner/Dependency/parser.d.ts +7 -0
  110. package/build/module/lib/scanner/Dependency/parser.js +38 -0
  111. package/build/module/lib/scanner/Dependency/utils.d.ts +1 -0
  112. package/build/module/lib/scanner/Dependency/utils.js +12 -0
  113. package/build/module/lib/tree/Tree.js +2 -2
  114. package/package.json +2 -1
  115. package/.circleci/config.yml +0 -64
  116. package/.cspell.json +0 -34
  117. package/.editorconfig +0 -15
  118. package/.eslintrc.json +0 -37
  119. package/.gitignore +0 -11
  120. package/.prettierignore +0 -2
  121. package/.vscode/extensions.json +0 -8
  122. package/.vscode/launch.json +0 -29
  123. package/.vscode/settings.json +0 -7
  124. package/build/tsconfig.module.tsbuildinfo +0 -1
  125. package/build/tsconfig.tsbuildinfo +0 -1
  126. package/examples/defaultFilter.json +0 -203
  127. package/package-lock.json +0 -18266
  128. package/src/bin/cli-bin.ts +0 -52
  129. package/src/commands/scan.ts +0 -97
  130. package/src/index.ts +0 -4
  131. package/src/lib/filters/defaultFilter.ts +0 -207
  132. package/src/lib/filters/filtering.ts +0 -234
  133. package/src/lib/scanner/Dispatcher/DispatchableItem.ts +0 -29
  134. package/src/lib/scanner/Dispatcher/Dispatcher.ts +0 -151
  135. package/src/lib/scanner/Dispatcher/DispatcherResponse.ts +0 -40
  136. package/src/lib/scanner/Dispatcher/GlobalControllerAborter.ts +0 -33
  137. package/src/lib/scanner/Scannable/ScannableItem.ts +0 -43
  138. package/src/lib/scanner/Scanner.ts +0 -319
  139. package/src/lib/scanner/ScannerCfg.ts +0 -29
  140. package/src/lib/scanner/ScannerTypes.ts +0 -41
  141. package/src/lib/scanner/Winnower/Winnower.ts +0 -439
  142. package/src/lib/scanner/Winnower/WinnowerExtractor.ts +0 -38
  143. package/src/lib/scanner/Winnower/WinnowerResponse.ts +0 -38
  144. package/src/lib/tree/File.ts +0 -20
  145. package/src/lib/tree/Folder.ts +0 -50
  146. package/src/lib/tree/Node.ts +0 -34
  147. package/src/lib/tree/Tree.ts +0 -89
  148. package/tsconfig.json +0 -47
  149. package/tsconfig.module.json +0 -11
  150. package/yarn.lock +0 -5670
@@ -1,151 +0,0 @@
1
- /* eslint-disable guard-for-in */
2
- /* eslint-disable no-restricted-syntax */
3
- import EventEmitter from 'eventemitter3';
4
- import fetch from 'node-fetch';
5
- import PQueue from "p-queue";
6
- import FormData from "form-data";
7
-
8
- import { ScannerEvents } from "../ScannerTypes";
9
- import { DispatcherResponse } from "./DispatcherResponse";
10
- import { ScannerCfg } from "../ScannerCfg";
11
- import { GlobalControllerAborter } from "./GlobalControllerAborter";
12
- import { DispatchableItem } from './DispatchableItem';
13
-
14
- export class Dispatcher extends EventEmitter {
15
- private scannerCfg: ScannerCfg;
16
-
17
- private pQueue;
18
-
19
- private globalAbortController: GlobalControllerAborter;
20
-
21
- private queueMaxLimitReached: boolean;
22
-
23
- private queueMinLimitReached: boolean;
24
-
25
- private recoverableErrors;
26
-
27
- constructor(scannerCfg = new ScannerCfg()) {
28
- super();
29
- this.scannerCfg = scannerCfg;
30
- this.init();
31
- }
32
-
33
- init() {
34
- this.pQueue = new PQueue({
35
- concurrency: this.scannerCfg.CONCURRENCY_LIMIT,
36
- });
37
- this.pQueue.clear();
38
-
39
- this.pQueue.on('idle', () => {
40
- this.emit(ScannerEvents.DISPATCHER_FINISHED);
41
- });
42
-
43
- this.pQueue.on('next', () => {
44
- if ((this.pQueue.size + this.pQueue.pending) < this.scannerCfg.DISPATCHER_QUEUE_SIZE_MIN_LIMIT && !this.queueMinLimitReached) {
45
- this.emit(ScannerEvents.DISPATCHER_QUEUE_SIZE_MIN_LIMIT);
46
- this.queueMinLimitReached = true;
47
- this.queueMaxLimitReached = false;
48
- }
49
- });
50
-
51
- this.queueMaxLimitReached = false;
52
- this.queueMinLimitReached = true;
53
-
54
- this.globalAbortController = new GlobalControllerAborter();
55
-
56
- this.recoverableErrors = new Set();
57
- this.recoverableErrors.add('ECONNRESET');
58
- this.recoverableErrors.add('TIMEOUT');
59
- }
60
-
61
- stop() {
62
- this.pQueue.clear();
63
- this.pQueue.pause();
64
- this.globalAbortController.abortAll();
65
- }
66
-
67
- public dispatchItem(disptItem: DispatchableItem): void {
68
- this.pQueue.add(() => this.dispatch(disptItem));
69
-
70
- if (
71
- this.pQueue.size + this.pQueue.pending >= this.scannerCfg.DISPATCHER_QUEUE_SIZE_MAX_LIMIT &&
72
- !this.queueMaxLimitReached
73
- ) {
74
- this.emit(ScannerEvents.DISPATCHER_QUEUE_SIZE_MAX_LIMIT);
75
- this.queueMaxLimitReached = true;
76
- this.queueMinLimitReached = false;
77
- }
78
- }
79
-
80
- handleUnrecoverableError(error,disptItem) {
81
- this.emit('error', error, disptItem);
82
- }
83
-
84
- emitNoDispatchedItem(disptItem) {
85
- this.emit(ScannerEvents.DISPATCHER_LOG, `[ SCANNER ]: WFP content sended to many times. Some files won't be scanned`);
86
- this.emit(ScannerEvents.DISPATCHER_ITEM_NO_DISPATCHED, disptItem);
87
- }
88
-
89
- errorHandler(error, disptItem) {
90
- if (!this.globalAbortController.isAborting()) {
91
- if (error.name === 'AbortError') error.name = 'TIMEOUT';
92
- if (this.recoverableErrors.has(error.code) || this.recoverableErrors.has(error.name)) {
93
- disptItem.increaseErrorCounter();
94
- if (disptItem.getErrorCounter() >= this.scannerCfg.MAX_RETRIES_FOR_RECOVERABLES_ERRORS) {
95
- this.emitNoDispatchedItem(disptItem);
96
- if (this.scannerCfg.ABORT_ON_MAX_RETRIES) this.handleUnrecoverableError(error, disptItem);
97
- return;
98
- }
99
- // const leftRetry = this.scannerCfg.MAX_RETRIES_FOR_RECOVERABLES_ERRORS - disptItem.getErrorCounter();
100
- this.emit(ScannerEvents.DISPATCHER_LOG,`[ SCANNER ]: Recoverable error happened sending WFP content to server. Reason: ${error.code || error.name}`);
101
- this.dispatchItem(disptItem);
102
- return;
103
- }
104
- this.handleUnrecoverableError(error, disptItem);
105
- }
106
- }
107
-
108
- async dispatch(disptItem: DispatchableItem) {
109
- const timeoutController = this.globalAbortController.getAbortController();
110
- const timeoutId = setTimeout(() => timeoutController.abort(), this.scannerCfg.TIMEOUT);
111
- try {
112
- const form = new FormData();
113
-
114
- form.append('filename', Buffer.from(disptItem.getContent()), 'data.wfp');
115
-
116
- const engineFlag = disptItem.getWinnowerResponse().getEngineFlags();
117
- if(engineFlag) form.append('flags', engineFlag);
118
-
119
- this.emit(ScannerEvents.DISPATCHER_WFP_SENDED);
120
- const response = await fetch(this.scannerCfg.API_URL, {
121
- method: 'post',
122
- body: form,
123
- headers: { 'User-Agent': this.scannerCfg.CLIENT_TIMESTAMP, 'X-Session': this.scannerCfg.API_KEY },
124
- signal: timeoutController.signal,
125
- });
126
-
127
- clearTimeout(timeoutId);
128
- this.globalAbortController.removeAbortController(timeoutController);
129
-
130
- if (!response.ok) {
131
- const msg = await response.text();
132
- const err = new Error(msg);
133
- err["code"] = response.status;
134
- err.name = ScannerEvents.ERROR_SERVER_SIDE;
135
- throw err;
136
- }
137
-
138
- const dataAsText = await response.text();
139
- const dataAsObj = JSON.parse(dataAsText);
140
-
141
- const dispatcherResponse = new DispatcherResponse(dataAsObj, disptItem.getContent());
142
- this.emit(ScannerEvents.DISPATCHER_NEW_DATA, dispatcherResponse);
143
- return Promise.resolve();
144
- } catch (e) {
145
- clearTimeout(timeoutId);
146
- this.globalAbortController.removeAbortController(timeoutController);
147
- this.errorHandler(e, disptItem);
148
- return Promise.resolve();
149
- }
150
- }
151
- }
@@ -1,40 +0,0 @@
1
- export class DispatcherResponse {
2
- serverResponse: any;
3
-
4
- wfpContent: string;
5
-
6
- filesScanned: Array<string>;
7
-
8
- constructor(serverResponse, wfpContent) {
9
- this.serverResponse = serverResponse;
10
- this.wfpContent = wfpContent;
11
- this.filesScanned = Object.keys(this.serverResponse);
12
- // this.verifyResponse();
13
- }
14
-
15
- getServerResponse() {
16
- return this.serverResponse;
17
- }
18
-
19
- getWfpContent() {
20
- return this.wfpContent;
21
- }
22
-
23
- matchRegex(str, re = /file=/g) {
24
- return ((str || '').match(re) || []).length;
25
- }
26
-
27
- verifyResponse() {
28
- const wfpNumFiles = this.matchRegex(this.wfpContent, /file=/g);
29
- const serverResponseNumFiles = Object.keys(this.serverResponse).length;
30
- if (wfpNumFiles !== serverResponseNumFiles) throw new Error(`The numbers of files in the wfp sended does not match with the server response`);
31
- }
32
-
33
- getFilesScanned() {
34
- return this.filesScanned;
35
- }
36
-
37
- getNumberOfFilesScanned() {
38
- return this.filesScanned.length;
39
- }
40
- }
@@ -1,33 +0,0 @@
1
-
2
- import AbortController from 'abort-controller';
3
-
4
- export class GlobalControllerAborter {
5
- private abortControllerList: Array<AbortController>;
6
-
7
- private abortFlag: Boolean;
8
-
9
- constructor() {
10
- this.abortControllerList = [];
11
- this.abortFlag = false;
12
- }
13
-
14
- abortAll() {
15
- this.abortFlag = true;
16
- for (const c of this.abortControllerList) c.abort();
17
- }
18
-
19
- isAborting() {
20
- return this.abortFlag;
21
- }
22
-
23
- getAbortController() {
24
- const c = new AbortController();
25
- this.abortControllerList.push(c);
26
- return c;
27
- }
28
-
29
- removeAbortController(c) {
30
- const index = this.abortControllerList.findIndex((controller) => controller === c);
31
- if (index > -1) this.abortControllerList.splice(index, 1);
32
- }
33
- }
@@ -1,43 +0,0 @@
1
- import { WinnowingMode } from "../ScannerTypes";
2
-
3
-
4
- export class ScannableItem {
5
- private contentSource: string;
6
-
7
- private content: Buffer;
8
-
9
- private winnowingMode: WinnowingMode;
10
-
11
- private fingerprint: any;
12
-
13
- private maxSizeWfp: any;
14
-
15
- constructor(content: Buffer, contentSource: string, winnowingMode: any, maxSizeWfp: number) {
16
- this.contentSource = contentSource;
17
- this.content = content;
18
- this.winnowingMode = winnowingMode;
19
- this.maxSizeWfp = maxSizeWfp;
20
- }
21
-
22
- public getContent() {
23
- return this.content;
24
- }
25
-
26
- public getContentSource() {
27
- return this.contentSource;
28
- }
29
-
30
- public getFingerprint() {
31
- return this.fingerprint;
32
- }
33
-
34
- public getWinnowingMode(): WinnowingMode {
35
- return this.winnowingMode;
36
- }
37
-
38
- public getMaxSizeWfp() {
39
- return this.maxSizeWfp;
40
- }
41
-
42
-
43
- }
@@ -1,319 +0,0 @@
1
- /* eslint-disable no-console */
2
- // 2.0
3
- import EventEmitter from 'eventemitter3';
4
- import os from 'os';
5
- import fs from 'fs';
6
-
7
- import { Winnower } from './Winnower/Winnower';
8
- import { Dispatcher } from './Dispatcher/Dispatcher';
9
-
10
- import { DispatchableItem } from './Dispatcher/DispatchableItem';
11
- import { DispatcherResponse } from './Dispatcher/DispatcherResponse';
12
- import { ScannerCfg } from './ScannerCfg';
13
- import { ScannerEvents, ScannerInput } from './ScannerTypes';
14
-
15
-
16
- import sortPaths from 'sort-paths';
17
- import { WinnowerResponse } from './Winnower/WinnowerResponse';
18
-
19
-
20
- let finishPromiseResolve;
21
- let finishPromiseReject;
22
-
23
- export class Scanner extends EventEmitter {
24
- scannerCfg;
25
-
26
- workDirectory;
27
-
28
- scanRoot;
29
-
30
- scannerId;
31
-
32
- private winnower: Winnower;
33
-
34
- private dispatcher: Dispatcher;
35
-
36
- resultFilePath;
37
-
38
- wfpFilePath;
39
-
40
- scanFinished; // Both flags are used to prevent a race condition between DISPATCHER.NEW_DATA and DISPATCHER_FINISHED
41
-
42
- processingNewData; // Both flags are used to prevent a race condition between DISPATCHER.NEW_DATA and DISPATCHER_FINISHED
43
-
44
- responseBuffer;
45
-
46
- processedFiles;
47
-
48
- running;
49
-
50
- filesToScan;
51
-
52
- filesNotScanned;
53
-
54
- finishPromise: Promise<void>;
55
-
56
- private scannerInput: Array<ScannerInput>;
57
-
58
- constructor(scannerCfg = new ScannerCfg()) {
59
- super();
60
- this.scannerCfg = scannerCfg;
61
- this.scannerId = new Date().getTime();
62
- }
63
-
64
- init() {
65
- this.scanFinished = false;
66
- this.processingNewData = false;
67
- this.running = true;
68
- this.processedFiles = 0;
69
- this.responseBuffer = [];
70
- this.filesToScan = {};
71
- this.filesNotScanned = {};
72
- this.winnower = new Winnower(this.scannerCfg);
73
- this.dispatcher = new Dispatcher(this.scannerCfg);
74
-
75
- this.finishPromise = new Promise((resolve, reject) =>{
76
- finishPromiseResolve = resolve;
77
- finishPromiseReject = reject;
78
- });
79
-
80
- this.setWinnowerListeners();
81
- this.setDispatcherListeners();
82
-
83
- if (this.workDirectory === undefined) this.setWorkDirectory(`${os.tmpdir()}/scanner-${this.getScannerId()}`);
84
- }
85
-
86
- setWinnowerListeners() {
87
- this.winnower.on(ScannerEvents.WINNOWING_NEW_CONTENT, (winnowerResponse: WinnowerResponse) => {
88
- this.emit(ScannerEvents.WINNOWING_NEW_CONTENT, winnowerResponse);
89
- this.reportLog(`[ SCANNER ]: New WFP content`);
90
- winnowerResponse.setEngineFlags(this.scannerInput[0].engineFlags);
91
- const disptItem = new DispatchableItem(winnowerResponse);
92
- this.dispatcher.dispatchItem(disptItem);
93
- });
94
-
95
- this.winnower.on(ScannerEvents.WINNOWER_LOG, (msg) => {
96
- this.reportLog(msg);
97
- });
98
-
99
- this.winnower.on(ScannerEvents.ERROR, (error) => {
100
- this.errorHandler(error, ScannerEvents.MODULE_WINNOWER);
101
- });
102
- }
103
-
104
- setDispatcherListeners() {
105
- this.dispatcher.on(ScannerEvents.DISPATCHER_QUEUE_SIZE_MAX_LIMIT, () => {
106
- this.reportLog(`[ SCANNER ]: Maximum queue size reached. Winnower will be paused`);
107
- this.winnower.pause();
108
- });
109
-
110
- this.dispatcher.on(ScannerEvents.DISPATCHER_QUEUE_SIZE_MIN_LIMIT, () => {
111
- this.reportLog(`[ SCANNER ]: Minimum queue size reached. Winnower will be resumed`);
112
- this.winnower.resume();
113
- });
114
-
115
- this.dispatcher.on(ScannerEvents.DISPATCHER_NEW_DATA, async (response) => {
116
- this.processingNewData = true;
117
- this.processedFiles += response.getNumberOfFilesScanned();
118
- this.reportLog(`[ SCANNER ]: Received results of ${response.getNumberOfFilesScanned()} files`);
119
- this.emit(ScannerEvents.DISPATCHER_NEW_DATA, response);
120
- this.insertIntoBuffer(response);
121
- if (this.bufferReachedLimit()) this.bufferToFiles();
122
- this.processingNewData = false;
123
- if (this.scanFinished) await this.finishJob();
124
- });
125
-
126
- this.dispatcher.on(ScannerEvents.DISPATCHER_FINISHED, async () => {
127
- if (!this.winnower.hasPendingFiles()) {
128
- if (this.processingNewData) this.scanFinished = true;
129
- else await this.finishJob();
130
- }
131
- });
132
-
133
- this.dispatcher.on(ScannerEvents.DISPATCHER_ITEM_NO_DISPATCHED, (disptItem) => {
134
- const filesNotScanned = disptItem.getWinnowerResponse().getFilesWinnowed();
135
- this.appendFilesToNotScanned(filesNotScanned);
136
- });
137
-
138
- this.winnower.on(ScannerEvents.DISPATCHER_LOG, (msg) => {
139
- this.reportLog(msg);
140
- });
141
-
142
- this.dispatcher.on(ScannerEvents.ERROR, (error, disptItem) => {
143
- const wfpContent = disptItem.getWinnowerResponse().getContent();
144
- fs.writeFileSync(`${this.workDirectory}/failed.wfp`, wfpContent, 'utf8');
145
- this.errorHandler(error, ScannerEvents.MODULE_DISPATCHER);
146
- });
147
- }
148
-
149
- appendFilesToNotScanned(fileList) {
150
- const obj = {};
151
- // eslint-disable-next-line no-restricted-syntax
152
- for (const file of fileList) obj[file] = this.filesToScan[file];
153
- Object.assign(this.filesNotScanned, obj);
154
- return this.filesNotScanned;
155
- }
156
-
157
- insertIntoBuffer(dispatcherResponse) {
158
- this.responseBuffer.push(dispatcherResponse);
159
- }
160
-
161
- isBufferEmpty() {
162
- return this.responseBuffer.length === 0;
163
- }
164
-
165
- bufferReachedLimit() {
166
- if (this.responseBuffer.length >= this.scannerCfg.MAX_RESPONSES_IN_BUFFER) return true;
167
- return false;
168
- }
169
-
170
- bufferToFiles() {
171
- let wfpContent = '';
172
- const serverResponse = {};
173
- // eslint-disable-next-line no-restricted-syntax
174
- for (const dispatcherResponse of this.responseBuffer) {
175
- wfpContent += dispatcherResponse.getWfpContent();
176
- const serverResponseToAppend = dispatcherResponse.getServerResponse();
177
- Object.assign(serverResponse, serverResponseToAppend);
178
- }
179
- this.appendOutputFiles(wfpContent, serverResponse);
180
- this.responseBuffer = [];
181
- const responses = new DispatcherResponse(serverResponse, wfpContent);
182
- this.reportLog(`[ SCANNER ]: Persisted results of ${responses.getNumberOfFilesScanned()} files...`);
183
- this.emit(ScannerEvents.RESULTS_APPENDED, responses, this.filesNotScanned);
184
- return responses;
185
- }
186
-
187
- public setWorkDirectory(workDirectory: string) {
188
- this.workDirectory = workDirectory;
189
- this.resultFilePath = `${this.workDirectory}/result.json`;
190
- this.wfpFilePath = `${this.workDirectory}/winnowing.wfp`;
191
-
192
- if (!fs.existsSync(this.workDirectory)) fs.mkdirSync(this.workDirectory);
193
- }
194
-
195
- public getWorkDirectory(): string {
196
- return this.workDirectory;
197
- }
198
-
199
- public cleanWorkDirectory(): void {
200
- if (fs.existsSync(this.resultFilePath)) fs.unlinkSync(this.resultFilePath);
201
- if (fs.existsSync(this.wfpFilePath)) fs.unlinkSync(this.wfpFilePath);
202
- }
203
-
204
- private async finishJob() {
205
- this.scannerInput.shift();
206
- this.reportLog(`[ SCANNER ]: Job finished. ${this.scannerInput.length} pendings`);
207
-
208
- if(this.scannerInput.length) this.winnower.startWinnowing(this.scannerInput[0]);
209
- else await this.finishScan();
210
- }
211
-
212
- private async finishScan() {
213
- if (!this.isBufferEmpty()) this.bufferToFiles();
214
- const results = JSON.parse(await fs.promises.readFile(this.resultFilePath, 'utf8'));
215
- const sortedPaths = sortPaths(Object.keys(results), '/');
216
- const resultSorted = {};
217
- // eslint-disable-next-line no-restricted-syntax
218
- for (const key of sortedPaths) resultSorted[key] = results[key];
219
- await fs.promises.writeFile(this.resultFilePath, JSON.stringify(resultSorted, null, 2));
220
- this.reportLog(
221
- `[ SCANNER ]: Scan finished (Scanned: ${this.processedFiles}, Not Scanned: ${
222
- Object.keys(this.filesNotScanned).length
223
- })`
224
- );
225
- this.reportLog(`[ SCANNER ]: Results on: ${this.resultFilePath}`);
226
- this.running = false;
227
- this.emit(ScannerEvents.SCAN_DONE, this.resultFilePath, this.filesNotScanned);
228
- finishPromiseResolve();
229
- }
230
-
231
- reportLog(txt, level = 'info') {
232
- this.emit(ScannerEvents.SCANNER_LOG, txt, level);
233
- }
234
-
235
- errorHandler(error, origin) {
236
- this.stop();
237
- if (origin === ScannerEvents.MODULE_DISPATCHER) {
238
- }
239
- if (origin === ScannerEvents.MODULE_WINNOWER) {
240
- }
241
-
242
- this.reportLog(`[ SCANNER ]: Error reason ${error}`);
243
-
244
- this.emit(ScannerEvents.ERROR, error);
245
- if(this.finishPromise) finishPromiseReject(error);
246
- }
247
-
248
- createOutputFiles() {
249
- if (!fs.existsSync(this.wfpFilePath)) fs.writeFileSync(this.wfpFilePath, '');
250
- if (!fs.existsSync(this.resultFilePath)) fs.writeFileSync(this.resultFilePath, JSON.stringify({}));
251
- }
252
-
253
- appendOutputFiles(wfpContent, serverResponse) {
254
- fs.appendFileSync(this.wfpFilePath, wfpContent);
255
- const storedResultStr = fs.readFileSync(this.resultFilePath, 'utf-8');
256
- const storedResultObj = JSON.parse(storedResultStr);
257
- Object.assign(storedResultObj, serverResponse);
258
- const newResultStr = JSON.stringify(storedResultObj);
259
- fs.writeFileSync(this.resultFilePath, newResultStr);
260
- }
261
-
262
-
263
- public scanFromWinnowingFile(wfpFilePath: string): Promise<void> {
264
- this.init();
265
- this.createOutputFiles();
266
- this.winnower.startWinnowingFromFile(wfpFilePath);
267
- return this.finishPromise;
268
- }
269
-
270
-
271
- public scan(scannerInput: Array<ScannerInput>): Promise<void> {
272
- this.init();
273
- this.createOutputFiles();
274
- this.scannerInput = scannerInput;
275
- // If some jobs have no files to scan, we return
276
- if (this.scannerInput.some((input) => !input.fileList.length)){
277
- this.finishScan();
278
- return this.finishPromise;
279
- }
280
-
281
- this.winnower.startWinnowing(this.scannerInput[0]);
282
- return this.finishPromise;
283
- }
284
-
285
-
286
-
287
-
288
- getScannerId() {
289
- return this.scannerId;
290
- }
291
-
292
- pause() {
293
- this.running = false;
294
- this.winnower.pause();
295
- // this.dispatcher.pause();
296
- }
297
-
298
- resume() {
299
- this.running = true;
300
- this.winnower.resume();
301
- // this.dispatcher.resume();
302
- }
303
-
304
- stop() {
305
- this.reportLog(`[ SCANNER ]: Stopping scanner`);
306
- this.running = false;
307
- this.winnower.removeAllListeners();
308
- this.dispatcher.removeAllListeners();
309
- this.dispatcher.stop();
310
- this.winnower.stop();
311
- }
312
-
313
- isRunning() {
314
- return this.running;
315
- }
316
-
317
- }
318
-
319
-
@@ -1,29 +0,0 @@
1
- export class ScannerCfg {
2
- // Client Timestamp
3
- CLIENT_TIMESTAMP = "SCANNER JS"
4
-
5
- // API URL
6
- API_URL = 'https://osskb.org/api/scan/direct';
7
-
8
- API_KEY = '';
9
-
10
- // Level of concurrency
11
- CONCURRENCY_LIMIT = 15;
12
-
13
- // Timeout for each transaction
14
- TIMEOUT = 60000;
15
-
16
- // The maximum size for each .wfp file
17
- WFP_FILE_MAX_SIZE = 64 * 1000;
18
-
19
- MAX_RETRIES_FOR_RECOVERABLES_ERRORS = 5;
20
-
21
- ABORT_ON_MAX_RETRIES = true;
22
-
23
- // Persist results after [ X ] number of server responses.
24
- MAX_RESPONSES_IN_BUFFER = 300;
25
-
26
- DISPATCHER_QUEUE_SIZE_MAX_LIMIT = 50;
27
-
28
- DISPATCHER_QUEUE_SIZE_MIN_LIMIT = 20;
29
- };
@@ -1,41 +0,0 @@
1
- export enum ScannerEvents {
2
- WINNOWING_STARTING = 'WINNOWING_STARTING',
3
- WINNOWING_NEW_CONTENT = 'WINNOWING_NEW_CONTENT',
4
- WINNOWING_FINISHED = 'WINNOWING_FINISHED',
5
- WINNOWER_LOG = 'WINNOWER_LOG',
6
-
7
- DISPATCHER_WFP_SENDED = 'DISPATCHER_WFP_SENDED',
8
- DISPATCHER_NEW_DATA = 'DISPATCHER_NEW_DATA',
9
- DISPATCHER_FINISHED = 'DISPATCHER_FINISHED',
10
- DISPATCHER_ITEM_NO_DISPATCHED = 'DISPATCHER_ITEM_NO_DISPATCHED',
11
- DISPATCHER_QUEUE_SIZE_MAX_LIMIT = 'DISPATCHER_QUEUE_FULL',
12
- DISPATCHER_QUEUE_SIZE_MIN_LIMIT = 'DISPATCHER_QUEUE_SIZE_MIN_LIMIT',
13
- DISPATCHER_LOG = 'DISPATCHER_LOG',
14
-
15
- ERROR_SCANNER_ABORTED = 'ERROR_SCANNER_ABORTED',
16
-
17
- ERROR_SERVER_SIDE = 'ERROR_SERVER_SIDE',
18
- ERROR_CLIENT_SIDE = 'ERROR_CLIENT_SIDE',
19
-
20
- MODULE_DISPATCHER = 'MODULE_DISPATCHER',
21
- MODULE_WINNOWER = 'MODULE_WINNOWER',
22
-
23
- SCAN_DONE = 'SCAN_DONE',
24
- RESULTS_APPENDED = 'RESULTS_APPENDED',
25
-
26
- SCANNER_LOG = 'SCANNER_LOG',
27
-
28
- ERROR = 'error',
29
- };
30
-
31
- export enum WinnowingMode {
32
- FULL_WINNOWING = 'FULL_WINNOWING',
33
- WINNOWING_ONLY_MD5 = 'WINNOWING_ONLY_MD5',
34
- };
35
-
36
- export interface ScannerInput {
37
- engineFlags?: number;
38
- folderRoot?: string;
39
- fileList: Array<string>;
40
- winnowingMode?: WinnowingMode; // Enable winnowing algorithm, otherwise is scanned only MD5
41
- };