@fedimint/core-web 0.0.6 → 0.0.7

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 (64) hide show
  1. package/README.md +6 -71
  2. package/dist/{FedimintWallet.d.ts → dts/FedimintWallet.d.ts} +2 -2
  3. package/dist/dts/FedimintWallet.d.ts.map +1 -0
  4. package/dist/dts/index.d.ts +3 -0
  5. package/dist/dts/index.d.ts.map +1 -0
  6. package/dist/{services → dts/services}/BalanceService.d.ts +5 -4
  7. package/dist/dts/services/BalanceService.d.ts.map +1 -0
  8. package/dist/{services → dts/services}/FederationService.d.ts +1 -1
  9. package/dist/dts/services/FederationService.d.ts.map +1 -0
  10. package/dist/dts/services/LightningService.d.ts +21 -0
  11. package/dist/dts/services/LightningService.d.ts.map +1 -0
  12. package/dist/{services → dts/services}/MintService.d.ts +6 -5
  13. package/dist/dts/services/MintService.d.ts.map +1 -0
  14. package/dist/{services → dts/services}/RecoveryService.d.ts +1 -1
  15. package/dist/dts/services/RecoveryService.d.ts.map +1 -0
  16. package/dist/dts/services/index.d.ts.map +1 -0
  17. package/dist/dts/types/index.d.ts +4 -0
  18. package/dist/dts/types/index.d.ts.map +1 -0
  19. package/dist/dts/types/utils.d.ts +16 -0
  20. package/dist/dts/types/utils.d.ts.map +1 -0
  21. package/dist/{types → dts/types}/wallet.d.ts +4 -14
  22. package/dist/dts/types/wallet.d.ts.map +1 -0
  23. package/dist/dts/types/worker.d.ts +4 -0
  24. package/dist/dts/types/worker.d.ts.map +1 -0
  25. package/dist/dts/utils/logger.d.ts.map +1 -0
  26. package/dist/{worker → dts/worker}/WorkerClient.d.ts +3 -3
  27. package/dist/dts/worker/WorkerClient.d.ts.map +1 -0
  28. package/dist/dts/worker/index.d.ts.map +1 -0
  29. package/dist/index.d.ts +298 -5
  30. package/dist/index.js +1 -1
  31. package/dist/index.js.map +1 -1
  32. package/package.json +8 -5
  33. package/src/FedimintWallet.ts +10 -10
  34. package/src/index.ts +2 -22
  35. package/src/services/BalanceService.ts +5 -4
  36. package/src/services/FederationService.ts +1 -1
  37. package/src/services/LightningService.test.ts +83 -37
  38. package/src/services/LightningService.ts +68 -40
  39. package/src/services/MintService.test.ts +8 -1
  40. package/src/services/MintService.ts +6 -5
  41. package/src/services/RecoveryService.ts +1 -1
  42. package/src/test/crypto.ts +44 -0
  43. package/src/types/index.ts +3 -0
  44. package/src/types/utils.ts +25 -0
  45. package/src/types/wallet.ts +4 -23
  46. package/src/types/worker.ts +12 -0
  47. package/src/worker/WorkerClient.ts +25 -18
  48. package/src/worker/worker.test.ts +1 -1
  49. package/dist/FedimintWallet.d.ts.map +0 -1
  50. package/dist/index.d.ts.map +0 -1
  51. package/dist/services/BalanceService.d.ts.map +0 -1
  52. package/dist/services/FederationService.d.ts.map +0 -1
  53. package/dist/services/LightningService.d.ts +0 -18
  54. package/dist/services/LightningService.d.ts.map +0 -1
  55. package/dist/services/MintService.d.ts.map +0 -1
  56. package/dist/services/RecoveryService.d.ts.map +0 -1
  57. package/dist/services/index.d.ts.map +0 -1
  58. package/dist/types/wallet.d.ts.map +0 -1
  59. package/dist/utils/logger.d.ts.map +0 -1
  60. package/dist/worker/WorkerClient.d.ts.map +0 -1
  61. package/dist/worker/index.d.ts.map +0 -1
  62. /package/dist/{services → dts/services}/index.d.ts +0 -0
  63. /package/dist/{utils → dts/utils}/logger.d.ts +0 -0
  64. /package/dist/{worker → dts/worker}/index.d.ts +0 -0
@@ -1,5 +1,6 @@
1
1
  import { expect } from 'vitest'
2
2
  import { walletTest } from '../test/setupTests'
3
+ import { keyPair } from '../test/crypto'
3
4
 
4
5
  walletTest(
5
6
  'createInvoice should create a bolt11 invoice',
@@ -25,6 +26,18 @@ walletTest(
25
26
  },
26
27
  )
27
28
 
29
+ walletTest('createInvoice with expiry', async ({ wallet }) => {
30
+ expect(wallet).toBeDefined()
31
+ expect(wallet.isOpen()).toBe(true)
32
+
33
+ const invoice = await wallet.lightning.createInvoice(100, 'test', 1000, {})
34
+ expect(invoice).toBeDefined()
35
+ expect(invoice).toMatchObject({
36
+ invoice: expect.any(String),
37
+ operation_id: expect.any(String),
38
+ })
39
+ })
40
+
28
41
  walletTest(
29
42
  'listGateways should return a list of gateways',
30
43
  async ({ wallet }) => {
@@ -74,42 +87,6 @@ walletTest('getGateway should return a gateway', async ({ wallet }) => {
74
87
  })
75
88
  })
76
89
 
77
- walletTest(
78
- 'createInvoiceWithGateway should create a bolt11 invoice with a gateway',
79
- async ({ wallet }) => {
80
- expect(wallet).toBeDefined()
81
- expect(wallet.isOpen()).toBe(true)
82
-
83
- const gateways = await wallet.lightning.listGateways()
84
- const gateway = gateways[0]
85
- expect(gateway).toBeDefined()
86
-
87
- const counterBefore = wallet.testing.getRequestCounter()
88
- const invoice = await wallet.lightning.createInvoiceWithGateway(
89
- 100,
90
- 'test',
91
- null,
92
- {},
93
- gateway.info,
94
- )
95
- expect(invoice).toBeDefined()
96
- expect(invoice).toMatchObject({
97
- invoice: expect.any(String),
98
- operation_id: expect.any(String),
99
- })
100
- expect(wallet.testing.getRequestCounter()).toBe(counterBefore + 1)
101
- await expect(
102
- wallet.lightning.createInvoiceWithGateway(
103
- 100,
104
- 'test',
105
- 1000,
106
- {},
107
- gateway.info,
108
- ),
109
- ).resolves.toBeDefined()
110
- },
111
- )
112
-
113
90
  walletTest(
114
91
  'payInvoice should throw on insufficient funds',
115
92
  async ({ wallet }) => {
@@ -126,7 +103,7 @@ walletTest(
126
103
  const counterBefore = wallet.testing.getRequestCounter()
127
104
  // Insufficient funds
128
105
  try {
129
- await wallet.lightning.payInvoice(invoice.invoice, {})
106
+ await wallet.lightning.payInvoice(invoice.invoice)
130
107
  expect.unreachable('Should throw error')
131
108
  } catch (error) {
132
109
  expect(error).toBeDefined()
@@ -166,3 +143,72 @@ walletTest(
166
143
  })
167
144
  },
168
145
  )
146
+
147
+ walletTest(
148
+ 'createInvoiceTweaked should create a bolt11 invoice with a tweaked public key',
149
+ async ({ wallet }) => {
150
+ expect(wallet).toBeDefined()
151
+ expect(wallet.isOpen()).toBe(true)
152
+
153
+ // Make an ephemeral key pair
154
+ const { publicKey, secretKey } = keyPair()
155
+ const tweak = 1
156
+
157
+ // Create an invoice paying to the tweaked public key
158
+ const invoice = await wallet.lightning.createInvoiceTweaked(
159
+ 1000,
160
+ 'test tweaked',
161
+ publicKey,
162
+ tweak,
163
+ )
164
+ expect(invoice).toBeDefined()
165
+ expect(invoice).toMatchObject({
166
+ invoice: expect.any(String),
167
+ operation_id: expect.any(String),
168
+ })
169
+ },
170
+ )
171
+
172
+ walletTest(
173
+ 'scanReceivesForTweaks should return the operation id, ',
174
+ async ({ wallet }) => {
175
+ expect(wallet).toBeDefined()
176
+ expect(wallet.isOpen()).toBe(true)
177
+
178
+ // Make an ephemeral key pair
179
+ const { publicKey, secretKey } = keyPair()
180
+ const tweak = 1
181
+
182
+ // Create an invoice paying to the tweaked public key
183
+ const invoice = await wallet.lightning.createInvoiceTweaked(
184
+ 1000,
185
+ 'test tweaked',
186
+ publicKey,
187
+ tweak,
188
+ )
189
+ await expect(
190
+ wallet.testing.payWithFaucet(invoice.invoice),
191
+ ).resolves.toBeDefined()
192
+
193
+ // Scan for the receive
194
+ const operationIds = await wallet.lightning.scanReceivesForTweaks(
195
+ secretKey,
196
+ [tweak],
197
+ {},
198
+ )
199
+ expect(operationIds).toBeDefined()
200
+ expect(operationIds).toHaveLength(1)
201
+
202
+ // Subscribe to claiming the receive
203
+ const subscription = await wallet.lightning.subscribeLnClaim(
204
+ operationIds[0],
205
+ (state) => {
206
+ expect(state).toBeDefined()
207
+ expect(state).toMatchObject({
208
+ state: 'claimed',
209
+ })
210
+ },
211
+ )
212
+ expect(subscription).toBeDefined()
213
+ },
214
+ )
@@ -1,5 +1,5 @@
1
1
  import { WorkerClient } from '../worker'
2
- import {
2
+ import type {
3
3
  CreateBolt11Response,
4
4
  GatewayInfo,
5
5
  JSONObject,
@@ -7,75 +7,103 @@ import {
7
7
  LightningGateway,
8
8
  LnPayState,
9
9
  LnReceiveState,
10
+ MSats,
10
11
  OutgoingLightningPayment,
11
- } from '../types/wallet'
12
+ } from '../types'
12
13
 
13
14
  export class LightningService {
14
15
  constructor(private client: WorkerClient) {}
15
16
 
16
- async createInvoiceWithGateway(
17
- amount: number,
17
+ async createInvoice(
18
+ amount: MSats,
18
19
  description: string,
19
- expiryTime: number | null = null,
20
- extraMeta: JSONObject = {},
21
- gatewayInfo: GatewayInfo,
22
- ) {
20
+ expiryTime?: number, // in seconds
21
+ extraMeta?: JSONObject,
22
+ gatewayInfo?: GatewayInfo,
23
+ ): Promise<CreateBolt11Response> {
24
+ const gateway = gatewayInfo ?? (await this._getDefaultGatewayInfo())
23
25
  return await this.client.rpcSingle('ln', 'create_bolt11_invoice', {
24
26
  amount,
25
27
  description,
26
- expiry_time: expiryTime,
27
- extra_meta: extraMeta,
28
- gateway: gatewayInfo,
28
+ expiry_time: expiryTime ?? null,
29
+ extra_meta: extraMeta ?? {},
30
+ gateway,
29
31
  })
30
32
  }
31
33
 
32
- async createInvoice(
33
- amount: number,
34
+ async createInvoiceTweaked(
35
+ amount: MSats,
34
36
  description: string,
35
- expiryTime: number | null = null,
36
- extraMeta: JSONObject = {},
37
+ tweakKey: string,
38
+ index: number,
39
+ expiryTime?: number, // in seconds
40
+ gatewayInfo?: GatewayInfo,
41
+ extraMeta?: JSONObject,
37
42
  ): Promise<CreateBolt11Response> {
38
- await this.updateGatewayCache()
39
- const gateway = await this._getDefaultGatewayInfo()
40
- return await this.client.rpcSingle('ln', 'create_bolt11_invoice', {
41
- amount,
42
- description,
43
- expiry_time: expiryTime,
44
- extra_meta: extraMeta,
45
- gateway: gateway.info,
46
- })
43
+ const gateway = gatewayInfo ?? (await this._getDefaultGatewayInfo())
44
+ return await this.client.rpcSingle(
45
+ 'ln',
46
+ 'create_bolt11_invoice_for_user_tweaked',
47
+ {
48
+ amount,
49
+ description,
50
+ expiry_time: expiryTime ?? null,
51
+ user_key: tweakKey,
52
+ index,
53
+ extra_meta: extraMeta ?? {},
54
+ gateway,
55
+ },
56
+ )
47
57
  }
48
58
 
49
- async payInvoiceWithGateway(
50
- invoice: string,
51
- gatewayInfo: GatewayInfo,
52
- extraMeta: JSONObject = {},
53
- ) {
54
- return await this.client.rpcSingle('ln', 'pay_bolt11_invoice', {
55
- maybe_gateway: gatewayInfo,
56
- invoice,
57
- extra_meta: extraMeta,
59
+ // Returns the operation ids of payments received to the tweaks of the user secret key
60
+ async scanReceivesForTweaks(
61
+ tweakKey: string,
62
+ indices: number[],
63
+ extraMeta?: JSONObject,
64
+ ): Promise<string[]> {
65
+ return await this.client.rpcSingle('ln', 'scan_receive_for_user_tweaked', {
66
+ user_key: tweakKey,
67
+ indices,
68
+ extra_meta: extraMeta ?? {},
58
69
  })
59
70
  }
60
71
 
61
- private async _getDefaultGatewayInfo(): Promise<LightningGateway> {
72
+ private async _getDefaultGatewayInfo(): Promise<GatewayInfo> {
73
+ await this.updateGatewayCache()
62
74
  const gateways = await this.listGateways()
63
- return gateways[0]
75
+ return gateways[0]?.info
64
76
  }
65
77
 
66
78
  async payInvoice(
67
79
  invoice: string,
68
- extraMeta: JSONObject = {},
80
+ gatewayInfo?: GatewayInfo,
81
+ extraMeta?: JSONObject,
69
82
  ): Promise<OutgoingLightningPayment> {
70
- await this.updateGatewayCache()
71
- const gateway = await this._getDefaultGatewayInfo()
83
+ const gateway = gatewayInfo ?? (await this._getDefaultGatewayInfo())
72
84
  return await this.client.rpcSingle('ln', 'pay_bolt11_invoice', {
73
- maybe_gateway: gateway.info,
85
+ maybe_gateway: gateway,
74
86
  invoice,
75
- extra_meta: extraMeta,
87
+ extra_meta: extraMeta ?? {},
76
88
  })
77
89
  }
78
90
 
91
+ subscribeLnClaim(
92
+ operationId: string,
93
+ onSuccess: (state: LnReceiveState) => void = () => {},
94
+ onError: (error: string) => void = () => {},
95
+ ) {
96
+ const unsubscribe = this.client.rpcStream(
97
+ 'ln',
98
+ 'subscribe_ln_claim',
99
+ { operation_id: operationId },
100
+ onSuccess,
101
+ onError,
102
+ )
103
+
104
+ return unsubscribe
105
+ }
106
+
79
107
  subscribeLnPay(
80
108
  operationId: string,
81
109
  onSuccess: (state: LnPayState) => void = () => {},
@@ -9,7 +9,7 @@ walletTest('redeemEcash should error on invalid ecash', async ({ wallet }) => {
9
9
  })
10
10
 
11
11
  walletTest(
12
- 'reissueExternalNotes should reissue external notes',
12
+ 'reissueExternalNotes should throw if wallet is empty',
13
13
  async ({ wallet }) => {
14
14
  expect(wallet).toBeDefined()
15
15
  expect(wallet.isOpen()).toBe(true)
@@ -17,3 +17,10 @@ walletTest(
17
17
  await expect(wallet.mint.reissueExternalNotes('test')).rejects.toThrow()
18
18
  },
19
19
  )
20
+
21
+ walletTest('spendNotes should throw if wallet is empty', async ({ wallet }) => {
22
+ expect(wallet).toBeDefined()
23
+ expect(wallet.isOpen()).toBe(true)
24
+
25
+ await expect(wallet.mint.spendNotes(100)).rejects.toThrow()
26
+ })
@@ -1,11 +1,12 @@
1
1
  import { WorkerClient } from '../worker'
2
- import {
2
+ import type {
3
3
  Duration,
4
4
  JSONObject,
5
5
  JSONValue,
6
6
  MintSpendNotesResponse,
7
+ MSats,
7
8
  ReissueExternalNotesState,
8
- } from '../types/wallet'
9
+ } from '../types'
9
10
 
10
11
  export class MintService {
11
12
  constructor(private client: WorkerClient) {}
@@ -44,12 +45,12 @@ export class MintService {
44
45
  }
45
46
 
46
47
  async spendNotes(
47
- minAmount: number,
48
+ minAmount: MSats,
48
49
  // Tells the wallet to automatically try to cancel the spend if it hasn't completed
49
50
  // after the specified number of milliseconds.
50
51
  // If the receiver has already redeemed the notes at this time,
51
52
  // the notes will not be cancelled
52
- tryCancelAfter: number | Duration = 0,
53
+ tryCancelAfter: number | Duration = 0, // in seconds or Duration object
53
54
  includeInvite: boolean = false,
54
55
  extraMeta: JSONValue = {},
55
56
  ): Promise<MintSpendNotesResponse> {
@@ -77,7 +78,7 @@ export class MintService {
77
78
  }
78
79
  }
79
80
 
80
- async validateNotes(oobNotes: string): Promise<number> {
81
+ async parseNotes(oobNotes: string): Promise<MSats> {
81
82
  return await this.client.rpcSingle('mint', 'validate_notes', {
82
83
  oob_notes: oobNotes,
83
84
  })
@@ -1,4 +1,4 @@
1
- import { JSONValue } from '../types/wallet'
1
+ import type { JSONValue } from '../types'
2
2
  import { WorkerClient } from '../worker'
3
3
 
4
4
  export class RecoveryService {
@@ -0,0 +1,44 @@
1
+ import * as secp256k1 from 'secp256k1'
2
+
3
+ const randomBytes = (size: number): Uint8Array => {
4
+ const array = new Uint8Array(size)
5
+ window.crypto.getRandomValues(array)
6
+ return array
7
+ }
8
+
9
+ interface KeyPair {
10
+ secretKey: string
11
+ publicKey: string
12
+ }
13
+
14
+ export const keyPair = (secretKey?: Uint8Array): KeyPair => {
15
+ const privateKey: Uint8Array = secretKey
16
+ ? validatePrivateKey(secretKey)
17
+ : generatePrivateKey()
18
+
19
+ const publicKey = secp256k1.publicKeyCreate(privateKey)
20
+
21
+ return {
22
+ secretKey: Array.from(privateKey)
23
+ .map((b) => b.toString(16).padStart(2, '0'))
24
+ .join(''), // Convert Uint8Array to hex string
25
+ publicKey: Array.from(publicKey)
26
+ .map((b) => b.toString(16).padStart(2, '0'))
27
+ .join(''), // Convert Uint8Array to hex string
28
+ }
29
+ }
30
+
31
+ const validatePrivateKey = (key: Uint8Array): Uint8Array => {
32
+ if (!secp256k1.privateKeyVerify(key)) {
33
+ throw new Error('Invalid private key provided')
34
+ }
35
+ return key
36
+ }
37
+
38
+ const generatePrivateKey = (): Uint8Array => {
39
+ let key: Uint8Array
40
+ do {
41
+ key = randomBytes(32)
42
+ } while (!secp256k1.privateKeyVerify(key))
43
+ return key
44
+ }
@@ -0,0 +1,3 @@
1
+ export * from './wallet'
2
+ export * from './utils'
3
+ export * from './worker'
@@ -0,0 +1,25 @@
1
+ type Alias<T> = T & {}
2
+ type Resolve<T> = T & unknown
3
+
4
+ type Seconds = Alias<number>
5
+ type Nanos = Alias<number>
6
+
7
+ type Duration = {
8
+ nanos: Nanos
9
+ secs: Seconds
10
+ }
11
+
12
+ type MSats = Alias<number>
13
+ type Sats = Alias<number>
14
+
15
+ type JSONValue =
16
+ | string
17
+ | number
18
+ | boolean
19
+ | null
20
+ | { [key: string]: JSONValue }
21
+ | JSONValue[]
22
+
23
+ type JSONObject = Record<string, JSONValue>
24
+
25
+ export { Alias, Resolve, Duration, MSats, Sats, JSONValue, JSONObject }
@@ -1,15 +1,7 @@
1
+ import { MSats, Duration, JSONValue } from './utils'
2
+
1
3
  const MODULE_KINDS = ['', 'ln', 'mint'] as const
2
4
  type ModuleKind = (typeof MODULE_KINDS)[number]
3
- type JSONValue =
4
- | string
5
- | number
6
- | boolean
7
- | null
8
- | { [key: string]: JSONValue }
9
- | JSONValue[]
10
-
11
- type JSONObject = Record<string, JSONValue>
12
-
13
5
  type GatewayInfo = {
14
6
  gateway_id: string
15
7
  api: string
@@ -21,10 +13,7 @@ type GatewayInfo = {
21
13
  type LightningGateway = {
22
14
  info: GatewayInfo
23
15
  vetted: boolean
24
- ttl: {
25
- nanos: number
26
- secs: number
27
- }
16
+ ttl: Duration
28
17
  }
29
18
 
30
19
  type RouteHint = {
@@ -38,7 +27,7 @@ type FeeToAmount = {
38
27
  type OutgoingLightningPayment = {
39
28
  payment_type: PayType
40
29
  contract_id: string
41
- fee: number
30
+ fee: MSats
42
31
  }
43
32
 
44
33
  type PayType = {
@@ -100,19 +89,12 @@ type ReissueExternalNotesState =
100
89
  | 'Done'
101
90
  | { Failed: { error: string } }
102
91
 
103
- type Duration = {
104
- nanos: number
105
- secs: number
106
- }
107
-
108
92
  type MintSpendNotesResponse = {
109
93
  notes: string
110
94
  operation_id: string
111
95
  }
112
96
 
113
97
  export {
114
- JSONValue,
115
- JSONObject,
116
98
  LightningGateway,
117
99
  RouteHint,
118
100
  FeeToAmount,
@@ -128,6 +110,5 @@ export {
128
110
  ModuleKind,
129
111
  CancelFunction,
130
112
  ReissueExternalNotesState,
131
- Duration,
132
113
  MintSpendNotesResponse,
133
114
  }
@@ -0,0 +1,12 @@
1
+ const WorkerMessageTypes = [
2
+ 'init',
3
+ 'initialized',
4
+ 'rpc',
5
+ 'log',
6
+ 'open',
7
+ 'join',
8
+ 'error',
9
+ 'unsubscribe',
10
+ ] as const
11
+
12
+ export type WorkerMessageType = (typeof WorkerMessageTypes)[number]
@@ -1,10 +1,11 @@
1
- import {
1
+ import type {
2
2
  CancelFunction,
3
3
  JSONValue,
4
4
  ModuleKind,
5
5
  StreamError,
6
6
  StreamResult,
7
- } from '../types/wallet'
7
+ WorkerMessageType,
8
+ } from '../types'
8
9
  import { logger } from '../utils/logger'
9
10
 
10
11
  // Handles communication with the wasm worker
@@ -13,7 +14,7 @@ export class WorkerClient {
13
14
  private worker: Worker
14
15
  private requestCounter = 0
15
16
  private requestCallbacks = new Map<number, (value: any) => void>()
16
- private initPromise: Promise<void> | null = null
17
+ private initPromise: Promise<boolean> | undefined = undefined
17
18
 
18
19
  constructor() {
19
20
  // Must create the URL inside the constructor for vite
@@ -65,26 +66,32 @@ export class WorkerClient {
65
66
  // TODO: Handle timeouts
66
67
  // TODO: Handle multiple errors
67
68
 
68
- sendSingleMessage(type: string, payload?: any): Promise<any> {
69
+ sendSingleMessage<
70
+ Response extends JSONValue = JSONValue,
71
+ Payload extends JSONValue = JSONValue,
72
+ >(type: WorkerMessageType, payload?: Payload): Promise<Response> {
69
73
  return new Promise((resolve, reject) => {
70
74
  const requestId = ++this.requestCounter
71
75
  logger.debug('WorkerClient - sendSingleMessage', requestId, type, payload)
72
- this.requestCallbacks.set(requestId, (response) => {
73
- this.requestCallbacks.delete(requestId)
74
- logger.debug(
75
- 'WorkerClient - sendSingleMessage - response',
76
- requestId,
77
- response,
78
- )
79
- if (response.data) resolve(response.data)
80
- else if (response.error) reject(response.error)
81
- else
82
- logger.warn(
83
- 'WorkerClient - sendSingleMessage - malformed response',
76
+ this.requestCallbacks.set(
77
+ requestId,
78
+ (response: StreamResult<Response>) => {
79
+ this.requestCallbacks.delete(requestId)
80
+ logger.debug(
81
+ 'WorkerClient - sendSingleMessage - response',
84
82
  requestId,
85
83
  response,
86
84
  )
87
- })
85
+ if (response.data) resolve(response.data)
86
+ else if (response.error) reject(response.error)
87
+ else
88
+ logger.warn(
89
+ 'WorkerClient - sendSingleMessage - malformed response',
90
+ requestId,
91
+ response,
92
+ )
93
+ },
94
+ )
88
95
  this.worker.postMessage({ type, payload, requestId })
89
96
  })
90
97
  }
@@ -215,7 +222,7 @@ export class WorkerClient {
215
222
 
216
223
  cleanup() {
217
224
  this.worker.terminate()
218
- this.initPromise = null
225
+ this.initPromise = undefined
219
226
  this.requestCallbacks.clear()
220
227
  }
221
228
 
@@ -1,7 +1,7 @@
1
1
  import { expect } from 'vitest'
2
- import { JSONObject } from '../types/wallet'
3
2
  import { TESTING_INVITE } from '../test/TestingService'
4
3
  import { workerTest } from '../test/setupTests'
4
+ import { JSONObject } from '../types'
5
5
 
6
6
  // Waits for a message of a given type from the worker
7
7
  const waitForWorkerResponse = (
@@ -1 +0,0 @@
1
- {"version":3,"file":"FedimintWallet.d.ts","sourceRoot":"","sources":["../src/FedimintWallet.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EAChB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAU,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAItD,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAc;IAEtB,OAAO,EAAE,cAAc,CAAA;IACvB,IAAI,EAAE,WAAW,CAAA;IACjB,SAAS,EAAE,gBAAgB,CAAA;IAC3B,UAAU,EAAE,iBAAiB,CAAA;IAC7B,QAAQ,EAAE,eAAe,CAAA;IAEhC,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,OAAO,CAAiB;IAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;gBACS,IAAI,GAAE,OAAe;IAkB3B,UAAU;IAMV,WAAW;IAKX,IAAI,CAAC,UAAU,GAAE,MAA4B;IAc7C,cAAc,CAClB,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAA4B;IAkB1C;;;OAGG;IACG,OAAO;IAMb,MAAM;IAIN;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,QAAQ;CAI5B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,wBAAwB,EACxB,OAAO,EACP,UAAU,EACV,oBAAoB,EACrB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,cAAc,EAAE,CAAA;AAEzB,YAAY,EACV,gBAAgB,EAChB,SAAS,EACT,WAAW,EACX,wBAAwB,EACxB,OAAO,EACP,UAAU,EACV,oBAAoB,GACrB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BalanceService.d.ts","sourceRoot":"","sources":["../../src/services/BalanceService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC;;;;GAIG;AACH,qBAAa,cAAc;IACb,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAExC;;;;;;;OAOG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC;;;;;;;;;;;;OAYG;IACH,gBAAgB,CACd,SAAS,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAe,EAC/C,OAAO,GAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAe;CAY9C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"FederationService.d.ts","sourceRoot":"","sources":["../../src/services/FederationService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,qBAAa,iBAAiB;IAChB,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAElC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;IAI/B,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAIlC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAInD,cAAc,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;CAG7C"}
@@ -1,18 +0,0 @@
1
- import { WorkerClient } from '../worker';
2
- import { CreateBolt11Response, GatewayInfo, JSONObject, JSONValue, LightningGateway, LnPayState, LnReceiveState, OutgoingLightningPayment } from '../types/wallet';
3
- export declare class LightningService {
4
- private client;
5
- constructor(client: WorkerClient);
6
- createInvoiceWithGateway(amount: number, description: string, expiryTime: (number | null) | undefined, extraMeta: JSONObject | undefined, gatewayInfo: GatewayInfo): Promise<JSONValue>;
7
- createInvoice(amount: number, description: string, expiryTime?: number | null, extraMeta?: JSONObject): Promise<CreateBolt11Response>;
8
- payInvoiceWithGateway(invoice: string, gatewayInfo: GatewayInfo, extraMeta?: JSONObject): Promise<JSONValue>;
9
- private _getDefaultGatewayInfo;
10
- payInvoice(invoice: string, extraMeta?: JSONObject): Promise<OutgoingLightningPayment>;
11
- subscribeLnPay(operationId: string, onSuccess?: (state: LnPayState) => void, onError?: (error: string) => void): import("../types/wallet").CancelFunction;
12
- subscribeLnReceive(operationId: string, onSuccess?: (state: LnReceiveState) => void, onError?: (error: string) => void): import("../types/wallet").CancelFunction;
13
- waitForReceive(operationId: string): Promise<LnReceiveState>;
14
- getGateway(gatewayId?: string | null, forceInternal?: boolean): Promise<LightningGateway | null>;
15
- listGateways(): Promise<LightningGateway[]>;
16
- updateGatewayCache(): Promise<JSONValue>;
17
- }
18
- //# sourceMappingURL=LightningService.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LightningService.d.ts","sourceRoot":"","sources":["../../src/services/LightningService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,wBAAwB,EACzB,MAAM,iBAAiB,CAAA;AAExB,qBAAa,gBAAgB;IACf,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAElC,wBAAwB,CAC5B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,UAAU,GAAE,MAAM,GAAG,IAAI,aAAO,EAChC,SAAS,EAAE,UAAU,YAAK,EAC1B,WAAW,EAAE,WAAW;IAWpB,aAAa,CACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,UAAU,GAAE,MAAM,GAAG,IAAW,EAChC,SAAS,GAAE,UAAe,GACzB,OAAO,CAAC,oBAAoB,CAAC;IAY1B,qBAAqB,CACzB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,EACxB,SAAS,GAAE,UAAe;YASd,sBAAsB;IAK9B,UAAU,CACd,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,UAAe,GACzB,OAAO,CAAC,wBAAwB,CAAC;IAUpC,cAAc,CACZ,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAe,EACjD,OAAO,GAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAe;IAa7C,kBAAkB,CAChB,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAe,EACrD,OAAO,GAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAe;IAavC,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAgB5D,UAAU,CACd,SAAS,GAAE,MAAM,GAAG,IAAW,EAC/B,aAAa,GAAE,OAAe,GAC7B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAO7B,YAAY,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAI3C,kBAAkB,IAAI,OAAO,CAAC,SAAS,CAAC;CAG/C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MintService.d.ts","sourceRoot":"","sources":["../../src/services/MintService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EACL,QAAQ,EACR,UAAU,EACV,SAAS,EACT,sBAAsB,EAEvB,MAAM,iBAAiB,CAAA;AAExB,qBAAa,WAAW;IACV,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAElC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzC,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAChB,SAAS,GAAE,UAAe,GACzB,OAAO,CAAC,MAAM,CAAC;IAOlB,6BAA6B,CAC3B,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAe,EAChD,OAAO,GAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAe;IAavC,UAAU,CACd,SAAS,EAAE,MAAM,EAKjB,cAAc,GAAE,MAAM,GAAG,QAAY,EACrC,aAAa,GAAE,OAAe,EAC9B,SAAS,GAAE,SAAc,GACxB,OAAO,CAAC,sBAAsB,CAAC;IAyB5B,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAMhD,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7D,mBAAmB,CACjB,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAe,EAChD,OAAO,GAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAe;IAavC,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CAKnE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"RecoveryService.d.ts","sourceRoot":"","sources":["../../src/services/RecoveryService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAExC,qBAAa,eAAe;IACd,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAElC,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IAIxC,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3C,2BAA2B,CACzB,SAAS,EAAE,CAAC,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,SAAS,CAAA;KAAE,KAAK,IAAI,EACzE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAC/B,MAAM,IAAI;CAQd"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/types/wallet.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,SAAS,qDAAsD,CAAA;AACrE,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAA;AAEjD,qBAAa,MAAM;IACjB,OAAO,CAAC,KAAK,CAAU;gBAEX,KAAK,GAAE,QAAiB;IAIpC,QAAQ,CAAC,KAAK,EAAE,QAAQ;IAIxB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ;IAOpC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IASlD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIrC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIpC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIpC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAIrC,OAAO,CAAC,SAAS;CAYlB;AAED,eAAO,MAAM,MAAM,QAAe,CAAA"}