streamer-node 1.0.26 → 1.0.28

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 (39) hide show
  1. package/README.md +40 -0
  2. package/dist/package.json +7 -2
  3. package/dist/public/ds.png +0 -0
  4. package/dist/src/application/interfaces/StartStreamUseCase.types.d.ts +1 -0
  5. package/dist/src/application/interfaces/StartStreamUseCase.types.d.ts.map +1 -1
  6. package/dist/src/application/interfaces/StartStreamUseCase.types.js.map +1 -1
  7. package/dist/src/application/services/StreamManagerService.d.ts +3 -1
  8. package/dist/src/application/services/StreamManagerService.d.ts.map +1 -1
  9. package/dist/src/application/services/StreamManagerService.js +93 -34
  10. package/dist/src/application/services/StreamManagerService.js.map +1 -1
  11. package/dist/src/application/use-cases/StartStreamUseCase.d.ts.map +1 -1
  12. package/dist/src/application/use-cases/StartStreamUseCase.js +2 -2
  13. package/dist/src/application/use-cases/StartStreamUseCase.js.map +1 -1
  14. package/dist/src/domain/events/StreamEvent.d.ts +1 -0
  15. package/dist/src/domain/events/StreamEvent.d.ts.map +1 -1
  16. package/dist/src/domain/services/FFmpegService.d.ts +3 -3
  17. package/dist/src/domain/services/FFmpegService.d.ts.map +1 -1
  18. package/dist/src/infrastructure/config/Config.d.ts +12 -0
  19. package/dist/src/infrastructure/config/Config.d.ts.map +1 -1
  20. package/dist/src/infrastructure/config/Config.js +12 -0
  21. package/dist/src/infrastructure/config/Config.js.map +1 -1
  22. package/dist/src/infrastructure/listeners/SupabaseListener.d.ts +34 -0
  23. package/dist/src/infrastructure/listeners/SupabaseListener.d.ts.map +1 -0
  24. package/dist/src/infrastructure/listeners/SupabaseListener.js +231 -0
  25. package/dist/src/infrastructure/listeners/SupabaseListener.js.map +1 -0
  26. package/dist/src/infrastructure/services/NodeFFmpegService.d.ts +7 -3
  27. package/dist/src/infrastructure/services/NodeFFmpegService.d.ts.map +1 -1
  28. package/dist/src/infrastructure/services/NodeFFmpegService.js +63 -11
  29. package/dist/src/infrastructure/services/NodeFFmpegService.js.map +1 -1
  30. package/dist/src/infrastructure/services/NodeSSEService.d.ts.map +1 -1
  31. package/dist/src/infrastructure/services/NodeSSEService.js +2 -0
  32. package/dist/src/infrastructure/services/NodeSSEService.js.map +1 -1
  33. package/dist/src/infrastructure/services/SupabaseService.d.ts +66 -0
  34. package/dist/src/infrastructure/services/SupabaseService.d.ts.map +1 -0
  35. package/dist/src/infrastructure/services/SupabaseService.js +213 -0
  36. package/dist/src/infrastructure/services/SupabaseService.js.map +1 -0
  37. package/dist/src/main.js +18 -1
  38. package/dist/src/main.js.map +1 -1
  39. 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
  }
@@ -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;AAErE,MAAM,WAAW;IAAjB;QAEmB,WAAM,GAAG,IAAI,2BAAY,CACxC;YACE,GAAG,eAAM,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,aAAa;YAC3C,OAAO,EAAE,eAAM,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO;SACnD,EACD,OAAO,CACR,CAAC;QACe,eAAU,GAAG,IAAI,uBAAU,EAAE,CAAC;IAgGjD,CAAC;IA9FQ,KAAK,CAAC,KAAK;QAChB,IAAI,CAAC;YAGH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACvD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC;YAE5D,2BAA2B;YAC3B,MAAM,MAAM,GAAG,eAAM,CAAC,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAEnE,0BAA0B;YAC1B,MAAM,gBAAgB,GAAG,IAAI,uDAA0B,CACrD,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,kBAAkB,EACtC,IAAI,CAAC,MAAM,CACZ,CAAC;YACF,MAAM,aAAa,GAAG,IAAI,qCAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACjE,MAAM,UAAU,GAAG,IAAI,+BAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEnD,uBAAuB;YACvB,MAAM,kBAAkB,GAAG,IAAI,uCAAkB,CAC/C,gBAAgB,EAChB,aAAa,EACb,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,UAAU,CAChB,CAAC;YAEF,MAAM,iBAAiB,GAAG,IAAI,qCAAiB,CAC7C,gBAAgB,EAChB,aAAa,EACb,IAAI,CAAC,MAAM,CACZ,CAAC;YAEF,4BAA4B;YAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,2CAAoB,CAC3C,gBAAgB,EAChB,aAAa,EACb,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,IAAI,CAAC,MAAM,EACX,MAAM,EACN,IAAI,CAAC,UAAU,CAChB,CAAC;YAEF,2BAA2B;YAC3B,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YAEjC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAEnE,0BAA0B;YAC1B,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE;gBAC/C,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAEO,qBAAqB;QAC3B,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAc,EAAE,EAAE;YACxC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,4BAA4B,CAAC,CAAC;YAEjE,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;oBACvB,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;gBAClC,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;gBACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;oBACzC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAC9D,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;QAEF,oCAAoC;QACpC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,kBAAkB;QAEpE,6BAA6B;QAC7B,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;YACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;YAC1C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,wBAAwB;AACxB,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC;AAC9B,GAAG,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC1B,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAC;IACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
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.26",
3
+ "version": "1.0.28",
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
- "dotenv": "^16.3.1"
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
  }