@fedimint/core-web 0.0.6 → 0.0.8

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 (74) hide show
  1. package/README.md +6 -71
  2. package/dist/{FedimintWallet.d.ts → dts/FedimintWallet.d.ts} +3 -3
  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 +4 -4
  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/dist/worker.js +1 -1
  33. package/dist/worker.js.map +1 -1
  34. package/package.json +8 -5
  35. package/src/FedimintWallet.test.ts +43 -60
  36. package/src/FedimintWallet.ts +20 -14
  37. package/src/index.ts +2 -22
  38. package/src/services/BalanceService.ts +5 -4
  39. package/src/services/FederationService.test.ts +1 -1
  40. package/src/services/FederationService.ts +1 -1
  41. package/src/services/LightningService.test.ts +103 -63
  42. package/src/services/LightningService.ts +84 -47
  43. package/src/services/MintService.test.ts +16 -2
  44. package/src/services/MintService.ts +8 -8
  45. package/src/services/RecoveryService.ts +1 -1
  46. package/src/test/TestFedimintWallet.ts +10 -1
  47. package/src/test/TestingService.ts +49 -30
  48. package/src/test/crypto.ts +44 -0
  49. package/src/test/fixtures.test.ts +18 -0
  50. package/src/test/{setupTests.ts → fixtures.ts} +25 -4
  51. package/src/types/index.ts +3 -0
  52. package/src/types/utils.ts +25 -0
  53. package/src/types/wallet.ts +4 -23
  54. package/src/types/worker.ts +13 -0
  55. package/src/worker/WorkerClient.test.ts +6 -0
  56. package/src/worker/WorkerClient.ts +28 -20
  57. package/src/worker/worker.js +9 -0
  58. package/src/worker/worker.test.ts +2 -2
  59. package/dist/FedimintWallet.d.ts.map +0 -1
  60. package/dist/index.d.ts.map +0 -1
  61. package/dist/services/BalanceService.d.ts.map +0 -1
  62. package/dist/services/FederationService.d.ts.map +0 -1
  63. package/dist/services/LightningService.d.ts +0 -18
  64. package/dist/services/LightningService.d.ts.map +0 -1
  65. package/dist/services/MintService.d.ts.map +0 -1
  66. package/dist/services/RecoveryService.d.ts.map +0 -1
  67. package/dist/services/index.d.ts.map +0 -1
  68. package/dist/types/wallet.d.ts.map +0 -1
  69. package/dist/utils/logger.d.ts.map +0 -1
  70. package/dist/worker/WorkerClient.d.ts.map +0 -1
  71. package/dist/worker/index.d.ts.map +0 -1
  72. /package/dist/{services → dts/services}/index.d.ts +0 -0
  73. /package/dist/{utils → dts/utils}/logger.d.ts +0 -0
  74. /package/dist/{worker → dts/worker}/index.d.ts +0 -0
package/dist/index.d.ts CHANGED
@@ -1,5 +1,298 @@
1
- import { FedimintWallet } from './FedimintWallet.js';
2
- import { LightningGateway, RouteHint, FeeToAmount, OutgoingLightningPayment, PayType, LnPayState, CreateBolt11Response } from './types/wallet.js';
3
- export { FedimintWallet };
4
- export type { LightningGateway, RouteHint, FeeToAmount, OutgoingLightningPayment, PayType, LnPayState, CreateBolt11Response, };
5
- //# sourceMappingURL=index.d.ts.map
1
+ type Alias<T> = T & {};
2
+ type Resolve<T> = T & unknown;
3
+ type Seconds = Alias<number>;
4
+ type Nanos = Alias<number>;
5
+ type Duration = {
6
+ nanos: Nanos;
7
+ secs: Seconds;
8
+ };
9
+ type MSats = Alias<number>;
10
+ type Sats = Alias<number>;
11
+ type JSONValue = string | number | boolean | null | {
12
+ [key: string]: JSONValue;
13
+ } | JSONValue[];
14
+ type JSONObject = Record<string, JSONValue>;
15
+ //# sourceMappingURL=utils.d.ts.map
16
+
17
+ declare const MODULE_KINDS: readonly ["", "ln", "mint"];
18
+ type ModuleKind = (typeof MODULE_KINDS)[number];
19
+ type GatewayInfo = {
20
+ gateway_id: string;
21
+ api: string;
22
+ node_pub_key: string;
23
+ federation_index: number;
24
+ route_hints: RouteHint[];
25
+ fees: FeeToAmount;
26
+ };
27
+ type LightningGateway = {
28
+ info: GatewayInfo;
29
+ vetted: boolean;
30
+ ttl: Duration;
31
+ };
32
+ type RouteHint = {};
33
+ type FeeToAmount = {};
34
+ type OutgoingLightningPayment = {
35
+ payment_type: PayType;
36
+ contract_id: string;
37
+ fee: MSats;
38
+ };
39
+ type PayType = {
40
+ type: 'Internal' | 'Lightning';
41
+ operation_id: string;
42
+ };
43
+ type LnPayState = 'created' | 'canceled' | {
44
+ funded: {
45
+ block_height: number;
46
+ };
47
+ } | {
48
+ waiting_for_refund: {
49
+ error_reason: string;
50
+ };
51
+ } | 'awaiting_change' | {
52
+ Success: {
53
+ preimage: string;
54
+ };
55
+ } | {
56
+ refunded: {
57
+ gateway_error: string;
58
+ };
59
+ } | {
60
+ unexpected_error: {
61
+ error_message: string;
62
+ };
63
+ };
64
+ type LnReceiveState = 'created' | {
65
+ waiting_for_payment: {
66
+ invoice: string;
67
+ timeout: number;
68
+ };
69
+ } | {
70
+ canceled: {
71
+ reason: string;
72
+ };
73
+ } | 'funded' | 'awaiting_funds' | 'claimed';
74
+ type CreateBolt11Response = {
75
+ operation_id: string;
76
+ invoice: string;
77
+ };
78
+ type StreamError = {
79
+ error: string;
80
+ data: never;
81
+ end: never;
82
+ };
83
+ type StreamSuccess<T extends JSONValue> = {
84
+ data: T;
85
+ error: never;
86
+ end: never;
87
+ };
88
+ type StreamEnd = {
89
+ end: string;
90
+ data: never;
91
+ error: never;
92
+ };
93
+ type StreamResult<T extends JSONValue> = StreamSuccess<T> | StreamError | StreamEnd;
94
+ type CancelFunction = () => void;
95
+ type ReissueExternalNotesState = 'Created' | 'Issuing' | 'Done' | {
96
+ Failed: {
97
+ error: string;
98
+ };
99
+ };
100
+ type MintSpendNotesResponse = {
101
+ notes: string;
102
+ operation_id: string;
103
+ };
104
+ //# sourceMappingURL=wallet.d.ts.map
105
+
106
+ declare const WorkerMessageTypes: readonly ["init", "initialized", "rpc", "log", "open", "join", "error", "unsubscribe", "cleanup"];
107
+ type WorkerMessageType = (typeof WorkerMessageTypes)[number];
108
+
109
+ declare class WorkerClient {
110
+ private worker;
111
+ private requestCounter;
112
+ private requestCallbacks;
113
+ private initPromise;
114
+ constructor();
115
+ initialize(): Promise<boolean>;
116
+ private handleWorkerLogs;
117
+ private handleWorkerError;
118
+ private handleWorkerMessage;
119
+ sendSingleMessage<Response extends JSONValue = JSONValue, Payload extends JSONValue = JSONValue>(type: WorkerMessageType, payload?: Payload): Promise<Response>;
120
+ /**
121
+ * @summary Initiates an RPC stream with the specified module and method.
122
+ *
123
+ * @description
124
+ * This function sets up an RPC stream by sending a request to a worker and
125
+ * handling responses asynchronously. It ensures that unsubscription is handled
126
+ * correctly, even if the unsubscribe function is called before the subscription
127
+ * is fully established, by deferring the unsubscription attempt using `setTimeout`.
128
+ *
129
+ * The function operates in a non-blocking manner, leveraging Promises to manage
130
+ * asynchronous operations and callbacks to handle responses.
131
+ *
132
+ *
133
+ * @template Response - The expected type of the successful response.
134
+ * @template Body - The type of the request body.
135
+ * @param module - The module kind to interact with.
136
+ * @param method - The method name to invoke on the module.
137
+ * @param body - The request payload.
138
+ * @param onSuccess - Callback invoked with the response data on success.
139
+ * @param onError - Callback invoked with error information if an error occurs.
140
+ * @param onEnd - Optional callback invoked when the stream ends.
141
+ * @returns A function that can be called to cancel the subscription.
142
+ *
143
+ */
144
+ rpcStream<Response extends JSONValue = JSONValue, Body extends JSONValue = JSONValue>(module: ModuleKind, method: string, body: Body, onSuccess: (res: Response) => void, onError: (res: StreamError['error']) => void, onEnd?: () => void): CancelFunction;
145
+ private _rpcStreamInner;
146
+ rpcSingle<Response extends JSONValue = JSONValue>(module: ModuleKind, method: string, body: JSONValue): Promise<Response>;
147
+ cleanup(): Promise<void>;
148
+ _getRequestCounter(): number;
149
+ _getRequestCallbackMap(): Map<number, (value: any) => void>;
150
+ }
151
+
152
+ declare class MintService {
153
+ private client;
154
+ constructor(client: WorkerClient);
155
+ redeemEcash(notes: string): Promise<void>;
156
+ reissueExternalNotes(oobNotes: string, extraMeta?: JSONObject): Promise<string>;
157
+ subscribeReissueExternalNotes(operationId: string, onSuccess?: (state: JSONValue) => void, onError?: (error: string) => void): CancelFunction;
158
+ spendNotes(minAmount: MSats, tryCancelAfter?: number | Duration, // defaults to 1 day
159
+ includeInvite?: boolean, extraMeta?: JSONValue): Promise<MintSpendNotesResponse>;
160
+ parseNotes(oobNotes: string): Promise<MSats>;
161
+ tryCancelSpendNotes(operationId: string): Promise<void>;
162
+ subscribeSpendNotes(operationId: string, onSuccess?: (state: JSONValue) => void, onError?: (error: string) => void): CancelFunction;
163
+ awaitSpendOobRefund(operationId: string): Promise<JSONValue>;
164
+ }
165
+
166
+ /**
167
+ * Balance Service
168
+ *
169
+ * The Balance Service provides methods to interact with the balance of a Fedimint wallet.
170
+ */
171
+ declare class BalanceService {
172
+ private client;
173
+ constructor(client: WorkerClient);
174
+ /**
175
+ * Get the balance of the current wallet in milli-satoshis (MSats)
176
+ *
177
+ * @example
178
+ * ```ts
179
+ * const balance = await wallet.balance.getBalance()
180
+ * ```
181
+ */
182
+ getBalance(): Promise<MSats>;
183
+ /**
184
+ * Subscribe to the balance of the current wallet in milli-satoshis (MSats)
185
+ *
186
+ * @example
187
+ * ```ts
188
+ * const unsubscribe = wallet.balance.subscribeBalance((balance) => {
189
+ * console.log(balance)
190
+ * })
191
+ *
192
+ * // ...Cleanup Later
193
+ * unsubscribe()
194
+ * ```
195
+ */
196
+ subscribeBalance(onSuccess?: (balance: MSats) => void, onError?: (error: string) => void): CancelFunction;
197
+ }
198
+
199
+ declare class LightningService {
200
+ private client;
201
+ constructor(client: WorkerClient);
202
+ createInvoice(amount: MSats, description: string, expiryTime?: number, // in seconds
203
+ gatewayInfo?: GatewayInfo, extraMeta?: JSONObject): Promise<CreateBolt11Response>;
204
+ createInvoiceTweaked(amount: MSats, description: string, tweakKey: string, index: number, expiryTime?: number, // in seconds
205
+ gatewayInfo?: GatewayInfo, extraMeta?: JSONObject): Promise<CreateBolt11Response>;
206
+ scanReceivesForTweaks(tweakKey: string, indices: number[], extraMeta?: JSONObject): Promise<string[]>;
207
+ private _getDefaultGatewayInfo;
208
+ payInvoice(invoice: string, gatewayInfo?: GatewayInfo, extraMeta?: JSONObject): Promise<OutgoingLightningPayment>;
209
+ subscribeLnClaim(operationId: string, onSuccess?: (state: LnReceiveState) => void, onError?: (error: string) => void): CancelFunction;
210
+ subscribeLnPay(operationId: string, onSuccess?: (state: LnPayState) => void, onError?: (error: string) => void): CancelFunction;
211
+ subscribeLnReceive(operationId: string, onSuccess?: (state: LnReceiveState) => void, onError?: (error: string) => void): CancelFunction;
212
+ waitForReceive(operationId: string): Promise<LnReceiveState>;
213
+ getGateway(gatewayId?: string | null, forceInternal?: boolean): Promise<LightningGateway | null>;
214
+ listGateways(): Promise<LightningGateway[]>;
215
+ updateGatewayCache(): Promise<JSONValue>;
216
+ }
217
+
218
+ declare class RecoveryService {
219
+ private client;
220
+ constructor(client: WorkerClient);
221
+ hasPendingRecoveries(): Promise<boolean>;
222
+ waitForAllRecoveries(): Promise<void>;
223
+ subscribeToRecoveryProgress(onSuccess: (progress: {
224
+ module_id: number;
225
+ progress: JSONValue;
226
+ }) => void, onError: (error: string) => void): () => void;
227
+ }
228
+
229
+ declare class FederationService {
230
+ private client;
231
+ constructor(client: WorkerClient);
232
+ getConfig(): Promise<JSONValue>;
233
+ getFederationId(): Promise<string>;
234
+ getInviteCode(peer: number): Promise<string | null>;
235
+ listOperations(): Promise<JSONValue[]>;
236
+ }
237
+
238
+ declare const logLevels: readonly ["debug", "info", "warn", "error", "none"];
239
+ type LogLevel = (typeof logLevels)[number];
240
+
241
+ declare class FedimintWallet {
242
+ private _client;
243
+ balance: BalanceService;
244
+ mint: MintService;
245
+ lightning: LightningService;
246
+ federation: FederationService;
247
+ recovery: RecoveryService;
248
+ private _openPromise;
249
+ private _resolveOpen;
250
+ private _isOpen;
251
+ /**
252
+ * Creates a new instance of FedimintWallet.
253
+ *
254
+ * This constructor initializes a FedimintWallet instance, which manages communication
255
+ * with a Web Worker. The Web Worker is responsible for running WebAssembly code that
256
+ * handles the core Fedimint Client operations.
257
+ *
258
+ * (default) When not in lazy mode, the constructor immediately initializes the
259
+ * Web Worker and begins loading the WebAssembly module in the background. This
260
+ * allows for faster subsequent operations but may increase initial load time.
261
+ *
262
+ * In lazy mode, the Web Worker and WebAssembly initialization are deferred until
263
+ * the first operation that requires them, reducing initial overhead at the cost
264
+ * of a slight delay on the first operation.
265
+ *
266
+ * @param {boolean} lazy - If true, delays Web Worker and WebAssembly initialization
267
+ * until needed. Default is false.
268
+ *
269
+ * @example
270
+ * // Create a wallet with immediate initialization
271
+ * const wallet = new FedimintWallet();
272
+ * wallet.open();
273
+ *
274
+ * // Create a wallet with lazy initialization
275
+ * const lazyWallet = new FedimintWallet(true);
276
+ * // Some time later...
277
+ * lazyWallet.initialize();
278
+ * lazyWallet.open();
279
+ */
280
+ constructor(lazy?: boolean);
281
+ initialize(): Promise<void>;
282
+ waitForOpen(): Promise<void>;
283
+ open(clientName?: string): Promise<boolean>;
284
+ joinFederation(inviteCode: string, clientName?: string): Promise<boolean>;
285
+ /**
286
+ * This should ONLY be called when UNLOADING the wallet client.
287
+ * After this call, the FedimintWallet instance should be discarded.
288
+ */
289
+ cleanup(): Promise<void>;
290
+ isOpen(): boolean;
291
+ /**
292
+ * Sets the log level for the library.
293
+ * @param level The desired log level ('DEBUG', 'INFO', 'WARN', 'ERROR', 'NONE').
294
+ */
295
+ setLogLevel(level: LogLevel): void;
296
+ }
297
+
298
+ export { type Alias, type CancelFunction, type CreateBolt11Response, type Duration, FedimintWallet, type FeeToAmount, type GatewayInfo, type JSONObject, type JSONValue, type LightningGateway, type LnPayState, type LnReceiveState, type MSats, type MintSpendNotesResponse, type ModuleKind, type OutgoingLightningPayment, type PayType, type ReissueExternalNotesState, type Resolve, type RouteHint, type Sats, type StreamError, type StreamResult, type StreamSuccess, type WorkerMessageType };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- const e=["debug","info","warn","error","none"];const t=new class{constructor(e="none"){this.level=e}setLevel(e){this.level=e}coerceLevel(t){return e.includes(t.toLocaleUpperCase())?t.toLocaleUpperCase():"info"}log(e,t,...i){const n=this.coerceLevel(e);if(!this.shouldLog(n))return;(0,console[n])(`[${n.toUpperCase()}] ${t}`,...i)}debug(e,...t){this.log("debug",e,...t)}info(e,...t){this.log("info",e,...t)}warn(e,...t){this.log("warn",e,...t)}error(e,...t){this.log("error",e,...t)}shouldLog(e){const t=["debug","info","warn","error","none"],i=t.indexOf(e);return t.indexOf(this.level)<=i&&"none"!==this.level&&"none"!==e}};class i{constructor(){this.requestCounter=0,this.requestCallbacks=new Map,this.initPromise=null,this.worker=new Worker(new URL("./worker.js",import.meta.url),{type:"module"}),this.worker.onmessage=this.handleWorkerMessage.bind(this),this.worker.onerror=this.handleWorkerError.bind(this),t.info("WorkerClient instantiated"),t.debug("WorkerClient",this.worker)}initialize(){return this.initPromise||(this.initPromise=this.sendSingleMessage("init")),this.initPromise}handleWorkerLogs(e){const{type:i,level:n,message:s,...r}=e.data;t.log(n,s,...r)}handleWorkerError(e){t.error("Worker error",e)}handleWorkerMessage(e){const{type:i,requestId:n,...s}=e.data;"log"===i&&this.handleWorkerLogs(e.data);const r=this.requestCallbacks.get(n);t.debug("WorkerClient - handleWorkerMessage",e.data),r?r(s):t.warn("WorkerClient - handleWorkerMessage - received message with no callback",n,e.data)}sendSingleMessage(e,i){return new Promise(((n,s)=>{const r=++this.requestCounter;t.debug("WorkerClient - sendSingleMessage",r,e,i),this.requestCallbacks.set(r,(e=>{this.requestCallbacks.delete(r),t.debug("WorkerClient - sendSingleMessage - response",r,e),e.data?n(e.data):e.error?s(e.error):t.warn("WorkerClient - sendSingleMessage - malformed response",r,e)})),this.worker.postMessage({type:e,payload:i,requestId:r})}))}rpcStream(e,i,n,s,r,a=()=>{}){const o=++this.requestCounter;t.debug("WorkerClient - rpcStream",o,e,i,n);let l=()=>{},c=!1;const h=new Promise((e=>{l=()=>{c?e():setTimeout((()=>l()),0)}}));return this._rpcStreamInner(o,e,i,n,s,r,a,h).then((()=>{c=!0})),l}async _rpcStreamInner(e,t,i,n,s,r,a=()=>{},o){this.requestCallbacks.set(e,(t=>{void 0!==t.error?r(t.error):void 0!==t.data?s(t.data):void 0!==t.end&&(this.requestCallbacks.delete(e),a())})),this.worker.postMessage({type:"rpc",payload:{module:t,method:i,body:n},requestId:e}),o.then((()=>{this.worker?.postMessage({type:"unsubscribe",requestId:e}),this.requestCallbacks.delete(e)}))}rpcSingle(e,i,n){return t.debug("WorkerClient - rpcSingle",e,i,n),new Promise(((t,s)=>{this.rpcStream(e,i,n,t,s)}))}cleanup(){this.worker.terminate(),this.initPromise=null,this.requestCallbacks.clear()}_getRequestCounter(){return this.requestCounter}_getRequestCallbackMap(){return this.requestCallbacks}}class n{constructor(e){this.client=e}async redeemEcash(e){await this.client.rpcSingle("mint","reissue_external_notes",{oob_notes:e,extra_meta:null})}async reissueExternalNotes(e,t={}){return await this.client.rpcSingle("mint","reissue_external_notes",{oob_notes:e,extra_meta:t})}subscribeReissueExternalNotes(e,t=()=>{},i=()=>{}){return this.client.rpcStream("mint","subscribe_reissue_external_notes",{operation_id:e},t,i)}async spendNotes(e,t=0,i=!1,n={}){const s="number"==typeof t?{nanos:0,secs:t}:t,r=await this.client.rpcSingle("mint","spend_notes",{min_amount:e,try_cancel_after:s,include_invite:i,extra_meta:n});return{notes:r[1],operation_id:r[0]}}async validateNotes(e){return await this.client.rpcSingle("mint","validate_notes",{oob_notes:e})}async tryCancelSpendNotes(e){await this.client.rpcSingle("mint","try_cancel_spend_notes",{operation_id:e})}subscribeSpendNotes(e,t=()=>{},i=()=>{}){return this.client.rpcStream("mint","subscribe_spend_notes",{operation_id:e},(e=>t(e)),i)}async awaitSpendOobRefund(e){return await this.client.rpcSingle("mint","await_spend_oob_refund",{operation_id:e})}}class s{constructor(e){this.client=e}async getBalance(){return await this.client.rpcSingle("","get_balance",{})}subscribeBalance(e=()=>{},t=()=>{}){return this.client.rpcStream("","subscribe_balance_changes",{},(t=>e(parseInt(t))),t)}}class r{constructor(e){this.client=e}async createInvoiceWithGateway(e,t,i=null,n={},s){return await this.client.rpcSingle("ln","create_bolt11_invoice",{amount:e,description:t,expiry_time:i,extra_meta:n,gateway:s})}async createInvoice(e,t,i=null,n={}){await this.updateGatewayCache();const s=await this._getDefaultGatewayInfo();return await this.client.rpcSingle("ln","create_bolt11_invoice",{amount:e,description:t,expiry_time:i,extra_meta:n,gateway:s.info})}async payInvoiceWithGateway(e,t,i={}){return await this.client.rpcSingle("ln","pay_bolt11_invoice",{maybe_gateway:t,invoice:e,extra_meta:i})}async _getDefaultGatewayInfo(){return(await this.listGateways())[0]}async payInvoice(e,t={}){await this.updateGatewayCache();const i=await this._getDefaultGatewayInfo();return await this.client.rpcSingle("ln","pay_bolt11_invoice",{maybe_gateway:i.info,invoice:e,extra_meta:t})}subscribeLnPay(e,t=()=>{},i=()=>{}){return this.client.rpcStream("ln","subscribe_ln_pay",{operation_id:e},t,i)}subscribeLnReceive(e,t=()=>{},i=()=>{}){return this.client.rpcStream("ln","subscribe_ln_receive",{operation_id:e},t,i)}async waitForReceive(e){return new Promise(((t,i)=>{const n=this.subscribeLnReceive(e,(e=>{"claimed"===e&&t(e)}),i);setTimeout((()=>{n(),i(new Error("Timeout waiting for receive"))}),1e4)}))}async getGateway(e=null,t=!1){return await this.client.rpcSingle("ln","get_gateway",{gateway_id:e,force_internal:t})}async listGateways(){return await this.client.rpcSingle("ln","list_gateways",{})}async updateGatewayCache(){return await this.client.rpcSingle("ln","update_gateway_cache",{})}}class a{constructor(e){this.client=e}async hasPendingRecoveries(){return await this.client.rpcSingle("","has_pending_recoveries",{})}async waitForAllRecoveries(){await this.client.rpcSingle("","wait_for_all_recoveries",{})}subscribeToRecoveryProgress(e,t){return this.client.rpcStream("","subscribe_to_recovery_progress",{},e,t)}}class o{constructor(e){this.client=e}async getConfig(){return await this.client.rpcSingle("","get_config",{})}async getFederationId(){return await this.client.rpcSingle("","get_federation_id",{})}async getInviteCode(e){return await this.client.rpcSingle("","get_invite_code",{peer:e})}async listOperations(){return await this.client.rpcSingle("","list_operations",{})}}const l="fm-default";class c{constructor(e=!1){this._openPromise=null,this._resolveOpen=()=>{},this._isOpen=!1,this._openPromise=new Promise((e=>{this._resolveOpen=e})),this._client=new i,this.mint=new n(this._client),this.lightning=new r(this._client),this.balance=new s(this._client),this.federation=new o(this._client),this.recovery=new a(this._client),t.info("FedimintWallet instantiated"),e||this.initialize()}async initialize(){t.info("Initializing WorkerClient"),await this._client.initialize(),t.info("WorkerClient initialized")}async waitForOpen(){return this._isOpen?Promise.resolve():this._openPromise}async open(e=l){if(await this._client.initialize(),this._isOpen)throw new Error("The FedimintWallet is already open.");const{success:t}=await this._client.sendSingleMessage("open",{clientName:e});return t&&(this._isOpen=!!t,this._resolveOpen()),t}async joinFederation(e,t=l){if(await this._client.initialize(),this._isOpen)throw new Error("The FedimintWallet is already open. You can only call `joinFederation` on closed clients.");(await this._client.sendSingleMessage("join",{inviteCode:e,clientName:t})).success&&(this._isOpen=!0,this._resolveOpen())}async cleanup(){this._openPromise=null,this._isOpen=!1,this._client.cleanup()}isOpen(){return this._isOpen}setLogLevel(e){t.setLevel(e),t.info(`Log level set to ${e}.`)}}export{c as FedimintWallet};
1
+ const e=["debug","info","warn","error","none"];const t=new class{constructor(e="none"){this.level=e}setLevel(e){this.level=e}coerceLevel(t){return e.includes(t.toLocaleUpperCase())?t.toLocaleUpperCase():"info"}log(e,t,...i){const n=this.coerceLevel(e);if(!this.shouldLog(n))return;(0,console[n])(`[${n.toUpperCase()}] ${t}`,...i)}debug(e,...t){this.log("debug",e,...t)}info(e,...t){this.log("info",e,...t)}warn(e,...t){this.log("warn",e,...t)}error(e,...t){this.log("error",e,...t)}shouldLog(e){const t=["debug","info","warn","error","none"],i=t.indexOf(e);return t.indexOf(this.level)<=i&&"none"!==this.level&&"none"!==e}};class i{constructor(){this.requestCounter=0,this.requestCallbacks=new Map,this.initPromise=void 0,this.worker=new Worker(new URL("./worker.js",import.meta.url),{type:"module"}),this.worker.onmessage=this.handleWorkerMessage.bind(this),this.worker.onerror=this.handleWorkerError.bind(this),t.info("WorkerClient instantiated"),t.debug("WorkerClient",this.worker)}initialize(){return this.initPromise||(this.initPromise=this.sendSingleMessage("init")),this.initPromise}handleWorkerLogs(e){const{type:i,level:n,message:s,...r}=e.data;t.log(n,s,...r)}handleWorkerError(e){t.error("Worker error",e)}handleWorkerMessage(e){const{type:i,requestId:n,...s}=e.data;"log"===i&&this.handleWorkerLogs(e.data);const r=this.requestCallbacks.get(n);t.debug("WorkerClient - handleWorkerMessage",e.data),r?r(s):t.warn("WorkerClient - handleWorkerMessage - received message with no callback",n,e.data)}sendSingleMessage(e,i){return new Promise(((n,s)=>{const r=++this.requestCounter;t.debug("WorkerClient - sendSingleMessage",r,e,i),this.requestCallbacks.set(r,(e=>{this.requestCallbacks.delete(r),t.debug("WorkerClient - sendSingleMessage - response",r,e),e.data?n(e.data):e.error?s(e.error):t.warn("WorkerClient - sendSingleMessage - malformed response",r,e)})),this.worker.postMessage({type:e,payload:i,requestId:r})}))}rpcStream(e,i,n,s,r,a=()=>{}){const o=++this.requestCounter;t.debug("WorkerClient - rpcStream",o,e,i,n);let c=()=>{},l=!1;const u=new Promise((e=>{c=()=>{l?e():setTimeout((()=>c()),0)}}));return this._rpcStreamInner(o,e,i,n,s,r,a,u).then((()=>{l=!0})),c}async _rpcStreamInner(e,t,i,n,s,r,a=()=>{},o){this.requestCallbacks.set(e,(t=>{void 0!==t.error?r(t.error):void 0!==t.data?s(t.data):void 0!==t.end&&(this.requestCallbacks.delete(e),a())})),this.worker.postMessage({type:"rpc",payload:{module:t,method:i,body:n},requestId:e}),o.then((()=>{this.worker?.postMessage({type:"unsubscribe",requestId:e}),this.requestCallbacks.delete(e)}))}rpcSingle(e,i,n){return t.debug("WorkerClient - rpcSingle",e,i,n),new Promise(((t,s)=>{this.rpcStream(e,i,n,t,s)}))}async cleanup(){await this.sendSingleMessage("cleanup"),this.requestCounter=0,this.initPromise=void 0,this.requestCallbacks.clear()}_getRequestCounter(){return this.requestCounter}_getRequestCallbackMap(){return this.requestCallbacks}}class n{constructor(e){this.client=e}async redeemEcash(e){await this.client.rpcSingle("mint","reissue_external_notes",{oob_notes:e,extra_meta:null})}async reissueExternalNotes(e,t={}){return await this.client.rpcSingle("mint","reissue_external_notes",{oob_notes:e,extra_meta:t})}subscribeReissueExternalNotes(e,t=()=>{},i=()=>{}){return this.client.rpcStream("mint","subscribe_reissue_external_notes",{operation_id:e},t,i)}async spendNotes(e,t=86400,i=!1,n={}){const s="number"==typeof t?{nanos:0,secs:t}:t,r=await this.client.rpcSingle("mint","spend_notes",{min_amount:e,try_cancel_after:s,include_invite:i,extra_meta:n});return{notes:r[1],operation_id:r[0]}}async parseNotes(e){return await this.client.rpcSingle("mint","validate_notes",{oob_notes:e})}async tryCancelSpendNotes(e){await this.client.rpcSingle("mint","try_cancel_spend_notes",{operation_id:e})}subscribeSpendNotes(e,t=()=>{},i=()=>{}){return this.client.rpcStream("mint","subscribe_spend_notes",{operation_id:e},(e=>t(e)),i)}async awaitSpendOobRefund(e){return await this.client.rpcSingle("mint","await_spend_oob_refund",{operation_id:e})}}class s{constructor(e){this.client=e}async getBalance(){return await this.client.rpcSingle("","get_balance",{})}subscribeBalance(e=()=>{},t=()=>{}){return this.client.rpcStream("","subscribe_balance_changes",{},(t=>e(parseInt(t))),t)}}class r{constructor(e){this.client=e}async createInvoice(e,t,i,n,s){const r=n??await this._getDefaultGatewayInfo();return await this.client.rpcSingle("ln","create_bolt11_invoice",{amount:e,description:t,expiry_time:i??null,extra_meta:s??{},gateway:r})}async createInvoiceTweaked(e,t,i,n,s,r,a){const o=r??await this._getDefaultGatewayInfo();return await this.client.rpcSingle("ln","create_bolt11_invoice_for_user_tweaked",{amount:e,description:t,expiry_time:s??null,user_key:i,index:n,extra_meta:a??{},gateway:o})}async scanReceivesForTweaks(e,t,i){return await this.client.rpcSingle("ln","scan_receive_for_user_tweaked",{user_key:e,indices:t,extra_meta:i??{}})}async _getDefaultGatewayInfo(){await this.updateGatewayCache();const e=await this.listGateways();return e[0]?.info}async payInvoice(e,t,i){const n=t??await this._getDefaultGatewayInfo();return await this.client.rpcSingle("ln","pay_bolt11_invoice",{maybe_gateway:n,invoice:e,extra_meta:i??{}})}subscribeLnClaim(e,t=()=>{},i=()=>{}){return this.client.rpcStream("ln","subscribe_ln_claim",{operation_id:e},t,i)}subscribeLnPay(e,t=()=>{},i=()=>{}){return this.client.rpcStream("ln","subscribe_ln_pay",{operation_id:e},t,i)}subscribeLnReceive(e,t=()=>{},i=()=>{}){return this.client.rpcStream("ln","subscribe_ln_receive",{operation_id:e},t,i)}async waitForReceive(e){return new Promise(((t,i)=>{let n;const s=setTimeout((()=>{i(new Error("Timeout waiting for receive"))}),15e3);n=this.subscribeLnReceive(e,(e=>{"claimed"===e&&(clearTimeout(s),n(),t(e))}),(e=>{clearTimeout(s),n(),i(e)}))}))}async getGateway(e=null,t=!1){return await this.client.rpcSingle("ln","get_gateway",{gateway_id:e,force_internal:t})}async listGateways(){return await this.client.rpcSingle("ln","list_gateways",{})}async updateGatewayCache(){return await this.client.rpcSingle("ln","update_gateway_cache",{})}}class a{constructor(e){this.client=e}async hasPendingRecoveries(){return await this.client.rpcSingle("","has_pending_recoveries",{})}async waitForAllRecoveries(){await this.client.rpcSingle("","wait_for_all_recoveries",{})}subscribeToRecoveryProgress(e,t){return this.client.rpcStream("","subscribe_to_recovery_progress",{},e,t)}}class o{constructor(e){this.client=e}async getConfig(){return await this.client.rpcSingle("","get_config",{})}async getFederationId(){return await this.client.rpcSingle("","get_federation_id",{})}async getInviteCode(e){return await this.client.rpcSingle("","get_invite_code",{peer:e})}async listOperations(){return await this.client.rpcSingle("","list_operations",{})}}const c="fm-default";class l{constructor(e=!1){this._openPromise=void 0,this._resolveOpen=()=>{},this._isOpen=!1,this._openPromise=new Promise((e=>{this._resolveOpen=e})),this._client=new i,this.mint=new n(this._client),this.lightning=new r(this._client),this.balance=new s(this._client),this.federation=new o(this._client),this.recovery=new a(this._client),t.info("FedimintWallet instantiated"),e||this.initialize()}async initialize(){t.info("Initializing WorkerClient"),await this._client.initialize(),t.info("WorkerClient initialized")}async waitForOpen(){return this._isOpen?Promise.resolve():this._openPromise}async open(e=c){if(await this._client.initialize(),this._isOpen)throw new Error("The FedimintWallet is already open.");const{success:t}=await this._client.sendSingleMessage("open",{clientName:e});return t&&(this._isOpen=!!t,this._resolveOpen()),t}async joinFederation(e,i=c){if(await this._client.initialize(),this._isOpen)throw new Error("The FedimintWallet is already open. You can only call `joinFederation` on closed clients.");try{const t=await this._client.sendSingleMessage("join",{inviteCode:e,clientName:i});return t.success&&(this._isOpen=!0,this._resolveOpen()),t.success}catch(e){return t.error("Error joining federation",e),!1}}async cleanup(){this._openPromise=void 0,this._isOpen=!1,await this._client.cleanup()}isOpen(){return this._isOpen}setLogLevel(e){t.setLevel(e),t.info(`Log level set to ${e}.`)}}export{l as FedimintWallet};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/utils/logger.ts","../src/worker/WorkerClient.ts","../src/services/MintService.ts","../src/services/BalanceService.ts","../src/services/LightningService.ts","../src/services/RecoveryService.ts","../src/services/FederationService.ts","../src/FedimintWallet.ts"],"sourcesContent":[null,null,null,null,null,null,null,null],"names":["logLevels","logger","constructor","level","this","setLevel","coerceLevel","includes","toLocaleUpperCase","log","message","args","logLevel","shouldLog","consoleFn","console","toUpperCase","debug","info","warn","error","messageLevel","levels","messageLevelIndex","indexOf","WorkerClient","requestCounter","requestCallbacks","Map","initPromise","worker","Worker","URL","url","type","onmessage","handleWorkerMessage","bind","onerror","handleWorkerError","initialize","sendSingleMessage","handleWorkerLogs","event","data","requestId","streamCallback","get","payload","Promise","resolve","reject","set","response","delete","postMessage","rpcStream","module","method","body","onSuccess","onError","onEnd","unsubscribe","isSubscribed","unsubscribePromise","setTimeout","_rpcStreamInner","then","undefined","end","rpcSingle","cleanup","terminate","clear","_getRequestCounter","_getRequestCallbackMap","MintService","client","redeemEcash","notes","oob_notes","extra_meta","reissueExternalNotes","oobNotes","extraMeta","subscribeReissueExternalNotes","operationId","operation_id","spendNotes","minAmount","tryCancelAfter","includeInvite","duration","nanos","secs","res","min_amount","try_cancel_after","include_invite","validateNotes","tryCancelSpendNotes","subscribeSpendNotes","awaitSpendOobRefund","BalanceService","getBalance","subscribeBalance","parseInt","LightningService","createInvoiceWithGateway","amount","description","expiryTime","gatewayInfo","expiry_time","gateway","createInvoice","updateGatewayCache","_getDefaultGatewayInfo","payInvoiceWithGateway","invoice","maybe_gateway","listGateways","payInvoice","subscribeLnPay","subscribeLnReceive","waitForReceive","Error","getGateway","gatewayId","forceInternal","gateway_id","force_internal","RecoveryService","hasPendingRecoveries","waitForAllRecoveries","subscribeToRecoveryProgress","FederationService","getConfig","getFederationId","getInviteCode","peer","listOperations","DEFAULT_CLIENT_NAME","FedimintWallet","lazy","_openPromise","_resolveOpen","_isOpen","_client","mint","lightning","balance","federation","recovery","waitForOpen","open","clientName","success","joinFederation","inviteCode","isOpen","setLogLevel"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/utils/logger.ts","../src/worker/WorkerClient.ts","../src/services/MintService.ts","../src/services/BalanceService.ts","../src/services/LightningService.ts","../src/services/RecoveryService.ts","../src/services/FederationService.ts","../src/FedimintWallet.ts"],"sourcesContent":[null,null,null,null,null,null,null,null],"names":["logLevels","logger","constructor","level","this","setLevel","coerceLevel","includes","toLocaleUpperCase","log","message","args","logLevel","shouldLog","consoleFn","console","toUpperCase","debug","info","warn","error","messageLevel","levels","messageLevelIndex","indexOf","WorkerClient","requestCounter","requestCallbacks","Map","initPromise","undefined","worker","Worker","URL","url","type","onmessage","handleWorkerMessage","bind","onerror","handleWorkerError","initialize","sendSingleMessage","handleWorkerLogs","event","data","requestId","streamCallback","get","payload","Promise","resolve","reject","set","response","delete","postMessage","rpcStream","module","method","body","onSuccess","onError","onEnd","unsubscribe","isSubscribed","unsubscribePromise","setTimeout","_rpcStreamInner","then","end","rpcSingle","cleanup","clear","_getRequestCounter","_getRequestCallbackMap","MintService","client","redeemEcash","notes","oob_notes","extra_meta","reissueExternalNotes","oobNotes","extraMeta","subscribeReissueExternalNotes","operationId","operation_id","spendNotes","minAmount","tryCancelAfter","includeInvite","duration","nanos","secs","res","min_amount","try_cancel_after","include_invite","parseNotes","tryCancelSpendNotes","subscribeSpendNotes","awaitSpendOobRefund","BalanceService","getBalance","subscribeBalance","parseInt","LightningService","createInvoice","amount","description","expiryTime","gatewayInfo","gateway","_getDefaultGatewayInfo","expiry_time","createInvoiceTweaked","tweakKey","index","user_key","scanReceivesForTweaks","indices","updateGatewayCache","gateways","listGateways","payInvoice","invoice","maybe_gateway","subscribeLnClaim","subscribeLnPay","subscribeLnReceive","waitForReceive","timeoutId","Error","clearTimeout","getGateway","gatewayId","forceInternal","gateway_id","force_internal","RecoveryService","hasPendingRecoveries","waitForAllRecoveries","subscribeToRecoveryProgress","FederationService","getConfig","getFederationId","getInviteCode","peer","listOperations","DEFAULT_CLIENT_NAME","FedimintWallet","lazy","_openPromise","_resolveOpen","_isOpen","_client","mint","lightning","balance","federation","recovery","waitForOpen","open","clientName","success","joinFederation","inviteCode","e","isOpen","setLogLevel"],"mappings":"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"}
package/dist/worker.js CHANGED
@@ -1,2 +1,2 @@
1
- globalThis.__vitest_browser_runner__={wrapDynamicImport:e=>e()};let e=null,s=null;const t=new Map;console.log("Worker - init"),self.onmessage=async o=>{const{type:r,payload:n,requestId:i}=o.data;try{if("init"===r)e=(await import("@fedimint/fedimint-client-wasm-bundler")).WasmClient,self.postMessage({type:"initialized",data:{},requestId:i});else if("open"===r){const{clientName:t}=n;s=await e.open(t)||null,self.postMessage({type:"open",data:{success:!!s},requestId:i})}else if("join"===r){const{inviteCode:t,clientName:o}=n;try{s=await e.join_federation(o,t),self.postMessage({type:"join",data:{success:!!s},requestId:i})}catch(e){self.postMessage({type:"error",error:e.message,requestId:i})}}else if("rpc"===r){const{module:e,method:o,body:r}=n;if(console.log("RPC received",e,o,r),!s)return void self.postMessage({type:"error",error:"WasmClient not initialized",requestId:i});const a=await s.rpc(e,o,JSON.stringify(r),(e=>{console.log("RPC response",i,e);const s=JSON.parse(e);if(self.postMessage({type:"rpcResponse",requestId:i,...s}),void 0!==s.end){const e=t.get(i);e?.free()}}));t.set(i,a)}else if("unsubscribe"===r){const e=t.get(i);e&&(e.cancel(),e.free(),t.delete(i))}else self.postMessage({type:"error",error:"Unknown message type",requestId:i})}catch(e){console.error("ERROR",e),self.postMessage({type:"error",error:e,requestId:i})}};
1
+ globalThis.__vitest_browser_runner__={wrapDynamicImport:e=>e()};let e=null,s=null;const t=new Map;console.log("Worker - init"),self.onmessage=async o=>{const{type:r,payload:n,requestId:a}=o.data;try{if("init"===r)e=(await import("@fedimint/fedimint-client-wasm-bundler")).WasmClient,self.postMessage({type:"initialized",data:{},requestId:a});else if("open"===r){const{clientName:t}=n;s=await e.open(t)||null,self.postMessage({type:"open",data:{success:!!s},requestId:a})}else if("join"===r){const{inviteCode:t,clientName:o}=n;try{s=await e.join_federation(o,t),self.postMessage({type:"join",data:{success:!!s},requestId:a})}catch(e){self.postMessage({type:"error",error:e.message,requestId:a})}}else if("rpc"===r){const{module:e,method:o,body:r}=n;if(console.log("RPC received",e,o,r),!s)return void self.postMessage({type:"error",error:"WasmClient not initialized",requestId:a});const i=await s.rpc(e,o,JSON.stringify(r),(e=>{console.log("RPC response",a,e);const s=JSON.parse(e);if(self.postMessage({type:"rpcResponse",requestId:a,...s}),void 0!==s.end){const e=t.get(a);e?.free()}}));t.set(a,i)}else if("unsubscribe"===r){const e=t.get(a);e&&(e.cancel(),e.free(),t.delete(a))}else"cleanup"===r?(console.log("cleanup message received"),s?.free(),self.postMessage({type:"cleanup",data:{},requestId:a}),close()):self.postMessage({type:"error",error:"Unknown message type",requestId:a})}catch(e){console.error("ERROR",e),self.postMessage({type:"error",error:e,requestId:a})}};
2
2
  //# sourceMappingURL=worker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker.js","sources":["../src/worker/worker.js"],"sourcesContent":["// Web Worker for fedimint-client-wasm to run in the browser\n\n// HACK: Fixes vitest browser runner\n// TODO: remove once https://github.com/vitest-dev/vitest/pull/6569 lands in a release\nglobalThis.__vitest_browser_runner__ = { wrapDynamicImport: (foo) => foo() }\n\n// dynamically imported Constructor for WasmClient\nlet WasmClient = null\n// client instance\nlet client = null\n\nconst streamCancelMap = new Map()\n\nconst handleFree = (requestId) => {\n streamCancelMap.delete(requestId)\n}\n\nconsole.log('Worker - init')\n\nself.onmessage = async (event) => {\n const { type, payload, requestId } = event.data\n\n try {\n if (type === 'init') {\n WasmClient = (await import('@fedimint/fedimint-client-wasm-bundler'))\n .WasmClient\n self.postMessage({ type: 'initialized', data: {}, requestId })\n } else if (type === 'open') {\n const { clientName } = payload\n client = (await WasmClient.open(clientName)) || null\n self.postMessage({\n type: 'open',\n data: { success: !!client },\n requestId,\n })\n } else if (type === 'join') {\n const { inviteCode, clientName: joinClientName } = payload\n try {\n client = await WasmClient.join_federation(joinClientName, inviteCode)\n self.postMessage({\n type: 'join',\n data: { success: !!client },\n requestId,\n })\n } catch (e) {\n self.postMessage({ type: 'error', error: e.message, requestId })\n }\n } else if (type === 'rpc') {\n const { module, method, body } = payload\n console.log('RPC received', module, method, body)\n if (!client) {\n self.postMessage({\n type: 'error',\n error: 'WasmClient not initialized',\n requestId,\n })\n return\n }\n const rpcHandle = await client.rpc(\n module,\n method,\n JSON.stringify(body),\n (res) => {\n console.log('RPC response', requestId, res)\n const data = JSON.parse(res)\n self.postMessage({ type: 'rpcResponse', requestId, ...data })\n\n if (data.end !== undefined) {\n // Handle stream ending\n const handle = streamCancelMap.get(requestId)\n handle?.free()\n }\n },\n )\n streamCancelMap.set(requestId, rpcHandle)\n } else if (type === 'unsubscribe') {\n const rpcHandle = streamCancelMap.get(requestId)\n if (rpcHandle) {\n rpcHandle.cancel()\n rpcHandle.free()\n streamCancelMap.delete(requestId)\n }\n } else {\n self.postMessage({\n type: 'error',\n error: 'Unknown message type',\n requestId,\n })\n }\n } catch (e) {\n console.error('ERROR', e)\n self.postMessage({ type: 'error', error: e, requestId })\n }\n}\n\n// self.postMessage({ type: 'init', data: {} })\n"],"names":["globalThis","__vitest_browser_runner__","wrapDynamicImport","foo","WasmClient","client","streamCancelMap","Map","console","log","self","onmessage","async","event","type","payload","requestId","data","import","postMessage","clientName","open","success","inviteCode","joinClientName","join_federation","e","error","message","module","method","body","rpcHandle","rpc","JSON","stringify","res","parse","undefined","end","handle","get","free","set","cancel","delete"],"mappings":"AAIAA,WAAWC,0BAA4B,CAAEC,kBAAoBC,GAAQA,KAGrE,IAAIC,EAAa,KAEbC,EAAS,KAEb,MAAMC,EAAkB,IAAIC,IAM5BC,QAAQC,IAAI,iBAEZC,KAAKC,UAAYC,MAAOC,IACtB,MAAMC,KAAEA,EAAIC,QAAEA,EAAOC,UAAEA,GAAcH,EAAMI,KAE3C,IACE,GAAa,SAATH,EACFV,SAAoBc,OAAO,2CACxBd,WACHM,KAAKS,YAAY,CAAEL,KAAM,cAAeG,KAAM,CAAA,EAAID,mBAC7C,GAAa,SAATF,EAAiB,CAC1B,MAAMM,WAAEA,GAAeL,EACvBV,QAAgBD,EAAWiB,KAAKD,IAAgB,KAChDV,KAAKS,YAAY,CACfL,KAAM,OACNG,KAAM,CAAEK,UAAWjB,GACnBW,aAER,MAAW,GAAa,SAATF,EAAiB,CAC1B,MAAMS,WAAEA,EAAYH,WAAYI,GAAmBT,EACnD,IACEV,QAAeD,EAAWqB,gBAAgBD,EAAgBD,GAC1Db,KAAKS,YAAY,CACfL,KAAM,OACNG,KAAM,CAAEK,UAAWjB,GACnBW,aAEH,CAAC,MAAOU,GACPhB,KAAKS,YAAY,CAAEL,KAAM,QAASa,MAAOD,EAAEE,QAASZ,aACrD,CACP,MAAW,GAAa,QAATF,EAAgB,CACzB,MAAMe,OAAEA,EAAMC,OAAEA,EAAMC,KAAEA,GAAShB,EAEjC,GADAP,QAAQC,IAAI,eAAgBoB,EAAQC,EAAQC,IACvC1B,EAMH,YALAK,KAAKS,YAAY,CACfL,KAAM,QACNa,MAAO,6BACPX,cAIJ,MAAMgB,QAAkB3B,EAAO4B,IAC7BJ,EACAC,EACAI,KAAKC,UAAUJ,IACdK,IACC5B,QAAQC,IAAI,eAAgBO,EAAWoB,GACvC,MAAMnB,EAAOiB,KAAKG,MAAMD,GAGxB,GAFA1B,KAAKS,YAAY,CAAEL,KAAM,cAAeE,eAAcC,SAErCqB,IAAbrB,EAAKsB,IAAmB,CAE1B,MAAMC,EAASlC,EAAgBmC,IAAIzB,GACnCwB,GAAQE,MACT,KAGLpC,EAAgBqC,IAAI3B,EAAWgB,EACrC,MAAW,GAAa,gBAATlB,EAAwB,CACjC,MAAMkB,EAAY1B,EAAgBmC,IAAIzB,GAClCgB,IACFA,EAAUY,SACVZ,EAAUU,OACVpC,EAAgBuC,OAAO7B,GAE/B,MACMN,KAAKS,YAAY,CACfL,KAAM,QACNa,MAAO,uBACPX,aAGL,CAAC,MAAOU,GACPlB,QAAQmB,MAAM,QAASD,GACvBhB,KAAKS,YAAY,CAAEL,KAAM,QAASa,MAAOD,EAAGV,aAC7C"}
1
+ {"version":3,"file":"worker.js","sources":["../src/worker/worker.js"],"sourcesContent":["// Web Worker for fedimint-client-wasm to run in the browser\n\n// HACK: Fixes vitest browser runner\n// TODO: remove once https://github.com/vitest-dev/vitest/pull/6569 lands in a release\nglobalThis.__vitest_browser_runner__ = { wrapDynamicImport: (foo) => foo() }\n\n// dynamically imported Constructor for WasmClient\nlet WasmClient = null\n// client instance\nlet client = null\n\nconst streamCancelMap = new Map()\n\nconst handleFree = (requestId) => {\n streamCancelMap.delete(requestId)\n}\n\nconsole.log('Worker - init')\n\nself.onmessage = async (event) => {\n const { type, payload, requestId } = event.data\n\n try {\n if (type === 'init') {\n WasmClient = (await import('@fedimint/fedimint-client-wasm-bundler'))\n .WasmClient\n self.postMessage({ type: 'initialized', data: {}, requestId })\n } else if (type === 'open') {\n const { clientName } = payload\n client = (await WasmClient.open(clientName)) || null\n self.postMessage({\n type: 'open',\n data: { success: !!client },\n requestId,\n })\n } else if (type === 'join') {\n const { inviteCode, clientName: joinClientName } = payload\n try {\n client = await WasmClient.join_federation(joinClientName, inviteCode)\n self.postMessage({\n type: 'join',\n data: { success: !!client },\n requestId,\n })\n } catch (e) {\n self.postMessage({ type: 'error', error: e.message, requestId })\n }\n } else if (type === 'rpc') {\n const { module, method, body } = payload\n console.log('RPC received', module, method, body)\n if (!client) {\n self.postMessage({\n type: 'error',\n error: 'WasmClient not initialized',\n requestId,\n })\n return\n }\n const rpcHandle = await client.rpc(\n module,\n method,\n JSON.stringify(body),\n (res) => {\n console.log('RPC response', requestId, res)\n const data = JSON.parse(res)\n self.postMessage({ type: 'rpcResponse', requestId, ...data })\n\n if (data.end !== undefined) {\n // Handle stream ending\n const handle = streamCancelMap.get(requestId)\n handle?.free()\n }\n },\n )\n streamCancelMap.set(requestId, rpcHandle)\n } else if (type === 'unsubscribe') {\n const rpcHandle = streamCancelMap.get(requestId)\n if (rpcHandle) {\n rpcHandle.cancel()\n rpcHandle.free()\n streamCancelMap.delete(requestId)\n }\n } else if (type === 'cleanup') {\n console.log('cleanup message received')\n client?.free()\n self.postMessage({\n type: 'cleanup',\n data: {},\n requestId,\n })\n close()\n } else {\n self.postMessage({\n type: 'error',\n error: 'Unknown message type',\n requestId,\n })\n }\n } catch (e) {\n console.error('ERROR', e)\n self.postMessage({ type: 'error', error: e, requestId })\n }\n}\n\n// self.postMessage({ type: 'init', data: {} })\n"],"names":["globalThis","__vitest_browser_runner__","wrapDynamicImport","foo","WasmClient","client","streamCancelMap","Map","console","log","self","onmessage","async","event","type","payload","requestId","data","import","postMessage","clientName","open","success","inviteCode","joinClientName","join_federation","e","error","message","module","method","body","rpcHandle","rpc","JSON","stringify","res","parse","undefined","end","handle","get","free","set","cancel","delete","close"],"mappings":"AAIAA,WAAWC,0BAA4B,CAAEC,kBAAoBC,GAAQA,KAGrE,IAAIC,EAAa,KAEbC,EAAS,KAEb,MAAMC,EAAkB,IAAIC,IAM5BC,QAAQC,IAAI,iBAEZC,KAAKC,UAAYC,MAAOC,IACtB,MAAMC,KAAEA,EAAIC,QAAEA,EAAOC,UAAEA,GAAcH,EAAMI,KAE3C,IACE,GAAa,SAATH,EACFV,SAAoBc,OAAO,2CACxBd,WACHM,KAAKS,YAAY,CAAEL,KAAM,cAAeG,KAAM,CAAA,EAAID,mBAC7C,GAAa,SAATF,EAAiB,CAC1B,MAAMM,WAAEA,GAAeL,EACvBV,QAAgBD,EAAWiB,KAAKD,IAAgB,KAChDV,KAAKS,YAAY,CACfL,KAAM,OACNG,KAAM,CAAEK,UAAWjB,GACnBW,aAER,MAAW,GAAa,SAATF,EAAiB,CAC1B,MAAMS,WAAEA,EAAYH,WAAYI,GAAmBT,EACnD,IACEV,QAAeD,EAAWqB,gBAAgBD,EAAgBD,GAC1Db,KAAKS,YAAY,CACfL,KAAM,OACNG,KAAM,CAAEK,UAAWjB,GACnBW,aAEH,CAAC,MAAOU,GACPhB,KAAKS,YAAY,CAAEL,KAAM,QAASa,MAAOD,EAAEE,QAASZ,aACrD,CACP,MAAW,GAAa,QAATF,EAAgB,CACzB,MAAMe,OAAEA,EAAMC,OAAEA,EAAMC,KAAEA,GAAShB,EAEjC,GADAP,QAAQC,IAAI,eAAgBoB,EAAQC,EAAQC,IACvC1B,EAMH,YALAK,KAAKS,YAAY,CACfL,KAAM,QACNa,MAAO,6BACPX,cAIJ,MAAMgB,QAAkB3B,EAAO4B,IAC7BJ,EACAC,EACAI,KAAKC,UAAUJ,IACdK,IACC5B,QAAQC,IAAI,eAAgBO,EAAWoB,GACvC,MAAMnB,EAAOiB,KAAKG,MAAMD,GAGxB,GAFA1B,KAAKS,YAAY,CAAEL,KAAM,cAAeE,eAAcC,SAErCqB,IAAbrB,EAAKsB,IAAmB,CAE1B,MAAMC,EAASlC,EAAgBmC,IAAIzB,GACnCwB,GAAQE,MACT,KAGLpC,EAAgBqC,IAAI3B,EAAWgB,EACrC,MAAW,GAAa,gBAATlB,EAAwB,CACjC,MAAMkB,EAAY1B,EAAgBmC,IAAIzB,GAClCgB,IACFA,EAAUY,SACVZ,EAAUU,OACVpC,EAAgBuC,OAAO7B,GAE/B,KAAwB,YAATF,GACTN,QAAQC,IAAI,4BACZJ,GAAQqC,OACRhC,KAAKS,YAAY,CACfL,KAAM,UACNG,KAAM,CAAE,EACRD,cAEF8B,SAEApC,KAAKS,YAAY,CACfL,KAAM,QACNa,MAAO,uBACPX,aAGL,CAAC,MAAOU,GACPlB,QAAQmB,MAAM,QAASD,GACvBhB,KAAKS,YAAY,CAAEL,KAAM,QAASa,MAAOD,EAAGV,aAC7C"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@fedimint/core-web",
3
3
  "description": "Library for building web apps with a fedimint client",
4
- "version": "0.0.6",
4
+ "version": "0.0.8",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/fedimint/fedimint-web-sdk.git",
@@ -19,16 +19,19 @@
19
19
  "main": "./dist/index.js",
20
20
  "types": "./dist/index.d.ts",
21
21
  "dependencies": {
22
- "@fedimint/fedimint-client-wasm-bundler": "0.0.1"
22
+ "@fedimint/fedimint-client-wasm-bundler": "0.0.2"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@rollup/plugin-terser": "^0.4.4",
26
26
  "@rollup/plugin-typescript": "^11.1.6",
27
- "@types/node": "^20.14.8",
28
- "rollup": "^4.21.2",
27
+ "@types/node": "^20.16.10",
28
+ "@types/secp256k1": "^4.0.6",
29
+ "rollup": "^4.24.0",
30
+ "rollup-plugin-dts": "^6.1.1",
29
31
  "rollup-plugin-typescript2": "^0.36.0",
32
+ "secp256k1": "^5.0.0",
30
33
  "tslib": "^2.7.0",
31
- "typescript": "^5.2.2"
34
+ "typescript": "^5.6.2"
32
35
  },
33
36
  "scripts": {
34
37
  "build": "rollup --config",
@@ -1,75 +1,58 @@
1
- import { test, expect } from 'vitest'
2
- import { TestFedimintWallet } from './test/TestFedimintWallet'
3
- import { beforeAll } from 'vitest'
1
+ import { expect } from 'vitest'
2
+ import { walletTest } from './test/fixtures'
4
3
 
5
- let randomTestingId: string
6
- let wallet: TestFedimintWallet
7
-
8
- beforeAll(() => {
9
- randomTestingId = Math.random().toString(36).substring(2, 15)
10
- wallet = new TestFedimintWallet()
11
- expect(wallet.testing).toBeDefined()
12
- expect(wallet.testing.getRequestCounter()).toBe(1)
4
+ walletTest('get invite code from devimint', async ({ wallet }) => {
13
5
  expect(wallet).toBeDefined()
14
-
15
- // Cleanup after all tests
16
- return async () => {
17
- // clear up browser resources
18
- await wallet.cleanup()
19
- // remove the wallet db
20
- indexedDB.deleteDatabase(randomTestingId)
21
- // swap out the randomTestingId for a new one, to avoid raciness
22
- randomTestingId = Math.random().toString(36).substring(2, 15)
23
- }
6
+ const inviteCode = await wallet.testing.getInviteCode()
7
+ expect(inviteCode).toBeDefined()
24
8
  })
25
9
 
26
- test('initial open & join', async () => {
27
- expect(wallet).toBeDefined()
28
- expect(wallet.isOpen()).toBe(false)
29
- // On initial open, it should return false
30
- // because no federations have been joined
31
- await expect(wallet.open(randomTestingId)).resolves.toBe(false)
32
- const beforeJoin = wallet.testing.getRequestCounter()
33
- await expect(
34
- wallet.joinFederation(wallet.testing.TESTING_INVITE, randomTestingId),
35
- ).resolves.toBeUndefined()
36
- expect(wallet.testing.getRequestCounter()).toBe(beforeJoin + 1)
37
- expect(wallet.isOpen()).toBe(true)
38
- await expect(wallet.waitForOpen()).resolves.toBeUndefined()
10
+ walletTest('fund wallet with devimint', async ({ fundedWallet }) => {
11
+ expect(fundedWallet).toBeDefined()
12
+ const balance = await fundedWallet.balance.getBalance()
13
+ expect(balance).toBeGreaterThan(0)
39
14
  })
40
15
 
41
- test('Error on open & join if wallet is already open', async () => {
42
- expect(wallet).toBeDefined()
43
- expect(wallet.isOpen()).toBe(true)
44
-
45
- // Test opening an already open wallet
46
- try {
47
- await wallet.open(randomTestingId)
48
- expect.unreachable('Opening a wallet should fail on an already open wallet')
49
- } catch (error) {
50
- expect(error).toBeInstanceOf(Error)
51
- expect((error as Error).message).toBe('The FedimintWallet is already open.')
52
- }
53
-
54
- // Test joining federation on an already open wallet
55
- try {
56
- await wallet.joinFederation(wallet.testing.TESTING_INVITE, randomTestingId)
57
- expect.unreachable('Joining a federation should fail on an open wallet')
58
- } catch (error) {
59
- expect(error).toBeInstanceOf(Error)
60
- expect((error as Error).message).toBe(
61
- 'The FedimintWallet is already open. You can only call `joinFederation` on closed clients.',
62
- )
63
- }
64
- })
65
- test('getConfig', async () => {
16
+ walletTest(
17
+ 'Error on open & join if wallet is already open',
18
+ async ({ wallet }) => {
19
+ expect(wallet).toBeDefined()
20
+ expect(wallet.isOpen()).toBe(true)
21
+
22
+ // Test opening an already open wallet
23
+ try {
24
+ await wallet.open()
25
+ expect.unreachable(
26
+ 'Opening a wallet should fail on an already open wallet',
27
+ )
28
+ } catch (error) {
29
+ expect(error).toBeInstanceOf(Error)
30
+ expect((error as Error).message).toBe(
31
+ 'The FedimintWallet is already open.',
32
+ )
33
+ }
34
+
35
+ // Test joining federation on an already open wallet
36
+ try {
37
+ await wallet.joinFederation(wallet.testing.TESTING_INVITE)
38
+ expect.unreachable('Joining a federation should fail on an open wallet')
39
+ } catch (error) {
40
+ expect(error).toBeInstanceOf(Error)
41
+ expect((error as Error).message).toBe(
42
+ 'The FedimintWallet is already open. You can only call `joinFederation` on closed clients.',
43
+ )
44
+ }
45
+ },
46
+ )
47
+
48
+ walletTest('getConfig', async ({ wallet }) => {
66
49
  expect(wallet).toBeDefined()
67
50
  expect(wallet.isOpen()).toBe(true)
68
51
  const config = await wallet.federation.getConfig()
69
52
  expect(config).toBeDefined()
70
53
  })
71
54
 
72
- test('empty getBalance', async () => {
55
+ walletTest('empty getBalance', async ({ wallet }) => {
73
56
  expect(wallet).toBeDefined()
74
57
  expect(wallet.isOpen()).toBe(true)
75
58
  await expect(wallet.waitForOpen()).resolves.toBeUndefined()