Files
threshold-ui/ui/desktop/electron-app/src/preload.js
T
2024-05-31 11:29:24 -07:00

64 lines
2.2 KiB
JavaScript

/**
* Copyright (c) HashiCorp, Inc.
* SPDX-License-Identifier: BUSL-1.1
*/
const { ipcRenderer, contextBridge } = require('electron');
// Messages must originate from this origin
const emberAppOrigin = window.location.origin;
/**
* Exposing terminal creation to an isolated context (Ember)
* More information about contextBridge https://www.electronjs.org/docs/latest/api/context-bridge
* usage example: window.terminal.send(data);
*/
contextBridge.exposeInMainWorld('terminal', {
// We could've sent data through our established postMessage pattern
// but we don't need a response back so we can make it include it here
// to make it simpler. This keeps sending and receiving handlers symmetrical.
send: (data, id) => {
ipcRenderer.send(`terminalKeystroke-${id}`, data);
},
receive: (callback, id) => {
const incomingDataChannel = `terminalIncomingData-${id}`;
ipcRenderer.on(incomingDataChannel, callback);
// Return a function for the caller to handle cleaning up the listener
return () => {
return ipcRenderer.removeListener(incomingDataChannel, callback);
};
},
create: (vars) => {
ipcRenderer.send('createTerminal', vars);
},
remove: (id) => {
ipcRenderer.send(`removeTerminal-${id}`);
},
resize: (size, id) => {
ipcRenderer.send(`resize-${id}`, size);
},
});
process.once('loaded', () => {
/**
* Ember-land has no access to the renderer or node modules, and thus
* cannot call into the main process or make invocations directly.
* In order to communicate with the main process, the Ember app uses
* the `postMessage` interface to send messages to its browser window.
* These messages include message ports with which to receive responses from
* the main process.
*
* This preload script simply wires up the forwarding of
* messages received on the window and responses received from main.
*/
window.addEventListener('message', async function (event) {
if (event.origin !== emberAppOrigin) return;
const { method, payload } = event?.data ?? {};
if (method) {
const response = await ipcRenderer.invoke(method, payload);
event.ports[0].postMessage(response);
}
});
});