blue-js-sdk 2.0.0

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 (215) hide show
  1. package/CHANGELOG.md +446 -0
  2. package/LICENSE +21 -0
  3. package/README.md +75 -0
  4. package/ai-path/ADMIN-ELEVATION.md +116 -0
  5. package/ai-path/AI-MANIFESTO.md +185 -0
  6. package/ai-path/BREAKING.md +74 -0
  7. package/ai-path/CHECKLIST.md +619 -0
  8. package/ai-path/CONNECTION-STEPS.md +724 -0
  9. package/ai-path/DECISION-TREE.md +378 -0
  10. package/ai-path/DEPENDENCIES.md +459 -0
  11. package/ai-path/E2E-FLOW.md +1555 -0
  12. package/ai-path/FAILURES.md +403 -0
  13. package/ai-path/GUIDE.md +1217 -0
  14. package/ai-path/README.md +558 -0
  15. package/ai-path/SPLIT-TUNNEL.md +266 -0
  16. package/ai-path/cli.js +535 -0
  17. package/ai-path/connect.js +884 -0
  18. package/ai-path/discover.js +178 -0
  19. package/ai-path/environment.js +266 -0
  20. package/ai-path/errors.js +86 -0
  21. package/ai-path/examples/autonomous-agent.mjs +220 -0
  22. package/ai-path/examples/multi-region.mjs +174 -0
  23. package/ai-path/examples/one-shot.mjs +31 -0
  24. package/ai-path/index.js +60 -0
  25. package/ai-path/pricing.js +136 -0
  26. package/ai-path/recommend.js +413 -0
  27. package/ai-path/run-admin.vbs +25 -0
  28. package/ai-path/setup.js +291 -0
  29. package/ai-path/wallet.js +137 -0
  30. package/app-helpers.js +363 -0
  31. package/app-settings.js +95 -0
  32. package/app-types.js +267 -0
  33. package/audit.js +847 -0
  34. package/batch.js +293 -0
  35. package/bin/setup.js +376 -0
  36. package/chain/authz.js +109 -0
  37. package/chain/broadcast.js +472 -0
  38. package/chain/client.js +160 -0
  39. package/chain/fee-grants.js +305 -0
  40. package/chain/index.js +891 -0
  41. package/chain/lcd.js +313 -0
  42. package/chain/queries.js +547 -0
  43. package/chain/rpc.js +408 -0
  44. package/chain/wallet.js +141 -0
  45. package/cli/config.js +143 -0
  46. package/cli/index.js +463 -0
  47. package/cli/output.js +182 -0
  48. package/cli.js +491 -0
  49. package/client/index.js +251 -0
  50. package/client.js +271 -0
  51. package/config/index.js +255 -0
  52. package/connection/connect.js +849 -0
  53. package/connection/disconnect.js +180 -0
  54. package/connection/discovery.js +321 -0
  55. package/connection/index.js +76 -0
  56. package/connection/proxy.js +148 -0
  57. package/connection/resilience.js +428 -0
  58. package/connection/security.js +232 -0
  59. package/connection/state.js +369 -0
  60. package/connection/tunnel.js +691 -0
  61. package/consumer.js +132 -0
  62. package/cosmjs-setup.js +1884 -0
  63. package/defaults.js +366 -0
  64. package/disk-cache.js +107 -0
  65. package/dist/client.d.ts +108 -0
  66. package/dist/client.d.ts.map +1 -0
  67. package/dist/client.js +400 -0
  68. package/dist/client.js.map +1 -0
  69. package/dist/index.d.ts +8 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +8 -0
  72. package/dist/index.js.map +1 -0
  73. package/errors/index.js +112 -0
  74. package/errors.js +218 -0
  75. package/examples/README.md +64 -0
  76. package/examples/connect-direct.mjs +106 -0
  77. package/examples/connect-plan.mjs +125 -0
  78. package/examples/error-handling.mjs +109 -0
  79. package/examples/query-nodes.mjs +94 -0
  80. package/examples/wallet-basics.mjs +61 -0
  81. package/generated/amino/amino.ts +9 -0
  82. package/generated/cosmos/base/v1beta1/coin.ts +365 -0
  83. package/generated/cosmos_proto/cosmos.ts +323 -0
  84. package/generated/gogoproto/gogo.ts +9 -0
  85. package/generated/google/protobuf/descriptor.ts +7601 -0
  86. package/generated/google/protobuf/duration.ts +208 -0
  87. package/generated/google/protobuf/timestamp.ts +238 -0
  88. package/generated/sentinel/lease/v1/events.ts +924 -0
  89. package/generated/sentinel/lease/v1/lease.ts +292 -0
  90. package/generated/sentinel/lease/v1/msg.ts +949 -0
  91. package/generated/sentinel/lease/v1/params.ts +164 -0
  92. package/generated/sentinel/node/v3/events.ts +881 -0
  93. package/generated/sentinel/node/v3/msg.ts +1002 -0
  94. package/generated/sentinel/node/v3/node.ts +263 -0
  95. package/generated/sentinel/node/v3/params.ts +183 -0
  96. package/generated/sentinel/plan/v3/events.ts +675 -0
  97. package/generated/sentinel/plan/v3/msg.ts +1191 -0
  98. package/generated/sentinel/plan/v3/plan.ts +283 -0
  99. package/generated/sentinel/provider/v2/events.ts +171 -0
  100. package/generated/sentinel/provider/v2/msg.ts +480 -0
  101. package/generated/sentinel/provider/v2/params.ts +131 -0
  102. package/generated/sentinel/provider/v2/provider.ts +246 -0
  103. package/generated/sentinel/session/v3/events.ts +480 -0
  104. package/generated/sentinel/session/v3/msg.ts +616 -0
  105. package/generated/sentinel/session/v3/params.ts +260 -0
  106. package/generated/sentinel/session/v3/proof.ts +180 -0
  107. package/generated/sentinel/session/v3/session.ts +384 -0
  108. package/generated/sentinel/subscription/v3/events.ts +1181 -0
  109. package/generated/sentinel/subscription/v3/msg.ts +1305 -0
  110. package/generated/sentinel/subscription/v3/params.ts +167 -0
  111. package/generated/sentinel/subscription/v3/subscription.ts +315 -0
  112. package/generated/sentinel/types/v1/bandwidth.ts +124 -0
  113. package/generated/sentinel/types/v1/price.ts +149 -0
  114. package/generated/sentinel/types/v1/renewal.ts +87 -0
  115. package/generated/sentinel/types/v1/status.ts +54 -0
  116. package/generated/typeRegistry.ts +27 -0
  117. package/index.js +486 -0
  118. package/node-connect.js +3015 -0
  119. package/operator.js +134 -0
  120. package/package.json +113 -0
  121. package/plan-operations.js +199 -0
  122. package/preflight.js +352 -0
  123. package/pricing/index.js +262 -0
  124. package/proto/amino/amino.proto +84 -0
  125. package/proto/cosmos/base/v1beta1/coin.proto +61 -0
  126. package/proto/cosmos_proto/cosmos.proto +112 -0
  127. package/proto/gogoproto/gogo.proto +145 -0
  128. package/proto/google/api/annotations.proto +31 -0
  129. package/proto/google/api/http.proto +370 -0
  130. package/proto/google/protobuf/any.proto +106 -0
  131. package/proto/google/protobuf/duration.proto +115 -0
  132. package/proto/google/protobuf/timestamp.proto +145 -0
  133. package/proto/sentinel/lease/v1/events.proto +52 -0
  134. package/proto/sentinel/lease/v1/genesis.proto +15 -0
  135. package/proto/sentinel/lease/v1/lease.proto +25 -0
  136. package/proto/sentinel/lease/v1/msg.proto +62 -0
  137. package/proto/sentinel/lease/v1/params.proto +17 -0
  138. package/proto/sentinel/node/v3/events.proto +50 -0
  139. package/proto/sentinel/node/v3/genesis.proto +15 -0
  140. package/proto/sentinel/node/v3/msg.proto +63 -0
  141. package/proto/sentinel/node/v3/node.proto +27 -0
  142. package/proto/sentinel/node/v3/params.proto +21 -0
  143. package/proto/sentinel/node/v3/querier.proto +63 -0
  144. package/proto/sentinel/plan/v3/events.proto +41 -0
  145. package/proto/sentinel/plan/v3/genesis.proto +21 -0
  146. package/proto/sentinel/plan/v3/msg.proto +83 -0
  147. package/proto/sentinel/plan/v3/plan.proto +32 -0
  148. package/proto/sentinel/plan/v3/querier.proto +53 -0
  149. package/proto/sentinel/provider/v2/events.proto +16 -0
  150. package/proto/sentinel/provider/v2/genesis.proto +15 -0
  151. package/proto/sentinel/provider/v2/msg.proto +35 -0
  152. package/proto/sentinel/provider/v2/params.proto +17 -0
  153. package/proto/sentinel/provider/v2/provider.proto +24 -0
  154. package/proto/sentinel/provider/v3/genesis.proto +15 -0
  155. package/proto/sentinel/provider/v3/params.proto +13 -0
  156. package/proto/sentinel/session/v3/events.proto +30 -0
  157. package/proto/sentinel/session/v3/genesis.proto +15 -0
  158. package/proto/sentinel/session/v3/msg.proto +50 -0
  159. package/proto/sentinel/session/v3/params.proto +25 -0
  160. package/proto/sentinel/session/v3/proof.proto +25 -0
  161. package/proto/sentinel/session/v3/querier.proto +100 -0
  162. package/proto/sentinel/session/v3/session.proto +50 -0
  163. package/proto/sentinel/subscription/v2/allocation.proto +21 -0
  164. package/proto/sentinel/subscription/v2/payout.proto +22 -0
  165. package/proto/sentinel/subscription/v3/events.proto +65 -0
  166. package/proto/sentinel/subscription/v3/genesis.proto +17 -0
  167. package/proto/sentinel/subscription/v3/msg.proto +83 -0
  168. package/proto/sentinel/subscription/v3/params.proto +21 -0
  169. package/proto/sentinel/subscription/v3/subscription.proto +33 -0
  170. package/proto/sentinel/types/v1/bandwidth.proto +19 -0
  171. package/proto/sentinel/types/v1/price.proto +21 -0
  172. package/proto/sentinel/types/v1/renewal.proto +21 -0
  173. package/proto/sentinel/types/v1/status.proto +16 -0
  174. package/protocol/encoding.js +341 -0
  175. package/protocol/events.js +361 -0
  176. package/protocol/handshake.js +297 -0
  177. package/protocol/index.js +15 -0
  178. package/protocol/messages.js +346 -0
  179. package/protocol/plans.js +199 -0
  180. package/protocol/v2ray.js +268 -0
  181. package/protocol/v3.js +723 -0
  182. package/protocol/wireguard.js +125 -0
  183. package/security/index.js +132 -0
  184. package/session-manager.js +329 -0
  185. package/session-tracker.js +80 -0
  186. package/setup.js +376 -0
  187. package/speedtest/index.js +528 -0
  188. package/speedtest.js +567 -0
  189. package/src/client.ts +502 -0
  190. package/src/index.ts +20 -0
  191. package/state/index.js +347 -0
  192. package/state.js +516 -0
  193. package/test-all-chain-ops.js +493 -0
  194. package/test-all-logic.js +199 -0
  195. package/test-all-msg-types.js +292 -0
  196. package/test-every-connection.js +208 -0
  197. package/test-feegrant-connect.js +98 -0
  198. package/test-logic.js +148 -0
  199. package/test-mainnet.js +176 -0
  200. package/test-plan-lifecycle.js +335 -0
  201. package/tls-trust.js +132 -0
  202. package/tsconfig.build.json +20 -0
  203. package/tsconfig.json +34 -0
  204. package/types/chain.d.ts +746 -0
  205. package/types/connection.d.ts +425 -0
  206. package/types/errors.d.ts +174 -0
  207. package/types/index.d.ts +1380 -0
  208. package/types/nodes.d.ts +187 -0
  209. package/types/pricing.d.ts +156 -0
  210. package/types/protocol.d.ts +332 -0
  211. package/types/session.d.ts +236 -0
  212. package/types/settings.d.ts +192 -0
  213. package/v3protocol.js +1053 -0
  214. package/wallet/index.js +153 -0
  215. package/wireguard.js +307 -0
package/dist/client.js ADDED
@@ -0,0 +1,400 @@
1
+ /**
2
+ * BlueSentinelClient — Extends CosmJS SigningStargateClient with Sentinel query extensions.
3
+ *
4
+ * Follows the TKD Alex pattern: extend the ecosystem standard, don't replace it.
5
+ * Every CosmJS method works. Sentinel-specific additions are additive.
6
+ *
7
+ * Usage:
8
+ * const client = await BlueSentinelClient.connectWithSigner(rpcUrl, signer);
9
+ * const nodes = await client.sentinelQuery.nodes({ status: 1, limit: 100 });
10
+ * const balance = await client.getBalance(address, 'udvpn');
11
+ * const result = await client.signAndBroadcast(address, [msg], fee);
12
+ */
13
+ import { SigningStargateClient, StargateClient, QueryClient, GasPrice, } from '@cosmjs/stargate';
14
+ import { Tendermint37Client } from '@cosmjs/tendermint-rpc';
15
+ // ─── Protobuf Encoding Helpers ──────────────────────────────────────────────
16
+ function encodeVarint(value) {
17
+ let n = BigInt(value);
18
+ const bytes = [];
19
+ do {
20
+ let b = Number(n & 0x7fn);
21
+ n >>= 7n;
22
+ if (n > 0n)
23
+ b |= 0x80;
24
+ bytes.push(b);
25
+ } while (n > 0n);
26
+ return new Uint8Array(bytes);
27
+ }
28
+ function concat(arrays) {
29
+ const totalLen = arrays.reduce((sum, a) => sum + a.length, 0);
30
+ const result = new Uint8Array(totalLen);
31
+ let offset = 0;
32
+ for (const arr of arrays) {
33
+ result.set(arr, offset);
34
+ offset += arr.length;
35
+ }
36
+ return result;
37
+ }
38
+ function encodeString(fieldNum, str) {
39
+ if (!str)
40
+ return new Uint8Array(0);
41
+ const encoder = new TextEncoder();
42
+ const b = encoder.encode(str);
43
+ const tag = encodeVarint((BigInt(fieldNum) << 3n) | 2n);
44
+ const len = encodeVarint(b.length);
45
+ return concat([tag, len, b]);
46
+ }
47
+ function encodeUint64(fieldNum, value) {
48
+ if (!value && value !== 0)
49
+ return new Uint8Array(0);
50
+ const tag = encodeVarint((BigInt(fieldNum) << 3n) | 0n);
51
+ const val = encodeVarint(value);
52
+ return concat([tag, val]);
53
+ }
54
+ function encodeEmbedded(fieldNum, bytes) {
55
+ if (!bytes || bytes.length === 0)
56
+ return new Uint8Array(0);
57
+ const tag = encodeVarint((BigInt(fieldNum) << 3n) | 2n);
58
+ const len = encodeVarint(bytes.length);
59
+ return concat([tag, len, bytes]);
60
+ }
61
+ function encodePagination(opts = {}) {
62
+ const parts = [];
63
+ if (opts.key)
64
+ parts.push(encodeEmbedded(1, opts.key));
65
+ parts.push(encodeUint64(2, opts.limit ?? 100));
66
+ return concat(parts);
67
+ }
68
+ function decodeProto(buf) {
69
+ const fields = {};
70
+ let i = 0;
71
+ while (i < buf.length) {
72
+ let tag = 0n;
73
+ let shift = 0n;
74
+ while (i < buf.length) {
75
+ const b = buf[i++];
76
+ tag |= BigInt(b & 0x7f) << shift;
77
+ shift += 7n;
78
+ if (!(b & 0x80))
79
+ break;
80
+ }
81
+ const fieldNum = Number(tag >> 3n);
82
+ const wireType = Number(tag & 0x7n);
83
+ if (wireType === 0) {
84
+ let val = 0n;
85
+ let s = 0n;
86
+ while (i < buf.length) {
87
+ const b = buf[i++];
88
+ val |= BigInt(b & 0x7f) << s;
89
+ s += 7n;
90
+ if (!(b & 0x80))
91
+ break;
92
+ }
93
+ if (!fields[fieldNum])
94
+ fields[fieldNum] = [];
95
+ fields[fieldNum].push({ wireType, value: val });
96
+ }
97
+ else if (wireType === 2) {
98
+ let len = 0n;
99
+ let s = 0n;
100
+ while (i < buf.length) {
101
+ const b = buf[i++];
102
+ len |= BigInt(b & 0x7f) << s;
103
+ s += 7n;
104
+ if (!(b & 0x80))
105
+ break;
106
+ }
107
+ const numLen = Number(len);
108
+ const data = buf.slice(i, i + numLen);
109
+ i += numLen;
110
+ if (!fields[fieldNum])
111
+ fields[fieldNum] = [];
112
+ fields[fieldNum].push({ wireType, value: data });
113
+ }
114
+ else if (wireType === 5) {
115
+ i += 4;
116
+ }
117
+ else if (wireType === 1) {
118
+ i += 8;
119
+ }
120
+ }
121
+ return fields;
122
+ }
123
+ function decodeStr(data) {
124
+ return new TextDecoder().decode(data);
125
+ }
126
+ function decodePrice(fields) {
127
+ return {
128
+ denom: fields[1]?.[0] ? decodeStr(fields[1][0].value) : '',
129
+ base_value: fields[2]?.[0] ? decodeStr(fields[2][0].value) : '0',
130
+ quote_value: fields[3]?.[0] ? decodeStr(fields[3][0].value) : '0',
131
+ };
132
+ }
133
+ function decodeNode(fields) {
134
+ return {
135
+ address: fields[1]?.[0] ? decodeStr(fields[1][0].value) : '',
136
+ gigabyte_prices: (fields[2] || []).map(f => decodePrice(decodeProto(f.value))),
137
+ hourly_prices: (fields[3] || []).map(f => decodePrice(decodeProto(f.value))),
138
+ remote_addrs: (fields[4] || []).map(f => decodeStr(f.value)),
139
+ status: fields[6]?.[0] ? Number(fields[6][0].value) : 0,
140
+ };
141
+ }
142
+ // ─── Query-Only Client ──────────────────────────────────────────────────────
143
+ export class SentinelQueryClient extends StargateClient {
144
+ sentinelQuery;
145
+ qc;
146
+ constructor(tmClient) {
147
+ super(tmClient, {});
148
+ this.qc = QueryClient.withExtensions(tmClient);
149
+ this.sentinelQuery = this.buildQueryExtension();
150
+ }
151
+ static async connect(endpoint) {
152
+ const tmClient = await Tendermint37Client.connect(endpoint);
153
+ return new SentinelQueryClient(tmClient);
154
+ }
155
+ buildQueryExtension() {
156
+ const qc = this.qc;
157
+ return {
158
+ async nodes(opts = {}) {
159
+ const request = concat([
160
+ encodeUint64(1, opts.status ?? 1),
161
+ encodeEmbedded(2, encodePagination({ limit: opts.limit ?? 500 })),
162
+ ]);
163
+ const response = await qc.queryAbci('/sentinel.node.v3.QueryService/QueryNodes', request);
164
+ const fields = decodeProto(new Uint8Array(response.value));
165
+ return (fields[1] || []).map(entry => decodeNode(decodeProto(entry.value)));
166
+ },
167
+ async node(address) {
168
+ try {
169
+ const response = await qc.queryAbci('/sentinel.node.v3.QueryService/QueryNode', encodeString(1, address));
170
+ const fields = decodeProto(new Uint8Array(response.value));
171
+ if (!fields[1]?.[0])
172
+ return null;
173
+ return decodeNode(decodeProto(fields[1][0].value));
174
+ }
175
+ catch {
176
+ return null;
177
+ }
178
+ },
179
+ async nodesForPlan(planId, opts = {}) {
180
+ const request = concat([
181
+ encodeUint64(1, planId),
182
+ encodeUint64(2, opts.status ?? 1),
183
+ encodeEmbedded(3, encodePagination({ limit: opts.limit ?? 500 })),
184
+ ]);
185
+ const response = await qc.queryAbci('/sentinel.node.v3.QueryService/QueryNodesForPlan', request);
186
+ const fields = decodeProto(new Uint8Array(response.value));
187
+ return (fields[1] || []).map(entry => decodeNode(decodeProto(entry.value)));
188
+ },
189
+ async balance(address, denom = 'udvpn') {
190
+ const request = concat([encodeString(1, address), encodeString(2, denom)]);
191
+ const response = await qc.queryAbci('/cosmos.bank.v1beta1.Query/Balance', request);
192
+ const fields = decodeProto(new Uint8Array(response.value));
193
+ if (!fields[1]?.[0])
194
+ return { denom, amount: '0' };
195
+ const coinFields = decodeProto(fields[1][0].value);
196
+ return {
197
+ denom: coinFields[1]?.[0] ? decodeStr(coinFields[1][0].value) : denom,
198
+ amount: coinFields[2]?.[0] ? decodeStr(coinFields[2][0].value) : '0',
199
+ };
200
+ },
201
+ async sessionsForAccount(address, opts = {}) {
202
+ const request = concat([encodeString(1, address), encodeEmbedded(2, encodePagination(opts))]);
203
+ const response = await qc.queryAbci('/sentinel.session.v3.QueryService/QuerySessionsForAccount', request);
204
+ const fields = decodeProto(new Uint8Array(response.value));
205
+ return (fields[1] || []).map(entry => entry.value);
206
+ },
207
+ async subscriptionsForAccount(address, opts = {}) {
208
+ const request = concat([encodeString(1, address), encodeEmbedded(2, encodePagination(opts))]);
209
+ const response = await qc.queryAbci('/sentinel.subscription.v3.QueryService/QuerySubscriptionsForAccount', request);
210
+ const fields = decodeProto(new Uint8Array(response.value));
211
+ return (fields[1] || []).map(entry => entry.value);
212
+ },
213
+ async plan(planId) {
214
+ try {
215
+ const response = await qc.queryAbci('/sentinel.plan.v3.QueryService/QueryPlan', encodeUint64(1, planId));
216
+ const fields = decodeProto(new Uint8Array(response.value));
217
+ return fields[1]?.[0]?.value || null;
218
+ }
219
+ catch {
220
+ return null;
221
+ }
222
+ },
223
+ };
224
+ }
225
+ }
226
+ // ─── Signing Client (Full) ──────────────────────────────────────────────────
227
+ export class BlueSentinelClient extends SigningStargateClient {
228
+ sentinelQuery;
229
+ qc;
230
+ constructor(tmClient, signer, options) {
231
+ super(tmClient, signer, options);
232
+ this.qc = QueryClient.withExtensions(tmClient);
233
+ this.sentinelQuery = this.buildQueryExtension();
234
+ }
235
+ /**
236
+ * Connect with a signer for full TX + query capabilities.
237
+ * This is the primary entry point — matches TKD Alex's pattern exactly.
238
+ */
239
+ static async connectWithSigner(endpoint, signer, options) {
240
+ const tmClient = await Tendermint37Client.connect(endpoint);
241
+ return new BlueSentinelClient(tmClient, signer, {
242
+ gasPrice: GasPrice.fromString('0.1udvpn'),
243
+ ...options,
244
+ });
245
+ }
246
+ buildQueryExtension() {
247
+ const qc = this.qc;
248
+ return {
249
+ async nodes(opts = {}) {
250
+ const request = concat([
251
+ encodeUint64(1, opts.status ?? 1),
252
+ encodeEmbedded(2, encodePagination({ limit: opts.limit ?? 500 })),
253
+ ]);
254
+ const response = await qc.queryAbci('/sentinel.node.v3.QueryService/QueryNodes', request);
255
+ const fields = decodeProto(new Uint8Array(response.value));
256
+ return (fields[1] || []).map(entry => decodeNode(decodeProto(entry.value)));
257
+ },
258
+ async node(address) {
259
+ try {
260
+ const response = await qc.queryAbci('/sentinel.node.v3.QueryService/QueryNode', encodeString(1, address));
261
+ const fields = decodeProto(new Uint8Array(response.value));
262
+ if (!fields[1]?.[0])
263
+ return null;
264
+ return decodeNode(decodeProto(fields[1][0].value));
265
+ }
266
+ catch {
267
+ return null;
268
+ }
269
+ },
270
+ async nodesForPlan(planId, opts = {}) {
271
+ const request = concat([
272
+ encodeUint64(1, planId),
273
+ encodeUint64(2, opts.status ?? 1),
274
+ encodeEmbedded(3, encodePagination({ limit: opts.limit ?? 500 })),
275
+ ]);
276
+ const response = await qc.queryAbci('/sentinel.node.v3.QueryService/QueryNodesForPlan', request);
277
+ const fields = decodeProto(new Uint8Array(response.value));
278
+ return (fields[1] || []).map(entry => decodeNode(decodeProto(entry.value)));
279
+ },
280
+ async balance(address, denom = 'udvpn') {
281
+ const request = concat([encodeString(1, address), encodeString(2, denom)]);
282
+ const response = await qc.queryAbci('/cosmos.bank.v1beta1.Query/Balance', request);
283
+ const fields = decodeProto(new Uint8Array(response.value));
284
+ if (!fields[1]?.[0])
285
+ return { denom, amount: '0' };
286
+ const coinFields = decodeProto(fields[1][0].value);
287
+ return {
288
+ denom: coinFields[1]?.[0] ? decodeStr(coinFields[1][0].value) : denom,
289
+ amount: coinFields[2]?.[0] ? decodeStr(coinFields[2][0].value) : '0',
290
+ };
291
+ },
292
+ async sessionsForAccount(address, opts = {}) {
293
+ const request = concat([encodeString(1, address), encodeEmbedded(2, encodePagination(opts))]);
294
+ const response = await qc.queryAbci('/sentinel.session.v3.QueryService/QuerySessionsForAccount', request);
295
+ const fields = decodeProto(new Uint8Array(response.value));
296
+ return (fields[1] || []).map(entry => entry.value);
297
+ },
298
+ async subscriptionsForAccount(address, opts = {}) {
299
+ const request = concat([encodeString(1, address), encodeEmbedded(2, encodePagination(opts))]);
300
+ const response = await qc.queryAbci('/sentinel.subscription.v3.QueryService/QuerySubscriptionsForAccount', request);
301
+ const fields = decodeProto(new Uint8Array(response.value));
302
+ return (fields[1] || []).map(entry => entry.value);
303
+ },
304
+ async plan(planId) {
305
+ try {
306
+ const response = await qc.queryAbci('/sentinel.plan.v3.QueryService/QueryPlan', encodeUint64(1, planId));
307
+ const fields = decodeProto(new Uint8Array(response.value));
308
+ return fields[1]?.[0]?.value || null;
309
+ }
310
+ catch {
311
+ return null;
312
+ }
313
+ },
314
+ };
315
+ }
316
+ }
317
+ /**
318
+ * Real-time event subscription via Tendermint WebSocket.
319
+ *
320
+ * Usage:
321
+ * const ws = await SentinelWsClient.connect('wss://rpc.sentinel.co/websocket');
322
+ * ws.subscribe("tm.event='Tx'", (event) => console.log(event));
323
+ * ws.disconnect();
324
+ */
325
+ export class SentinelWsClient {
326
+ endpoint;
327
+ ws = null;
328
+ listeners = new Map();
329
+ nextId = 1;
330
+ constructor(endpoint) {
331
+ this.endpoint = endpoint;
332
+ }
333
+ static async connect(endpoint) {
334
+ const client = new SentinelWsClient(endpoint);
335
+ await client.open();
336
+ return client;
337
+ }
338
+ open() {
339
+ return new Promise((resolve, reject) => {
340
+ // Use globalThis.WebSocket (browser) or dynamic import of 'ws' (Node.js)
341
+ const WS = typeof globalThis !== 'undefined' && globalThis.WebSocket
342
+ ? globalThis.WebSocket
343
+ : null;
344
+ if (!WS) {
345
+ reject(new Error('WebSocket not available. In Node.js, install the "ws" package.'));
346
+ return;
347
+ }
348
+ this.ws = new WS(this.endpoint);
349
+ this.ws.onopen = () => resolve();
350
+ this.ws.onerror = (err) => reject(new Error(`WebSocket error: ${err}`));
351
+ this.ws.onmessage = (msg) => this.handleMessage(msg.data);
352
+ });
353
+ }
354
+ /**
355
+ * Subscribe to chain events matching a Tendermint query.
356
+ *
357
+ * Common queries:
358
+ * - "tm.event='Tx'" — all transactions
359
+ * - "tm.event='Tx' AND sentinel.node.v3.EventCreateSession.session_id EXISTS" — session starts
360
+ * - "tm.event='Tx' AND sentinel.session.v3.EventEnd.session_id EXISTS" — session ends
361
+ */
362
+ subscribe(query, callback) {
363
+ const id = this.nextId++;
364
+ if (!this.listeners.has(query)) {
365
+ this.listeners.set(query, []);
366
+ }
367
+ this.listeners.get(query).push(callback);
368
+ this.ws?.send(JSON.stringify({
369
+ jsonrpc: '2.0',
370
+ method: 'subscribe',
371
+ id,
372
+ params: { query },
373
+ }));
374
+ }
375
+ handleMessage(data) {
376
+ try {
377
+ const msg = JSON.parse(data);
378
+ if (msg.result?.events) {
379
+ // Broadcast to all listeners
380
+ for (const [, callbacks] of this.listeners) {
381
+ for (const cb of callbacks) {
382
+ const events = msg.result.events;
383
+ for (const [type, values] of Object.entries(events)) {
384
+ cb({ type, attributes: Array.isArray(values) ? values.map((v) => ({ key: type, value: v })) : [] });
385
+ }
386
+ }
387
+ }
388
+ }
389
+ }
390
+ catch {
391
+ // Ignore parse errors
392
+ }
393
+ }
394
+ disconnect() {
395
+ this.ws?.close();
396
+ this.ws = null;
397
+ this.listeners.clear();
398
+ }
399
+ }
400
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,WAAW,EAGX,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAoB,MAAM,wBAAwB,CAAC;AAmD9E,+EAA+E;AAE/E,SAAS,YAAY,CAAC,KAAsB;IAC1C,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACtB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,GAAG,CAAC;QACF,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAC1B,CAAC,KAAK,EAAE,CAAC;QACT,IAAI,CAAC,GAAG,EAAE;YAAE,CAAC,IAAI,IAAI,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChB,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE;IACjB,OAAO,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,MAAM,CAAC,MAAoB;IAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC;IACxC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;IACvB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB,EAAE,GAAW;IACjD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACnC,OAAO,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB,EAAE,KAAsB;IAC5D,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB,EAAE,KAAiB;IACzD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,gBAAgB,CAAC,OAA0B,EAAE;IACpD,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,IAAI,CAAC,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AASD,SAAS,WAAW,CAAC,GAAe;IAClC,MAAM,MAAM,GAAiC,EAAE,CAAC;IAChD,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QACtB,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;YACnB,GAAG,IAAI,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,CAAC;YACjC,KAAK,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;gBAAE,MAAM;QACzB,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QACnC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QAEpC,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;gBACnB,GAAG,IAAI,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC,IAAI,EAAE,CAAC;gBACR,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;oBAAE,MAAM;YACzB,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAClD,CAAC;aAAM,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;gBACnB,GAAG,IAAI,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC7B,CAAC,IAAI,EAAE,CAAC;gBACR,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;oBAAE,MAAM;YACzB,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;YACtC,CAAC,IAAI,MAAM,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,IAAgB;IACjC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,WAAW,CAAC,MAAoC;IACvD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC,CAAC,CAAC,EAAE;QACxE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC,CAAC,CAAC,GAAG;QAC9E,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC,CAAC,CAAC,GAAG;KAChF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,MAAoC;IACtD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC,CAAC,CAAC,EAAE;QAC1E,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC,CAAC;QAC5F,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC,CAAC;QAC1F,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC;QAC1E,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;KACxD,CAAC;AACJ,CAAC;AAED,+EAA+E;AAE/E,MAAM,OAAO,mBAAoB,SAAQ,cAAc;IACrC,aAAa,CAAyB;IACrC,EAAE,CAAc;IAEjC,YAAsB,QAAqB;QACzC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACpB,IAAI,CAAC,EAAE,GAAG,WAAW,CAAC,cAAc,CAAC,QAA8B,CAAC,CAAC;QACrE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,CAAU,KAAK,CAAC,OAAO,CAAC,QAAgB;QAC5C,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5D,OAAO,IAAI,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAEO,mBAAmB;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAEnB,OAAO;YACL,KAAK,CAAC,KAAK,CAAC,OAAyB,EAAE;gBACrC,MAAM,OAAO,GAAG,MAAM,CAAC;oBACrB,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;oBACjC,cAAc,CAAC,CAAC,EAAE,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;iBAClE,CAAC,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,2CAA2C,EAAE,OAAO,CAAC,CAAC;gBAC1F,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,KAAmB,CAAC,CAAC,CAAC,CAAC;YAC5F,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,OAAe;gBACxB,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,0CAA0C,EAAE,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;oBAC1G,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC3D,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;wBAAE,OAAO,IAAI,CAAC;oBACjC,OAAO,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC,CAAC;gBACnE,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YAED,KAAK,CAAC,YAAY,CAAC,MAAuB,EAAE,OAAyB,EAAE;gBACrE,MAAM,OAAO,GAAG,MAAM,CAAC;oBACrB,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC;oBACvB,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;oBACjC,cAAc,CAAC,CAAC,EAAE,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;iBAClE,CAAC,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,kDAAkD,EAAE,OAAO,CAAC,CAAC;gBACjG,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,KAAmB,CAAC,CAAC,CAAC,CAAC;YAC5F,CAAC;YAED,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,QAAgB,OAAO;gBACpD,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC3E,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,oCAAoC,EAAE,OAAO,CAAC,CAAC;gBACnF,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;gBACnD,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC;gBACjE,OAAO;oBACL,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC,CAAC,CAAC,KAAK;oBACnF,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC,CAAC,CAAC,GAAG;iBACnF,CAAC;YACJ,CAAC;YAED,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,OAA0B,EAAE;gBACpE,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9F,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,2DAA2D,EAAE,OAAO,CAAC,CAAC;gBAC1G,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAmB,CAAC,CAAC;YACnE,CAAC;YAED,KAAK,CAAC,uBAAuB,CAAC,OAAe,EAAE,OAA0B,EAAE;gBACzE,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9F,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,qEAAqE,EAAE,OAAO,CAAC,CAAC;gBACpH,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAmB,CAAC,CAAC;YACnE,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,MAAuB;gBAChC,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,0CAA0C,EAAE,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;oBACzG,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC3D,OAAQ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAoB,IAAI,IAAI,CAAC;gBACvD,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AAED,+EAA+E;AAE/E,MAAM,OAAO,kBAAmB,SAAQ,qBAAqB;IAC3C,aAAa,CAAyB;IACrC,EAAE,CAAc;IAEjC,YACE,QAAqB,EACrB,MAAqB,EACrB,OAAqC;QAErC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,IAAI,CAAC,EAAE,GAAG,WAAW,CAAC,cAAc,CAAC,QAA8B,CAAC,CAAC;QACrE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAClD,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAC5B,QAAgB,EAChB,MAAqB,EACrB,OAAsC;QAEtC,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5D,OAAO,IAAI,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE;YAC9C,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC;YACzC,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAEO,mBAAmB;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QAEnB,OAAO;YACL,KAAK,CAAC,KAAK,CAAC,OAAyB,EAAE;gBACrC,MAAM,OAAO,GAAG,MAAM,CAAC;oBACrB,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;oBACjC,cAAc,CAAC,CAAC,EAAE,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;iBAClE,CAAC,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,2CAA2C,EAAE,OAAO,CAAC,CAAC;gBAC1F,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,KAAmB,CAAC,CAAC,CAAC,CAAC;YAC5F,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,OAAe;gBACxB,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,0CAA0C,EAAE,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;oBAC1G,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC3D,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;wBAAE,OAAO,IAAI,CAAC;oBACjC,OAAO,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC,CAAC;gBACnE,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YAED,KAAK,CAAC,YAAY,CAAC,MAAuB,EAAE,OAAyB,EAAE;gBACrE,MAAM,OAAO,GAAG,MAAM,CAAC;oBACrB,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC;oBACvB,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;oBACjC,cAAc,CAAC,CAAC,EAAE,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;iBAClE,CAAC,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,kDAAkD,EAAE,OAAO,CAAC,CAAC;gBACjG,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,CAAC,KAAmB,CAAC,CAAC,CAAC,CAAC;YAC5F,CAAC;YAED,KAAK,CAAC,OAAO,CAAC,OAAe,EAAE,QAAgB,OAAO;gBACpD,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC3E,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,oCAAoC,EAAE,OAAO,CAAC,CAAC;gBACnF,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC3D,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;gBACnD,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC;gBACjE,OAAO;oBACL,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC,CAAC,CAAC,KAAK;oBACnF,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAmB,CAAC,CAAC,CAAC,CAAC,GAAG;iBACnF,CAAC;YACJ,CAAC;YAED,KAAK,CAAC,kBAAkB,CAAC,OAAe,EAAE,OAA0B,EAAE;gBACpE,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9F,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,2DAA2D,EAAE,OAAO,CAAC,CAAC;gBAC1G,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAmB,CAAC,CAAC;YACnE,CAAC;YAED,KAAK,CAAC,uBAAuB,CAAC,OAAe,EAAE,OAA0B,EAAE;gBACzE,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9F,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,qEAAqE,EAAE,OAAO,CAAC,CAAC;gBACpH,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAmB,CAAC,CAAC;YACnE,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,MAAuB;gBAChC,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,0CAA0C,EAAE,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;oBACzG,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC3D,OAAQ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAoB,IAAI,IAAI,CAAC;gBACvD,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AAWD;;;;;;;GAOG;AACH,MAAM,OAAO,gBAAgB;IAKU;IAJ7B,EAAE,GAAQ,IAAI,CAAC;IACf,SAAS,GAAiC,IAAI,GAAG,EAAE,CAAC;IACpD,MAAM,GAAG,CAAC,CAAC;IAEnB,YAAqC,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAEzD,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAgB;QACnC,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,IAAI;QACV,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,yEAAyE;YACzE,MAAM,EAAE,GAAG,OAAO,UAAU,KAAK,WAAW,IAAK,UAAkB,CAAC,SAAS;gBAC3E,CAAC,CAAE,UAAkB,CAAC,SAAS;gBAC/B,CAAC,CAAC,IAAI,CAAC;YACT,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,MAAM,CAAC,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC,CAAC;gBACpF,OAAO;YACT,CAAC;YACD,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/B,IAAI,CAAC,EAAU,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;YACzC,IAAI,CAAC,EAAU,CAAC,OAAO,GAAG,CAAC,GAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC,CAAC;YACrF,IAAI,CAAC,EAAU,CAAC,SAAS,GAAG,CAAC,GAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAc,CAAC,CAAC;QACpF,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,KAAa,EAAE,QAAuB;QAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEzC,IAAI,CAAC,EAAU,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;YACpC,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,WAAW;YACnB,EAAE;YACF,MAAM,EAAE,EAAE,KAAK,EAAE;SAClB,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,aAAa,CAAC,IAAY;QAChC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;gBACvB,6BAA6B;gBAC7B,KAAK,MAAM,CAAC,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBAC3C,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;wBAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;wBACjC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;4BACpD,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC9G,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,UAAU;QACR,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACf,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Blue Sentinel SDK — TypeScript Layer
3
+ *
4
+ * New TypeScript code that extends CosmJS properly.
5
+ * Import from 'sentinel-dvpn-sdk/blue' for the TypeScript client.
6
+ */
7
+ export { BlueSentinelClient, SentinelQueryClient, SentinelWsClient, type SentinelNode, type SentinelPrice, type SentinelSession, type SentinelQueryExtension, type PaginationOptions, type NodeQueryOptions, type SentinelEvent, type EventCallback, } from './client.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Blue Sentinel SDK — TypeScript Layer
3
+ *
4
+ * New TypeScript code that extends CosmJS properly.
5
+ * Import from 'sentinel-dvpn-sdk/blue' for the TypeScript client.
6
+ */
7
+ export { BlueSentinelClient, SentinelQueryClient, SentinelWsClient, } from './client.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,GASjB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Sentinel SDK — Typed Error Classes
3
+ *
4
+ * Machine-readable error codes for programmatic error handling.
5
+ * All SDK errors extend SentinelError with a .code property.
6
+ *
7
+ * Usage:
8
+ * import { SentinelError, ErrorCodes } from './errors.js';
9
+ * try { await connect(opts); }
10
+ * catch (e) {
11
+ * if (e.code === ErrorCodes.V2RAY_ALL_FAILED) trySwitchNode();
12
+ * if (e instanceof ValidationError) showFormError(e.message);
13
+ * }
14
+ */
15
+
16
+ export class SentinelError extends Error {
17
+ /**
18
+ * @param {string} code - Machine-readable error code (e.g. 'NODE_NO_UDVPN')
19
+ * @param {string} message - Human-readable description
20
+ * @param {object} details - Structured context for programmatic handling
21
+ */
22
+ constructor(code, message, details = {}) {
23
+ super(message);
24
+ this.name = 'SentinelError';
25
+ this.code = code;
26
+ this.details = details;
27
+ }
28
+
29
+ toJSON() {
30
+ return { name: this.name, code: this.code, message: this.message, details: this.details };
31
+ }
32
+ }
33
+
34
+ /** Input validation failures (bad mnemonic, invalid address, etc.) */
35
+ export class ValidationError extends SentinelError {
36
+ constructor(code, message, details) {
37
+ super(code, message, details);
38
+ this.name = 'ValidationError';
39
+ }
40
+ }
41
+
42
+ /** Node-level failures (offline, no udvpn, clock drift, etc.) */
43
+ export class NodeError extends SentinelError {
44
+ constructor(code, message, details) {
45
+ super(code, message, details);
46
+ this.name = 'NodeError';
47
+ }
48
+ }
49
+
50
+ /** Chain/transaction failures (broadcast failed, extract failed, etc.) */
51
+ export class ChainError extends SentinelError {
52
+ constructor(code, message, details) {
53
+ super(code, message, details);
54
+ this.name = 'ChainError';
55
+ }
56
+ }
57
+
58
+ /** Tunnel setup failures (V2Ray all failed, WG no connectivity, etc.) */
59
+ export class TunnelError extends SentinelError {
60
+ constructor(code, message, details) {
61
+ super(code, message, details);
62
+ this.name = 'TunnelError';
63
+ }
64
+ }
65
+
66
+ /** Security failures (TLS cert changed, etc.) */
67
+ export class SecurityError extends SentinelError {
68
+ constructor(code, message, details) {
69
+ super(code, message, details);
70
+ this.name = 'SecurityError';
71
+ }
72
+ }
73
+
74
+ /** Error code constants — use these for switch/if checks instead of string parsing */
75
+ export const ErrorCodes = {
76
+ // Validation
77
+ INVALID_OPTIONS: 'INVALID_OPTIONS',
78
+ INVALID_MNEMONIC: 'INVALID_MNEMONIC',
79
+ INVALID_NODE_ADDRESS: 'INVALID_NODE_ADDRESS',
80
+ INVALID_GIGABYTES: 'INVALID_GIGABYTES',
81
+ INVALID_URL: 'INVALID_URL',
82
+ INVALID_PLAN_ID: 'INVALID_PLAN_ID',
83
+
84
+ // Node
85
+ NODE_OFFLINE: 'NODE_OFFLINE',
86
+ NODE_NO_UDVPN: 'NODE_NO_UDVPN',
87
+ NODE_NOT_FOUND: 'NODE_NOT_FOUND',
88
+ NODE_CLOCK_DRIFT: 'NODE_CLOCK_DRIFT',
89
+
90
+ // Chain
91
+ INSUFFICIENT_BALANCE: 'INSUFFICIENT_BALANCE',
92
+
93
+ // Session
94
+ SESSION_EXISTS: 'SESSION_EXISTS',
95
+ SESSION_EXTRACT_FAILED: 'SESSION_EXTRACT_FAILED',
96
+ SESSION_POISONED: 'SESSION_POISONED',
97
+
98
+ // Tunnel
99
+ V2RAY_NOT_FOUND: 'V2RAY_NOT_FOUND',
100
+ V2RAY_ALL_FAILED: 'V2RAY_ALL_FAILED',
101
+ WG_NOT_AVAILABLE: 'WG_NOT_AVAILABLE',
102
+ WG_NO_CONNECTIVITY: 'WG_NO_CONNECTIVITY',
103
+ TUNNEL_SETUP_FAILED: 'TUNNEL_SETUP_FAILED',
104
+
105
+ // Security
106
+ TLS_CERT_CHANGED: 'TLS_CERT_CHANGED',
107
+
108
+ // Connection
109
+ ABORTED: 'ABORTED',
110
+ ALL_NODES_FAILED: 'ALL_NODES_FAILED',
111
+ ALREADY_CONNECTED: 'ALREADY_CONNECTED',
112
+ };