@lightsparkdev/core 0.2.0 → 0.2.2

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 (58) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/chunk-23X5L5S3.js +604 -0
  3. package/dist/chunk-4OZ5E62P.js +608 -0
  4. package/dist/chunk-5FD46UVI.js +600 -0
  5. package/dist/chunk-BAQMCJ7C.js +630 -0
  6. package/dist/chunk-GFTKZSHK.js +627 -0
  7. package/dist/chunk-I3HKDOEE.js +627 -0
  8. package/dist/chunk-J6LSW6XO.js +601 -0
  9. package/dist/chunk-JUD4MOOQ.js +608 -0
  10. package/dist/chunk-KX6HH6CX.js +629 -0
  11. package/dist/chunk-MZCDWVLH.js +634 -0
  12. package/dist/chunk-NY3BK66J.js +624 -0
  13. package/dist/chunk-Q7UUXZNC.js +26 -0
  14. package/dist/chunk-WT2HYC6Q.js +601 -0
  15. package/dist/chunk-YYVOX4YM.js +600 -0
  16. package/dist/chunk-ZUIUADXH.js +616 -0
  17. package/dist/crypto-rn-2BYOHLMG.js +72 -0
  18. package/dist/crypto-rn-2YV53C3B.js +72 -0
  19. package/dist/crypto-rn-3HFXYG7I.js +75 -0
  20. package/dist/crypto-rn-3HLWLVZS.js +76 -0
  21. package/dist/crypto-rn-3N3JTBLE.js +83 -0
  22. package/dist/crypto-rn-3OEMMMOD.js +74 -0
  23. package/dist/crypto-rn-5EZSRY5Y.js +82 -0
  24. package/dist/crypto-rn-5KM2YVOI.js +82 -0
  25. package/dist/crypto-rn-6335R2CU.js +80 -0
  26. package/dist/crypto-rn-6ZHSL7CX.js +72 -0
  27. package/dist/crypto-rn-7DWXMO2Q.js +75 -0
  28. package/dist/crypto-rn-7GTI374I.js +81 -0
  29. package/dist/crypto-rn-AXDY3LDG.js +124 -0
  30. package/dist/crypto-rn-BZ2KZ2YR.js +68 -0
  31. package/dist/crypto-rn-CAPL7MYC.js +80 -0
  32. package/dist/crypto-rn-CBAKEB7C.js +68 -0
  33. package/dist/crypto-rn-CBWHV2F5.js +82 -0
  34. package/dist/crypto-rn-CS36MQ4X.js +77 -0
  35. package/dist/crypto-rn-E4RZNGIB.js +82 -0
  36. package/dist/crypto-rn-H4NIT5CT.js +70 -0
  37. package/dist/crypto-rn-IAC27WLZ.js +74 -0
  38. package/dist/crypto-rn-LLY6FCWE.js +82 -0
  39. package/dist/crypto-rn-MOWVVG3L.js +78 -0
  40. package/dist/crypto-rn-OAPLHNM5.js +73 -0
  41. package/dist/crypto-rn-PVAG5TVH.js +80 -0
  42. package/dist/crypto-rn-QLVBL5DI.js +75 -0
  43. package/dist/crypto-rn-TBKXR3SR.js +68 -0
  44. package/dist/crypto-rn-TSQJA6A3.js +81 -0
  45. package/dist/crypto-rn-U3XEJXIM.js +77 -0
  46. package/dist/crypto-rn-UHTZEVAR.js +74 -0
  47. package/dist/crypto-rn-V3ZNQSFI.js +79 -0
  48. package/dist/crypto-rn-VGNP6VZW.js +75 -0
  49. package/dist/crypto-rn-XMYCUEGV.js +72 -0
  50. package/dist/crypto-rn-YPOTC5RI.js +73 -0
  51. package/dist/index.cjs +93 -116
  52. package/dist/index.d.ts +31 -17
  53. package/dist/index.js +92 -106
  54. package/package.json +2 -1
  55. package/src/crypto/NodeKeyCache.ts +18 -15
  56. package/src/crypto/crypto.ts +72 -78
  57. package/src/requester/Requester.ts +11 -17
  58. package/src/utils/base64.ts +51 -2
@@ -0,0 +1,616 @@
1
+ // src/LightsparkException.ts
2
+ var LightsparkException = class extends Error {
3
+ code;
4
+ message;
5
+ extraInfo;
6
+ constructor(code, message, extraInfo) {
7
+ super(message);
8
+ this.code = code;
9
+ this.message = message;
10
+ this.extraInfo = extraInfo;
11
+ }
12
+ };
13
+ var LightsparkException_default = LightsparkException;
14
+
15
+ // src/auth/LightsparkAuthException.ts
16
+ var LightsparkAuthException = class extends LightsparkException_default {
17
+ constructor(message, extraInfo) {
18
+ super("AuthException", message, extraInfo);
19
+ }
20
+ };
21
+ var LightsparkAuthException_default = LightsparkAuthException;
22
+
23
+ // src/auth/StubAuthProvider.ts
24
+ var StubAuthProvider = class {
25
+ async addAuthHeaders(headers) {
26
+ return headers;
27
+ }
28
+ async isAuthorized() {
29
+ return false;
30
+ }
31
+ async addWsConnectionParams(params) {
32
+ return params;
33
+ }
34
+ };
35
+
36
+ // src/utils/base64.ts
37
+ var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
38
+ var Base64 = {
39
+ btoa: (input = "") => {
40
+ let str = input;
41
+ let output = "";
42
+ for (let block = 0, charCode, i = 0, map = chars; str.charAt(i | 0) || (map = "=", i % 1); output += map.charAt(63 & block >> 8 - i % 1 * 8)) {
43
+ charCode = str.charCodeAt(i += 3 / 4);
44
+ if (charCode > 255) {
45
+ throw new Error("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");
46
+ }
47
+ block = block << 8 | charCode;
48
+ }
49
+ return output;
50
+ },
51
+ atob: (input = "") => {
52
+ let str = input.replace(/=+$/, "");
53
+ let output = "";
54
+ if (str.length % 4 == 1) {
55
+ throw new Error("'atob' failed: The string to be decoded is not correctly encoded.");
56
+ }
57
+ for (let bc = 0, bs = 0, buffer, i = 0; buffer = str.charAt(i++); ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0) {
58
+ buffer = chars.indexOf(buffer);
59
+ }
60
+ return output;
61
+ }
62
+ };
63
+ var b64decode = (encoded) => {
64
+ return Uint8Array.from(Base64.atob(encoded), (c) => c.charCodeAt(0));
65
+ };
66
+ var urlsafe_b64decode = (encoded) => {
67
+ return b64decode(encoded.replace(/_/g, "/").replace(/-/g, "+"));
68
+ };
69
+ var b64encode = (data) => {
70
+ return Base64.btoa(
71
+ String.fromCharCode.apply(null, Array.from(new Uint8Array(data)))
72
+ );
73
+ };
74
+
75
+ // src/crypto/LightsparkSigningException.ts
76
+ var LightsparkSigningException = class extends LightsparkException_default {
77
+ constructor(message, extraInfo) {
78
+ super("SigningException", message, extraInfo);
79
+ }
80
+ };
81
+ var LightsparkSigningException_default = LightsparkSigningException;
82
+
83
+ // src/crypto/crypto.ts
84
+ var getCrypto = () => {
85
+ let cryptoImplPromise;
86
+ if (typeof crypto !== "undefined") {
87
+ cryptoImplPromise = Promise.resolve(crypto);
88
+ } else {
89
+ cryptoImplPromise = import("crypto").then((nodeCrypto) => {
90
+ return nodeCrypto;
91
+ });
92
+ }
93
+ return cryptoImplPromise;
94
+ };
95
+ var getRandomValues32 = async (arr) => {
96
+ if (typeof crypto !== "undefined") {
97
+ return crypto.getRandomValues(arr);
98
+ } else {
99
+ const cryptoImpl = await getCrypto();
100
+ return cryptoImpl.getRandomValues(arr);
101
+ }
102
+ };
103
+ var deriveKey = async (password, salt, iterations, algorithm, bit_len) => {
104
+ const enc = new TextEncoder();
105
+ const cryptoImpl = await getCrypto();
106
+ const password_key = await cryptoImpl.subtle.importKey(
107
+ "raw",
108
+ enc.encode(password),
109
+ "PBKDF2",
110
+ false,
111
+ ["deriveBits", "deriveKey"]
112
+ );
113
+ const derived = await cryptoImpl.subtle.deriveBits(
114
+ {
115
+ name: "PBKDF2",
116
+ salt,
117
+ iterations,
118
+ hash: "SHA-256"
119
+ },
120
+ password_key,
121
+ bit_len
122
+ );
123
+ const key = await cryptoImpl.subtle.importKey(
124
+ "raw",
125
+ derived.slice(0, 32),
126
+ { name: algorithm, length: 256 },
127
+ false,
128
+ ["encrypt", "decrypt"]
129
+ );
130
+ const iv = derived.slice(32);
131
+ return [key, iv];
132
+ };
133
+ var decrypt = async (header_json, ciphertext, password) => {
134
+ var decoded = b64decode(ciphertext);
135
+ var header;
136
+ if (header_json === "AES_256_CBC_PBKDF2_5000_SHA256") {
137
+ header = {
138
+ v: 0,
139
+ i: 5e3
140
+ };
141
+ decoded = decoded.slice(8);
142
+ } else {
143
+ header = JSON.parse(header_json);
144
+ }
145
+ if (header.v < 0 || header.v > 4) {
146
+ throw new LightsparkException_default(
147
+ "DecryptionError",
148
+ "Unknown version ".concat(header.v)
149
+ );
150
+ }
151
+ const cryptoImpl = await getCrypto();
152
+ const algorithm = header.v < 2 ? "AES-CBC" : "AES-GCM";
153
+ const bit_len = header.v < 4 ? 384 : 352;
154
+ const salt_len = header.v < 4 ? 8 : 16;
155
+ if (header.lsv === 2 || header.v === 3) {
156
+ const salt = decoded.slice(decoded.length - 8, decoded.length);
157
+ const nonce = decoded.slice(0, 12);
158
+ const cipherText = decoded.slice(12, decoded.length - 8);
159
+ const [key, _iv] = await deriveKey(
160
+ password,
161
+ salt,
162
+ header.i,
163
+ algorithm,
164
+ 256
165
+ );
166
+ return await cryptoImpl.subtle.decrypt(
167
+ { name: algorithm, iv: nonce.buffer },
168
+ key,
169
+ cipherText
170
+ );
171
+ } else {
172
+ const salt = decoded.slice(0, salt_len);
173
+ const encrypted = decoded.slice(salt_len);
174
+ const [key, iv] = await deriveKey(
175
+ password,
176
+ salt,
177
+ header.i,
178
+ algorithm,
179
+ bit_len
180
+ );
181
+ return await cryptoImpl.subtle.decrypt(
182
+ { name: algorithm, iv },
183
+ key,
184
+ encrypted
185
+ );
186
+ }
187
+ };
188
+ async function decryptSecretWithNodePassword(cipher, encryptedSecret, nodePassword) {
189
+ const cryptoImpl = await getCrypto();
190
+ if (!cryptoImpl.subtle) {
191
+ return (await import("./crypto-rn-5KM2YVOI.js")).decryptSecretWithNodePassword(
192
+ cipher,
193
+ encryptedSecret,
194
+ nodePassword
195
+ );
196
+ }
197
+ let decryptedValue = null;
198
+ try {
199
+ decryptedValue = await decrypt(cipher, encryptedSecret, nodePassword);
200
+ } catch (ex) {
201
+ console.error(ex);
202
+ }
203
+ return decryptedValue;
204
+ }
205
+ var generateSigningKeyPair = async () => {
206
+ const cryptoImpl = await getCrypto();
207
+ if (!cryptoImpl.subtle) {
208
+ return (await import("./crypto-rn-5KM2YVOI.js")).generateSigningKeyPair();
209
+ }
210
+ return await cryptoImpl.subtle.generateKey(
211
+ /*algorithm:*/
212
+ {
213
+ name: "RSA-PSS",
214
+ modulusLength: 4096,
215
+ publicExponent: new Uint8Array([1, 0, 1]),
216
+ hash: "SHA-256"
217
+ },
218
+ /*extractable*/
219
+ true,
220
+ /*keyUsages*/
221
+ ["sign", "verify"]
222
+ );
223
+ };
224
+ var serializeSigningKey = async (key, format) => {
225
+ const cryptoImpl = await getCrypto();
226
+ if (!cryptoImpl.subtle) {
227
+ return (await import("./crypto-rn-5KM2YVOI.js")).serializeSigningKey(
228
+ key,
229
+ format
230
+ );
231
+ }
232
+ return await cryptoImpl.subtle.exportKey(
233
+ /*format*/
234
+ format,
235
+ /*key*/
236
+ key
237
+ );
238
+ };
239
+ var getNonce = async () => {
240
+ const cryptoImpl = await getCrypto();
241
+ if (!cryptoImpl.subtle) {
242
+ return (await import("./crypto-rn-5KM2YVOI.js")).getNonce();
243
+ }
244
+ const nonceSt = await getRandomValues32(new Uint32Array(1));
245
+ return Number(nonceSt);
246
+ };
247
+ var sign = async (key, data) => {
248
+ const cryptoImpl = await getCrypto();
249
+ if (!cryptoImpl.subtle) {
250
+ console.log(typeof key, key);
251
+ return (await import("./crypto-rn-5KM2YVOI.js")).sign(key, data);
252
+ }
253
+ return await cryptoImpl.subtle.sign(
254
+ {
255
+ name: "RSA-PSS",
256
+ saltLength: 32
257
+ },
258
+ key,
259
+ data
260
+ );
261
+ };
262
+ var importPrivateSigningKey = async (keyData, format) => {
263
+ const cryptoImpl = await getCrypto();
264
+ if (!cryptoImpl.subtle) {
265
+ return (await import("./crypto-rn-5KM2YVOI.js")).importPrivateSigningKey(
266
+ keyData,
267
+ format
268
+ );
269
+ }
270
+ return await cryptoImpl.subtle.importKey(
271
+ /*format*/
272
+ format,
273
+ /*keyData*/
274
+ keyData,
275
+ /*algorithm*/
276
+ {
277
+ name: "RSA-PSS",
278
+ hash: "SHA-256"
279
+ },
280
+ /*extractable*/
281
+ true,
282
+ /*keyUsages*/
283
+ ["sign"]
284
+ );
285
+ };
286
+ var DefaultCrypto = {
287
+ decryptSecretWithNodePassword,
288
+ generateSigningKeyPair,
289
+ serializeSigningKey,
290
+ getNonce,
291
+ sign,
292
+ importPrivateSigningKey
293
+ };
294
+
295
+ // src/crypto/NodeKeyCache.ts
296
+ import autoBind from "auto-bind";
297
+ var NodeKeyCache = class {
298
+ constructor(cryptoImpl = DefaultCrypto) {
299
+ this.cryptoImpl = cryptoImpl;
300
+ this.idToKey = /* @__PURE__ */ new Map();
301
+ autoBind(this);
302
+ }
303
+ idToKey;
304
+ async loadKey(id, rawKey, format = "pkcs8") {
305
+ const decoded = b64decode(this.stripPemTags(rawKey));
306
+ try {
307
+ const key = await this.cryptoImpl.importPrivateSigningKey(
308
+ decoded,
309
+ format
310
+ );
311
+ this.idToKey.set(id, key);
312
+ return key;
313
+ } catch (e) {
314
+ console.log("Error importing key: ", e);
315
+ }
316
+ return null;
317
+ }
318
+ getKey(id) {
319
+ return this.idToKey.get(id);
320
+ }
321
+ hasKey(id) {
322
+ return this.idToKey.has(id);
323
+ }
324
+ stripPemTags(pem) {
325
+ return pem.replace(/-----BEGIN (.*)-----/, "").replace(/-----END (.*)----/, "");
326
+ }
327
+ };
328
+ var NodeKeyCache_default = NodeKeyCache;
329
+
330
+ // src/requester/Requester.ts
331
+ import autoBind2 from "auto-bind";
332
+ import dayjs from "dayjs";
333
+ import utc from "dayjs/plugin/utc.js";
334
+ import { createClient } from "graphql-ws";
335
+ import NodeWebSocket from "ws";
336
+ import { Observable } from "zen-observable-ts";
337
+
338
+ // src/utils/environment.ts
339
+ var isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined";
340
+ var isNode = typeof process !== "undefined" && process.versions != null && process.versions.node != null;
341
+
342
+ // src/requester/Requester.ts
343
+ var DEFAULT_BASE_URL = "api.lightspark.com";
344
+ var LIGHTSPARK_BETA_HEADER_KEY = "X-Lightspark-Beta";
345
+ var LIGHTSPARK_BETA_HEADER_VALUE = "z2h0BBYxTA83cjW7fi8QwWtBPCzkQKiemcuhKY08LOo";
346
+ dayjs.extend(utc);
347
+ var Requester = class {
348
+ constructor(nodeKeyCache, schemaEndpoint, sdkUserAgent, authProvider = new StubAuthProvider(), baseUrl = DEFAULT_BASE_URL, cryptoImpl = DefaultCrypto) {
349
+ this.nodeKeyCache = nodeKeyCache;
350
+ this.schemaEndpoint = schemaEndpoint;
351
+ this.sdkUserAgent = sdkUserAgent;
352
+ this.authProvider = authProvider;
353
+ this.baseUrl = baseUrl;
354
+ this.cryptoImpl = cryptoImpl;
355
+ let websocketImpl;
356
+ if (typeof WebSocket === "undefined" && typeof window === "undefined") {
357
+ websocketImpl = NodeWebSocket;
358
+ }
359
+ this.wsClient = createClient({
360
+ url: `wss://${this.baseUrl}/${this.schemaEndpoint}`,
361
+ connectionParams: () => authProvider.addWsConnectionParams({}),
362
+ webSocketImpl: websocketImpl
363
+ });
364
+ autoBind2(this);
365
+ }
366
+ wsClient;
367
+ async executeQuery(query) {
368
+ const data = await this.makeRawRequest(
369
+ query.queryPayload,
370
+ query.variables || {},
371
+ query.signingNodeId
372
+ );
373
+ return query.constructObject(data);
374
+ }
375
+ subscribe(queryPayload, variables = {}) {
376
+ const operationNameRegex = /^\s*(query|mutation|subscription)\s+(\w+)/i;
377
+ const operationMatch = queryPayload.match(operationNameRegex);
378
+ if (!operationMatch || operationMatch.length < 3) {
379
+ throw new LightsparkException_default("InvalidQuery", "Invalid query payload");
380
+ }
381
+ const operationType = operationMatch[1];
382
+ if (operationType == "mutation") {
383
+ throw new LightsparkException_default(
384
+ "InvalidQuery",
385
+ "Mutation queries should call makeRawRequest instead"
386
+ );
387
+ }
388
+ for (const key in variables) {
389
+ if (variables[key] === void 0) {
390
+ variables[key] = null;
391
+ }
392
+ }
393
+ const operation = operationMatch[2];
394
+ let bodyData = {
395
+ query: queryPayload,
396
+ variables,
397
+ operationName: operation
398
+ };
399
+ return new Observable(
400
+ (observer) => this.wsClient.subscribe(bodyData, {
401
+ next: (data) => observer.next(data),
402
+ error: (err) => observer.error(err),
403
+ complete: () => observer.complete()
404
+ })
405
+ );
406
+ }
407
+ async makeRawRequest(queryPayload, variables = {}, signingNodeId = void 0) {
408
+ const operationNameRegex = /^\s*(query|mutation|subscription)\s+(\w+)/i;
409
+ const operationMatch = queryPayload.match(operationNameRegex);
410
+ if (!operationMatch || operationMatch.length < 3) {
411
+ throw new LightsparkException_default("InvalidQuery", "Invalid query payload");
412
+ }
413
+ const operationType = operationMatch[1];
414
+ if (operationType == "subscription") {
415
+ throw new LightsparkException_default(
416
+ "InvalidQuery",
417
+ "Subscription queries should call subscribe instead"
418
+ );
419
+ }
420
+ for (const key in variables) {
421
+ if (variables[key] === void 0) {
422
+ variables[key] = null;
423
+ }
424
+ }
425
+ const operation = operationMatch[2];
426
+ let bodyData = {
427
+ query: queryPayload,
428
+ variables,
429
+ operationName: operation
430
+ };
431
+ const browserUserAgent = typeof navigator !== "undefined" ? navigator.userAgent : "";
432
+ const sdkUserAgent = this.getSdkUserAgent();
433
+ const headers = await this.authProvider.addAuthHeaders({
434
+ "Content-Type": "application/json",
435
+ [LIGHTSPARK_BETA_HEADER_KEY]: LIGHTSPARK_BETA_HEADER_VALUE,
436
+ "X-Lightspark-SDK": sdkUserAgent,
437
+ "User-Agent": browserUserAgent || sdkUserAgent
438
+ });
439
+ bodyData = await this.addSigningDataIfNeeded(
440
+ bodyData,
441
+ headers,
442
+ signingNodeId
443
+ );
444
+ const response = await fetch(
445
+ `https://${this.baseUrl}/${this.schemaEndpoint}`,
446
+ {
447
+ method: "POST",
448
+ headers,
449
+ body: JSON.stringify(bodyData)
450
+ }
451
+ );
452
+ if (!response.ok) {
453
+ throw new LightsparkException_default(
454
+ "RequestFailed",
455
+ `Request ${operation} failed. ${response.statusText}`
456
+ );
457
+ }
458
+ const responseJson = await response.json();
459
+ const data = responseJson.data;
460
+ if (!data) {
461
+ throw new LightsparkException_default(
462
+ "RequestFailed",
463
+ `Request ${operation} failed. ${JSON.stringify(responseJson.errors)}`
464
+ );
465
+ }
466
+ return data;
467
+ }
468
+ getSdkUserAgent() {
469
+ const platform = isNode ? "NodeJS" : "Browser";
470
+ const platformVersion = isNode ? process.version : "";
471
+ return `${this.sdkUserAgent} ${platform}/${platformVersion}`;
472
+ }
473
+ async addSigningDataIfNeeded(queryPayload, headers, signingNodeId) {
474
+ if (!signingNodeId) {
475
+ return queryPayload;
476
+ }
477
+ const query = queryPayload.query;
478
+ const variables = queryPayload.variables;
479
+ const operationName = queryPayload.operationName;
480
+ const nonce = await this.cryptoImpl.getNonce();
481
+ const expiration = dayjs.utc().add(1, "hour").format();
482
+ const payload = {
483
+ query,
484
+ variables,
485
+ operationName,
486
+ nonce,
487
+ expires_at: expiration
488
+ };
489
+ const key = await this.nodeKeyCache.getKey(signingNodeId);
490
+ if (!key) {
491
+ throw new LightsparkSigningException_default(
492
+ "Missing node of encrypted_signing_private_key"
493
+ );
494
+ }
495
+ if (typeof TextEncoder === "undefined") {
496
+ const TextEncoder2 = (await import("text-encoding")).TextEncoder;
497
+ }
498
+ ;
499
+ const encodedPayload = new TextEncoder().encode(JSON.stringify(payload));
500
+ const signedPayload = await this.cryptoImpl.sign(key, encodedPayload);
501
+ const encodedSignedPayload = b64encode(signedPayload);
502
+ headers["X-Lightspark-Signing"] = JSON.stringify({
503
+ v: "1",
504
+ signature: encodedSignedPayload
505
+ });
506
+ return payload;
507
+ }
508
+ };
509
+ var Requester_default = Requester;
510
+
511
+ // src/ServerEnvironment.ts
512
+ var ServerEnvironment = /* @__PURE__ */ ((ServerEnvironment2) => {
513
+ ServerEnvironment2["PRODUCTION"] = "production";
514
+ ServerEnvironment2["DEV"] = "dev";
515
+ return ServerEnvironment2;
516
+ })(ServerEnvironment || {});
517
+ var apiDomainForEnvironment = (environment) => {
518
+ switch (environment) {
519
+ case "dev" /* DEV */:
520
+ return "api.dev.dev.sparkinfra.net";
521
+ case "production" /* PRODUCTION */:
522
+ return "api.lightspark.com";
523
+ }
524
+ };
525
+ var ServerEnvironment_default = ServerEnvironment;
526
+
527
+ // src/utils/currency.ts
528
+ var CONVERSION_MAP = {
529
+ ["BITCOIN" /* BITCOIN */]: {
530
+ ["BITCOIN" /* BITCOIN */]: (v) => v,
531
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v * 1e6,
532
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v * 1e3,
533
+ ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 1e11,
534
+ ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v * 1e9,
535
+ ["SATOSHI" /* SATOSHI */]: (v) => v * 1e8
536
+ },
537
+ ["MICROBITCOIN" /* MICROBITCOIN */]: {
538
+ ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e6),
539
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v,
540
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => Math.round(v / 1e3),
541
+ ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 1e5,
542
+ ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v * 1e3,
543
+ ["SATOSHI" /* SATOSHI */]: (v) => v * 100
544
+ },
545
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: {
546
+ ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e3),
547
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => v * 1e3,
548
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => v,
549
+ ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 1e8,
550
+ ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v * 1e6,
551
+ ["SATOSHI" /* SATOSHI */]: (v) => v * 1e5
552
+ },
553
+ ["MILLISATOSHI" /* MILLISATOSHI */]: {
554
+ ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e11),
555
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => Math.round(v / 1e5),
556
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => Math.round(v / 1e8),
557
+ ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v,
558
+ ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => Math.round(v / 100),
559
+ ["SATOSHI" /* SATOSHI */]: (v) => Math.round(v / 1e3)
560
+ },
561
+ ["NANOBITCOIN" /* NANOBITCOIN */]: {
562
+ ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e9),
563
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => Math.round(v / 1e3),
564
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => Math.round(v / 1e6),
565
+ ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 100,
566
+ ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v,
567
+ ["SATOSHI" /* SATOSHI */]: (v) => Math.round(v / 10)
568
+ },
569
+ ["SATOSHI" /* SATOSHI */]: {
570
+ ["BITCOIN" /* BITCOIN */]: (v) => Math.round(v / 1e8),
571
+ ["MICROBITCOIN" /* MICROBITCOIN */]: (v) => Math.round(v / 100),
572
+ ["MILLIBITCOIN" /* MILLIBITCOIN */]: (v) => Math.round(v / 1e5),
573
+ ["MILLISATOSHI" /* MILLISATOSHI */]: (v) => v * 1e3,
574
+ ["NANOBITCOIN" /* NANOBITCOIN */]: (v) => v * 10,
575
+ ["SATOSHI" /* SATOSHI */]: (v) => v
576
+ }
577
+ };
578
+ var convertCurrencyAmount = (from, toUnit) => {
579
+ const conversionFn = CONVERSION_MAP[from.originalUnit][toUnit];
580
+ if (!conversionFn) {
581
+ throw new LightsparkException_default(
582
+ "CurrencyError",
583
+ `Cannot convert from ${from.originalUnit} to ${toUnit}`
584
+ );
585
+ }
586
+ return {
587
+ ...from,
588
+ preferredCurrencyUnit: toUnit,
589
+ preferredCurrencyValueApprox: conversionFn(from.originalValue),
590
+ preferredCurrencyValueRounded: conversionFn(from.originalValue)
591
+ };
592
+ };
593
+
594
+ // src/utils/types.ts
595
+ var isType = (typename) => (node) => {
596
+ return node?.__typename === typename;
597
+ };
598
+
599
+ export {
600
+ LightsparkException_default,
601
+ LightsparkAuthException_default,
602
+ StubAuthProvider,
603
+ b64decode,
604
+ urlsafe_b64decode,
605
+ b64encode,
606
+ LightsparkSigningException_default,
607
+ DefaultCrypto,
608
+ NodeKeyCache_default,
609
+ isBrowser,
610
+ isNode,
611
+ Requester_default,
612
+ apiDomainForEnvironment,
613
+ ServerEnvironment_default,
614
+ convertCurrencyAmount,
615
+ isType
616
+ };
@@ -0,0 +1,72 @@
1
+ import {
2
+ LightsparkException_default,
3
+ LightsparkSigningException_default
4
+ } from "./chunk-Q7UUXZNC.js";
5
+
6
+ // src/crypto/crypto-rn.ts
7
+ import QuickCrypto from "react-native-quick-crypto";
8
+ var qCrypto = QuickCrypto;
9
+ var getRandomValues32 = async (arr) => {
10
+ return qCrypto.getRandomValues(arr);
11
+ };
12
+ async function decryptSecretWithNodePassword(cipher, encryptedSecret, nodePassword) {
13
+ throw new LightsparkException_default(
14
+ "NOT_IMPLEMENTED",
15
+ "Recovering the signing key is not yet supported in React Native."
16
+ );
17
+ }
18
+ var generateSigningKeyPair = async () => {
19
+ return new Promise((resolve, reject) => {
20
+ console.info("Generating signing key pair");
21
+ const keypair = qCrypto.generateKeyPairSync("rsa-pss", {
22
+ modulusLength: 4096,
23
+ publicKeyEncoding: {
24
+ type: "spki",
25
+ format: "pem"
26
+ },
27
+ privateKeyEncoding: {
28
+ type: "pkcs8",
29
+ format: "pem"
30
+ }
31
+ });
32
+ resolve({
33
+ publicKey: keypair.publicKey.slice(27, keypair.publicKey.length - 25),
34
+ privateKey: keypair.privateKey.slice(28, keypair.publicKey.length - 26)
35
+ });
36
+ });
37
+ };
38
+ var serializeSigningKey = async (key, format) => {
39
+ throw new LightsparkException_default(
40
+ "NOT_IMPLEMENTED",
41
+ "Cannot serialize a signing key in React Native. The keys you get from generateSigningKeyPair are already serialized buffers."
42
+ );
43
+ };
44
+ var getNonce = async () => {
45
+ const nonceSt = await getRandomValues32(new Uint32Array(1));
46
+ return Number(nonceSt);
47
+ };
48
+ var sign = (key, data) => {
49
+ return new Promise((resolve, reject) => {
50
+ console.info("Signing data");
51
+ const sign2 = qCrypto.createSign("SHA256");
52
+ sign2.update(data, "utf8");
53
+ const signature = sign2.sign({
54
+ key: Buffer.from(key),
55
+ padding: qCrypto.constants.RSA_PKCS1_PSS_PADDING,
56
+ saltLength: qCrypto.constants.RSA_PSS_SALTLEN_MAX_SIGN
57
+ });
58
+ resolve(signature);
59
+ });
60
+ };
61
+ var importPrivateSigningKey = async (keyData, format) => {
62
+ return Promise.resolve(keyData);
63
+ };
64
+ export {
65
+ LightsparkSigningException_default as LightsparkSigningException,
66
+ decryptSecretWithNodePassword,
67
+ generateSigningKeyPair,
68
+ getNonce,
69
+ importPrivateSigningKey,
70
+ serializeSigningKey,
71
+ sign
72
+ };