@buildonspark/spark-sdk 0.1.45 → 0.1.47

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 (146) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/{chunk-I54FARY2.js → chunk-EAP3U3CW.js} +14 -14
  3. package/dist/chunk-GWFQ7EBA.js +3773 -0
  4. package/dist/{chunk-J2IE4Z7Y.js → chunk-NNX4OK44.js} +3487 -934
  5. package/dist/{RequestLightningSendInput-Du0z7Om7.d.cts → client-CvpTRpcw.d.cts} +422 -212
  6. package/dist/{RequestLightningSendInput-DEPd_fPO.d.ts → client-D7KgLN44.d.ts} +422 -212
  7. package/dist/graphql/objects/index.d.cts +5 -9
  8. package/dist/graphql/objects/index.d.ts +5 -9
  9. package/dist/graphql/objects/index.js +1 -1
  10. package/dist/index.cjs +20461 -23377
  11. package/dist/index.d.cts +15 -769
  12. package/dist/index.d.ts +15 -769
  13. package/dist/index.js +81 -71
  14. package/dist/index.node.cjs +21994 -25018
  15. package/dist/index.node.d.cts +312 -34
  16. package/dist/index.node.d.ts +312 -34
  17. package/dist/index.node.js +82 -176
  18. package/dist/native/index.cjs +22847 -25841
  19. package/dist/native/index.d.cts +974 -1138
  20. package/dist/native/index.d.ts +974 -1138
  21. package/dist/native/index.js +10604 -13592
  22. package/dist/proto/lrc20.d.cts +2 -2
  23. package/dist/proto/lrc20.d.ts +2 -2
  24. package/dist/proto/lrc20.js +3098 -46
  25. package/dist/proto/spark.d.cts +1 -1
  26. package/dist/proto/spark.d.ts +1 -1
  27. package/dist/proto/spark_token.d.cts +1 -1
  28. package/dist/proto/spark_token.d.ts +1 -1
  29. package/dist/{sdk-types-Cc4l4kb1.d.ts → sdk-types-BGCeea0G.d.ts} +1 -1
  30. package/dist/{sdk-types-B0SwjolI.d.cts → sdk-types-XUeQMLFP.d.cts} +1 -1
  31. package/dist/{spark-dM7EYXYQ.d.cts → spark-BbUrbvZz.d.cts} +1 -1
  32. package/dist/{spark-dM7EYXYQ.d.ts → spark-BbUrbvZz.d.ts} +1 -1
  33. package/dist/spark-wallet-BAFPpPtY.d.cts +923 -0
  34. package/dist/spark-wallet-CJkQW8pK.d.ts +923 -0
  35. package/dist/spark_bindings/native/index.d.cts +1 -1
  36. package/dist/spark_bindings/native/index.d.ts +1 -1
  37. package/dist/spark_bindings/wasm/index.d.cts +1 -1
  38. package/dist/spark_bindings/wasm/index.d.ts +1 -1
  39. package/dist/{services/index.cjs → tests/test-utils.cjs} +2512 -4380
  40. package/dist/tests/test-utils.d.cts +79 -0
  41. package/dist/tests/test-utils.d.ts +79 -0
  42. package/dist/tests/test-utils.js +85 -0
  43. package/dist/types/index.d.cts +5 -9
  44. package/dist/types/index.d.ts +5 -9
  45. package/dist/types/index.js +5 -5
  46. package/dist/{types-C-Rp0Oo7.d.cts → types-BADxR3bm.d.cts} +1 -1
  47. package/dist/{types-C-Rp0Oo7.d.ts → types-BADxR3bm.d.ts} +1 -1
  48. package/package.json +7 -35
  49. package/src/graphql/client.ts +59 -20
  50. package/src/index.node.ts +28 -2
  51. package/src/index.ts +31 -1
  52. package/src/native/index.ts +16 -2
  53. package/src/services/config.ts +4 -6
  54. package/src/services/connection.ts +131 -64
  55. package/src/services/lightning.ts +1 -2
  56. package/src/services/token-transactions.ts +7 -7
  57. package/src/services/transfer.ts +1 -1
  58. package/src/services/tree-creation.ts +1 -1
  59. package/src/services/wallet-config.ts +18 -10
  60. package/src/signer/signer.react-native.ts +2 -5
  61. package/src/signer/signer.ts +138 -64
  62. package/src/signer/types.ts +52 -0
  63. package/src/spark-wallet/spark-wallet.ts +79 -36
  64. package/src/spark-wallet/types.ts +4 -4
  65. package/src/tests/integration/coop-exit.test.ts +2 -1
  66. package/src/tests/integration/lightning.test.ts +2 -2
  67. package/src/tests/integration/swap.test.ts +1 -1
  68. package/src/tests/integration/transfer.test.ts +5 -5
  69. package/src/tests/integration/tree-creation.test.ts +1 -1
  70. package/src/tests/integration/wallet.test.ts +1 -0
  71. package/src/tests/isHermeticTest.ts +3 -24
  72. package/src/tests/{test-util.ts → test-utils.ts} +3 -7
  73. package/src/tests/wrapWithOtelSpan.test.ts +1 -1
  74. package/src/{address → utils}/address.ts +1 -1
  75. package/src/utils/crypto.ts +19 -9
  76. package/src/utils/index.ts +2 -0
  77. package/src/utils/network.ts +17 -0
  78. package/src/utils/secret-sharing.ts +1 -2
  79. package/src/utils/signing.ts +1 -1
  80. package/src/utils/token-transactions.ts +3 -3
  81. package/src/utils/unilateral-exit.ts +32 -0
  82. package/src/utils/xchain-address.ts +1 -1
  83. package/dist/BitcoinNetwork-TnABML0T.d.cts +0 -18
  84. package/dist/BitcoinNetwork-TnABML0T.d.ts +0 -18
  85. package/dist/LightningSendFeeEstimateInput-BgOhEAI-.d.cts +0 -10
  86. package/dist/LightningSendFeeEstimateInput-BgOhEAI-.d.ts +0 -10
  87. package/dist/address/index.cjs +0 -458
  88. package/dist/address/index.d.cts +0 -32
  89. package/dist/address/index.d.ts +0 -32
  90. package/dist/address/index.js +0 -17
  91. package/dist/chunk-5FUB65LX.js +0 -838
  92. package/dist/chunk-6264CGDM.js +0 -113
  93. package/dist/chunk-7V6N75CC.js +0 -24
  94. package/dist/chunk-C2S227QR.js +0 -2336
  95. package/dist/chunk-GSI4OLXZ.js +0 -117
  96. package/dist/chunk-GZ5IPPJ2.js +0 -170
  97. package/dist/chunk-HWJWKEIU.js +0 -75
  98. package/dist/chunk-KMUMFYFX.js +0 -137
  99. package/dist/chunk-L3EHBOUX.js +0 -0
  100. package/dist/chunk-NSJF5F5O.js +0 -325
  101. package/dist/chunk-NTFKFRQ2.js +0 -3146
  102. package/dist/chunk-PQN3C2MF.js +0 -1122
  103. package/dist/chunk-QNNSEJ4P.js +0 -232
  104. package/dist/chunk-R5PXJZQS.js +0 -277
  105. package/dist/chunk-VTUGIIWI.js +0 -0
  106. package/dist/chunk-YUPMXTCJ.js +0 -622
  107. package/dist/chunk-Z5HIAYFT.js +0 -84
  108. package/dist/index-B2AwKW5J.d.cts +0 -214
  109. package/dist/index-CJDi1HWc.d.ts +0 -214
  110. package/dist/network-BTJl-Sul.d.ts +0 -46
  111. package/dist/network-CqgsdUF2.d.cts +0 -46
  112. package/dist/services/config.cjs +0 -2354
  113. package/dist/services/config.d.cts +0 -42
  114. package/dist/services/config.d.ts +0 -42
  115. package/dist/services/config.js +0 -17
  116. package/dist/services/connection.cjs +0 -17691
  117. package/dist/services/connection.d.cts +0 -95
  118. package/dist/services/connection.d.ts +0 -95
  119. package/dist/services/connection.js +0 -11
  120. package/dist/services/index.d.cts +0 -21
  121. package/dist/services/index.d.ts +0 -21
  122. package/dist/services/index.js +0 -58
  123. package/dist/services/lrc-connection.cjs +0 -4713
  124. package/dist/services/lrc-connection.d.cts +0 -34
  125. package/dist/services/lrc-connection.d.ts +0 -34
  126. package/dist/services/lrc-connection.js +0 -11
  127. package/dist/services/token-transactions.cjs +0 -2877
  128. package/dist/services/token-transactions.d.cts +0 -75
  129. package/dist/services/token-transactions.d.ts +0 -75
  130. package/dist/services/token-transactions.js +0 -15
  131. package/dist/services/wallet-config.cjs +0 -340
  132. package/dist/services/wallet-config.d.cts +0 -56
  133. package/dist/services/wallet-config.d.ts +0 -56
  134. package/dist/services/wallet-config.js +0 -33
  135. package/dist/signer/signer.cjs +0 -2004
  136. package/dist/signer/signer.d.cts +0 -10
  137. package/dist/signer/signer.d.ts +0 -10
  138. package/dist/signer/signer.js +0 -24
  139. package/dist/signer-BocS_J6B.d.ts +0 -187
  140. package/dist/signer-DKS0AJkw.d.cts +0 -187
  141. package/dist/utils/index.cjs +0 -2947
  142. package/dist/utils/index.d.cts +0 -18
  143. package/dist/utils/index.d.ts +0 -18
  144. package/dist/utils/index.js +0 -157
  145. package/src/address/index.ts +0 -1
  146. package/src/services/lrc-connection.ts +0 -215
@@ -1,1122 +0,0 @@
1
- import {
2
- SparkTokenServiceDefinition
3
- } from "./chunk-LHRD2WT6.js";
4
- import {
5
- clientEnv,
6
- isBun,
7
- isReactNative
8
- } from "./chunk-7V6N75CC.js";
9
- import {
10
- AuthenticationError,
11
- NetworkError
12
- } from "./chunk-GSI4OLXZ.js";
13
- import {
14
- Empty,
15
- SparkServiceDefinition
16
- } from "./chunk-BGGEVUJK.js";
17
-
18
- // src/services/connection.ts
19
- import { isNode } from "@lightsparkdev/core";
20
- import { sha256 } from "@noble/hashes/sha2";
21
- import { retryMiddleware } from "nice-grpc-client-middleware-retry";
22
- import { Metadata } from "nice-grpc-common";
23
-
24
- // src/proto/mock.ts
25
- import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
26
- function interruptTransferRequest_InterruptTransferActionFromJSON(object) {
27
- switch (object) {
28
- case 0:
29
- case "NONE":
30
- return 0 /* NONE */;
31
- case 1:
32
- case "INTERRUPT":
33
- return 1 /* INTERRUPT */;
34
- case 2:
35
- case "RESUME":
36
- return 2 /* RESUME */;
37
- case -1:
38
- case "UNRECOGNIZED":
39
- default:
40
- return -1 /* UNRECOGNIZED */;
41
- }
42
- }
43
- function interruptTransferRequest_InterruptTransferActionToJSON(object) {
44
- switch (object) {
45
- case 0 /* NONE */:
46
- return "NONE";
47
- case 1 /* INTERRUPT */:
48
- return "INTERRUPT";
49
- case 2 /* RESUME */:
50
- return "RESUME";
51
- case -1 /* UNRECOGNIZED */:
52
- default:
53
- return "UNRECOGNIZED";
54
- }
55
- }
56
- function createBaseCleanUpPreimageShareRequest() {
57
- return { paymentHash: new Uint8Array(0) };
58
- }
59
- var CleanUpPreimageShareRequest = {
60
- encode(message, writer = new BinaryWriter()) {
61
- if (message.paymentHash.length !== 0) {
62
- writer.uint32(10).bytes(message.paymentHash);
63
- }
64
- return writer;
65
- },
66
- decode(input, length) {
67
- const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
68
- const end = length === void 0 ? reader.len : reader.pos + length;
69
- const message = createBaseCleanUpPreimageShareRequest();
70
- while (reader.pos < end) {
71
- const tag = reader.uint32();
72
- switch (tag >>> 3) {
73
- case 1: {
74
- if (tag !== 10) {
75
- break;
76
- }
77
- message.paymentHash = reader.bytes();
78
- continue;
79
- }
80
- }
81
- if ((tag & 7) === 4 || tag === 0) {
82
- break;
83
- }
84
- reader.skip(tag & 7);
85
- }
86
- return message;
87
- },
88
- fromJSON(object) {
89
- return { paymentHash: isSet(object.paymentHash) ? bytesFromBase64(object.paymentHash) : new Uint8Array(0) };
90
- },
91
- toJSON(message) {
92
- const obj = {};
93
- if (message.paymentHash.length !== 0) {
94
- obj.paymentHash = base64FromBytes(message.paymentHash);
95
- }
96
- return obj;
97
- },
98
- create(base) {
99
- return CleanUpPreimageShareRequest.fromPartial(base ?? {});
100
- },
101
- fromPartial(object) {
102
- const message = createBaseCleanUpPreimageShareRequest();
103
- message.paymentHash = object.paymentHash ?? new Uint8Array(0);
104
- return message;
105
- }
106
- };
107
- function createBaseInterruptTransferRequest() {
108
- return { action: 0 };
109
- }
110
- var InterruptTransferRequest = {
111
- encode(message, writer = new BinaryWriter()) {
112
- if (message.action !== 0) {
113
- writer.uint32(8).int32(message.action);
114
- }
115
- return writer;
116
- },
117
- decode(input, length) {
118
- const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
119
- const end = length === void 0 ? reader.len : reader.pos + length;
120
- const message = createBaseInterruptTransferRequest();
121
- while (reader.pos < end) {
122
- const tag = reader.uint32();
123
- switch (tag >>> 3) {
124
- case 1: {
125
- if (tag !== 8) {
126
- break;
127
- }
128
- message.action = reader.int32();
129
- continue;
130
- }
131
- }
132
- if ((tag & 7) === 4 || tag === 0) {
133
- break;
134
- }
135
- reader.skip(tag & 7);
136
- }
137
- return message;
138
- },
139
- fromJSON(object) {
140
- return {
141
- action: isSet(object.action) ? interruptTransferRequest_InterruptTransferActionFromJSON(object.action) : 0
142
- };
143
- },
144
- toJSON(message) {
145
- const obj = {};
146
- if (message.action !== 0) {
147
- obj.action = interruptTransferRequest_InterruptTransferActionToJSON(message.action);
148
- }
149
- return obj;
150
- },
151
- create(base) {
152
- return InterruptTransferRequest.fromPartial(base ?? {});
153
- },
154
- fromPartial(object) {
155
- const message = createBaseInterruptTransferRequest();
156
- message.action = object.action ?? 0;
157
- return message;
158
- }
159
- };
160
- function createBaseUpdateNodesStatusRequest() {
161
- return { nodeIds: [], status: "" };
162
- }
163
- var UpdateNodesStatusRequest = {
164
- encode(message, writer = new BinaryWriter()) {
165
- for (const v of message.nodeIds) {
166
- writer.uint32(10).string(v);
167
- }
168
- if (message.status !== "") {
169
- writer.uint32(18).string(message.status);
170
- }
171
- return writer;
172
- },
173
- decode(input, length) {
174
- const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
175
- const end = length === void 0 ? reader.len : reader.pos + length;
176
- const message = createBaseUpdateNodesStatusRequest();
177
- while (reader.pos < end) {
178
- const tag = reader.uint32();
179
- switch (tag >>> 3) {
180
- case 1: {
181
- if (tag !== 10) {
182
- break;
183
- }
184
- message.nodeIds.push(reader.string());
185
- continue;
186
- }
187
- case 2: {
188
- if (tag !== 18) {
189
- break;
190
- }
191
- message.status = reader.string();
192
- continue;
193
- }
194
- }
195
- if ((tag & 7) === 4 || tag === 0) {
196
- break;
197
- }
198
- reader.skip(tag & 7);
199
- }
200
- return message;
201
- },
202
- fromJSON(object) {
203
- return {
204
- nodeIds: globalThis.Array.isArray(object?.nodeIds) ? object.nodeIds.map((e) => globalThis.String(e)) : [],
205
- status: isSet(object.status) ? globalThis.String(object.status) : ""
206
- };
207
- },
208
- toJSON(message) {
209
- const obj = {};
210
- if (message.nodeIds?.length) {
211
- obj.nodeIds = message.nodeIds;
212
- }
213
- if (message.status !== "") {
214
- obj.status = message.status;
215
- }
216
- return obj;
217
- },
218
- create(base) {
219
- return UpdateNodesStatusRequest.fromPartial(base ?? {});
220
- },
221
- fromPartial(object) {
222
- const message = createBaseUpdateNodesStatusRequest();
223
- message.nodeIds = object.nodeIds?.map((e) => e) || [];
224
- message.status = object.status ?? "";
225
- return message;
226
- }
227
- };
228
- var MockServiceDefinition = {
229
- name: "MockService",
230
- fullName: "mock.MockService",
231
- methods: {
232
- clean_up_preimage_share: {
233
- name: "clean_up_preimage_share",
234
- requestType: CleanUpPreimageShareRequest,
235
- requestStream: false,
236
- responseType: Empty,
237
- responseStream: false,
238
- options: {}
239
- },
240
- interrupt_transfer: {
241
- name: "interrupt_transfer",
242
- requestType: InterruptTransferRequest,
243
- requestStream: false,
244
- responseType: Empty,
245
- responseStream: false,
246
- options: {}
247
- },
248
- update_nodes_status: {
249
- name: "update_nodes_status",
250
- requestType: UpdateNodesStatusRequest,
251
- requestStream: false,
252
- responseType: Empty,
253
- responseStream: false,
254
- options: {}
255
- }
256
- }
257
- };
258
- function bytesFromBase64(b64) {
259
- if (globalThis.Buffer) {
260
- return Uint8Array.from(globalThis.Buffer.from(b64, "base64"));
261
- } else {
262
- const bin = globalThis.atob(b64);
263
- const arr = new Uint8Array(bin.length);
264
- for (let i = 0; i < bin.length; ++i) {
265
- arr[i] = bin.charCodeAt(i);
266
- }
267
- return arr;
268
- }
269
- }
270
- function base64FromBytes(arr) {
271
- if (globalThis.Buffer) {
272
- return globalThis.Buffer.from(arr).toString("base64");
273
- } else {
274
- const bin = [];
275
- arr.forEach((byte) => {
276
- bin.push(globalThis.String.fromCharCode(byte));
277
- });
278
- return globalThis.btoa(bin.join(""));
279
- }
280
- }
281
- function isSet(value) {
282
- return value !== null && value !== void 0;
283
- }
284
-
285
- // src/proto/spark_authn.ts
286
- import { BinaryReader as BinaryReader2, BinaryWriter as BinaryWriter2 } from "@bufbuild/protobuf/wire";
287
- function createBaseChallenge() {
288
- return { version: 0, timestamp: 0, nonce: new Uint8Array(0), publicKey: new Uint8Array(0) };
289
- }
290
- var Challenge = {
291
- encode(message, writer = new BinaryWriter2()) {
292
- if (message.version !== 0) {
293
- writer.uint32(8).int32(message.version);
294
- }
295
- if (message.timestamp !== 0) {
296
- writer.uint32(16).int64(message.timestamp);
297
- }
298
- if (message.nonce.length !== 0) {
299
- writer.uint32(26).bytes(message.nonce);
300
- }
301
- if (message.publicKey.length !== 0) {
302
- writer.uint32(34).bytes(message.publicKey);
303
- }
304
- return writer;
305
- },
306
- decode(input, length) {
307
- const reader = input instanceof BinaryReader2 ? input : new BinaryReader2(input);
308
- const end = length === void 0 ? reader.len : reader.pos + length;
309
- const message = createBaseChallenge();
310
- while (reader.pos < end) {
311
- const tag = reader.uint32();
312
- switch (tag >>> 3) {
313
- case 1: {
314
- if (tag !== 8) {
315
- break;
316
- }
317
- message.version = reader.int32();
318
- continue;
319
- }
320
- case 2: {
321
- if (tag !== 16) {
322
- break;
323
- }
324
- message.timestamp = longToNumber(reader.int64());
325
- continue;
326
- }
327
- case 3: {
328
- if (tag !== 26) {
329
- break;
330
- }
331
- message.nonce = reader.bytes();
332
- continue;
333
- }
334
- case 4: {
335
- if (tag !== 34) {
336
- break;
337
- }
338
- message.publicKey = reader.bytes();
339
- continue;
340
- }
341
- }
342
- if ((tag & 7) === 4 || tag === 0) {
343
- break;
344
- }
345
- reader.skip(tag & 7);
346
- }
347
- return message;
348
- },
349
- fromJSON(object) {
350
- return {
351
- version: isSet2(object.version) ? globalThis.Number(object.version) : 0,
352
- timestamp: isSet2(object.timestamp) ? globalThis.Number(object.timestamp) : 0,
353
- nonce: isSet2(object.nonce) ? bytesFromBase642(object.nonce) : new Uint8Array(0),
354
- publicKey: isSet2(object.publicKey) ? bytesFromBase642(object.publicKey) : new Uint8Array(0)
355
- };
356
- },
357
- toJSON(message) {
358
- const obj = {};
359
- if (message.version !== 0) {
360
- obj.version = Math.round(message.version);
361
- }
362
- if (message.timestamp !== 0) {
363
- obj.timestamp = Math.round(message.timestamp);
364
- }
365
- if (message.nonce.length !== 0) {
366
- obj.nonce = base64FromBytes2(message.nonce);
367
- }
368
- if (message.publicKey.length !== 0) {
369
- obj.publicKey = base64FromBytes2(message.publicKey);
370
- }
371
- return obj;
372
- },
373
- create(base) {
374
- return Challenge.fromPartial(base ?? {});
375
- },
376
- fromPartial(object) {
377
- const message = createBaseChallenge();
378
- message.version = object.version ?? 0;
379
- message.timestamp = object.timestamp ?? 0;
380
- message.nonce = object.nonce ?? new Uint8Array(0);
381
- message.publicKey = object.publicKey ?? new Uint8Array(0);
382
- return message;
383
- }
384
- };
385
- function createBaseProtectedChallenge() {
386
- return { version: 0, challenge: void 0, serverHmac: new Uint8Array(0) };
387
- }
388
- var ProtectedChallenge = {
389
- encode(message, writer = new BinaryWriter2()) {
390
- if (message.version !== 0) {
391
- writer.uint32(8).int32(message.version);
392
- }
393
- if (message.challenge !== void 0) {
394
- Challenge.encode(message.challenge, writer.uint32(18).fork()).join();
395
- }
396
- if (message.serverHmac.length !== 0) {
397
- writer.uint32(26).bytes(message.serverHmac);
398
- }
399
- return writer;
400
- },
401
- decode(input, length) {
402
- const reader = input instanceof BinaryReader2 ? input : new BinaryReader2(input);
403
- const end = length === void 0 ? reader.len : reader.pos + length;
404
- const message = createBaseProtectedChallenge();
405
- while (reader.pos < end) {
406
- const tag = reader.uint32();
407
- switch (tag >>> 3) {
408
- case 1: {
409
- if (tag !== 8) {
410
- break;
411
- }
412
- message.version = reader.int32();
413
- continue;
414
- }
415
- case 2: {
416
- if (tag !== 18) {
417
- break;
418
- }
419
- message.challenge = Challenge.decode(reader, reader.uint32());
420
- continue;
421
- }
422
- case 3: {
423
- if (tag !== 26) {
424
- break;
425
- }
426
- message.serverHmac = reader.bytes();
427
- continue;
428
- }
429
- }
430
- if ((tag & 7) === 4 || tag === 0) {
431
- break;
432
- }
433
- reader.skip(tag & 7);
434
- }
435
- return message;
436
- },
437
- fromJSON(object) {
438
- return {
439
- version: isSet2(object.version) ? globalThis.Number(object.version) : 0,
440
- challenge: isSet2(object.challenge) ? Challenge.fromJSON(object.challenge) : void 0,
441
- serverHmac: isSet2(object.serverHmac) ? bytesFromBase642(object.serverHmac) : new Uint8Array(0)
442
- };
443
- },
444
- toJSON(message) {
445
- const obj = {};
446
- if (message.version !== 0) {
447
- obj.version = Math.round(message.version);
448
- }
449
- if (message.challenge !== void 0) {
450
- obj.challenge = Challenge.toJSON(message.challenge);
451
- }
452
- if (message.serverHmac.length !== 0) {
453
- obj.serverHmac = base64FromBytes2(message.serverHmac);
454
- }
455
- return obj;
456
- },
457
- create(base) {
458
- return ProtectedChallenge.fromPartial(base ?? {});
459
- },
460
- fromPartial(object) {
461
- const message = createBaseProtectedChallenge();
462
- message.version = object.version ?? 0;
463
- message.challenge = object.challenge !== void 0 && object.challenge !== null ? Challenge.fromPartial(object.challenge) : void 0;
464
- message.serverHmac = object.serverHmac ?? new Uint8Array(0);
465
- return message;
466
- }
467
- };
468
- function createBaseGetChallengeRequest() {
469
- return { publicKey: new Uint8Array(0) };
470
- }
471
- var GetChallengeRequest = {
472
- encode(message, writer = new BinaryWriter2()) {
473
- if (message.publicKey.length !== 0) {
474
- writer.uint32(10).bytes(message.publicKey);
475
- }
476
- return writer;
477
- },
478
- decode(input, length) {
479
- const reader = input instanceof BinaryReader2 ? input : new BinaryReader2(input);
480
- const end = length === void 0 ? reader.len : reader.pos + length;
481
- const message = createBaseGetChallengeRequest();
482
- while (reader.pos < end) {
483
- const tag = reader.uint32();
484
- switch (tag >>> 3) {
485
- case 1: {
486
- if (tag !== 10) {
487
- break;
488
- }
489
- message.publicKey = reader.bytes();
490
- continue;
491
- }
492
- }
493
- if ((tag & 7) === 4 || tag === 0) {
494
- break;
495
- }
496
- reader.skip(tag & 7);
497
- }
498
- return message;
499
- },
500
- fromJSON(object) {
501
- return { publicKey: isSet2(object.publicKey) ? bytesFromBase642(object.publicKey) : new Uint8Array(0) };
502
- },
503
- toJSON(message) {
504
- const obj = {};
505
- if (message.publicKey.length !== 0) {
506
- obj.publicKey = base64FromBytes2(message.publicKey);
507
- }
508
- return obj;
509
- },
510
- create(base) {
511
- return GetChallengeRequest.fromPartial(base ?? {});
512
- },
513
- fromPartial(object) {
514
- const message = createBaseGetChallengeRequest();
515
- message.publicKey = object.publicKey ?? new Uint8Array(0);
516
- return message;
517
- }
518
- };
519
- function createBaseGetChallengeResponse() {
520
- return { protectedChallenge: void 0 };
521
- }
522
- var GetChallengeResponse = {
523
- encode(message, writer = new BinaryWriter2()) {
524
- if (message.protectedChallenge !== void 0) {
525
- ProtectedChallenge.encode(message.protectedChallenge, writer.uint32(10).fork()).join();
526
- }
527
- return writer;
528
- },
529
- decode(input, length) {
530
- const reader = input instanceof BinaryReader2 ? input : new BinaryReader2(input);
531
- const end = length === void 0 ? reader.len : reader.pos + length;
532
- const message = createBaseGetChallengeResponse();
533
- while (reader.pos < end) {
534
- const tag = reader.uint32();
535
- switch (tag >>> 3) {
536
- case 1: {
537
- if (tag !== 10) {
538
- break;
539
- }
540
- message.protectedChallenge = ProtectedChallenge.decode(reader, reader.uint32());
541
- continue;
542
- }
543
- }
544
- if ((tag & 7) === 4 || tag === 0) {
545
- break;
546
- }
547
- reader.skip(tag & 7);
548
- }
549
- return message;
550
- },
551
- fromJSON(object) {
552
- return {
553
- protectedChallenge: isSet2(object.protectedChallenge) ? ProtectedChallenge.fromJSON(object.protectedChallenge) : void 0
554
- };
555
- },
556
- toJSON(message) {
557
- const obj = {};
558
- if (message.protectedChallenge !== void 0) {
559
- obj.protectedChallenge = ProtectedChallenge.toJSON(message.protectedChallenge);
560
- }
561
- return obj;
562
- },
563
- create(base) {
564
- return GetChallengeResponse.fromPartial(base ?? {});
565
- },
566
- fromPartial(object) {
567
- const message = createBaseGetChallengeResponse();
568
- message.protectedChallenge = object.protectedChallenge !== void 0 && object.protectedChallenge !== null ? ProtectedChallenge.fromPartial(object.protectedChallenge) : void 0;
569
- return message;
570
- }
571
- };
572
- function createBaseVerifyChallengeRequest() {
573
- return { protectedChallenge: void 0, signature: new Uint8Array(0), publicKey: new Uint8Array(0) };
574
- }
575
- var VerifyChallengeRequest = {
576
- encode(message, writer = new BinaryWriter2()) {
577
- if (message.protectedChallenge !== void 0) {
578
- ProtectedChallenge.encode(message.protectedChallenge, writer.uint32(10).fork()).join();
579
- }
580
- if (message.signature.length !== 0) {
581
- writer.uint32(18).bytes(message.signature);
582
- }
583
- if (message.publicKey.length !== 0) {
584
- writer.uint32(26).bytes(message.publicKey);
585
- }
586
- return writer;
587
- },
588
- decode(input, length) {
589
- const reader = input instanceof BinaryReader2 ? input : new BinaryReader2(input);
590
- const end = length === void 0 ? reader.len : reader.pos + length;
591
- const message = createBaseVerifyChallengeRequest();
592
- while (reader.pos < end) {
593
- const tag = reader.uint32();
594
- switch (tag >>> 3) {
595
- case 1: {
596
- if (tag !== 10) {
597
- break;
598
- }
599
- message.protectedChallenge = ProtectedChallenge.decode(reader, reader.uint32());
600
- continue;
601
- }
602
- case 2: {
603
- if (tag !== 18) {
604
- break;
605
- }
606
- message.signature = reader.bytes();
607
- continue;
608
- }
609
- case 3: {
610
- if (tag !== 26) {
611
- break;
612
- }
613
- message.publicKey = reader.bytes();
614
- continue;
615
- }
616
- }
617
- if ((tag & 7) === 4 || tag === 0) {
618
- break;
619
- }
620
- reader.skip(tag & 7);
621
- }
622
- return message;
623
- },
624
- fromJSON(object) {
625
- return {
626
- protectedChallenge: isSet2(object.protectedChallenge) ? ProtectedChallenge.fromJSON(object.protectedChallenge) : void 0,
627
- signature: isSet2(object.signature) ? bytesFromBase642(object.signature) : new Uint8Array(0),
628
- publicKey: isSet2(object.publicKey) ? bytesFromBase642(object.publicKey) : new Uint8Array(0)
629
- };
630
- },
631
- toJSON(message) {
632
- const obj = {};
633
- if (message.protectedChallenge !== void 0) {
634
- obj.protectedChallenge = ProtectedChallenge.toJSON(message.protectedChallenge);
635
- }
636
- if (message.signature.length !== 0) {
637
- obj.signature = base64FromBytes2(message.signature);
638
- }
639
- if (message.publicKey.length !== 0) {
640
- obj.publicKey = base64FromBytes2(message.publicKey);
641
- }
642
- return obj;
643
- },
644
- create(base) {
645
- return VerifyChallengeRequest.fromPartial(base ?? {});
646
- },
647
- fromPartial(object) {
648
- const message = createBaseVerifyChallengeRequest();
649
- message.protectedChallenge = object.protectedChallenge !== void 0 && object.protectedChallenge !== null ? ProtectedChallenge.fromPartial(object.protectedChallenge) : void 0;
650
- message.signature = object.signature ?? new Uint8Array(0);
651
- message.publicKey = object.publicKey ?? new Uint8Array(0);
652
- return message;
653
- }
654
- };
655
- function createBaseVerifyChallengeResponse() {
656
- return { sessionToken: "", expirationTimestamp: 0 };
657
- }
658
- var VerifyChallengeResponse = {
659
- encode(message, writer = new BinaryWriter2()) {
660
- if (message.sessionToken !== "") {
661
- writer.uint32(10).string(message.sessionToken);
662
- }
663
- if (message.expirationTimestamp !== 0) {
664
- writer.uint32(16).int64(message.expirationTimestamp);
665
- }
666
- return writer;
667
- },
668
- decode(input, length) {
669
- const reader = input instanceof BinaryReader2 ? input : new BinaryReader2(input);
670
- const end = length === void 0 ? reader.len : reader.pos + length;
671
- const message = createBaseVerifyChallengeResponse();
672
- while (reader.pos < end) {
673
- const tag = reader.uint32();
674
- switch (tag >>> 3) {
675
- case 1: {
676
- if (tag !== 10) {
677
- break;
678
- }
679
- message.sessionToken = reader.string();
680
- continue;
681
- }
682
- case 2: {
683
- if (tag !== 16) {
684
- break;
685
- }
686
- message.expirationTimestamp = longToNumber(reader.int64());
687
- continue;
688
- }
689
- }
690
- if ((tag & 7) === 4 || tag === 0) {
691
- break;
692
- }
693
- reader.skip(tag & 7);
694
- }
695
- return message;
696
- },
697
- fromJSON(object) {
698
- return {
699
- sessionToken: isSet2(object.sessionToken) ? globalThis.String(object.sessionToken) : "",
700
- expirationTimestamp: isSet2(object.expirationTimestamp) ? globalThis.Number(object.expirationTimestamp) : 0
701
- };
702
- },
703
- toJSON(message) {
704
- const obj = {};
705
- if (message.sessionToken !== "") {
706
- obj.sessionToken = message.sessionToken;
707
- }
708
- if (message.expirationTimestamp !== 0) {
709
- obj.expirationTimestamp = Math.round(message.expirationTimestamp);
710
- }
711
- return obj;
712
- },
713
- create(base) {
714
- return VerifyChallengeResponse.fromPartial(base ?? {});
715
- },
716
- fromPartial(object) {
717
- const message = createBaseVerifyChallengeResponse();
718
- message.sessionToken = object.sessionToken ?? "";
719
- message.expirationTimestamp = object.expirationTimestamp ?? 0;
720
- return message;
721
- }
722
- };
723
- var SparkAuthnServiceDefinition = {
724
- name: "SparkAuthnService",
725
- fullName: "spark_authn.SparkAuthnService",
726
- methods: {
727
- /** Request a new authentication challenge for a public key */
728
- get_challenge: {
729
- name: "get_challenge",
730
- requestType: GetChallengeRequest,
731
- requestStream: false,
732
- responseType: GetChallengeResponse,
733
- responseStream: false,
734
- options: {}
735
- },
736
- /** Verify a signed challenge and return a session token */
737
- verify_challenge: {
738
- name: "verify_challenge",
739
- requestType: VerifyChallengeRequest,
740
- requestStream: false,
741
- responseType: VerifyChallengeResponse,
742
- responseStream: false,
743
- options: {}
744
- }
745
- }
746
- };
747
- function bytesFromBase642(b64) {
748
- if (globalThis.Buffer) {
749
- return Uint8Array.from(globalThis.Buffer.from(b64, "base64"));
750
- } else {
751
- const bin = globalThis.atob(b64);
752
- const arr = new Uint8Array(bin.length);
753
- for (let i = 0; i < bin.length; ++i) {
754
- arr[i] = bin.charCodeAt(i);
755
- }
756
- return arr;
757
- }
758
- }
759
- function base64FromBytes2(arr) {
760
- if (globalThis.Buffer) {
761
- return globalThis.Buffer.from(arr).toString("base64");
762
- } else {
763
- const bin = [];
764
- arr.forEach((byte) => {
765
- bin.push(globalThis.String.fromCharCode(byte));
766
- });
767
- return globalThis.btoa(bin.join(""));
768
- }
769
- }
770
- function longToNumber(int64) {
771
- const num = globalThis.Number(int64.toString());
772
- if (num > globalThis.Number.MAX_SAFE_INTEGER) {
773
- throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER");
774
- }
775
- if (num < globalThis.Number.MIN_SAFE_INTEGER) {
776
- throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER");
777
- }
778
- return num;
779
- }
780
- function isSet2(value) {
781
- return value !== null && value !== void 0;
782
- }
783
-
784
- // src/services/connection.ts
785
- var ConnectionManager = class {
786
- config;
787
- clients = /* @__PURE__ */ new Map();
788
- tokenClients = /* @__PURE__ */ new Map();
789
- // We are going to .unref() the underlying channels for stream clients
790
- // to prevent the stream from keeping the process alive
791
- // Using a different map to avoid unforeseen problems with unary calls
792
- streamClients = /* @__PURE__ */ new Map();
793
- constructor(config) {
794
- this.config = config;
795
- }
796
- // When initializing wallet, go ahead and instantiate all clients
797
- async createClients() {
798
- await Promise.all(
799
- Object.values(this.config.getSigningOperators()).map((operator) => {
800
- this.createSparkClient(operator.address);
801
- })
802
- );
803
- }
804
- async closeConnections() {
805
- await Promise.all(
806
- Array.from(this.clients.values()).map(
807
- (client) => client.client.close?.()
808
- )
809
- );
810
- this.clients.clear();
811
- }
812
- async createMockClient(address) {
813
- const channel = await this.createChannelWithTLS(address);
814
- const isNodeChannel = "close" in channel;
815
- if (isNode && isNodeChannel && !isBun) {
816
- const grpcModule = await import("nice-grpc");
817
- const { createClient } = "default" in grpcModule ? grpcModule.default : grpcModule;
818
- const client = createClient(MockServiceDefinition, channel);
819
- return { ...client, close: () => channel.close() };
820
- } else if (!isNodeChannel) {
821
- const grpcModule = await import("nice-grpc-web");
822
- const { createClient } = "default" in grpcModule ? grpcModule.default : grpcModule;
823
- const client = createClient(MockServiceDefinition, channel);
824
- return { ...client, close: () => {
825
- } };
826
- } else {
827
- throw new Error("Channel does not have close in NodeJS environment");
828
- }
829
- }
830
- async createChannelWithTLS(address, certPath) {
831
- try {
832
- if (isNode && !isBun) {
833
- const grpcModule = await import("nice-grpc");
834
- const { ChannelCredentials, createChannel } = "default" in grpcModule ? grpcModule.default : grpcModule;
835
- if (certPath) {
836
- try {
837
- const fs = await import("fs");
838
- const cert = fs.readFileSync(certPath);
839
- return createChannel(address, ChannelCredentials.createSsl(cert));
840
- } catch (error) {
841
- console.error("Error reading certificate:", error);
842
- return createChannel(
843
- address,
844
- ChannelCredentials.createSsl(null, null, null, {
845
- rejectUnauthorized: false
846
- })
847
- );
848
- }
849
- } else {
850
- return createChannel(
851
- address,
852
- ChannelCredentials.createSsl(null, null, null, {
853
- rejectUnauthorized: false
854
- })
855
- );
856
- }
857
- } else {
858
- const grpcModule = await import("nice-grpc-web");
859
- const { createChannel, FetchTransport } = "default" in grpcModule ? grpcModule.default : grpcModule;
860
- const { XHRTransport } = await import("./xhr-transport-RH6LDRXS.js");
861
- return createChannel(
862
- address,
863
- isReactNative ? XHRTransport() : FetchTransport()
864
- );
865
- }
866
- } catch (error) {
867
- console.error("Channel creation error:", error);
868
- throw new NetworkError(
869
- "Failed to create channel",
870
- {
871
- url: address,
872
- operation: "createChannel",
873
- errorCount: 1,
874
- errors: error instanceof Error ? error.message : String(error)
875
- },
876
- error
877
- );
878
- }
879
- }
880
- async createSparkStreamClient(address, certPath) {
881
- if (this.streamClients.has(address)) {
882
- return this.streamClients.get(address).client;
883
- }
884
- const authToken = await this.authenticate(address);
885
- const channel = await this.createChannelWithTLS(address, certPath);
886
- const middleware = this.createMiddleware(address, authToken);
887
- const client = await this.createGrpcClient(
888
- SparkServiceDefinition,
889
- channel,
890
- true,
891
- middleware
892
- );
893
- this.streamClients.set(address, { client, authToken, channel });
894
- return client;
895
- }
896
- async createSparkClient(address, certPath) {
897
- if (this.clients.has(address)) {
898
- return this.clients.get(address).client;
899
- }
900
- const authToken = await this.authenticate(address);
901
- const channel = await this.createChannelWithTLS(address, certPath);
902
- const middleware = this.createMiddleware(address, authToken);
903
- const client = await this.createGrpcClient(
904
- SparkServiceDefinition,
905
- channel,
906
- true,
907
- middleware
908
- );
909
- this.clients.set(address, { client, authToken });
910
- return client;
911
- }
912
- async createSparkTokenClient(address, certPath) {
913
- if (this.tokenClients.has(address)) {
914
- return this.tokenClients.get(address).client;
915
- }
916
- const authToken = await this.authenticate(address);
917
- const channel = await this.createChannelWithTLS(address, certPath);
918
- const middleware = this.createMiddleware(address, authToken);
919
- const tokenClient = await this.createGrpcClient(
920
- SparkTokenServiceDefinition,
921
- channel,
922
- true,
923
- middleware
924
- );
925
- this.tokenClients.set(address, { client: tokenClient, authToken });
926
- return tokenClient;
927
- }
928
- async getStreamChannel(address) {
929
- return this.streamClients.get(address)?.channel;
930
- }
931
- async authenticate(address, certPath) {
932
- try {
933
- const identityPublicKey = await this.config.signer.getIdentityPublicKey();
934
- const sparkAuthnClient = await this.createSparkAuthnGrpcConnection(
935
- address,
936
- certPath
937
- );
938
- const challengeResp = await sparkAuthnClient.get_challenge({
939
- publicKey: identityPublicKey
940
- });
941
- if (!challengeResp.protectedChallenge?.challenge) {
942
- throw new AuthenticationError("Invalid challenge response", {
943
- endpoint: "get_challenge",
944
- reason: "Missing challenge in response"
945
- });
946
- }
947
- const challengeBytes = Challenge.encode(
948
- challengeResp.protectedChallenge.challenge
949
- ).finish();
950
- const hash = sha256(challengeBytes);
951
- const derSignatureBytes = await this.config.signer.signMessageWithIdentityKey(hash);
952
- const verifyResp = await sparkAuthnClient.verify_challenge({
953
- protectedChallenge: challengeResp.protectedChallenge,
954
- signature: derSignatureBytes,
955
- publicKey: identityPublicKey
956
- });
957
- sparkAuthnClient.close?.();
958
- return verifyResp.sessionToken;
959
- } catch (error) {
960
- console.error("Authentication error:", error);
961
- throw new AuthenticationError(
962
- "Authentication failed",
963
- {
964
- endpoint: "authenticate",
965
- reason: error.message
966
- },
967
- error
968
- );
969
- }
970
- }
971
- async createSparkAuthnGrpcConnection(address, certPath) {
972
- const channel = await this.createChannelWithTLS(address, certPath);
973
- const authnMiddleware = this.createAuthnMiddleware();
974
- return this.createGrpcClient(
975
- SparkAuthnServiceDefinition,
976
- channel,
977
- false,
978
- authnMiddleware
979
- );
980
- }
981
- createAuthnMiddleware() {
982
- if (isNode) {
983
- return async function* (call, options) {
984
- const metadata = Metadata(options.metadata).set(
985
- "X-Client-Env",
986
- clientEnv
987
- );
988
- return yield* call.next(call.request, {
989
- ...options,
990
- metadata
991
- });
992
- }.bind(this);
993
- } else {
994
- return async function* (call, options) {
995
- const metadata = Metadata(options.metadata).set("X-Requested-With", "XMLHttpRequest").set("X-Grpc-Web", "1").set("X-Client-Env", clientEnv).set("Content-Type", "application/grpc-web+proto");
996
- return yield* call.next(call.request, {
997
- ...options,
998
- metadata
999
- });
1000
- }.bind(this);
1001
- }
1002
- }
1003
- createMiddleware(address, authToken) {
1004
- if (isNode) {
1005
- return this.createNodeMiddleware(address, authToken);
1006
- } else {
1007
- return this.createBrowserMiddleware(address, authToken);
1008
- }
1009
- }
1010
- createNodeMiddleware(address, initialAuthToken) {
1011
- return async function* (call, options) {
1012
- const metadata = Metadata(options.metadata).set(
1013
- "X-Client-Env",
1014
- clientEnv
1015
- );
1016
- try {
1017
- return yield* call.next(call.request, {
1018
- ...options,
1019
- metadata: metadata.set(
1020
- "Authorization",
1021
- `Bearer ${this.clients.get(address)?.authToken || initialAuthToken}`
1022
- )
1023
- });
1024
- } catch (error) {
1025
- if (error.message?.includes("token has expired")) {
1026
- const newAuthToken = await this.authenticate(address);
1027
- const clientData = this.clients.get(address);
1028
- if (!clientData) {
1029
- throw new Error(`No client found for address: ${address}`);
1030
- }
1031
- clientData.authToken = newAuthToken;
1032
- return yield* call.next(call.request, {
1033
- ...options,
1034
- metadata: metadata.set("Authorization", `Bearer ${newAuthToken}`)
1035
- });
1036
- }
1037
- throw error;
1038
- }
1039
- }.bind(this);
1040
- }
1041
- createBrowserMiddleware(address, initialAuthToken) {
1042
- return async function* (call, options) {
1043
- const metadata = Metadata(options.metadata).set("X-Requested-With", "XMLHttpRequest").set("X-Grpc-Web", "1").set("X-Client-Env", clientEnv).set("Content-Type", "application/grpc-web+proto");
1044
- try {
1045
- return yield* call.next(call.request, {
1046
- ...options,
1047
- metadata: metadata.set(
1048
- "Authorization",
1049
- `Bearer ${this.clients.get(address)?.authToken || initialAuthToken}`
1050
- )
1051
- });
1052
- } catch (error) {
1053
- if (error.message?.includes("token has expired")) {
1054
- const newAuthToken = await this.authenticate(address);
1055
- const clientData = this.clients.get(address);
1056
- if (!clientData) {
1057
- throw new Error(`No client found for address: ${address}`);
1058
- }
1059
- clientData.authToken = newAuthToken;
1060
- return yield* call.next(call.request, {
1061
- ...options,
1062
- metadata: metadata.set("Authorization", `Bearer ${newAuthToken}`)
1063
- });
1064
- }
1065
- throw error;
1066
- }
1067
- }.bind(this);
1068
- }
1069
- async createGrpcClient(defintion, channel, withRetries, middleware) {
1070
- let clientFactory;
1071
- const retryOptions = {
1072
- retry: true,
1073
- retryMaxAttempts: 3
1074
- };
1075
- let options = {};
1076
- const isNodeChannel = "close" in channel;
1077
- if (isNode && isNodeChannel && !isBun) {
1078
- const grpcModule = await import("nice-grpc");
1079
- const { openTelemetryClientMiddleware } = await import("nice-grpc-opentelemetry");
1080
- const { createClientFactory } = "default" in grpcModule ? grpcModule.default : grpcModule;
1081
- clientFactory = createClientFactory();
1082
- if (withRetries) {
1083
- options = retryOptions;
1084
- clientFactory = clientFactory.use(openTelemetryClientMiddleware()).use(retryMiddleware);
1085
- }
1086
- if (middleware) {
1087
- clientFactory = clientFactory.use(middleware);
1088
- }
1089
- const client = clientFactory.create(defintion, channel, {
1090
- "*": options
1091
- });
1092
- return {
1093
- ...client,
1094
- close: channel.close.bind(channel)
1095
- };
1096
- } else if (!isNodeChannel) {
1097
- const grpcModule = await import("nice-grpc-web");
1098
- const { createClientFactory } = "default" in grpcModule ? grpcModule.default : grpcModule;
1099
- clientFactory = createClientFactory();
1100
- if (withRetries) {
1101
- options = retryOptions;
1102
- clientFactory = clientFactory.use(retryMiddleware);
1103
- }
1104
- if (middleware) {
1105
- clientFactory = clientFactory.use(middleware);
1106
- }
1107
- const client = clientFactory.create(defintion, channel, {
1108
- "*": options
1109
- });
1110
- return {
1111
- ...client,
1112
- close: void 0
1113
- };
1114
- } else {
1115
- throw new Error("Channel does not have close in NodeJS environment");
1116
- }
1117
- }
1118
- };
1119
-
1120
- export {
1121
- ConnectionManager
1122
- };