@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,223 @@
1
+ // WebSocket polyfill for Node.js environment
2
+ import WebSocketImpl from 'ws';
3
+ // Set WebSocket globally in Node.js environment if not already defined
4
+ // Phoenix.js expects the browser's WebSocket API to be available globally
5
+ if (typeof global !== 'undefined') {
6
+ const g = global;
7
+ if (!g.WebSocket) {
8
+ // biome-ignore lint/suspicious/noExplicitAny: ws library provides a compatible WebSocket implementation for Node.js
9
+ g.WebSocket = WebSocketImpl;
10
+ }
11
+ }
12
+ import { Socket } from 'phoenix';
13
+ import { SystemEvents } from '../interfaces/IEventBus.js';
14
+ import { getLogger } from '../logging/index.js';
15
+ export class WebSocketConnectionManager {
16
+ eventBus;
17
+ configProvider;
18
+ appSettings;
19
+ socket = null;
20
+ hubChannel = null;
21
+ sessionId = null;
22
+ logger = getLogger('WebSocketConnectionManager');
23
+ constructor(eventBus, configProvider, appSettings) {
24
+ this.eventBus = eventBus;
25
+ this.configProvider = configProvider;
26
+ this.appSettings = appSettings;
27
+ if (this.appSettings.debugMode) {
28
+ this.logger.debug('Debug mode is ON');
29
+ }
30
+ }
31
+ async connect(config) {
32
+ try {
33
+ // Create Phoenix socket (no authentication here, just connect)
34
+ const socketUrl = new URL(config.serverUrl);
35
+ socketUrl.pathname = '/socket';
36
+ // プロトコルがhttpまたはhttpsの場合のみ変換
37
+ if (socketUrl.protocol === 'http:') {
38
+ socketUrl.protocol = 'ws:';
39
+ }
40
+ else if (socketUrl.protocol === 'https:') {
41
+ socketUrl.protocol = 'wss:';
42
+ }
43
+ // すでにws:またはwss:の場合はそのまま使用
44
+ this.socket = new Socket(socketUrl.toString(), {
45
+ params: {
46
+ session_token: null,
47
+ perms_token: null,
48
+ },
49
+ reconnectAfterMs: (tries) => {
50
+ const delay = [1000, 2000, 5000, 10000][tries - 1] || 10000;
51
+ this.logger.debug(`Reconnecting in ${delay}ms... (attempt ${tries})`);
52
+ return delay;
53
+ },
54
+ });
55
+ // Set up socket event handlers
56
+ this.socket.onOpen(() => {
57
+ this.logger.debug('WebSocket connected');
58
+ this.eventBus.emit(SystemEvents.CONNECTION_ESTABLISHED);
59
+ });
60
+ this.socket.onClose(() => {
61
+ this.logger.debug('WebSocket disconnected');
62
+ this.eventBus.emit(SystemEvents.CONNECTION_LOST);
63
+ });
64
+ this.socket.onError((error) => {
65
+ this.logger.debug('WebSocket error:', { error });
66
+ this.eventBus.emit(SystemEvents.CONNECTION_ERROR, error);
67
+ });
68
+ // Connect socket
69
+ this.socket.connect();
70
+ // Wait for connection
71
+ await this.waitForConnection();
72
+ // Join ret channel first (required by Metatell backend)
73
+ await this.joinRetChannel(config.hubId);
74
+ // Join hub channel
75
+ this.logger.debug('About to join hub:', { hubId: config.hubId });
76
+ await this.joinHub(config.hubId);
77
+ }
78
+ catch (error) {
79
+ this.logger.error(`Connection failed: ${error}`);
80
+ throw error;
81
+ }
82
+ }
83
+ async joinRetChannel(hubId) {
84
+ if (!this.socket) {
85
+ throw new Error('Socket not connected');
86
+ }
87
+ return new Promise((resolve, reject) => {
88
+ const retChannel = this.socket?.channel('ret', { hub_id: hubId });
89
+ if (!retChannel) {
90
+ reject(new Error('Failed to create ret channel'));
91
+ return;
92
+ }
93
+ retChannel
94
+ .join()
95
+ .receive('ok', () => {
96
+ this.logger.debug('Successfully joined ret channel');
97
+ resolve();
98
+ })
99
+ .receive('error', (error) => {
100
+ this.logger.error('Failed to join ret channel:', error);
101
+ reject(new Error(`Failed to join ret channel: ${JSON.stringify(error)}`));
102
+ })
103
+ .receive('timeout', () => {
104
+ this.logger.error('Timeout joining ret channel');
105
+ reject(new Error('Timeout joining ret channel'));
106
+ });
107
+ });
108
+ }
109
+ async joinHub(hubId) {
110
+ if (!this.socket) {
111
+ throw new Error('Socket not connected');
112
+ }
113
+ return new Promise((resolve, reject) => {
114
+ // Get profile and context from configuration provider
115
+ const config = this.configProvider.getConfiguration();
116
+ // Build channel parameters
117
+ // Note: Don't send auth_token/perms_token if they're null
118
+ // The backend has issues handling null tokens
119
+ const channelParams = {
120
+ profile: config.profile,
121
+ context: config.context || {},
122
+ };
123
+ // Add bot_access_key if provided
124
+ if (config.botAccessKey) {
125
+ channelParams.bot_access_key = config.botAccessKey;
126
+ }
127
+ this.logger.debug('Attempting to join hub with:', {
128
+ channel: `hub:${hubId}`,
129
+ params: channelParams,
130
+ });
131
+ this.hubChannel = this.socket?.channel(`hub:${hubId}`, channelParams) || null;
132
+ if (this.hubChannel) {
133
+ // デバッグモードの場合、主要なイベントを監視
134
+ if (this.appSettings.debugMode) {
135
+ // PhoenixのChannelは特定のイベントに対してのみリスナーを設定可能
136
+ // 全てのイベントを監視するには、個別にリスナーを追加する必要がある
137
+ const debugEvents = [
138
+ 'phx_reply',
139
+ 'presence_state',
140
+ 'presence_diff',
141
+ 'message',
142
+ 'naf',
143
+ 'nafr',
144
+ 'event',
145
+ 'events:entering',
146
+ 'events:entered',
147
+ 'events:leaving',
148
+ 'events:left',
149
+ 'hub:member_update',
150
+ 'hub:avatar_update',
151
+ 'hub:scene_update',
152
+ ];
153
+ debugEvents.forEach((event) => {
154
+ this.hubChannel?.on(event, (payload) => {
155
+ this.logger.debug('[WS_RECEIVE]', { event, payload });
156
+ });
157
+ });
158
+ }
159
+ this.hubChannel
160
+ .join()
161
+ .receive('ok', (response) => {
162
+ this.logger.debug('Joined hub channel:', { response });
163
+ // session_idまたはsessionIdを探す
164
+ const sessionResponse = response;
165
+ this.sessionId =
166
+ (sessionResponse.session_id ||
167
+ sessionResponse.sessionId ||
168
+ sessionResponse.id) || null;
169
+ this.eventBus.emit(SystemEvents.ROOM_JOINED, response);
170
+ resolve();
171
+ })
172
+ .receive('error', (error) => {
173
+ this.logger.error(`Failed to join hub: ${error}`);
174
+ reject(new Error(`Failed to join hub: ${JSON.stringify(error)}`));
175
+ })
176
+ .receive('timeout', () => {
177
+ this.logger.error('Hub join timeout');
178
+ reject(new Error('Hub join timeout'));
179
+ });
180
+ }
181
+ else {
182
+ reject(new Error('Failed to create hub channel'));
183
+ }
184
+ });
185
+ }
186
+ async disconnect() {
187
+ if (this.hubChannel) {
188
+ this.hubChannel.leave();
189
+ this.hubChannel = null;
190
+ }
191
+ if (this.socket) {
192
+ this.socket.disconnect();
193
+ this.socket = null;
194
+ }
195
+ this.sessionId = null;
196
+ this.eventBus.emit(SystemEvents.CONNECTION_LOST);
197
+ }
198
+ isConnected() {
199
+ return this.socket?.isConnected() ?? false;
200
+ }
201
+ getSocket() {
202
+ return this.socket;
203
+ }
204
+ getHubChannel() {
205
+ return this.hubChannel;
206
+ }
207
+ async waitForConnection(timeout = 30000) {
208
+ const startTime = Date.now();
209
+ while (!this.isConnected()) {
210
+ if (Date.now() - startTime > timeout) {
211
+ throw new Error('Connection timeout');
212
+ }
213
+ await new Promise((resolve) => setTimeout(resolve, 100));
214
+ }
215
+ }
216
+ on(event, callback) {
217
+ this.hubChannel?.on(event, callback);
218
+ }
219
+ getSessionId() {
220
+ return this.sessionId;
221
+ }
222
+ }
223
+ //# sourceMappingURL=WebSocketConnectionManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketConnectionManager.js","sourceRoot":"","sources":["../../src/services/WebSocketConnectionManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Composite resolver that chains multiple resolvers
3
+ * Implements the Chain of Responsibility pattern
4
+ */
5
+ import type { PresenceUser } from '../../interfaces/IPresenceManager.js';
6
+ import type { NAFComponent } from '../../types/index.js';
7
+ import type { ICompositeUserIdResolver, IdResolutionResult, IUserIdResolver } from './IUserIdResolver.js';
8
+ export declare class CompositeUserIdResolver implements ICompositeUserIdResolver {
9
+ private readonly resolvers;
10
+ private sortedResolvers;
11
+ constructor(resolvers?: IUserIdResolver[]);
12
+ addResolver(resolver: IUserIdResolver): void;
13
+ removeResolver(name: string): void;
14
+ getResolvers(): ReadonlyArray<IUserIdResolver>;
15
+ resolve(networkId: string, users: ReadonlyArray<PresenceUser>, nafData?: NAFComponent): IdResolutionResult;
16
+ getName(): string;
17
+ getPriority(): number;
18
+ private updateSortedResolvers;
19
+ }
20
+ //# sourceMappingURL=CompositeUserIdResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompositeUserIdResolver.d.ts","sourceRoot":"","sources":["../../../src/services/resolvers/CompositeUserIdResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EACV,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EAChB,MAAM,sBAAsB,CAAA;AAE7B,qBAAa,uBAAwB,YAAW,wBAAwB;IACtE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0C;IACpE,OAAO,CAAC,eAAe,CAAwB;gBAEnC,SAAS,GAAE,eAAe,EAAO;IAM7C,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAK5C,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKlC,YAAY,IAAI,aAAa,CAAC,eAAe,CAAC;IAI9C,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,EAClC,OAAO,CAAC,EAAE,YAAY,GACrB,kBAAkB;IAerB,OAAO,IAAI,MAAM;IAIjB,WAAW,IAAI,MAAM;IAIrB,OAAO,CAAC,qBAAqB;CAK9B"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Composite resolver that chains multiple resolvers
3
+ * Implements the Chain of Responsibility pattern
4
+ */
5
+ export class CompositeUserIdResolver {
6
+ resolvers = new Map();
7
+ sortedResolvers = [];
8
+ constructor(resolvers = []) {
9
+ for (const resolver of resolvers) {
10
+ this.addResolver(resolver);
11
+ }
12
+ }
13
+ addResolver(resolver) {
14
+ this.resolvers.set(resolver.getName(), resolver);
15
+ this.updateSortedResolvers();
16
+ }
17
+ removeResolver(name) {
18
+ this.resolvers.delete(name);
19
+ this.updateSortedResolvers();
20
+ }
21
+ getResolvers() {
22
+ return [...this.sortedResolvers];
23
+ }
24
+ resolve(networkId, users, nafData) {
25
+ for (const resolver of this.sortedResolvers) {
26
+ const result = resolver.resolve(networkId, users, nafData);
27
+ // Return first successful resolution
28
+ if (result.userId && result.confidence !== 'none') {
29
+ return result;
30
+ }
31
+ }
32
+ return {
33
+ confidence: 'none',
34
+ };
35
+ }
36
+ getName() {
37
+ return 'composite';
38
+ }
39
+ getPriority() {
40
+ return 0; // Highest priority as the main resolver
41
+ }
42
+ updateSortedResolvers() {
43
+ this.sortedResolvers = Array.from(this.resolvers.values()).sort((a, b) => a.getPriority() - b.getPriority());
44
+ }
45
+ }
46
+ //# sourceMappingURL=CompositeUserIdResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompositeUserIdResolver.js","sourceRoot":"","sources":["../../../src/services/resolvers/CompositeUserIdResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,OAAO,uBAAuB;IACjB,SAAS,GAAiC,IAAI,GAAG,EAAE,CAAA;IAC5D,eAAe,GAAsB,EAAE,CAAA;IAE/C,YAAY,YAA+B,EAAE;QAC3C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;IAED,WAAW,CAAC,QAAyB;QACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAA;QAChD,IAAI,CAAC,qBAAqB,EAAE,CAAA;IAC9B,CAAC;IAED,cAAc,CAAC,IAAY;QACzB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC3B,IAAI,CAAC,qBAAqB,EAAE,CAAA;IAC9B,CAAC;IAED,YAAY;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,CAAA;IAClC,CAAC;IAED,OAAO,CACL,SAAiB,EACjB,KAAkC,EAClC,OAAsB;QAEtB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;YAE1D,qCAAqC;YACrC,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC;gBAClD,OAAO,MAAM,CAAA;YACf,CAAC;QACH,CAAC;QAED,OAAO;YACL,UAAU,EAAE,MAAM;SACnB,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,WAAW;QACT,OAAO,CAAC,CAAA,CAAC,wCAAwC;IACnD,CAAC;IAEO,qBAAqB;QAC3B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAC7D,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAC5C,CAAA;IACH,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Creator match ID resolver
3
+ * Matches based on NAF component creator field
4
+ */
5
+ import type { PresenceUser } from '../../interfaces/IPresenceManager.js';
6
+ import type { NAFComponent } from '../../types/index.js';
7
+ import type { IdResolutionResult, IUserIdResolver } from './IUserIdResolver.js';
8
+ export declare class CreatorMatchResolver implements IUserIdResolver {
9
+ private readonly name;
10
+ private readonly priority;
11
+ resolve(_networkId: string, users: ReadonlyArray<PresenceUser>, nafData?: NAFComponent): IdResolutionResult;
12
+ getName(): string;
13
+ getPriority(): number;
14
+ }
15
+ //# sourceMappingURL=CreatorMatchResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreatorMatchResolver.d.ts","sourceRoot":"","sources":["../../../src/services/resolvers/CreatorMatchResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE/E,qBAAa,oBAAqB,YAAW,eAAe;IAC1D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAI;IAE7B,OAAO,CACL,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,EAClC,OAAO,CAAC,EAAE,YAAY,GACrB,kBAAkB;IAoBrB,OAAO,IAAI,MAAM;IAIjB,WAAW,IAAI,MAAM;CAGtB"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Creator match ID resolver
3
+ * Matches based on NAF component creator field
4
+ */
5
+ export class CreatorMatchResolver {
6
+ name = 'creator-match';
7
+ priority = 2;
8
+ resolve(_networkId, users, nafData) {
9
+ if (!nafData?.creator) {
10
+ return { confidence: 'none' };
11
+ }
12
+ const user = users.find((u) => u.id === nafData.creator);
13
+ if (user) {
14
+ return {
15
+ userId: user.id,
16
+ strategy: this.name,
17
+ confidence: 'high',
18
+ };
19
+ }
20
+ return {
21
+ confidence: 'none',
22
+ };
23
+ }
24
+ getName() {
25
+ return this.name;
26
+ }
27
+ getPriority() {
28
+ return this.priority;
29
+ }
30
+ }
31
+ //# sourceMappingURL=CreatorMatchResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreatorMatchResolver.js","sourceRoot":"","sources":["../../../src/services/resolvers/CreatorMatchResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,OAAO,oBAAoB;IACd,IAAI,GAAG,eAAe,CAAA;IACtB,QAAQ,GAAG,CAAC,CAAA;IAE7B,OAAO,CACL,UAAkB,EAClB,KAAkC,EAClC,OAAsB;QAEtB,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YACtB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;QAC/B,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;QAExD,IAAI,IAAI,EAAE,CAAC;YACT,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,UAAU,EAAE,MAAM;aACnB,CAAA;QACH,CAAC;QAED,OAAO;YACL,UAAU,EAAE,MAAM;SACnB,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Exact match ID resolver
3
+ * Highest confidence resolution strategy
4
+ */
5
+ import type { PresenceUser } from '../../interfaces/IPresenceManager.js';
6
+ import type { NAFComponent } from '../../types/index.js';
7
+ import type { IdResolutionResult, IUserIdResolver } from './IUserIdResolver.js';
8
+ export declare class ExactMatchResolver implements IUserIdResolver {
9
+ private readonly name;
10
+ private readonly priority;
11
+ resolve(networkId: string, users: ReadonlyArray<PresenceUser>, _nafData?: NAFComponent): IdResolutionResult;
12
+ getName(): string;
13
+ getPriority(): number;
14
+ }
15
+ //# sourceMappingURL=ExactMatchResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExactMatchResolver.d.ts","sourceRoot":"","sources":["../../../src/services/resolvers/ExactMatchResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE/E,qBAAa,kBAAmB,YAAW,eAAe;IACxD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAI;IAE7B,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,EAClC,QAAQ,CAAC,EAAE,YAAY,GACtB,kBAAkB;IAgBrB,OAAO,IAAI,MAAM;IAIjB,WAAW,IAAI,MAAM;CAGtB"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Exact match ID resolver
3
+ * Highest confidence resolution strategy
4
+ */
5
+ export class ExactMatchResolver {
6
+ name = 'exact-match';
7
+ priority = 1;
8
+ resolve(networkId, users, _nafData) {
9
+ const user = users.find((u) => u.id === networkId);
10
+ if (user) {
11
+ return {
12
+ userId: user.id,
13
+ strategy: this.name,
14
+ confidence: 'exact',
15
+ };
16
+ }
17
+ return {
18
+ confidence: 'none',
19
+ };
20
+ }
21
+ getName() {
22
+ return this.name;
23
+ }
24
+ getPriority() {
25
+ return this.priority;
26
+ }
27
+ }
28
+ //# sourceMappingURL=ExactMatchResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExactMatchResolver.js","sourceRoot":"","sources":["../../../src/services/resolvers/ExactMatchResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,OAAO,kBAAkB;IACZ,IAAI,GAAG,aAAa,CAAA;IACpB,QAAQ,GAAG,CAAC,CAAA;IAE7B,OAAO,CACL,SAAiB,EACjB,KAAkC,EAClC,QAAuB;QAEvB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAA;QAElD,IAAI,IAAI,EAAE,CAAC;YACT,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,UAAU,EAAE,OAAO;aACpB,CAAA;QACH,CAAC;QAED,OAAO;YACL,UAAU,EAAE,MAAM;SACnB,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;CACF"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Interface for user ID resolution strategies
3
+ * This separates the concern of ID resolution from avatar management
4
+ */
5
+ import type { PresenceUser } from '../../interfaces/IPresenceManager.js';
6
+ import type { NAFComponent } from '../../types/index.js';
7
+ /**
8
+ * Result of ID resolution attempt
9
+ */
10
+ export interface IdResolutionResult {
11
+ userId?: string;
12
+ strategy?: string;
13
+ confidence: 'exact' | 'high' | 'medium' | 'low' | 'none';
14
+ }
15
+ /**
16
+ * Interface for user ID resolvers
17
+ */
18
+ export interface IUserIdResolver {
19
+ /**
20
+ * Resolve a network ID to a user ID
21
+ * @param networkId The network ID to resolve
22
+ * @param users Available users to match against
23
+ * @param nafData Optional NAF component data for additional context
24
+ * @returns Resolution result with confidence level
25
+ */
26
+ resolve(networkId: string, users: ReadonlyArray<PresenceUser>, nafData?: NAFComponent): IdResolutionResult;
27
+ /**
28
+ * Get resolver name for debugging/metrics
29
+ */
30
+ getName(): string;
31
+ /**
32
+ * Get resolver priority (lower number = higher priority)
33
+ */
34
+ getPriority(): number;
35
+ }
36
+ /**
37
+ * Composite resolver that chains multiple resolvers
38
+ */
39
+ export interface ICompositeUserIdResolver extends IUserIdResolver {
40
+ /**
41
+ * Add a resolver to the chain
42
+ */
43
+ addResolver(resolver: IUserIdResolver): void;
44
+ /**
45
+ * Remove a resolver from the chain
46
+ */
47
+ removeResolver(name: string): void;
48
+ /**
49
+ * Get all registered resolvers
50
+ */
51
+ getResolvers(): ReadonlyArray<IUserIdResolver>;
52
+ }
53
+ //# sourceMappingURL=IUserIdResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IUserIdResolver.d.ts","sourceRoot":"","sources":["../../../src/services/resolvers/IUserIdResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAExD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAA;CACzD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;;OAMG;IACH,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,EAClC,OAAO,CAAC,EAAE,YAAY,GACrB,kBAAkB,CAAA;IAErB;;OAEG;IACH,OAAO,IAAI,MAAM,CAAA;IAEjB;;OAEG;IACH,WAAW,IAAI,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,eAAe;IAC/D;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAA;IAE5C;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAElC;;OAEG;IACH,YAAY,IAAI,aAAa,CAAC,eAAe,CAAC,CAAA;CAC/C"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Interface for user ID resolution strategies
3
+ * This separates the concern of ID resolution from avatar management
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=IUserIdResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IUserIdResolver.js","sourceRoot":"","sources":["../../../src/services/resolvers/IUserIdResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Owner match ID resolver
3
+ * Matches based on NAF component owner field
4
+ */
5
+ import type { PresenceUser } from '../../interfaces/IPresenceManager.js';
6
+ import type { NAFComponent } from '../../types/index.js';
7
+ import type { IdResolutionResult, IUserIdResolver } from './IUserIdResolver.js';
8
+ export declare class OwnerMatchResolver implements IUserIdResolver {
9
+ private readonly name;
10
+ private readonly priority;
11
+ resolve(_networkId: string, users: ReadonlyArray<PresenceUser>, nafData?: NAFComponent): IdResolutionResult;
12
+ getName(): string;
13
+ getPriority(): number;
14
+ }
15
+ //# sourceMappingURL=OwnerMatchResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OwnerMatchResolver.d.ts","sourceRoot":"","sources":["../../../src/services/resolvers/OwnerMatchResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE/E,qBAAa,kBAAmB,YAAW,eAAe;IACxD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAI;IAE7B,OAAO,CACL,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,EAClC,OAAO,CAAC,EAAE,YAAY,GACrB,kBAAkB;IAoBrB,OAAO,IAAI,MAAM;IAIjB,WAAW,IAAI,MAAM;CAGtB"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Owner match ID resolver
3
+ * Matches based on NAF component owner field
4
+ */
5
+ export class OwnerMatchResolver {
6
+ name = 'owner-match';
7
+ priority = 3;
8
+ resolve(_networkId, users, nafData) {
9
+ if (!nafData?.owner) {
10
+ return { confidence: 'none' };
11
+ }
12
+ const user = users.find((u) => u.id === nafData.owner);
13
+ if (user) {
14
+ return {
15
+ userId: user.id,
16
+ strategy: this.name,
17
+ confidence: 'high',
18
+ };
19
+ }
20
+ return {
21
+ confidence: 'none',
22
+ };
23
+ }
24
+ getName() {
25
+ return this.name;
26
+ }
27
+ getPriority() {
28
+ return this.priority;
29
+ }
30
+ }
31
+ //# sourceMappingURL=OwnerMatchResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OwnerMatchResolver.js","sourceRoot":"","sources":["../../../src/services/resolvers/OwnerMatchResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,OAAO,kBAAkB;IACZ,IAAI,GAAG,aAAa,CAAA;IACpB,QAAQ,GAAG,CAAC,CAAA;IAE7B,OAAO,CACL,UAAkB,EAClB,KAAkC,EAClC,OAAsB;QAEtB,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YACpB,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;QAC/B,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,KAAK,CAAC,CAAA;QAEtD,IAAI,IAAI,EAAE,CAAC;YACT,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,UAAU,EAAE,MAAM;aACnB,CAAA;QACH,CAAC;QAED,OAAO;YACL,UAAU,EAAE,MAAM;SACnB,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;CACF"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Prefix match ID resolver
3
+ * Matches based on ID prefix (UUID format assumption)
4
+ */
5
+ import type { PresenceUser } from '../../interfaces/IPresenceManager.js';
6
+ import type { NAFComponent } from '../../types/index.js';
7
+ import type { IdResolutionResult, IUserIdResolver } from './IUserIdResolver.js';
8
+ export declare class PrefixMatchResolver implements IUserIdResolver {
9
+ private readonly name;
10
+ private readonly priority;
11
+ private readonly minLength;
12
+ constructor(minLength?: number);
13
+ resolve(networkId: string, users: ReadonlyArray<PresenceUser>, _nafData?: NAFComponent): IdResolutionResult;
14
+ getName(): string;
15
+ getPriority(): number;
16
+ }
17
+ //# sourceMappingURL=PrefixMatchResolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrefixMatchResolver.d.ts","sourceRoot":"","sources":["../../../src/services/resolvers/PrefixMatchResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE/E,qBAAa,mBAAoB,YAAW,eAAe;IACzD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAI;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEtB,SAAS,SAAK;IAI1B,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,EAClC,QAAQ,CAAC,EAAE,YAAY,GACtB,kBAAkB;IAuBrB,OAAO,IAAI,MAAM;IAIjB,WAAW,IAAI,MAAM;CAGtB"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Prefix match ID resolver
3
+ * Matches based on ID prefix (UUID format assumption)
4
+ */
5
+ export class PrefixMatchResolver {
6
+ name = 'prefix-match';
7
+ priority = 4;
8
+ minLength;
9
+ constructor(minLength = 16) {
10
+ this.minLength = minLength;
11
+ }
12
+ resolve(networkId, users, _nafData) {
13
+ if (!networkId || networkId.length < this.minLength) {
14
+ return { confidence: 'none' };
15
+ }
16
+ const prefix = networkId.substring(0, this.minLength);
17
+ const user = users.find((u) => u.id && u.id.length >= this.minLength && u.id.substring(0, this.minLength) === prefix);
18
+ if (user) {
19
+ return {
20
+ userId: user.id,
21
+ strategy: this.name,
22
+ confidence: 'medium',
23
+ };
24
+ }
25
+ return {
26
+ confidence: 'none',
27
+ };
28
+ }
29
+ getName() {
30
+ return this.name;
31
+ }
32
+ getPriority() {
33
+ return this.priority;
34
+ }
35
+ }
36
+ //# sourceMappingURL=PrefixMatchResolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrefixMatchResolver.js","sourceRoot":"","sources":["../../../src/services/resolvers/PrefixMatchResolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,OAAO,mBAAmB;IACb,IAAI,GAAG,cAAc,CAAA;IACrB,QAAQ,GAAG,CAAC,CAAA;IACZ,SAAS,CAAQ;IAElC,YAAY,SAAS,GAAG,EAAE;QACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC5B,CAAC;IAED,OAAO,CACL,SAAiB,EACjB,KAAkC,EAClC,QAAuB;QAEvB,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACpD,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;QAC/B,CAAC;QAED,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CACrB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,MAAM,CAC7F,CAAA;QAED,IAAI,IAAI,EAAE,CAAC;YACT,OAAO;gBACL,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,QAAQ,EAAE,IAAI,CAAC,IAAI;gBACnB,UAAU,EAAE,QAAQ;aACrB,CAAA;QACH,CAAC;QAED,OAAO;YACL,UAAU,EAAE,MAAM;SACnB,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * User ID resolver exports
3
+ */
4
+ export { CompositeUserIdResolver } from './CompositeUserIdResolver.js';
5
+ export { CreatorMatchResolver } from './CreatorMatchResolver.js';
6
+ export { ExactMatchResolver } from './ExactMatchResolver.js';
7
+ export type { ICompositeUserIdResolver, IdResolutionResult, IUserIdResolver, } from './IUserIdResolver.js';
8
+ export { OwnerMatchResolver } from './OwnerMatchResolver.js';
9
+ export { PrefixMatchResolver } from './PrefixMatchResolver.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/resolvers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,YAAY,EACV,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,GAChB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * User ID resolver exports
3
+ */
4
+ export { CompositeUserIdResolver } from './CompositeUserIdResolver.js';
5
+ export { CreatorMatchResolver } from './CreatorMatchResolver.js';
6
+ export { ExactMatchResolver } from './ExactMatchResolver.js';
7
+ export { OwnerMatchResolver } from './OwnerMatchResolver.js';
8
+ export { PrefixMatchResolver } from './PrefixMatchResolver.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/resolvers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAA;AACtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAM5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA"}