@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.
- package/dist/cjs/hcs-10/base-client.d.ts +1 -1
- package/dist/cjs/hcs-10/base-client.d.ts.map +1 -1
- package/dist/cjs/hcs-10/sdk.d.ts +1 -1
- package/dist/cjs/hcs-10/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-11/agent-builder.d.ts +2 -0
- package/dist/cjs/hcs-11/agent-builder.d.ts.map +1 -1
- package/dist/cjs/hcs-11/client.d.ts +2 -0
- package/dist/cjs/hcs-11/client.d.ts.map +1 -1
- package/dist/cjs/hcs-11/types.d.ts +4 -2
- package/dist/cjs/hcs-11/types.d.ts.map +1 -1
- package/dist/cjs/hcs-15/index.d.ts +3 -0
- package/dist/cjs/hcs-15/index.d.ts.map +1 -0
- package/dist/cjs/hcs-15/petal-manager.d.ts +27 -0
- package/dist/cjs/hcs-15/petal-manager.d.ts.map +1 -0
- package/dist/cjs/hcs-15/types.d.ts +41 -0
- package/dist/cjs/hcs-15/types.d.ts.map +1 -0
- package/dist/cjs/hcs-16/flora-account-manager.d.ts.map +1 -1
- package/dist/cjs/hcs-16/types.d.ts +3 -5
- package/dist/cjs/hcs-16/types.d.ts.map +1 -1
- package/dist/cjs/hcs-18/discovery.d.ts +1 -0
- package/dist/cjs/hcs-18/discovery.d.ts.map +1 -1
- package/dist/cjs/hcs-18/types.d.ts +1 -0
- package/dist/cjs/hcs-18/types.d.ts.map +1 -1
- package/dist/cjs/hcs-20/sdk.d.ts.map +1 -1
- package/dist/cjs/hcs-7/evm-bridge.d.ts.map +1 -1
- package/dist/cjs/hcs-7/redis-cache.d.ts.map +1 -1
- package/dist/cjs/hcs-7/wasm-bridge.d.ts.map +1 -1
- package/dist/cjs/{index-xZmk-HBD.cjs → index-CJsmyij2.cjs} +12 -12
- package/dist/cjs/index-CJsmyij2.cjs.map +1 -0
- package/dist/cjs/{index-CyAbgH2f-Cv8mxAhS.cjs → index-CyAbgH2f-Dn5WQtPx.cjs} +2 -2
- package/dist/cjs/{index-CyAbgH2f-Cv8mxAhS.cjs.map → index-CyAbgH2f-Dn5WQtPx.cjs.map} +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/services/types.d.ts +1 -1
- package/dist/cjs/services/types.d.ts.map +1 -1
- package/dist/cjs/standards-sdk.cjs +1 -1
- package/dist/cjs/{standards-sdk.es45-BxAtDqsy-ELd4REyl.cjs → standards-sdk.es45-BxAtDqsy-CiMtsDbD.cjs} +2 -2
- package/dist/cjs/{standards-sdk.es45-BxAtDqsy-ELd4REyl.cjs.map → standards-sdk.es45-BxAtDqsy-CiMtsDbD.cjs.map} +1 -1
- package/dist/cjs/{standards-sdk.es46-BI8ACeLM-DRmcgoN0.cjs → standards-sdk.es46-BI8ACeLM-DFYgO-fP.cjs} +2 -2
- package/dist/cjs/{standards-sdk.es46-BI8ACeLM-DRmcgoN0.cjs.map → standards-sdk.es46-BI8ACeLM-DFYgO-fP.cjs.map} +1 -1
- package/dist/cjs/{standards-sdk.es47-DbkY3FlD-DfMpZygD.cjs → standards-sdk.es47-DbkY3FlD-2qTWs2BD.cjs} +2 -2
- package/dist/cjs/{standards-sdk.es47-DbkY3FlD-DfMpZygD.cjs.map → standards-sdk.es47-DbkY3FlD-2qTWs2BD.cjs.map} +1 -1
- package/dist/cjs/{standards-sdk.es48-DzT9Qc3F-CmCkJl3x.cjs → standards-sdk.es48-DzT9Qc3F-Byz0fQnW.cjs} +2 -2
- package/dist/cjs/{standards-sdk.es48-DzT9Qc3F-CmCkJl3x.cjs.map → standards-sdk.es48-DzT9Qc3F-Byz0fQnW.cjs.map} +1 -1
- package/dist/cjs/utils/logger.d.ts.map +1 -1
- package/dist/es/hcs-10/base-client.d.ts +1 -1
- package/dist/es/hcs-10/base-client.d.ts.map +1 -1
- package/dist/es/hcs-10/sdk.d.ts +1 -1
- package/dist/es/hcs-10/sdk.d.ts.map +1 -1
- package/dist/es/hcs-11/agent-builder.d.ts +2 -0
- package/dist/es/hcs-11/agent-builder.d.ts.map +1 -1
- package/dist/es/hcs-11/client.d.ts +2 -0
- package/dist/es/hcs-11/client.d.ts.map +1 -1
- package/dist/es/hcs-11/types.d.ts +4 -2
- package/dist/es/hcs-11/types.d.ts.map +1 -1
- package/dist/es/hcs-15/index.d.ts +3 -0
- package/dist/es/hcs-15/index.d.ts.map +1 -0
- package/dist/es/hcs-15/petal-manager.d.ts +27 -0
- package/dist/es/hcs-15/petal-manager.d.ts.map +1 -0
- package/dist/es/hcs-15/types.d.ts +41 -0
- package/dist/es/hcs-15/types.d.ts.map +1 -0
- package/dist/es/hcs-16/flora-account-manager.d.ts.map +1 -1
- package/dist/es/hcs-16/types.d.ts +3 -5
- package/dist/es/hcs-16/types.d.ts.map +1 -1
- package/dist/es/hcs-18/discovery.d.ts +1 -0
- package/dist/es/hcs-18/discovery.d.ts.map +1 -1
- package/dist/es/hcs-18/types.d.ts +1 -0
- package/dist/es/hcs-18/types.d.ts.map +1 -1
- package/dist/es/hcs-20/sdk.d.ts.map +1 -1
- package/dist/es/hcs-7/evm-bridge.d.ts.map +1 -1
- package/dist/es/hcs-7/redis-cache.d.ts.map +1 -1
- package/dist/es/hcs-7/wasm-bridge.d.ts.map +1 -1
- package/dist/es/index.d.ts +1 -1
- package/dist/es/services/types.d.ts +1 -1
- package/dist/es/services/types.d.ts.map +1 -1
- package/dist/es/standards-sdk.es.js +19 -22
- package/dist/es/standards-sdk.es.js.map +1 -1
- package/dist/es/standards-sdk.es10.js +1 -1
- package/dist/es/standards-sdk.es11.js +10 -2
- package/dist/es/standards-sdk.es11.js.map +1 -1
- package/dist/es/standards-sdk.es12.js +1 -1
- package/dist/es/standards-sdk.es13.js +1 -1
- package/dist/es/standards-sdk.es13.js.map +1 -1
- package/dist/es/standards-sdk.es14.js +1 -1
- package/dist/es/standards-sdk.es15.js +39 -9
- package/dist/es/standards-sdk.es15.js.map +1 -1
- package/dist/es/standards-sdk.es16.js +1 -0
- package/dist/es/standards-sdk.es16.js.map +1 -1
- package/dist/es/standards-sdk.es18.js +1 -1
- package/dist/es/standards-sdk.es19.js +1 -1
- package/dist/es/standards-sdk.es2.js +1 -1
- package/dist/es/standards-sdk.es20.js +2 -2
- package/dist/es/standards-sdk.es23.js +2 -2
- package/dist/es/standards-sdk.es25.js +4 -2
- package/dist/es/standards-sdk.es25.js.map +1 -1
- package/dist/es/standards-sdk.es26.js +2 -2
- package/dist/es/standards-sdk.es27.js +152 -6
- package/dist/es/standards-sdk.es27.js.map +1 -1
- package/dist/es/standards-sdk.es28.js +26 -189
- package/dist/es/standards-sdk.es28.js.map +1 -1
- package/dist/es/standards-sdk.es29.js +446 -26
- package/dist/es/standards-sdk.es29.js.map +1 -1
- package/dist/es/standards-sdk.es3.js +1 -1
- package/dist/es/standards-sdk.es3.js.map +1 -1
- package/dist/es/standards-sdk.es30.js +6 -342
- package/dist/es/standards-sdk.es30.js.map +1 -1
- package/dist/es/standards-sdk.es31.js +202 -6
- package/dist/es/standards-sdk.es31.js.map +1 -1
- package/dist/es/standards-sdk.es32.js +34 -202
- package/dist/es/standards-sdk.es32.js.map +1 -1
- package/dist/es/standards-sdk.es33.js +529 -34
- package/dist/es/standards-sdk.es33.js.map +1 -1
- package/dist/es/standards-sdk.es34.js +87 -501
- package/dist/es/standards-sdk.es34.js.map +1 -1
- package/dist/es/standards-sdk.es35.js +19 -98
- package/dist/es/standards-sdk.es35.js.map +1 -1
- package/dist/es/standards-sdk.es36.js +156 -18
- package/dist/es/standards-sdk.es36.js.map +1 -1
- package/dist/es/standards-sdk.es37.js +146 -150
- package/dist/es/standards-sdk.es37.js.map +1 -1
- package/dist/es/standards-sdk.es38.js +561 -134
- package/dist/es/standards-sdk.es38.js.map +1 -1
- package/dist/es/standards-sdk.es39.js +562 -543
- package/dist/es/standards-sdk.es39.js.map +1 -1
- package/dist/es/standards-sdk.es4.js +6 -4
- package/dist/es/standards-sdk.es4.js.map +1 -1
- package/dist/es/standards-sdk.es40.js +4 -601
- package/dist/es/standards-sdk.es40.js.map +1 -1
- package/dist/es/standards-sdk.es41.js +415 -4
- package/dist/es/standards-sdk.es41.js.map +1 -1
- package/dist/es/standards-sdk.es42.js +1536 -389
- package/dist/es/standards-sdk.es42.js.map +1 -1
- package/dist/es/standards-sdk.es43.js +133 -1541
- package/dist/es/standards-sdk.es43.js.map +1 -1
- package/dist/es/standards-sdk.es44.js +7 -155
- package/dist/es/standards-sdk.es44.js.map +1 -1
- package/dist/es/standards-sdk.es45.js +2 -7
- package/dist/es/standards-sdk.es45.js.map +1 -1
- package/dist/es/standards-sdk.es46.js +5 -5
- package/dist/es/standards-sdk.es48.js +1 -1
- package/dist/es/standards-sdk.es49.js +1 -1
- package/dist/es/standards-sdk.es5.js +4 -6
- package/dist/es/standards-sdk.es5.js.map +1 -1
- package/dist/es/standards-sdk.es50.js +1 -1
- package/dist/es/standards-sdk.es51.js +1 -1
- package/dist/es/standards-sdk.es52.js +1 -1
- package/dist/es/standards-sdk.es54.js +7135 -2
- package/dist/es/standards-sdk.es54.js.map +1 -1
- package/dist/es/standards-sdk.es55.js +7134 -41
- package/dist/es/standards-sdk.es55.js.map +1 -1
- package/dist/es/standards-sdk.es56.js +37 -37
- package/dist/es/standards-sdk.es56.js.map +1 -1
- package/dist/es/standards-sdk.es57.js +37 -37
- package/dist/es/standards-sdk.es57.js.map +1 -1
- package/dist/es/standards-sdk.es58.js +78 -72
- package/dist/es/standards-sdk.es58.js.map +1 -1
- package/dist/es/standards-sdk.es59.js +41 -7134
- package/dist/es/standards-sdk.es59.js.map +1 -1
- package/dist/es/standards-sdk.es6.js.map +1 -1
- package/dist/es/standards-sdk.es7.js +28 -22
- package/dist/es/standards-sdk.es7.js.map +1 -1
- package/dist/es/standards-sdk.es8.js +5 -5
- package/dist/es/utils/logger.d.ts.map +1 -1
- package/package.json +37 -35
- package/dist/cjs/hcs-21/index.d.ts +0 -4
- package/dist/cjs/hcs-21/index.d.ts.map +0 -1
- package/dist/cjs/hcs-21/petal-account-manager.d.ts +0 -52
- package/dist/cjs/hcs-21/petal-account-manager.d.ts.map +0 -1
- package/dist/cjs/hcs-21/types.d.ts +0 -44
- package/dist/cjs/hcs-21/types.d.ts.map +0 -1
- package/dist/cjs/index-xZmk-HBD.cjs.map +0 -1
- package/dist/es/hcs-21/index.d.ts +0 -4
- package/dist/es/hcs-21/index.d.ts.map +0 -1
- package/dist/es/hcs-21/petal-account-manager.d.ts +0 -52
- package/dist/es/hcs-21/petal-account-manager.d.ts.map +0 -1
- package/dist/es/hcs-21/types.d.ts +0 -44
- package/dist/es/hcs-21/types.d.ts.map +0 -1
- package/dist/es/standards-sdk.es60.js +0 -7144
- package/dist/es/standards-sdk.es60.js.map +0 -1
|
@@ -1,518 +1,104 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
this.
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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
|
-
|
|
208
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
364
|
-
(
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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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"}
|