UNPKG

respond-framework

Version:
76 lines (74 loc) 2.15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; const debounce0 = async (state, e) => { const func = e.event.debounce; if (!func) return; const debounced = weakMap.get(func) ?? create(func, e.event.debounceDuration, e.event.leading); const res = await debounced.call(state, state, e); if (res !== false) { state.respond.devtools.forceNotification({ ...e, __prefix: '>> ' }); state.respond.devtools.sendPluginNotification({ ...e.arg, type: 'debounce', returned: res }, e); } if (res?.error) { await e.event.error.dispatch(res, { from: e }); } else if (res) { await e.event.done.dispatch(res, { from: e }); } return res; }; var _default = exports.default = debounce0; const weakMap = new WeakMap(); const create = (func, ms = 300, leading = true) => { const debounced = leading ? debounceWithLeading(func, ms) : debounce(func, ms); weakMap.set(func, debounced); return debounced; }; const debounce = (func, ms = 300) => { if (process.env.NODE_ENV === 'test') return func; let timer; return (...args) => { if (window.state?.respond.mem.isFastReplay) { return func.call(void 0, ...args); } clearTimeout(timer); return new Promise(resolve => { timer = setTimeout(() => { resolve(func.call(void 0, ...args)); }, ms); // resolve all promises, so plugin pipeline always exits // successful uncleared calls will occur before this, and therefore this will have no effect setTimeout(() => resolve(false), ms + 1); }); }; }; const debounceWithLeading = (func, ms = 300) => { if (process.env.NODE_ENV === 'test') return func; let timer; return (...args) => { if (window.state?.respond.mem.isFastReplay) { return func.call(void 0, ...args); } clearTimeout(timer); return new Promise(resolve => { timer = setTimeout(() => { setTimeout(() => timer = null, ms); resolve(func.call(void 0, ...args)); }, timer ? ms : 0); setTimeout(() => resolve(false), ms + 1); }); }; };