diff --git a/src/lib/api/flux/index.ts b/src/lib/api/flux/index.ts index 880902c..985f1c6 100644 --- a/src/lib/api/flux/index.ts +++ b/src/lib/api/flux/index.ts @@ -8,6 +8,8 @@ export const dispatcher = FluxDispatcher; type Intercept = (payload: Record & { type: string; }) => any; let intercepts: Intercept[] = []; +const interceptIndex = new Map(); +let nextInterceptId = 0; /** * @internal @@ -33,7 +35,14 @@ export function injectFluxInterceptor() { (dispatcher._interceptors ??= []).unshift(cb); - return () => dispatcher._interceptors &&= dispatcher._interceptors.filter(v => v !== cb); + return () => { + const idx = interceptIndex.get(cb); + if (idx !== undefined) { + intercepts.splice(idx, 1); + interceptIndex.delete(cb); + intercepts.forEach((intercept, i) => interceptIndex.set(intercept, i)); + } + }; } /** @@ -41,9 +50,16 @@ export function injectFluxInterceptor() { * nullish -> nothing, falsy -> block, object -> modify */ export function intercept(cb: Intercept) { + const id = nextInterceptId++; + interceptIndex.set(cb, id); intercepts.push(cb); return () => { - intercepts = intercepts.filter(i => i !== cb); + const idx = interceptIndex.get(cb); + if (idx !== undefined) { + intercepts.splice(idx, 1); + interceptIndex.delete(cb); + intercepts.forEach((intercept, i) => interceptIndex.set(intercept, i)); + } }; } diff --git a/src/lib/utils/findInTree.ts b/src/lib/utils/findInTree.ts index 9fb7cc6..72280f4 100644 --- a/src/lib/utils/findInTree.ts +++ b/src/lib/utils/findInTree.ts @@ -4,13 +4,13 @@ export type SearchTree = Record; export type SearchFilter = (tree: SearchTree) => boolean; export interface FindInTreeOptions { - walkable?: string[]; - ignore?: string[]; + walkable?: string[] | Set; + ignore?: string[] | Set; maxDepth?: number; } -function treeSearch(tree: SearchTree, filter: SearchFilter, opts: Required, depth: number): any { - if (depth > opts.maxDepth) return; +function treeSearch(tree: SearchTree, filter: SearchFilter, walkable: Set, ignore: Set, maxDepth: number, depth: number): any { + if (depth > maxDepth) return; if (!tree) return; try { @@ -22,21 +22,19 @@ function treeSearch(tree: SearchTree, filter: SearchFilter, opts: Required; export const getMetroCache = () => _metroCache; function buildInitCache() { - let modulesCount = 0; - for (const _ in window.modules) modulesCount++; + const modulesCount = Object.keys(window.modules).length; const cache = { _v: CACHE_VERSION, @@ -47,8 +46,7 @@ export async function initMetroCache() { _metroCache = null!; throw "cache invalidated; version mismatch"; } - let currentCount = 0; - for (const _ in window.modules) currentCount++; + let currentCount = Object.keys(window.modules).length; if (_metroCache._modulesCount !== currentCount) { _metroCache = null!; throw "cache invalidated; modules count mismatch";