@fedimint/core-web 0.1.0 → 0.1.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 (78) hide show
  1. package/README.md +20 -9
  2. package/index.d.ts +1 -0
  3. package/index.js +15 -0
  4. package/package.json +12 -35
  5. package/dist/dts/FedimintWallet.d.ts +0 -51
  6. package/dist/dts/FedimintWallet.d.ts.map +0 -1
  7. package/dist/dts/WalletDirector.d.ts +0 -78
  8. package/dist/dts/WalletDirector.d.ts.map +0 -1
  9. package/dist/dts/index.d.ts +0 -4
  10. package/dist/dts/index.d.ts.map +0 -1
  11. package/dist/dts/services/BalanceService.d.ts +0 -15
  12. package/dist/dts/services/BalanceService.d.ts.map +0 -1
  13. package/dist/dts/services/FederationService.d.ts +0 -13
  14. package/dist/dts/services/FederationService.d.ts.map +0 -1
  15. package/dist/dts/services/LightningService.d.ts +0 -48
  16. package/dist/dts/services/LightningService.d.ts.map +0 -1
  17. package/dist/dts/services/MintService.d.ts +0 -23
  18. package/dist/dts/services/MintService.d.ts.map +0 -1
  19. package/dist/dts/services/RecoveryService.d.ts +0 -13
  20. package/dist/dts/services/RecoveryService.d.ts.map +0 -1
  21. package/dist/dts/services/WalletService.d.ts +0 -13
  22. package/dist/dts/services/WalletService.d.ts.map +0 -1
  23. package/dist/dts/services/index.d.ts +0 -7
  24. package/dist/dts/services/index.d.ts.map +0 -1
  25. package/dist/dts/transport/TransportClient.d.ts +0 -55
  26. package/dist/dts/transport/TransportClient.d.ts.map +0 -1
  27. package/dist/dts/transport/index.d.ts +0 -3
  28. package/dist/dts/transport/index.d.ts.map +0 -1
  29. package/dist/dts/transport/wasmTransport/WasmWorkerTransport.d.ts +0 -12
  30. package/dist/dts/transport/wasmTransport/WasmWorkerTransport.d.ts.map +0 -1
  31. package/dist/dts/types/index.d.ts +0 -4
  32. package/dist/dts/types/index.d.ts.map +0 -1
  33. package/dist/dts/types/transport.d.ts +0 -35
  34. package/dist/dts/types/transport.d.ts.map +0 -1
  35. package/dist/dts/types/utils.d.ts +0 -23
  36. package/dist/dts/types/utils.d.ts.map +0 -1
  37. package/dist/dts/types/wallet.d.ts +0 -241
  38. package/dist/dts/types/wallet.d.ts.map +0 -1
  39. package/dist/dts/utils/logger.d.ts +0 -24
  40. package/dist/dts/utils/logger.d.ts.map +0 -1
  41. package/dist/index.d.ts +0 -609
  42. package/dist/index.js +0 -2
  43. package/dist/index.js.map +0 -1
  44. package/dist/worker.js +0 -2
  45. package/dist/worker.js.map +0 -1
  46. package/src/FedimintWallet.test.ts +0 -73
  47. package/src/FedimintWallet.ts +0 -119
  48. package/src/WalletDirector.ts +0 -118
  49. package/src/index.ts +0 -3
  50. package/src/services/BalanceService.test.ts +0 -26
  51. package/src/services/BalanceService.ts +0 -29
  52. package/src/services/FederationService.test.ts +0 -58
  53. package/src/services/FederationService.ts +0 -216
  54. package/src/services/LightningService.test.ts +0 -265
  55. package/src/services/LightningService.ts +0 -289
  56. package/src/services/MintService.test.ts +0 -74
  57. package/src/services/MintService.ts +0 -129
  58. package/src/services/RecoveryService.ts +0 -28
  59. package/src/services/WalletService.test.ts +0 -59
  60. package/src/services/WalletService.ts +0 -50
  61. package/src/services/index.ts +0 -6
  62. package/src/test/TestFedimintWallet.ts +0 -31
  63. package/src/test/TestWalletDirector.ts +0 -14
  64. package/src/test/TestingService.ts +0 -79
  65. package/src/test/crypto.ts +0 -44
  66. package/src/test/fixtures.test.ts +0 -18
  67. package/src/test/fixtures.ts +0 -88
  68. package/src/transport/TransportClient.test.ts +0 -6
  69. package/src/transport/TransportClient.ts +0 -251
  70. package/src/transport/index.ts +0 -2
  71. package/src/transport/wasmTransport/WasmWorkerTransport.ts +0 -39
  72. package/src/transport/wasmTransport/worker.js +0 -167
  73. package/src/transport/wasmTransport/worker.test.ts +0 -90
  74. package/src/types/index.ts +0 -3
  75. package/src/types/transport.ts +0 -54
  76. package/src/types/utils.ts +0 -29
  77. package/src/types/wallet.ts +0 -298
  78. package/src/utils/logger.ts +0 -69
@@ -1,90 +0,0 @@
1
- import { expect } from 'vitest'
2
- import { TESTING_INVITE } from '../../test/TestingService'
3
- import { JSONObject } from '../../types'
4
- import { workerTest } from '../../test/fixtures'
5
-
6
- // Waits for a message of a given type from the worker
7
- const waitForWorkerResponse = (
8
- worker: Worker,
9
- messageType: string,
10
- ): Promise<JSONObject> => {
11
- return new Promise((resolve, reject) => {
12
- worker.onmessage = (event) => {
13
- if (event.data.type === messageType) {
14
- resolve(event.data)
15
- } else if (event.data.type === 'error') {
16
- reject(event.data.error)
17
- }
18
- }
19
- worker.onerror = (error) => {
20
- reject(error.message)
21
- }
22
- })
23
- }
24
-
25
- workerTest(
26
- 'should initialize WasmClient on init message',
27
- async ({ worker }) => {
28
- worker.postMessage({ type: 'init', requestId: 1 })
29
- const response = await waitForWorkerResponse(worker, 'initialized')
30
- expect(response.data).toEqual({})
31
- },
32
- )
33
-
34
- workerTest(
35
- 'should return false on open for a new client',
36
- async ({ worker, clientName }) => {
37
- worker.postMessage({ type: 'init', requestId: 1 })
38
- await waitForWorkerResponse(worker, 'initialized')
39
-
40
- worker.postMessage({
41
- type: 'open',
42
- requestId: 2,
43
- payload: { clientName },
44
- })
45
- const response = await waitForWorkerResponse(worker, 'open')
46
- expect(response.data).toEqual({ success: false })
47
- },
48
- )
49
-
50
- workerTest(
51
- 'should error on fake federation invitation',
52
- async ({ worker, clientName }) => {
53
- worker.postMessage({ type: 'init', requestId: 1 })
54
- await waitForWorkerResponse(worker, 'initialized')
55
-
56
- worker.postMessage({
57
- type: 'join',
58
- requestId: 2,
59
- payload: { inviteCode: 'fakefederationinvitation', clientName },
60
- })
61
- try {
62
- await waitForWorkerResponse(worker, 'open')
63
- expect.unreachable()
64
- } catch (e) {
65
- expect(e).toBe('parsing failed')
66
- }
67
- },
68
- )
69
-
70
- workerTest(
71
- 'should handle joining a federation',
72
- async ({ worker, clientName }) => {
73
- worker.postMessage({ type: 'init', requestId: 1 })
74
- await waitForWorkerResponse(worker, 'initialized')
75
-
76
- worker.postMessage({
77
- type: 'join',
78
- requestId: 2,
79
- payload: { inviteCode: TESTING_INVITE, clientName },
80
- })
81
- const response = await waitForWorkerResponse(worker, 'join')
82
- expect(response.data).toEqual({ success: true })
83
- },
84
- )
85
-
86
- workerTest('should handle unknown message type', async ({ worker }) => {
87
- worker.postMessage({ type: 'unknown', requestId: 2 })
88
- const response = await waitForWorkerResponse(worker, 'error')
89
- expect(response.error).toBe('Unknown message type')
90
- })
@@ -1,3 +0,0 @@
1
- export * from './wallet'
2
- export * from './utils'
3
- export * from './transport'
@@ -1,54 +0,0 @@
1
- import type { JSONValue } from './utils'
2
-
3
- const TransportMessageTypes = [
4
- 'init',
5
- 'initialized',
6
- 'rpc',
7
- 'log',
8
- 'open',
9
- 'join',
10
- 'error',
11
- 'unsubscribe',
12
- 'cleanup',
13
- 'parseInviteCode',
14
- 'parseBolt11Invoice',
15
- 'previewFederation',
16
- ] as const
17
-
18
- export type TransportMessageType = (typeof TransportMessageTypes)[number]
19
-
20
- export type TransportRequest = {
21
- type: TransportMessageType
22
- requestId?: number
23
- payload?: JSONValue
24
- }
25
-
26
- export type TransportMessage = {
27
- type: TransportMessageType | string
28
- requestId?: number
29
- } & Record<string, unknown>
30
-
31
- export type TransportMessageHandler = (message: TransportMessage) => void
32
-
33
- export type TransportErrorHandler = (error: unknown) => void
34
-
35
- /**
36
- * Generic Transport interface for communicating with a specific
37
- * target of the FedimintClient. Can be Wasm, React Native, Node, etc.
38
- */
39
- export interface Transport {
40
- postMessage(message: TransportRequest): void
41
- setMessageHandler(handler: TransportMessageHandler): void
42
- setErrorHandler(handler: TransportErrorHandler): void
43
- logger: TransportLogger
44
- }
45
-
46
- /**
47
- * Generic logger interface based on browser console.log
48
- */
49
- export type TransportLogger = {
50
- debug(message: string, ...args: any[]): void
51
- info(message: string, ...args: any[]): void
52
- warn(message: string, ...args: any[]): void
53
- error(message: string, ...args: any[]): void
54
- }
@@ -1,29 +0,0 @@
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
- type Result<T, U = string> =
26
- | { success: true; data?: T }
27
- | { success: false; error: U }
28
-
29
- export { Alias, Resolve, Duration, MSats, Sats, JSONValue, JSONObject, Result }
@@ -1,298 +0,0 @@
1
- import { MSats, Duration, JSONValue, JSONObject } from './utils'
2
-
3
- const MODULE_KINDS = ['', 'ln', 'mint', 'wallet'] as const
4
- type ModuleKind = (typeof MODULE_KINDS)[number]
5
-
6
- // TODO: Define the structure of FederationConfig
7
- type FederationConfig = JSONObject
8
-
9
- type GatewayInfo = {
10
- gateway_id: string
11
- api: string
12
- node_pub_key: string
13
- federation_index: number
14
- route_hints: RouteHint[]
15
- fees: FeeToAmount
16
- }
17
- type LightningGateway = {
18
- info: GatewayInfo
19
- vetted: boolean
20
- ttl: Duration
21
- }
22
-
23
- type RouteHint = {
24
- // TODO: Define the structure of RouteHint
25
- }
26
-
27
- type FeeToAmount = {
28
- // TODO: Define the structure of FeeToAmount
29
- }
30
-
31
- type OutgoingLightningPayment = {
32
- payment_type: PayType
33
- contract_id: string
34
- fee: MSats
35
- }
36
-
37
- type PayType = { lightning: string } | { internal: string }
38
-
39
- type LnPayState =
40
- | 'created'
41
- | 'canceled'
42
- | { funded: { block_height: number } }
43
- | { waiting_for_refund: { error_reason: string } }
44
- | 'awaiting_change'
45
- | { success: { preimage: string } }
46
- | { refunded: { gateway_error: string } }
47
- | { unexpected_error: { error_message: string } }
48
-
49
- type LnReceiveState =
50
- | 'created'
51
- | { waiting_for_payment: { invoice: string; timeout: number } }
52
- | { canceled: { reason: string } }
53
- | 'funded'
54
- | 'awaiting_funds'
55
- | 'claimed'
56
-
57
- type LnInternalPayState =
58
- | 'funding'
59
- | { preimage: string }
60
- | { refund_success: { out_points: BtcOutPoint[]; error: string } }
61
- | { refund_error: { error_message: string; error: string } }
62
- | { funding_failed: { error: string } }
63
- | { unexpected_error: string }
64
-
65
- type CreateBolt11Response = {
66
- operation_id: string
67
- invoice: string
68
- }
69
-
70
- type StreamError = {
71
- error: string
72
- data: never
73
- end: never
74
- }
75
-
76
- type StreamSuccess<T extends JSONValue> = {
77
- data: T
78
- error: never
79
- end: never
80
- }
81
-
82
- type StreamEnd = {
83
- end: string
84
- data: never
85
- error: never
86
- }
87
-
88
- type StreamResult<T extends JSONValue> =
89
- | StreamSuccess<T>
90
- | StreamError
91
- | StreamEnd
92
-
93
- type CancelFunction = () => void
94
-
95
- type ReissueExternalNotesState = 'Created' | 'Issuing' | 'Done'
96
- // | { Failed: { error: string } }
97
-
98
- type MintSpendNotesResponse = Array<string>
99
-
100
- type SpendNotesState =
101
- | 'Created'
102
- | 'UserCanceledProcessing'
103
- | 'UserCanceledSuccess'
104
- | 'UserCanceledFailure'
105
- | 'Success'
106
- | 'Refunded'
107
-
108
- type TxOutputSummary = {
109
- outpoint: {
110
- txid: string
111
- vout: number
112
- }
113
- amount: number
114
- }
115
-
116
- type BtcOutPoint = {
117
- txid: string
118
- vout: number
119
- }
120
-
121
- type WalletDepositState =
122
- | 'WaitingForTransaction'
123
- | {
124
- WaitingForConfirmation: {
125
- btc_deposited: number
126
- btc_out_point: BtcOutPoint
127
- }
128
- }
129
- | { Confirmed: { btc_deposited: number; btc_out_point: BtcOutPoint } }
130
- | { Claimed: { btc_deposited: number; btc_out_point: BtcOutPoint } }
131
- | { Failed: string }
132
-
133
- type WalletSummary = {
134
- spendable_utxos: TxOutputSummary[]
135
- unsigned_peg_out_txos: TxOutputSummary[]
136
- unsigned_change_utxos: TxOutputSummary[]
137
- // TODO: fix typo in rust
138
- unconfirmed_peg_out_txos: TxOutputSummary[]
139
- unconfirmed_change_utxos: TxOutputSummary[]
140
- }
141
-
142
- type LnVariant = {
143
- pay?: {
144
- gateway_id: string
145
- invoice: string
146
- fee: number
147
- is_internal_payment: boolean
148
- out_point: {
149
- out_idx: number
150
- txid: string
151
- }
152
- }
153
- receive?: {
154
- gateway_id: string
155
- invoice: string
156
- out_point: {
157
- out_idx: number
158
- txid: string
159
- }
160
- }
161
- }
162
-
163
- type MintVariant = {
164
- spend_o_o_b?: {
165
- requested_amount: number
166
- oob_notes: string
167
- }
168
- reissuance?: {
169
- txid: string
170
- }
171
- }
172
-
173
- type WalletVariant = {
174
- deposit?: {
175
- address: string
176
- tweak_idx: number
177
- }
178
- withdraw?: {
179
- address: string
180
- amountMsats: number
181
- fee: {
182
- fee_rate: {
183
- sats_per_kvb: number
184
- }
185
- total_weight: number
186
- }
187
- }
188
- }
189
-
190
- type OperationKey = {
191
- creation_time: { nanos_since_epoch: number; secs_since_epoch: number }
192
- operation_id: string
193
- }
194
- type OperationMeta = {
195
- amount: number
196
- extra_meta: JSONObject
197
- variant: LnVariant | MintVariant | WalletVariant
198
- }
199
-
200
- type OperationLog = {
201
- meta: OperationMeta
202
- operation_module_kind: string
203
- outcome: {
204
- outcome: LnPayState | LnReceiveState | SpendNotesState | WalletDepositState
205
- }
206
- }
207
-
208
- type BaseTransactions = {
209
- timestamp: number
210
- operationId: string
211
- kind: 'ln' | 'mint' | 'wallet'
212
- }
213
-
214
- type LightningTransaction = BaseTransactions & {
215
- type: 'send' | 'receive'
216
- invoice: string
217
- outcome:
218
- | 'created'
219
- | 'canceled'
220
- | 'claimed'
221
- | 'pending'
222
- | 'success'
223
- | 'funded'
224
- | 'awaiting_funds'
225
- | 'unexpected_error'
226
- gateway: string
227
- fee?: number
228
- internalPay?: boolean
229
- preimage?: string
230
- txId: string
231
- }
232
-
233
- type EcashTransaction = BaseTransactions & {
234
- type: 'spend_oob' | 'reissue'
235
- amountMsats: number
236
- outcome?: SpendNotesState | ReissueExternalNotesState
237
- notes?: string
238
- txId?: string
239
- }
240
-
241
- type WalletTransaction = BaseTransactions & {
242
- type: 'withdraw' | 'deposit'
243
- onchainAddress: string
244
- amountMsats: number
245
- fee: number
246
- outcome?:
247
- | 'WaitingForTransaction'
248
- | 'WaitingForConfirmation'
249
- | 'Confirmed'
250
- | 'Claimed'
251
- | 'Failed'
252
- }
253
-
254
- type Transactions = LightningTransaction | EcashTransaction | WalletTransaction
255
-
256
- /** Keys are powers of 2 */
257
- type NoteCountByDenomination = Record<number, number>
258
-
259
- type GenerateAddressResponse = {
260
- deposit_address: string
261
- operation_id: string
262
- }
263
-
264
- export {
265
- LightningGateway,
266
- FederationConfig,
267
- RouteHint,
268
- FeeToAmount,
269
- OutgoingLightningPayment,
270
- PayType,
271
- LnPayState,
272
- LnReceiveState,
273
- CreateBolt11Response,
274
- GatewayInfo,
275
- StreamError,
276
- StreamSuccess,
277
- StreamResult,
278
- ModuleKind,
279
- CancelFunction,
280
- LnInternalPayState,
281
- ReissueExternalNotesState,
282
- MintSpendNotesResponse,
283
- SpendNotesState,
284
- WalletSummary,
285
- TxOutputSummary,
286
- NoteCountByDenomination,
287
- GenerateAddressResponse,
288
- OperationKey,
289
- OperationLog,
290
- LnVariant,
291
- MintVariant,
292
- WalletVariant,
293
- LightningTransaction,
294
- EcashTransaction,
295
- WalletTransaction,
296
- Transactions,
297
- WalletDepositState,
298
- }
@@ -1,69 +0,0 @@
1
- import { TransportLogger } from '../types/transport'
2
-
3
- const logLevels = ['debug', 'info', 'warn', 'error', 'none'] as const
4
- export type LogLevel = (typeof logLevels)[number]
5
-
6
- export class Logger {
7
- private level: LogLevel
8
- private logger: TransportLogger
9
-
10
- /**
11
- * Generic Logger for a given environment.
12
- *
13
- * @param _logger - The transport's logger to use. (console for web, react native, etc.)
14
- * @param level - The log level to use. (debug, info, warn, error, none)
15
- */
16
- constructor(_logger: TransportLogger = console, level: LogLevel = 'none') {
17
- this.logger = _logger
18
- this.level = level
19
- }
20
-
21
- setLevel(level: LogLevel) {
22
- this.level = level
23
- }
24
-
25
- private coerceLevel(level: string): LogLevel {
26
- if (logLevels.includes(level.toLocaleUpperCase() as LogLevel)) {
27
- return level.toLocaleUpperCase() as LogLevel
28
- }
29
- return 'info'
30
- }
31
-
32
- log(level: string, message: string, ...args: any[]) {
33
- const logLevel = this.coerceLevel(level)
34
- if (!this.shouldLog(logLevel)) {
35
- return
36
- }
37
- const consoleFn = this.logger[logLevel]
38
- consoleFn(`[${logLevel.toUpperCase()}] ${message}`, ...args)
39
- }
40
-
41
- debug(message: string, ...args: any[]) {
42
- this.log('debug', message, ...args)
43
- }
44
-
45
- info(message: string, ...args: any[]) {
46
- this.log('info', message, ...args)
47
- }
48
-
49
- warn(message: string, ...args: any[]) {
50
- this.log('warn', message, ...args)
51
- }
52
-
53
- error(message: string, ...args: any[]) {
54
- this.log('error', message, ...args)
55
- }
56
-
57
- private shouldLog(
58
- messageLevel: LogLevel,
59
- ): messageLevel is Exclude<LogLevel, 'none'> {
60
- const levels: LogLevel[] = ['debug', 'info', 'warn', 'error', 'none']
61
- const messageLevelIndex = levels.indexOf(messageLevel)
62
- const currentLevelIndex = levels.indexOf(this.level)
63
- return (
64
- currentLevelIndex <= messageLevelIndex &&
65
- this.level !== 'none' &&
66
- messageLevel !== 'none'
67
- )
68
- }
69
- }