@hashgraphonline/standards-sdk 0.0.157-canary.2 → 0.0.157-canary.4

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 (178) hide show
  1. package/dist/cjs/hcs-10/base-client.d.ts +1 -1
  2. package/dist/cjs/hcs-10/base-client.d.ts.map +1 -1
  3. package/dist/cjs/hcs-10/sdk.d.ts +1 -1
  4. package/dist/cjs/hcs-10/sdk.d.ts.map +1 -1
  5. package/dist/cjs/hcs-11/agent-builder.d.ts +2 -0
  6. package/dist/cjs/hcs-11/agent-builder.d.ts.map +1 -1
  7. package/dist/cjs/hcs-11/client.d.ts +2 -0
  8. package/dist/cjs/hcs-11/client.d.ts.map +1 -1
  9. package/dist/cjs/hcs-11/types.d.ts +4 -2
  10. package/dist/cjs/hcs-11/types.d.ts.map +1 -1
  11. package/dist/cjs/hcs-15/index.d.ts +3 -0
  12. package/dist/cjs/hcs-15/index.d.ts.map +1 -0
  13. package/dist/cjs/hcs-15/petal-manager.d.ts +27 -0
  14. package/dist/cjs/hcs-15/petal-manager.d.ts.map +1 -0
  15. package/dist/cjs/hcs-15/types.d.ts +41 -0
  16. package/dist/cjs/hcs-15/types.d.ts.map +1 -0
  17. package/dist/cjs/hcs-16/flora-account-manager.d.ts.map +1 -1
  18. package/dist/cjs/hcs-16/types.d.ts +3 -5
  19. package/dist/cjs/hcs-16/types.d.ts.map +1 -1
  20. package/dist/cjs/hcs-18/discovery.d.ts +1 -0
  21. package/dist/cjs/hcs-18/discovery.d.ts.map +1 -1
  22. package/dist/cjs/hcs-18/types.d.ts +1 -0
  23. package/dist/cjs/hcs-18/types.d.ts.map +1 -1
  24. package/dist/cjs/hcs-20/sdk.d.ts.map +1 -1
  25. package/dist/cjs/hcs-7/evm-bridge.d.ts.map +1 -1
  26. package/dist/cjs/hcs-7/redis-cache.d.ts.map +1 -1
  27. package/dist/cjs/hcs-7/wasm-bridge.d.ts.map +1 -1
  28. package/dist/cjs/{index-xZmk-HBD.cjs → index-CJsmyij2.cjs} +12 -12
  29. package/dist/cjs/index-CJsmyij2.cjs.map +1 -0
  30. package/dist/cjs/{index-CyAbgH2f-Cv8mxAhS.cjs → index-CyAbgH2f-Dn5WQtPx.cjs} +2 -2
  31. package/dist/cjs/{index-CyAbgH2f-Cv8mxAhS.cjs.map → index-CyAbgH2f-Dn5WQtPx.cjs.map} +1 -1
  32. package/dist/cjs/index.d.ts +1 -1
  33. package/dist/cjs/services/types.d.ts +1 -1
  34. package/dist/cjs/services/types.d.ts.map +1 -1
  35. package/dist/cjs/standards-sdk.cjs +1 -1
  36. package/dist/cjs/{standards-sdk.es45-BxAtDqsy-ELd4REyl.cjs → standards-sdk.es45-BxAtDqsy-CiMtsDbD.cjs} +2 -2
  37. package/dist/cjs/{standards-sdk.es45-BxAtDqsy-ELd4REyl.cjs.map → standards-sdk.es45-BxAtDqsy-CiMtsDbD.cjs.map} +1 -1
  38. package/dist/cjs/{standards-sdk.es46-BI8ACeLM-DRmcgoN0.cjs → standards-sdk.es46-BI8ACeLM-DFYgO-fP.cjs} +2 -2
  39. package/dist/cjs/{standards-sdk.es46-BI8ACeLM-DRmcgoN0.cjs.map → standards-sdk.es46-BI8ACeLM-DFYgO-fP.cjs.map} +1 -1
  40. package/dist/cjs/{standards-sdk.es47-DbkY3FlD-DfMpZygD.cjs → standards-sdk.es47-DbkY3FlD-2qTWs2BD.cjs} +2 -2
  41. package/dist/cjs/{standards-sdk.es47-DbkY3FlD-DfMpZygD.cjs.map → standards-sdk.es47-DbkY3FlD-2qTWs2BD.cjs.map} +1 -1
  42. package/dist/cjs/{standards-sdk.es48-DzT9Qc3F-CmCkJl3x.cjs → standards-sdk.es48-DzT9Qc3F-Byz0fQnW.cjs} +2 -2
  43. package/dist/cjs/{standards-sdk.es48-DzT9Qc3F-CmCkJl3x.cjs.map → standards-sdk.es48-DzT9Qc3F-Byz0fQnW.cjs.map} +1 -1
  44. package/dist/cjs/utils/logger.d.ts.map +1 -1
  45. package/dist/es/hcs-10/base-client.d.ts +1 -1
  46. package/dist/es/hcs-10/base-client.d.ts.map +1 -1
  47. package/dist/es/hcs-10/sdk.d.ts +1 -1
  48. package/dist/es/hcs-10/sdk.d.ts.map +1 -1
  49. package/dist/es/hcs-11/agent-builder.d.ts +2 -0
  50. package/dist/es/hcs-11/agent-builder.d.ts.map +1 -1
  51. package/dist/es/hcs-11/client.d.ts +2 -0
  52. package/dist/es/hcs-11/client.d.ts.map +1 -1
  53. package/dist/es/hcs-11/types.d.ts +4 -2
  54. package/dist/es/hcs-11/types.d.ts.map +1 -1
  55. package/dist/es/hcs-15/index.d.ts +3 -0
  56. package/dist/es/hcs-15/index.d.ts.map +1 -0
  57. package/dist/es/hcs-15/petal-manager.d.ts +27 -0
  58. package/dist/es/hcs-15/petal-manager.d.ts.map +1 -0
  59. package/dist/es/hcs-15/types.d.ts +41 -0
  60. package/dist/es/hcs-15/types.d.ts.map +1 -0
  61. package/dist/es/hcs-16/flora-account-manager.d.ts.map +1 -1
  62. package/dist/es/hcs-16/types.d.ts +3 -5
  63. package/dist/es/hcs-16/types.d.ts.map +1 -1
  64. package/dist/es/hcs-18/discovery.d.ts +1 -0
  65. package/dist/es/hcs-18/discovery.d.ts.map +1 -1
  66. package/dist/es/hcs-18/types.d.ts +1 -0
  67. package/dist/es/hcs-18/types.d.ts.map +1 -1
  68. package/dist/es/hcs-20/sdk.d.ts.map +1 -1
  69. package/dist/es/hcs-7/evm-bridge.d.ts.map +1 -1
  70. package/dist/es/hcs-7/redis-cache.d.ts.map +1 -1
  71. package/dist/es/hcs-7/wasm-bridge.d.ts.map +1 -1
  72. package/dist/es/index.d.ts +1 -1
  73. package/dist/es/services/types.d.ts +1 -1
  74. package/dist/es/services/types.d.ts.map +1 -1
  75. package/dist/es/standards-sdk.es.js +19 -22
  76. package/dist/es/standards-sdk.es.js.map +1 -1
  77. package/dist/es/standards-sdk.es10.js +1 -1
  78. package/dist/es/standards-sdk.es11.js +10 -2
  79. package/dist/es/standards-sdk.es11.js.map +1 -1
  80. package/dist/es/standards-sdk.es12.js +1 -1
  81. package/dist/es/standards-sdk.es13.js +1 -1
  82. package/dist/es/standards-sdk.es13.js.map +1 -1
  83. package/dist/es/standards-sdk.es14.js +1 -1
  84. package/dist/es/standards-sdk.es15.js +39 -9
  85. package/dist/es/standards-sdk.es15.js.map +1 -1
  86. package/dist/es/standards-sdk.es16.js +1 -0
  87. package/dist/es/standards-sdk.es16.js.map +1 -1
  88. package/dist/es/standards-sdk.es18.js +1 -1
  89. package/dist/es/standards-sdk.es19.js +1 -1
  90. package/dist/es/standards-sdk.es2.js +1 -1
  91. package/dist/es/standards-sdk.es20.js +2 -2
  92. package/dist/es/standards-sdk.es23.js +2 -2
  93. package/dist/es/standards-sdk.es25.js +4 -2
  94. package/dist/es/standards-sdk.es25.js.map +1 -1
  95. package/dist/es/standards-sdk.es26.js +2 -2
  96. package/dist/es/standards-sdk.es27.js +152 -6
  97. package/dist/es/standards-sdk.es27.js.map +1 -1
  98. package/dist/es/standards-sdk.es28.js +26 -189
  99. package/dist/es/standards-sdk.es28.js.map +1 -1
  100. package/dist/es/standards-sdk.es29.js +446 -26
  101. package/dist/es/standards-sdk.es29.js.map +1 -1
  102. package/dist/es/standards-sdk.es3.js +1 -1
  103. package/dist/es/standards-sdk.es3.js.map +1 -1
  104. package/dist/es/standards-sdk.es30.js +6 -342
  105. package/dist/es/standards-sdk.es30.js.map +1 -1
  106. package/dist/es/standards-sdk.es31.js +202 -6
  107. package/dist/es/standards-sdk.es31.js.map +1 -1
  108. package/dist/es/standards-sdk.es32.js +34 -202
  109. package/dist/es/standards-sdk.es32.js.map +1 -1
  110. package/dist/es/standards-sdk.es33.js +529 -34
  111. package/dist/es/standards-sdk.es33.js.map +1 -1
  112. package/dist/es/standards-sdk.es34.js +87 -501
  113. package/dist/es/standards-sdk.es34.js.map +1 -1
  114. package/dist/es/standards-sdk.es35.js +19 -98
  115. package/dist/es/standards-sdk.es35.js.map +1 -1
  116. package/dist/es/standards-sdk.es36.js +156 -18
  117. package/dist/es/standards-sdk.es36.js.map +1 -1
  118. package/dist/es/standards-sdk.es37.js +146 -150
  119. package/dist/es/standards-sdk.es37.js.map +1 -1
  120. package/dist/es/standards-sdk.es38.js +561 -134
  121. package/dist/es/standards-sdk.es38.js.map +1 -1
  122. package/dist/es/standards-sdk.es39.js +562 -543
  123. package/dist/es/standards-sdk.es39.js.map +1 -1
  124. package/dist/es/standards-sdk.es4.js +6 -4
  125. package/dist/es/standards-sdk.es4.js.map +1 -1
  126. package/dist/es/standards-sdk.es40.js +4 -601
  127. package/dist/es/standards-sdk.es40.js.map +1 -1
  128. package/dist/es/standards-sdk.es41.js +415 -4
  129. package/dist/es/standards-sdk.es41.js.map +1 -1
  130. package/dist/es/standards-sdk.es42.js +1536 -389
  131. package/dist/es/standards-sdk.es42.js.map +1 -1
  132. package/dist/es/standards-sdk.es43.js +133 -1541
  133. package/dist/es/standards-sdk.es43.js.map +1 -1
  134. package/dist/es/standards-sdk.es44.js +7 -155
  135. package/dist/es/standards-sdk.es44.js.map +1 -1
  136. package/dist/es/standards-sdk.es45.js +2 -7
  137. package/dist/es/standards-sdk.es45.js.map +1 -1
  138. package/dist/es/standards-sdk.es46.js +5 -5
  139. package/dist/es/standards-sdk.es48.js +1 -1
  140. package/dist/es/standards-sdk.es49.js +1 -1
  141. package/dist/es/standards-sdk.es5.js +4 -6
  142. package/dist/es/standards-sdk.es5.js.map +1 -1
  143. package/dist/es/standards-sdk.es50.js +1 -1
  144. package/dist/es/standards-sdk.es51.js +1 -1
  145. package/dist/es/standards-sdk.es52.js +1 -1
  146. package/dist/es/standards-sdk.es54.js +7135 -2
  147. package/dist/es/standards-sdk.es54.js.map +1 -1
  148. package/dist/es/standards-sdk.es55.js +7134 -41
  149. package/dist/es/standards-sdk.es55.js.map +1 -1
  150. package/dist/es/standards-sdk.es56.js +37 -37
  151. package/dist/es/standards-sdk.es56.js.map +1 -1
  152. package/dist/es/standards-sdk.es57.js +37 -37
  153. package/dist/es/standards-sdk.es57.js.map +1 -1
  154. package/dist/es/standards-sdk.es58.js +78 -72
  155. package/dist/es/standards-sdk.es58.js.map +1 -1
  156. package/dist/es/standards-sdk.es59.js +41 -7134
  157. package/dist/es/standards-sdk.es59.js.map +1 -1
  158. package/dist/es/standards-sdk.es6.js.map +1 -1
  159. package/dist/es/standards-sdk.es7.js +28 -22
  160. package/dist/es/standards-sdk.es7.js.map +1 -1
  161. package/dist/es/standards-sdk.es8.js +5 -5
  162. package/dist/es/utils/logger.d.ts.map +1 -1
  163. package/package.json +37 -35
  164. package/dist/cjs/hcs-21/index.d.ts +0 -4
  165. package/dist/cjs/hcs-21/index.d.ts.map +0 -1
  166. package/dist/cjs/hcs-21/petal-account-manager.d.ts +0 -52
  167. package/dist/cjs/hcs-21/petal-account-manager.d.ts.map +0 -1
  168. package/dist/cjs/hcs-21/types.d.ts +0 -44
  169. package/dist/cjs/hcs-21/types.d.ts.map +0 -1
  170. package/dist/cjs/index-xZmk-HBD.cjs.map +0 -1
  171. package/dist/es/hcs-21/index.d.ts +0 -4
  172. package/dist/es/hcs-21/index.d.ts.map +0 -1
  173. package/dist/es/hcs-21/petal-account-manager.d.ts +0 -52
  174. package/dist/es/hcs-21/petal-account-manager.d.ts.map +0 -1
  175. package/dist/es/hcs-21/types.d.ts +0 -44
  176. package/dist/es/hcs-21/types.d.ts.map +0 -1
  177. package/dist/es/standards-sdk.es60.js +0 -7144
  178. package/dist/es/standards-sdk.es60.js.map +0 -1
@@ -1,518 +1,104 @@
1
- import { PublicKey, TopicMessageSubmitTransaction } from "@hashgraph/sdk";
2
- import { Logger } from "./standards-sdk.es35.js";
3
- import { DiscoveryState, DiscoveryError, DiscoveryErrorCodes, DiscoveryOperation } from "./standards-sdk.es33.js";
4
- import { FloraAccountManager } from "./standards-sdk.es30.js";
5
- class FloraDiscovery {
6
- constructor(config, baseClient, client, logger) {
7
- this.state = DiscoveryState.IDLE;
8
- this.lastSequenceNumber = 0;
9
- this.announcements = /* @__PURE__ */ new Map();
10
- this.proposals = /* @__PURE__ */ new Map();
11
- this.formations = /* @__PURE__ */ new Map();
12
- this.config = config;
13
- this.mirrorNode = baseClient.mirrorNode;
14
- this.logger = logger || new Logger({ module: "FloraDiscovery" });
15
- this.client = client;
16
- this.eventEmitter = config.onDiscoveryEvent;
17
- if (client) {
18
- this.floraClient = new FloraAccountManager(
19
- client,
20
- baseClient.network,
21
- this.logger
22
- );
23
- }
24
- }
25
- /**
26
- * Start discovery service
27
- */
28
- async startDiscovery() {
29
- if (this.state !== DiscoveryState.IDLE) {
30
- throw new DiscoveryError(
31
- "Discovery already started",
32
- DiscoveryErrorCodes.ALREADY_IN_DISCOVERY
33
- );
34
- }
35
- this.logger.info("Starting Flora discovery");
36
- await this.syncDiscoveryTopic();
37
- this.state = DiscoveryState.ANNOUNCED;
38
- }
39
- /**
40
- * Announce Petal availability
41
- */
42
- async announceAvailability(validFor = 1e4) {
43
- if (!this.client) {
44
- throw new DiscoveryError(
45
- "Client required for announcements",
46
- DiscoveryErrorCodes.INVALID_STATE
47
- );
48
- }
49
- const message = {
50
- p: "hcs-18",
51
- op: DiscoveryOperation.ANNOUNCE,
52
- data: {
53
- account: this.config.accountId,
54
- petal: {
55
- name: this.config.petalName,
56
- priority: this.config.priority
57
- },
58
- capabilities: this.config.capabilities,
59
- valid_for: validFor
60
- }
61
- };
62
- const sequenceNumber = await this.sendDiscoveryMessage(message);
63
- this.myAnnouncementSeq = sequenceNumber;
64
- this.state = DiscoveryState.ANNOUNCED;
65
- this.emitEvent({
66
- type: "announcement_received",
67
- sequenceNumber,
68
- timestamp: /* @__PURE__ */ new Date(),
69
- data: message.data
70
- });
71
- return sequenceNumber;
72
- }
73
- /**
74
- * Propose Flora formation
75
- */
76
- async proposeFloraFormation(memberAccounts, config) {
77
- if (!this.client) {
78
- throw new DiscoveryError(
79
- "Client required for proposals",
80
- DiscoveryErrorCodes.INVALID_STATE
81
- );
82
- }
83
- const members = memberAccounts.map((account) => {
84
- const announcement = Array.from(this.announcements.values()).find(
85
- (a) => a.account === account
86
- );
87
- return {
88
- account,
89
- announce_seq: announcement?.sequenceNumber,
90
- priority: announcement?.data.petal.priority || 500
91
- };
92
- });
93
- const proposeData = {
94
- proposer: this.config.accountId,
95
- members,
96
- config
97
- };
98
- const message = {
99
- p: "hcs-18",
100
- op: DiscoveryOperation.PROPOSE,
101
- data: proposeData
102
- };
103
- const sequenceNumber = await this.sendDiscoveryMessage(message);
104
- this.state = DiscoveryState.PROPOSING;
105
- this.emitEvent({
106
- type: "proposal_received",
107
- sequenceNumber,
108
- timestamp: /* @__PURE__ */ new Date(),
109
- data: proposeData
110
- });
111
- return sequenceNumber;
112
- }
113
- /**
114
- * Respond to Flora proposal
115
- */
116
- async respondToProposal(proposalSeq, decision, reason) {
117
- if (!this.client) {
118
- throw new DiscoveryError(
119
- "Client required for responses",
120
- DiscoveryErrorCodes.INVALID_STATE
121
- );
122
- }
123
- const proposal = this.proposals.get(proposalSeq);
124
- if (!proposal) {
125
- throw new DiscoveryError(
126
- `Proposal ${proposalSeq} not found`,
127
- DiscoveryErrorCodes.INVALID_MESSAGE
128
- );
129
- }
130
- const responseData = {
131
- responder: this.config.accountId,
132
- proposal_seq: proposalSeq,
133
- decision,
134
- reason
135
- };
136
- const message = {
137
- p: "hcs-18",
138
- op: DiscoveryOperation.RESPOND,
139
- data: responseData
1
+ import pino from "pino";
2
+ const _Logger = class _Logger {
3
+ constructor(options = {}) {
4
+ const globalDisable = process.env.DISABLE_LOGS === "true";
5
+ const shouldSilence = options.silent || globalDisable;
6
+ const level = shouldSilence ? "silent" : options.level || "info";
7
+ this.moduleContext = options.module || "app";
8
+ const shouldEnablePrettyPrint = !shouldSilence && options.prettyPrint !== false;
9
+ const pinoOptions = {
10
+ level,
11
+ enabled: !shouldSilence,
12
+ transport: shouldEnablePrettyPrint ? {
13
+ target: "pino-pretty",
14
+ options: {
15
+ colorize: true,
16
+ translateTime: "SYS:standard",
17
+ ignore: "pid,hostname"
18
+ }
19
+ } : void 0
140
20
  };
141
- await this.sendDiscoveryMessage(message);
142
- this.emitEvent({
143
- type: "response_received",
144
- sequenceNumber: proposalSeq,
145
- timestamp: /* @__PURE__ */ new Date(),
146
- data: responseData
147
- });
148
- if (decision === "accept") {
149
- this.state = DiscoveryState.FORMING;
150
- }
151
- }
152
- /**
153
- * Find compatible Petals for Flora formation
154
- */
155
- findCompatiblePetals(filters = {}) {
156
- const candidates = Array.from(this.announcements.values()).filter((announcement) => {
157
- if (announcement.account === this.config.accountId) {
158
- return false;
21
+ this.logger = pino(pinoOptions);
22
+ }
23
+ static getInstance(options = {}) {
24
+ const moduleKey = options.module || "default";
25
+ const globalDisable = process.env.DISABLE_LOGS === "true";
26
+ if (globalDisable && _Logger.instances.has(moduleKey)) {
27
+ const existingLogger = _Logger.instances.get(moduleKey);
28
+ if (existingLogger.getLevel() !== "silent") {
29
+ _Logger.instances.delete(moduleKey);
159
30
  }
160
- if (filters.protocols?.length) {
161
- const hasCompatibleProtocol = filters.protocols.some(
162
- (protocol) => announcement.data.capabilities.protocols.includes(protocol)
163
- );
164
- if (!hasCompatibleProtocol) return false;
165
- }
166
- if (filters.minPriority && announcement.data.petal.priority < filters.minPriority) {
167
- return false;
168
- }
169
- return true;
170
- }).sort((a, b) => b.data.petal.priority - a.data.petal.priority);
171
- return filters.maxMembers ? candidates.slice(0, filters.maxMembers) : candidates;
172
- }
173
- /**
174
- * Get current discovery state
175
- */
176
- getState() {
177
- return this.state;
178
- }
179
- /**
180
- * Get tracked announcements
181
- */
182
- getAnnouncements() {
183
- return new Map(this.announcements);
184
- }
185
- /**
186
- * Get tracked proposals
187
- */
188
- getProposals() {
189
- return new Map(this.proposals);
190
- }
191
- /**
192
- * Get Flora formations
193
- */
194
- getFormations() {
195
- return new Map(this.formations);
196
- }
197
- /**
198
- * Complete Flora formation (called by proposer)
199
- */
200
- async completeFloraFormation(proposalSeq, floraAccountId, topics) {
201
- if (!this.client) {
202
- throw new DiscoveryError(
203
- "Client required for completion",
204
- DiscoveryErrorCodes.INVALID_STATE
205
- );
206
31
  }
207
- const proposal = this.proposals.get(proposalSeq);
208
- if (!proposal) {
209
- throw new DiscoveryError(
210
- `Proposal ${proposalSeq} not found`,
211
- DiscoveryErrorCodes.INVALID_MESSAGE
212
- );
32
+ if (!_Logger.instances.has(moduleKey)) {
33
+ _Logger.instances.set(moduleKey, new _Logger(options));
213
34
  }
214
- const message = {
215
- p: "hcs-18",
216
- op: DiscoveryOperation.COMPLETE,
217
- data: {
218
- proposer: this.config.accountId,
219
- proposal_seq: proposalSeq,
220
- flora_account: floraAccountId,
221
- topics
222
- }
223
- };
224
- await this.sendDiscoveryMessage(message);
225
- const formation = {
226
- proposalSeq,
227
- floraAccountId,
228
- topics,
229
- members: proposal.data.members.map((m) => ({
230
- account: m.account,
231
- priority: m.priority
232
- })),
233
- threshold: proposal.data.config.threshold,
234
- createdAt: /* @__PURE__ */ new Date()
235
- };
236
- this.formations.set(proposalSeq, formation);
237
- this.state = DiscoveryState.ACTIVE;
238
- this.emitEvent({
239
- type: "formation_complete",
240
- sequenceNumber: proposalSeq,
241
- timestamp: /* @__PURE__ */ new Date(),
242
- data: formation
243
- });
35
+ return _Logger.instances.get(moduleKey);
244
36
  }
245
- /**
246
- * Withdraw from discovery
247
- */
248
- async withdraw(reason) {
249
- if (!this.client || !this.myAnnouncementSeq) {
250
- throw new DiscoveryError(
251
- "No active announcement to withdraw",
252
- DiscoveryErrorCodes.INVALID_STATE
253
- );
254
- }
255
- const message = {
256
- p: "hcs-18",
257
- op: DiscoveryOperation.WITHDRAW,
258
- data: {
259
- account: this.config.accountId,
260
- announce_seq: this.myAnnouncementSeq,
261
- reason
262
- }
263
- };
264
- await this.sendDiscoveryMessage(message);
265
- this.state = DiscoveryState.WITHDRAWN;
266
- this.emitEvent({
267
- type: "withdrawal_received",
268
- timestamp: /* @__PURE__ */ new Date(),
269
- data: message.data
270
- });
37
+ setLogLevel(level) {
38
+ this.logger.level = level;
271
39
  }
272
- /**
273
- * Sync discovery topic and process messages
274
- */
275
- async syncDiscoveryTopic() {
276
- try {
277
- const messages = await this.mirrorNode.getTopicMessages(
278
- this.config.discoveryTopicId.toString(),
279
- {
280
- sequenceNumber: this.lastSequenceNumber + 1
281
- }
282
- );
283
- for (const message of messages) {
284
- try {
285
- const discoveryMessage = message;
286
- if (discoveryMessage.p !== "hcs-18") {
287
- continue;
288
- }
289
- await this.processDiscoveryMessage(
290
- discoveryMessage,
291
- message.sequence_number
292
- );
293
- this.lastSequenceNumber = message.sequence_number;
294
- } catch (error) {
295
- this.logger.warn("Failed to parse discovery message", error);
296
- }
297
- }
298
- } catch (error) {
299
- this.logger.error("Failed to sync discovery topic", error);
300
- }
40
+ getLevel() {
41
+ return this.logger.level;
301
42
  }
302
- /**
303
- * Process discovered messages
304
- */
305
- async processDiscoveryMessage(message, sequenceNumber) {
306
- switch (message.op) {
307
- case DiscoveryOperation.ANNOUNCE:
308
- await this.handleAnnouncement(
309
- message,
310
- sequenceNumber
311
- );
312
- break;
313
- case DiscoveryOperation.PROPOSE:
314
- await this.handleProposal(message, sequenceNumber);
315
- break;
316
- case DiscoveryOperation.RESPOND:
317
- await this.handleResponse(message, sequenceNumber);
318
- break;
319
- case DiscoveryOperation.COMPLETE:
320
- await this.handleCompletion(message, sequenceNumber);
321
- break;
322
- case DiscoveryOperation.WITHDRAW:
323
- await this.handleWithdrawal(message, sequenceNumber);
324
- break;
43
+ setSilent(silent) {
44
+ if (silent) {
45
+ this.logger.level = "silent";
325
46
  }
326
47
  }
327
- /**
328
- * Handle announcement message
329
- */
330
- async handleAnnouncement(message, sequenceNumber) {
331
- const announcement = {
332
- account: message.data.account,
333
- sequenceNumber,
334
- consensusTimestamp: (/* @__PURE__ */ new Date()).toISOString(),
335
- data: message.data
336
- };
337
- this.announcements.set(sequenceNumber, announcement);
338
- if (message.data.account === this.config.accountId) {
339
- return;
340
- }
341
- this.emitEvent({
342
- type: "announcement_received",
343
- sequenceNumber,
344
- timestamp: /* @__PURE__ */ new Date(),
345
- data: message.data
346
- });
48
+ setModule(module) {
49
+ this.moduleContext = module;
347
50
  }
348
- /**
349
- * Handle proposal message
350
- */
351
- async handleProposal(message, sequenceNumber) {
352
- const proposal = {
353
- sequenceNumber,
354
- consensusTimestamp: (/* @__PURE__ */ new Date()).toISOString(),
355
- proposer: message.data.proposer,
356
- data: message.data,
357
- responses: /* @__PURE__ */ new Map()
358
- };
359
- this.proposals.set(sequenceNumber, proposal);
360
- if (this.config.autoAcceptFilter?.(proposal)) {
361
- await this.respondToProposal(sequenceNumber, "accept");
51
+ formatArgs(args) {
52
+ if (args.length === 0) {
53
+ return { msg: "" };
362
54
  }
363
- const isIncluded = message.data.members.some(
364
- (m) => m.account === this.config.accountId
365
- );
366
- if (isIncluded) {
367
- this.emitEvent({
368
- type: "proposal_received",
369
- sequenceNumber,
370
- timestamp: /* @__PURE__ */ new Date(),
371
- data: message.data
372
- });
373
- }
374
- }
375
- /**
376
- * Handle response message
377
- */
378
- async handleResponse(message, sequenceNumber) {
379
- const proposal = this.proposals.get(message.data.proposal_seq);
380
- if (proposal) {
381
- proposal.responses.set(message.data.responder, message.data);
382
- if (this.isProposalReady(proposal)) {
383
- if (proposal.data.proposer === this.config.accountId && this.floraClient) {
384
- await this.createFloraFromProposal(proposal);
385
- }
55
+ if (args.length === 1) {
56
+ if (typeof args[0] === "string") {
57
+ return { msg: args[0] };
58
+ }
59
+ return { msg: "", data: args[0] };
60
+ }
61
+ const stringArgs = [];
62
+ const objectArgs = [];
63
+ args.forEach((arg) => {
64
+ if (typeof arg === "string" || typeof arg === "number" || typeof arg === "boolean") {
65
+ stringArgs.push(String(arg));
66
+ } else {
67
+ objectArgs.push(arg);
386
68
  }
387
- }
388
- this.emitEvent({
389
- type: "response_received",
390
- sequenceNumber,
391
- timestamp: /* @__PURE__ */ new Date(),
392
- data: message.data
393
- });
394
- }
395
- /**
396
- * Handle completion message
397
- */
398
- async handleCompletion(message, sequenceNumber) {
399
- const formation = {
400
- proposalSeq: message.data.proposal_seq,
401
- floraAccountId: message.data.flora_account,
402
- topics: message.data.topics,
403
- members: [],
404
- threshold: 0,
405
- createdAt: /* @__PURE__ */ new Date()
406
- };
407
- if (this.isPartOfFormation(formation)) {
408
- this.state = DiscoveryState.ACTIVE;
409
- }
410
- this.formations.set(message.data.proposal_seq, formation);
411
- this.emitEvent({
412
- type: "formation_complete",
413
- sequenceNumber,
414
- timestamp: /* @__PURE__ */ new Date(),
415
- data: formation
416
- });
417
- }
418
- /**
419
- * Handle withdrawal message
420
- */
421
- async handleWithdrawal(message, sequenceNumber) {
422
- this.announcements.delete(message.data.announce_seq);
423
- this.emitEvent({
424
- type: "withdrawal_received",
425
- sequenceNumber,
426
- timestamp: /* @__PURE__ */ new Date(),
427
- data: message.data
428
69
  });
70
+ const msg = stringArgs.join(" ");
71
+ return objectArgs.length > 0 ? { msg, data: objectArgs } : { msg };
72
+ }
73
+ debug(...args) {
74
+ const { msg, data } = this.formatArgs(args);
75
+ const logObj = { module: this.moduleContext, ...data && { data } };
76
+ this.logger.debug(logObj, msg);
77
+ }
78
+ info(...args) {
79
+ const { msg, data } = this.formatArgs(args);
80
+ const logObj = { module: this.moduleContext, ...data && { data } };
81
+ this.logger.info(logObj, msg);
82
+ }
83
+ warn(...args) {
84
+ const { msg, data } = this.formatArgs(args);
85
+ const logObj = { module: this.moduleContext, ...data && { data } };
86
+ this.logger.warn(logObj, msg);
87
+ }
88
+ error(...args) {
89
+ const { msg, data } = this.formatArgs(args);
90
+ const logObj = { module: this.moduleContext, ...data && { data } };
91
+ this.logger.error(logObj, msg);
92
+ }
93
+ trace(...args) {
94
+ const { msg, data } = this.formatArgs(args);
95
+ const logObj = { module: this.moduleContext, ...data && { data } };
96
+ this.logger.trace(logObj, msg);
429
97
  }
430
- /**
431
- * Check if proposal has enough responses
432
- */
433
- isProposalReady(proposal) {
434
- const acceptances = Array.from(proposal.responses.values()).filter(
435
- (r) => r.decision === "accept"
436
- );
437
- const requiredResponses = proposal.data.members.length - 1;
438
- return acceptances.length >= requiredResponses;
439
- }
440
- /**
441
- * Check if we're part of a Flora formation
442
- */
443
- isPartOfFormation(formation) {
444
- return formation.members.some((m) => m.account === this.config.accountId);
445
- }
446
- /**
447
- * Create Flora from accepted proposal
448
- */
449
- async createFloraFromProposal(proposal) {
450
- if (!this.floraClient) {
451
- throw new DiscoveryError(
452
- "Flora client not available",
453
- DiscoveryErrorCodes.FLORA_CREATION_FAILED
454
- );
455
- }
456
- try {
457
- const memberPubKeys = await Promise.all(
458
- proposal.data.members.map(async (m) => {
459
- const accountInfo = await this.mirrorNode.requestAccount(m.account);
460
- return {
461
- accountId: m.account,
462
- publicKey: PublicKey.fromString(accountInfo.key.key)
463
- };
464
- })
465
- );
466
- const floraResult = await this.floraClient.createFlora({
467
- members: memberPubKeys,
468
- threshold: proposal.data.config.threshold,
469
- initialBalance: 10,
470
- displayName: proposal.data.config.name
471
- });
472
- await this.completeFloraFormation(
473
- proposal.sequenceNumber,
474
- floraResult.floraAccountId.toString(),
475
- {
476
- communication: floraResult.topics.communication.toString(),
477
- transaction: floraResult.topics.transaction.toString(),
478
- state: floraResult.topics.state.toString()
479
- }
480
- );
481
- } catch (error) {
482
- this.logger.error("Failed to create Flora", error);
483
- throw new DiscoveryError(
484
- "Flora creation failed",
485
- DiscoveryErrorCodes.FLORA_CREATION_FAILED
486
- );
487
- }
488
- }
489
- /**
490
- * Send message to discovery topic
491
- */
492
- async sendDiscoveryMessage(message) {
493
- if (!this.client) {
494
- throw new DiscoveryError(
495
- "Client required for sending messages",
496
- DiscoveryErrorCodes.INVALID_STATE
497
- );
498
- }
499
- const payload = JSON.stringify(message);
500
- const transaction = new TopicMessageSubmitTransaction().setTopicId(this.config.discoveryTopicId).setMessage(payload);
501
- const response = await transaction.execute(this.client);
502
- const receipt = await response.getReceipt(this.client);
503
- return receipt.topicSequenceNumber.toNumber();
504
- }
505
- /**
506
- * Emit discovery event
507
- */
508
- emitEvent(event) {
509
- if (this.eventEmitter) {
510
- this.eventEmitter(event);
511
- }
512
- }
513
- }
98
+ };
99
+ _Logger.instances = /* @__PURE__ */ new Map();
100
+ let Logger = _Logger;
514
101
  export {
515
- FloraDiscovery,
516
- FloraDiscovery as HCS18Discovery
102
+ Logger
517
103
  };
518
104
  //# sourceMappingURL=standards-sdk.es34.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"standards-sdk.es34.js","sources":["../../src/hcs-18/discovery.ts"],"sourcesContent":["import {\n TopicId,\n AccountId,\n Client,\n TopicMessageSubmitTransaction,\n} from '@hashgraph/sdk';\nimport { HCS10BaseClient } from '../hcs-10/base-client';\nimport { HederaMirrorNode } from '../services/mirror-node';\nimport { Logger } from '../utils/logger';\nimport type { NetworkType } from '../utils/types';\nimport {\n DiscoveryConfig,\n DiscoveryState,\n DiscoveryMessage,\n DiscoveryOperation,\n AnnounceMessage,\n ProposeMessage,\n RespondMessage,\n CompleteMessage,\n WithdrawMessage,\n TrackedAnnouncement,\n TrackedProposal,\n FloraFormation,\n DiscoveryEvent,\n DiscoveryError,\n DiscoveryErrorCodes,\n AnnounceData,\n ProposeData,\n RespondData,\n} from './types';\nimport { FloraAccountManager } from '../hcs-16/flora-account-manager';\nimport { PublicKey } from '@hashgraph/sdk';\n\n/**\n * HCS-18 Flora Discovery Service\n */\nexport class FloraDiscovery {\n private state: DiscoveryState = DiscoveryState.IDLE;\n private config: DiscoveryConfig;\n private mirrorNode: HederaMirrorNode;\n private logger: Logger;\n private client?: Client;\n private floraClient?: FloraAccountManager;\n\n private lastSequenceNumber = 0;\n private announcements = new Map<number, TrackedAnnouncement>();\n private proposals = new Map<number, TrackedProposal>();\n private formations = new Map<number, FloraFormation>();\n private myAnnouncementSeq?: number;\n private eventEmitter?: (event: DiscoveryEvent) => void;\n\n constructor(\n config: DiscoveryConfig,\n baseClient: HCS10BaseClient,\n client?: Client,\n logger?: Logger,\n ) {\n this.config = config;\n this.mirrorNode = baseClient.mirrorNode;\n this.logger = logger || new Logger({ module: 'FloraDiscovery' });\n this.client = client;\n this.eventEmitter = config.onDiscoveryEvent;\n\n if (client) {\n this.floraClient = new FloraAccountManager(\n client,\n baseClient.network as NetworkType,\n this.logger,\n );\n }\n }\n\n /**\n * Start discovery service\n */\n async startDiscovery(): Promise<void> {\n if (this.state !== DiscoveryState.IDLE) {\n throw new DiscoveryError(\n 'Discovery already started',\n DiscoveryErrorCodes.ALREADY_IN_DISCOVERY,\n );\n }\n\n this.logger.info('Starting Flora discovery');\n await this.syncDiscoveryTopic();\n this.state = DiscoveryState.ANNOUNCED;\n }\n\n /**\n * Announce Petal availability\n */\n async announceAvailability(validFor = 10000): Promise<number> {\n if (!this.client) {\n throw new DiscoveryError(\n 'Client required for announcements',\n DiscoveryErrorCodes.INVALID_STATE,\n );\n }\n\n const message: AnnounceMessage = {\n p: 'hcs-18',\n op: DiscoveryOperation.ANNOUNCE,\n data: {\n account: this.config.accountId,\n petal: {\n name: this.config.petalName,\n priority: this.config.priority,\n },\n capabilities: this.config.capabilities,\n valid_for: validFor,\n },\n };\n\n const sequenceNumber = await this.sendDiscoveryMessage(message);\n this.myAnnouncementSeq = sequenceNumber;\n this.state = DiscoveryState.ANNOUNCED;\n\n this.emitEvent({\n type: 'announcement_received',\n sequenceNumber,\n timestamp: new Date(),\n data: message.data,\n });\n\n return sequenceNumber;\n }\n\n /**\n * Propose Flora formation\n */\n async proposeFloraFormation(\n memberAccounts: string[],\n config: {\n name: string;\n threshold: number;\n purpose?: string;\n },\n ): Promise<number> {\n if (!this.client) {\n throw new DiscoveryError(\n 'Client required for proposals',\n DiscoveryErrorCodes.INVALID_STATE,\n );\n }\n\n const members = memberAccounts.map(account => {\n const announcement = Array.from(this.announcements.values()).find(\n a => a.account === account,\n );\n return {\n account,\n announce_seq: announcement?.sequenceNumber,\n priority: announcement?.data.petal.priority || 500,\n };\n });\n\n const proposeData: ProposeData = {\n proposer: this.config.accountId,\n members,\n config,\n };\n\n const message: ProposeMessage = {\n p: 'hcs-18',\n op: DiscoveryOperation.PROPOSE,\n data: proposeData,\n };\n\n const sequenceNumber = await this.sendDiscoveryMessage(message);\n this.state = DiscoveryState.PROPOSING;\n\n this.emitEvent({\n type: 'proposal_received',\n sequenceNumber,\n timestamp: new Date(),\n data: proposeData,\n });\n\n return sequenceNumber;\n }\n\n /**\n * Respond to Flora proposal\n */\n async respondToProposal(\n proposalSeq: number,\n decision: 'accept' | 'reject',\n reason?: string,\n ): Promise<void> {\n if (!this.client) {\n throw new DiscoveryError(\n 'Client required for responses',\n DiscoveryErrorCodes.INVALID_STATE,\n );\n }\n\n const proposal = this.proposals.get(proposalSeq);\n if (!proposal) {\n throw new DiscoveryError(\n `Proposal ${proposalSeq} not found`,\n DiscoveryErrorCodes.INVALID_MESSAGE,\n );\n }\n\n const responseData: RespondData = {\n responder: this.config.accountId,\n proposal_seq: proposalSeq,\n decision,\n reason,\n };\n\n const message: RespondMessage = {\n p: 'hcs-18',\n op: DiscoveryOperation.RESPOND,\n data: responseData,\n };\n\n await this.sendDiscoveryMessage(message);\n\n this.emitEvent({\n type: 'response_received',\n sequenceNumber: proposalSeq,\n timestamp: new Date(),\n data: responseData,\n });\n\n if (decision === 'accept') {\n this.state = DiscoveryState.FORMING;\n }\n }\n\n /**\n * Find compatible Petals for Flora formation\n */\n findCompatiblePetals(\n filters: {\n protocols?: string[];\n minPriority?: number;\n maxMembers?: number;\n resourceRequirements?: {\n compute?: 'high' | 'medium' | 'low';\n storage?: 'high' | 'medium' | 'low';\n bandwidth?: 'high' | 'medium' | 'low';\n };\n } = {},\n ): TrackedAnnouncement[] {\n const candidates = Array.from(this.announcements.values())\n .filter(announcement => {\n if (announcement.account === this.config.accountId) {\n return false;\n }\n\n if (filters.protocols?.length) {\n const hasCompatibleProtocol = filters.protocols.some(protocol =>\n announcement.data.capabilities.protocols.includes(protocol),\n );\n if (!hasCompatibleProtocol) return false;\n }\n\n if (\n filters.minPriority &&\n announcement.data.petal.priority < filters.minPriority\n ) {\n return false;\n }\n\n return true;\n })\n .sort((a, b) => b.data.petal.priority - a.data.petal.priority);\n\n return filters.maxMembers\n ? candidates.slice(0, filters.maxMembers)\n : candidates;\n }\n\n /**\n * Get current discovery state\n */\n getState(): DiscoveryState {\n return this.state;\n }\n\n /**\n * Get tracked announcements\n */\n getAnnouncements(): Map<number, TrackedAnnouncement> {\n return new Map(this.announcements);\n }\n\n /**\n * Get tracked proposals\n */\n getProposals(): Map<number, TrackedProposal> {\n return new Map(this.proposals);\n }\n\n /**\n * Get Flora formations\n */\n getFormations(): Map<number, FloraFormation> {\n return new Map(this.formations);\n }\n\n /**\n * Complete Flora formation (called by proposer)\n */\n async completeFloraFormation(\n proposalSeq: number,\n floraAccountId: string,\n topics: {\n communication: string;\n transaction: string;\n state: string;\n },\n ): Promise<void> {\n if (!this.client) {\n throw new DiscoveryError(\n 'Client required for completion',\n DiscoveryErrorCodes.INVALID_STATE,\n );\n }\n\n const proposal = this.proposals.get(proposalSeq);\n if (!proposal) {\n throw new DiscoveryError(\n `Proposal ${proposalSeq} not found`,\n DiscoveryErrorCodes.INVALID_MESSAGE,\n );\n }\n\n const message: CompleteMessage = {\n p: 'hcs-18',\n op: DiscoveryOperation.COMPLETE,\n data: {\n proposer: this.config.accountId,\n proposal_seq: proposalSeq,\n flora_account: floraAccountId,\n topics,\n },\n };\n\n await this.sendDiscoveryMessage(message);\n\n const formation: FloraFormation = {\n proposalSeq,\n floraAccountId,\n topics,\n members: proposal.data.members.map(m => ({\n account: m.account,\n priority: m.priority,\n })),\n threshold: proposal.data.config.threshold,\n createdAt: new Date(),\n };\n\n this.formations.set(proposalSeq, formation);\n this.state = DiscoveryState.ACTIVE;\n\n this.emitEvent({\n type: 'formation_complete',\n sequenceNumber: proposalSeq,\n timestamp: new Date(),\n data: formation,\n });\n }\n\n /**\n * Withdraw from discovery\n */\n async withdraw(reason?: string): Promise<void> {\n if (!this.client || !this.myAnnouncementSeq) {\n throw new DiscoveryError(\n 'No active announcement to withdraw',\n DiscoveryErrorCodes.INVALID_STATE,\n );\n }\n\n const message: WithdrawMessage = {\n p: 'hcs-18',\n op: DiscoveryOperation.WITHDRAW,\n data: {\n account: this.config.accountId,\n announce_seq: this.myAnnouncementSeq,\n reason,\n },\n };\n\n await this.sendDiscoveryMessage(message);\n this.state = DiscoveryState.WITHDRAWN;\n\n this.emitEvent({\n type: 'withdrawal_received',\n timestamp: new Date(),\n data: message.data,\n });\n }\n\n /**\n * Sync discovery topic and process messages\n */\n private async syncDiscoveryTopic(): Promise<void> {\n try {\n const messages = await this.mirrorNode.getTopicMessages(\n this.config.discoveryTopicId.toString(),\n {\n sequenceNumber: this.lastSequenceNumber + 1,\n },\n );\n\n for (const message of messages) {\n try {\n const discoveryMessage = message as unknown as DiscoveryMessage;\n if (discoveryMessage.p !== 'hcs-18') {\n continue;\n }\n\n await this.processDiscoveryMessage(\n discoveryMessage,\n message.sequence_number,\n );\n this.lastSequenceNumber = message.sequence_number;\n } catch (error) {\n this.logger.warn('Failed to parse discovery message', error);\n }\n }\n } catch (error) {\n this.logger.error('Failed to sync discovery topic', error);\n }\n }\n\n /**\n * Process discovered messages\n */\n private async processDiscoveryMessage(\n message: DiscoveryMessage,\n sequenceNumber: number,\n ): Promise<void> {\n switch (message.op) {\n case DiscoveryOperation.ANNOUNCE:\n await this.handleAnnouncement(\n message as AnnounceMessage,\n sequenceNumber,\n );\n break;\n case DiscoveryOperation.PROPOSE:\n await this.handleProposal(message as ProposeMessage, sequenceNumber);\n break;\n case DiscoveryOperation.RESPOND:\n await this.handleResponse(message as RespondMessage, sequenceNumber);\n break;\n case DiscoveryOperation.COMPLETE:\n await this.handleCompletion(message as CompleteMessage, sequenceNumber);\n break;\n case DiscoveryOperation.WITHDRAW:\n await this.handleWithdrawal(message as WithdrawMessage, sequenceNumber);\n break;\n }\n }\n\n /**\n * Handle announcement message\n */\n private async handleAnnouncement(\n message: AnnounceMessage,\n sequenceNumber: number,\n ): Promise<void> {\n const announcement: TrackedAnnouncement = {\n account: message.data.account,\n sequenceNumber,\n consensusTimestamp: new Date().toISOString(),\n data: message.data,\n };\n\n this.announcements.set(sequenceNumber, announcement);\n\n if (message.data.account === this.config.accountId) {\n return;\n }\n\n this.emitEvent({\n type: 'announcement_received',\n sequenceNumber,\n timestamp: new Date(),\n data: message.data,\n });\n }\n\n /**\n * Handle proposal message\n */\n private async handleProposal(\n message: ProposeMessage,\n sequenceNumber: number,\n ): Promise<void> {\n const proposal: TrackedProposal = {\n sequenceNumber,\n consensusTimestamp: new Date().toISOString(),\n proposer: message.data.proposer,\n data: message.data,\n responses: new Map(),\n };\n\n this.proposals.set(sequenceNumber, proposal);\n\n if (this.config.autoAcceptFilter?.(proposal)) {\n await this.respondToProposal(sequenceNumber, 'accept');\n }\n\n const isIncluded = message.data.members.some(\n m => m.account === this.config.accountId,\n );\n\n if (isIncluded) {\n this.emitEvent({\n type: 'proposal_received',\n sequenceNumber,\n timestamp: new Date(),\n data: message.data,\n });\n }\n }\n\n /**\n * Handle response message\n */\n private async handleResponse(\n message: RespondMessage,\n sequenceNumber: number,\n ): Promise<void> {\n const proposal = this.proposals.get(message.data.proposal_seq);\n if (proposal) {\n proposal.responses.set(message.data.responder, message.data);\n\n if (this.isProposalReady(proposal)) {\n if (\n proposal.data.proposer === this.config.accountId &&\n this.floraClient\n ) {\n await this.createFloraFromProposal(proposal);\n }\n }\n }\n\n this.emitEvent({\n type: 'response_received',\n sequenceNumber,\n timestamp: new Date(),\n data: message.data,\n });\n }\n\n /**\n * Handle completion message\n */\n private async handleCompletion(\n message: CompleteMessage,\n sequenceNumber: number,\n ): Promise<void> {\n const formation: FloraFormation = {\n proposalSeq: message.data.proposal_seq,\n floraAccountId: message.data.flora_account,\n topics: message.data.topics,\n members: [],\n threshold: 0,\n createdAt: new Date(),\n };\n\n if (this.isPartOfFormation(formation)) {\n this.state = DiscoveryState.ACTIVE;\n }\n\n this.formations.set(message.data.proposal_seq, formation);\n\n this.emitEvent({\n type: 'formation_complete',\n sequenceNumber,\n timestamp: new Date(),\n data: formation,\n });\n }\n\n /**\n * Handle withdrawal message\n */\n private async handleWithdrawal(\n message: WithdrawMessage,\n sequenceNumber: number,\n ): Promise<void> {\n this.announcements.delete(message.data.announce_seq);\n\n this.emitEvent({\n type: 'withdrawal_received',\n sequenceNumber,\n timestamp: new Date(),\n data: message.data,\n });\n }\n\n /**\n * Check if proposal has enough responses\n */\n private isProposalReady(proposal: TrackedProposal): boolean {\n const acceptances = Array.from(proposal.responses.values()).filter(\n r => r.decision === 'accept',\n );\n\n const requiredResponses = proposal.data.members.length - 1;\n return acceptances.length >= requiredResponses;\n }\n\n /**\n * Check if we're part of a Flora formation\n */\n private isPartOfFormation(formation: FloraFormation): boolean {\n return formation.members.some(m => m.account === this.config.accountId);\n }\n\n /**\n * Create Flora from accepted proposal\n */\n private async createFloraFromProposal(\n proposal: TrackedProposal,\n ): Promise<void> {\n if (!this.floraClient) {\n throw new DiscoveryError(\n 'Flora client not available',\n DiscoveryErrorCodes.FLORA_CREATION_FAILED,\n );\n }\n\n try {\n const memberPubKeys = await Promise.all(\n proposal.data.members.map(async m => {\n const accountInfo = await this.mirrorNode.requestAccount(m.account);\n return {\n accountId: m.account,\n publicKey: PublicKey.fromString(accountInfo.key.key),\n };\n }),\n );\n\n const floraResult = await this.floraClient.createFlora({\n members: memberPubKeys,\n threshold: proposal.data.config.threshold,\n initialBalance: 10,\n displayName: proposal.data.config.name,\n });\n\n await this.completeFloraFormation(\n proposal.sequenceNumber,\n floraResult.floraAccountId.toString(),\n {\n communication: floraResult.topics.communication.toString(),\n transaction: floraResult.topics.transaction.toString(),\n state: floraResult.topics.state.toString(),\n },\n );\n } catch (error) {\n this.logger.error('Failed to create Flora', error);\n throw new DiscoveryError(\n 'Flora creation failed',\n DiscoveryErrorCodes.FLORA_CREATION_FAILED,\n );\n }\n }\n\n /**\n * Send message to discovery topic\n */\n private async sendDiscoveryMessage(\n message: DiscoveryMessage,\n ): Promise<number> {\n if (!this.client) {\n throw new DiscoveryError(\n 'Client required for sending messages',\n DiscoveryErrorCodes.INVALID_STATE,\n );\n }\n\n const payload = JSON.stringify(message);\n\n const transaction = new TopicMessageSubmitTransaction()\n .setTopicId(this.config.discoveryTopicId)\n .setMessage(payload);\n\n const response = await transaction.execute(this.client);\n const receipt = await response.getReceipt(this.client);\n\n return receipt.topicSequenceNumber.toNumber();\n }\n\n /**\n * Emit discovery event\n */\n private emitEvent(event: DiscoveryEvent): void {\n if (this.eventEmitter) {\n this.eventEmitter(event);\n }\n }\n}\n\nexport { FloraDiscovery as HCS18Discovery };\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standards-sdk.es34.js","sources":["../../src/utils/logger.ts"],"sourcesContent":["import pino from 'pino';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'silent';\n\nexport interface LoggerOptions {\n level?: LogLevel;\n module?: string;\n prettyPrint?: boolean;\n silent?: boolean;\n}\nexport class Logger {\n private static instances: Map<string, Logger> = new Map();\n private logger: pino.Logger;\n private moduleContext: string;\n\n constructor(options: LoggerOptions = {}) {\n const globalDisable = process.env.DISABLE_LOGS === 'true';\n\n const shouldSilence = options.silent || globalDisable;\n const level = shouldSilence ? 'silent' : options.level || 'info';\n this.moduleContext = options.module || 'app';\n\n const shouldEnablePrettyPrint =\n !shouldSilence && options.prettyPrint !== false;\n const pinoOptions: pino.LoggerOptions = {\n level,\n enabled: !shouldSilence,\n transport: shouldEnablePrettyPrint\n ? {\n target: 'pino-pretty',\n options: {\n colorize: true,\n translateTime: 'SYS:standard',\n ignore: 'pid,hostname',\n },\n }\n : undefined,\n };\n\n this.logger = pino(pinoOptions);\n }\n\n static getInstance(options: LoggerOptions = {}): Logger {\n const moduleKey = options.module || 'default';\n\n const globalDisable = process.env.DISABLE_LOGS === 'true';\n\n if (globalDisable && Logger.instances.has(moduleKey)) {\n const existingLogger = Logger.instances.get(moduleKey)!;\n if (existingLogger.getLevel() !== 'silent') {\n Logger.instances.delete(moduleKey);\n }\n }\n\n if (!Logger.instances.has(moduleKey)) {\n Logger.instances.set(moduleKey, new Logger(options));\n }\n\n return Logger.instances.get(moduleKey)!;\n }\n\n setLogLevel(level: LogLevel): void {\n this.logger.level = level;\n }\n\n getLevel(): LogLevel {\n return this.logger.level as LogLevel;\n }\n\n setSilent(silent: boolean): void {\n if (silent) {\n this.logger.level = 'silent';\n }\n }\n\n setModule(module: string): void {\n this.moduleContext = module;\n }\n\n private formatArgs(args: any[]): { msg: string; data?: any } {\n if (args.length === 0) {\n return { msg: '' };\n }\n\n if (args.length === 1) {\n if (typeof args[0] === 'string') {\n return { msg: args[0] };\n }\n return { msg: '', data: args[0] };\n }\n\n const stringArgs: string[] = [];\n const objectArgs: any[] = [];\n\n args.forEach(arg => {\n if (typeof arg === 'string' || typeof arg === 'number' || typeof arg === 'boolean') {\n stringArgs.push(String(arg));\n } else {\n objectArgs.push(arg);\n }\n });\n\n const msg = stringArgs.join(' ');\n return objectArgs.length > 0 ? { msg, data: objectArgs } : { msg };\n }\n\n debug(...args: any[]): void {\n const { msg, data } = this.formatArgs(args);\n const logObj = { module: this.moduleContext, ...(data && { data }) };\n this.logger.debug(logObj, msg);\n }\n\n info(...args: any[]): void {\n const { msg, data } = this.formatArgs(args);\n const logObj = { module: this.moduleContext, ...(data && { data }) };\n this.logger.info(logObj, msg);\n }\n\n warn(...args: any[]): void {\n const { msg, data } = this.formatArgs(args);\n const logObj = { module: this.moduleContext, ...(data && { data }) };\n this.logger.warn(logObj, msg);\n }\n\n error(...args: any[]): void {\n const { msg, data } = this.formatArgs(args);\n const logObj = { module: this.moduleContext, ...(data && { data }) };\n this.logger.error(logObj, msg);\n }\n\n trace(...args: any[]): void {\n const { msg, data } = this.formatArgs(args);\n const logObj = { module: this.moduleContext, ...(data && { data }) };\n this.logger.trace(logObj, msg);\n }\n}\n"],"names":[],"mappings":"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"}