// // Copyright (C) Stanislaw Adaszewski, 2020 // Contact: s.adaszewski@gmail.com // Website: https://adared.ch/wba // License: GNU Affero General Public License, Version 3 // const defaultOrderRegistry = {}; /* function notify(orderRegistry) { if (!('listeners' in orderRegistry)) return; for (let k in orderRegistry.listeners) { orderRegistry.listeners[k](orderRegistry); } } */ function cursorDecor() { let d = $('#cursor-decor'); if (d.length === 1) return $(d[0]); d = $('
\
\
\
\
'); $(document.body).append(d); let pageX = 0, pageY = 0, scrollX = 0, scrollY = 0; document.addEventListener('mousemove', e => { pageX = e.pageX; pageY = e.pageY; d.css({ left: (e.pageX + 16) + 'px', top: (e.pageY + 16) + 'px' }) scrollX = window.scrollX; scrollY = window.scrollY; }); document.addEventListener('scroll', e => { d.css({ left: (pageX + window.scrollX - scrollX + 16) + 'px', top: (pageY + window.scrollY - scrollY + 16) + 'px' }); }); return d; } function updateCursorDecor(orderRegistry) { const d = cursorDecor(); if (Object.keys(orderRegistry.pendingCompletion).length === 0) d.hide(); else d.show(); } function wbApplyPromiseOrdering(prom, orderRegistry) { let orderId; if (!orderRegistry) orderRegistry = defaultOrderRegistry; //if (Object.keys(orderRegistry).length === 0) { if (!('started' in orderRegistry)) { orderRegistry.started = 0; orderRegistry.pendingCompletion = {}; orderRegistry.completed = { 0: true }; } orderRegistry.started += 1; orderId = orderRegistry.started; // console.log('New orderId: ' + orderId); // notify(orderRegistry); cursorDecor().show(); const orderCallback = ((isCatch, payload) => { // console.log('orderId: ' + orderId + // ', pendingCompletion: ' + Object.keys(orderRegistry.pendingCompletion) + // ', completed: ' + Object.keys(orderRegistry.completed)); if ((orderId - 1) in orderRegistry.completed) { // console.log('Running: ' + orderId); orderRegistry.completed[orderId] = true; delete orderRegistry.pendingCompletion[orderId]; const keys = Object.keys(orderRegistry.pendingCompletion); keys.sort((a, b) => (a - b)); keys.map(k => { if ((k - 1) in orderRegistry.completed) { // console.log('Running: ' + k); orderRegistry.pendingCompletion[k](); orderRegistry.completed[k] = true; delete orderRegistry.pendingCompletion[k]; } }); if (orderRegistry.started in orderRegistry.completed) { // console.log('Garbage collect'); orderRegistry.started = 0; orderRegistry.completed = { 0: true }; cursorDecor().hide(); } if (isCatch) throw payload; else return payload; } const prom_1 = new Promise((accept, reject) => { orderRegistry.pendingCompletion[orderId] = (() => (isCatch ? reject(payload) : accept(payload))); }); return prom_1; }); prom = prom.then(xhr => orderCallback(false, xhr)); prom = prom.catch(e => orderCallback(true, e)); return prom; } export default wbApplyPromiseOrdering;