Skip to content

Commit c704557

Browse files
committed
fix(frontend): potential memory leak in pin module
1 parent d404dac commit c704557

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

webiojs/src/models/pin.ts

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {get_input_item_from_type} from "./input/index"
22
import {InputItem} from "./input/base";
33
import {t} from "../i18n";
44
import {AfterCurrentOutputWidgetShow} from "../handlers/output";
5+
import {randomid} from "../utils";
56

67

78
let name2input: { [k: string]: InputItem } = {};
@@ -16,16 +17,14 @@ export function PinUpdate(name: string, attributes: { [k: string]: any }) {
1617
name2input[name].update_input({attributes: attributes});
1718
}
1819

19-
let onchange_callbacks: { [name: string]: ((val: any) => void)[] } = {}; // name->[]
20+
let onchange_callbacks: { [name: string]: { [callback_id: string]: ((val: any) => void) } } = {}; // name->{callback_id->callback}
2021

2122
export function WaitChange(names: string[], timeout: number) {
2223
let promises = [];
24+
let callback_ids: { [name: string]: string } = {};
2325
for (let name of names) {
24-
if (!(name in onchange_callbacks))
25-
onchange_callbacks[name] = [];
26-
2726
promises.push(new Promise(resolve => {
28-
onchange_callbacks[name].push(value => {
27+
callback_ids[name] = register_on_change(name, value => {
2928
resolve({'name': name, 'value': value})
3029
});
3130
}));
@@ -37,13 +36,29 @@ export function WaitChange(names: string[], timeout: number) {
3736
}, timeout * 1000);
3837
}));
3938
}
40-
return Promise.race(promises);
39+
return Promise.race(promises).then((val) => {
40+
for (let name of names) {
41+
let callback_id = callback_ids[name];
42+
delete onchange_callbacks[name][callback_id];
43+
}
44+
return val;
45+
});
46+
}
47+
48+
function register_on_change(name: string, callback: (val: any) => void): string {
49+
let callback_id = randomid(10);
50+
if (!(name in onchange_callbacks))
51+
onchange_callbacks[name] = {};
52+
onchange_callbacks[name][callback_id] = callback;
53+
return callback_id;
4154
}
4255

4356
function trigger_onchange_event(name: string, value: any) {
44-
let resolve_list = onchange_callbacks[name] || [];
45-
for (let resolve of resolve_list)
57+
let resolve_list = onchange_callbacks[name] || {};
58+
Object.keys(resolve_list).forEach(callback_id => {
59+
let resolve = resolve_list[callback_id];
4660
resolve(value);
61+
})
4762
}
4863

4964
export let PinWidget = {

0 commit comments

Comments
 (0)