vstack-router
Version:
Universal router
77 lines (65 loc) • 1.37 kB
JavaScript
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
};
}
;