streamer-node 1.0.27 → 1.0.29
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 +40 -0
- package/dist/package.json +7 -2
- package/dist/public/ds.png +0 -0
- package/dist/src/application/interfaces/StartStreamUseCase.types.d.ts +1 -0
- package/dist/src/application/interfaces/StartStreamUseCase.types.d.ts.map +1 -1
- package/dist/src/application/interfaces/StartStreamUseCase.types.js.map +1 -1
- package/dist/src/application/services/StreamManagerService.d.ts +3 -1
- package/dist/src/application/services/StreamManagerService.d.ts.map +1 -1
- package/dist/src/application/services/StreamManagerService.js +93 -34
- package/dist/src/application/services/StreamManagerService.js.map +1 -1
- package/dist/src/application/use-cases/StartStreamUseCase.d.ts.map +1 -1
- package/dist/src/application/use-cases/StartStreamUseCase.js +2 -2
- package/dist/src/application/use-cases/StartStreamUseCase.js.map +1 -1
- package/dist/src/domain/events/StreamEvent.d.ts +1 -0
- package/dist/src/domain/events/StreamEvent.d.ts.map +1 -1
- package/dist/src/domain/services/FFmpegService.d.ts +3 -3
- package/dist/src/domain/services/FFmpegService.d.ts.map +1 -1
- package/dist/src/infrastructure/config/Config.d.ts +12 -0
- package/dist/src/infrastructure/config/Config.d.ts.map +1 -1
- package/dist/src/infrastructure/config/Config.js +12 -0
- package/dist/src/infrastructure/config/Config.js.map +1 -1
- package/dist/src/infrastructure/listeners/SupabaseListener.d.ts +34 -0
- package/dist/src/infrastructure/listeners/SupabaseListener.d.ts.map +1 -0
- package/dist/src/infrastructure/listeners/SupabaseListener.js +231 -0
- package/dist/src/infrastructure/listeners/SupabaseListener.js.map +1 -0
- package/dist/src/infrastructure/services/NodeFFmpegService.d.ts +7 -3
- package/dist/src/infrastructure/services/NodeFFmpegService.d.ts.map +1 -1
- package/dist/src/infrastructure/services/NodeFFmpegService.js +63 -11
- package/dist/src/infrastructure/services/NodeFFmpegService.js.map +1 -1
- package/dist/src/infrastructure/services/NodeSSEService.d.ts.map +1 -1
- package/dist/src/infrastructure/services/NodeSSEService.js +2 -0
- package/dist/src/infrastructure/services/NodeSSEService.js.map +1 -1
- package/dist/src/infrastructure/services/SupabaseService.d.ts +66 -0
- package/dist/src/infrastructure/services/SupabaseService.d.ts.map +1 -0
- package/dist/src/infrastructure/services/SupabaseService.js +213 -0
- package/dist/src/infrastructure/services/SupabaseService.js.map +1 -0
- package/dist/src/main.js +18 -1
- package/dist/src/main.js.map +1 -1
- package/package.json +7 -2
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SupabaseService = void 0;
|
|
4
|
+
const supabase_js_1 = require("@supabase/supabase-js");
|
|
5
|
+
/**
|
|
6
|
+
* Supabase Client Singleton
|
|
7
|
+
* Manages the connection to Supabase and provides real-time subscription capabilities
|
|
8
|
+
*/
|
|
9
|
+
class SupabaseService {
|
|
10
|
+
constructor(url, anonKey, enabled) {
|
|
11
|
+
this.client = null;
|
|
12
|
+
this.channels = new Map();
|
|
13
|
+
this.enabled = enabled;
|
|
14
|
+
if (!this.enabled) {
|
|
15
|
+
console.log("⚠️ Supabase is disabled via configuration");
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (!url || !anonKey) {
|
|
19
|
+
console.warn("⚠️ Supabase URL and ANON_KEY are required. Supabase features will be disabled.");
|
|
20
|
+
this.enabled = false;
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
// Initialize Supabase client
|
|
24
|
+
this.client = (0, supabase_js_1.createClient)(url, anonKey, {
|
|
25
|
+
realtime: {
|
|
26
|
+
params: {
|
|
27
|
+
eventsPerSecond: 10, // Rate limiting for real-time events
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
console.log("✅ Supabase client initialized");
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Initialize singleton instance
|
|
35
|
+
*/
|
|
36
|
+
static initialize(url, anonKey, enabled) {
|
|
37
|
+
if (!SupabaseService.instance) {
|
|
38
|
+
SupabaseService.instance = new SupabaseService(url, anonKey, enabled);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get singleton instance
|
|
43
|
+
*/
|
|
44
|
+
static getInstance() {
|
|
45
|
+
if (!SupabaseService.instance) {
|
|
46
|
+
throw new Error("SupabaseService must be initialized before use. Call initialize() first.");
|
|
47
|
+
}
|
|
48
|
+
return SupabaseService.instance;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if Supabase is enabled and ready
|
|
52
|
+
*/
|
|
53
|
+
isEnabled() {
|
|
54
|
+
return this.enabled && this.client !== null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get the Supabase client
|
|
58
|
+
*/
|
|
59
|
+
getClient() {
|
|
60
|
+
if (!this.client) {
|
|
61
|
+
throw new Error("Supabase client is not initialized");
|
|
62
|
+
}
|
|
63
|
+
return this.client;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Subscribe to real-time changes on a table
|
|
67
|
+
* @param channelName - Unique name for this channel
|
|
68
|
+
* @param tableName - Name of the table to listen to
|
|
69
|
+
* @param callback - Function to call when changes occur
|
|
70
|
+
* @param event - Type of event to listen for ('INSERT', 'UPDATE', 'DELETE', or '*' for all)
|
|
71
|
+
* @param schema - Database schema (default: 'public')
|
|
72
|
+
* @param retryCount - Current retry attempt (internal use)
|
|
73
|
+
*/
|
|
74
|
+
/**
|
|
75
|
+
* Subscribe to real-time changes on a table
|
|
76
|
+
* @param channelName - Unique name for this channel
|
|
77
|
+
* @param tableName - Name of the table to listen to
|
|
78
|
+
* @param callback - Function to call when changes occur
|
|
79
|
+
* @param event - Type of event to listen for ('INSERT', 'UPDATE', 'DELETE', or '*' for all)
|
|
80
|
+
* @param schema - Database schema (default: 'public')
|
|
81
|
+
* @param filter - Optional filter string (e.g., 'some_column=eq.some_value')
|
|
82
|
+
* @param retryCount - Current retry attempt (internal use)
|
|
83
|
+
*/
|
|
84
|
+
subscribeToTable(channelName, tableName, callback, event = "*", schema = "public", filter, retryCount = 0) {
|
|
85
|
+
if (!this.isEnabled()) {
|
|
86
|
+
console.warn("⚠️ Supabase is not enabled. Cannot subscribe to table.");
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
const MAX_RETRIES = 10;
|
|
90
|
+
const BASE_RETRY_DELAY = 1000; // 1 second
|
|
91
|
+
// Check if channel already exists
|
|
92
|
+
if (this.channels.has(channelName)) {
|
|
93
|
+
if (retryCount === 0) {
|
|
94
|
+
console.warn(`⚠️ Channel '${channelName}' already exists. Unsubscribing old channel first.`);
|
|
95
|
+
}
|
|
96
|
+
// cleanup previous channel instance before retrying/subscribing
|
|
97
|
+
const oldChannel = this.channels.get(channelName);
|
|
98
|
+
if (oldChannel) {
|
|
99
|
+
this.client.removeChannel(oldChannel).catch((err) => console.error("Error removing old channel:", err));
|
|
100
|
+
this.channels.delete(channelName);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (retryCount === 0) {
|
|
104
|
+
console.log(`🔧 Setting up channel: ${channelName}`);
|
|
105
|
+
console.log(` Table: ${schema}.${tableName}`);
|
|
106
|
+
console.log(` Event: ${event}`);
|
|
107
|
+
if (filter) {
|
|
108
|
+
console.log(` Filter: ${filter}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.log(`🔄 Retrying subscription for channel: ${channelName} (Attempt ${retryCount}/${MAX_RETRIES})`);
|
|
113
|
+
}
|
|
114
|
+
const scheduleRetry = () => {
|
|
115
|
+
if (retryCount >= MAX_RETRIES) {
|
|
116
|
+
console.error(`❌ Max retries reached for channel: ${channelName}. Giving up.`);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const delay = Math.min(BASE_RETRY_DELAY * Math.pow(2, retryCount), 30000 // Max 30 seconds delay
|
|
120
|
+
);
|
|
121
|
+
console.log(`⏳ Scheduling retry in ${delay}ms...`);
|
|
122
|
+
setTimeout(() => {
|
|
123
|
+
this.subscribeToTable(channelName, tableName, callback, event, schema, filter, retryCount + 1);
|
|
124
|
+
}, delay);
|
|
125
|
+
};
|
|
126
|
+
// Create new channel
|
|
127
|
+
const channel = this.client.channel(channelName)
|
|
128
|
+
.on("postgres_changes", { event, schema, table: tableName, filter }, (payload) => {
|
|
129
|
+
console.log(`\n📡 [${channelName}] ===== CHANGE RECEIVED =====`);
|
|
130
|
+
console.log(` Timestamp: ${new Date().toISOString()}`);
|
|
131
|
+
console.log(` Event Type: ${payload.eventType}`);
|
|
132
|
+
console.log(` Table: ${payload.table}`);
|
|
133
|
+
console.log(` Schema: ${payload.schema}`);
|
|
134
|
+
// console.log(` Full Payload:`, JSON.stringify(payload, null, 2)); // Reduced noise
|
|
135
|
+
console.log(`========================================\n`);
|
|
136
|
+
callback(payload);
|
|
137
|
+
})
|
|
138
|
+
.subscribe((status, err) => {
|
|
139
|
+
console.log(`\n📊 [${channelName}] Subscription status changed: ${status}`);
|
|
140
|
+
if (status === "SUBSCRIBED") {
|
|
141
|
+
console.log(`✅ Successfully subscribed to channel: ${channelName}`);
|
|
142
|
+
console.log(` Listening for: ${event} events on ${schema}.${tableName}`);
|
|
143
|
+
if (filter) {
|
|
144
|
+
console.log(` Applied Filter: ${filter}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else if (status === "CHANNEL_ERROR") {
|
|
148
|
+
console.error(`❌ Error subscribing to channel: ${channelName}`);
|
|
149
|
+
if (err) {
|
|
150
|
+
console.error(` Error details:`, err);
|
|
151
|
+
}
|
|
152
|
+
scheduleRetry();
|
|
153
|
+
}
|
|
154
|
+
else if (status === "TIMED_OUT") {
|
|
155
|
+
console.error(`⏱️ Subscription timed out for channel: ${channelName}`);
|
|
156
|
+
scheduleRetry();
|
|
157
|
+
}
|
|
158
|
+
else if (status === "CLOSED") {
|
|
159
|
+
console.log(`🔌 Channel closed: ${channelName}`);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
console.log(`📊 Channel status: ${status}`);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
// Store channel reference
|
|
166
|
+
this.channels.set(channelName, channel);
|
|
167
|
+
return channel;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Unsubscribe from a channel
|
|
171
|
+
* @param channelName - Name of the channel to unsubscribe from
|
|
172
|
+
*/
|
|
173
|
+
async unsubscribe(channelName) {
|
|
174
|
+
if (!this.isEnabled()) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
const channel = this.channels.get(channelName);
|
|
178
|
+
if (channel) {
|
|
179
|
+
await this.client.removeChannel(channel);
|
|
180
|
+
this.channels.delete(channelName);
|
|
181
|
+
console.log(`🔌 Unsubscribed from channel: ${channelName}`);
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
console.warn(`⚠️ Channel '${channelName}' not found`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Unsubscribe from all channels
|
|
189
|
+
*/
|
|
190
|
+
async unsubscribeAll() {
|
|
191
|
+
if (!this.isEnabled()) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
console.log(`🔌 Unsubscribing from ${this.channels.size} channels...`);
|
|
195
|
+
await this.client.removeAllChannels();
|
|
196
|
+
this.channels.clear();
|
|
197
|
+
console.log("✅ All channels unsubscribed");
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Get all active channel names
|
|
201
|
+
*/
|
|
202
|
+
getActiveChannels() {
|
|
203
|
+
return Array.from(this.channels.keys());
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Check if a channel is active
|
|
207
|
+
*/
|
|
208
|
+
isChannelActive(channelName) {
|
|
209
|
+
return this.channels.has(channelName);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
exports.SupabaseService = SupabaseService;
|
|
213
|
+
//# sourceMappingURL=SupabaseService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SupabaseService.js","sourceRoot":"","sources":["../../../../src/infrastructure/services/SupabaseService.ts"],"names":[],"mappings":"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"}
|
package/dist/src/main.js
CHANGED
|
@@ -44,6 +44,8 @@ const StopStreamUseCase_1 = require("./application/use-cases/StopStreamUseCase")
|
|
|
44
44
|
const StreamManagerService_1 = require("./application/services/StreamManagerService");
|
|
45
45
|
const HttpClient_1 = require("./application/services/HttpClient");
|
|
46
46
|
const RemoteLogger_1 = require("./infrastructure/logging/RemoteLogger");
|
|
47
|
+
const SupabaseService_1 = require("./infrastructure/services/SupabaseService");
|
|
48
|
+
const SupabaseListener_1 = require("./infrastructure/listeners/SupabaseListener");
|
|
47
49
|
class Application {
|
|
48
50
|
constructor() {
|
|
49
51
|
this.logger = new RemoteLogger_1.RemoteLogger({
|
|
@@ -66,8 +68,20 @@ class Application {
|
|
|
66
68
|
// Initialize use cases
|
|
67
69
|
const startStreamUseCase = new StartStreamUseCase_1.StartStreamUseCase(streamRepository, ffmpegService, this.logger, this.httpClient);
|
|
68
70
|
const stopStreamUseCase = new StopStreamUseCase_1.StopStreamUseCase(streamRepository, ffmpegService, this.logger);
|
|
71
|
+
// Initialize Supabase Listener (if enabled)
|
|
72
|
+
const supabaseConfig = config.get().supabase;
|
|
73
|
+
let supabaseListener;
|
|
74
|
+
if (supabaseConfig.enabled) {
|
|
75
|
+
this.logger.info("Initializing Supabase services...");
|
|
76
|
+
SupabaseService_1.SupabaseService.initialize(supabaseConfig.url, supabaseConfig.anonKey, supabaseConfig.enabled);
|
|
77
|
+
supabaseListener = new SupabaseListener_1.SupabaseListener(supabaseConfig.channelName, supabaseConfig.tableName);
|
|
78
|
+
this.logger.info("SupabaseListener initialized");
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
this.logger.info("Supabase is disabled via configuration");
|
|
82
|
+
}
|
|
69
83
|
// Initialize stream manager
|
|
70
|
-
this.streamManager = new StreamManagerService_1.StreamManagerService(streamRepository, ffmpegService, sseService, startStreamUseCase, stopStreamUseCase, this.logger, config, this.httpClient);
|
|
84
|
+
this.streamManager = new StreamManagerService_1.StreamManagerService(streamRepository, ffmpegService, sseService, startStreamUseCase, stopStreamUseCase, this.logger, config, this.httpClient, supabaseListener);
|
|
71
85
|
// Start the stream manager
|
|
72
86
|
await this.streamManager.start();
|
|
73
87
|
this.logger.info("Streamer Node Application started successfully");
|
|
@@ -88,6 +102,9 @@ class Application {
|
|
|
88
102
|
if (this.streamManager) {
|
|
89
103
|
await this.streamManager.stop();
|
|
90
104
|
}
|
|
105
|
+
if (this.supabaseListener) { // Keep this just in case, though StreamManager handles unsub
|
|
106
|
+
await this.supabaseListener.stop();
|
|
107
|
+
}
|
|
91
108
|
this.logger.info("Application shutdown completed");
|
|
92
109
|
process.exit(0);
|
|
93
110
|
}
|
package/dist/src/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,6DAA+C;AAC/C,2DAAwD;AACxD,yGAAsG;AACtG,mFAAgF;AAChF,6EAA0E;AAC1E,mFAAgF;AAChF,iFAA8E;AAC9E,sFAAmF;AACnF,kEAA+D;AAC/D,wEAAqE;
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/main.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "streamer-node",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.29",
|
|
4
4
|
"description": "A lightweight TypeScript streaming system with Clean Architecture",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -43,10 +43,15 @@
|
|
|
43
43
|
"node": ">=16.0.0"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"
|
|
46
|
+
"@napi-rs/canvas": "^0.1.94",
|
|
47
|
+
"@supabase/supabase-js": "^2.39.0",
|
|
48
|
+
"cloudinary": "^2.9.0",
|
|
49
|
+
"dotenv": "^16.3.1",
|
|
50
|
+
"pngjs": "^7.0.0"
|
|
47
51
|
},
|
|
48
52
|
"devDependencies": {
|
|
49
53
|
"@types/node": "^20.0.0",
|
|
54
|
+
"@types/pngjs": "^6.0.5",
|
|
50
55
|
"typescript": "^5.0.0"
|
|
51
56
|
}
|
|
52
57
|
}
|