@metatell/bot-core 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 (185) hide show
  1. package/dist/CoreServiceFactory.d.ts +25 -0
  2. package/dist/CoreServiceFactory.d.ts.map +1 -0
  3. package/dist/CoreServiceFactory.js +102 -0
  4. package/dist/CoreServiceFactory.js.map +1 -0
  5. package/dist/ServiceContainer.d.ts +87 -0
  6. package/dist/ServiceContainer.d.ts.map +1 -0
  7. package/dist/ServiceContainer.js +119 -0
  8. package/dist/ServiceContainer.js.map +1 -0
  9. package/dist/ServiceIdentifier.d.ts +28 -0
  10. package/dist/ServiceIdentifier.d.ts.map +1 -0
  11. package/dist/ServiceIdentifier.js +18 -0
  12. package/dist/ServiceIdentifier.js.map +1 -0
  13. package/dist/builders/NafMessageBuilder.d.ts +242 -0
  14. package/dist/builders/NafMessageBuilder.d.ts.map +1 -0
  15. package/dist/builders/NafMessageBuilder.js +288 -0
  16. package/dist/builders/NafMessageBuilder.js.map +1 -0
  17. package/dist/errors/animation-errors.d.ts +41 -0
  18. package/dist/errors/animation-errors.d.ts.map +1 -0
  19. package/dist/errors/animation-errors.js +60 -0
  20. package/dist/errors/animation-errors.js.map +1 -0
  21. package/dist/index.d.ts +32 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +27 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/interfaces/IAnimationService.d.ts +42 -0
  26. package/dist/interfaces/IAnimationService.d.ts.map +1 -0
  27. package/dist/interfaces/IAnimationService.js +5 -0
  28. package/dist/interfaces/IAnimationService.js.map +1 -0
  29. package/dist/interfaces/IAppSettings.d.ts +11 -0
  30. package/dist/interfaces/IAppSettings.d.ts.map +1 -0
  31. package/dist/interfaces/IAppSettings.js +5 -0
  32. package/dist/interfaces/IAppSettings.js.map +1 -0
  33. package/dist/interfaces/IAuthenticationService.d.ts +20 -0
  34. package/dist/interfaces/IAuthenticationService.d.ts.map +1 -0
  35. package/dist/interfaces/IAuthenticationService.js +5 -0
  36. package/dist/interfaces/IAuthenticationService.js.map +1 -0
  37. package/dist/interfaces/IAvatarController.d.ts +54 -0
  38. package/dist/interfaces/IAvatarController.d.ts.map +1 -0
  39. package/dist/interfaces/IAvatarController.js +5 -0
  40. package/dist/interfaces/IAvatarController.js.map +1 -0
  41. package/dist/interfaces/IConfigurationProvider.d.ts +39 -0
  42. package/dist/interfaces/IConfigurationProvider.d.ts.map +1 -0
  43. package/dist/interfaces/IConfigurationProvider.js +5 -0
  44. package/dist/interfaces/IConfigurationProvider.js.map +1 -0
  45. package/dist/interfaces/IConnectionManager.d.ts +23 -0
  46. package/dist/interfaces/IConnectionManager.d.ts.map +1 -0
  47. package/dist/interfaces/IConnectionManager.js +5 -0
  48. package/dist/interfaces/IConnectionManager.js.map +1 -0
  49. package/dist/interfaces/IEventBus.d.ts +28 -0
  50. package/dist/interfaces/IEventBus.d.ts.map +1 -0
  51. package/dist/interfaces/IEventBus.js +31 -0
  52. package/dist/interfaces/IEventBus.js.map +1 -0
  53. package/dist/interfaces/IMessageService.d.ts +25 -0
  54. package/dist/interfaces/IMessageService.d.ts.map +1 -0
  55. package/dist/interfaces/IMessageService.js +5 -0
  56. package/dist/interfaces/IMessageService.js.map +1 -0
  57. package/dist/interfaces/IOrganizationService.d.ts +58 -0
  58. package/dist/interfaces/IOrganizationService.d.ts.map +1 -0
  59. package/dist/interfaces/IOrganizationService.js +5 -0
  60. package/dist/interfaces/IOrganizationService.js.map +1 -0
  61. package/dist/interfaces/IPresenceManager.d.ts +20 -0
  62. package/dist/interfaces/IPresenceManager.d.ts.map +1 -0
  63. package/dist/interfaces/IPresenceManager.js +5 -0
  64. package/dist/interfaces/IPresenceManager.js.map +1 -0
  65. package/dist/interfaces/IUserAvatarManager.d.ts +88 -0
  66. package/dist/interfaces/IUserAvatarManager.d.ts.map +1 -0
  67. package/dist/interfaces/IUserAvatarManager.js +5 -0
  68. package/dist/interfaces/IUserAvatarManager.js.map +1 -0
  69. package/dist/interfaces/IWebSocketConnectionManager.d.ts +14 -0
  70. package/dist/interfaces/IWebSocketConnectionManager.d.ts.map +1 -0
  71. package/dist/interfaces/IWebSocketConnectionManager.js +2 -0
  72. package/dist/interfaces/IWebSocketConnectionManager.js.map +1 -0
  73. package/dist/logging/LogEventEmitter.d.ts +38 -0
  74. package/dist/logging/LogEventEmitter.d.ts.map +1 -0
  75. package/dist/logging/LogEventEmitter.js +54 -0
  76. package/dist/logging/LogEventEmitter.js.map +1 -0
  77. package/dist/logging/index.d.ts +22 -0
  78. package/dist/logging/index.d.ts.map +1 -0
  79. package/dist/logging/index.js +10 -0
  80. package/dist/logging/index.js.map +1 -0
  81. package/dist/logging/providers/default.d.ts +22 -0
  82. package/dist/logging/providers/default.d.ts.map +1 -0
  83. package/dist/logging/providers/default.js +175 -0
  84. package/dist/logging/providers/default.js.map +1 -0
  85. package/dist/logging/spi.d.ts +35 -0
  86. package/dist/logging/spi.d.ts.map +1 -0
  87. package/dist/logging/spi.js +25 -0
  88. package/dist/logging/spi.js.map +1 -0
  89. package/dist/services/AnimationService.d.ts +38 -0
  90. package/dist/services/AnimationService.d.ts.map +1 -0
  91. package/dist/services/AnimationService.js +157 -0
  92. package/dist/services/AnimationService.js.map +1 -0
  93. package/dist/services/AppSettings.d.ts +14 -0
  94. package/dist/services/AppSettings.d.ts.map +1 -0
  95. package/dist/services/AppSettings.js +48 -0
  96. package/dist/services/AppSettings.js.map +1 -0
  97. package/dist/services/AuthenticationService.d.ts +13 -0
  98. package/dist/services/AuthenticationService.d.ts.map +1 -0
  99. package/dist/services/AuthenticationService.js +44 -0
  100. package/dist/services/AuthenticationService.js.map +1 -0
  101. package/dist/services/AvatarController.d.ts +50 -0
  102. package/dist/services/AvatarController.d.ts.map +1 -0
  103. package/dist/services/AvatarController.js +409 -0
  104. package/dist/services/AvatarController.js.map +1 -0
  105. package/dist/services/ChannelService.d.ts +19 -0
  106. package/dist/services/ChannelService.d.ts.map +1 -0
  107. package/dist/services/ChannelService.js +113 -0
  108. package/dist/services/ChannelService.js.map +1 -0
  109. package/dist/services/ConfigurationProvider.d.ts +13 -0
  110. package/dist/services/ConfigurationProvider.d.ts.map +1 -0
  111. package/dist/services/ConfigurationProvider.js +49 -0
  112. package/dist/services/ConfigurationProvider.js.map +1 -0
  113. package/dist/services/EventBus.d.ts +11 -0
  114. package/dist/services/EventBus.d.ts.map +1 -0
  115. package/dist/services/EventBus.js +54 -0
  116. package/dist/services/EventBus.js.map +1 -0
  117. package/dist/services/IChannelService.d.ts +57 -0
  118. package/dist/services/IChannelService.d.ts.map +1 -0
  119. package/dist/services/IChannelService.js +6 -0
  120. package/dist/services/IChannelService.js.map +1 -0
  121. package/dist/services/MessageService.d.ts +23 -0
  122. package/dist/services/MessageService.d.ts.map +1 -0
  123. package/dist/services/MessageService.js +141 -0
  124. package/dist/services/MessageService.js.map +1 -0
  125. package/dist/services/OrganizationService.d.ts +11 -0
  126. package/dist/services/OrganizationService.d.ts.map +1 -0
  127. package/dist/services/OrganizationService.js +121 -0
  128. package/dist/services/OrganizationService.js.map +1 -0
  129. package/dist/services/PresenceManager.d.ts +21 -0
  130. package/dist/services/PresenceManager.d.ts.map +1 -0
  131. package/dist/services/PresenceManager.js +143 -0
  132. package/dist/services/PresenceManager.js.map +1 -0
  133. package/dist/services/UserAvatarManager.d.ts +61 -0
  134. package/dist/services/UserAvatarManager.d.ts.map +1 -0
  135. package/dist/services/UserAvatarManager.js +466 -0
  136. package/dist/services/UserAvatarManager.js.map +1 -0
  137. package/dist/services/WebSocketConnectionManager.d.ts +26 -0
  138. package/dist/services/WebSocketConnectionManager.d.ts.map +1 -0
  139. package/dist/services/WebSocketConnectionManager.js +223 -0
  140. package/dist/services/WebSocketConnectionManager.js.map +1 -0
  141. package/dist/services/resolvers/CompositeUserIdResolver.d.ts +20 -0
  142. package/dist/services/resolvers/CompositeUserIdResolver.d.ts.map +1 -0
  143. package/dist/services/resolvers/CompositeUserIdResolver.js +46 -0
  144. package/dist/services/resolvers/CompositeUserIdResolver.js.map +1 -0
  145. package/dist/services/resolvers/CreatorMatchResolver.d.ts +15 -0
  146. package/dist/services/resolvers/CreatorMatchResolver.d.ts.map +1 -0
  147. package/dist/services/resolvers/CreatorMatchResolver.js +31 -0
  148. package/dist/services/resolvers/CreatorMatchResolver.js.map +1 -0
  149. package/dist/services/resolvers/ExactMatchResolver.d.ts +15 -0
  150. package/dist/services/resolvers/ExactMatchResolver.d.ts.map +1 -0
  151. package/dist/services/resolvers/ExactMatchResolver.js +28 -0
  152. package/dist/services/resolvers/ExactMatchResolver.js.map +1 -0
  153. package/dist/services/resolvers/IUserIdResolver.d.ts +53 -0
  154. package/dist/services/resolvers/IUserIdResolver.d.ts.map +1 -0
  155. package/dist/services/resolvers/IUserIdResolver.js +6 -0
  156. package/dist/services/resolvers/IUserIdResolver.js.map +1 -0
  157. package/dist/services/resolvers/OwnerMatchResolver.d.ts +15 -0
  158. package/dist/services/resolvers/OwnerMatchResolver.d.ts.map +1 -0
  159. package/dist/services/resolvers/OwnerMatchResolver.js +31 -0
  160. package/dist/services/resolvers/OwnerMatchResolver.js.map +1 -0
  161. package/dist/services/resolvers/PrefixMatchResolver.d.ts +17 -0
  162. package/dist/services/resolvers/PrefixMatchResolver.d.ts.map +1 -0
  163. package/dist/services/resolvers/PrefixMatchResolver.js +36 -0
  164. package/dist/services/resolvers/PrefixMatchResolver.js.map +1 -0
  165. package/dist/services/resolvers/index.d.ts +10 -0
  166. package/dist/services/resolvers/index.d.ts.map +1 -0
  167. package/dist/services/resolvers/index.js +9 -0
  168. package/dist/services/resolvers/index.js.map +1 -0
  169. package/dist/types/animation.d.ts +92 -0
  170. package/dist/types/animation.d.ts.map +1 -0
  171. package/dist/types/animation.js +31 -0
  172. package/dist/types/animation.js.map +1 -0
  173. package/dist/types/index.d.ts +14 -0
  174. package/dist/types/index.d.ts.map +1 -0
  175. package/dist/types/index.js +5 -0
  176. package/dist/types/index.js.map +1 -0
  177. package/dist/types/naf.d.ts +229 -0
  178. package/dist/types/naf.d.ts.map +1 -0
  179. package/dist/types/naf.js +93 -0
  180. package/dist/types/naf.js.map +1 -0
  181. package/dist/utils/nafParser.d.ts +64 -0
  182. package/dist/utils/nafParser.d.ts.map +1 -0
  183. package/dist/utils/nafParser.js +99 -0
  184. package/dist/utils/nafParser.js.map +1 -0
  185. package/package.json +37 -0
@@ -0,0 +1,11 @@
1
+ import type { EventHandler, IEventBus } from '../interfaces/IEventBus.js';
2
+ export declare class EventBus implements IEventBus {
3
+ private events;
4
+ private logger;
5
+ on<T = unknown>(event: string, handler: EventHandler<T>): void;
6
+ off<T = unknown>(event: string, handler: EventHandler<T>): void;
7
+ emit<T = unknown>(event: string, data?: T): void;
8
+ once<T = unknown>(event: string, handler: EventHandler<T>): void;
9
+ removeAllListeners(event?: string): void;
10
+ }
11
+ //# sourceMappingURL=EventBus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventBus.d.ts","sourceRoot":"","sources":["../../src/services/EventBus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AAGzE,qBAAa,QAAS,YAAW,SAAS;IACxC,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,MAAM,CAAwB;IAEtC,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAO9D,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAU/D,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI;IAkBhD,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;IAQhE,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;CAOzC"}
@@ -0,0 +1,54 @@
1
+ import { getLogger } from '../logging/index.js';
2
+ export class EventBus {
3
+ events = new Map();
4
+ logger = getLogger('EventBus');
5
+ on(event, handler) {
6
+ if (!this.events.has(event)) {
7
+ this.events.set(event, new Set());
8
+ }
9
+ this.events.get(event)?.add(handler);
10
+ }
11
+ off(event, handler) {
12
+ const handlers = this.events.get(event);
13
+ if (handlers) {
14
+ handlers.delete(handler);
15
+ if (handlers.size === 0) {
16
+ this.events.delete(event);
17
+ }
18
+ }
19
+ }
20
+ emit(event, data) {
21
+ const handlers = this.events.get(event);
22
+ if (handlers) {
23
+ for (const handler of handlers) {
24
+ try {
25
+ const result = handler(data);
26
+ if (result instanceof Promise) {
27
+ result.catch((error) => {
28
+ this.logger.error(`Error in event handler for "${event}"`, { error });
29
+ });
30
+ }
31
+ }
32
+ catch (error) {
33
+ this.logger.error(`Error in event handler for "${event}"`, { error });
34
+ }
35
+ }
36
+ }
37
+ }
38
+ once(event, handler) {
39
+ const wrappedHandler = (data) => {
40
+ this.off(event, wrappedHandler);
41
+ return handler(data);
42
+ };
43
+ this.on(event, wrappedHandler);
44
+ }
45
+ removeAllListeners(event) {
46
+ if (event) {
47
+ this.events.delete(event);
48
+ }
49
+ else {
50
+ this.events.clear();
51
+ }
52
+ }
53
+ }
54
+ //# sourceMappingURL=EventBus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventBus.js","sourceRoot":"","sources":["../../src/services/EventBus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE/C,MAAM,OAAO,QAAQ;IACX,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAA;IAC7C,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;IAEtC,EAAE,CAAc,KAAa,EAAE,OAAwB;QACrD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;QACnC,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,OAAuB,CAAC,CAAA;IACtD,CAAC;IAED,GAAG,CAAc,KAAa,EAAE,OAAwB;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACvC,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,MAAM,CAAC,OAAuB,CAAC,CAAA;YACxC,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YAC3B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAc,KAAa,EAAE,IAAQ;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACvC,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;oBAC5B,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;wBAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;4BACrB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;wBACvE,CAAC,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;gBACvE,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,CAAc,KAAa,EAAE,OAAwB;QACvD,MAAM,cAAc,GAAoB,CAAC,IAAI,EAAE,EAAE;YAC/C,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,CAAA;YAC/B,OAAO,OAAO,CAAC,IAAI,CAAC,CAAA;QACtB,CAAC,CAAA;QACD,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,CAAA;IAChC,CAAC;IAED,kBAAkB,CAAC,KAAc;QAC/B,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAC3B,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACrB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Interface for channel communication services
3
+ * Provides proper abstraction for Phoenix channel operations
4
+ */
5
+ import type { Channel } from 'phoenix';
6
+ /**
7
+ * Result of a channel push operation
8
+ */
9
+ export interface PushResult<T = unknown> {
10
+ status: 'ok' | 'error' | 'timeout';
11
+ data?: T;
12
+ error?: string;
13
+ }
14
+ /**
15
+ * Options for push operations
16
+ */
17
+ export interface PushOptions {
18
+ timeoutMs?: number;
19
+ retries?: number;
20
+ retryDelayMs?: number;
21
+ }
22
+ /**
23
+ * Batch push operation
24
+ */
25
+ export interface BatchPushOperation {
26
+ event: string;
27
+ payload?: object;
28
+ options?: PushOptions;
29
+ onSuccess?: (response: unknown) => void;
30
+ onError?: (error: Error) => void;
31
+ }
32
+ /**
33
+ * Interface for channel service
34
+ */
35
+ export interface IChannelService {
36
+ /**
37
+ * Push a message to a channel and wait for response
38
+ */
39
+ push<T = unknown>(channel: Channel, event: string, payload?: object, options?: PushOptions): Promise<T>;
40
+ /**
41
+ * Push multiple operations sequentially
42
+ */
43
+ pushSequence(channel: Channel, operations: BatchPushOperation[]): Promise<PushResult[]>;
44
+ /**
45
+ * Push multiple operations in parallel
46
+ */
47
+ pushParallel(channel: Channel, operations: BatchPushOperation[]): Promise<PushResult[]>;
48
+ /**
49
+ * Subscribe to channel events
50
+ */
51
+ subscribe(channel: Channel, event: string, handler: (payload: unknown) => void): () => void;
52
+ /**
53
+ * Wait for a specific event on a channel
54
+ */
55
+ waitForEvent<T = unknown>(channel: Channel, event: string, timeoutMs?: number): Promise<T>;
56
+ }
57
+ //# sourceMappingURL=IChannelService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IChannelService.d.ts","sourceRoot":"","sources":["../../src/services/IChannelService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEtC;;GAEG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,MAAM,EAAE,IAAI,GAAG,OAAO,GAAG,SAAS,CAAA;IAClC,IAAI,CAAC,EAAE,CAAC,CAAA;IACR,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,WAAW,CAAA;IACrB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAA;IACvC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,IAAI,CAAC,CAAC,GAAG,OAAO,EACd,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,CAAC,CAAC,CAAA;IAEb;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IAEvF;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAA;IAEvF;;OAEG;IACH,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAE3F;;OAEG;IACH,YAAY,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAC3F"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Interface for channel communication services
3
+ * Provides proper abstraction for Phoenix channel operations
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=IChannelService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IChannelService.js","sourceRoot":"","sources":["../../src/services/IChannelService.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,23 @@
1
+ import type { IAppSettings } from '../interfaces/IAppSettings.js';
2
+ import type { IConnectionManager } from '../interfaces/IConnectionManager.js';
3
+ import { type IEventBus } from '../interfaces/IEventBus.js';
4
+ import type { IMessageService, NAFMessage } from '../interfaces/IMessageService.js';
5
+ export declare class MessageService implements IMessageService {
6
+ private connectionManager;
7
+ private eventBus;
8
+ private appSettings;
9
+ private messageHandlers;
10
+ private listenersSetup;
11
+ private logger;
12
+ constructor(connectionManager: IConnectionManager, eventBus: IEventBus, appSettings: IAppSettings);
13
+ private setupChannelListeners;
14
+ private handleIncomingMessage;
15
+ sendMessage(message: string): Promise<void>;
16
+ sendNAF(data: NAFMessage): Promise<void>;
17
+ sendNAFR(data: NAFMessage): Promise<void>;
18
+ beginTyping(): Promise<void>;
19
+ endTyping(): Promise<void>;
20
+ on(event: 'message' | 'naf' | 'nafr', handler: (data: unknown) => void): void;
21
+ off(event: 'message' | 'naf' | 'nafr', handler: (data: unknown) => void): void;
22
+ }
23
+ //# sourceMappingURL=MessageService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageService.d.ts","sourceRoot":"","sources":["../../src/services/MessageService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACjE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AAC7E,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,4BAA4B,CAAA;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAGnF,qBAAa,cAAe,YAAW,eAAe;IAMlD,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,WAAW;IAPrB,OAAO,CAAC,eAAe,CAAkD;IACzE,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,MAAM,CAA8B;gBAGlC,iBAAiB,EAAE,kBAAkB,EACrC,QAAQ,EAAE,SAAS,EACnB,WAAW,EAAE,YAAY;IAQnC,OAAO,CAAC,qBAAqB;IA6D7B,OAAO,CAAC,qBAAqB;IAavB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa3C,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAcxC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAezC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAShC,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAO7E,GAAG,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;CAS/E"}
@@ -0,0 +1,141 @@
1
+ import { SystemEvents } from '../interfaces/IEventBus.js';
2
+ import { getLogger } from '../logging/index.js';
3
+ export class MessageService {
4
+ connectionManager;
5
+ eventBus;
6
+ appSettings;
7
+ messageHandlers = new Map();
8
+ listenersSetup = false;
9
+ logger = getLogger('MessageService');
10
+ constructor(connectionManager, eventBus, appSettings) {
11
+ this.connectionManager = connectionManager;
12
+ this.eventBus = eventBus;
13
+ this.appSettings = appSettings;
14
+ if (this.appSettings.debugMode) {
15
+ this.logger.debug('Debug mode is ON');
16
+ }
17
+ this.setupChannelListeners();
18
+ }
19
+ setupChannelListeners() {
20
+ // Listen for connection events to setup channel listeners
21
+ this.eventBus.on(SystemEvents.ROOM_JOINED, () => {
22
+ const channel = this.connectionManager.getHubChannel();
23
+ if (!channel || this.listenersSetup) {
24
+ return;
25
+ }
26
+ this.logger.debug('Setting up channel listeners');
27
+ this.listenersSetup = true;
28
+ // Setup message listener
29
+ channel.on('message', (payload) => {
30
+ if (this.appSettings.debugMode) {
31
+ this.logger.debug('[MESSAGE RECEIVED]', payload);
32
+ }
33
+ // Phoenixメッセージからsender_idを抽出
34
+ const messagePayload = payload;
35
+ const messageEventData = {
36
+ type: messagePayload.type || 'chat',
37
+ senderId: messagePayload.sender_id || messagePayload.session_id,
38
+ body: messagePayload.body || '',
39
+ timestamp: Date.now(),
40
+ };
41
+ if (this.appSettings.debugMode) {
42
+ this.logger.debug('[MESSAGE STRUCTURED]', messageEventData);
43
+ }
44
+ this.handleIncomingMessage('message', payload);
45
+ this.eventBus.emit(SystemEvents.MESSAGE_RECEIVED, messageEventData);
46
+ });
47
+ // Setup NAF listener
48
+ channel.on('naf', (payload) => {
49
+ if (this.appSettings.debugMode) {
50
+ this.logger.debug('[NAF RECEIVED]', payload);
51
+ }
52
+ this.handleIncomingMessage('naf', payload);
53
+ this.eventBus.emit(SystemEvents.NAF_RECEIVED, payload);
54
+ });
55
+ // Setup NAFR listener
56
+ channel.on('nafr', (payload) => {
57
+ if (this.appSettings.debugMode) {
58
+ this.logger.debug('[NAFR RECEIVED]', payload);
59
+ }
60
+ this.handleIncomingMessage('nafr', payload);
61
+ this.eventBus.emit(SystemEvents.NAFR_RECEIVED, payload);
62
+ });
63
+ });
64
+ }
65
+ handleIncomingMessage(type, data) {
66
+ const handlers = this.messageHandlers.get(type);
67
+ if (handlers) {
68
+ for (const handler of handlers) {
69
+ try {
70
+ handler(data);
71
+ }
72
+ catch (error) {
73
+ this.logger.error(`Error in message handler for "${type}":`, error);
74
+ }
75
+ }
76
+ }
77
+ }
78
+ async sendMessage(message) {
79
+ const channel = this.connectionManager.getHubChannel();
80
+ if (!channel) {
81
+ throw new Error('Not connected to hub');
82
+ }
83
+ const messageData = { body: message, type: 'chat' };
84
+ // Fire and forget - don't wait for response
85
+ channel.push('message', messageData);
86
+ this.eventBus.emit(SystemEvents.MESSAGE_SENT, { body: message });
87
+ }
88
+ async sendNAF(data) {
89
+ const channel = this.connectionManager.getHubChannel();
90
+ if (!channel) {
91
+ throw new Error('Not connected to hub');
92
+ }
93
+ if (this.appSettings.debugMode) {
94
+ this.logger.debug('[NAF SENT]', data);
95
+ }
96
+ // Fire and forget - don't wait for response
97
+ channel.push('naf', data);
98
+ }
99
+ async sendNAFR(data) {
100
+ const channel = this.connectionManager.getHubChannel();
101
+ if (!channel) {
102
+ throw new Error('Not connected to hub');
103
+ }
104
+ const nafrData = { naf: JSON.stringify(data) };
105
+ if (this.appSettings.debugMode) {
106
+ this.logger.debug('[NAFR SENT]', nafrData);
107
+ }
108
+ // Fire and forget - don't wait for response
109
+ channel.push('nafr', nafrData);
110
+ }
111
+ async beginTyping() {
112
+ const channel = this.connectionManager.getHubChannel();
113
+ if (!channel) {
114
+ throw new Error('Not connected to hub');
115
+ }
116
+ channel.push('events:typing', { typing: true });
117
+ }
118
+ async endTyping() {
119
+ const channel = this.connectionManager.getHubChannel();
120
+ if (!channel) {
121
+ throw new Error('Not connected to hub');
122
+ }
123
+ channel.push('events:typing', { typing: false });
124
+ }
125
+ on(event, handler) {
126
+ if (!this.messageHandlers.has(event)) {
127
+ this.messageHandlers.set(event, new Set());
128
+ }
129
+ this.messageHandlers.get(event)?.add(handler);
130
+ }
131
+ off(event, handler) {
132
+ const handlers = this.messageHandlers.get(event);
133
+ if (handlers) {
134
+ handlers.delete(handler);
135
+ if (handlers.size === 0) {
136
+ this.messageHandlers.delete(event);
137
+ }
138
+ }
139
+ }
140
+ }
141
+ //# sourceMappingURL=MessageService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageService.js","sourceRoot":"","sources":["../../src/services/MessageService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { IOrganizationService, OrganizationAvatar, OrganizationInfo } from '../interfaces/IOrganizationService.js';
2
+ export declare class OrganizationService implements IOrganizationService {
3
+ private logger;
4
+ getOrganizationInfo(hubUrl: string, hubId: string): Promise<OrganizationInfo>;
5
+ fetchOrganizationAvatars(hubUrl: string, organizationId: string): Promise<OrganizationAvatar[]>;
6
+ selectAvatar(avatars: OrganizationAvatar[], options?: {
7
+ avatarId?: string;
8
+ avatarSelection?: 'random' | 'organization' | string;
9
+ }): OrganizationAvatar | null;
10
+ }
11
+ //# sourceMappingURL=OrganizationService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationService.d.ts","sourceRoot":"","sources":["../../src/services/OrganizationService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,uCAAuC,CAAA;AA+C9C,qBAAa,mBAAoB,YAAW,oBAAoB;IAC9D,OAAO,CAAC,MAAM,CAAmC;IAE3C,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAgC7E,wBAAwB,CAC5B,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAyEhC,YAAY,CACV,OAAO,EAAE,kBAAkB,EAAE,EAC7B,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,eAAe,CAAC,EAAE,QAAQ,GAAG,cAAc,GAAG,MAAM,CAAA;KACrD,GACA,kBAAkB,GAAG,IAAI;CAkC7B"}
@@ -0,0 +1,121 @@
1
+ import { getLogger } from '../logging/index.js';
2
+ export class OrganizationService {
3
+ logger = getLogger('OrganizationService');
4
+ async getOrganizationInfo(hubUrl, hubId) {
5
+ try {
6
+ const url = new URL(hubUrl);
7
+ const realmUrl = `${url.origin}/realm?room-id=${hubId}`;
8
+ this.logger.debug('Fetching organization info from realm', { realmUrl });
9
+ const response = await fetch(realmUrl);
10
+ if (!response.ok) {
11
+ throw new Error(`Failed to fetch realm info: ${response.status} ${response.statusText}`);
12
+ }
13
+ const data = (await response.json());
14
+ if (!data.result?.realm) {
15
+ throw new Error('Invalid realm response: missing realm ID');
16
+ }
17
+ // idフィールドがない場合は組織IDが設定されていない
18
+ const organizationId = data.result.id || null;
19
+ return {
20
+ organizationId,
21
+ realmId: data.result.realm,
22
+ };
23
+ }
24
+ catch (error) {
25
+ this.logger.error('Error fetching organization info:', { error });
26
+ throw error;
27
+ }
28
+ }
29
+ async fetchOrganizationAvatars(hubUrl, organizationId) {
30
+ try {
31
+ // URLから環境を判定(stgやdevの場合はそれをAPIパスに含める)
32
+ const url = new URL(hubUrl);
33
+ let apiPath = '/api/v1';
34
+ if (url.hostname.includes('-stg.')) {
35
+ apiPath = '/api/admin/stg/api/v1';
36
+ }
37
+ else if (url.hostname.includes('-dev.')) {
38
+ apiPath = '/api/admin/dev/api/v1';
39
+ }
40
+ else if (url.hostname === 'metatell.app') {
41
+ // 本番環境の場合
42
+ apiPath = '/api/admin/prod/api/v1';
43
+ }
44
+ const endpoint = `${url.origin}${apiPath}/organizations/${organizationId}/avatars/public`;
45
+ this.logger.debug('Fetching organization avatars', {
46
+ hubUrl,
47
+ organizationId,
48
+ hostname: url.hostname,
49
+ apiPath,
50
+ endpoint,
51
+ });
52
+ const response = await fetch(endpoint);
53
+ this.logger.debug('Organization avatars API response', {
54
+ status: response.status,
55
+ statusText: response.statusText,
56
+ ok: response.ok,
57
+ });
58
+ if (!response.ok) {
59
+ const errorText = await response.text();
60
+ this.logger.error('Organization avatars API failed', {
61
+ status: response.status,
62
+ statusText: response.statusText,
63
+ body: errorText,
64
+ });
65
+ throw new Error(`Failed to fetch organization avatars: ${response.status} ${response.statusText} - ${errorText}`);
66
+ }
67
+ const data = (await response.json());
68
+ // APIレスポンスをOrganizationAvatar形式に変換
69
+ const avatars = (data.result || []).map((item) => ({
70
+ id: item.id,
71
+ name: item.name,
72
+ gltf: {
73
+ avatar: item.gltf.avatar,
74
+ },
75
+ preview_url: item.images.preview.url,
76
+ }));
77
+ this.logger.debug('Organization avatars data received', {
78
+ avatarCount: avatars.length,
79
+ avatars: avatars.map((a) => ({ id: a.id, name: a.name })),
80
+ });
81
+ return avatars;
82
+ }
83
+ catch (error) {
84
+ this.logger.error('Error fetching organization avatars:', {
85
+ hubUrl,
86
+ organizationId,
87
+ error: error instanceof Error ? { message: error.message, stack: error.stack } : error,
88
+ });
89
+ throw error;
90
+ }
91
+ }
92
+ selectAvatar(avatars, options) {
93
+ if (!avatars || avatars.length === 0) {
94
+ return null;
95
+ }
96
+ // 指定されたアバターIDが存在する場合はそれを使用
97
+ if (options?.avatarId) {
98
+ const specified = avatars.find((a) => a.id === options.avatarId);
99
+ if (specified) {
100
+ return specified;
101
+ }
102
+ }
103
+ // avatarSelectionが具体的なアバターIDの場合
104
+ if (options?.avatarSelection &&
105
+ options.avatarSelection !== 'random' &&
106
+ options.avatarSelection !== 'organization') {
107
+ const specified = avatars.find((a) => a.id === options.avatarSelection);
108
+ if (specified) {
109
+ return specified;
110
+ }
111
+ }
112
+ // ランダム選択の場合
113
+ if (options?.avatarSelection === 'random') {
114
+ const randomIndex = Math.floor(Math.random() * avatars.length);
115
+ return avatars[randomIndex];
116
+ }
117
+ // デフォルトは最初のアバター(organizationまたは未指定)
118
+ return avatars[0];
119
+ }
120
+ }
121
+ //# sourceMappingURL=OrganizationService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationService.js","sourceRoot":"","sources":["../../src/services/OrganizationService.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AA8C/C,MAAM,OAAO,mBAAmB;IACtB,MAAM,GAAG,SAAS,CAAC,qBAAqB,CAAC,CAAA;IAEjD,KAAK,CAAC,mBAAmB,CAAC,MAAc,EAAE,KAAa;QACrD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAA;YAC3B,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,MAAM,kBAAkB,KAAK,EAAE,CAAA;YAEvD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,uCAAuC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;YAExE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAA;YAEtC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;YAC1F,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAkB,CAAA;YAErD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;YAC7D,CAAC;YAED,6BAA6B;YAC7B,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,IAAI,CAAA;YAE7C,OAAO;gBACL,cAAc;gBACd,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;aAC3B,CAAA;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;YACjE,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC5B,MAAc,EACd,cAAsB;QAEtB,IAAI,CAAC;YACH,sCAAsC;YACtC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAA;YAC3B,IAAI,OAAO,GAAG,SAAS,CAAA;YAEvB,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,OAAO,GAAG,uBAAuB,CAAA;YACnC,CAAC;iBAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1C,OAAO,GAAG,uBAAuB,CAAA;YACnC,CAAC;iBAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;gBAC3C,UAAU;gBACV,OAAO,GAAG,wBAAwB,CAAA;YACpC,CAAC;YAED,MAAM,QAAQ,GAAG,GAAG,GAAG,CAAC,MAAM,GAAG,OAAO,kBAAkB,cAAc,iBAAiB,CAAA;YAEzF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE;gBACjD,MAAM;gBACN,cAAc;gBACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;gBACtB,OAAO;gBACP,QAAQ;aACT,CAAC,CAAA;YAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAA;YAEtC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAE;gBACrD,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,EAAE,EAAE,QAAQ,CAAC,EAAE;aAChB,CAAC,CAAA;YAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;gBACvC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,EAAE;oBACnD,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,IAAI,EAAE,SAAS;iBAChB,CAAC,CAAA;gBACF,MAAM,IAAI,KAAK,CACb,yCAAyC,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,SAAS,EAAE,CACjG,CAAA;YACH,CAAC;YAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAgC,CAAA;YAEnE,mCAAmC;YACnC,MAAM,OAAO,GAAyB,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACvE,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE;oBACJ,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;iBACzB;gBACD,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG;aACrC,CAAC,CAAC,CAAA;YAEH,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE;gBACtD,WAAW,EAAE,OAAO,CAAC,MAAM;gBAC3B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aAC1D,CAAC,CAAA;YAEF,OAAO,OAAO,CAAA;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sCAAsC,EAAE;gBACxD,MAAM;gBACN,cAAc;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK;aACvF,CAAC,CAAA;YACF,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED,YAAY,CACV,OAA6B,EAC7B,OAGC;QAED,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO,IAAI,CAAA;QACb,CAAC;QAED,2BAA2B;QAC3B,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;YAChE,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,SAAS,CAAA;YAClB,CAAC;QACH,CAAC;QAED,gCAAgC;QAChC,IACE,OAAO,EAAE,eAAe;YACxB,OAAO,CAAC,eAAe,KAAK,QAAQ;YACpC,OAAO,CAAC,eAAe,KAAK,cAAc,EAC1C,CAAC;YACD,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,eAAe,CAAC,CAAA;YACvE,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,SAAS,CAAA;YAClB,CAAC;QACH,CAAC;QAED,YAAY;QACZ,IAAI,OAAO,EAAE,eAAe,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;YAC9D,OAAO,OAAO,CAAC,WAAW,CAAC,CAAA;QAC7B,CAAC;QAED,oCAAoC;QACpC,OAAO,OAAO,CAAC,CAAC,CAAC,CAAA;IACnB,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import type { IConnectionManager } from '../interfaces/IConnectionManager.js';
2
+ import { type IEventBus } from '../interfaces/IEventBus.js';
3
+ import type { IPresenceManager, PresenceUser } from '../interfaces/IPresenceManager.js';
4
+ export declare class PresenceManager implements IPresenceManager {
5
+ private connectionManager;
6
+ private eventBus;
7
+ private presence;
8
+ private users;
9
+ private handlers;
10
+ private presenceSetup;
11
+ constructor(connectionManager: IConnectionManager, eventBus: IEventBus);
12
+ private setupPresence;
13
+ private handleUserJoin;
14
+ private handleUserLeave;
15
+ getUsers(): PresenceUser[];
16
+ getUser(id: string): PresenceUser | undefined;
17
+ isUserPresent(id: string): boolean;
18
+ on(event: 'join' | 'leave', handler: (user: PresenceUser) => void): void;
19
+ off(event: 'join' | 'leave', handler: (user: PresenceUser) => void): void;
20
+ }
21
+ //# sourceMappingURL=PresenceManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PresenceManager.d.ts","sourceRoot":"","sources":["../../src/services/PresenceManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AAC7E,OAAO,EAAE,KAAK,SAAS,EAAgB,MAAM,4BAA4B,CAAA;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAA;AAEvF,qBAAa,eAAgB,YAAW,gBAAgB;IAOpD,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,QAAQ;IAPlB,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,QAAQ,CAAuD;IACvE,OAAO,CAAC,aAAa,CAAQ;gBAGnB,iBAAiB,EAAE,kBAAkB,EACrC,QAAQ,EAAE,SAAS;IAK7B,OAAO,CAAC,aAAa;IAmGrB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,eAAe;IAavB,QAAQ,IAAI,YAAY,EAAE;IAI1B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI7C,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIlC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;IAOxE,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,GAAG,IAAI;CAS1E"}
@@ -0,0 +1,143 @@
1
+ import { Presence } from 'phoenix';
2
+ import { SystemEvents } from '../interfaces/IEventBus.js';
3
+ export class PresenceManager {
4
+ connectionManager;
5
+ eventBus;
6
+ presence = null;
7
+ users = new Map();
8
+ handlers = new Map();
9
+ presenceSetup = false;
10
+ constructor(connectionManager, eventBus) {
11
+ this.connectionManager = connectionManager;
12
+ this.eventBus = eventBus;
13
+ this.setupPresence();
14
+ }
15
+ setupPresence() {
16
+ this.eventBus.on(SystemEvents.ROOM_JOINED, () => {
17
+ const channel = this.connectionManager.getHubChannel();
18
+ if (!channel || this.presenceSetup) {
19
+ return;
20
+ }
21
+ this.presenceSetup = true;
22
+ this.presence = new Presence(channel);
23
+ // Handle presence state sync
24
+ this.presence.onSync(() => {
25
+ const newUsers = new Map();
26
+ // list() returns an array of transformed values
27
+ this.presence?.list((id, data) => {
28
+ const metaData = data;
29
+ // Metatellの実際のデータ構造に対応: metasがない場合はdataから直接取得を試す
30
+ let displayName = metaData.metas?.[0]?.profile?.displayName;
31
+ let avatarId = metaData.metas?.[0]?.profile?.avatarId;
32
+ // もしmetasが空またはundefinedなら、別の構造を試す
33
+ if (!displayName) {
34
+ const altData = data;
35
+ displayName =
36
+ altData?.displayName ||
37
+ altData?.profile?.displayName ||
38
+ altData?.name;
39
+ }
40
+ if (!avatarId) {
41
+ const altData = data;
42
+ avatarId =
43
+ altData?.avatarId ||
44
+ altData?.profile?.avatarId ||
45
+ altData?.avatar_id;
46
+ }
47
+ const user = {
48
+ id,
49
+ profile: {
50
+ displayName: displayName,
51
+ avatarId: avatarId,
52
+ },
53
+ permissions: (metaData.metas?.[0]?.permissions || {}),
54
+ roles: (metaData.metas?.[0]?.roles || {}),
55
+ };
56
+ newUsers.set(id, user);
57
+ return user; // Return the user for the array
58
+ });
59
+ // Find joins and leaves
60
+ const joins = [];
61
+ const leaves = [];
62
+ // Check for new users (joins)
63
+ for (const [id, user] of newUsers) {
64
+ if (!this.users.has(id)) {
65
+ joins.push(user);
66
+ }
67
+ }
68
+ // Check for removed users (leaves)
69
+ for (const [id, user] of this.users) {
70
+ if (!newUsers.has(id)) {
71
+ leaves.push(user);
72
+ }
73
+ }
74
+ // Update internal state
75
+ this.users = newUsers;
76
+ // Emit events
77
+ for (const user of joins) {
78
+ this.handleUserJoin(user);
79
+ this.eventBus.emit(SystemEvents.USER_JOINED, user);
80
+ }
81
+ for (const user of leaves) {
82
+ this.handleUserLeave(user);
83
+ this.eventBus.emit(SystemEvents.USER_LEFT, user);
84
+ }
85
+ });
86
+ // Handle presence diff
87
+ channel.on('presence_diff', (_diff) => {
88
+ // Suppressed: Presence diff logging
89
+ });
90
+ });
91
+ }
92
+ handleUserJoin(user) {
93
+ const handlers = this.handlers.get('join');
94
+ if (handlers) {
95
+ for (const handler of handlers) {
96
+ try {
97
+ handler(user);
98
+ }
99
+ catch (_error) {
100
+ // Suppressed: Error in presence join handler
101
+ }
102
+ }
103
+ }
104
+ }
105
+ handleUserLeave(user) {
106
+ const handlers = this.handlers.get('leave');
107
+ if (handlers) {
108
+ for (const handler of handlers) {
109
+ try {
110
+ handler(user);
111
+ }
112
+ catch (_error) {
113
+ // Suppressed: Error in presence leave handler
114
+ }
115
+ }
116
+ }
117
+ }
118
+ getUsers() {
119
+ return Array.from(this.users.values());
120
+ }
121
+ getUser(id) {
122
+ return this.users.get(id);
123
+ }
124
+ isUserPresent(id) {
125
+ return this.users.has(id);
126
+ }
127
+ on(event, handler) {
128
+ if (!this.handlers.has(event)) {
129
+ this.handlers.set(event, new Set());
130
+ }
131
+ this.handlers.get(event)?.add(handler);
132
+ }
133
+ off(event, handler) {
134
+ const eventHandlers = this.handlers.get(event);
135
+ if (eventHandlers) {
136
+ eventHandlers.delete(handler);
137
+ if (eventHandlers.size === 0) {
138
+ this.handlers.delete(event);
139
+ }
140
+ }
141
+ }
142
+ }
143
+ //# sourceMappingURL=PresenceManager.js.map