Liaison avec ${event.origin}
Vous êtes sur le point de lier l'identité numérique de la clé securisée propre à votre appareil avec ${event.origin}.
Cette action permettra à ${event.origin} d'intéragir avec votre appareil.
Voulez-vous continuer ?
`,
confirmText: 'Ajouter un service',
cancelText: 'Annuler',
},
true
);
if (!result) {
const errorMsg = 'Failed to pair device: User refused to link';
console.error(errorMsg);
// Error handling - no response needed
}
try {
const tokens = await tokenService.generateSessionToken(event.origin);
const acceptedMsg = {
type: MessageType.LINK_ACCEPTED,
accessToken: tokens.accessToken,
refreshToken: tokens.refreshToken,
messageId: event.data.messageId,
};
window.parent.postMessage(acceptedMsg, event.origin);
} catch (error) {
const errorMsg = `Failed to generate tokens: ${error}`;
console.error(errorMsg);
// Error handling - no response needed
}
};
const handleCreatePairing = async (event: MessageEvent) => {
if (event.data.type !== MessageType.CREATE_PAIRING) {
return;
}
console.log('📨 [Router] Received CREATE_PAIRING request');
if (services.isPaired()) {
const errorMsg = '⚠️ Device already paired — ignoring CREATE_PAIRING request';
console.warn(errorMsg);
// Error handling - no response needed
return;
}
try {
const { accessToken } = event.data;
console.log('🔐 Checking access token validity...');
const validToken =
accessToken && (await tokenService.validateToken(accessToken, event.origin));
if (!validToken) {
throw new Error('❌ Invalid or expired session token');
}
console.log('✅ Token validated successfully');
console.log('🚀 Starting pairing process');
const myAddress = services.getDeviceAddress();
console.log('📍 Device address:', myAddress);
console.log('🧱 Creating pairing process...');
const createPairingProcessReturn = await services.createPairingProcess('', [myAddress]);
console.log('🧾 Pairing process created:', createPairingProcessReturn);
const pairingId = createPairingProcessReturn.updated_process?.process_id;
const stateId = createPairingProcessReturn.updated_process?.current_process?.states[0]
?.state_id as string;
console.log('🔗 Pairing ID:', pairingId);
console.log('🧩 State ID:', stateId);
console.log('🔒 Registering device as paired...');
services.pairDevice(pairingId, [myAddress]);
console.log('🧠 Handling API return for createPairingProcess...');
await services.handleApiReturn(createPairingProcessReturn);
console.log('🔍 DEBUG: About to create PRD update...');
console.log('🧰 Creating PRD update...');
const createPrdUpdateReturn = await services.createPrdUpdate(pairingId, stateId);
console.log('🧾 PRD update result:', createPrdUpdateReturn);
await services.handleApiReturn(createPrdUpdateReturn);
console.log('✅ DEBUG: PRD update completed successfully!');
console.log('🔍 DEBUG: About to approve change...');
console.log('✅ Approving change...');
const approveChangeReturn = await services.approveChange(pairingId, stateId);
console.log('📜 Approve change result:', approveChangeReturn);
await services.handleApiReturn(approveChangeReturn);
console.log('✅ DEBUG: approveChange completed successfully!');
console.log('🔍 DEBUG: approveChange completed, about to call waitForPairingCommitment...');
console.log('⏳ Waiting for pairing process to be committed...');
await services.waitForPairingCommitment(pairingId);
console.log('✅ DEBUG: waitForPairingCommitment completed successfully!');
console.log('🔍 DEBUG: About to call confirmPairing...');
console.log('🔁 Confirming pairing...');
await services.confirmPairing(pairingId);
console.log('✅ DEBUG: confirmPairing completed successfully!');
console.log('🎉 Pairing successfully completed!');
// ✅ Send success response to frontend
const successMsg = {
type: MessageType.PAIRING_CREATED,
pairingId,
messageId: event.data.messageId,
};
console.log('📤 Sending PAIRING_CREATED message to UI:', successMsg);
window.parent.postMessage(successMsg, event.origin);
} catch (e) {
const errorMsg = `❌ Failed to create pairing process: ${e}`;
console.error(errorMsg);
// Error handling - no response needed
}
};
const handleGetMyProcesses = async (event: MessageEvent) => {
if (event.data.type !== MessageType.GET_MY_PROCESSES) {
return;
}
if (!services.isPaired()) {
const errorMsg = 'Device not paired';
console.warn(errorMsg);
// Error handling - no response needed
return;
}
try {
const { accessToken } = event.data;
if (!accessToken || !(await tokenService.validateToken(accessToken, event.origin))) {
throw new Error('Invalid or expired session token');
}
const myProcesses = await services.getMyProcesses();
window.parent.postMessage(
{
type: MessageType.GET_MY_PROCESSES,
myProcesses,
messageId: event.data.messageId,
},
event.origin
);
} catch (e) {
const errorMsg = `Failed to get processes: ${e}`;
console.error(errorMsg);
// Error handling - no response needed
}
};
const handleGetProcesses = async (event: MessageEvent) => {
if (event.data.type !== MessageType.GET_PROCESSES) {
return;
}
const tokenService = await TokenService.getInstance();
if (!services.isPaired()) {
const errorMsg = 'Device not paired';
console.warn(errorMsg);
// Error handling - no response needed
return;
}
try {
const { accessToken } = event.data;
// Validate the session token
if (!accessToken || !(await tokenService.validateToken(accessToken, event.origin))) {
throw new Error('Invalid or expired session token');
}
const processes = await services.getProcesses();
window.parent.postMessage(
{
type: MessageType.PROCESSES_RETRIEVED,
processes,
messageId: event.data.messageId,
},
event.origin
);
} catch (e) {
const errorMsg = `Failed to get processes: ${e}`;
console.error(errorMsg);
// Error handling - no response needed
}
};
/// We got a state for some process and return as many clear attributes as we can
const handleDecryptState = async (event: MessageEvent) => {
if (event.data.type !== MessageType.RETRIEVE_DATA) {
return;
}
const tokenService = await TokenService.getInstance();
if (!services.isPaired()) {
const errorMsg = 'Device not paired';
console.warn(errorMsg);
// Error handling - no response needed
return;
}
try {
const { processId, stateId, accessToken } = event.data;
if (!accessToken || !(await tokenService.validateToken(accessToken, event.origin))) {
throw new Error('Invalid or expired session token');
}
// Retrieve the state for the process
const process = await services.getProcess(processId);
if (!process) {
throw new Error("Can't find process");
}
const state = services.getStateFromId(process, stateId);
await services.checkConnections(process, stateId);
let res: Record