UNPKG

@danielkalen/simplybind

Version:

Magically simple, framework-less one-way/two-way data binding for frontend/backend in ~5kb.

140 lines (113 loc) 3.47 kB
define(['exports', 'aurelia-pal'], function (exports, _aureliaPal) { 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.TaskQueue = undefined; 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; }(); });