@adjust/core
Version:
A framework for creating highly customisable open source software
76 lines • 3.02 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const electron_1 = require("electron");
const eventEmitter_1 = require("../utils/eventEmitter");
class IpcMainSingleton extends eventEmitter_1.EventEmitter {
/**
* Creates a new IpcMain to communicate with other processes
*/
constructor() {
super();
// Keep track of the last used response ID
this.maxResponseID = 0;
// Keep track of the response listeners
this.responseListeners = {};
if (!electron_1.ipcMain)
return;
// Setup a response listener
electron_1.ipcMain.on("IPC.response", (event, { responseID, responses, error }) => {
// Retrieve the 'exposed promise'
const promise = this.responseListeners[responseID];
if (promise) {
// Either resolve or reject it
if (error)
promise.reject(error);
else
promise.resolve(responses);
// Finally let it be garbage collected
delete this.responseListeners[responseID];
}
});
// Setup a message listener
electron_1.ipcMain.on("IPC.message", (event, { channel, args, responseID }) => {
this.emitAsync(channel, ...args)
.then(responses => {
event.sender.send("IPC.response", { responseID, responses });
})
.catch(error => {
event.sender.send("IPC.response", { responseID, error });
});
});
// Setup a synchronous message listener
electron_1.ipcMain.on("IPC.syncMessage", (event, { channel, args }) => {
const responses = this.emit(channel, ...args);
event.returnValue = responses;
});
}
/**
* Sends a message to the passed browserWindow
* @param browserWindow The browser window to pass
* @param channel The channel to pass the data on
* @param args The arguments to pass
* @returns The responses of listeners
*/
async send(browserWindow, channel, ...args) {
if (!electron_1.ipcMain)
throw Error("ipcMain may only be used in the main process");
// Create a promise to return
let resolve, reject;
const promise = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
// Create a new response ID
const responseID = this.maxResponseID++;
// Store the resolver and rejector for this respnse
this.responseListeners[responseID] = {
resolve,
reject,
};
// Send the message
browserWindow.webContents.send("IPC.message", { channel, args, responseID });
// Return the created promise
return promise;
}
}
exports.IpcMain = new IpcMainSingleton();
//# sourceMappingURL=ipcMain.js.map