diff --git a/.changeset/nervous-beans-chew.md b/.changeset/nervous-beans-chew.md new file mode 100644 index 0000000..8a542d9 --- /dev/null +++ b/.changeset/nervous-beans-chew.md @@ -0,0 +1,5 @@ +--- +'@fedimint/core-web': patch +--- + +declare worker message types diff --git a/packages/core-web/src/FedimintWallet.ts b/packages/core-web/src/FedimintWallet.ts index ab2de2a..d43ff9c 100644 --- a/packages/core-web/src/FedimintWallet.ts +++ b/packages/core-web/src/FedimintWallet.ts @@ -1,4 +1,4 @@ -import { WorkerClient } from './worker/WorkerClient' +import { WorkerClient, WorkerMessageType } from './worker' import { BalanceService, MintService, @@ -85,9 +85,12 @@ export class FedimintWallet { await this._client.initialize() // TODO: Determine if this should be safe or throw if (this._isOpen) throw new Error('The FedimintWallet is already open.') - const { success } = await this._client.sendSingleMessage('open', { - clientName, - }) + const { success } = await this._client.sendSingleMessage( + WorkerMessageType.Open, + { + clientName, + }, + ) if (success) { this._isOpen = !!success this._resolveOpen() @@ -105,10 +108,13 @@ export class FedimintWallet { throw new Error( 'The FedimintWallet is already open. You can only call `joinFederation` on closed clients.', ) - const response = await this._client.sendSingleMessage('join', { - inviteCode, - clientName, - }) + const response = await this._client.sendSingleMessage( + WorkerMessageType.Join, + { + inviteCode, + clientName, + }, + ) if (response.success) { this._isOpen = true this._resolveOpen() diff --git a/packages/core-web/src/index.ts b/packages/core-web/src/index.ts index df3f646..e8c483a 100644 --- a/packages/core-web/src/index.ts +++ b/packages/core-web/src/index.ts @@ -1,16 +1,4 @@ -import { FedimintWallet } from './FedimintWallet.js' -import { - LightningGateway, - RouteHint, - FeeToAmount, - OutgoingLightningPayment, - PayType, - LnPayState, - CreateBolt11Response, -} from './types/wallet.js' - -export { FedimintWallet } - +export { FedimintWallet } from './FedimintWallet' export type { LightningGateway, RouteHint, @@ -19,4 +7,4 @@ export type { PayType, LnPayState, CreateBolt11Response, -} +} from './types/wallet' diff --git a/packages/core-web/src/worker/WorkerClient.ts b/packages/core-web/src/worker/WorkerClient.ts index 6a51baa..a08398f 100644 --- a/packages/core-web/src/worker/WorkerClient.ts +++ b/packages/core-web/src/worker/WorkerClient.ts @@ -6,6 +6,7 @@ import { StreamResult, } from '../types/wallet' import { logger } from '../utils/logger' +import { WorkerMessageType } from './types' // Handles communication with the wasm worker // TODO: Move rpc stream management to a separate "SubscriptionManager" class @@ -29,7 +30,7 @@ export class WorkerClient { // Idempotent setup - Loads the wasm module initialize() { if (this.initPromise) return this.initPromise - this.initPromise = this.sendSingleMessage('init') + this.initPromise = this.sendSingleMessage(WorkerMessageType.Init) return this.initPromise } @@ -65,7 +66,7 @@ export class WorkerClient { // TODO: Handle timeouts // TODO: Handle multiple errors - sendSingleMessage(type: string, payload?: any): Promise { + sendSingleMessage(type: WorkerMessageType, payload?: any): Promise { return new Promise((resolve, reject) => { const requestId = ++this.requestCounter logger.debug('WorkerClient - sendSingleMessage', requestId, type, payload) @@ -188,14 +189,14 @@ export class WorkerClient { } }) this.worker.postMessage({ - type: 'rpc', + type: WorkerMessageType.Rpc, payload: { module, method, body }, requestId, }) unsubscribePromise.then(() => { this.worker?.postMessage({ - type: 'unsubscribe', + type: WorkerMessageType.Unsubscribe, requestId, }) this.requestCallbacks.delete(requestId) diff --git a/packages/core-web/src/worker/index.ts b/packages/core-web/src/worker/index.ts index cf57f44..dde5f51 100644 --- a/packages/core-web/src/worker/index.ts +++ b/packages/core-web/src/worker/index.ts @@ -1 +1,2 @@ +export { WorkerMessageType } from './types' export { WorkerClient } from './WorkerClient' diff --git a/packages/core-web/src/worker/types.ts b/packages/core-web/src/worker/types.ts new file mode 100644 index 0000000..6516c0c --- /dev/null +++ b/packages/core-web/src/worker/types.ts @@ -0,0 +1,10 @@ +export enum WorkerMessageType { + Init = 'init', + Initialized = 'initialized', + Rpc = 'rpc', + Log = 'log', + Open = 'open', + Join = 'join', + Error = 'error', + Unsubscribe = 'unsubscribe', +} diff --git a/packages/core-web/src/worker/worker.test.ts b/packages/core-web/src/worker/worker.test.ts index 91fed67..c61a04d 100644 --- a/packages/core-web/src/worker/worker.test.ts +++ b/packages/core-web/src/worker/worker.test.ts @@ -2,6 +2,7 @@ import { expect } from 'vitest' import { JSONObject } from '../types/wallet' import { TESTING_INVITE } from '../test/TestingService' import { workerTest } from '../test/setupTests' +import { WorkerMessageType } from './types' // Waits for a message of a given type from the worker const waitForWorkerResponse = ( @@ -12,7 +13,7 @@ const waitForWorkerResponse = ( worker.onmessage = (event) => { if (event.data.type === messageType) { resolve(event.data) - } else if (event.data.type === 'error') { + } else if (event.data.type === WorkerMessageType.Error) { reject(event.data.error) } } @@ -25,8 +26,11 @@ const waitForWorkerResponse = ( workerTest( 'should initialize WasmClient on init message', async ({ worker }) => { - worker.postMessage({ type: 'init', requestId: 1 }) - const response = await waitForWorkerResponse(worker, 'initialized') + worker.postMessage({ type: WorkerMessageType.Init, requestId: 1 }) + const response = await waitForWorkerResponse( + worker, + WorkerMessageType.Initialized, + ) expect(response.data).toEqual({}) }, ) @@ -34,15 +38,15 @@ workerTest( workerTest( 'should return false on open for a new client', async ({ worker, clientName }) => { - worker.postMessage({ type: 'init', requestId: 1 }) - await waitForWorkerResponse(worker, 'initialized') + worker.postMessage({ type: WorkerMessageType.Init, requestId: 1 }) + await waitForWorkerResponse(worker, WorkerMessageType.Initialized) worker.postMessage({ - type: 'open', + type: WorkerMessageType.Open, requestId: 2, payload: { clientName }, }) - const response = await waitForWorkerResponse(worker, 'open') + const response = await waitForWorkerResponse(worker, WorkerMessageType.Open) expect(response.data).toEqual({ success: false }) }, ) @@ -50,16 +54,16 @@ workerTest( workerTest( 'should error on fake federation invitation', async ({ worker, clientName }) => { - worker.postMessage({ type: 'init', requestId: 1 }) - await waitForWorkerResponse(worker, 'initialized') + worker.postMessage({ type: WorkerMessageType.Init, requestId: 1 }) + await waitForWorkerResponse(worker, WorkerMessageType.Initialized) worker.postMessage({ - type: 'join', + type: WorkerMessageType.Join, requestId: 2, payload: { inviteCode: 'fakefederationinvitation', clientName }, }) try { - await waitForWorkerResponse(worker, 'open') + await waitForWorkerResponse(worker, WorkerMessageType.Open) expect.unreachable() } catch (e) { expect(e).toBe('parsing failed') @@ -70,21 +74,21 @@ workerTest( workerTest( 'should handle joining a federation', async ({ worker, clientName }) => { - worker.postMessage({ type: 'init', requestId: 1 }) - await waitForWorkerResponse(worker, 'initialized') + worker.postMessage({ type: WorkerMessageType.Init, requestId: 1 }) + await waitForWorkerResponse(worker, WorkerMessageType.Initialized) worker.postMessage({ - type: 'join', + type: WorkerMessageType.Join, requestId: 2, payload: { inviteCode: TESTING_INVITE, clientName }, }) - const response = await waitForWorkerResponse(worker, 'join') + const response = await waitForWorkerResponse(worker, WorkerMessageType.Join) expect(response.data).toEqual({ success: true }) }, ) workerTest('should handle unknown message type', async ({ worker }) => { worker.postMessage({ type: 'unknown', requestId: 2 }) - const response = await waitForWorkerResponse(worker, 'error') + const response = await waitForWorkerResponse(worker, WorkerMessageType.Error) expect(response.error).toBe('Unknown message type') })