streamer-node 1.0.0
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/README.md +11 -0
- package/dist/public/client.png +0 -0
- package/dist/public/ds.png +0 -0
- package/dist/src/application/interfaces/Logger.d.ts +7 -0
- package/dist/src/application/interfaces/Logger.d.ts.map +1 -0
- package/dist/src/application/interfaces/Logger.js +3 -0
- package/dist/src/application/interfaces/Logger.js.map +1 -0
- package/dist/src/application/interfaces/StartStreamUseCase.types.d.ts +36 -0
- package/dist/src/application/interfaces/StartStreamUseCase.types.d.ts.map +1 -0
- package/dist/src/application/interfaces/StartStreamUseCase.types.js +12 -0
- package/dist/src/application/interfaces/StartStreamUseCase.types.js.map +1 -0
- package/dist/src/application/services/HttpClient.d.ts +5 -0
- package/dist/src/application/services/HttpClient.d.ts.map +1 -0
- package/dist/src/application/services/HttpClient.js +30 -0
- package/dist/src/application/services/HttpClient.js.map +1 -0
- package/dist/src/application/services/StreamManagerService.d.ts +38 -0
- package/dist/src/application/services/StreamManagerService.d.ts.map +1 -0
- package/dist/src/application/services/StreamManagerService.js +298 -0
- package/dist/src/application/services/StreamManagerService.js.map +1 -0
- package/dist/src/application/use-cases/StartStreamUseCase.d.ts +27 -0
- package/dist/src/application/use-cases/StartStreamUseCase.d.ts.map +1 -0
- package/dist/src/application/use-cases/StartStreamUseCase.js +195 -0
- package/dist/src/application/use-cases/StartStreamUseCase.js.map +1 -0
- package/dist/src/application/use-cases/StopStreamUseCase.d.ts +18 -0
- package/dist/src/application/use-cases/StopStreamUseCase.d.ts.map +1 -0
- package/dist/src/application/use-cases/StopStreamUseCase.js +96 -0
- package/dist/src/application/use-cases/StopStreamUseCase.js.map +1 -0
- package/dist/src/domain/entities/Stream.d.ts +40 -0
- package/dist/src/domain/entities/Stream.d.ts.map +1 -0
- package/dist/src/domain/entities/Stream.js +115 -0
- package/dist/src/domain/entities/Stream.js.map +1 -0
- package/dist/src/domain/events/StreamEvent.d.ts +48 -0
- package/dist/src/domain/events/StreamEvent.d.ts.map +1 -0
- package/dist/src/domain/events/StreamEvent.js +3 -0
- package/dist/src/domain/events/StreamEvent.js.map +1 -0
- package/dist/src/domain/repositories/StreamRepository.d.ts +41 -0
- package/dist/src/domain/repositories/StreamRepository.d.ts.map +1 -0
- package/dist/src/domain/repositories/StreamRepository.js +3 -0
- package/dist/src/domain/repositories/StreamRepository.js.map +1 -0
- package/dist/src/domain/services/FFmpegService.d.ts +42 -0
- package/dist/src/domain/services/FFmpegService.d.ts.map +1 -0
- package/dist/src/domain/services/FFmpegService.js +3 -0
- package/dist/src/domain/services/FFmpegService.js.map +1 -0
- package/dist/src/domain/services/SSEService.d.ts +42 -0
- package/dist/src/domain/services/SSEService.d.ts.map +1 -0
- package/dist/src/domain/services/SSEService.js +3 -0
- package/dist/src/domain/services/SSEService.js.map +1 -0
- package/dist/src/domain/value-objects/StreamId.d.ts +10 -0
- package/dist/src/domain/value-objects/StreamId.d.ts.map +1 -0
- package/dist/src/domain/value-objects/StreamId.js +31 -0
- package/dist/src/domain/value-objects/StreamId.js.map +1 -0
- package/dist/src/domain/value-objects/StreamState.d.ts +12 -0
- package/dist/src/domain/value-objects/StreamState.d.ts.map +1 -0
- package/dist/src/domain/value-objects/StreamState.js +35 -0
- package/dist/src/domain/value-objects/StreamState.js.map +1 -0
- package/dist/src/domain/value-objects/StreamUrl.d.ts +12 -0
- package/dist/src/domain/value-objects/StreamUrl.d.ts.map +1 -0
- package/dist/src/domain/value-objects/StreamUrl.js +48 -0
- package/dist/src/domain/value-objects/StreamUrl.js.map +1 -0
- package/dist/src/infrastructure/config/Config.d.ts +42 -0
- package/dist/src/infrastructure/config/Config.d.ts.map +1 -0
- package/dist/src/infrastructure/config/Config.js +113 -0
- package/dist/src/infrastructure/config/Config.js.map +1 -0
- package/dist/src/infrastructure/logging/ConsoleLogger.d.ts +12 -0
- package/dist/src/infrastructure/logging/ConsoleLogger.d.ts.map +1 -0
- package/dist/src/infrastructure/logging/ConsoleLogger.js +41 -0
- package/dist/src/infrastructure/logging/ConsoleLogger.js.map +1 -0
- package/dist/src/infrastructure/logging/LogBuffer.d.ts +20 -0
- package/dist/src/infrastructure/logging/LogBuffer.d.ts.map +1 -0
- package/dist/src/infrastructure/logging/LogBuffer.js +95 -0
- package/dist/src/infrastructure/logging/LogBuffer.js.map +1 -0
- package/dist/src/infrastructure/logging/LogShippingService.d.ts +23 -0
- package/dist/src/infrastructure/logging/LogShippingService.d.ts.map +1 -0
- package/dist/src/infrastructure/logging/LogShippingService.js +128 -0
- package/dist/src/infrastructure/logging/LogShippingService.js.map +1 -0
- package/dist/src/infrastructure/logging/RemoteLogger.d.ts +37 -0
- package/dist/src/infrastructure/logging/RemoteLogger.d.ts.map +1 -0
- package/dist/src/infrastructure/logging/RemoteLogger.js +120 -0
- package/dist/src/infrastructure/logging/RemoteLogger.js.map +1 -0
- package/dist/src/infrastructure/logging/types/LogTypes.d.ts +27 -0
- package/dist/src/infrastructure/logging/types/LogTypes.d.ts.map +1 -0
- package/dist/src/infrastructure/logging/types/LogTypes.js +3 -0
- package/dist/src/infrastructure/logging/types/LogTypes.js.map +1 -0
- package/dist/src/infrastructure/repositories/FileSystemStreamRepository.d.ts +22 -0
- package/dist/src/infrastructure/repositories/FileSystemStreamRepository.d.ts.map +1 -0
- package/dist/src/infrastructure/repositories/FileSystemStreamRepository.js +212 -0
- package/dist/src/infrastructure/repositories/FileSystemStreamRepository.js.map +1 -0
- package/dist/src/infrastructure/services/NodeFFmpegService.d.ts +17 -0
- package/dist/src/infrastructure/services/NodeFFmpegService.d.ts.map +1 -0
- package/dist/src/infrastructure/services/NodeFFmpegService.js +306 -0
- package/dist/src/infrastructure/services/NodeFFmpegService.js.map +1 -0
- package/dist/src/infrastructure/services/NodeSSEService.d.ts +30 -0
- package/dist/src/infrastructure/services/NodeSSEService.d.ts.map +1 -0
- package/dist/src/infrastructure/services/NodeSSEService.js +268 -0
- package/dist/src/infrastructure/services/NodeSSEService.js.map +1 -0
- package/dist/src/main.d.ts +3 -0
- package/dist/src/main.d.ts.map +1 -0
- package/dist/src/main.js +87 -0
- package/dist/src/main.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogBuffer.js","sourceRoot":"","sources":["../../../../src/infrastructure/logging/LogBuffer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { LogEntry, LogShippingResult } from "./types/LogTypes";
|
|
2
|
+
export declare class LogShippingService {
|
|
3
|
+
private readonly baseUrl;
|
|
4
|
+
private readonly sourceId;
|
|
5
|
+
private readonly retryAttempts;
|
|
6
|
+
private readonly retryDelay;
|
|
7
|
+
private readonly errorRetryQueue;
|
|
8
|
+
private isProcessingErrorQueue;
|
|
9
|
+
constructor(url: string, sourceId: string, retryAttempts: number, retryDelay: number);
|
|
10
|
+
shipLogs(logs: LogEntry[]): Promise<LogShippingResult>;
|
|
11
|
+
shipImmediateLog(log: LogEntry): Promise<void>;
|
|
12
|
+
shipBatch(logs: LogEntry[]): Promise<void>;
|
|
13
|
+
private shipWithInfiniteRetry;
|
|
14
|
+
private retryBatch;
|
|
15
|
+
private processErrorQueue;
|
|
16
|
+
private sleep;
|
|
17
|
+
getQueueStats(): {
|
|
18
|
+
errorQueueSize: number;
|
|
19
|
+
isProcessingErrors: boolean;
|
|
20
|
+
};
|
|
21
|
+
flushErrorQueue(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=LogShippingService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogShippingService.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/logging/LogShippingService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAY,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAEzE,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,sBAAsB,CAAS;gBAGrC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM;IAQP,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA+BtD,gBAAgB,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB9C,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAyBzC,qBAAqB;YA8BrB,UAAU;YA2BV,iBAAiB;IAe/B,OAAO,CAAC,KAAK;IAIN,aAAa,IAAI;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,OAAO,CAAC;KAC7B;IAOY,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAK9C"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LogShippingService = void 0;
|
|
4
|
+
class LogShippingService {
|
|
5
|
+
constructor(url, sourceId, retryAttempts, retryDelay) {
|
|
6
|
+
this.errorRetryQueue = [];
|
|
7
|
+
this.isProcessingErrorQueue = false;
|
|
8
|
+
this.baseUrl = url;
|
|
9
|
+
this.sourceId = sourceId;
|
|
10
|
+
this.retryAttempts = retryAttempts;
|
|
11
|
+
this.retryDelay = retryDelay;
|
|
12
|
+
}
|
|
13
|
+
async shipLogs(logs) {
|
|
14
|
+
if (!this.baseUrl) {
|
|
15
|
+
return { success: false, error: "Remote logging URL not configured" };
|
|
16
|
+
}
|
|
17
|
+
const batch = {
|
|
18
|
+
source: this.sourceId,
|
|
19
|
+
logs,
|
|
20
|
+
};
|
|
21
|
+
try {
|
|
22
|
+
const response = await fetch(`${this.baseUrl}/api/v1/logs/logs`, {
|
|
23
|
+
method: "POST",
|
|
24
|
+
headers: {
|
|
25
|
+
"Content-Type": "application/json",
|
|
26
|
+
},
|
|
27
|
+
body: JSON.stringify(batch),
|
|
28
|
+
});
|
|
29
|
+
if (!response.ok) {
|
|
30
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
31
|
+
}
|
|
32
|
+
return { success: true };
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
36
|
+
return { success: false, error: errorMessage };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async shipImmediateLog(log) {
|
|
40
|
+
const isErrorLevel = log.level === "error" || log.level === "fatal";
|
|
41
|
+
if (isErrorLevel) {
|
|
42
|
+
// For error logs, retry indefinitely
|
|
43
|
+
await this.shipWithInfiniteRetry(log);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// For non-error logs, try once and give up if it fails
|
|
47
|
+
const result = await this.shipLogs([log]);
|
|
48
|
+
if (!result.success) {
|
|
49
|
+
console.warn(`Failed to ship ${log.level} log immediately:`, result.error);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async shipBatch(logs) {
|
|
54
|
+
const result = await this.shipLogs(logs);
|
|
55
|
+
if (!result.success) {
|
|
56
|
+
// Separate error logs for infinite retry
|
|
57
|
+
const errorLogs = logs.filter((log) => log.level === "error" || log.level === "fatal");
|
|
58
|
+
const nonErrorLogs = logs.filter((log) => log.level !== "error" && log.level !== "fatal");
|
|
59
|
+
// Add error logs to retry queue
|
|
60
|
+
if (errorLogs.length > 0) {
|
|
61
|
+
this.errorRetryQueue.push(...errorLogs);
|
|
62
|
+
this.processErrorQueue();
|
|
63
|
+
}
|
|
64
|
+
// For non-error logs, try a few times then give up
|
|
65
|
+
if (nonErrorLogs.length > 0) {
|
|
66
|
+
await this.retryBatch(nonErrorLogs, this.retryAttempts);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async shipWithInfiniteRetry(log) {
|
|
71
|
+
let attempt = 0;
|
|
72
|
+
while (true) {
|
|
73
|
+
attempt++;
|
|
74
|
+
const result = await this.shipLogs([log]);
|
|
75
|
+
if (result.success) {
|
|
76
|
+
if (attempt > 1) {
|
|
77
|
+
console.log(`Successfully shipped error log after ${attempt} attempts`);
|
|
78
|
+
}
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
console.error(`Failed to ship error log (attempt ${attempt}):`, result.error);
|
|
82
|
+
// Wait before retrying, with exponential backoff (max 60 seconds)
|
|
83
|
+
const delay = Math.min(this.retryDelay * Math.pow(2, Math.min(attempt - 1, 6)), 60000);
|
|
84
|
+
await this.sleep(delay);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async retryBatch(logs, maxAttempts) {
|
|
88
|
+
let attempt = 0;
|
|
89
|
+
while (attempt < maxAttempts) {
|
|
90
|
+
attempt++;
|
|
91
|
+
await this.sleep(this.retryDelay);
|
|
92
|
+
const result = await this.shipLogs(logs);
|
|
93
|
+
if (result.success) {
|
|
94
|
+
console.log(`Successfully shipped batch after ${attempt} attempts`);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
console.warn(`Batch shipping attempt ${attempt}/${maxAttempts} failed:`, result.error);
|
|
98
|
+
}
|
|
99
|
+
console.error(`Failed to ship batch after ${maxAttempts} attempts, giving up`);
|
|
100
|
+
}
|
|
101
|
+
async processErrorQueue() {
|
|
102
|
+
if (this.isProcessingErrorQueue || this.errorRetryQueue.length === 0) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this.isProcessingErrorQueue = true;
|
|
106
|
+
while (this.errorRetryQueue.length > 0) {
|
|
107
|
+
const log = this.errorRetryQueue.shift();
|
|
108
|
+
await this.shipWithInfiniteRetry(log);
|
|
109
|
+
}
|
|
110
|
+
this.isProcessingErrorQueue = false;
|
|
111
|
+
}
|
|
112
|
+
sleep(ms) {
|
|
113
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
114
|
+
}
|
|
115
|
+
getQueueStats() {
|
|
116
|
+
return {
|
|
117
|
+
errorQueueSize: this.errorRetryQueue.length,
|
|
118
|
+
isProcessingErrors: this.isProcessingErrorQueue,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
async flushErrorQueue() {
|
|
122
|
+
if (this.errorRetryQueue.length > 0) {
|
|
123
|
+
await this.processErrorQueue();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
exports.LogShippingService = LogShippingService;
|
|
128
|
+
//# sourceMappingURL=LogShippingService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogShippingService.js","sourceRoot":"","sources":["../../../../src/infrastructure/logging/LogShippingService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Logger } from "../../application/interfaces/Logger";
|
|
2
|
+
export declare class RemoteLogger implements Logger {
|
|
3
|
+
private readonly consoleLogger;
|
|
4
|
+
private readonly logBuffer?;
|
|
5
|
+
private readonly shippingService?;
|
|
6
|
+
private readonly enabled;
|
|
7
|
+
constructor(remoteConfig: {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
baseUrl: string;
|
|
10
|
+
sourceId: string;
|
|
11
|
+
batchSize: number;
|
|
12
|
+
batchInterval: number;
|
|
13
|
+
maxMemoryUsage: number;
|
|
14
|
+
retryAttempts: number;
|
|
15
|
+
retryDelay: number;
|
|
16
|
+
}, logLevel?: string);
|
|
17
|
+
info(message: string, meta?: any): void;
|
|
18
|
+
warn(message: string, meta?: any): void;
|
|
19
|
+
error(message: string, meta?: any): void;
|
|
20
|
+
debug(message: string, meta?: any): void;
|
|
21
|
+
private createLogEntry;
|
|
22
|
+
private handleBatchFlush;
|
|
23
|
+
/**
|
|
24
|
+
* Gracefully shutdown the remote logger
|
|
25
|
+
* Flushes any pending logs and cleans up resources
|
|
26
|
+
*/
|
|
27
|
+
shutdown(): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Get statistics about the remote logging system
|
|
30
|
+
*/
|
|
31
|
+
getStats(): {
|
|
32
|
+
enabled: boolean;
|
|
33
|
+
bufferStats?: any;
|
|
34
|
+
shippingStats?: any;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=RemoteLogger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemoteLogger.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/logging/RemoteLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAM7D,qBAAa,YAAa,YAAW,MAAM;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAqB;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAGhC,YAAY,EAAE;QACZ,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;KACpB,EACD,QAAQ,GAAE,MAAgB;IAyBrB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAWvC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAWvC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAcxC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI;IAW/C,OAAO,CAAC,cAAc;YAaR,gBAAgB;IAe9B;;;OAGG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBtC;;OAEG;IACI,QAAQ,IAAI;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,CAAC,EAAE,GAAG,CAAC;QAClB,aAAa,CAAC,EAAE,GAAG,CAAC;KACrB;CAcF"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RemoteLogger = void 0;
|
|
4
|
+
const ConsoleLogger_1 = require("./ConsoleLogger");
|
|
5
|
+
const LogBuffer_1 = require("./LogBuffer");
|
|
6
|
+
const LogShippingService_1 = require("./LogShippingService");
|
|
7
|
+
class RemoteLogger {
|
|
8
|
+
constructor(remoteConfig, logLevel = "debug") {
|
|
9
|
+
// Always create console logger for local logging
|
|
10
|
+
this.consoleLogger = new ConsoleLogger_1.ConsoleLogger(logLevel);
|
|
11
|
+
this.enabled = remoteConfig.enabled;
|
|
12
|
+
if (this.enabled && remoteConfig.baseUrl) {
|
|
13
|
+
// Initialize shipping service
|
|
14
|
+
this.shippingService = new LogShippingService_1.LogShippingService(remoteConfig.baseUrl, remoteConfig.sourceId, remoteConfig.retryAttempts, remoteConfig.retryDelay);
|
|
15
|
+
// Initialize log buffer for non-error logs
|
|
16
|
+
this.logBuffer = new LogBuffer_1.LogBuffer(remoteConfig.maxMemoryUsage, remoteConfig.batchSize, remoteConfig.batchInterval, this.handleBatchFlush.bind(this));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
info(message, meta) {
|
|
20
|
+
// Always log to console
|
|
21
|
+
this.consoleLogger.info(message, meta);
|
|
22
|
+
// Ship to remote if enabled
|
|
23
|
+
if (this.enabled && this.logBuffer) {
|
|
24
|
+
const logEntry = this.createLogEntry("info", message, meta);
|
|
25
|
+
this.logBuffer.add(logEntry);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
warn(message, meta) {
|
|
29
|
+
// Always log to console
|
|
30
|
+
this.consoleLogger.warn(message, meta);
|
|
31
|
+
// Ship to remote if enabled
|
|
32
|
+
if (this.enabled && this.logBuffer) {
|
|
33
|
+
const logEntry = this.createLogEntry("warn", message, meta);
|
|
34
|
+
this.logBuffer.add(logEntry);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
error(message, meta) {
|
|
38
|
+
// Always log to console
|
|
39
|
+
this.consoleLogger.error(message, meta);
|
|
40
|
+
// Ship error logs immediately if enabled
|
|
41
|
+
if (this.enabled && this.shippingService) {
|
|
42
|
+
const logEntry = this.createLogEntry("error", message, meta);
|
|
43
|
+
this.shippingService.shipImmediateLog(logEntry).catch((error) => {
|
|
44
|
+
// Fallback to console if remote shipping fails
|
|
45
|
+
console.error("Failed to ship error log remotely:", error);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
debug(message, meta) {
|
|
50
|
+
// Always log to console
|
|
51
|
+
this.consoleLogger.debug(message, meta);
|
|
52
|
+
// Ship to remote if enabled
|
|
53
|
+
// if (this.enabled && this.logBuffer) {
|
|
54
|
+
// const logEntry = this.createLogEntry("debug", message, meta);
|
|
55
|
+
// this.logBuffer.add(logEntry);
|
|
56
|
+
// }
|
|
57
|
+
}
|
|
58
|
+
createLogEntry(level, message, meta) {
|
|
59
|
+
return {
|
|
60
|
+
level,
|
|
61
|
+
message,
|
|
62
|
+
timestamp: new Date().toISOString(),
|
|
63
|
+
metadata: meta,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
async handleBatchFlush(logs) {
|
|
67
|
+
if (!this.shippingService) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
const result = await this.shippingService.shipLogs(logs);
|
|
72
|
+
if (!result.success) {
|
|
73
|
+
console.error("Failed to ship log batch:", result.error);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
console.error("Error during batch log shipping:", error);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Gracefully shutdown the remote logger
|
|
82
|
+
* Flushes any pending logs and cleans up resources
|
|
83
|
+
*/
|
|
84
|
+
async shutdown() {
|
|
85
|
+
if (!this.enabled) {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
// Flush any remaining buffered logs
|
|
90
|
+
if (this.logBuffer) {
|
|
91
|
+
await this.logBuffer.flush();
|
|
92
|
+
this.logBuffer.destroy();
|
|
93
|
+
}
|
|
94
|
+
// Flush any remaining error logs
|
|
95
|
+
if (this.shippingService) {
|
|
96
|
+
await this.shippingService.flushErrorQueue();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error("Error during RemoteLogger shutdown:", error);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Get statistics about the remote logging system
|
|
105
|
+
*/
|
|
106
|
+
getStats() {
|
|
107
|
+
const stats = { enabled: this.enabled };
|
|
108
|
+
if (this.enabled) {
|
|
109
|
+
if (this.logBuffer) {
|
|
110
|
+
stats.bufferStats = this.logBuffer.getStats();
|
|
111
|
+
}
|
|
112
|
+
if (this.shippingService) {
|
|
113
|
+
stats.shippingStats = this.shippingService.getQueueStats();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return stats;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
exports.RemoteLogger = RemoteLogger;
|
|
120
|
+
//# sourceMappingURL=RemoteLogger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemoteLogger.js","sourceRoot":"","sources":["../../../../src/infrastructure/logging/RemoteLogger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type LogLevel = "debug" | "info" | "warn" | "error" | "fatal";
|
|
2
|
+
export interface LogEntry {
|
|
3
|
+
level: LogLevel;
|
|
4
|
+
message: string;
|
|
5
|
+
timestamp: string;
|
|
6
|
+
metadata?: Record<string, any>;
|
|
7
|
+
}
|
|
8
|
+
export interface LogBatch {
|
|
9
|
+
source: string;
|
|
10
|
+
logs: LogEntry[];
|
|
11
|
+
}
|
|
12
|
+
export interface LogShippingResult {
|
|
13
|
+
success: boolean;
|
|
14
|
+
error?: string;
|
|
15
|
+
retryAfter?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface BufferedLog {
|
|
18
|
+
entry: LogEntry;
|
|
19
|
+
size: number;
|
|
20
|
+
}
|
|
21
|
+
export interface LogBufferStats {
|
|
22
|
+
count: number;
|
|
23
|
+
totalSize: number;
|
|
24
|
+
oldestTimestamp?: string;
|
|
25
|
+
newestTimestamp?: string;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=LogTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogTypes.d.ts","sourceRoot":"","sources":["../../../../../src/infrastructure/logging/types/LogTypes.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAErE,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,QAAQ,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogTypes.js","sourceRoot":"","sources":["../../../../../src/infrastructure/logging/types/LogTypes.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Stream } from "../../domain/entities/Stream";
|
|
2
|
+
import { StreamId } from "../../domain/value-objects/StreamId";
|
|
3
|
+
import { StreamRepository } from "../../domain/repositories/StreamRepository";
|
|
4
|
+
import { Logger } from "../../application/interfaces/Logger";
|
|
5
|
+
export declare class FileSystemStreamRepository implements StreamRepository {
|
|
6
|
+
private readonly persistentStateDir;
|
|
7
|
+
private readonly logger;
|
|
8
|
+
constructor(persistentStateDir: string, logger: Logger);
|
|
9
|
+
private ensureDirectoryExists;
|
|
10
|
+
private getStreamFilePath;
|
|
11
|
+
save(stream: Stream): Promise<void>;
|
|
12
|
+
findById(id: StreamId): Promise<Stream | null>;
|
|
13
|
+
private deleteCorruptedFile;
|
|
14
|
+
findAll(): Promise<Stream[]>;
|
|
15
|
+
findRunning(): Promise<Stream[]>;
|
|
16
|
+
findByState(state: string): Promise<Stream[]>;
|
|
17
|
+
delete(id: StreamId): Promise<void>;
|
|
18
|
+
exists(id: StreamId): Promise<boolean>;
|
|
19
|
+
getAllIds(): Promise<StreamId[]>;
|
|
20
|
+
clear(): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=FileSystemStreamRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileSystemStreamRepository.d.ts","sourceRoot":"","sources":["../../../../src/infrastructure/repositories/FileSystemStreamRepository.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAG/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAE7D,qBAAa,0BAA2B,YAAW,gBAAgB;IAE/D,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,kBAAkB,EAAE,MAAM,EAC1B,MAAM,EAAE,MAAM;YAGnB,qBAAqB;IAYnC,OAAO,CAAC,iBAAiB;IAIZ,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBnC,QAAQ,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YA0D7C,mBAAmB;IAepB,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA0B5B,WAAW,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAKhC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK7C,MAAM,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBnC,MAAM,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAWtC,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAmBhC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAuBpC"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FileSystemStreamRepository = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const Stream_1 = require("../../domain/entities/Stream");
|
|
7
|
+
const StreamId_1 = require("../../domain/value-objects/StreamId");
|
|
8
|
+
const StreamUrl_1 = require("../../domain/value-objects/StreamUrl");
|
|
9
|
+
class FileSystemStreamRepository {
|
|
10
|
+
constructor(persistentStateDir, logger) {
|
|
11
|
+
this.persistentStateDir = persistentStateDir;
|
|
12
|
+
this.logger = logger;
|
|
13
|
+
}
|
|
14
|
+
async ensureDirectoryExists() {
|
|
15
|
+
try {
|
|
16
|
+
await fs_1.promises.mkdir(this.persistentStateDir, { recursive: true });
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
this.logger.error("Failed to create state directory", {
|
|
20
|
+
directory: this.persistentStateDir,
|
|
21
|
+
error: error instanceof Error ? error.message : String(error),
|
|
22
|
+
});
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
getStreamFilePath(id) {
|
|
27
|
+
return (0, path_1.join)(this.persistentStateDir, `${id.value}.json`);
|
|
28
|
+
}
|
|
29
|
+
async save(stream) {
|
|
30
|
+
await this.ensureDirectoryExists();
|
|
31
|
+
const filePath = this.getStreamFilePath(stream.id);
|
|
32
|
+
const streamData = stream.toJSON();
|
|
33
|
+
try {
|
|
34
|
+
await fs_1.promises.writeFile(filePath, JSON.stringify(streamData, null, 2), "utf8");
|
|
35
|
+
this.logger.debug("Stream saved to file", {
|
|
36
|
+
streamId: stream.id.value,
|
|
37
|
+
filePath,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
this.logger.error("Failed to save stream", {
|
|
42
|
+
streamId: stream.id.value,
|
|
43
|
+
filePath,
|
|
44
|
+
error: error instanceof Error ? error.message : String(error),
|
|
45
|
+
});
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async findById(id) {
|
|
50
|
+
const filePath = this.getStreamFilePath(id);
|
|
51
|
+
try {
|
|
52
|
+
const data = await fs_1.promises.readFile(filePath, "utf8");
|
|
53
|
+
// Check if file is empty or contains only whitespace
|
|
54
|
+
if (!data.trim()) {
|
|
55
|
+
this.logger.warn("Found empty stream file, deleting it", {
|
|
56
|
+
streamId: id.value,
|
|
57
|
+
filePath,
|
|
58
|
+
});
|
|
59
|
+
await this.deleteCorruptedFile(filePath);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
const streamData = JSON.parse(data);
|
|
63
|
+
return Stream_1.Stream.fromPersistence({
|
|
64
|
+
id: StreamId_1.StreamId.fromString(streamData.id),
|
|
65
|
+
cameraUrl: StreamUrl_1.StreamUrl.create(streamData.cameraUrl),
|
|
66
|
+
streamKey: streamData.streamKey,
|
|
67
|
+
courtId: streamData.courtId,
|
|
68
|
+
state: streamData.state,
|
|
69
|
+
hasAudio: streamData.hasAudio,
|
|
70
|
+
processId: streamData.processId,
|
|
71
|
+
createdAt: new Date(streamData.createdAt),
|
|
72
|
+
updatedAt: new Date(streamData.updatedAt),
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (error.code === "ENOENT") {
|
|
77
|
+
return null; // File doesn't exist
|
|
78
|
+
}
|
|
79
|
+
// Check if it's a JSON parsing error (corrupted file)
|
|
80
|
+
if (error instanceof SyntaxError ||
|
|
81
|
+
error.message?.includes("JSON")) {
|
|
82
|
+
this.logger.warn("Found corrupted stream file, deleting it", {
|
|
83
|
+
streamId: id.value,
|
|
84
|
+
filePath,
|
|
85
|
+
error: error instanceof Error ? error.message : String(error),
|
|
86
|
+
});
|
|
87
|
+
await this.deleteCorruptedFile(filePath);
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
this.logger.error("Failed to read stream", {
|
|
91
|
+
streamId: id.value,
|
|
92
|
+
filePath,
|
|
93
|
+
error: error instanceof Error ? error.message : String(error),
|
|
94
|
+
});
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async deleteCorruptedFile(filePath) {
|
|
99
|
+
try {
|
|
100
|
+
await fs_1.promises.unlink(filePath);
|
|
101
|
+
this.logger.info("Deleted corrupted stream file", { filePath });
|
|
102
|
+
}
|
|
103
|
+
catch (deleteError) {
|
|
104
|
+
this.logger.error("Failed to delete corrupted stream file", {
|
|
105
|
+
filePath,
|
|
106
|
+
error: deleteError instanceof Error
|
|
107
|
+
? deleteError.message
|
|
108
|
+
: String(deleteError),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async findAll() {
|
|
113
|
+
await this.ensureDirectoryExists();
|
|
114
|
+
try {
|
|
115
|
+
const files = await fs_1.promises.readdir(this.persistentStateDir);
|
|
116
|
+
const jsonFiles = files.filter((file) => file.endsWith(".json"));
|
|
117
|
+
const streams = [];
|
|
118
|
+
for (const file of jsonFiles) {
|
|
119
|
+
const streamId = StreamId_1.StreamId.fromString(file.replace(".json", ""));
|
|
120
|
+
const stream = await this.findById(streamId);
|
|
121
|
+
if (stream) {
|
|
122
|
+
streams.push(stream);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return streams;
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
this.logger.error("Failed to read all streams", {
|
|
129
|
+
directory: this.persistentStateDir,
|
|
130
|
+
error: error instanceof Error ? error.message : String(error),
|
|
131
|
+
});
|
|
132
|
+
throw error;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async findRunning() {
|
|
136
|
+
const allStreams = await this.findAll();
|
|
137
|
+
return allStreams.filter((stream) => stream.isRunning());
|
|
138
|
+
}
|
|
139
|
+
async findByState(state) {
|
|
140
|
+
const allStreams = await this.findAll();
|
|
141
|
+
return allStreams.filter((stream) => stream.state === state);
|
|
142
|
+
}
|
|
143
|
+
async delete(id) {
|
|
144
|
+
const filePath = this.getStreamFilePath(id);
|
|
145
|
+
try {
|
|
146
|
+
await fs_1.promises.unlink(filePath);
|
|
147
|
+
this.logger.debug("Stream file deleted", {
|
|
148
|
+
streamId: id.value,
|
|
149
|
+
filePath,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
if (error.code === "ENOENT") {
|
|
154
|
+
return; // File doesn't exist, consider it deleted
|
|
155
|
+
}
|
|
156
|
+
this.logger.error("Failed to delete stream", {
|
|
157
|
+
streamId: id.value,
|
|
158
|
+
filePath,
|
|
159
|
+
error: error instanceof Error ? error.message : String(error),
|
|
160
|
+
});
|
|
161
|
+
throw error;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
async exists(id) {
|
|
165
|
+
const filePath = this.getStreamFilePath(id);
|
|
166
|
+
try {
|
|
167
|
+
await fs_1.promises.access(filePath);
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
async getAllIds() {
|
|
175
|
+
await this.ensureDirectoryExists();
|
|
176
|
+
try {
|
|
177
|
+
const files = await fs_1.promises.readdir(this.persistentStateDir);
|
|
178
|
+
const jsonFiles = files.filter((file) => file.endsWith(".json"));
|
|
179
|
+
return jsonFiles.map((file) => StreamId_1.StreamId.fromString(file.replace(".json", "")));
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
this.logger.error("Failed to get all stream IDs", {
|
|
183
|
+
directory: this.persistentStateDir,
|
|
184
|
+
error: error instanceof Error ? error.message : String(error),
|
|
185
|
+
});
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
async clear() {
|
|
190
|
+
await this.ensureDirectoryExists();
|
|
191
|
+
try {
|
|
192
|
+
const files = await fs_1.promises.readdir(this.persistentStateDir);
|
|
193
|
+
const jsonFiles = files.filter((file) => file.endsWith(".json"));
|
|
194
|
+
for (const file of jsonFiles) {
|
|
195
|
+
await fs_1.promises.unlink((0, path_1.join)(this.persistentStateDir, file));
|
|
196
|
+
}
|
|
197
|
+
this.logger.info("All stream files cleared", {
|
|
198
|
+
directory: this.persistentStateDir,
|
|
199
|
+
filesDeleted: jsonFiles.length,
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
this.logger.error("Failed to clear streams", {
|
|
204
|
+
directory: this.persistentStateDir,
|
|
205
|
+
error: error instanceof Error ? error.message : String(error),
|
|
206
|
+
});
|
|
207
|
+
throw error;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
exports.FileSystemStreamRepository = FileSystemStreamRepository;
|
|
212
|
+
//# sourceMappingURL=FileSystemStreamRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileSystemStreamRepository.js","sourceRoot":"","sources":["../../../../src/infrastructure/repositories/FileSystemStreamRepository.ts"],"names":[],"mappings":"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"}
|