tauri.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. declare global {
  2. interface Window {
  3. __TAURI_INVOKE_HANDLER__: (command: string) => void
  4. }
  5. }
  6. function s4(): string {
  7. return Math.floor((1 + Math.random()) * 0x10000)
  8. .toString(16)
  9. .substring(1)
  10. }
  11. function uid(): string {
  12. return (
  13. s4() +
  14. s4() +
  15. '-' +
  16. s4() +
  17. '-' +
  18. s4() +
  19. '-' +
  20. s4() +
  21. '-' +
  22. s4() +
  23. s4() +
  24. s4()
  25. )
  26. }
  27. /**
  28. * sends a synchronous command to the backend
  29. *
  30. * @param args
  31. */
  32. function invoke(args: any): void {
  33. window.__TAURI_INVOKE_HANDLER__(args)
  34. }
  35. function transformCallback(
  36. callback?: (response: any) => void,
  37. once = false
  38. ): string {
  39. const identifier = uid()
  40. Object.defineProperty(window, identifier, {
  41. value: (result: any) => {
  42. if (once) {
  43. Reflect.deleteProperty(window, identifier)
  44. }
  45. return callback?.(result)
  46. },
  47. writable: false
  48. })
  49. return identifier
  50. }
  51. /**
  52. * sends an asynchronous command to the backend
  53. *
  54. * @param args
  55. *
  56. * @return {Promise<T>} Promise resolving or rejecting to the backend response
  57. */
  58. async function promisified<T>(args: any): Promise<T> {
  59. return await new Promise((resolve, reject) => {
  60. const callback = transformCallback((e) => {
  61. resolve(e)
  62. Reflect.deleteProperty(window, error)
  63. }, true)
  64. const error = transformCallback((e) => {
  65. reject(e)
  66. Reflect.deleteProperty(window, callback)
  67. }, true)
  68. invoke({
  69. callback,
  70. error,
  71. ...args
  72. })
  73. })
  74. }
  75. export { invoke, transformCallback, promisified }