[{"Id":"202210022037350257","ParentId":"20221002213709684445","Type":"Heading","Sequence":1,"Attributes":{"Level":"2","Text":"Multiple Windows in Electron"}},{"Id":"202210022037590483","ParentId":"20221002213709684445","Type":"Text","Sequence":2,"Attributes":{"Text":"The usual working of Electron is with a single window. But Electron may also work with multiple windows. There are multiple cases where that may be worthwile. For instance if you have multiple monitors, and you want each one to display a different URL."}},{"Id":"202210022040570950","ParentId":"20221002213709684445","Type":"Heading","Sequence":3,"Attributes":{"Level":"2","Text":"Communication Between Two Windows via APC"}},{"Id":"202210022041240336","ParentId":"20221002213709684445","Type":"Text","Sequence":4,"Attributes":{"Text":"Though the two windows will coexist next to each other in your code communication between these can be quite difficult to achieve. The reason for this is that each of the windows runs in its own process (called IPCRenderer). And direct communication between these is not allowed."}},{"Id":"202210022045140943","ParentId":"20221002213709684445","Type":"Text","Sequence":5,"Attributes":{"Text":"The two IPCRenderer processes can only communicate with the main process called IPCMain. But it seems it does not come without its quirks. Allegedly it does pass a few small objects ok. Nevertheless you'll soon reach it's limits as Electron will serialize all data passed via IPC calls."}},{"Id":"202210022049320072","ParentId":"20221002213709684445","Type":"Heading","Sequence":6,"Attributes":{"Level":"2","Text":"Communication Between Two Windows via Websockets and Message Queue"}},{"Id":"202210022050230312","ParentId":"20221002213709684445","Type":"Text","Sequence":7,"Attributes":{"Text":"This is an alternative approach which does not include internal processes. Beware if you are not aware of how websockets and message queues work, it might not be very suitable for you as it can be a bit more involved. It does work in the following manner:"}},{"Id":"202210022057160785","ParentId":"20221002213709684445","Type":"Text","Sequence":8,"Attributes":{"Text":"First each window will open a websocket to a web server."}},{"Id":"202210022051460086","ParentId":"20221002213709684445","Type":"Text","Sequence":9,"Attributes":{"Text":"Second. The webserver on receiving the message will send it to a message queue."}},{"Id":"202210022052230397","ParentId":"20221002213709684445","Type":"Text","Sequence":10,"Attributes":{"Text":"Third. On receiving the message from the message queue, the web server sends the message to the websocket."}},{"Id":"202210022053190945","ParentId":"20221002213709684445","Type":"Text","Sequence":11,"Attributes":{"Text":"Fourth. The windows in Electron will listen to the websocket, and on recieving the message will take action. "}},{"Id":"202210022054470280","ParentId":"20221002213709684445","Type":"Text","Sequence":12,"Attributes":{"Text":"Relevant code example can be seen below where the window grabs the message and appends it to a textarea."}},{"Id":"202210022055100376","ParentId":"20221002213709684445","Type":"Code","Sequence":13,"Attributes":{"Language":"javascript","Code":"let socket = new WebSocket('ws://localhost:1880/ws/electron')\r\n\r\nsocket.onopen = function (e) {\r\n console.log('[open] Connection established')\r\n console.log('Sending to server')\r\n socket.send('I am connection message sent by the 1st screen')\r\n}\r\n\r\n socket.onmessage = function (event) {\r\n let value = document.getElementById('communication').value\r\n value += '\r\n' + event.data\r\n document.getElementById('communication').value = value\r\n}\r\n\r\nsocket.onclose = function (event) {\r\n if (event.wasClean) {\r\n console.log(\r\n [close] Connection closed cleanly, code=${event.code} reason=${event.reason},\r\n )\r\n } else {\r\n // e.g. server process killed or network down\r\n // event.code is usually 1006 in this case\r\n console.log('[close] Connection died')\r\n }\r\n}\r\n\r\nsocket.onerror = function (error) {\r\n console.log([error] ${error.message})\r\n}\r\n\r\nsetInterval(() => {\r\n socket.send('Hello from 1st screen at ' + new Date())\r\n}, 10000)"}},{"Id":"202210022110490556","ParentId":"20221002213709684445","Type":"Heading","Sequence":14,"Attributes":{"Level":"2","Text":"Electron Websockets And Message Queue Diagram"}},{"Id":"202210022108390825","ParentId":"20221002213709684445","Type":"Text","Sequence":15,"Attributes":{"Text":"As usual a visual can be quite useful, which is why a small diagram is attached below to illustrate the concept."}},{"Id":"202210022110040297","ParentId":"20221002213709684445","Type":"Image","Sequence":16,"Attributes":{"Url":"data:image/png;base64,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"}},{"Id":"202210220509260311","ParentId":"20221002213709684445","Type":"Heading","Sequence":17,"Attributes":{"Level":"2","Text":"Starting Websocket Server in Electron with Message Relay"}},{"Id":"202210220513150129","ParentId":"20221002213709684445","Type":"Text","Sequence":18,"Attributes":{"Text":"A wee simpler method is to only use a websocket server which is started by Electron itself before opening the multple windows. Effectively on on port Electron is serving the HTML pages, on another it opens a websocket server, all from the same Electron app. One thing to keep in mind."}},{"Id":"202210220505530972","ParentId":"20221002213709684445","Type":"Code","Sequence":19,"Attributes":{"Language":"javascript","Code":"const WebSocket = require('ws')\r\nconst websocketServer = new WebSocket.Server({ port: 32323 })\r\n\r\nwebsocketServer.on('connection', (socket) => {\r\n console.log('Ws Connection established')\r\n socket.on('message', (message) => {\r\n const receivedMessage = JSON.parse(message.toString())\r\n console.log('Message received', receivedMessage)\r\n\r\n // relay the message to the other paties\r\n websocketServer.clients.forEach(function each(client) {\r\n if (client !== socket && client.readyState === WebSocket.OPEN) {\r\n client.send(receivedMessage)\r\n }\r\n })\r\n })\r\n})"}},{"Id":"202210220518280625","ParentId":"20221002213709684445","Type":"Text","Sequence":20,"Attributes":{"Text":"This method will throw a security notice warning the end user starting the application on Windows that additional permissions are needed. It will show something in the lines of "Windows Defender Has Blocked Some Features of This App" and present an "Allow access" button to continue. In some cases it may be a small nuisance if you are an admin user, in others a show stopper if you are just a regular user."}}]