@develler/remediation-agent 1.0.3 → 1.0.5
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/commands/connect.d.ts +1 -2
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +19 -2
- package/dist/commands/connect.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/remediationInterceptor.d.ts +3 -1
- package/dist/middleware/remediationInterceptor.d.ts.map +1 -1
- package/dist/middleware/remediationInterceptor.js +27 -4
- package/dist/middleware/remediationInterceptor.js.map +1 -1
- package/dist/services/TelemetryReporterService.d.ts +25 -0
- package/dist/services/TelemetryReporterService.d.ts.map +1 -0
- package/dist/services/TelemetryReporterService.js +58 -0
- package/dist/services/TelemetryReporterService.js.map +1 -0
- package/package.json +1 -1
|
@@ -9,8 +9,7 @@
|
|
|
9
9
|
* Safe to re-run — overwrites any existing connection file.
|
|
10
10
|
*
|
|
11
11
|
* Usage:
|
|
12
|
-
* REMEDIATION_SAAS_URL
|
|
13
|
-
* REMEDIATION_CONNECTION_KEY=<key from dashboard> \
|
|
12
|
+
* Add REMEDIATION_SAAS_URL and REMEDIATION_CONNECTION_KEY to your .env, then:
|
|
14
13
|
* npx remediation-connect
|
|
15
14
|
*/
|
|
16
15
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}
|
package/dist/commands/connect.js
CHANGED
|
@@ -10,8 +10,7 @@
|
|
|
10
10
|
* Safe to re-run — overwrites any existing connection file.
|
|
11
11
|
*
|
|
12
12
|
* Usage:
|
|
13
|
-
* REMEDIATION_SAAS_URL
|
|
14
|
-
* REMEDIATION_CONNECTION_KEY=<key from dashboard> \
|
|
13
|
+
* Add REMEDIATION_SAAS_URL and REMEDIATION_CONNECTION_KEY to your .env, then:
|
|
15
14
|
* npx remediation-connect
|
|
16
15
|
*/
|
|
17
16
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
@@ -55,7 +54,25 @@ const axios_1 = __importDefault(require("axios"));
|
|
|
55
54
|
const fs_1 = require("fs");
|
|
56
55
|
const path_1 = require("path");
|
|
57
56
|
const CONNECTION_FILE = (0, path_1.join)(process.cwd(), '.remediation-connection.json');
|
|
57
|
+
function loadDotEnv() {
|
|
58
|
+
const envPath = (0, path_1.join)(process.cwd(), '.env');
|
|
59
|
+
if (!(0, fs_1.existsSync)(envPath))
|
|
60
|
+
return;
|
|
61
|
+
for (const line of (0, fs_1.readFileSync)(envPath, 'utf8').split('\n')) {
|
|
62
|
+
const trimmed = line.trim();
|
|
63
|
+
if (!trimmed || trimmed.startsWith('#'))
|
|
64
|
+
continue;
|
|
65
|
+
const eq = trimmed.indexOf('=');
|
|
66
|
+
if (eq === -1)
|
|
67
|
+
continue;
|
|
68
|
+
const key = trimmed.slice(0, eq).trim();
|
|
69
|
+
const value = trimmed.slice(eq + 1).trim().replace(/^["']|["']$/g, '');
|
|
70
|
+
if (key && !(key in process.env))
|
|
71
|
+
process.env[key] = value;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
58
74
|
async function main() {
|
|
75
|
+
loadDotEnv();
|
|
59
76
|
const saasUrl = (process.env['REMEDIATION_SAAS_URL'] ?? '').replace(/\/+$/, '');
|
|
60
77
|
const connectionKey = process.env['REMEDIATION_CONNECTION_KEY'] ?? '';
|
|
61
78
|
const webhookUrl = process.env['REMEDIATION_WEBHOOK_URL'] ?? null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":";;AACA
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAWtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAS,yBAAyB,CAAC;AAGnE,YAAY,EAAE,gBAAgB,EAAE,MAAqC,yBAAyB,CAAC;AAC/F,YAAY,EAAE,wBAAwB,EAAE,MAA6B,gCAAgC,CAAC;AACtG,YAAY,EAAE,6BAA6B,EAAE,MAAwB,qCAAqC,CAAC;AAC3G,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAO,yBAAyB,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,MAA6C,gCAAgC,CAAC;AACvG,OAAO,EAAE,WAAW,EAAE,MAA+C,6BAA6B,CAAC;AACnG,OAAO,EAAE,aAAa,EAAE,MAA6C,6BAA6B,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAuC,mCAAmC,CAAC;AACzG,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAM1G,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,QAAQ,CAAC,QAAQ,CAAC,EAAQ,MAAM,CAAC;IACjC,gFAAgF;IAChF,QAAQ,CAAC,UAAU,CAAC,EAAM,gBAAgB,CAAC;IAC3C,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,CAAC,EAAS,OAAO,CAAC;IAClC,6DAA6D;IAC7D,QAAQ,CAAC,YAAY,CAAC,EAAI,MAAM,CAAC;IACjC,oFAAoF;IACpF,QAAQ,CAAC,WAAW,CAAC,EAAK,MAAM,CAAC;IACjC,sEAAsE;IACtE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CACnC;AAMD,MAAM,WAAW,gBAAgB;IAC/B,wDAAwD;IACxD,OAAO,IAAI,cAAc,CAAC;IAC1B,+EAA+E;IAC/E,aAAa,IAAI,MAAM,CAAC;IACxB,0CAA0C;IAC1C,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAMD,wBAAsB,2BAA2B,CAC/C,GAAG,GAAE,iBAAsB,GAC1B,OAAO,CAAC,gBAAgB,CAAC,CAgC3B"}
|
package/dist/index.js
CHANGED
|
@@ -27,6 +27,7 @@ const InstructionCacheService_js_1 = require("./services/InstructionCacheService
|
|
|
27
27
|
const MaskingEngine_js_1 = require("./services/MaskingEngine.js");
|
|
28
28
|
const AgentConnectionService_js_1 = require("./services/AgentConnectionService.js");
|
|
29
29
|
const remediationInterceptor_js_1 = require("./middleware/remediationInterceptor.js");
|
|
30
|
+
const TelemetryReporterService_js_1 = require("./services/TelemetryReporterService.js");
|
|
30
31
|
const webhookController_js_1 = require("./controllers/webhookController.js");
|
|
31
32
|
var instructions_js_1 = require("./types/instructions.js");
|
|
32
33
|
Object.defineProperty(exports, "MaskRule", { enumerable: true, get: function () { return instructions_js_1.MaskRule; } });
|
|
@@ -55,7 +56,8 @@ async function createRemediationMiddleware(cfg = {}) {
|
|
|
55
56
|
const breaker = new CircuitBreakerService_js_1.CircuitBreakerService(redis, connection.client_id, cbTtl);
|
|
56
57
|
const masker = new MaskingEngine_js_1.MaskingEngine();
|
|
57
58
|
const agentConn = new AgentConnectionService_js_1.AgentConnectionService(redis, cache, connection);
|
|
58
|
-
const
|
|
59
|
+
const reporter = new TelemetryReporterService_js_1.TelemetryReporterService(connection);
|
|
60
|
+
const interceptor = new remediationInterceptor_js_1.RemediationInterceptor(agentConn, masker, breaker, enabled, reporter);
|
|
59
61
|
return {
|
|
60
62
|
handler() {
|
|
61
63
|
return interceptor.handler();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import type { LifecycleInterceptorInterface } from '../contracts/lifecycleInterc
|
|
|
4
4
|
import type { MaskRule } from '../types/instructions.js';
|
|
5
5
|
import { CircuitBreakerService } from '../services/CircuitBreakerService.js';
|
|
6
6
|
import { MaskingEngine } from '../services/MaskingEngine.js';
|
|
7
|
+
import { TelemetryReporterService } from '../services/TelemetryReporterService.js';
|
|
7
8
|
/**
|
|
8
9
|
* Production-grade in-memory interceptor for Express (Mode B).
|
|
9
10
|
*
|
|
@@ -29,7 +30,8 @@ export declare class RemediationInterceptor implements LifecycleInterceptorInter
|
|
|
29
30
|
private readonly masker;
|
|
30
31
|
private readonly breaker;
|
|
31
32
|
private readonly enabled;
|
|
32
|
-
|
|
33
|
+
private readonly reporter;
|
|
34
|
+
constructor(connection: AgentConnectionInterface, masker: MaskingEngine, breaker: CircuitBreakerService, enabled: boolean, reporter?: TelemetryReporterService | null);
|
|
33
35
|
/** Returns an Express RequestHandler — the function registered via app.use(). */
|
|
34
36
|
handler(): RequestHandler;
|
|
35
37
|
interceptRequest(req: Request, res: Response): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remediationInterceptor.d.ts","sourceRoot":"","sources":["../../src/middleware/remediationInterceptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"remediationInterceptor.d.ts","sourceRoot":"","sources":["../../src/middleware/remediationInterceptor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAgB,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/E,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AAC1F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AAGnF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,sBAAuB,YAAW,6BAA6B;IAExE,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAJR,UAAU,EAAE,wBAAwB,EACpC,MAAM,EAAM,aAAa,EACzB,OAAO,EAAK,qBAAqB,EACjC,OAAO,EAAK,OAAO,EACnB,QAAQ,GAAI,wBAAwB,GAAG,IAAW;IAGrE,iFAAiF;IACjF,OAAO,IAAI,cAAc;IAyGnB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAC/D,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BrF,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO;IAI1D,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IAIxC,kBAAkB,CAAC,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;CAG3C"}
|
|
@@ -26,11 +26,13 @@ class RemediationInterceptor {
|
|
|
26
26
|
masker;
|
|
27
27
|
breaker;
|
|
28
28
|
enabled;
|
|
29
|
-
|
|
29
|
+
reporter;
|
|
30
|
+
constructor(connection, masker, breaker, enabled, reporter = null) {
|
|
30
31
|
this.connection = connection;
|
|
31
32
|
this.masker = masker;
|
|
32
33
|
this.breaker = breaker;
|
|
33
34
|
this.enabled = enabled;
|
|
35
|
+
this.reporter = reporter;
|
|
34
36
|
}
|
|
35
37
|
/** Returns an Express RequestHandler — the function registered via app.use(). */
|
|
36
38
|
handler() {
|
|
@@ -44,7 +46,8 @@ class RemediationInterceptor {
|
|
|
44
46
|
next();
|
|
45
47
|
return;
|
|
46
48
|
}
|
|
47
|
-
// Step 2 — load instructions from Redis.
|
|
49
|
+
// Step 2 — load instructions from Redis (measure latency for telemetry).
|
|
50
|
+
const t0 = performance.now();
|
|
48
51
|
let instructions;
|
|
49
52
|
try {
|
|
50
53
|
instructions = await this.connection.getActiveInstructions();
|
|
@@ -54,6 +57,7 @@ class RemediationInterceptor {
|
|
|
54
57
|
next();
|
|
55
58
|
return;
|
|
56
59
|
}
|
|
60
|
+
const latencyMs = performance.now() - t0;
|
|
57
61
|
if (instructions.isEmpty()) {
|
|
58
62
|
next();
|
|
59
63
|
return;
|
|
@@ -70,8 +74,27 @@ class RemediationInterceptor {
|
|
|
70
74
|
next();
|
|
71
75
|
return;
|
|
72
76
|
}
|
|
73
|
-
if (blocked)
|
|
74
|
-
|
|
77
|
+
if (blocked) {
|
|
78
|
+
this.reporter?.record({
|
|
79
|
+
route: req.path,
|
|
80
|
+
method: req.method,
|
|
81
|
+
instruction_type: 'route_block',
|
|
82
|
+
latency_ms: Math.round(latencyMs * 1000) / 1000,
|
|
83
|
+
applied_at: new Date().toISOString(),
|
|
84
|
+
});
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
// Determine primary instruction type for this request.
|
|
88
|
+
const instrType = instructions.hasMaskRules() ? 'pii_mask'
|
|
89
|
+
: Object.keys(instructions.injectHeaders()).length > 0 ? 'header_inject'
|
|
90
|
+
: 'pii_mask';
|
|
91
|
+
this.reporter?.record({
|
|
92
|
+
route: req.path,
|
|
93
|
+
method: req.method,
|
|
94
|
+
instruction_type: instrType,
|
|
95
|
+
latency_ms: Math.round(latencyMs * 1000) / 1000,
|
|
96
|
+
applied_at: new Date().toISOString(),
|
|
97
|
+
});
|
|
75
98
|
// Step 4 — intercept res.json() before calling next().
|
|
76
99
|
// We override the method here so that when the downstream route handler
|
|
77
100
|
// calls res.json(body), our version executes instead.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remediationInterceptor.js","sourceRoot":"","sources":["../../src/middleware/remediationInterceptor.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"remediationInterceptor.js","sourceRoot":"","sources":["../../src/middleware/remediationInterceptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ConnectionConfig } from '../types/wireProtocol.js';
|
|
2
|
+
export interface TelemetryEvent {
|
|
3
|
+
route: string;
|
|
4
|
+
method: string;
|
|
5
|
+
instruction_type: string;
|
|
6
|
+
latency_ms: number;
|
|
7
|
+
applied_at: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Fire-and-forget telemetry reporter.
|
|
11
|
+
* Buffers events in memory and flushes to the SaaS every 5 seconds,
|
|
12
|
+
* or immediately when the buffer reaches 50 events.
|
|
13
|
+
* All errors are swallowed — telemetry must never impact request latency.
|
|
14
|
+
*/
|
|
15
|
+
export declare class TelemetryReporterService {
|
|
16
|
+
private readonly url;
|
|
17
|
+
private readonly clientId;
|
|
18
|
+
private readonly token;
|
|
19
|
+
private readonly buffer;
|
|
20
|
+
private flushTimer;
|
|
21
|
+
constructor(config: ConnectionConfig);
|
|
22
|
+
record(event: TelemetryEvent): void;
|
|
23
|
+
private flush;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=TelemetryReporterService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelemetryReporterService.d.ts","sourceRoot":"","sources":["../../src/services/TelemetryReporterService.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAGjE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAa,MAAM,CAAC;IACzB,MAAM,EAAY,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAQ,MAAM,CAAC;IACzB,UAAU,EAAQ,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAc;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0B;IACjD,OAAO,CAAC,UAAU,CAA8C;gBAEpD,MAAM,EAAE,gBAAgB;IAMpC,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAWnC,OAAO,CAAC,KAAK;CAqBd"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TelemetryReporterService = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const logger_js_1 = require("../logger.js");
|
|
9
|
+
/**
|
|
10
|
+
* Fire-and-forget telemetry reporter.
|
|
11
|
+
* Buffers events in memory and flushes to the SaaS every 5 seconds,
|
|
12
|
+
* or immediately when the buffer reaches 50 events.
|
|
13
|
+
* All errors are swallowed — telemetry must never impact request latency.
|
|
14
|
+
*/
|
|
15
|
+
class TelemetryReporterService {
|
|
16
|
+
url;
|
|
17
|
+
clientId;
|
|
18
|
+
token;
|
|
19
|
+
buffer = [];
|
|
20
|
+
flushTimer = null;
|
|
21
|
+
constructor(config) {
|
|
22
|
+
this.url = config.saas_url.replace(/\/+$/, '') + '/api/remediation/v1/telemetry';
|
|
23
|
+
this.clientId = config.client_id;
|
|
24
|
+
this.token = config.token;
|
|
25
|
+
}
|
|
26
|
+
record(event) {
|
|
27
|
+
this.buffer.push(event);
|
|
28
|
+
if (this.buffer.length >= 50) {
|
|
29
|
+
this.flush();
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (this.flushTimer === null) {
|
|
33
|
+
this.flushTimer = setTimeout(() => this.flush(), 5000);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
flush() {
|
|
37
|
+
if (this.flushTimer !== null) {
|
|
38
|
+
clearTimeout(this.flushTimer);
|
|
39
|
+
this.flushTimer = null;
|
|
40
|
+
}
|
|
41
|
+
if (this.buffer.length === 0)
|
|
42
|
+
return;
|
|
43
|
+
const events = this.buffer.splice(0);
|
|
44
|
+
axios_1.default.post(this.url, { events }, {
|
|
45
|
+
headers: {
|
|
46
|
+
'X-Remediation-Client-Id': this.clientId,
|
|
47
|
+
'X-Remediation-Token': this.token,
|
|
48
|
+
},
|
|
49
|
+
timeout: 5000,
|
|
50
|
+
}).catch((err) => {
|
|
51
|
+
logger_js_1.logger.debug('RemediationEngine: telemetry flush failed.', {
|
|
52
|
+
error: err instanceof Error ? err.message : String(err),
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.TelemetryReporterService = TelemetryReporterService;
|
|
58
|
+
//# sourceMappingURL=TelemetryReporterService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelemetryReporterService.js","sourceRoot":"","sources":["../../src/services/TelemetryReporterService.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAE1B,4CAAsC;AAUtC;;;;;GAKG;AACH,MAAa,wBAAwB;IAClB,GAAG,CAAc;IACjB,QAAQ,CAAS;IACjB,KAAK,CAAY;IACjB,MAAM,GAAuB,EAAE,CAAC;IACzC,UAAU,GAAyC,IAAI,CAAC;IAEhE,YAAY,MAAwB;QAClC,IAAI,CAAC,GAAG,GAAQ,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,+BAA+B,CAAC;QACtF,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,KAAK,GAAM,MAAM,CAAC,KAAK,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,KAAqB;QAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAEO,KAAK;QACX,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAErC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAErC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE;YAC/B,OAAO,EAAE;gBACP,yBAAyB,EAAE,IAAI,CAAC,QAAQ;gBACxC,qBAAqB,EAAM,IAAI,CAAC,KAAK;aACtC;YACD,OAAO,EAAE,IAAI;SACd,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YACxB,kBAAM,CAAC,KAAK,CAAC,4CAA4C,EAAE;gBACzD,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AA7CD,4DA6CC"}
|
package/package.json
CHANGED