diff --git a/package.json b/package.json index 9947807..5b27c0a 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "jsdom": "^15.1.1", "node-fetch": "^2.6.0", "sqlite3": "^4.0.9", - "typeorm": "^0.2.18" + "typeorm": "^0.2.18", + "uuid": "^3.3.2" }, "devDependencies": { "@electron-forge/cli": "^6.0.0-beta.43", diff --git a/src/declarations/uuid.d.ts b/src/declarations/uuid.d.ts new file mode 100644 index 0000000..39450f3 --- /dev/null +++ b/src/declarations/uuid.d.ts @@ -0,0 +1,4 @@ +declare module 'uuid/v1'; +declare module 'uuid/v3'; +declare module 'uuid/v4'; +declare module 'uuid/v5'; diff --git a/src/main/controllers/api.ts b/src/main/controllers/api.ts index 856e68e..6bfc9aa 100644 --- a/src/main/controllers/api.ts +++ b/src/main/controllers/api.ts @@ -7,6 +7,7 @@ const ipcServer: IIpcServer = { handler(payload.data) .then((result: any) => { const response: IIpcResponse = { + id: payload.id, success: true, data: result, }; @@ -14,6 +15,7 @@ const ipcServer: IIpcServer = { }) .catch((reason: any) => { const response: IIpcResponse = { + id: payload.id, success: false, error: reason.toString(), }; diff --git a/src/renderer/services/api.ts b/src/renderer/services/api.ts index 47f6f29..3c890c4 100644 --- a/src/renderer/services/api.ts +++ b/src/renderer/services/api.ts @@ -1,20 +1,25 @@ import { ipcRenderer } from 'electron'; import IpcMessageEvent = Electron.IpcMessageEvent; +import { uuid } from '../../services/uuid'; const ipcClient: IIpcClient = { ask: (channel: IpcChannels, data?: any): Promise => { + const id = uuid(); const payload: IIpcPayload = { + id, data, }; return new Promise((resolve: (value?: any) => void, reject: (reason?: any) => void): void => { const listener = (event: IpcMessageEvent, response: IIpcResponse): void => { - if (response.success) { - resolve(response.data); - } else { - reject(response.error); + if (response.id === id) { + if (response.success) { + resolve(response.data); + } else { + reject(response.error); + } + ipcRenderer.removeListener(channel, listener); } - ipcRenderer.removeListener(channel, listener); }; ipcRenderer.send(channel, payload); ipcRenderer.on(channel, listener); diff --git a/src/services/uuid.ts b/src/services/uuid.ts new file mode 100644 index 0000000..7bf7b44 --- /dev/null +++ b/src/services/uuid.ts @@ -0,0 +1,14 @@ +import uuidv1 from 'uuid/v1'; + +const R = 0x52; +const e = 0x65; +const n = 0x6e; +const a = 0x61; +const i = 0x69; +const nice = 0x45; + +export function uuid(): string { + return uuidv1({ + node: [R, e, n, a, i, nice], + }); +} diff --git a/src/types/ipc.ts b/src/types/ipc.ts index 9e79782..bc2b8b3 100644 --- a/src/types/ipc.ts +++ b/src/types/ipc.ts @@ -4,10 +4,12 @@ const enum IpcChannels { } interface IIpcPayload { + id: string; data: any; } interface IIpcResponse { + id: string; success: boolean; data?: any; error?: any;