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/app-types.js ADDED
@@ -0,0 +1,267 @@
1
+ /**
2
+ * Sentinel SDK — Application Type Definitions
3
+ *
4
+ * Three types of dVPN applications can be built on Sentinel.
5
+ * Each type has different SDK functions, UI requirements, and user flows.
6
+ *
7
+ * ┌─────────────────────────────────────────────────────────────────────┐
8
+ * │ STEP 1: Decide your app type. │
9
+ * │ STEP 2: Use ONLY the functions listed for that type. │
10
+ * │ STEP 3: Build ONLY the UI screens listed for that type. │
11
+ * │ Mixing types without understanding leads to confused UX. │
12
+ * └─────────────────────────────────────────────────────────────────────┘
13
+ */
14
+
15
+ // ─── App Types ──────────────────────────────────────────────────────────────
16
+
17
+ /**
18
+ * The three types of Sentinel dVPN applications.
19
+ *
20
+ * ASK THE BUILDER: "How do users pay for VPN access?"
21
+ *
22
+ * A) "Users pay nodes directly from their own wallet"
23
+ * → DIRECT_P2P — user browses nodes, picks pricing (GB or hour), pays per session.
24
+ *
25
+ * B) "I have a subscription plan — users connect through my plan"
26
+ * → WHITE_LABEL — operator pre-configures plan + fee grant, user clicks Connect.
27
+ *
28
+ * C) "Both — users can subscribe to plans AND connect directly"
29
+ * → ALL_IN_ONE — two modes in one app.
30
+ */
31
+ export const APP_TYPES = Object.freeze({
32
+ WHITE_LABEL: 'white_label',
33
+ DIRECT_P2P: 'direct_p2p',
34
+ ALL_IN_ONE: 'all_in_one',
35
+ });
36
+
37
+ // ─── Per-Type Configuration ─────────────────────────────────────────────────
38
+
39
+ /**
40
+ * Configuration requirements per app type.
41
+ * Use this to validate your app config at startup.
42
+ */
43
+ export const APP_TYPE_CONFIG = Object.freeze({
44
+ [APP_TYPES.WHITE_LABEL]: {
45
+ description: 'White-label dVPN — branded app with pre-loaded plan',
46
+ requiredConfig: ['planId', 'mnemonic'],
47
+ optionalConfig: ['feeGranter', 'dns', 'countries'],
48
+ connectFunction: 'connectViaPlan',
49
+ userPaysGas: false,
50
+ userPicksNode: false,
51
+ userPicksDuration: false,
52
+ userSeesPricing: false,
53
+ screens: {
54
+ welcome: true,
55
+ planBrowser: false,
56
+ nodeBrowser: false,
57
+ durationPicker: false,
58
+ pricingDisplay: false,
59
+ connect: true,
60
+ settings: true,
61
+ },
62
+ flow: [
63
+ '1. User opens app → sees branded welcome screen',
64
+ '2. User imports/creates wallet (or operator provides one)',
65
+ '3. App auto-subscribes user to pre-configured plan (if not already)',
66
+ '4. App queries plan nodes → picks best available',
67
+ '5. User clicks "Connect" → one click, done',
68
+ '6. Fee grant covers gas — user pays nothing (or pays operator off-chain)',
69
+ ],
70
+ sdkFunctions: [
71
+ 'connectViaPlan()',
72
+ 'connectAuto({ planId })',
73
+ 'subscribeToPlan()',
74
+ 'hasActiveSubscription()',
75
+ 'queryPlanNodes()',
76
+ 'broadcastWithFeeGrant()',
77
+ 'disconnect()',
78
+ ],
79
+ },
80
+
81
+ [APP_TYPES.DIRECT_P2P]: {
82
+ description: 'Direct P2P — users pay nodes directly per-GB or per-hour',
83
+ requiredConfig: ['mnemonic'],
84
+ optionalConfig: ['dns', 'countries', 'preferHourly'],
85
+ connectFunction: 'connectDirect',
86
+ userPaysGas: true,
87
+ userPicksNode: true,
88
+ userPicksDuration: true,
89
+ userSeesPricing: true,
90
+ screens: {
91
+ welcome: true,
92
+ planBrowser: false,
93
+ nodeBrowser: true,
94
+ durationPicker: true,
95
+ pricingDisplay: true,
96
+ connect: true,
97
+ settings: true,
98
+ },
99
+ flow: [
100
+ '1. User opens app → sees welcome screen',
101
+ '2. User imports wallet with P2P tokens',
102
+ '3. App loads node list with country flags + pricing',
103
+ '4. User browses nodes → filters by country/protocol/price',
104
+ '5. User selects a node → sees GB price AND hourly price',
105
+ '6. User picks pricing model: "Pay per GB" or "Pay per Hour"',
106
+ '7. User picks amount: e.g. 5 GB or 4 hours',
107
+ '8. App shows cost estimate: "This will cost 0.20 P2P"',
108
+ '9. User clicks "Connect" → pays from their wallet',
109
+ ],
110
+ sdkFunctions: [
111
+ 'connectDirect({ gigabytes, preferHourly })',
112
+ 'connectAuto({ countries })',
113
+ 'fetchAllNodes() + enrichNodes()',
114
+ 'getNodePrices()',
115
+ 'formatNodePricing()',
116
+ 'estimateSessionPrice()',
117
+ 'getBalance()',
118
+ 'disconnect()',
119
+ ],
120
+ },
121
+
122
+ [APP_TYPES.ALL_IN_ONE]: {
123
+ description: 'All-in-one — plan subscriptions + direct P2P access',
124
+ requiredConfig: ['mnemonic'],
125
+ optionalConfig: ['dns', 'countries', 'preferHourly'],
126
+ connectFunction: 'connectViaPlan or connectDirect',
127
+ userPaysGas: true,
128
+ userPicksNode: true,
129
+ userPicksDuration: true,
130
+ userSeesPricing: true,
131
+ screens: {
132
+ welcome: true,
133
+ planBrowser: true,
134
+ nodeBrowser: true,
135
+ durationPicker: true,
136
+ pricingDisplay: true,
137
+ connect: true,
138
+ settings: true,
139
+ },
140
+ flow: [
141
+ '1. User opens app → welcome screen',
142
+ '2. User imports wallet',
143
+ '3. App shows two tabs: "Plans" and "Direct Connect"',
144
+ '',
145
+ '── Plans Tab ──',
146
+ '4a. App loads available plans via discoverPlans()',
147
+ '5a. User browses plans → sees price, node count, features',
148
+ '6a. User subscribes to a plan → subscribeToPlan()',
149
+ '7a. App connects via plan → connectViaPlan({ planId })',
150
+ '',
151
+ '── Direct Connect Tab ──',
152
+ '4b. App loads all nodes with enrichment',
153
+ '5b. User browses nodes → filters by country/protocol/price',
154
+ '6b. User selects pricing model + duration',
155
+ '7b. User clicks Connect → connectDirect()',
156
+ ],
157
+ sdkFunctions: [
158
+ '// Plan flow',
159
+ 'discoverPlans()',
160
+ 'getPlanStats()',
161
+ 'queryPlanNodes()',
162
+ 'subscribeToPlan()',
163
+ 'hasActiveSubscription()',
164
+ 'connectViaPlan()',
165
+ '',
166
+ '// Direct P2P flow',
167
+ 'connectDirect({ gigabytes, preferHourly })',
168
+ 'fetchAllNodes() + enrichNodes()',
169
+ 'getNodePrices()',
170
+ 'formatNodePricing()',
171
+ 'estimateSessionPrice()',
172
+ '',
173
+ '// Shared',
174
+ 'getBalance()',
175
+ 'disconnect()',
176
+ 'connectAuto()',
177
+ ],
178
+ },
179
+ });
180
+
181
+ // ─── App Type Validation ────────────────────────────────────────────────────
182
+
183
+ /**
184
+ * Validate an app's configuration against its type requirements.
185
+ * Call this at app startup to catch misconfigurations early.
186
+ *
187
+ * @param {'white_label'|'direct_p2p'|'all_in_one'} appType
188
+ * @param {object} config - The app's configuration object
189
+ * @returns {{ valid: boolean, errors: string[], warnings: string[], type: object }}
190
+ *
191
+ * @example
192
+ * const result = validateAppConfig('white_label', { mnemonic: '...', planId: 42 });
193
+ * if (!result.valid) console.error(result.errors);
194
+ */
195
+ export function validateAppConfig(appType, config = {}) {
196
+ const typeConfig = APP_TYPE_CONFIG[appType];
197
+ if (!typeConfig) {
198
+ return {
199
+ valid: false,
200
+ errors: [`Unknown app type: "${appType}". Use: ${Object.values(APP_TYPES).join(', ')}`],
201
+ warnings: [],
202
+ type: null,
203
+ };
204
+ }
205
+
206
+ const errors = [];
207
+ const warnings = [];
208
+
209
+ for (const key of typeConfig.requiredConfig) {
210
+ if (!config[key]) errors.push(`Missing required config: "${key}" (required for ${appType} apps)`);
211
+ }
212
+
213
+ if (appType === APP_TYPES.WHITE_LABEL) {
214
+ if (!config.planId) errors.push('White-label apps MUST have a planId configured');
215
+ if (!config.feeGranter) warnings.push('White-label apps should have a feeGranter so users don\'t pay gas. Without it, users need P2P tokens for gas fees.');
216
+ }
217
+
218
+ if (appType === APP_TYPES.DIRECT_P2P || appType === APP_TYPES.ALL_IN_ONE) {
219
+ if (config.planId && appType === APP_TYPES.DIRECT_P2P) {
220
+ warnings.push('planId is set but app type is direct_p2p — plan functions won\'t be used. Did you mean all_in_one?');
221
+ }
222
+ }
223
+
224
+ return {
225
+ valid: errors.length === 0,
226
+ errors,
227
+ warnings,
228
+ type: typeConfig,
229
+ };
230
+ }
231
+
232
+ // ─── Connect Helpers Per Type ───────────────────────────────────────────────
233
+
234
+ /**
235
+ * Get the recommended connect options for an app type.
236
+ * Returns a base config that you can spread into your connect call.
237
+ *
238
+ * @param {'white_label'|'direct_p2p'|'all_in_one'} appType
239
+ * @param {object} appConfig - App-level config (planId, feeGranter, dns, etc.)
240
+ * @returns {object} Base connect options for the given app type
241
+ */
242
+ export function getConnectDefaults(appType, appConfig = {}) {
243
+ const base = {
244
+ dns: appConfig.dns || 'handshake',
245
+ fullTunnel: appConfig.fullTunnel !== false,
246
+ killSwitch: appConfig.killSwitch || false,
247
+ };
248
+
249
+ if (appType === APP_TYPES.WHITE_LABEL) {
250
+ return {
251
+ ...base,
252
+ planId: appConfig.planId,
253
+ feeGranter: appConfig.feeGranter || undefined,
254
+ };
255
+ }
256
+
257
+ if (appType === APP_TYPES.DIRECT_P2P) {
258
+ return {
259
+ ...base,
260
+ gigabytes: appConfig.defaultGigabytes || 1,
261
+ preferHourly: appConfig.preferHourly || false,
262
+ };
263
+ }
264
+
265
+ // ALL_IN_ONE — return base, caller decides per-connection
266
+ return base;
267
+ }