@multiplayer-app/ai-agent-node 0.0.1

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 (210) hide show
  1. package/.env.example +45 -0
  2. package/README.md +611 -0
  3. package/config.example.json +73 -0
  4. package/dist/config.d.ts +35 -0
  5. package/dist/config.d.ts.map +1 -0
  6. package/dist/config.js +44 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/helpers/AIHelper.d.ts +23 -0
  9. package/dist/helpers/AIHelper.d.ts.map +1 -0
  10. package/dist/helpers/AIHelper.js +326 -0
  11. package/dist/helpers/AIHelper.js.map +1 -0
  12. package/dist/helpers/AIHelper.test.d.ts +2 -0
  13. package/dist/helpers/AIHelper.test.d.ts.map +1 -0
  14. package/dist/helpers/AIHelper.test.js +332 -0
  15. package/dist/helpers/AIHelper.test.js.map +1 -0
  16. package/dist/helpers/ConfigHelper.d.ts +20 -0
  17. package/dist/helpers/ConfigHelper.d.ts.map +1 -0
  18. package/dist/helpers/ConfigHelper.js +118 -0
  19. package/dist/helpers/ConfigHelper.js.map +1 -0
  20. package/dist/helpers/ContextLimiter.d.ts +82 -0
  21. package/dist/helpers/ContextLimiter.d.ts.map +1 -0
  22. package/dist/helpers/ContextLimiter.js +165 -0
  23. package/dist/helpers/ContextLimiter.js.map +1 -0
  24. package/dist/helpers/FileHelper.d.ts +31 -0
  25. package/dist/helpers/FileHelper.d.ts.map +1 -0
  26. package/dist/helpers/FileHelper.js +175 -0
  27. package/dist/helpers/FileHelper.js.map +1 -0
  28. package/dist/helpers/SetupHelper.d.ts +5 -0
  29. package/dist/helpers/SetupHelper.d.ts.map +1 -0
  30. package/dist/helpers/SetupHelper.js +32 -0
  31. package/dist/helpers/SetupHelper.js.map +1 -0
  32. package/dist/helpers/index.d.ts +6 -0
  33. package/dist/helpers/index.d.ts.map +1 -0
  34. package/dist/helpers/index.js +6 -0
  35. package/dist/helpers/index.js.map +1 -0
  36. package/dist/index.d.ts +18 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +17 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/libs/index.d.ts +4 -0
  41. package/dist/libs/index.d.ts.map +1 -0
  42. package/dist/libs/index.js +4 -0
  43. package/dist/libs/index.js.map +1 -0
  44. package/dist/libs/kafka/config.d.ts +5 -0
  45. package/dist/libs/kafka/config.d.ts.map +1 -0
  46. package/dist/libs/kafka/config.js +5 -0
  47. package/dist/libs/kafka/config.js.map +1 -0
  48. package/dist/libs/kafka/consumer.d.ts +16 -0
  49. package/dist/libs/kafka/consumer.d.ts.map +1 -0
  50. package/dist/libs/kafka/consumer.js +126 -0
  51. package/dist/libs/kafka/consumer.js.map +1 -0
  52. package/dist/libs/kafka/index.d.ts +3 -0
  53. package/dist/libs/kafka/index.d.ts.map +1 -0
  54. package/dist/libs/kafka/index.js +3 -0
  55. package/dist/libs/kafka/index.js.map +1 -0
  56. package/dist/libs/kafka/kafka.d.ts +3 -0
  57. package/dist/libs/kafka/kafka.d.ts.map +1 -0
  58. package/dist/libs/kafka/kafka.js +24 -0
  59. package/dist/libs/kafka/kafka.js.map +1 -0
  60. package/dist/libs/kafka/producer.d.ts +11 -0
  61. package/dist/libs/kafka/producer.d.ts.map +1 -0
  62. package/dist/libs/kafka/producer.js +44 -0
  63. package/dist/libs/kafka/producer.js.map +1 -0
  64. package/dist/libs/logger/config.d.ts +5 -0
  65. package/dist/libs/logger/config.d.ts.map +1 -0
  66. package/dist/libs/logger/config.js +6 -0
  67. package/dist/libs/logger/config.js.map +1 -0
  68. package/dist/libs/logger/index.d.ts +10 -0
  69. package/dist/libs/logger/index.d.ts.map +1 -0
  70. package/dist/libs/logger/index.js +20 -0
  71. package/dist/libs/logger/index.js.map +1 -0
  72. package/dist/libs/logger/kafkajs-logger-creator.d.ts +12 -0
  73. package/dist/libs/logger/kafkajs-logger-creator.d.ts.map +1 -0
  74. package/dist/libs/logger/kafkajs-logger-creator.js +29 -0
  75. package/dist/libs/logger/kafkajs-logger-creator.js.map +1 -0
  76. package/dist/libs/logger/logger.d.ts +42 -0
  77. package/dist/libs/logger/logger.d.ts.map +1 -0
  78. package/dist/libs/logger/logger.js +44 -0
  79. package/dist/libs/logger/logger.js.map +1 -0
  80. package/dist/libs/s3/config.d.ts +7 -0
  81. package/dist/libs/s3/config.d.ts.map +1 -0
  82. package/dist/libs/s3/config.js +7 -0
  83. package/dist/libs/s3/config.js.map +1 -0
  84. package/dist/libs/s3/index.d.ts +4 -0
  85. package/dist/libs/s3/index.d.ts.map +1 -0
  86. package/dist/libs/s3/index.js +4 -0
  87. package/dist/libs/s3/index.js.map +1 -0
  88. package/dist/libs/s3/s3.lib.d.ts +25 -0
  89. package/dist/libs/s3/s3.lib.d.ts.map +1 -0
  90. package/dist/libs/s3/s3.lib.js +202 -0
  91. package/dist/libs/s3/s3.lib.js.map +1 -0
  92. package/dist/processors/ChatProcessor.d.ts +66 -0
  93. package/dist/processors/ChatProcessor.d.ts.map +1 -0
  94. package/dist/processors/ChatProcessor.js +610 -0
  95. package/dist/processors/ChatProcessor.js.map +1 -0
  96. package/dist/processors/ModelsProcessor.d.ts +11 -0
  97. package/dist/processors/ModelsProcessor.d.ts.map +1 -0
  98. package/dist/processors/ModelsProcessor.js +30 -0
  99. package/dist/processors/ModelsProcessor.js.map +1 -0
  100. package/dist/processors/index.d.ts +3 -0
  101. package/dist/processors/index.d.ts.map +1 -0
  102. package/dist/processors/index.js +3 -0
  103. package/dist/processors/index.js.map +1 -0
  104. package/dist/services/AIService.d.ts +48 -0
  105. package/dist/services/AIService.d.ts.map +1 -0
  106. package/dist/services/AIService.js +196 -0
  107. package/dist/services/AIService.js.map +1 -0
  108. package/dist/services/InternalEventsHandler.d.ts +21 -0
  109. package/dist/services/InternalEventsHandler.d.ts.map +1 -0
  110. package/dist/services/InternalEventsHandler.js +56 -0
  111. package/dist/services/InternalEventsHandler.js.map +1 -0
  112. package/dist/services/KafkaService.d.ts +35 -0
  113. package/dist/services/KafkaService.d.ts.map +1 -0
  114. package/dist/services/KafkaService.js +120 -0
  115. package/dist/services/KafkaService.js.map +1 -0
  116. package/dist/services/ModelFetcher.d.ts +54 -0
  117. package/dist/services/ModelFetcher.d.ts.map +1 -0
  118. package/dist/services/ModelFetcher.js +247 -0
  119. package/dist/services/ModelFetcher.js.map +1 -0
  120. package/dist/services/RedisService.d.ts +90 -0
  121. package/dist/services/RedisService.d.ts.map +1 -0
  122. package/dist/services/RedisService.js +236 -0
  123. package/dist/services/RedisService.js.map +1 -0
  124. package/dist/services/SocketService.d.ts +39 -0
  125. package/dist/services/SocketService.d.ts.map +1 -0
  126. package/dist/services/SocketService.js +128 -0
  127. package/dist/services/SocketService.js.map +1 -0
  128. package/dist/services/index.d.ts +7 -0
  129. package/dist/services/index.d.ts.map +1 -0
  130. package/dist/services/index.js +7 -0
  131. package/dist/services/index.js.map +1 -0
  132. package/dist/store/AgentStore.d.ts +48 -0
  133. package/dist/store/AgentStore.d.ts.map +1 -0
  134. package/dist/store/AgentStore.js +98 -0
  135. package/dist/store/AgentStore.js.map +1 -0
  136. package/dist/store/ArtifactStore.d.ts +13 -0
  137. package/dist/store/ArtifactStore.d.ts.map +1 -0
  138. package/dist/store/ArtifactStore.js +27 -0
  139. package/dist/store/ArtifactStore.js.map +1 -0
  140. package/dist/store/ConfigStore.d.ts +89 -0
  141. package/dist/store/ConfigStore.d.ts.map +1 -0
  142. package/dist/store/ConfigStore.js +214 -0
  143. package/dist/store/ConfigStore.js.map +1 -0
  144. package/dist/store/ConfigStore.test.d.ts +2 -0
  145. package/dist/store/ConfigStore.test.d.ts.map +1 -0
  146. package/dist/store/ConfigStore.test.js +259 -0
  147. package/dist/store/ConfigStore.test.js.map +1 -0
  148. package/dist/store/ModelStore.d.ts +44 -0
  149. package/dist/store/ModelStore.d.ts.map +1 -0
  150. package/dist/store/ModelStore.js +81 -0
  151. package/dist/store/ModelStore.js.map +1 -0
  152. package/dist/store/ModelStore.test.d.ts +2 -0
  153. package/dist/store/ModelStore.test.d.ts.map +1 -0
  154. package/dist/store/ModelStore.test.js +390 -0
  155. package/dist/store/ModelStore.test.js.map +1 -0
  156. package/dist/store/index.d.ts +5 -0
  157. package/dist/store/index.d.ts.map +1 -0
  158. package/dist/store/index.js +5 -0
  159. package/dist/store/index.js.map +1 -0
  160. package/dist/tools/generateChartTool.d.ts +24 -0
  161. package/dist/tools/generateChartTool.d.ts.map +1 -0
  162. package/dist/tools/generateChartTool.js +124 -0
  163. package/dist/tools/generateChartTool.js.map +1 -0
  164. package/dist/tools/proposeFormValuesTool.d.ts +35 -0
  165. package/dist/tools/proposeFormValuesTool.d.ts.map +1 -0
  166. package/dist/tools/proposeFormValuesTool.js +56 -0
  167. package/dist/tools/proposeFormValuesTool.js.map +1 -0
  168. package/package.json +71 -0
  169. package/src/config.ts +46 -0
  170. package/src/helpers/AIHelper.test.ts +375 -0
  171. package/src/helpers/AIHelper.ts +353 -0
  172. package/src/helpers/ConfigHelper.ts +130 -0
  173. package/src/helpers/ContextLimiter.ts +228 -0
  174. package/src/helpers/FileHelper.ts +197 -0
  175. package/src/helpers/SetupHelper.ts +35 -0
  176. package/src/helpers/index.ts +5 -0
  177. package/src/index.ts +18 -0
  178. package/src/libs/index.ts +3 -0
  179. package/src/libs/kafka/config.ts +4 -0
  180. package/src/libs/kafka/consumer.ts +161 -0
  181. package/src/libs/kafka/index.ts +2 -0
  182. package/src/libs/kafka/kafka.ts +27 -0
  183. package/src/libs/kafka/producer.ts +48 -0
  184. package/src/libs/logger/config.ts +4 -0
  185. package/src/libs/logger/index.ts +21 -0
  186. package/src/libs/logger/kafkajs-logger-creator.ts +28 -0
  187. package/src/libs/logger/logger.ts +60 -0
  188. package/src/libs/s3/config.ts +7 -0
  189. package/src/libs/s3/index.ts +3 -0
  190. package/src/libs/s3/s3.lib.ts +284 -0
  191. package/src/processors/ChatProcessor.ts +713 -0
  192. package/src/processors/ModelsProcessor.ts +34 -0
  193. package/src/processors/index.ts +2 -0
  194. package/src/services/AIService.ts +241 -0
  195. package/src/services/InternalEventsHandler.ts +61 -0
  196. package/src/services/KafkaService.ts +142 -0
  197. package/src/services/ModelFetcher.ts +286 -0
  198. package/src/services/RedisService.ts +285 -0
  199. package/src/services/SocketService.ts +153 -0
  200. package/src/services/index.ts +6 -0
  201. package/src/store/AgentStore.ts +138 -0
  202. package/src/store/ArtifactStore.ts +29 -0
  203. package/src/store/ConfigStore.test.ts +314 -0
  204. package/src/store/ConfigStore.ts +239 -0
  205. package/src/store/ModelStore.test.ts +473 -0
  206. package/src/store/ModelStore.ts +93 -0
  207. package/src/store/index.ts +4 -0
  208. package/src/tools/generateChartTool.ts +131 -0
  209. package/src/tools/proposeFormValuesTool.ts +67 -0
  210. package/tsconfig.json +24 -0
@@ -0,0 +1,247 @@
1
+ import { config as appConfig } from '../config';
2
+ import { logger } from '../libs/logger';
3
+ export class ModelFetcher {
4
+ constructor(config = {}) {
5
+ this.config = {
6
+ openaiApiKey: config.openaiApiKey || appConfig.ai.openaiApiKey,
7
+ anthropicApiKey: config.anthropicApiKey || appConfig.ai.anthropicApiKey,
8
+ googleApiKey: config.googleApiKey || appConfig.ai.googleApiKey,
9
+ openrouterApiKey: config.openrouterApiKey || appConfig.ai.openrouterApiKey
10
+ };
11
+ }
12
+ /**
13
+ * Analyze environment and fetch models for all available providers
14
+ */
15
+ async fetchAllModels() {
16
+ logger.info('Fetching available AI models...');
17
+ const allModels = [];
18
+ const providers = this.detectAvailableProviders();
19
+ for (const provider of providers) {
20
+ try {
21
+ const models = await this.fetchModelsForProvider(provider);
22
+ allModels.push(...models);
23
+ }
24
+ catch (error) {
25
+ logger.warn(`Failed to fetch models for provider ${provider}:`, error instanceof Error ? error.message : 'Unknown error');
26
+ }
27
+ }
28
+ return allModels;
29
+ }
30
+ /**
31
+ * Detect which providers are available based on API keys
32
+ */
33
+ detectAvailableProviders() {
34
+ const providers = [];
35
+ if (this.config.openrouterApiKey) {
36
+ providers.push('openrouter');
37
+ return providers;
38
+ }
39
+ if (this.config.openaiApiKey) {
40
+ providers.push('openai');
41
+ }
42
+ if (this.config.anthropicApiKey) {
43
+ providers.push('anthropic');
44
+ }
45
+ if (this.config.googleApiKey) {
46
+ providers.push('google');
47
+ }
48
+ return providers;
49
+ }
50
+ /**
51
+ * Fetch models for a specific provider
52
+ */
53
+ async fetchModelsForProvider(provider) {
54
+ switch (provider) {
55
+ case 'openai':
56
+ return this.fetchOpenAIModels();
57
+ case 'anthropic':
58
+ return this.fetchAnthropicModels();
59
+ case 'google':
60
+ return this.fetchGoogleModels();
61
+ case 'openrouter':
62
+ return this.fetchOpenRouterModels();
63
+ default:
64
+ throw new Error(`Unsupported provider: ${provider}`);
65
+ }
66
+ }
67
+ /**
68
+ * Fetch models from OpenAI
69
+ */
70
+ async fetchOpenAIModels() {
71
+ if (!this.config.openaiApiKey) {
72
+ return [];
73
+ }
74
+ try {
75
+ const response = await fetch('https://api.openai.com/v1/models', {
76
+ headers: {
77
+ 'Authorization': `Bearer ${this.config.openaiApiKey}`,
78
+ 'Content-Type': 'application/json'
79
+ }
80
+ });
81
+ if (!response.ok) {
82
+ throw new Error(`OpenAI API returned ${response.status}: ${response.statusText}`);
83
+ }
84
+ const data = await response.json();
85
+ const models = (data.data || [])
86
+ .filter((model) => model.id.startsWith('gpt-') || model.id.startsWith('o1'))
87
+ .map((model) => ({
88
+ id: model.id,
89
+ provider: 'openai',
90
+ label: this.formatModelLabel(model.id),
91
+ description: this.getModelDescription(model.id, 'openai')
92
+ }));
93
+ return models;
94
+ }
95
+ catch (error) {
96
+ logger.error('Failed to fetch OpenAI models:', error);
97
+ return [];
98
+ }
99
+ }
100
+ /**
101
+ * Fetch models from Anthropic
102
+ */
103
+ async fetchAnthropicModels() {
104
+ if (!this.config.anthropicApiKey) {
105
+ return [];
106
+ }
107
+ try {
108
+ const response = await fetch('https://api.anthropic.com/v1/models', {
109
+ headers: {
110
+ 'x-api-key': this.config.anthropicApiKey,
111
+ 'anthropic-version': '2023-06-01',
112
+ 'Content-Type': 'application/json'
113
+ }
114
+ });
115
+ if (!response.ok) {
116
+ throw new Error(`Anthropic API returned ${response.status}: ${response.statusText}`);
117
+ }
118
+ const data = await response.json();
119
+ const models = (data.data || [])
120
+ .filter((model) => model.id && model.id.startsWith('claude-'))
121
+ .map((model) => ({
122
+ id: model.id,
123
+ provider: 'anthropic',
124
+ label: this.formatModelLabel(model.id),
125
+ description: this.getModelDescription(model.id, 'anthropic')
126
+ }));
127
+ return models;
128
+ }
129
+ catch (error) {
130
+ logger.error('Failed to fetch Anthropic models:', error);
131
+ return [];
132
+ }
133
+ }
134
+ /**
135
+ * Fetch models from Google
136
+ */
137
+ async fetchGoogleModels() {
138
+ if (!this.config.googleApiKey) {
139
+ return [];
140
+ }
141
+ try {
142
+ // Google SDK doesn't have a models.list() endpoint
143
+ // Return known Google models
144
+ return [
145
+ {
146
+ id: 'gemini-2.0-flash-exp',
147
+ provider: 'google',
148
+ label: 'Gemini 2.0 Flash',
149
+ description: 'Google\'s latest fast and efficient model'
150
+ },
151
+ {
152
+ id: 'gemini-1.5-pro',
153
+ provider: 'google',
154
+ label: 'Gemini 1.5 Pro',
155
+ description: 'Google\'s advanced multimodal model'
156
+ },
157
+ {
158
+ id: 'gemini-1.5-flash',
159
+ provider: 'google',
160
+ label: 'Gemini 1.5 Flash',
161
+ description: 'Fast and efficient Gemini model'
162
+ },
163
+ {
164
+ id: 'gemini-pro',
165
+ provider: 'google',
166
+ label: 'Gemini Pro',
167
+ description: 'Google Gemini Pro model'
168
+ }
169
+ ];
170
+ }
171
+ catch (error) {
172
+ logger.error('Failed to fetch Google models:', error);
173
+ return [];
174
+ }
175
+ }
176
+ /**
177
+ * Fetch models from OpenRouter
178
+ */
179
+ async fetchOpenRouterModels() {
180
+ if (!this.config.openrouterApiKey) {
181
+ return [];
182
+ }
183
+ try {
184
+ const response = await fetch('https://openrouter.ai/api/v1/models?supported_parameters=tools', {
185
+ headers: {
186
+ 'Authorization': `Bearer ${this.config.openrouterApiKey}`,
187
+ 'Content-Type': 'application/json'
188
+ }
189
+ });
190
+ if (!response.ok) {
191
+ throw new Error(`OpenRouter API returned ${response.status}: ${response.statusText}`);
192
+ }
193
+ const data = await response.json();
194
+ const models = (data.data || []).map((model) => ({
195
+ id: model.id,
196
+ provider: model.id.split('/')[0],
197
+ label: model.name || this.formatModelLabel(model.id),
198
+ description: model.description || `OpenRouter model: ${model.id}`
199
+ }))
200
+ .filter((model) => model.provider === 'openai' ||
201
+ model.provider === 'anthropic' ||
202
+ model.provider === 'google')
203
+ .map((model) => ({
204
+ ...model,
205
+ provider: 'openrouter'
206
+ }));
207
+ return models;
208
+ }
209
+ catch (error) {
210
+ logger.error('Failed to fetch OpenRouter models:', error);
211
+ return [];
212
+ }
213
+ }
214
+ /**
215
+ * Format model ID into a readable label
216
+ */
217
+ formatModelLabel(modelId) {
218
+ // Convert "gpt-4o" to "GPT-4o"
219
+ return modelId
220
+ .split('-')
221
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
222
+ .join(' ');
223
+ }
224
+ /**
225
+ * Get description for known models
226
+ */
227
+ getModelDescription(modelId, provider) {
228
+ const descriptions = {
229
+ // OpenAI models
230
+ 'gpt-4o': 'OpenAI\'s most advanced multimodal model',
231
+ 'gpt-4o-mini': 'Faster and more affordable GPT-4o variant',
232
+ 'gpt-4-turbo': 'High-performance GPT-4 variant',
233
+ 'gpt-4': 'OpenAI GPT-4 model',
234
+ 'gpt-3.5-turbo': 'Fast and efficient GPT-3.5 model',
235
+ 'o1-preview': 'OpenAI O1 reasoning model',
236
+ 'o1-mini': 'OpenAI O1 Mini reasoning model',
237
+ // Anthropic models
238
+ 'claude-3-5-sonnet-20241022': 'Anthropic\'s latest and most capable model',
239
+ 'claude-3.5-sonnet-20241022': 'Anthropic\'s latest and most capable model',
240
+ 'claude-3-opus-20240229': 'Anthropic\'s most powerful model',
241
+ 'claude-3-sonnet-20240229': 'Balanced performance and speed',
242
+ 'claude-3-haiku-20240307': 'Fastest and most affordable Claude model'
243
+ };
244
+ return descriptions[modelId] || `${provider} model: ${modelId}`;
245
+ }
246
+ }
247
+ //# sourceMappingURL=ModelFetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModelFetcher.js","sourceRoot":"","sources":["../../src/services/ModelFetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import { createClient, RedisClientType } from 'redis';
2
+ export interface RedisConfig {
3
+ url?: string;
4
+ host?: string;
5
+ port?: number;
6
+ password?: string;
7
+ database?: number;
8
+ }
9
+ type RedisPubSubClient = ReturnType<typeof createClient>;
10
+ type RedisPubSubPair = {
11
+ pubClient: RedisPubSubClient;
12
+ subClient: RedisPubSubClient;
13
+ };
14
+ export declare class RedisService {
15
+ private client;
16
+ private pubSubClients;
17
+ private isConnected;
18
+ /**
19
+ * Initialize Redis client connection
20
+ */
21
+ initialize(redisConfigOverride?: RedisConfig): Promise<void>;
22
+ /**
23
+ * Get a value by key
24
+ */
25
+ get(key: string): Promise<string | null>;
26
+ /**
27
+ * Set a key-value pair
28
+ */
29
+ set(key: string, value: string, options?: {
30
+ EX?: number;
31
+ PX?: number;
32
+ }): Promise<void>;
33
+ /**
34
+ * Delete a key
35
+ */
36
+ del(key: string): Promise<number>;
37
+ /**
38
+ * Check if a key exists
39
+ */
40
+ exists(key: string): Promise<number>;
41
+ /**
42
+ * Set expiration on a key
43
+ * @returns true if the timeout was set, false if the key doesn't exist
44
+ */
45
+ expire(key: string, seconds: number): Promise<boolean>;
46
+ /**
47
+ * Get TTL (time to live) of a key
48
+ */
49
+ ttl(key: string): Promise<number>;
50
+ /**
51
+ * Increment a key's value
52
+ */
53
+ incr(key: string): Promise<number>;
54
+ /**
55
+ * Decrement a key's value
56
+ */
57
+ decr(key: string): Promise<number>;
58
+ /**
59
+ * Get multiple keys
60
+ */
61
+ mGet(keys: string[]): Promise<(string | null)[]>;
62
+ /**
63
+ * Set multiple key-value pairs
64
+ */
65
+ mSet(keyValuePairs: Record<string, string>): Promise<void>;
66
+ /**
67
+ * Get all keys matching a pattern
68
+ */
69
+ keys(pattern: string): Promise<string[]>;
70
+ /**
71
+ * Get the Redis client instance
72
+ */
73
+ getClient(): RedisClientType | null;
74
+ /**
75
+ * Get or create pub/sub clients for Socket.IO adapter
76
+ * These are separate clients needed for the Redis adapter
77
+ */
78
+ getPubSubClients(name?: string): Promise<RedisPubSubPair>;
79
+ /**
80
+ * Check if the client is connected
81
+ */
82
+ isClientConnected(): boolean;
83
+ /**
84
+ * Disconnect from Redis
85
+ */
86
+ disconnect(): Promise<void>;
87
+ }
88
+ export declare const redisService: RedisService;
89
+ export {};
90
+ //# sourceMappingURL=RedisService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisService.d.ts","sourceRoot":"","sources":["../../src/services/RedisService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAItD,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;AACzD,KAAK,eAAe,GAAG;IAAE,SAAS,EAAE,iBAAiB,CAAC;IAAC,SAAS,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAEtF,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,aAAa,CAA2C;IAChE,OAAO,CAAC,WAAW,CAAkB;IAErC;;OAEG;IACG,UAAU,CAAC,mBAAmB,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAwDlE;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAO9C;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5F;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOvC;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAO1C;;;OAGG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAO5D;;OAEG;IACG,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOvC;;OAEG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOxC;;OAEG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOxC;;OAEG;IACG,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IAOtD;;OAEG;IACG,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOhE;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAO9C;;OAEG;IACH,SAAS,IAAI,eAAe,GAAG,IAAI;IAInC;;;OAGG;IACG,gBAAgB,CAAC,IAAI,GAAE,MAAkB,GAAG,OAAO,CAAC,eAAe,CAAC;IA+C1E;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAI5B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAuBlC;AAED,eAAO,MAAM,YAAY,cAAqB,CAAC"}
@@ -0,0 +1,236 @@
1
+ import { createClient } from 'redis';
2
+ import { config, getRedisUrl } from '../config';
3
+ import { logger } from '../libs/logger';
4
+ export class RedisService {
5
+ constructor() {
6
+ this.client = null;
7
+ this.pubSubClients = new Map();
8
+ this.isConnected = false;
9
+ }
10
+ /**
11
+ * Initialize Redis client connection
12
+ */
13
+ async initialize(redisConfigOverride) {
14
+ var _a, _b;
15
+ if (this.client && this.isConnected) {
16
+ logger.info('Redis client already initialized');
17
+ return;
18
+ }
19
+ const redisUrl = (redisConfigOverride === null || redisConfigOverride === void 0 ? void 0 : redisConfigOverride.url) ||
20
+ config.redis.url ||
21
+ `redis://${(redisConfigOverride === null || redisConfigOverride === void 0 ? void 0 : redisConfigOverride.host) || config.redis.host}:${(redisConfigOverride === null || redisConfigOverride === void 0 ? void 0 : redisConfigOverride.port) || config.redis.port}`;
22
+ const redisConfig = {
23
+ url: redisUrl
24
+ };
25
+ if ((redisConfigOverride === null || redisConfigOverride === void 0 ? void 0 : redisConfigOverride.password) || config.redis.password) {
26
+ redisConfig.password = (redisConfigOverride === null || redisConfigOverride === void 0 ? void 0 : redisConfigOverride.password) || config.redis.password;
27
+ }
28
+ if ((redisConfigOverride === null || redisConfigOverride === void 0 ? void 0 : redisConfigOverride.database) !== undefined || config.redis.database !== undefined) {
29
+ redisConfig.database = (_b = (_a = redisConfigOverride === null || redisConfigOverride === void 0 ? void 0 : redisConfigOverride.database) !== null && _a !== void 0 ? _a : config.redis.database) !== null && _b !== void 0 ? _b : 0;
30
+ }
31
+ this.client = createClient(redisConfig);
32
+ this.client.on('error', (err) => {
33
+ logger.error('Redis Client Error:', err);
34
+ this.isConnected = false;
35
+ });
36
+ this.client.on('connect', () => {
37
+ logger.info('Redis Client connecting...');
38
+ });
39
+ this.client.on('ready', () => {
40
+ logger.info('Redis Client ready');
41
+ this.isConnected = true;
42
+ });
43
+ this.client.on('reconnecting', () => {
44
+ logger.info('Redis Client reconnecting...');
45
+ });
46
+ this.client.on('end', () => {
47
+ logger.info('Redis Client connection ended');
48
+ this.isConnected = false;
49
+ });
50
+ try {
51
+ await this.client.connect();
52
+ logger.info('Redis client connected successfully');
53
+ }
54
+ catch (error) {
55
+ logger.error('Failed to connect to Redis:', error);
56
+ throw error;
57
+ }
58
+ }
59
+ /**
60
+ * Get a value by key
61
+ */
62
+ async get(key) {
63
+ if (!this.client || !this.isConnected) {
64
+ throw new Error('Redis client not initialized or not connected');
65
+ }
66
+ return await this.client.get(key);
67
+ }
68
+ /**
69
+ * Set a key-value pair
70
+ */
71
+ async set(key, value, options) {
72
+ if (!this.client || !this.isConnected) {
73
+ throw new Error('Redis client not initialized or not connected');
74
+ }
75
+ await this.client.set(key, value, options);
76
+ }
77
+ /**
78
+ * Delete a key
79
+ */
80
+ async del(key) {
81
+ if (!this.client || !this.isConnected) {
82
+ throw new Error('Redis client not initialized or not connected');
83
+ }
84
+ return await this.client.del(key);
85
+ }
86
+ /**
87
+ * Check if a key exists
88
+ */
89
+ async exists(key) {
90
+ if (!this.client || !this.isConnected) {
91
+ throw new Error('Redis client not initialized or not connected');
92
+ }
93
+ return await this.client.exists(key);
94
+ }
95
+ /**
96
+ * Set expiration on a key
97
+ * @returns true if the timeout was set, false if the key doesn't exist
98
+ */
99
+ async expire(key, seconds) {
100
+ if (!this.client || !this.isConnected) {
101
+ throw new Error('Redis client not initialized or not connected');
102
+ }
103
+ return (await this.client.expire(key, seconds)) === 1;
104
+ }
105
+ /**
106
+ * Get TTL (time to live) of a key
107
+ */
108
+ async ttl(key) {
109
+ if (!this.client || !this.isConnected) {
110
+ throw new Error('Redis client not initialized or not connected');
111
+ }
112
+ return await this.client.ttl(key);
113
+ }
114
+ /**
115
+ * Increment a key's value
116
+ */
117
+ async incr(key) {
118
+ if (!this.client || !this.isConnected) {
119
+ throw new Error('Redis client not initialized or not connected');
120
+ }
121
+ return await this.client.incr(key);
122
+ }
123
+ /**
124
+ * Decrement a key's value
125
+ */
126
+ async decr(key) {
127
+ if (!this.client || !this.isConnected) {
128
+ throw new Error('Redis client not initialized or not connected');
129
+ }
130
+ return await this.client.decr(key);
131
+ }
132
+ /**
133
+ * Get multiple keys
134
+ */
135
+ async mGet(keys) {
136
+ if (!this.client || !this.isConnected) {
137
+ throw new Error('Redis client not initialized or not connected');
138
+ }
139
+ return await this.client.mGet(keys);
140
+ }
141
+ /**
142
+ * Set multiple key-value pairs
143
+ */
144
+ async mSet(keyValuePairs) {
145
+ if (!this.client || !this.isConnected) {
146
+ throw new Error('Redis client not initialized or not connected');
147
+ }
148
+ await this.client.mSet(keyValuePairs);
149
+ }
150
+ /**
151
+ * Get all keys matching a pattern
152
+ */
153
+ async keys(pattern) {
154
+ if (!this.client || !this.isConnected) {
155
+ throw new Error('Redis client not initialized or not connected');
156
+ }
157
+ return await this.client.keys(pattern);
158
+ }
159
+ /**
160
+ * Get the Redis client instance
161
+ */
162
+ getClient() {
163
+ return this.client;
164
+ }
165
+ /**
166
+ * Get or create pub/sub clients for Socket.IO adapter
167
+ * These are separate clients needed for the Redis adapter
168
+ */
169
+ async getPubSubClients(name = 'default') {
170
+ const existingPair = this.pubSubClients.get(name);
171
+ if (existingPair) {
172
+ return existingPair;
173
+ }
174
+ const redisUrl = getRedisUrl();
175
+ const redisConfig = {
176
+ url: redisUrl
177
+ };
178
+ if (config.redis.password) {
179
+ redisConfig.password = config.redis.password;
180
+ }
181
+ if (config.redis.database !== undefined) {
182
+ redisConfig.database = config.redis.database;
183
+ }
184
+ // Create pub client
185
+ const pubClient = createClient(redisConfig);
186
+ // Create sub client as duplicate of pub client
187
+ const subClient = pubClient.duplicate();
188
+ // Set up error handlers
189
+ pubClient.on('error', (err) => {
190
+ logger.error('Redis Pub Client Error:', err);
191
+ });
192
+ subClient.on('error', (err) => {
193
+ logger.error('Redis Sub Client Error:', err);
194
+ });
195
+ // Connect both clients
196
+ try {
197
+ await Promise.all([pubClient.connect(), subClient.connect()]);
198
+ logger.info(`Redis pub/sub clients connected successfully for ${name}`);
199
+ const pair = { pubClient, subClient };
200
+ this.pubSubClients.set(name, pair);
201
+ return pair;
202
+ }
203
+ catch (error) {
204
+ logger.error(`Failed to connect Redis pub/sub clients for ${name}:`, error);
205
+ throw error;
206
+ }
207
+ }
208
+ /**
209
+ * Check if the client is connected
210
+ */
211
+ isClientConnected() {
212
+ return this.isConnected;
213
+ }
214
+ /**
215
+ * Disconnect from Redis
216
+ */
217
+ async disconnect() {
218
+ const disconnectPromises = [];
219
+ if (this.client) {
220
+ disconnectPromises.push(this.client.quit().then(() => {
221
+ this.client = null;
222
+ }));
223
+ }
224
+ this.pubSubClients.forEach(({ pubClient, subClient }) => {
225
+ disconnectPromises.push(pubClient.quit().then(() => undefined).catch(() => undefined));
226
+ disconnectPromises.push(subClient.quit().then(() => undefined).catch(() => undefined));
227
+ });
228
+ this.pubSubClients.clear();
229
+ await Promise.all(disconnectPromises);
230
+ this.isConnected = false;
231
+ logger.info('Redis clients disconnected');
232
+ }
233
+ }
234
+ // Singleton instance
235
+ export const redisService = new RedisService();
236
+ //# sourceMappingURL=RedisService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisService.js","sourceRoot":"","sources":["../../src/services/RedisService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAmB,MAAM,OAAO,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAaxC,MAAM,OAAO,YAAY;IAAzB;QACU,WAAM,GAA2B,IAAI,CAAC;QACtC,kBAAa,GAAiC,IAAI,GAAG,EAAE,CAAC;QACxD,gBAAW,GAAY,KAAK,CAAC;IAuQvC,CAAC;IArQC;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,mBAAiC;;QAChD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YAChD,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,CAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,GAAG;YACxB,MAAM,CAAC,KAAK,CAAC,GAAG;YAChB,WAAW,CAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,IAAI,KAAI,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,IAAI,KAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAE/H,MAAM,WAAW,GAAQ;YACvB,GAAG,EAAE,QAAQ;SACd,CAAC;QAEF,IAAI,CAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,QAAQ,KAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC3D,WAAW,CAAC,QAAQ,GAAG,CAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,QAAQ,KAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;QAChF,CAAC;QAED,IAAI,CAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,QAAQ,MAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACvF,WAAW,CAAC,QAAQ,GAAG,MAAA,MAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,QAAQ,mCAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,mCAAI,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QAExC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC9B,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC;YACzC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YAC7B,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC3B,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;YAClC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;YAClC,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACzB,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC7C,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACnD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAa,EAAE,OAAsC;QAC1E,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,OAAe;QACvC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,IAAc;QACvB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,aAAqC;QAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,OAAe;QACxB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CAAC,OAAe,SAAS;QAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAQ;YACvB,GAAG,EAAE,QAAQ;SACd,CAAC;QAEF,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC1B,WAAW,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC/C,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACxC,WAAW,CAAC,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC/C,CAAC;QAED,oBAAoB;QACpB,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QAE5C,+CAA+C;QAC/C,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;QAExC,wBAAwB;QACxB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC5B,MAAM,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,uBAAuB;QACvB,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC,oDAAoD,IAAI,EAAE,CAAC,CAAC;YACxE,MAAM,IAAI,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,+CAA+C,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5E,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,kBAAkB,GAAoB,EAAE,CAAC;QAE/C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;gBACnD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACrB,CAAC,CAAC,CAAC,CAAC;QACN,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE;YACtD,kBAAkB,CAAC,IAAI,CACrB,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAC9D,CAAC;YACF,kBAAkB,CAAC,IAAI,CACrB,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAC9D,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QAE3B,MAAM,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QACtC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC5C,CAAC;CACF;AACD,qBAAqB;AACrB,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { Server as SocketIOServer } from 'socket.io';
2
+ import type { Server as HTTPServer } from 'http';
3
+ import type { AgentChatResponse, AgentMessage } from '@multiplayer-app/ai-agent-types';
4
+ export interface SocketError extends Error {
5
+ message: string;
6
+ data?: {
7
+ code: number;
8
+ };
9
+ }
10
+ export declare class SocketIOError extends Error implements SocketError {
11
+ data: {
12
+ code: number;
13
+ };
14
+ constructor(message: string, code: number);
15
+ }
16
+ type Middleware = <REQUEST = any, RESPONSE = any>(request: REQUEST, response: RESPONSE, next?: (error?: SocketError) => void) => void | Promise<void>;
17
+ export declare class SocketService {
18
+ private io;
19
+ initialize(httpServer: HTTPServer, authorizationMiddleware?: Middleware): Promise<void>;
20
+ /**
21
+ * Emit a new chat event to a specific user
22
+ */
23
+ emitNewChat(userId: string, chat: AgentChatResponse): void;
24
+ /**
25
+ * Emit a new message event to a specific user
26
+ */
27
+ emitMessageUpdate(userId: string | undefined, message: AgentMessage, excludeSocketId?: string): void;
28
+ /**
29
+ * Emit a chat update event to a specific user
30
+ */
31
+ emitChatUpdate(userId: string, chat: AgentChatResponse, excludeSocketId?: string): void;
32
+ /**
33
+ * Get the Socket.IO server instance
34
+ */
35
+ getIO(): SocketIOServer | null;
36
+ }
37
+ export declare const socketService: SocketService;
38
+ export {};
39
+ //# sourceMappingURL=SocketService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SocketService.d.ts","sourceRoot":"","sources":["../../src/services/SocketService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,MAAM,CAAC;AAEjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAIvF,MAAM,WAAW,WAAY,SAAQ,KAAK;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE;QACL,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;CACF;AAED,qBAAa,aAAc,SAAQ,KAAM,YAAW,WAAW;IACtD,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;gBAEjB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAI1C;AAED,KAAK,UAAU,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE,QAAQ,GAAG,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,WAAW,KAAK,IAAI,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAmCtJ,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAA+B;IAEnC,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,uBAAuB,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA6C7F;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAO1D;;OAEG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI;IAWpG;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI;IAUvF;;OAEG;IACH,KAAK,IAAI,cAAc,GAAG,IAAI;CAG/B;AAGD,eAAO,MAAM,aAAa,eAAsB,CAAC"}