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.
Files changed (100) hide show
  1. package/README.md +11 -0
  2. package/dist/public/client.png +0 -0
  3. package/dist/public/ds.png +0 -0
  4. package/dist/src/application/interfaces/Logger.d.ts +7 -0
  5. package/dist/src/application/interfaces/Logger.d.ts.map +1 -0
  6. package/dist/src/application/interfaces/Logger.js +3 -0
  7. package/dist/src/application/interfaces/Logger.js.map +1 -0
  8. package/dist/src/application/interfaces/StartStreamUseCase.types.d.ts +36 -0
  9. package/dist/src/application/interfaces/StartStreamUseCase.types.d.ts.map +1 -0
  10. package/dist/src/application/interfaces/StartStreamUseCase.types.js +12 -0
  11. package/dist/src/application/interfaces/StartStreamUseCase.types.js.map +1 -0
  12. package/dist/src/application/services/HttpClient.d.ts +5 -0
  13. package/dist/src/application/services/HttpClient.d.ts.map +1 -0
  14. package/dist/src/application/services/HttpClient.js +30 -0
  15. package/dist/src/application/services/HttpClient.js.map +1 -0
  16. package/dist/src/application/services/StreamManagerService.d.ts +38 -0
  17. package/dist/src/application/services/StreamManagerService.d.ts.map +1 -0
  18. package/dist/src/application/services/StreamManagerService.js +298 -0
  19. package/dist/src/application/services/StreamManagerService.js.map +1 -0
  20. package/dist/src/application/use-cases/StartStreamUseCase.d.ts +27 -0
  21. package/dist/src/application/use-cases/StartStreamUseCase.d.ts.map +1 -0
  22. package/dist/src/application/use-cases/StartStreamUseCase.js +195 -0
  23. package/dist/src/application/use-cases/StartStreamUseCase.js.map +1 -0
  24. package/dist/src/application/use-cases/StopStreamUseCase.d.ts +18 -0
  25. package/dist/src/application/use-cases/StopStreamUseCase.d.ts.map +1 -0
  26. package/dist/src/application/use-cases/StopStreamUseCase.js +96 -0
  27. package/dist/src/application/use-cases/StopStreamUseCase.js.map +1 -0
  28. package/dist/src/domain/entities/Stream.d.ts +40 -0
  29. package/dist/src/domain/entities/Stream.d.ts.map +1 -0
  30. package/dist/src/domain/entities/Stream.js +115 -0
  31. package/dist/src/domain/entities/Stream.js.map +1 -0
  32. package/dist/src/domain/events/StreamEvent.d.ts +48 -0
  33. package/dist/src/domain/events/StreamEvent.d.ts.map +1 -0
  34. package/dist/src/domain/events/StreamEvent.js +3 -0
  35. package/dist/src/domain/events/StreamEvent.js.map +1 -0
  36. package/dist/src/domain/repositories/StreamRepository.d.ts +41 -0
  37. package/dist/src/domain/repositories/StreamRepository.d.ts.map +1 -0
  38. package/dist/src/domain/repositories/StreamRepository.js +3 -0
  39. package/dist/src/domain/repositories/StreamRepository.js.map +1 -0
  40. package/dist/src/domain/services/FFmpegService.d.ts +42 -0
  41. package/dist/src/domain/services/FFmpegService.d.ts.map +1 -0
  42. package/dist/src/domain/services/FFmpegService.js +3 -0
  43. package/dist/src/domain/services/FFmpegService.js.map +1 -0
  44. package/dist/src/domain/services/SSEService.d.ts +42 -0
  45. package/dist/src/domain/services/SSEService.d.ts.map +1 -0
  46. package/dist/src/domain/services/SSEService.js +3 -0
  47. package/dist/src/domain/services/SSEService.js.map +1 -0
  48. package/dist/src/domain/value-objects/StreamId.d.ts +10 -0
  49. package/dist/src/domain/value-objects/StreamId.d.ts.map +1 -0
  50. package/dist/src/domain/value-objects/StreamId.js +31 -0
  51. package/dist/src/domain/value-objects/StreamId.js.map +1 -0
  52. package/dist/src/domain/value-objects/StreamState.d.ts +12 -0
  53. package/dist/src/domain/value-objects/StreamState.d.ts.map +1 -0
  54. package/dist/src/domain/value-objects/StreamState.js +35 -0
  55. package/dist/src/domain/value-objects/StreamState.js.map +1 -0
  56. package/dist/src/domain/value-objects/StreamUrl.d.ts +12 -0
  57. package/dist/src/domain/value-objects/StreamUrl.d.ts.map +1 -0
  58. package/dist/src/domain/value-objects/StreamUrl.js +48 -0
  59. package/dist/src/domain/value-objects/StreamUrl.js.map +1 -0
  60. package/dist/src/infrastructure/config/Config.d.ts +42 -0
  61. package/dist/src/infrastructure/config/Config.d.ts.map +1 -0
  62. package/dist/src/infrastructure/config/Config.js +113 -0
  63. package/dist/src/infrastructure/config/Config.js.map +1 -0
  64. package/dist/src/infrastructure/logging/ConsoleLogger.d.ts +12 -0
  65. package/dist/src/infrastructure/logging/ConsoleLogger.d.ts.map +1 -0
  66. package/dist/src/infrastructure/logging/ConsoleLogger.js +41 -0
  67. package/dist/src/infrastructure/logging/ConsoleLogger.js.map +1 -0
  68. package/dist/src/infrastructure/logging/LogBuffer.d.ts +20 -0
  69. package/dist/src/infrastructure/logging/LogBuffer.d.ts.map +1 -0
  70. package/dist/src/infrastructure/logging/LogBuffer.js +95 -0
  71. package/dist/src/infrastructure/logging/LogBuffer.js.map +1 -0
  72. package/dist/src/infrastructure/logging/LogShippingService.d.ts +23 -0
  73. package/dist/src/infrastructure/logging/LogShippingService.d.ts.map +1 -0
  74. package/dist/src/infrastructure/logging/LogShippingService.js +128 -0
  75. package/dist/src/infrastructure/logging/LogShippingService.js.map +1 -0
  76. package/dist/src/infrastructure/logging/RemoteLogger.d.ts +37 -0
  77. package/dist/src/infrastructure/logging/RemoteLogger.d.ts.map +1 -0
  78. package/dist/src/infrastructure/logging/RemoteLogger.js +120 -0
  79. package/dist/src/infrastructure/logging/RemoteLogger.js.map +1 -0
  80. package/dist/src/infrastructure/logging/types/LogTypes.d.ts +27 -0
  81. package/dist/src/infrastructure/logging/types/LogTypes.d.ts.map +1 -0
  82. package/dist/src/infrastructure/logging/types/LogTypes.js +3 -0
  83. package/dist/src/infrastructure/logging/types/LogTypes.js.map +1 -0
  84. package/dist/src/infrastructure/repositories/FileSystemStreamRepository.d.ts +22 -0
  85. package/dist/src/infrastructure/repositories/FileSystemStreamRepository.d.ts.map +1 -0
  86. package/dist/src/infrastructure/repositories/FileSystemStreamRepository.js +212 -0
  87. package/dist/src/infrastructure/repositories/FileSystemStreamRepository.js.map +1 -0
  88. package/dist/src/infrastructure/services/NodeFFmpegService.d.ts +17 -0
  89. package/dist/src/infrastructure/services/NodeFFmpegService.d.ts.map +1 -0
  90. package/dist/src/infrastructure/services/NodeFFmpegService.js +306 -0
  91. package/dist/src/infrastructure/services/NodeFFmpegService.js.map +1 -0
  92. package/dist/src/infrastructure/services/NodeSSEService.d.ts +30 -0
  93. package/dist/src/infrastructure/services/NodeSSEService.d.ts.map +1 -0
  94. package/dist/src/infrastructure/services/NodeSSEService.js +268 -0
  95. package/dist/src/infrastructure/services/NodeSSEService.js.map +1 -0
  96. package/dist/src/main.d.ts +3 -0
  97. package/dist/src/main.d.ts.map +1 -0
  98. package/dist/src/main.js +87 -0
  99. package/dist/src/main.js.map +1 -0
  100. 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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=LogTypes.js.map
@@ -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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"}