@danielkalen/simplybind
Version:
Magically simple, framework-less one-way/two-way data binding for frontend/backend in ~5kb.
140 lines (112 loc) • 3.21 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.TaskQueue = undefined;
var _aureliaPal = require('aurelia-pal');
var hasSetImmediate = typeof setImmediate === 'function';
function makeRequestFlushFromMutationObserver(flush) {
var toggle = 1;
var observer = _aureliaPal.DOM.createMutationObserver(flush);
var node = _aureliaPal.DOM.createTextNode('');
observer.observe(node, { characterData: true });
return function requestFlush() {
toggle = -toggle;
node.data = toggle;
};
}
function makeRequestFlushFromTimer(flush) {
return function requestFlush() {
var timeoutHandle = setTimeout(handleFlushTimer, 0);
var intervalHandle = setInterval(handleFlushTimer, 50);
function handleFlushTimer() {
clearTimeout(timeoutHandle);
clearInterval(intervalHandle);
flush();
}
};
}
function onError(error, task) {
if ('onError' in task) {
task.onError(error);
} else if (hasSetImmediate) {
setImmediate(function () {
throw error;
});
} else {
setTimeout(function () {
throw error;
}, 0);
}
}
var TaskQueue = exports.TaskQueue = function () {
function TaskQueue() {
var _this = this;
this.microTaskQueue = [];
this.microTaskQueueCapacity = 1024;
this.taskQueue = [];
if (_aureliaPal.FEATURE.mutationObserver) {
this.requestFlushMicroTaskQueue = makeRequestFlushFromMutationObserver(function () {
return _this.flushMicroTaskQueue();
});
} else {
this.requestFlushMicroTaskQueue = makeRequestFlushFromTimer(function () {
return _this.flushMicroTaskQueue();
});
}
this.requestFlushTaskQueue = makeRequestFlushFromTimer(function () {
return _this.flushTaskQueue();
});
}
TaskQueue.prototype.queueMicroTask = function queueMicroTask(task) {
if (this.microTaskQueue.length < 1) {
this.requestFlushMicroTaskQueue();
}
this.microTaskQueue.push(task);
};
TaskQueue.prototype.queueTask = function queueTask(task) {
if (this.taskQueue.length < 1) {
this.requestFlushTaskQueue();
}
this.taskQueue.push(task);
};
TaskQueue.prototype.flushTaskQueue = function flushTaskQueue() {
var queue = this.taskQueue;
var index = 0;
var task = void 0;
this.taskQueue = [];
try {
while (index < queue.length) {
task = queue[index];
task.call();
index++;
}
} catch (error) {
onError(error, task);
}
};
TaskQueue.prototype.flushMicroTaskQueue = function flushMicroTaskQueue() {
var queue = this.microTaskQueue;
var capacity = this.microTaskQueueCapacity;
var index = 0;
var task = void 0;
try {
while (index < queue.length) {
task = queue[index];
task.call();
index++;
if (index > capacity) {
for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) {
queue[scan] = queue[scan + index];
}
queue.length -= index;
index = 0;
}
}
} catch (error) {
onError(error, task);
}
queue.length = 0;
};
return TaskQueue;
}();