feat: adapt electron part

This commit is contained in:
Amadou Ada DIENE
2020-04-18 17:13:02 +02:00
parent 647889cd70
commit 73acf88a07
5 changed files with 80 additions and 2 deletions

View File

@@ -1,6 +1,8 @@
import { app, BrowserWindow } from 'electron';
import { app, BrowserWindow, ipcMain } from 'electron';
import * as path from 'path';
import * as url from 'url';
import { AbstractService } from '../services/abstract-service';
import { MultiplesService } from '../services/multiples-service';
export class Window {
private _window: BrowserWindow | any;
@@ -12,6 +14,7 @@ export class Window {
this.createWindow();
this.loadRender();
this.registerService(MultiplesService);
}
private createWindow(): void {
@@ -61,6 +64,21 @@ export class Window {
});
}
private registerService(AnyService: typeof AbstractService) {
const service = new AnyService();
ipcMain.on(service.receptionChannel(), async (event, ...args) => {
// Handling input
console.log(`Received [${service.receptionChannel()}] : `, args);
const data = await service.process(...args);
// Handling output
if (service.sendingChannel()) {
console.log(`Sent [${service.sendingChannel()}] : `, data);
this._window.webContents.send(service.sendingChannel(), ...data);
}
});
}
public get window(): BrowserWindow | any {
return this._window;
}

View File

@@ -1 +1,23 @@
// To secure user platform when running renderer process stuff,
// Node.JS and Electron APIs are only available in this script
import { contextBridge, ipcRenderer } from 'electron';
import { WindowApi, WindowApiConst } from 'shared';
// So we expose protected methods that allow the renderer process
// to use the ipcRenderer without exposing the entire object
const windowApi: WindowApi = {
send: (channel: any, ...data: any) => {
if (WindowApiConst.SENDING_SAFE_CHANNELS.includes(channel)) {
ipcRenderer.send(channel, ...data);
}
},
receive: (channel: string, func: (...data: any) => void) => {
if (WindowApiConst.RECEIVING_SAFE_CHANNELS.includes(channel)) {
// Deliberately strip event as it includes `sender`
ipcRenderer.on(channel, (event, ...args) => func(...args));
}
},
};
contextBridge.exposeInMainWorld('api', windowApi);
console.log('The preload script has been injected successfully.');

View File

@@ -0,0 +1,13 @@
export class AbstractService {
receptionChannel(): string {
throw new Error('Method not implemented.');
}
sendingChannel(): string {
throw new Error('Method not implemented.');
}
process(...args: any): any {
throw new Error('Method not implemented.');
}
}

View File

@@ -0,0 +1,21 @@
import { WindowApiConst } from 'shared';
import { AbstractService } from './abstract-service';
export class MultiplesService extends AbstractService {
receptionChannel(): string {
return WindowApiConst.MULTIPLES_INPUT;
}
sendingChannel(): string {
return WindowApiConst.MULTIPLES_OUTPUT;
}
process(...args: any): any {
// From 1 to 10, return input multiples
const multiples = [];
for (let n = 1; n <= 10; n++) {
multiples.push(n * args[0]);
}
return multiples;
}
}

View File

@@ -1,7 +1,11 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"outDir": "../../dist/electron"
"outDir": "../../dist/electron",
"composite": true,
"declaration": true,
"baseUrl": "../"
},
"references": [{ "path": "../shared" }],
"include": ["./**/*.ts"]
}