UNPKG

vstack-router

Version:
77 lines (65 loc) 1.37 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createRouter = createRouter; function createRouter(history, transition) { const listeners = new Set(); const waiting = new Set(); let nextLocation; let inProcess = false; function listen(listener) { listeners.add(listener); return () => { listeners.delete(listener); }; } async function navigateTo(location) { const screen = await transition(location); if (screen) { for (const listener of listeners) { listener(screen, location); } } } async function processQueue() { if (inProcess) { return; } if (!nextLocation) { for (const resolve of waiting) { resolve(); } waiting.clear(); return; } const location = nextLocation; nextLocation = undefined; inProcess = true; try { await navigateTo(location); } catch (error) { console.error(error.stack); } finally { inProcess = false; processQueue(); } } function waitQueue() { return new Promise(resolve => { if (inProcess) { waiting.add(resolve); } else { resolve(); } }); } history.listen(location => { nextLocation = location; processQueue(); }); return { listen, waitQueue }; }