diff --git a/packages/suite-desktop-core/src/modules/trezor-connect.ts b/packages/suite-desktop-core/src/modules/trezor-connect.ts index 13fd7e99143c..f01c31207397 100644 --- a/packages/suite-desktop-core/src/modules/trezor-connect.ts +++ b/packages/suite-desktop-core/src/modules/trezor-connect.ts @@ -1,12 +1,71 @@ import { ipcMain } from 'electron'; +import { WebSocketServer } from 'ws'; import TrezorConnect, { DEVICE_EVENT } from '@trezor/connect'; import { createIpcProxyHandler, IpcProxyHandlerOptions } from '@trezor/ipc-proxy'; +import { isDevEnv } from '@suite-common/suite-utils'; import { Dependencies, mainThreadEmitter, ModuleInitBackground, ModuleInit } from './index'; +import { app } from '../typed-electron'; export const SERVICE_NAME = '@trezor/connect'; +const exposeConnectWs = ({ + mainThreadEmitter, +}: { + mainThreadEmitter: Dependencies['mainThreadEmitter']; +}) => { + const { logger } = global; + + const wss = new WebSocketServer({ + port: 8090, + }); + + wss.on('listening', () => { + logger.info(`${SERVICE_NAME}-ws`, 'Listening on ws://localhost:8090'); + }); + + wss.on('connection', function connection(ws) { + ws.on('error', err => { + logger.error(`${SERVICE_NAME}-ws`, err.message); + }); + + ws.on('message', async function message(data) { + let message; + try { + message = JSON.parse(data.toString()); + } catch (err) { + message = data.toString(); + } + try { + if (message === 'handshake') { + ws.send('handshake'); + return; + } + if (typeof message !== 'object' || !message.payload || !message.payload.method) { + logger.error(`${SERVICE_NAME}-ws`, 'invalid message'); + return; + } + + const { method, ...rest } = message.payload; + // focus renderer window + mainThreadEmitter.emit('app/show'); + // @ts-expect-error + const response = await TrezorConnect[method](rest); + ws.send(JSON.stringify(response)); + } finally { + // blur renderer window + // mainThreadEmitter.emit(''); + } + }); + }); + + // todo: hmmm am I allowed to use app here directly? + app.on('before-quit', () => { + wss.close(); + }); +}; + export const initBackground: ModuleInitBackground = ({ store }: Pick) => { const { logger } = global; logger.info(SERVICE_NAME, `Starting service`); @@ -28,6 +87,10 @@ export const initBackground: ModuleInitBackground = ({ store }: Pick