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