From ac11893e930ab5b0c8daa8c68d1f395dd5502be6 Mon Sep 17 00:00:00 2001 From: NicolasCantu Date: Wed, 25 Jun 2025 16:59:20 +0200 Subject: [PATCH] Add messageId to each message, refactor listeners --- src/router.ts | 146 +++++++++++++++++++++++++++++++------------------- 1 file changed, 92 insertions(+), 54 deletions(-) diff --git a/src/router.ts b/src/router.ts index 4ef6479..70370aa 100755 --- a/src/router.ts +++ b/src/router.ts @@ -170,16 +170,18 @@ export async function registerAllListeners() { const services = await Services.getInstance(); const tokenService = await TokenService.getInstance(); - const errorResponse = (errorMsg: string, origin: string) => { + const errorResponse = (errorMsg: string, origin: string, messageId?: string) => { window.parent.postMessage( { type: MessageType.ERROR, - error: errorMsg + error: errorMsg, + messageId }, origin ); } + // --- Handler functions --- const handleRequestLink = async (event: MessageEvent) => { if (event.data.type !== MessageType.REQUEST_LINK) { return; @@ -212,7 +214,7 @@ export async function registerAllListeners() { } } catch (error) { const errorMsg = `Failed to pair device: ${error}`; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); } try { @@ -220,7 +222,8 @@ export async function registerAllListeners() { const acceptedMsg = { type: MessageType.LINK_ACCEPTED, accessToken: tokens.accessToken, - refreshToken: tokens.refreshToken + refreshToken: tokens.refreshToken, + messageId: event.data.messageId }; window.parent.postMessage( acceptedMsg, @@ -228,7 +231,7 @@ export async function registerAllListeners() { ); } catch (error) { const errorMsg = `Failed to generate tokens: ${error}`; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); } } @@ -239,7 +242,7 @@ export async function registerAllListeners() { if (!services.isPaired()) { const errorMsg = 'Device not paired'; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); return; } @@ -255,13 +258,14 @@ export async function registerAllListeners() { window.parent.postMessage( { type: MessageType.GET_MY_PROCESSES, - myProcesses + myProcesses, + messageId: event.data.messageId }, event.origin ); } catch (e) { const errorMsg = `Failed to get processes: ${e}`; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); } } @@ -274,7 +278,7 @@ export async function registerAllListeners() { if (!services.isPaired()) { const errorMsg = 'Device not paired'; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); return; } @@ -291,13 +295,14 @@ export async function registerAllListeners() { window.parent.postMessage( { type: MessageType.PROCESSES_RETRIEVED, - processes + processes, + messageId: event.data.messageId }, event.origin ); } catch (e) { const errorMsg = `Failed to get processes: ${e}`; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); } } @@ -310,7 +315,7 @@ export async function registerAllListeners() { if (!services.isPaired()) { const errorMsg = 'Device not paired'; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); return; } @@ -348,12 +353,13 @@ export async function registerAllListeners() { { type: MessageType.DATA_RETRIEVED, data: res, + messageId: event.data.messageId }, event.origin ); } catch (e) { const errorMsg = `Failed to retrieve data: ${e}`; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); } } @@ -365,7 +371,7 @@ export async function registerAllListeners() { const accessToken = event.data.accessToken; const refreshToken = event.data.refreshToken; if (!accessToken || !refreshToken) { - errorResponse('Failed to validate token: missing access, refresh token or both', event.origin); + errorResponse('Failed to validate token: missing access, refresh token or both', event.origin, event.data.messageId); } const isValid = await tokenService.validateToken(accessToken, event.origin); @@ -375,7 +381,8 @@ export async function registerAllListeners() { type: MessageType.VALIDATE_TOKEN, accessToken: accessToken, refreshToken: refreshToken, - isValid: isValid + isValid: isValid, + messageId: event.data.messageId }, event.origin ); @@ -403,13 +410,14 @@ export async function registerAllListeners() { { type: MessageType.RENEW_TOKEN, accessToken: newAccessToken, - refreshToken: refreshToken + refreshToken: refreshToken, + messageId: event.data.messageId }, event.origin ); } catch (error) { const errorMsg = `Failed to renew token: ${error}`; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); } } @@ -418,7 +426,7 @@ export async function registerAllListeners() { if (!services.isPaired()) { const errorMsg = 'Device not paired'; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); return; } @@ -435,12 +443,13 @@ export async function registerAllListeners() { { type: MessageType.GET_PAIRING_ID, userPairingId, + messageId: event.data.messageId }, event.origin ); } catch (e) { const errorMsg = `Failed to get pairing id: ${e}`; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); } } @@ -449,7 +458,7 @@ export async function registerAllListeners() { if (!services.isPaired()) { const errorMsg = 'Device not paired'; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); return; } @@ -481,12 +490,13 @@ export async function registerAllListeners() { { type: MessageType.PROCESS_CREATED, processCreated: res, + messageId: event.data.messageId }, event.origin ); } catch (e) { const errorMsg = `Failed to create process: ${e}`; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); } } @@ -495,7 +505,7 @@ export async function registerAllListeners() { if (!services.isPaired()) { const errorMsg = 'Device not paired'; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); return; } @@ -516,12 +526,13 @@ export async function registerAllListeners() { window.parent.postMessage( { type: MessageType.UPDATE_NOTIFIED, + messageId: event.data.messageId }, event.origin ); } catch (e) { const errorMsg = `Failed to notify update for process: ${e}`; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); } } @@ -530,7 +541,7 @@ export async function registerAllListeners() { if (!services.isPaired()) { const errorMsg = 'Device not paired'; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); return; } @@ -548,12 +559,13 @@ export async function registerAllListeners() { { type: MessageType.STATE_VALIDATED, validatedProcess: res.updated_process, + messageId: event.data.messageId }, event.origin ); } catch (e) { const errorMsg = `Failed to validate process: ${e}`; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); } } @@ -562,7 +574,7 @@ export async function registerAllListeners() { if (!services.isPaired()) { const errorMsg = 'Device not paired'; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); } try { @@ -638,12 +650,13 @@ export async function registerAllListeners() { { type: MessageType.PROCESS_UPDATED, updatedProcess: res.updated_process, + messageId: event.data.messageId }, event.origin ); } catch (e) { const errorMsg = `Failed to update process: ${e}`; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); } } @@ -652,7 +665,7 @@ export async function registerAllListeners() { if (!services.isPaired()) { const errorMsg = 'Device not paired'; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); return; } @@ -669,41 +682,66 @@ export async function registerAllListeners() { { type: MessageType.PUBLIC_DATA_DECODED, decodedData, + messageId: event.data.messageId }, event.origin ); } catch (e) { const errorMsg = `Failed to decode data: ${e}`; - errorResponse(errorMsg, event.origin); + errorResponse(errorMsg, event.origin, event.data.messageId); } } - // Remove before adding to be sure there's no duplicate - window.removeEventListener('message', handleUpdateProcess); - window.removeEventListener('message', handleRequestLink); - window.removeEventListener('message', handleGetProcesses); - window.removeEventListener('message', handleGetMyProcesses); - window.removeEventListener('message', handleDecryptState); - window.removeEventListener('message', handleValidateToken); - window.removeEventListener('message', handleRenewToken); - window.removeEventListener('message', handleGetPairingId); - window.removeEventListener('message', handleCreateProcess); - window.removeEventListener('message', handleValidateState); - window.removeEventListener('message', handleNotifyUpdate); - window.removeEventListener('message', handleDecodePublicData); + window.removeEventListener('message', handleMessage); + window.addEventListener('message', handleMessage); - window.addEventListener('message', handleUpdateProcess); - window.addEventListener('message', handleRequestLink); - window.addEventListener('message', handleGetProcesses); - window.addEventListener('message', handleGetMyProcesses); - window.addEventListener('message', handleDecryptState); - window.addEventListener('message', handleValidateToken); - window.addEventListener('message', handleRenewToken); - window.addEventListener('message', handleGetPairingId); - window.addEventListener('message', handleCreateProcess); - window.addEventListener('message', handleValidateState); - window.addEventListener('message', handleNotifyUpdate); - window.addEventListener('message', handleDecodePublicData); + async function handleMessage(event: MessageEvent) { + try { + switch (event.data.type) { + case MessageType.REQUEST_LINK: + await handleRequestLink(event); + break; + case MessageType.GET_MY_PROCESSES: + await handleGetMyProcesses(event); + break; + case MessageType.GET_PROCESSES: + await handleGetProcesses(event); + break; + case MessageType.RETRIEVE_DATA: + await handleDecryptState(event); + break; + case MessageType.VALIDATE_TOKEN: + await handleValidateToken(event); + break; + case MessageType.RENEW_TOKEN: + await handleRenewToken(event); + break; + case MessageType.GET_PAIRING_ID: + await handleGetPairingId(event); + break; + case MessageType.CREATE_PROCESS: + await handleCreateProcess(event); + break; + case MessageType.NOTIFY_UPDATE: + await handleNotifyUpdate(event); + break; + case MessageType.VALIDATE_STATE: + await handleValidateState(event); + break; + case MessageType.UPDATE_PROCESS: + await handleUpdateProcess(event); + break; + case MessageType.DECODE_PUBLIC_DATA: + await handleDecodePublicData(event); + break; + default: + console.warn(`Unhandled message type: ${event.data.type}`); + } + } catch (error) { + const errorMsg = `Error handling message: ${error}`; + errorResponse(errorMsg, event.origin, event.data.messageId); + } + } console.log('Initialized event handlers');