@nahisaho/musubix-security 2.0.1 → 2.1.1
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/dist/analysis/enhanced-taint-analyzer.d.ts +120 -0
- package/dist/analysis/enhanced-taint-analyzer.d.ts.map +1 -0
- package/dist/analysis/enhanced-taint-analyzer.js +450 -0
- package/dist/analysis/enhanced-taint-analyzer.js.map +1 -0
- package/dist/analysis/index.d.ts +1 -0
- package/dist/analysis/index.d.ts.map +1 -1
- package/dist/analysis/index.js +1 -0
- package/dist/analysis/index.js.map +1 -1
- package/dist/analysis/interprocedural/call-graph-builder.d.ts +192 -0
- package/dist/analysis/interprocedural/call-graph-builder.d.ts.map +1 -0
- package/dist/analysis/interprocedural/call-graph-builder.js +510 -0
- package/dist/analysis/interprocedural/call-graph-builder.js.map +1 -0
- package/dist/analysis/interprocedural/dfg-adapter.d.ts +166 -0
- package/dist/analysis/interprocedural/dfg-adapter.d.ts.map +1 -0
- package/dist/analysis/interprocedural/dfg-adapter.js +455 -0
- package/dist/analysis/interprocedural/dfg-adapter.js.map +1 -0
- package/dist/analysis/interprocedural/index.d.ts +9 -0
- package/dist/analysis/interprocedural/index.d.ts.map +1 -0
- package/dist/analysis/interprocedural/index.js +9 -0
- package/dist/analysis/interprocedural/index.js.map +1 -0
- package/dist/analysis/interprocedural/taint-propagator.d.ts +250 -0
- package/dist/analysis/interprocedural/taint-propagator.d.ts.map +1 -0
- package/dist/analysis/interprocedural/taint-propagator.js +435 -0
- package/dist/analysis/interprocedural/taint-propagator.js.map +1 -0
- package/dist/analysis/sanitizers/command-sanitizers.d.ts +12 -0
- package/dist/analysis/sanitizers/command-sanitizers.d.ts.map +1 -0
- package/dist/analysis/sanitizers/command-sanitizers.js +123 -0
- package/dist/analysis/sanitizers/command-sanitizers.js.map +1 -0
- package/dist/analysis/sanitizers/html-sanitizers.d.ts +12 -0
- package/dist/analysis/sanitizers/html-sanitizers.d.ts.map +1 -0
- package/dist/analysis/sanitizers/html-sanitizers.js +213 -0
- package/dist/analysis/sanitizers/html-sanitizers.js.map +1 -0
- package/dist/analysis/sanitizers/index.d.ts +35 -0
- package/dist/analysis/sanitizers/index.d.ts.map +1 -0
- package/dist/analysis/sanitizers/index.js +59 -0
- package/dist/analysis/sanitizers/index.js.map +1 -0
- package/dist/analysis/sanitizers/path-sanitizers.d.ts +12 -0
- package/dist/analysis/sanitizers/path-sanitizers.d.ts.map +1 -0
- package/dist/analysis/sanitizers/path-sanitizers.js +163 -0
- package/dist/analysis/sanitizers/path-sanitizers.js.map +1 -0
- package/dist/analysis/sanitizers/sql-sanitizers.d.ts +12 -0
- package/dist/analysis/sanitizers/sql-sanitizers.d.ts.map +1 -0
- package/dist/analysis/sanitizers/sql-sanitizers.js +216 -0
- package/dist/analysis/sanitizers/sql-sanitizers.js.map +1 -0
- package/dist/analysis/sanitizers/types.d.ts +78 -0
- package/dist/analysis/sanitizers/types.d.ts.map +1 -0
- package/dist/analysis/sanitizers/types.js +7 -0
- package/dist/analysis/sanitizers/types.js.map +1 -0
- package/dist/analysis/sanitizers/validation-sanitizers.d.ts +12 -0
- package/dist/analysis/sanitizers/validation-sanitizers.d.ts.map +1 -0
- package/dist/analysis/sanitizers/validation-sanitizers.js +268 -0
- package/dist/analysis/sanitizers/validation-sanitizers.js.map +1 -0
- package/dist/analysis/sinks/code-eval.d.ts +12 -0
- package/dist/analysis/sinks/code-eval.d.ts.map +1 -0
- package/dist/analysis/sinks/code-eval.js +231 -0
- package/dist/analysis/sinks/code-eval.js.map +1 -0
- package/dist/analysis/sinks/command-exec.d.ts +12 -0
- package/dist/analysis/sinks/command-exec.d.ts.map +1 -0
- package/dist/analysis/sinks/command-exec.js +187 -0
- package/dist/analysis/sinks/command-exec.js.map +1 -0
- package/dist/analysis/sinks/file-operations.d.ts +12 -0
- package/dist/analysis/sinks/file-operations.d.ts.map +1 -0
- package/dist/analysis/sinks/file-operations.js +239 -0
- package/dist/analysis/sinks/file-operations.js.map +1 -0
- package/dist/analysis/sinks/html-output.d.ts +12 -0
- package/dist/analysis/sinks/html-output.d.ts.map +1 -0
- package/dist/analysis/sinks/html-output.js +256 -0
- package/dist/analysis/sinks/html-output.js.map +1 -0
- package/dist/analysis/sinks/index.d.ts +30 -0
- package/dist/analysis/sinks/index.d.ts.map +1 -0
- package/dist/analysis/sinks/index.js +46 -0
- package/dist/analysis/sinks/index.js.map +1 -0
- package/dist/analysis/sinks/sql-query.d.ts +12 -0
- package/dist/analysis/sinks/sql-query.d.ts.map +1 -0
- package/dist/analysis/sinks/sql-query.js +209 -0
- package/dist/analysis/sinks/sql-query.js.map +1 -0
- package/dist/analysis/sinks/types.d.ts +97 -0
- package/dist/analysis/sinks/types.d.ts.map +1 -0
- package/dist/analysis/sinks/types.js +7 -0
- package/dist/analysis/sinks/types.js.map +1 -0
- package/dist/analysis/sources/database.d.ts +12 -0
- package/dist/analysis/sources/database.d.ts.map +1 -0
- package/dist/analysis/sources/database.js +211 -0
- package/dist/analysis/sources/database.js.map +1 -0
- package/dist/analysis/sources/environment.d.ts +12 -0
- package/dist/analysis/sources/environment.d.ts.map +1 -0
- package/dist/analysis/sources/environment.js +158 -0
- package/dist/analysis/sources/environment.js.map +1 -0
- package/dist/analysis/sources/file-system.d.ts +12 -0
- package/dist/analysis/sources/file-system.d.ts.map +1 -0
- package/dist/analysis/sources/file-system.js +180 -0
- package/dist/analysis/sources/file-system.js.map +1 -0
- package/dist/analysis/sources/http-request.d.ts +12 -0
- package/dist/analysis/sources/http-request.d.ts.map +1 -0
- package/dist/analysis/sources/http-request.js +179 -0
- package/dist/analysis/sources/http-request.js.map +1 -0
- package/dist/analysis/sources/index.d.ts +26 -0
- package/dist/analysis/sources/index.d.ts.map +1 -0
- package/dist/analysis/sources/index.js +40 -0
- package/dist/analysis/sources/index.js.map +1 -0
- package/dist/analysis/sources/types.d.ts +93 -0
- package/dist/analysis/sources/types.d.ts.map +1 -0
- package/dist/analysis/sources/types.js +7 -0
- package/dist/analysis/sources/types.js.map +1 -0
- package/dist/analysis/sources/user-input.d.ts +12 -0
- package/dist/analysis/sources/user-input.d.ts.map +1 -0
- package/dist/analysis/sources/user-input.js +261 -0
- package/dist/analysis/sources/user-input.js.map +1 -0
- package/dist/cve/cpe-matcher.d.ts +183 -0
- package/dist/cve/cpe-matcher.d.ts.map +1 -0
- package/dist/cve/cpe-matcher.js +396 -0
- package/dist/cve/cpe-matcher.js.map +1 -0
- package/dist/cve/cve-cache.d.ts +225 -0
- package/dist/cve/cve-cache.d.ts.map +1 -0
- package/dist/cve/cve-cache.js +452 -0
- package/dist/cve/cve-cache.js.map +1 -0
- package/dist/cve/cve-cache.test.d.ts +6 -0
- package/dist/cve/cve-cache.test.d.ts.map +1 -0
- package/dist/cve/cve-cache.test.js +363 -0
- package/dist/cve/cve-cache.test.js.map +1 -0
- package/dist/cve/dependency-parser.d.ts +204 -0
- package/dist/cve/dependency-parser.d.ts.map +1 -0
- package/dist/cve/dependency-parser.js +338 -0
- package/dist/cve/dependency-parser.js.map +1 -0
- package/dist/cve/index.d.ts +20 -0
- package/dist/cve/index.d.ts.map +1 -0
- package/dist/cve/index.js +13 -0
- package/dist/cve/index.js.map +1 -0
- package/dist/cve/nvd-client.d.ts +137 -0
- package/dist/cve/nvd-client.d.ts.map +1 -0
- package/dist/cve/nvd-client.js +333 -0
- package/dist/cve/nvd-client.js.map +1 -0
- package/dist/cve/rate-limiter.d.ts +194 -0
- package/dist/cve/rate-limiter.d.ts.map +1 -0
- package/dist/cve/rate-limiter.js +276 -0
- package/dist/cve/rate-limiter.js.map +1 -0
- package/dist/cve/report-generator.d.ts +145 -0
- package/dist/cve/report-generator.d.ts.map +1 -0
- package/dist/cve/report-generator.js +377 -0
- package/dist/cve/report-generator.js.map +1 -0
- package/dist/cve/report-generator.test.d.ts +6 -0
- package/dist/cve/report-generator.test.d.ts.map +1 -0
- package/dist/cve/report-generator.test.js +275 -0
- package/dist/cve/report-generator.test.js.map +1 -0
- package/dist/cve/vulnerability-scanner.d.ts +198 -0
- package/dist/cve/vulnerability-scanner.d.ts.map +1 -0
- package/dist/cve/vulnerability-scanner.js +311 -0
- package/dist/cve/vulnerability-scanner.js.map +1 -0
- package/dist/cve/vulnerability-scanner.test.d.ts +6 -0
- package/dist/cve/vulnerability-scanner.test.d.ts.map +1 -0
- package/dist/cve/vulnerability-scanner.test.js +329 -0
- package/dist/cve/vulnerability-scanner.test.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/rules/config/config-parser.d.ts +119 -0
- package/dist/rules/config/config-parser.d.ts.map +1 -0
- package/dist/rules/config/config-parser.js +376 -0
- package/dist/rules/config/config-parser.js.map +1 -0
- package/dist/rules/config/index.d.ts +8 -0
- package/dist/rules/config/index.d.ts.map +1 -0
- package/dist/rules/config/index.js +8 -0
- package/dist/rules/config/index.js.map +1 -0
- package/dist/rules/config/profiles.d.ts +85 -0
- package/dist/rules/config/profiles.d.ts.map +1 -0
- package/dist/rules/config/profiles.js +226 -0
- package/dist/rules/config/profiles.js.map +1 -0
- package/dist/rules/cwe/cwe-119-buffer-overflow.d.ts +9 -0
- package/dist/rules/cwe/cwe-119-buffer-overflow.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-119-buffer-overflow.js +54 -0
- package/dist/rules/cwe/cwe-119-buffer-overflow.js.map +1 -0
- package/dist/rules/cwe/cwe-125-oob-read.d.ts +20 -0
- package/dist/rules/cwe/cwe-125-oob-read.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-125-oob-read.js +247 -0
- package/dist/rules/cwe/cwe-125-oob-read.js.map +1 -0
- package/dist/rules/cwe/cwe-190-integer-overflow.d.ts +9 -0
- package/dist/rules/cwe/cwe-190-integer-overflow.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-190-integer-overflow.js +55 -0
- package/dist/rules/cwe/cwe-190-integer-overflow.js.map +1 -0
- package/dist/rules/cwe/cwe-20-input-validation.d.ts +21 -0
- package/dist/rules/cwe/cwe-20-input-validation.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-20-input-validation.js +342 -0
- package/dist/rules/cwe/cwe-20-input-validation.js.map +1 -0
- package/dist/rules/cwe/cwe-22-path-traversal.d.ts +20 -0
- package/dist/rules/cwe/cwe-22-path-traversal.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-22-path-traversal.js +306 -0
- package/dist/rules/cwe/cwe-22-path-traversal.js.map +1 -0
- package/dist/rules/cwe/cwe-269-improper-privilege.d.ts +9 -0
- package/dist/rules/cwe/cwe-269-improper-privilege.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-269-improper-privilege.js +58 -0
- package/dist/rules/cwe/cwe-269-improper-privilege.js.map +1 -0
- package/dist/rules/cwe/cwe-276-default-permissions.d.ts +9 -0
- package/dist/rules/cwe/cwe-276-default-permissions.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-276-default-permissions.js +54 -0
- package/dist/rules/cwe/cwe-276-default-permissions.js.map +1 -0
- package/dist/rules/cwe/cwe-287-improper-auth.d.ts +9 -0
- package/dist/rules/cwe/cwe-287-improper-auth.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-287-improper-auth.js +57 -0
- package/dist/rules/cwe/cwe-287-improper-auth.js.map +1 -0
- package/dist/rules/cwe/cwe-306-missing-auth-critical.d.ts +9 -0
- package/dist/rules/cwe/cwe-306-missing-auth-critical.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-306-missing-auth-critical.js +53 -0
- package/dist/rules/cwe/cwe-306-missing-auth-critical.js.map +1 -0
- package/dist/rules/cwe/cwe-352-csrf.d.ts +9 -0
- package/dist/rules/cwe/cwe-352-csrf.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-352-csrf.js +51 -0
- package/dist/rules/cwe/cwe-352-csrf.js.map +1 -0
- package/dist/rules/cwe/cwe-362-race-condition.d.ts +9 -0
- package/dist/rules/cwe/cwe-362-race-condition.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-362-race-condition.js +55 -0
- package/dist/rules/cwe/cwe-362-race-condition.js.map +1 -0
- package/dist/rules/cwe/cwe-416-use-after-free.d.ts +23 -0
- package/dist/rules/cwe/cwe-416-use-after-free.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-416-use-after-free.js +402 -0
- package/dist/rules/cwe/cwe-416-use-after-free.js.map +1 -0
- package/dist/rules/cwe/cwe-434-file-upload.d.ts +9 -0
- package/dist/rules/cwe/cwe-434-file-upload.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-434-file-upload.js +55 -0
- package/dist/rules/cwe/cwe-434-file-upload.js.map +1 -0
- package/dist/rules/cwe/cwe-476-null-deref.d.ts +9 -0
- package/dist/rules/cwe/cwe-476-null-deref.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-476-null-deref.js +55 -0
- package/dist/rules/cwe/cwe-476-null-deref.js.map +1 -0
- package/dist/rules/cwe/cwe-502-deserialization.d.ts +9 -0
- package/dist/rules/cwe/cwe-502-deserialization.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-502-deserialization.js +57 -0
- package/dist/rules/cwe/cwe-502-deserialization.js.map +1 -0
- package/dist/rules/cwe/cwe-77-command-injection.d.ts +9 -0
- package/dist/rules/cwe/cwe-77-command-injection.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-77-command-injection.js +55 -0
- package/dist/rules/cwe/cwe-77-command-injection.js.map +1 -0
- package/dist/rules/cwe/cwe-78-command-injection.d.ts +20 -0
- package/dist/rules/cwe/cwe-78-command-injection.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-78-command-injection.js +259 -0
- package/dist/rules/cwe/cwe-78-command-injection.js.map +1 -0
- package/dist/rules/cwe/cwe-787-oob-write.d.ts +21 -0
- package/dist/rules/cwe/cwe-787-oob-write.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-787-oob-write.js +321 -0
- package/dist/rules/cwe/cwe-787-oob-write.js.map +1 -0
- package/dist/rules/cwe/cwe-79-xss.d.ts +22 -0
- package/dist/rules/cwe/cwe-79-xss.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-79-xss.js +386 -0
- package/dist/rules/cwe/cwe-79-xss.js.map +1 -0
- package/dist/rules/cwe/cwe-798-hardcoded-credentials.d.ts +9 -0
- package/dist/rules/cwe/cwe-798-hardcoded-credentials.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-798-hardcoded-credentials.js +58 -0
- package/dist/rules/cwe/cwe-798-hardcoded-credentials.js.map +1 -0
- package/dist/rules/cwe/cwe-862-missing-auth.d.ts +9 -0
- package/dist/rules/cwe/cwe-862-missing-auth.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-862-missing-auth.js +55 -0
- package/dist/rules/cwe/cwe-862-missing-auth.js.map +1 -0
- package/dist/rules/cwe/cwe-863-incorrect-auth.d.ts +9 -0
- package/dist/rules/cwe/cwe-863-incorrect-auth.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-863-incorrect-auth.js +58 -0
- package/dist/rules/cwe/cwe-863-incorrect-auth.js.map +1 -0
- package/dist/rules/cwe/cwe-89-sql-injection.d.ts +21 -0
- package/dist/rules/cwe/cwe-89-sql-injection.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-89-sql-injection.js +456 -0
- package/dist/rules/cwe/cwe-89-sql-injection.js.map +1 -0
- package/dist/rules/cwe/cwe-918-ssrf.d.ts +9 -0
- package/dist/rules/cwe/cwe-918-ssrf.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-918-ssrf.js +59 -0
- package/dist/rules/cwe/cwe-918-ssrf.js.map +1 -0
- package/dist/rules/cwe/cwe-94-code-injection.d.ts +9 -0
- package/dist/rules/cwe/cwe-94-code-injection.d.ts.map +1 -0
- package/dist/rules/cwe/cwe-94-code-injection.js +59 -0
- package/dist/rules/cwe/cwe-94-code-injection.js.map +1 -0
- package/dist/rules/cwe/index.d.ts +43 -0
- package/dist/rules/cwe/index.d.ts.map +1 -0
- package/dist/rules/cwe/index.js +99 -0
- package/dist/rules/cwe/index.js.map +1 -0
- package/dist/rules/engine/index.d.ts +10 -0
- package/dist/rules/engine/index.d.ts.map +1 -0
- package/dist/rules/engine/index.js +9 -0
- package/dist/rules/engine/index.js.map +1 -0
- package/dist/rules/engine/rule-context.d.ts +99 -0
- package/dist/rules/engine/rule-context.d.ts.map +1 -0
- package/dist/rules/engine/rule-context.js +175 -0
- package/dist/rules/engine/rule-context.js.map +1 -0
- package/dist/rules/engine/rule-engine.d.ts +132 -0
- package/dist/rules/engine/rule-engine.d.ts.map +1 -0
- package/dist/rules/engine/rule-engine.js +379 -0
- package/dist/rules/engine/rule-engine.js.map +1 -0
- package/dist/rules/engine/rule-registry.d.ts +133 -0
- package/dist/rules/engine/rule-registry.d.ts.map +1 -0
- package/dist/rules/engine/rule-registry.js +281 -0
- package/dist/rules/engine/rule-registry.js.map +1 -0
- package/dist/rules/index.d.ts +14 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +16 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/owasp/a01-broken-access-control.d.ts +19 -0
- package/dist/rules/owasp/a01-broken-access-control.d.ts.map +1 -0
- package/dist/rules/owasp/a01-broken-access-control.js +295 -0
- package/dist/rules/owasp/a01-broken-access-control.js.map +1 -0
- package/dist/rules/owasp/a02-cryptographic-failures.d.ts +19 -0
- package/dist/rules/owasp/a02-cryptographic-failures.d.ts.map +1 -0
- package/dist/rules/owasp/a02-cryptographic-failures.js +327 -0
- package/dist/rules/owasp/a02-cryptographic-failures.js.map +1 -0
- package/dist/rules/owasp/a03-injection.d.ts +21 -0
- package/dist/rules/owasp/a03-injection.d.ts.map +1 -0
- package/dist/rules/owasp/a03-injection.js +342 -0
- package/dist/rules/owasp/a03-injection.js.map +1 -0
- package/dist/rules/owasp/a04-insecure-design.d.ts +19 -0
- package/dist/rules/owasp/a04-insecure-design.d.ts.map +1 -0
- package/dist/rules/owasp/a04-insecure-design.js +403 -0
- package/dist/rules/owasp/a04-insecure-design.js.map +1 -0
- package/dist/rules/owasp/a05-security-misconfiguration.d.ts +19 -0
- package/dist/rules/owasp/a05-security-misconfiguration.d.ts.map +1 -0
- package/dist/rules/owasp/a05-security-misconfiguration.js +371 -0
- package/dist/rules/owasp/a05-security-misconfiguration.js.map +1 -0
- package/dist/rules/owasp/a06-vulnerable-components.d.ts +18 -0
- package/dist/rules/owasp/a06-vulnerable-components.d.ts.map +1 -0
- package/dist/rules/owasp/a06-vulnerable-components.js +243 -0
- package/dist/rules/owasp/a06-vulnerable-components.js.map +1 -0
- package/dist/rules/owasp/a07-auth-failures.d.ts +19 -0
- package/dist/rules/owasp/a07-auth-failures.d.ts.map +1 -0
- package/dist/rules/owasp/a07-auth-failures.js +300 -0
- package/dist/rules/owasp/a07-auth-failures.js.map +1 -0
- package/dist/rules/owasp/a08-integrity-failures.d.ts +18 -0
- package/dist/rules/owasp/a08-integrity-failures.d.ts.map +1 -0
- package/dist/rules/owasp/a08-integrity-failures.js +306 -0
- package/dist/rules/owasp/a08-integrity-failures.js.map +1 -0
- package/dist/rules/owasp/a09-logging-failures.d.ts +18 -0
- package/dist/rules/owasp/a09-logging-failures.d.ts.map +1 -0
- package/dist/rules/owasp/a09-logging-failures.js +339 -0
- package/dist/rules/owasp/a09-logging-failures.js.map +1 -0
- package/dist/rules/owasp/a10-ssrf.d.ts +18 -0
- package/dist/rules/owasp/a10-ssrf.d.ts.map +1 -0
- package/dist/rules/owasp/a10-ssrf.js +349 -0
- package/dist/rules/owasp/a10-ssrf.js.map +1 -0
- package/dist/rules/owasp/index.d.ts +20 -0
- package/dist/rules/owasp/index.d.ts.map +1 -0
- package/dist/rules/owasp/index.js +53 -0
- package/dist/rules/owasp/index.js.map +1 -0
- package/dist/rules/types.d.ts +277 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +34 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/tests/integration/epic-integration.test.d.ts +7 -0
- package/dist/tests/integration/epic-integration.test.d.ts.map +1 -0
- package/dist/tests/integration/epic-integration.test.js +390 -0
- package/dist/tests/integration/epic-integration.test.js.map +1 -0
- package/dist/tests/rules/cwe/cwe-top25-1-13.test.d.ts +2 -0
- package/dist/tests/rules/cwe/cwe-top25-1-13.test.d.ts.map +1 -0
- package/dist/tests/rules/cwe/cwe-top25-1-13.test.js +154 -0
- package/dist/tests/rules/cwe/cwe-top25-1-13.test.js.map +1 -0
- package/dist/tests/rules/cwe/cwe-top25-14-25.test.d.ts +2 -0
- package/dist/tests/rules/cwe/cwe-top25-14-25.test.d.ts.map +1 -0
- package/dist/tests/rules/cwe/cwe-top25-14-25.test.js +121 -0
- package/dist/tests/rules/cwe/cwe-top25-14-25.test.js.map +1 -0
- package/dist/types/cve.d.ts +278 -0
- package/dist/types/cve.d.ts.map +1 -0
- package/dist/types/cve.js +7 -0
- package/dist/types/cve.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/rule.d.ts +245 -0
- package/dist/types/rule.d.ts.map +1 -0
- package/dist/types/rule.js +7 -0
- package/dist/types/rule.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview NVD (National Vulnerability Database) API 2.0 Client
|
|
3
|
+
* @module @nahisaho/musubix-security/cve/nvd-client
|
|
4
|
+
* @trace REQ-CVE-001, DES-CVE-001
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* NVD API error
|
|
8
|
+
*/
|
|
9
|
+
export class NVDAPIError extends Error {
|
|
10
|
+
statusCode;
|
|
11
|
+
retryable;
|
|
12
|
+
constructor(message, statusCode, retryable = false) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.statusCode = statusCode;
|
|
15
|
+
this.retryable = retryable;
|
|
16
|
+
this.name = 'NVDAPIError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* NVD API 2.0 Client
|
|
21
|
+
* @see https://nvd.nist.gov/developers/vulnerabilities
|
|
22
|
+
* @trace REQ-CVE-001, DES-CVE-001
|
|
23
|
+
*/
|
|
24
|
+
export class NVDClient {
|
|
25
|
+
baseUrl;
|
|
26
|
+
apiKey;
|
|
27
|
+
timeout;
|
|
28
|
+
maxRetries;
|
|
29
|
+
retryDelay;
|
|
30
|
+
constructor(options = {}) {
|
|
31
|
+
this.baseUrl = options.baseUrl ?? 'https://services.nvd.nist.gov/rest/json/cves/2.0';
|
|
32
|
+
this.apiKey = options.apiKey ?? process.env.NVD_API_KEY;
|
|
33
|
+
this.timeout = options.timeout ?? 30000;
|
|
34
|
+
this.maxRetries = options.maxRetries ?? 3;
|
|
35
|
+
this.retryDelay = options.retryDelay ?? 1000;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Check if API key is configured
|
|
39
|
+
*/
|
|
40
|
+
hasApiKey() {
|
|
41
|
+
return !!this.apiKey;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get a single CVE by ID
|
|
45
|
+
* @param cveId CVE identifier (e.g., "CVE-2021-44228")
|
|
46
|
+
*/
|
|
47
|
+
async getCVE(cveId) {
|
|
48
|
+
const normalizedId = this.normalizeCVEId(cveId);
|
|
49
|
+
const url = new URL(this.baseUrl);
|
|
50
|
+
url.searchParams.set('cveId', normalizedId);
|
|
51
|
+
const response = await this.makeRequest(url.toString());
|
|
52
|
+
if (response.totalResults === 0) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
return this.transformVulnerability(response.vulnerabilities[0]);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Search CVEs by keyword
|
|
59
|
+
* @param keyword Search keyword
|
|
60
|
+
* @param options Additional search options
|
|
61
|
+
*/
|
|
62
|
+
async searchByKeyword(keyword, options) {
|
|
63
|
+
const url = new URL(this.baseUrl);
|
|
64
|
+
url.searchParams.set('keywordSearch', keyword);
|
|
65
|
+
this.applySearchOptions(url, options);
|
|
66
|
+
return this.executeSearch(url);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Search CVEs by CPE (Common Platform Enumeration)
|
|
70
|
+
* @param cpe CPE 2.3 URI
|
|
71
|
+
* @param options Additional search options
|
|
72
|
+
*/
|
|
73
|
+
async searchByCPE(cpe, options) {
|
|
74
|
+
const url = new URL(this.baseUrl);
|
|
75
|
+
url.searchParams.set('cpeName', cpe);
|
|
76
|
+
this.applySearchOptions(url, options);
|
|
77
|
+
return this.executeSearch(url);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Search CVEs by CWE ID
|
|
81
|
+
* @param cweId CWE identifier (e.g., "CWE-79")
|
|
82
|
+
* @param options Additional search options
|
|
83
|
+
*/
|
|
84
|
+
async searchByCWE(cweId, options) {
|
|
85
|
+
const url = new URL(this.baseUrl);
|
|
86
|
+
// NVD API uses cweId parameter without "CWE-" prefix
|
|
87
|
+
const numericCweId = cweId.replace(/^CWE-/i, '');
|
|
88
|
+
url.searchParams.set('cweId', `CWE-${numericCweId}`);
|
|
89
|
+
this.applySearchOptions(url, options);
|
|
90
|
+
return this.executeSearch(url);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Search CVEs by date range
|
|
94
|
+
* @param startDate Start date
|
|
95
|
+
* @param endDate End date
|
|
96
|
+
* @param options Additional search options
|
|
97
|
+
*/
|
|
98
|
+
async searchByDateRange(startDate, endDate, options) {
|
|
99
|
+
const url = new URL(this.baseUrl);
|
|
100
|
+
url.searchParams.set('pubStartDate', this.formatDate(startDate));
|
|
101
|
+
url.searchParams.set('pubEndDate', this.formatDate(endDate));
|
|
102
|
+
this.applySearchOptions(url, options);
|
|
103
|
+
return this.executeSearch(url);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Search CVEs by CVSS score range
|
|
107
|
+
* @param minScore Minimum CVSS score
|
|
108
|
+
* @param maxScore Maximum CVSS score
|
|
109
|
+
* @param options Additional search options
|
|
110
|
+
*/
|
|
111
|
+
async searchByCVSSRange(minScore, maxScore, options) {
|
|
112
|
+
const url = new URL(this.baseUrl);
|
|
113
|
+
url.searchParams.set('cvssV3Severity', this.getSeverityFromScore(minScore));
|
|
114
|
+
this.applySearchOptions(url, options);
|
|
115
|
+
// Filter results by exact score range
|
|
116
|
+
const result = await this.executeSearch(url);
|
|
117
|
+
result.cves = result.cves.filter(cve => {
|
|
118
|
+
const score = cve.cvss?.baseScore ?? 0;
|
|
119
|
+
return score >= minScore && score <= maxScore;
|
|
120
|
+
});
|
|
121
|
+
result.totalResults = result.cves.length;
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Get recently modified CVEs
|
|
126
|
+
* @param daysBack Number of days to look back (default: 7)
|
|
127
|
+
* @param options Additional search options
|
|
128
|
+
*/
|
|
129
|
+
async getRecentlyModified(daysBack = 7, options) {
|
|
130
|
+
const endDate = new Date();
|
|
131
|
+
const startDate = new Date();
|
|
132
|
+
startDate.setDate(startDate.getDate() - daysBack);
|
|
133
|
+
const url = new URL(this.baseUrl);
|
|
134
|
+
url.searchParams.set('lastModStartDate', this.formatDate(startDate));
|
|
135
|
+
url.searchParams.set('lastModEndDate', this.formatDate(endDate));
|
|
136
|
+
this.applySearchOptions(url, options);
|
|
137
|
+
return this.executeSearch(url);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Apply search options to URL
|
|
141
|
+
*/
|
|
142
|
+
applySearchOptions(url, options) {
|
|
143
|
+
if (!options)
|
|
144
|
+
return;
|
|
145
|
+
if (options.minCvssScore !== undefined) {
|
|
146
|
+
url.searchParams.set('cvssV3Severity', this.getSeverityFromScore(options.minCvssScore));
|
|
147
|
+
}
|
|
148
|
+
if (options.resultsPerPage !== undefined) {
|
|
149
|
+
url.searchParams.set('resultsPerPage', String(Math.min(options.resultsPerPage, 2000)));
|
|
150
|
+
}
|
|
151
|
+
if (options.startIndex !== undefined) {
|
|
152
|
+
url.searchParams.set('startIndex', String(options.startIndex));
|
|
153
|
+
}
|
|
154
|
+
if (options.publishedAfter) {
|
|
155
|
+
url.searchParams.set('pubStartDate', this.formatDate(options.publishedAfter));
|
|
156
|
+
}
|
|
157
|
+
if (options.publishedBefore) {
|
|
158
|
+
url.searchParams.set('pubEndDate', this.formatDate(options.publishedBefore));
|
|
159
|
+
}
|
|
160
|
+
if (options.modifiedAfter) {
|
|
161
|
+
url.searchParams.set('lastModStartDate', this.formatDate(options.modifiedAfter));
|
|
162
|
+
}
|
|
163
|
+
if (options.modifiedBefore) {
|
|
164
|
+
url.searchParams.set('lastModEndDate', this.formatDate(options.modifiedBefore));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Execute search and return results
|
|
169
|
+
*/
|
|
170
|
+
async executeSearch(url) {
|
|
171
|
+
const response = await this.makeRequest(url.toString());
|
|
172
|
+
return {
|
|
173
|
+
totalResults: response.totalResults,
|
|
174
|
+
resultsPerPage: response.resultsPerPage,
|
|
175
|
+
startIndex: response.startIndex,
|
|
176
|
+
cves: response.vulnerabilities.map(v => this.transformVulnerability(v)),
|
|
177
|
+
timestamp: new Date(response.timestamp),
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Make HTTP request with retry logic
|
|
182
|
+
*/
|
|
183
|
+
async makeRequest(url) {
|
|
184
|
+
const headers = {
|
|
185
|
+
'Accept': 'application/json',
|
|
186
|
+
};
|
|
187
|
+
if (this.apiKey) {
|
|
188
|
+
headers['apiKey'] = this.apiKey;
|
|
189
|
+
}
|
|
190
|
+
let lastError;
|
|
191
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
192
|
+
try {
|
|
193
|
+
const controller = new AbortController();
|
|
194
|
+
const timeoutId = setTimeout(() => controller.abort(), this.timeout);
|
|
195
|
+
const response = await fetch(url, {
|
|
196
|
+
method: 'GET',
|
|
197
|
+
headers,
|
|
198
|
+
signal: controller.signal,
|
|
199
|
+
});
|
|
200
|
+
clearTimeout(timeoutId);
|
|
201
|
+
if (!response.ok) {
|
|
202
|
+
const retryable = response.status === 429 || response.status >= 500;
|
|
203
|
+
throw new NVDAPIError(`NVD API error: ${response.status} ${response.statusText}`, response.status, retryable);
|
|
204
|
+
}
|
|
205
|
+
return await response.json();
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
209
|
+
// Check if error is retryable
|
|
210
|
+
const isRetryable = error instanceof NVDAPIError ? error.retryable :
|
|
211
|
+
error instanceof Error && error.name === 'AbortError';
|
|
212
|
+
if (!isRetryable || attempt === this.maxRetries) {
|
|
213
|
+
throw lastError;
|
|
214
|
+
}
|
|
215
|
+
// Exponential backoff
|
|
216
|
+
const delay = this.retryDelay * Math.pow(2, attempt);
|
|
217
|
+
await this.sleep(delay);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
throw lastError ?? new Error('Unknown error');
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Transform NVD API response to CVE type
|
|
224
|
+
*/
|
|
225
|
+
transformVulnerability(vuln) {
|
|
226
|
+
const cveData = vuln.cve;
|
|
227
|
+
// Get English description
|
|
228
|
+
const description = cveData.descriptions.find(d => d.lang === 'en')?.value ?? '';
|
|
229
|
+
// Get CVSS v3.1 score
|
|
230
|
+
let cvss;
|
|
231
|
+
const cvssMetric = cveData.metrics?.cvssMetricV31?.[0];
|
|
232
|
+
if (cvssMetric) {
|
|
233
|
+
const cvssData = cvssMetric.cvssData;
|
|
234
|
+
cvss = {
|
|
235
|
+
version: cvssData.version,
|
|
236
|
+
baseScore: cvssData.baseScore,
|
|
237
|
+
severity: cvssData.baseSeverity,
|
|
238
|
+
vectorString: cvssData.vectorString,
|
|
239
|
+
attackVector: cvssData.attackVector,
|
|
240
|
+
attackComplexity: cvssData.attackComplexity,
|
|
241
|
+
privilegesRequired: cvssData.privilegesRequired,
|
|
242
|
+
userInteraction: cvssData.userInteraction,
|
|
243
|
+
scope: cvssData.scope,
|
|
244
|
+
confidentialityImpact: cvssData.confidentialityImpact,
|
|
245
|
+
integrityImpact: cvssData.integrityImpact,
|
|
246
|
+
availabilityImpact: cvssData.availabilityImpact,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
// Get CWE IDs
|
|
250
|
+
const cwes = [];
|
|
251
|
+
if (cveData.weaknesses) {
|
|
252
|
+
for (const weakness of cveData.weaknesses) {
|
|
253
|
+
for (const desc of weakness.description) {
|
|
254
|
+
if (desc.lang === 'en' && desc.value.startsWith('CWE-')) {
|
|
255
|
+
cwes.push(desc.value);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// Get references
|
|
261
|
+
const references = (cveData.references ?? []).map(ref => ({
|
|
262
|
+
url: ref.url,
|
|
263
|
+
source: ref.source,
|
|
264
|
+
tags: ref.tags,
|
|
265
|
+
}));
|
|
266
|
+
// Get affected products (CPE matches)
|
|
267
|
+
const affectedProducts = [];
|
|
268
|
+
if (cveData.configurations) {
|
|
269
|
+
for (const config of cveData.configurations) {
|
|
270
|
+
for (const node of config.nodes) {
|
|
271
|
+
for (const match of node.cpeMatch) {
|
|
272
|
+
affectedProducts.push({
|
|
273
|
+
cpe: match.criteria,
|
|
274
|
+
vulnerable: match.vulnerable,
|
|
275
|
+
versionStartIncluding: match.versionStartIncluding,
|
|
276
|
+
versionStartExcluding: match.versionStartExcluding,
|
|
277
|
+
versionEndIncluding: match.versionEndIncluding,
|
|
278
|
+
versionEndExcluding: match.versionEndExcluding,
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return {
|
|
285
|
+
id: cveData.id,
|
|
286
|
+
description,
|
|
287
|
+
published: new Date(cveData.published),
|
|
288
|
+
lastModified: new Date(cveData.lastModified),
|
|
289
|
+
cvss,
|
|
290
|
+
cwes,
|
|
291
|
+
references,
|
|
292
|
+
affectedProducts,
|
|
293
|
+
status: cveData.vulnStatus,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Normalize CVE ID format
|
|
298
|
+
*/
|
|
299
|
+
normalizeCVEId(cveId) {
|
|
300
|
+
const match = cveId.match(/^(?:CVE-)?(\d{4})-(\d+)$/i);
|
|
301
|
+
if (!match) {
|
|
302
|
+
throw new NVDAPIError(`Invalid CVE ID format: ${cveId}`);
|
|
303
|
+
}
|
|
304
|
+
return `CVE-${match[1]}-${match[2]}`;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Format date for NVD API
|
|
308
|
+
*/
|
|
309
|
+
formatDate(date) {
|
|
310
|
+
return date.toISOString();
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Get CVSS severity string from score
|
|
314
|
+
*/
|
|
315
|
+
getSeverityFromScore(score) {
|
|
316
|
+
if (score >= 9.0)
|
|
317
|
+
return 'CRITICAL';
|
|
318
|
+
if (score >= 7.0)
|
|
319
|
+
return 'HIGH';
|
|
320
|
+
if (score >= 4.0)
|
|
321
|
+
return 'MEDIUM';
|
|
322
|
+
if (score >= 0.1)
|
|
323
|
+
return 'LOW';
|
|
324
|
+
return 'NONE';
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Sleep for specified milliseconds
|
|
328
|
+
*/
|
|
329
|
+
sleep(ms) {
|
|
330
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=nvd-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nvd-client.js","sourceRoot":"","sources":["../../src/cve/nvd-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Token Bucket Rate Limiter for NVD API
|
|
3
|
+
* @module @nahisaho/musubix-security/cve/rate-limiter
|
|
4
|
+
*
|
|
5
|
+
* Implements Token Bucket algorithm for rate limiting.
|
|
6
|
+
* - With API Key: 50 requests per 30 seconds
|
|
7
|
+
* - Without API Key: 5 requests per 30 seconds
|
|
8
|
+
*
|
|
9
|
+
* @requirement REQ-CVE-001 - NVD API rate limiting compliance
|
|
10
|
+
* @design DES-EPIC2-002 - Rate Limiter component
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Rate limiter configuration options
|
|
14
|
+
*/
|
|
15
|
+
export interface RateLimiterOptions {
|
|
16
|
+
/**
|
|
17
|
+
* Maximum number of tokens in the bucket
|
|
18
|
+
* @default 50 (with API key) or 5 (without)
|
|
19
|
+
*/
|
|
20
|
+
maxTokens: number;
|
|
21
|
+
/**
|
|
22
|
+
* Time window in milliseconds for token refill
|
|
23
|
+
* @default 30000 (30 seconds)
|
|
24
|
+
*/
|
|
25
|
+
windowMs: number;
|
|
26
|
+
/**
|
|
27
|
+
* Number of tokens to refill per window
|
|
28
|
+
* @default maxTokens
|
|
29
|
+
*/
|
|
30
|
+
refillTokens?: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Rate limit status information
|
|
34
|
+
*/
|
|
35
|
+
export interface RateLimitStatus {
|
|
36
|
+
/** Available tokens */
|
|
37
|
+
availableTokens: number;
|
|
38
|
+
/** Maximum tokens */
|
|
39
|
+
maxTokens: number;
|
|
40
|
+
/** Milliseconds until next refill */
|
|
41
|
+
msUntilRefill: number;
|
|
42
|
+
/** Whether a request can be made now */
|
|
43
|
+
canProceed: boolean;
|
|
44
|
+
/** Estimated wait time if cannot proceed (ms) */
|
|
45
|
+
waitTimeMs: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Token Bucket Rate Limiter
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* // With API key (50 req/30s)
|
|
53
|
+
* const limiter = new RateLimiter({ maxTokens: 50, windowMs: 30000 });
|
|
54
|
+
*
|
|
55
|
+
* // Check if request can proceed
|
|
56
|
+
* if (limiter.canProceed()) {
|
|
57
|
+
* limiter.consume();
|
|
58
|
+
* // make request
|
|
59
|
+
* }
|
|
60
|
+
*
|
|
61
|
+
* // Or wait for token
|
|
62
|
+
* await limiter.waitForToken();
|
|
63
|
+
* // make request
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare class RateLimiter {
|
|
67
|
+
private tokens;
|
|
68
|
+
private readonly maxTokens;
|
|
69
|
+
private readonly windowMs;
|
|
70
|
+
private readonly refillTokens;
|
|
71
|
+
private lastRefillTime;
|
|
72
|
+
private refillInterval;
|
|
73
|
+
constructor(options: RateLimiterOptions);
|
|
74
|
+
/**
|
|
75
|
+
* Create a rate limiter configured for NVD API with API key
|
|
76
|
+
* @returns Rate limiter with 50 req/30s limit
|
|
77
|
+
*/
|
|
78
|
+
static withApiKey(): RateLimiter;
|
|
79
|
+
/**
|
|
80
|
+
* Create a rate limiter configured for NVD API without API key
|
|
81
|
+
* @returns Rate limiter with 5 req/30s limit
|
|
82
|
+
*/
|
|
83
|
+
static withoutApiKey(): RateLimiter;
|
|
84
|
+
/**
|
|
85
|
+
* Create appropriate rate limiter based on whether API key is provided
|
|
86
|
+
* @param hasApiKey - Whether an API key is available
|
|
87
|
+
* @returns Configured rate limiter
|
|
88
|
+
*/
|
|
89
|
+
static forNVD(hasApiKey: boolean): RateLimiter;
|
|
90
|
+
/**
|
|
91
|
+
* Refill tokens based on elapsed time
|
|
92
|
+
*/
|
|
93
|
+
private refill;
|
|
94
|
+
/**
|
|
95
|
+
* Check if a request can proceed without waiting
|
|
96
|
+
* @returns True if tokens are available
|
|
97
|
+
*/
|
|
98
|
+
canProceed(): boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Consume a token for a request
|
|
101
|
+
* @returns True if token was consumed, false if no tokens available
|
|
102
|
+
*/
|
|
103
|
+
consume(): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Try to acquire a token, consuming it if available
|
|
106
|
+
* Alias for consume() for clearer semantics
|
|
107
|
+
* @returns True if token was acquired
|
|
108
|
+
*/
|
|
109
|
+
tryAcquire(): boolean;
|
|
110
|
+
/**
|
|
111
|
+
* Wait for a token to become available, then consume it
|
|
112
|
+
* @param timeoutMs - Maximum time to wait (default: 2 * windowMs)
|
|
113
|
+
* @returns Promise that resolves when token is acquired
|
|
114
|
+
* @throws Error if timeout is exceeded
|
|
115
|
+
*/
|
|
116
|
+
waitForToken(timeoutMs?: number): Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* Get current rate limit status
|
|
119
|
+
* @returns Current status including available tokens and wait time
|
|
120
|
+
*/
|
|
121
|
+
getStatus(): RateLimitStatus;
|
|
122
|
+
/**
|
|
123
|
+
* Reset the rate limiter to initial state
|
|
124
|
+
*/
|
|
125
|
+
reset(): void;
|
|
126
|
+
/**
|
|
127
|
+
* Start automatic token refill (for long-running processes)
|
|
128
|
+
* @param callback - Optional callback when tokens are refilled
|
|
129
|
+
*/
|
|
130
|
+
startAutoRefill(callback?: (tokens: number) => void): void;
|
|
131
|
+
/**
|
|
132
|
+
* Stop automatic token refill
|
|
133
|
+
*/
|
|
134
|
+
stopAutoRefill(): void;
|
|
135
|
+
/**
|
|
136
|
+
* Dispose of the rate limiter
|
|
137
|
+
*/
|
|
138
|
+
dispose(): void;
|
|
139
|
+
/**
|
|
140
|
+
* Sleep for specified milliseconds
|
|
141
|
+
*/
|
|
142
|
+
private sleep;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Decorator for rate-limited async functions
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```typescript
|
|
149
|
+
* const limiter = RateLimiter.forNVD(true);
|
|
150
|
+
*
|
|
151
|
+
* const rateLimitedFetch = withRateLimit(limiter, async (url: string) => {
|
|
152
|
+
* return fetch(url);
|
|
153
|
+
* });
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
export declare function withRateLimit<T extends (...args: unknown[]) => Promise<unknown>>(limiter: RateLimiter, fn: T): T;
|
|
157
|
+
/**
|
|
158
|
+
* Rate limiter pool for managing multiple limiters
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* ```typescript
|
|
162
|
+
* const pool = new RateLimiterPool();
|
|
163
|
+
*
|
|
164
|
+
* // Get or create a limiter for NVD API
|
|
165
|
+
* const nvdLimiter = pool.get('nvd', () => RateLimiter.forNVD(true));
|
|
166
|
+
* ```
|
|
167
|
+
*/
|
|
168
|
+
export declare class RateLimiterPool {
|
|
169
|
+
private limiters;
|
|
170
|
+
/**
|
|
171
|
+
* Get or create a rate limiter by key
|
|
172
|
+
* @param key - Unique identifier for the limiter
|
|
173
|
+
* @param factory - Factory function to create limiter if not exists
|
|
174
|
+
* @returns The rate limiter
|
|
175
|
+
*/
|
|
176
|
+
get(key: string, factory: () => RateLimiter): RateLimiter;
|
|
177
|
+
/**
|
|
178
|
+
* Check if a limiter exists for the given key
|
|
179
|
+
*/
|
|
180
|
+
has(key: string): boolean;
|
|
181
|
+
/**
|
|
182
|
+
* Remove a limiter by key
|
|
183
|
+
*/
|
|
184
|
+
remove(key: string): boolean;
|
|
185
|
+
/**
|
|
186
|
+
* Get all limiter keys
|
|
187
|
+
*/
|
|
188
|
+
keys(): string[];
|
|
189
|
+
/**
|
|
190
|
+
* Dispose all limiters
|
|
191
|
+
*/
|
|
192
|
+
dispose(): void;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/cve/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uBAAuB;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,UAAU,EAAE,OAAO,CAAC;IACpB,iDAAiD;IACjD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,cAAc,CAA+C;gBAEzD,OAAO,EAAE,kBAAkB;IAQvC;;;OAGG;IACH,MAAM,CAAC,UAAU,IAAI,WAAW;IAIhC;;;OAGG;IACH,MAAM,CAAC,aAAa,IAAI,WAAW;IAInC;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,GAAG,WAAW;IAI9C;;OAEG;IACH,OAAO,CAAC,MAAM;IAcd;;;OAGG;IACH,UAAU,IAAI,OAAO;IAKrB;;;OAGG;IACH,OAAO,IAAI,OAAO;IAWlB;;;;OAIG;IACH,UAAU,IAAI,OAAO;IAIrB;;;;;OAKG;IACG,YAAY,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBrD;;;OAGG;IACH,SAAS,IAAI,eAAe;IAuB5B;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;;OAGG;IACH,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAe1D;;OAEG;IACH,cAAc,IAAI,IAAI;IAOtB;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,EAC9E,OAAO,EAAE,WAAW,EACpB,EAAE,EAAE,CAAC,GACJ,CAAC,CAKH;AAED;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAkC;IAElD;;;;;OAKG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,WAAW,GAAG,WAAW;IAWzD;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAU5B;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;IAIhB;;OAEG;IACH,OAAO,IAAI,IAAI;CAMhB"}
|