-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathcallEvent.js
89 lines (89 loc) · 3 KB
/
callEvent.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
export function callEvent(apiMethods, onewayreqresMethods) {
let counter = 0;
let queue = {};
let abortedTasks = {};
function getUnique() {
counter++;
return `${counter}.${new Date().getTime()}.${Math.random()}`;
}
async function abortAllTask() {
await Promise.all(Object.keys(queue).map(abortTask));
}
async function abortTask(taskId) {
if (abortedTasks[taskId]) { return; }
if (!queue[taskId]) { return; }
let _resolve;
let promise = new Promise(resolve => _resolve = resolve);
abortedTasks[taskId] = _resolve;
window.electronAPI.send('aborting', { taskId: taskId });
return await promise;
}
let reqAPIQueue = [];
function reqAPI(mode, arg) {
let taskId;
taskId = getUnique();
const promise = (async function () {
reqAPIQueue.push({ mode, arg });
let _resolve;
let _reject;
let promise = new Promise((resolve, reject) => {
_resolve = resolve;
_reject = reject;
});
queue[taskId] = { _resolve, _reject };
while (true) {
if (reqAPIQueue[0].mode === mode && reqAPIQueue[0].arg === arg) {
break;
} else {
await new Promise(resolve => setTimeout(resolve));
}
}
if (!queue[taskId]) {
reqAPIQueue.shift();
throw new Error('aborted');
}
window.electronAPI.send('request', { mode, taskId, arg });
let dt;
let throwed = false;
try { dt = await promise; } catch { throwed = true; }
reqAPIQueue.shift();
if (throwed) throw new Error('aborted');
return dt;
})();
return {
taskId,
promise
}
}
window.electronAPI.receive('requesting', async (arg) => {
let resValue = '';
let reqValue = arg.arg;
let result = null;
if (true) {
resValue = reqValue;
let jdsf = JSON.parse(JSON.stringify(resValue));
delete jdsf.__taskId;
if (apiMethods[arg.mode]) result = await apiMethods[arg.mode](jdsf);
}
window.electronAPI.send('resolving', { taskId: arg.taskId, arg: result });
});
window.electronAPI.receive('aborting_queued', (arg) => {
let taskId = arg.taskId;
if (abortedTasks[taskId]) abortedTasks[taskId]();
queue[taskId]._reject();
delete abortedTasks[taskId];
delete queue[taskId];
});
window.electronAPI.receive('response', (arg) => {
let fnd = queue[arg.taskId];
if (!fnd) return;
delete queue[arg.taskId];
fnd._resolve(arg.arg);
});
window.electronAPI.receive('onewayreqres', (arg) => {
if (onewayreqresMethods[arg.mode]) onewayreqresMethods[arg.mode](arg.arg);
});
return {
reqAPI, abortAllTask, abortTask
}
}