@hashgraphonline/standards-sdk 0.0.84 → 0.0.85

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 (212) hide show
  1. package/dist/es/hcs-10/connections-manager.d.ts +26 -8
  2. package/dist/es/hcs-10/connections-manager.d.ts.map +1 -1
  3. package/dist/es/standards-sdk.es10.js +271 -85
  4. package/dist/es/standards-sdk.es10.js.map +1 -1
  5. package/dist/es/standards-sdk.es100.js +147 -3
  6. package/dist/es/standards-sdk.es100.js.map +1 -1
  7. package/dist/es/standards-sdk.es101.js +90 -3
  8. package/dist/es/standards-sdk.es101.js.map +1 -1
  9. package/dist/es/standards-sdk.es102.js +84 -13
  10. package/dist/es/standards-sdk.es102.js.map +1 -1
  11. package/dist/es/standards-sdk.es103.js +32 -13
  12. package/dist/es/standards-sdk.es103.js.map +1 -1
  13. package/dist/es/standards-sdk.es104.js +5 -15
  14. package/dist/es/standards-sdk.es104.js.map +1 -1
  15. package/dist/es/standards-sdk.es105.js +158 -4
  16. package/dist/es/standards-sdk.es105.js.map +1 -1
  17. package/dist/es/standards-sdk.es106.js +21 -37
  18. package/dist/es/standards-sdk.es106.js.map +1 -1
  19. package/dist/es/standards-sdk.es107.js +787 -34
  20. package/dist/es/standards-sdk.es107.js.map +1 -1
  21. package/dist/es/standards-sdk.es108.js +172 -35
  22. package/dist/es/standards-sdk.es108.js.map +1 -1
  23. package/dist/es/standards-sdk.es109.js +133 -68
  24. package/dist/es/standards-sdk.es109.js.map +1 -1
  25. package/dist/es/standards-sdk.es110.js +20 -3
  26. package/dist/es/standards-sdk.es110.js.map +1 -1
  27. package/dist/es/standards-sdk.es111.js +26 -33
  28. package/dist/es/standards-sdk.es111.js.map +1 -1
  29. package/dist/es/standards-sdk.es112.js +25 -32
  30. package/dist/es/standards-sdk.es112.js.map +1 -1
  31. package/dist/es/standards-sdk.es113.js +38 -9
  32. package/dist/es/standards-sdk.es113.js.map +1 -1
  33. package/dist/es/standards-sdk.es114.js +4 -34
  34. package/dist/es/standards-sdk.es114.js.map +1 -1
  35. package/dist/es/standards-sdk.es115.js +419 -3
  36. package/dist/es/standards-sdk.es115.js.map +1 -1
  37. package/dist/es/standards-sdk.es116.js +2 -2
  38. package/dist/es/standards-sdk.es116.js.map +1 -1
  39. package/dist/es/standards-sdk.es117.js +120 -2
  40. package/dist/es/standards-sdk.es117.js.map +1 -1
  41. package/dist/es/standards-sdk.es13.js +3 -3
  42. package/dist/es/standards-sdk.es15.js +1 -1
  43. package/dist/es/standards-sdk.es18.js +2 -2
  44. package/dist/es/standards-sdk.es19.js +3 -3
  45. package/dist/es/standards-sdk.es2.js +0 -11
  46. package/dist/es/standards-sdk.es2.js.map +1 -1
  47. package/dist/es/standards-sdk.es22.js +1692 -966
  48. package/dist/es/standards-sdk.es22.js.map +1 -1
  49. package/dist/es/standards-sdk.es23.js +36 -1767
  50. package/dist/es/standards-sdk.es23.js.map +1 -1
  51. package/dist/es/standards-sdk.es24.js +48 -36
  52. package/dist/es/standards-sdk.es24.js.map +1 -1
  53. package/dist/es/standards-sdk.es25.js +7163 -21
  54. package/dist/es/standards-sdk.es25.js.map +1 -1
  55. package/dist/es/standards-sdk.es26.js +3 -7190
  56. package/dist/es/standards-sdk.es26.js.map +1 -1
  57. package/dist/es/standards-sdk.es27.js +2 -3
  58. package/dist/es/standards-sdk.es27.js.map +1 -1
  59. package/dist/es/standards-sdk.es28.js +1041 -2
  60. package/dist/es/standards-sdk.es28.js.map +1 -1
  61. package/dist/es/standards-sdk.es29.js +4167 -5
  62. package/dist/es/standards-sdk.es29.js.map +1 -1
  63. package/dist/es/standards-sdk.es30.js +5 -4167
  64. package/dist/es/standards-sdk.es30.js.map +1 -1
  65. package/dist/es/standards-sdk.es31.js +364 -2
  66. package/dist/es/standards-sdk.es31.js.map +1 -1
  67. package/dist/es/standards-sdk.es32.js +4 -362
  68. package/dist/es/standards-sdk.es32.js.map +1 -1
  69. package/dist/es/standards-sdk.es33.js +178 -5
  70. package/dist/es/standards-sdk.es33.js.map +1 -1
  71. package/dist/es/standards-sdk.es34.js +73 -171
  72. package/dist/es/standards-sdk.es34.js.map +1 -1
  73. package/dist/es/standards-sdk.es35.js +107 -74
  74. package/dist/es/standards-sdk.es35.js.map +1 -1
  75. package/dist/es/standards-sdk.es36.js +45 -107
  76. package/dist/es/standards-sdk.es36.js.map +1 -1
  77. package/dist/es/standards-sdk.es37.js +9 -51
  78. package/dist/es/standards-sdk.es37.js.map +1 -1
  79. package/dist/es/standards-sdk.es38.js +96 -9
  80. package/dist/es/standards-sdk.es38.js.map +1 -1
  81. package/dist/es/standards-sdk.es39.js +3 -96
  82. package/dist/es/standards-sdk.es39.js.map +1 -1
  83. package/dist/es/standards-sdk.es4.js +1 -1
  84. package/dist/es/standards-sdk.es40.js +2 -4
  85. package/dist/es/standards-sdk.es40.js.map +1 -1
  86. package/dist/es/standards-sdk.es41.js +113 -2
  87. package/dist/es/standards-sdk.es41.js.map +1 -1
  88. package/dist/es/standards-sdk.es42.js +70 -109
  89. package/dist/es/standards-sdk.es42.js.map +1 -1
  90. package/dist/es/standards-sdk.es43.js +5 -73
  91. package/dist/es/standards-sdk.es43.js.map +1 -1
  92. package/dist/es/standards-sdk.es44.js +4 -5
  93. package/dist/es/standards-sdk.es44.js.map +1 -1
  94. package/dist/es/standards-sdk.es45.js +220 -4
  95. package/dist/es/standards-sdk.es45.js.map +1 -1
  96. package/dist/es/standards-sdk.es46.js +51 -214
  97. package/dist/es/standards-sdk.es46.js.map +1 -1
  98. package/dist/es/standards-sdk.es47.js +67 -56
  99. package/dist/es/standards-sdk.es47.js.map +1 -1
  100. package/dist/es/standards-sdk.es48.js +3 -69
  101. package/dist/es/standards-sdk.es48.js.map +1 -1
  102. package/dist/es/standards-sdk.es49.js +146 -177
  103. package/dist/es/standards-sdk.es49.js.map +1 -1
  104. package/dist/es/standards-sdk.es5.js +3 -3
  105. package/dist/es/standards-sdk.es50.js +26 -432
  106. package/dist/es/standards-sdk.es50.js.map +1 -1
  107. package/dist/es/standards-sdk.es51.js +57 -19
  108. package/dist/es/standards-sdk.es51.js.map +1 -1
  109. package/dist/es/standards-sdk.es52.js +44 -133
  110. package/dist/es/standards-sdk.es52.js.map +1 -1
  111. package/dist/es/standards-sdk.es53.js +9 -17
  112. package/dist/es/standards-sdk.es53.js.map +1 -1
  113. package/dist/es/standards-sdk.es54.js +61 -25
  114. package/dist/es/standards-sdk.es54.js.map +1 -1
  115. package/dist/es/standards-sdk.es55.js +6 -29
  116. package/dist/es/standards-sdk.es55.js.map +1 -1
  117. package/dist/es/standards-sdk.es56.js +13 -19
  118. package/dist/es/standards-sdk.es56.js.map +1 -1
  119. package/dist/es/standards-sdk.es57.js +7 -44
  120. package/dist/es/standards-sdk.es57.js.map +1 -1
  121. package/dist/es/standards-sdk.es58.js +45 -18
  122. package/dist/es/standards-sdk.es58.js.map +1 -1
  123. package/dist/es/standards-sdk.es59.js +2 -61
  124. package/dist/es/standards-sdk.es59.js.map +1 -1
  125. package/dist/es/standards-sdk.es60.js +121 -1274
  126. package/dist/es/standards-sdk.es60.js.map +1 -1
  127. package/dist/es/standards-sdk.es61.js +157 -133
  128. package/dist/es/standards-sdk.es61.js.map +1 -1
  129. package/dist/es/standards-sdk.es62.js +98 -88
  130. package/dist/es/standards-sdk.es62.js.map +1 -1
  131. package/dist/es/standards-sdk.es63.js +2 -84
  132. package/dist/es/standards-sdk.es63.js.map +1 -1
  133. package/dist/es/standards-sdk.es64.js +15 -31
  134. package/dist/es/standards-sdk.es64.js.map +1 -1
  135. package/dist/es/standards-sdk.es65.js +408 -5
  136. package/dist/es/standards-sdk.es65.js.map +1 -1
  137. package/dist/es/standards-sdk.es66.js +13 -159
  138. package/dist/es/standards-sdk.es66.js.map +1 -1
  139. package/dist/es/standards-sdk.es67.js +13 -23
  140. package/dist/es/standards-sdk.es67.js.map +1 -1
  141. package/dist/es/standards-sdk.es68.js +29 -790
  142. package/dist/es/standards-sdk.es68.js.map +1 -1
  143. package/dist/es/standards-sdk.es69.js +14 -100
  144. package/dist/es/standards-sdk.es69.js.map +1 -1
  145. package/dist/es/standards-sdk.es7.js +3 -3
  146. package/dist/es/standards-sdk.es70.js +4 -2
  147. package/dist/es/standards-sdk.es70.js.map +1 -1
  148. package/dist/es/standards-sdk.es71.js +3 -15
  149. package/dist/es/standards-sdk.es71.js.map +1 -1
  150. package/dist/es/standards-sdk.es72.js +14 -407
  151. package/dist/es/standards-sdk.es72.js.map +1 -1
  152. package/dist/es/standards-sdk.es73.js +4 -173
  153. package/dist/es/standards-sdk.es73.js.map +1 -1
  154. package/dist/es/standards-sdk.es74.js +39 -143
  155. package/dist/es/standards-sdk.es74.js.map +1 -1
  156. package/dist/es/standards-sdk.es75.js +39 -2281
  157. package/dist/es/standards-sdk.es75.js.map +1 -1
  158. package/dist/es/standards-sdk.es76.js +34 -161
  159. package/dist/es/standards-sdk.es76.js.map +1 -1
  160. package/dist/es/standards-sdk.es77.js +67 -408
  161. package/dist/es/standards-sdk.es77.js.map +1 -1
  162. package/dist/es/standards-sdk.es78.js +2282 -2
  163. package/dist/es/standards-sdk.es78.js.map +1 -1
  164. package/dist/es/standards-sdk.es79.js +2 -120
  165. package/dist/es/standards-sdk.es79.js.map +1 -1
  166. package/dist/es/standards-sdk.es8.js +3 -3
  167. package/dist/es/standards-sdk.es80.js +7131 -16
  168. package/dist/es/standards-sdk.es80.js.map +1 -1
  169. package/dist/es/standards-sdk.es81.js +3 -3
  170. package/dist/es/standards-sdk.es81.js.map +1 -1
  171. package/dist/es/standards-sdk.es82.js +2 -32
  172. package/dist/es/standards-sdk.es82.js.map +1 -1
  173. package/dist/es/standards-sdk.es83.js +2 -63
  174. package/dist/es/standards-sdk.es83.js.map +1 -1
  175. package/dist/es/standards-sdk.es84.js +32 -48
  176. package/dist/es/standards-sdk.es84.js.map +1 -1
  177. package/dist/es/standards-sdk.es85.js +32 -9
  178. package/dist/es/standards-sdk.es85.js.map +1 -1
  179. package/dist/es/standards-sdk.es86.js +9 -65
  180. package/dist/es/standards-sdk.es86.js.map +1 -1
  181. package/dist/es/standards-sdk.es87.js +34 -6
  182. package/dist/es/standards-sdk.es87.js.map +1 -1
  183. package/dist/es/standards-sdk.es88.js +192 -12
  184. package/dist/es/standards-sdk.es88.js.map +1 -1
  185. package/dist/es/standards-sdk.es89.js +437 -6
  186. package/dist/es/standards-sdk.es89.js.map +1 -1
  187. package/dist/es/standards-sdk.es9.js +1 -1
  188. package/dist/es/standards-sdk.es90.js +24 -44
  189. package/dist/es/standards-sdk.es90.js.map +1 -1
  190. package/dist/es/standards-sdk.es91.js +139 -2
  191. package/dist/es/standards-sdk.es91.js.map +1 -1
  192. package/dist/es/standards-sdk.es92.js +18 -136
  193. package/dist/es/standards-sdk.es92.js.map +1 -1
  194. package/dist/es/standards-sdk.es93.js +23 -166
  195. package/dist/es/standards-sdk.es93.js.map +1 -1
  196. package/dist/es/standards-sdk.es94.js +27 -7134
  197. package/dist/es/standards-sdk.es94.js.map +1 -1
  198. package/dist/es/standards-sdk.es95.js +19 -25
  199. package/dist/es/standards-sdk.es95.js.map +1 -1
  200. package/dist/es/standards-sdk.es96.js +42 -24
  201. package/dist/es/standards-sdk.es96.js.map +1 -1
  202. package/dist/es/standards-sdk.es97.js +16 -36
  203. package/dist/es/standards-sdk.es97.js.map +1 -1
  204. package/dist/es/standards-sdk.es98.js +60 -31
  205. package/dist/es/standards-sdk.es98.js.map +1 -1
  206. package/dist/es/standards-sdk.es99.js +1288 -14
  207. package/dist/es/standards-sdk.es99.js.map +1 -1
  208. package/dist/umd/hcs-10/connections-manager.d.ts +26 -8
  209. package/dist/umd/hcs-10/connections-manager.d.ts.map +1 -1
  210. package/dist/umd/standards-sdk.umd.js +9 -9
  211. package/dist/umd/standards-sdk.umd.js.map +1 -1
  212. package/package.json +2 -1
@@ -37,6 +37,8 @@ export interface Connection {
37
37
  closedReason?: string;
38
38
  closeMethod?: string;
39
39
  uniqueRequestKey?: string;
40
+ originTopicId?: string;
41
+ processed: boolean;
40
42
  }
41
43
  /**
42
44
  * Options for the connections manager
@@ -72,6 +74,12 @@ export declare class ConnectionsManager {
72
74
  * that might not be visible in our local messages
73
75
  */
74
76
  private checkTargetInboundTopicsForConfirmations;
77
+ /**
78
+ * Checks target agents' inbound topics for confirmations of our outbound connection requests
79
+ * This complements checkTargetInboundTopicsForConfirmations by looking for confirmations
80
+ * that might have been sent to the target agent's inbound topic rather than our own
81
+ */
82
+ private checkOutboundRequestsForConfirmations;
75
83
  /**
76
84
  * Fetches profiles for all connected accounts
77
85
  * @param accountId - The account ID making the request
@@ -105,10 +113,9 @@ export declare class ConnectionsManager {
105
113
  /**
106
114
  * Process inbound messages to track connection requests and confirmations
107
115
  * @param messages - The messages to process
108
- * @param accountId - The account ID that received the messages
109
116
  * @returns Array of connections after processing
110
117
  */
111
- processInboundMessages(messages: HCSMessage[], accountId: string): Connection[];
118
+ processInboundMessages(messages: HCSMessage[]): Connection[];
112
119
  /**
113
120
  * Process connection topic messages to update last activity time
114
121
  * @param connectionTopicId - The topic ID of the connection
@@ -154,12 +161,6 @@ export declare class ConnectionsManager {
154
161
  * @returns The connection with the given topic ID, or undefined if not found
155
162
  */
156
163
  getConnectionByTopicId(connectionTopicId: string): Connection | undefined;
157
- /**
158
- * Gets a connection by request ID
159
- * @param requestId - The request ID to look up
160
- * @returns The connection with the given request ID, or undefined if not found
161
- */
162
- getConnection(requestId: number, inboundTopicId: string): Connection | undefined;
163
164
  /**
164
165
  * Gets a connection by account ID
165
166
  * @param accountId - The account ID to look up
@@ -181,5 +182,22 @@ export declare class ConnectionsManager {
181
182
  * Clears all tracked connections and requests
182
183
  */
183
184
  clearAll(): void;
185
+ /**
186
+ * Checks if a given connection request has been processed already
187
+ * This uses a combination of topic ID and request ID to uniquely identify requests
188
+ *
189
+ * @param inboundTopicId - The inbound topic ID where the request was received
190
+ * @param requestId - The sequence number (request ID)
191
+ * @returns True if this specific request has been processed, false otherwise
192
+ */
193
+ isConnectionRequestProcessed(inboundTopicId: string, requestId: number): boolean;
194
+ /**
195
+ * Marks a specific connection request as processed
196
+ *
197
+ * @param inboundTopicId - The inbound topic ID where the request was received
198
+ * @param requestId - The sequence number (request ID)
199
+ * @returns True if a matching connection was found and marked, false otherwise
200
+ */
201
+ markConnectionRequestProcessed(inboundTopicId: string, requestId: number): boolean;
184
202
  }
185
203
  //# sourceMappingURL=connections-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connections-manager.d.ts","sourceRoot":"","sources":["../../../src/hcs-10/connections-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connections-manager.d.ts","sourceRoot":"","sources":["../../../src/hcs-10/connections-manager.ts"],"names":[],"mappings":"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"}
@@ -32,6 +32,15 @@ class ConnectionsManager {
32
32
  const topicInfo = await this.baseClient.retrieveCommunicationTopics(
33
33
  accountId
34
34
  );
35
+ const isValidTopicId = (topicId) => {
36
+ return Boolean(topicId) && !topicId.includes(":");
37
+ };
38
+ if (!isValidTopicId(topicInfo.inboundTopic) || !isValidTopicId(topicInfo.outboundTopic)) {
39
+ this.logger.warn(
40
+ "Invalid topic IDs detected in retrieved communication topics"
41
+ );
42
+ return this.getAllConnections();
43
+ }
35
44
  const [outboundMessagesResult, inboundMessagesResult] = await Promise.all(
36
45
  [
37
46
  this.baseClient.getMessages(topicInfo.outboundTopic),
@@ -42,11 +51,15 @@ class ConnectionsManager {
42
51
  outboundMessagesResult.messages || [],
43
52
  accountId
44
53
  );
45
- this.processInboundMessages(
46
- inboundMessagesResult.messages || [],
47
- accountId
54
+ this.processInboundMessages(inboundMessagesResult.messages || []);
55
+ const pendingCount = Array.from(this.connections.values()).filter(
56
+ (conn) => conn.status === "pending" || conn.isPending
57
+ ).length;
58
+ this.logger.debug(
59
+ `Processed ${outboundMessagesResult.messages?.length || 0} outbound and ${inboundMessagesResult.messages?.length || 0} inbound messages. Found ${pendingCount} pending connections.`
48
60
  );
49
61
  await this.checkTargetInboundTopicsForConfirmations();
62
+ await this.checkOutboundRequestsForConfirmations();
50
63
  await this.fetchProfilesForConnections(accountId);
51
64
  await this.fetchConnectionActivity();
52
65
  return this.getAllConnections();
@@ -61,7 +74,7 @@ class ConnectionsManager {
61
74
  */
62
75
  async checkTargetInboundTopicsForConfirmations() {
63
76
  const pendingConnections = Array.from(this.connections.values()).filter(
64
- (conn) => conn.isPending && conn.targetInboundTopicId
77
+ (conn) => (conn.isPending || conn.status === "pending") && conn.targetInboundTopicId
65
78
  );
66
79
  if (pendingConnections.length === 0) {
67
80
  return;
@@ -92,16 +105,31 @@ class ConnectionsManager {
92
105
  if (!requestId) {
93
106
  continue;
94
107
  }
95
- const confirmationMsg = targetMessages.find(
96
- (msg) => msg.op === "connection_created" && msg.connection_id === requestId && msg.connection_topic_id
97
- );
108
+ const confirmationMsg = targetMessages.find((msg) => {
109
+ if (msg.op !== "connection_created" || !msg.connection_topic_id) {
110
+ return false;
111
+ }
112
+ if (msg.connection_id !== requestId) {
113
+ return false;
114
+ }
115
+ if (conn.uniqueRequestKey) {
116
+ const keyParts = conn.uniqueRequestKey.split(":");
117
+ if (keyParts.length > 1) {
118
+ const operatorIdPart = keyParts[1];
119
+ if (msg.operator_id && msg.operator_id === operatorIdPart) {
120
+ return true;
121
+ }
122
+ if (msg.connected_account_id === conn.targetAccountId) {
123
+ return true;
124
+ }
125
+ }
126
+ }
127
+ return true;
128
+ });
98
129
  if (confirmationMsg?.connection_topic_id) {
99
130
  confirmedAny = true;
100
131
  const connectionTopicId = confirmationMsg.connection_topic_id;
101
- let pendingKey = conn.connectionTopicId;
102
- if (!pendingKey.startsWith("req-") && conn.uniqueRequestKey) {
103
- pendingKey = conn.uniqueRequestKey;
104
- }
132
+ let pendingKey = conn.uniqueRequestKey;
105
133
  const newConnection = {
106
134
  connectionTopicId,
107
135
  targetAccountId: conn.targetAccountId,
@@ -113,10 +141,12 @@ class ConnectionsManager {
113
141
  created: new Date(confirmationMsg.created || conn.created),
114
142
  profileInfo: conn.profileInfo,
115
143
  connectionRequestId: requestId,
116
- uniqueRequestKey: conn.uniqueRequestKey
144
+ uniqueRequestKey: conn.uniqueRequestKey,
145
+ originTopicId: conn.originTopicId,
146
+ processed: conn.processed
117
147
  };
118
148
  this.connections.set(connectionTopicId, newConnection);
119
- if (pendingKey && pendingKey !== connectionTopicId) {
149
+ if (pendingKey) {
120
150
  this.connections.delete(pendingKey);
121
151
  }
122
152
  this.logger.debug(
@@ -141,6 +171,115 @@ class ConnectionsManager {
141
171
  }
142
172
  }
143
173
  }
174
+ /**
175
+ * Checks target agents' inbound topics for confirmations of our outbound connection requests
176
+ * This complements checkTargetInboundTopicsForConfirmations by looking for confirmations
177
+ * that might have been sent to the target agent's inbound topic rather than our own
178
+ */
179
+ async checkOutboundRequestsForConfirmations() {
180
+ const allConnections = Array.from(this.connections.values());
181
+ this.logger.info(`Total connections in map: ${allConnections.length}`);
182
+ const pendingByStatus = allConnections.filter(
183
+ (conn) => conn.status === "pending"
184
+ );
185
+ this.logger.info(
186
+ `Connections with status='pending': ${pendingByStatus.length}`
187
+ );
188
+ const pendingConnections = allConnections.filter(
189
+ (conn) => conn.status === "pending"
190
+ );
191
+ if (!Boolean(pendingConnections?.length)) {
192
+ this.logger.info("No pending connections found");
193
+ return;
194
+ }
195
+ for (const conn of pendingConnections) {
196
+ this.logger.debug(
197
+ `Processing pending connection: ${conn.connectionTopicId}`
198
+ );
199
+ if (!conn.targetAccountId) {
200
+ this.logger.debug(
201
+ `Skipping connection ${conn.connectionTopicId} - no targetAccountId`
202
+ );
203
+ continue;
204
+ }
205
+ let targetInboundTopicId = conn.targetInboundTopicId;
206
+ if (!targetInboundTopicId) {
207
+ try {
208
+ const profileResponse = await this.baseClient.retrieveProfile(
209
+ conn.targetAccountId
210
+ );
211
+ if (profileResponse?.profile?.inboundTopicId) {
212
+ targetInboundTopicId = profileResponse.profile.inboundTopicId;
213
+ this.connections.set(conn.connectionTopicId, {
214
+ ...conn,
215
+ targetInboundTopicId
216
+ });
217
+ this.logger.debug(
218
+ `Updated connection ${conn.connectionTopicId} with inbound topic ID: ${targetInboundTopicId}`
219
+ );
220
+ } else {
221
+ this.logger.debug(
222
+ `Couldn't get inbound topic ID for account ${conn.targetAccountId}`
223
+ );
224
+ continue;
225
+ }
226
+ } catch (error) {
227
+ this.logger.debug(
228
+ `Error fetching profile for ${conn.targetAccountId}: ${error}`
229
+ );
230
+ continue;
231
+ }
232
+ }
233
+ if (!targetInboundTopicId || targetInboundTopicId.includes(":")) {
234
+ this.logger.debug(
235
+ `Skipping invalid inbound topic format: ${targetInboundTopicId}`
236
+ );
237
+ continue;
238
+ }
239
+ const requestId = conn.connectionRequestId || conn.inboundRequestId;
240
+ if (!requestId) {
241
+ this.logger.debug(
242
+ `Skipping connection ${conn.connectionTopicId} - no request ID`
243
+ );
244
+ continue;
245
+ }
246
+ try {
247
+ this.logger.debug(
248
+ `Checking for confirmations on topic ${targetInboundTopicId} for request ID ${requestId}`
249
+ );
250
+ const targetMessagesResult = await this.baseClient.getMessages(
251
+ targetInboundTopicId
252
+ );
253
+ const targetMessages = targetMessagesResult.messages || [];
254
+ const confirmationMsg = targetMessages.find(
255
+ (msg) => msg.op === "connection_created" && msg.connection_id === requestId && msg.connection_topic_id
256
+ );
257
+ if (confirmationMsg?.connection_topic_id) {
258
+ const connectionTopicId = confirmationMsg.connection_topic_id;
259
+ this.logger.info(
260
+ `Found confirmation for request #${requestId} to ${conn.targetAccountId} on their inbound topic`
261
+ );
262
+ this.connections.set(conn.connectionTopicId, {
263
+ ...conn,
264
+ connectionTopicId,
265
+ status: "established",
266
+ isPending: false,
267
+ needsConfirmation: false,
268
+ created: new Date(confirmationMsg.created || conn.created),
269
+ lastActivity: new Date(confirmationMsg.created || conn.created)
270
+ });
271
+ } else {
272
+ this.logger.debug(
273
+ `No confirmation found for request ID ${requestId} on topic ${targetInboundTopicId}`
274
+ );
275
+ }
276
+ } catch (error) {
277
+ this.logger.warn(
278
+ `Error checking for confirmations on target inbound topic for ${conn.targetAccountId}: ${error}`
279
+ );
280
+ }
281
+ }
282
+ }
144
283
  /**
145
284
  * Fetches profiles for all connected accounts
146
285
  * @param accountId - The account ID making the request
@@ -198,16 +337,22 @@ class ConnectionsManager {
198
337
  */
199
338
  async fetchConnectionActivity() {
200
339
  const activeConnections = this.getActiveConnections();
201
- const activityPromises = activeConnections.map(async (connection) => {
202
- try {
203
- const messagesResult = await this.baseClient.getMessages(
204
- connection.connectionTopicId
340
+ const validConnections = activeConnections.filter((connection) => {
341
+ const topicId = connection.connectionTopicId;
342
+ if (!topicId || topicId.includes(":") || !topicId.match(/^0\.0\.\d+$/)) {
343
+ this.logger.debug(
344
+ `Skipping activity fetch for invalid topic ID format: ${topicId}`
205
345
  );
346
+ return false;
347
+ }
348
+ return true;
349
+ });
350
+ const activityPromises = validConnections.map(async (connection) => {
351
+ try {
352
+ const topicId = connection.connectionTopicId;
353
+ const messagesResult = await this.baseClient.getMessages(topicId);
206
354
  if (messagesResult?.messages?.length > 0) {
207
- this.processConnectionMessages(
208
- connection.connectionTopicId,
209
- messagesResult.messages
210
- );
355
+ this.processConnectionMessages(topicId, messagesResult.messages);
211
356
  }
212
357
  } catch (error) {
213
358
  this.logger.debug(
@@ -239,7 +384,7 @@ class ConnectionsManager {
239
384
  * @returns Array of connections after processing
240
385
  */
241
386
  processOutboundMessages(messages, accountId) {
242
- if (!messages || messages.length === 0) {
387
+ if (!Boolean(messages?.length)) {
243
388
  return Array.from(this.connections.values());
244
389
  }
245
390
  const requestMessages = messages.filter(
@@ -257,11 +402,11 @@ class ConnectionsManager {
257
402
  continue;
258
403
  }
259
404
  const isAlreadyConfirmed = Array.from(this.connections.values()).some(
260
- (conn) => conn.connectionRequestId === requestId && !conn.isPending
405
+ (conn) => conn.connectionRequestId === requestId && !conn.isPending && conn.targetAccountId === targetAccountId
261
406
  );
262
407
  const pendingKey = `req-${requestId}:${operatorId}`;
263
408
  if (!isAlreadyConfirmed && !this.pendingRequests.has(pendingKey)) {
264
- this.pendingRequests.set(pendingKey, {
409
+ const pendingRequest = {
265
410
  id: requestId,
266
411
  requesterId: accountId,
267
412
  requesterTopicId: msg.outbound_topic_id || "",
@@ -272,9 +417,10 @@ class ConnectionsManager {
272
417
  created: msg.created || /* @__PURE__ */ new Date(),
273
418
  memo: msg.m,
274
419
  status: "pending"
275
- });
420
+ };
421
+ this.pendingRequests.set(pendingKey, pendingRequest);
276
422
  if (!this.connections.has(pendingKey)) {
277
- this.connections.set(pendingKey, {
423
+ const pendingConnection = {
278
424
  connectionTopicId: pendingKey,
279
425
  targetAccountId,
280
426
  targetInboundTopicId,
@@ -283,8 +429,11 @@ class ConnectionsManager {
283
429
  needsConfirmation: false,
284
430
  created: msg.created || /* @__PURE__ */ new Date(),
285
431
  connectionRequestId: requestId,
286
- uniqueRequestKey: pendingKey
287
- });
432
+ uniqueRequestKey: pendingKey,
433
+ originTopicId: msg.outbound_topic_id || "",
434
+ processed: false
435
+ };
436
+ this.connections.set(pendingKey, pendingConnection);
288
437
  }
289
438
  }
290
439
  }
@@ -311,14 +460,6 @@ class ConnectionsManager {
311
460
  if (this.connections.has(pendingKey)) {
312
461
  this.connections.delete(pendingKey);
313
462
  }
314
- const existingConnections = Array.from(this.connections.entries()).filter(
315
- ([_, conn]) => conn.connectionRequestId === requestId
316
- );
317
- for (const [key, _] of existingConnections) {
318
- if (key !== connectionTopicId) {
319
- this.connections.delete(key);
320
- }
321
- }
322
463
  if (!this.connections.has(connectionTopicId)) {
323
464
  this.connections.set(connectionTopicId, {
324
465
  connectionTopicId,
@@ -330,7 +471,9 @@ class ConnectionsManager {
330
471
  connectionRequestId: requestId,
331
472
  confirmedRequestId: msg.confirmed_request_id,
332
473
  requesterOutboundTopicId: msg.outbound_topic_id,
333
- uniqueRequestKey: pendingKey
474
+ uniqueRequestKey: pendingKey,
475
+ originTopicId: msg.outbound_topic_id || "",
476
+ processed: false
334
477
  });
335
478
  } else {
336
479
  const conn = this.connections.get(connectionTopicId);
@@ -342,7 +485,9 @@ class ConnectionsManager {
342
485
  connectionRequestId: requestId,
343
486
  confirmedRequestId: msg.confirmed_request_id,
344
487
  requesterOutboundTopicId: msg.outbound_topic_id,
345
- uniqueRequestKey: pendingKey
488
+ uniqueRequestKey: pendingKey,
489
+ originTopicId: msg.outbound_topic_id || "",
490
+ processed: false
346
491
  });
347
492
  }
348
493
  }
@@ -365,7 +510,9 @@ class ConnectionsManager {
365
510
  lastActivity: msg.created || /* @__PURE__ */ new Date(),
366
511
  closedReason: msg.reason,
367
512
  closeMethod: msg.close_method,
368
- uniqueRequestKey: uniqueKey
513
+ uniqueRequestKey: uniqueKey,
514
+ originTopicId: conn.originTopicId,
515
+ processed: false
369
516
  });
370
517
  }
371
518
  }
@@ -376,11 +523,10 @@ class ConnectionsManager {
376
523
  /**
377
524
  * Process inbound messages to track connection requests and confirmations
378
525
  * @param messages - The messages to process
379
- * @param accountId - The account ID that received the messages
380
526
  * @returns Array of connections after processing
381
527
  */
382
- processInboundMessages(messages, accountId) {
383
- if (!messages || messages.length === 0) {
528
+ processInboundMessages(messages) {
529
+ if (!Boolean(messages?.length)) {
384
530
  return Array.from(this.connections.values());
385
531
  }
386
532
  const requestMessages = messages.filter(
@@ -397,24 +543,21 @@ class ConnectionsManager {
397
543
  );
398
544
  continue;
399
545
  }
400
- const isAlreadyConfirmed = messages.some(
401
- (confirmMsg) => confirmMsg.op === "connection_created" && confirmMsg.connection_id === sequenceNumber
402
- );
403
- if (!isAlreadyConfirmed) {
404
- const needsConfirmKey = `inb-${sequenceNumber}:${operatorId}`;
405
- if (!this.connections.has(needsConfirmKey)) {
406
- this.connections.set(needsConfirmKey, {
407
- connectionTopicId: needsConfirmKey,
408
- targetAccountId: requestorAccountId,
409
- targetInboundTopicId: requestorTopicId,
410
- status: "needs_confirmation",
411
- isPending: false,
412
- needsConfirmation: true,
413
- created: msg.created || /* @__PURE__ */ new Date(),
414
- inboundRequestId: sequenceNumber,
415
- uniqueRequestKey: needsConfirmKey
416
- });
417
- }
546
+ const needsConfirmKey = `inb-${sequenceNumber}:${operatorId}`;
547
+ if (!this.connections.has(needsConfirmKey)) {
548
+ this.connections.set(needsConfirmKey, {
549
+ connectionTopicId: needsConfirmKey,
550
+ targetAccountId: requestorAccountId,
551
+ targetInboundTopicId: requestorTopicId,
552
+ status: "needs_confirmation",
553
+ isPending: false,
554
+ needsConfirmation: true,
555
+ created: msg.created || /* @__PURE__ */ new Date(),
556
+ inboundRequestId: sequenceNumber,
557
+ uniqueRequestKey: needsConfirmKey,
558
+ originTopicId: requestorTopicId,
559
+ processed: false
560
+ });
418
561
  }
419
562
  }
420
563
  const confirmationMessages = messages.filter(
@@ -424,24 +567,17 @@ class ConnectionsManager {
424
567
  const sequenceNumber = msg.connection_id;
425
568
  const connectionTopicId = msg.connection_topic_id;
426
569
  const connectedAccountId = msg.connected_account_id || "";
570
+ const operatorId = msg.operator_id || "";
427
571
  if (this.shouldFilterAccount(connectedAccountId)) {
428
572
  this.logger.debug(
429
573
  `Filtering out confirmation for account: ${connectedAccountId}`
430
574
  );
431
575
  continue;
432
576
  }
433
- const needsConfirmKey = `inb-${sequenceNumber}:${msg.operator_id}`;
577
+ const needsConfirmKey = `inb-${sequenceNumber}:${operatorId}`;
434
578
  if (this.connections.has(needsConfirmKey)) {
435
579
  this.connections.delete(needsConfirmKey);
436
580
  }
437
- const existingConnections = Array.from(this.connections.entries()).filter(
438
- ([_, conn]) => conn.inboundRequestId === sequenceNumber
439
- );
440
- for (const [key, _] of existingConnections) {
441
- if (key !== connectionTopicId) {
442
- this.connections.delete(key);
443
- }
444
- }
445
581
  if (!this.connections.has(connectionTopicId)) {
446
582
  this.connections.set(connectionTopicId, {
447
583
  connectionTopicId,
@@ -451,7 +587,9 @@ class ConnectionsManager {
451
587
  needsConfirmation: false,
452
588
  created: msg.created || /* @__PURE__ */ new Date(),
453
589
  inboundRequestId: sequenceNumber,
454
- uniqueRequestKey: needsConfirmKey
590
+ uniqueRequestKey: needsConfirmKey,
591
+ originTopicId: msg.connection_topic_id,
592
+ processed: false
455
593
  });
456
594
  } else {
457
595
  const conn = this.connections.get(connectionTopicId);
@@ -461,7 +599,9 @@ class ConnectionsManager {
461
599
  isPending: false,
462
600
  needsConfirmation: false,
463
601
  inboundRequestId: sequenceNumber,
464
- uniqueRequestKey: needsConfirmKey
602
+ uniqueRequestKey: needsConfirmKey,
603
+ originTopicId: msg.connection_topic_id,
604
+ processed: false
465
605
  });
466
606
  }
467
607
  }
@@ -529,18 +669,22 @@ class ConnectionsManager {
529
669
  * @returns Array of all connections that should be visible
530
670
  */
531
671
  getAllConnections() {
532
- return Array.from(this.connections.values()).filter(
672
+ const connections = Array.from(this.connections.values()).filter(
533
673
  (conn) => conn.status === "established" || conn.status === "closed" || !this.filterPendingAccountIds.has(conn.targetAccountId) || this.hasEstablishedConnectionWithAccount(conn.targetAccountId)
534
674
  );
675
+ return connections;
535
676
  }
536
677
  /**
537
678
  * Gets all pending connection requests
538
679
  * @returns Array of pending connection requests
539
680
  */
540
681
  getPendingRequests() {
541
- return Array.from(this.connections.values()).filter((conn) => {
542
- return conn.isPending && (!this.filterPendingAccountIds.has(conn.targetAccountId) || this.hasEstablishedConnectionWithAccount(conn.targetAccountId));
543
- });
682
+ const pendingConnections = Array.from(this.connections.values()).filter(
683
+ (conn) => {
684
+ return conn.isPending && (!this.filterPendingAccountIds.has(conn.targetAccountId) || this.hasEstablishedConnectionWithAccount(conn.targetAccountId));
685
+ }
686
+ );
687
+ return pendingConnections;
544
688
  }
545
689
  /**
546
690
  * Helper method to check if there's an established connection with an account
@@ -578,16 +722,6 @@ class ConnectionsManager {
578
722
  getConnectionByTopicId(connectionTopicId) {
579
723
  return this.connections.get(connectionTopicId);
580
724
  }
581
- /**
582
- * Gets a connection by request ID
583
- * @param requestId - The request ID to look up
584
- * @returns The connection with the given request ID, or undefined if not found
585
- */
586
- getConnection(requestId, inboundTopicId) {
587
- return Array.from(this.connections.values()).find(
588
- (conn) => conn.connectionRequestId === requestId || conn.inboundRequestId === requestId
589
- );
590
- }
591
725
  /**
592
726
  * Gets a connection by account ID
593
727
  * @param accountId - The account ID to look up
@@ -622,6 +756,58 @@ class ConnectionsManager {
622
756
  this.connections.clear();
623
757
  this.pendingRequests.clear();
624
758
  }
759
+ /**
760
+ * Checks if a given connection request has been processed already
761
+ * This uses a combination of topic ID and request ID to uniquely identify requests
762
+ *
763
+ * @param inboundTopicId - The inbound topic ID where the request was received
764
+ * @param requestId - The sequence number (request ID)
765
+ * @returns True if this specific request has been processed, false otherwise
766
+ */
767
+ isConnectionRequestProcessed(inboundTopicId, requestId) {
768
+ for (const conn of this.connections.values()) {
769
+ if (conn.originTopicId === inboundTopicId && conn.inboundRequestId === requestId && conn.processed) {
770
+ return true;
771
+ }
772
+ if (conn.originTopicId === inboundTopicId && conn.connectionRequestId === requestId && conn.processed) {
773
+ return true;
774
+ }
775
+ }
776
+ return false;
777
+ }
778
+ /**
779
+ * Marks a specific connection request as processed
780
+ *
781
+ * @param inboundTopicId - The inbound topic ID where the request was received
782
+ * @param requestId - The sequence number (request ID)
783
+ * @returns True if a matching connection was found and marked, false otherwise
784
+ */
785
+ markConnectionRequestProcessed(inboundTopicId, requestId) {
786
+ let found = false;
787
+ for (const [key, conn] of this.connections.entries()) {
788
+ if (conn.originTopicId === inboundTopicId && conn.inboundRequestId === requestId) {
789
+ this.connections.set(key, {
790
+ ...conn,
791
+ processed: true
792
+ });
793
+ found = true;
794
+ this.logger.debug(
795
+ `Marked inbound connection request #${requestId} on topic ${inboundTopicId} as processed`
796
+ );
797
+ }
798
+ if (conn.originTopicId === inboundTopicId && conn.connectionRequestId === requestId) {
799
+ this.connections.set(key, {
800
+ ...conn,
801
+ processed: true
802
+ });
803
+ found = true;
804
+ this.logger.debug(
805
+ `Marked outbound connection request #${requestId} on topic ${inboundTopicId} as processed`
806
+ );
807
+ }
808
+ }
809
+ return found;
810
+ }
625
811
  }
626
812
  export {
627
813
  ConnectionsManager