tauri.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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. configurable: true
  49. })
  50. return identifier
  51. }
  52. /**
  53. * sends an asynchronous command to the backend
  54. *
  55. * @param args
  56. *
  57. * @return {Promise<T>} Promise resolving or rejecting to the backend response
  58. */
  59. async function promisified<T>(args: any): Promise<T> {
  60. return await new Promise((resolve, reject) => {
  61. const callback = transformCallback((e) => {
  62. resolve(e)
  63. Reflect.deleteProperty(window, error)
  64. }, true)
  65. const error = transformCallback((e) => {
  66. reject(e)
  67. Reflect.deleteProperty(window, callback)
  68. }, true)
  69. invoke({
  70. callback,
  71. error,
  72. ...args
  73. })
  74. })
  75. }
  76. export { invoke, transformCallback, promisified }