소스 검색

fix(api) `promisified` not cleaning up transformed callbacks, fixes #852 (#853)

Lucas Fernandes Nogueira 5 년 전
부모
커밋
42a8bb0e09
3개의 변경된 파일28개의 추가작업 그리고 6개의 파일을 삭제
  1. 5 0
      .changes/promisified-leak.md
  2. 11 2
      cli/tauri.js/api-src/tauri.ts
  3. 12 4
      cli/tauri.js/templates/tauri.js

+ 5 - 0
.changes/promisified-leak.md

@@ -0,0 +1,5 @@
+---
+"tauri.js": patch
+---
+
+Fixes a memory leak on the `promisified` helper usage.

+ 11 - 2
cli/tauri.js/api-src/tauri.ts

@@ -50,9 +50,18 @@ function transformCallback(callback?: (response: any) => void, once = false): st
  */
 async function promisified<T>(args: any): Promise<T> {
   return await new Promise((resolve, reject) => {
+    const callback = transformCallback(e => {
+      resolve(e)
+      Reflect.deleteProperty(window, error)
+    }, true)
+    const error = transformCallback(e => {
+      reject(e)
+      Reflect.deleteProperty(window, callback)
+    }, true)
+
     invoke({
-      callback: transformCallback(resolve),
-      error: transformCallback(reject),
+      callback,
+      error,
       ...args
     })
   })

+ 12 - 4
cli/tauri.js/templates/tauri.js

@@ -88,8 +88,7 @@ if (!String.prototype.startsWith) {
     window.__TAURI__ = {}
   }
 
-  window.__TAURI__.transformCallback = function transformCallback(callback) {
-    var once = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false
+  window.__TAURI__.transformCallback = function transformCallback(callback, once) {
     var identifier = uid()
 
     window[identifier] = function (result) {
@@ -107,9 +106,18 @@ if (!String.prototype.startsWith) {
     var _this = this
 
     return new Promise(function (resolve, reject) {
+      var callback = _this.transformCallback(function (r) {
+        resolve(r)
+        delete window[error]
+      }, true)
+      var error = _this.transformCallback(function (e) {
+        reject(e)
+        delete window[callback]
+      }, true)
+
       window.__TAURI_INVOKE_HANDLER__(_objectSpread({
-        callback: _this.transformCallback(resolve),
-        error: _this.transformCallback(reject)
+        callback: callback,
+        error: error
       }, args))
     })
   }