summaryrefslogtreecommitdiff
path: root/cli/js/ops/dispatch_json.ts
diff options
context:
space:
mode:
Diffstat (limited to 'cli/js/ops/dispatch_json.ts')
-rw-r--r--cli/js/ops/dispatch_json.ts11
1 files changed, 7 insertions, 4 deletions
diff --git a/cli/js/ops/dispatch_json.ts b/cli/js/ops/dispatch_json.ts
index 6fb9007df..4aa1f6b8b 100644
--- a/cli/js/ops/dispatch_json.ts
+++ b/cli/js/ops/dispatch_json.ts
@@ -19,7 +19,10 @@ interface JsonResponse {
promiseId?: number; // Only present in async messages.
}
-const promiseTable = new Map<number, util.Resolvable<JsonResponse>>();
+// Using an object without a prototype because `Map` was causing GC problems.
+const promiseTable: {
+ [key: number]: util.Resolvable<JsonResponse>;
+} = Object.create(null);
let _nextPromiseId = 1;
function nextPromiseId(): number {
@@ -48,9 +51,9 @@ export function asyncMsgFromRust(resUi8: Uint8Array): void {
const res = decode(resUi8);
util.assert(res.promiseId != null);
- const promise = promiseTable.get(res.promiseId!);
+ const promise = promiseTable[res.promiseId!];
util.assert(promise != null);
- promiseTable.delete(res.promiseId!);
+ delete promiseTable[res.promiseId!];
promise.resolve(res);
}
@@ -89,7 +92,7 @@ export async function sendAsync(
promise.resolve(res);
} else {
// Async result.
- promiseTable.set(promiseId, promise);
+ promiseTable[promiseId] = promise;
}
const res = await promise;