1
1
import { IEventService } from 'shim/event-service' ;
2
2
import { MainProcessError } from '@/error/MainProcessError' ;
3
3
4
- const METHOD_NAMES = new Set < keyof IEventService > ( [
5
- 'saveRequest' ,
6
- 'sendRequest' ,
7
- 'getAppVersion' ,
8
- 'loadCollection' ,
9
- 'saveChanges' ,
10
- 'discardChanges' ,
11
- 'deleteObject' ,
12
- 'getActiveEnvironmentVariables' ,
13
- 'getVariable' ,
14
- 'setCollectionVariables' ,
15
- ] ) ;
16
-
17
- const INSTANCE = { } as IEventService ;
18
- for ( const methodName of METHOD_NAMES ) {
19
- Reflect . defineProperty ( INSTANCE , methodName , {
20
- value : createEventMethod ( methodName ) ,
21
- writable : false ,
22
- enumerable : true ,
23
- configurable : false ,
24
- } ) ;
25
- }
26
-
27
4
/**
28
5
* Creates a method that sends an IPC event to the main process and returns the result. If the
29
6
* result is an error, it is thrown.
30
7
* @param methodName The name of the event method to call in the main process.
31
8
*/
32
- function createEventMethod ( methodName : keyof IEventService ) {
33
- return async function ( ...args : any [ ] ) {
9
+ function createEventMethod < T extends keyof IEventService > ( methodName : T ) {
10
+ return async function (
11
+ ...args : Parameters < IEventService [ T ] >
12
+ ) : Promise <
13
+ ReturnType < IEventService [ T ] > extends Promise < infer R > ? R : ReturnType < IEventService [ T ] >
14
+ > {
34
15
const result = await window . electron . ipcRenderer . invoke ( methodName , ...args ) ;
35
16
if ( result instanceof Error ) {
36
17
throw new MainProcessError ( result . message ) ;
@@ -40,7 +21,33 @@ function createEventMethod(methodName: keyof IEventService) {
40
21
} ;
41
22
}
42
23
43
- export const RendererEventService = {
44
- /** The singleton instance of the RendererEventService */
45
- instance : INSTANCE ,
46
- } ;
24
+ export interface RendererEventService {
25
+ on ( event : 'before-close' , listener : ( ) => void ) : this;
26
+
27
+ emit ( event : 'ready-to-close' ) : this;
28
+ }
29
+
30
+ export class RendererEventService implements IEventService {
31
+ public static readonly instance = new RendererEventService ( ) ;
32
+
33
+ on ( event : string , listener : ( ...args : unknown [ ] ) => void ) {
34
+ window . electron . ipcRenderer . on ( event , listener ) ;
35
+ return this ;
36
+ }
37
+
38
+ emit ( event : string , ...args : unknown [ ] ) {
39
+ window . electron . ipcRenderer . send ( event , ...args ) ;
40
+ return this ;
41
+ }
42
+
43
+ saveRequest = createEventMethod ( 'saveRequest' ) ;
44
+ sendRequest = createEventMethod ( 'sendRequest' ) ;
45
+ getAppVersion = createEventMethod ( 'getAppVersion' ) ;
46
+ loadCollection = createEventMethod ( 'loadCollection' ) ;
47
+ saveChanges = createEventMethod ( 'saveChanges' ) ;
48
+ discardChanges = createEventMethod ( 'discardChanges' ) ;
49
+ deleteObject = createEventMethod ( 'deleteObject' ) ;
50
+ getActiveEnvironmentVariables = createEventMethod ( 'getActiveEnvironmentVariables' ) ;
51
+ getVariable = createEventMethod ( 'getVariable' ) ;
52
+ setCollectionVariables = createEventMethod ( 'setCollectionVariables' ) ;
53
+ }
0 commit comments