2020-06-27 18:20:00 +03:00
|
|
|
declare global {
|
2020-12-05 04:59:56 +03:00
|
|
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
2020-07-18 14:04:22 +03:00
|
|
|
interface Window {
|
|
|
|
__TAURI_INVOKE_HANDLER__: (command: string) => void
|
2020-06-27 18:20:00 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function s4(): string {
|
|
|
|
return Math.floor((1 + Math.random()) * 0x10000)
|
|
|
|
.toString(16)
|
|
|
|
.substring(1)
|
|
|
|
}
|
|
|
|
|
|
|
|
function uid(): string {
|
2020-08-19 05:36:46 +03:00
|
|
|
return (
|
|
|
|
s4() +
|
|
|
|
s4() +
|
|
|
|
'-' +
|
|
|
|
s4() +
|
|
|
|
'-' +
|
|
|
|
s4() +
|
|
|
|
'-' +
|
|
|
|
s4() +
|
|
|
|
'-' +
|
|
|
|
s4() +
|
|
|
|
s4() +
|
|
|
|
s4()
|
|
|
|
)
|
2020-06-27 18:20:00 +03:00
|
|
|
}
|
|
|
|
|
2020-07-16 02:39:28 +03:00
|
|
|
/**
|
|
|
|
* sends a synchronous command to the backend
|
|
|
|
*
|
|
|
|
* @param args
|
|
|
|
*/
|
2020-06-27 18:20:00 +03:00
|
|
|
function invoke(args: any): void {
|
2020-07-18 14:04:22 +03:00
|
|
|
window.__TAURI_INVOKE_HANDLER__(args)
|
2020-06-27 18:20:00 +03:00
|
|
|
}
|
|
|
|
|
2020-08-19 05:36:46 +03:00
|
|
|
function transformCallback(
|
|
|
|
callback?: (response: any) => void,
|
|
|
|
once = false
|
|
|
|
): string {
|
2020-06-27 18:20:00 +03:00
|
|
|
const identifier = uid()
|
|
|
|
|
|
|
|
Object.defineProperty(window, identifier, {
|
|
|
|
value: (result: any) => {
|
|
|
|
if (once) {
|
|
|
|
Reflect.deleteProperty(window, identifier)
|
|
|
|
}
|
|
|
|
|
|
|
|
return callback?.(result)
|
|
|
|
},
|
2020-10-18 03:02:32 +03:00
|
|
|
writable: false,
|
|
|
|
configurable: true
|
2020-06-27 18:20:00 +03:00
|
|
|
})
|
|
|
|
|
|
|
|
return identifier
|
|
|
|
}
|
|
|
|
|
2020-07-16 02:39:28 +03:00
|
|
|
/**
|
|
|
|
* sends an asynchronous command to the backend
|
|
|
|
*
|
|
|
|
* @param args
|
|
|
|
*
|
|
|
|
* @return {Promise<T>} Promise resolving or rejecting to the backend response
|
|
|
|
*/
|
2020-06-27 18:20:00 +03:00
|
|
|
async function promisified<T>(args: any): Promise<T> {
|
|
|
|
return await new Promise((resolve, reject) => {
|
2020-08-19 05:36:46 +03:00
|
|
|
const callback = transformCallback((e) => {
|
2020-07-18 23:05:32 +03:00
|
|
|
resolve(e)
|
|
|
|
Reflect.deleteProperty(window, error)
|
|
|
|
}, true)
|
2020-08-19 05:36:46 +03:00
|
|
|
const error = transformCallback((e) => {
|
2020-07-18 23:05:32 +03:00
|
|
|
reject(e)
|
|
|
|
Reflect.deleteProperty(window, callback)
|
|
|
|
}, true)
|
|
|
|
|
2020-06-27 18:20:00 +03:00
|
|
|
invoke({
|
2020-07-18 23:05:32 +03:00
|
|
|
callback,
|
|
|
|
error,
|
2020-06-27 18:20:00 +03:00
|
|
|
...args
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2020-08-19 05:36:46 +03:00
|
|
|
export { invoke, transformCallback, promisified }
|