diff options
Diffstat (limited to 'node_modules/immediate/lib')
| -rw-r--r-- | node_modules/immediate/lib/index.js | 96 | ||||
| -rw-r--r-- | node_modules/immediate/lib/messageChannel.js | 18 | ||||
| -rw-r--r-- | node_modules/immediate/lib/mutation.js | 22 | ||||
| -rw-r--r-- | node_modules/immediate/lib/nextTick.js | 11 | ||||
| -rw-r--r-- | node_modules/immediate/lib/stateChange.js | 24 | ||||
| -rw-r--r-- | node_modules/immediate/lib/timeout.js | 10 |
6 files changed, 181 insertions, 0 deletions
diff --git a/node_modules/immediate/lib/index.js b/node_modules/immediate/lib/index.js new file mode 100644 index 00000000..90c006ad --- /dev/null +++ b/node_modules/immediate/lib/index.js @@ -0,0 +1,96 @@ +'use strict'; +var types = [ + require('./nextTick'), + require('./mutation.js'), + require('./messageChannel'), + require('./stateChange'), + require('./timeout') +]; +var draining; +var currentQueue; +var queueIndex = -1; +var queue = []; +var scheduled = false; +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + nextTick(); + } +} + +//named nextTick for less confusing stack traces +function nextTick() { + if (draining) { + return; + } + scheduled = false; + draining = true; + var len = queue.length; + var timeout = setTimeout(cleanUpNextTick); + while (len) { + currentQueue = queue; + queue = []; + while (currentQueue && ++queueIndex < len) { + currentQueue[queueIndex].run(); + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + queueIndex = -1; + draining = false; + clearTimeout(timeout); +} +var scheduleDrain; +var i = -1; +var len = types.length; +while (++i < len) { + if (types[i] && types[i].test && types[i].test()) { + scheduleDrain = types[i].install(nextTick); + break; + } +} +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + var fun = this.fun; + var array = this.array; + switch (array.length) { + case 0: + return fun(); + case 1: + return fun(array[0]); + case 2: + return fun(array[0], array[1]); + case 3: + return fun(array[0], array[1], array[2]); + default: + return fun.apply(null, array); + } + +}; +module.exports = immediate; +function immediate(task) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(task, args)); + if (!scheduled && !draining) { + scheduled = true; + scheduleDrain(); + } +} diff --git a/node_modules/immediate/lib/messageChannel.js b/node_modules/immediate/lib/messageChannel.js new file mode 100644 index 00000000..a6ce360b --- /dev/null +++ b/node_modules/immediate/lib/messageChannel.js @@ -0,0 +1,18 @@ +'use strict'; + +exports.test = function () { + if (global.setImmediate) { + // we can only get here in IE10 + // which doesn't handel postMessage well + return false; + } + return typeof global.MessageChannel !== 'undefined'; +}; + +exports.install = function (func) { + var channel = new global.MessageChannel(); + channel.port1.onmessage = func; + return function () { + channel.port2.postMessage(0); + }; +};
\ No newline at end of file diff --git a/node_modules/immediate/lib/mutation.js b/node_modules/immediate/lib/mutation.js new file mode 100644 index 00000000..f1597412 --- /dev/null +++ b/node_modules/immediate/lib/mutation.js @@ -0,0 +1,22 @@ +'use strict'; +//based off rsvp https://github.com/tildeio/rsvp.js +//license https://github.com/tildeio/rsvp.js/blob/master/LICENSE +//https://github.com/tildeio/rsvp.js/blob/master/lib/rsvp/asap.js + +var Mutation = global.MutationObserver || global.WebKitMutationObserver; + +exports.test = function () { + return Mutation; +}; + +exports.install = function (handle) { + var called = 0; + var observer = new Mutation(handle); + var element = global.document.createTextNode(''); + observer.observe(element, { + characterData: true + }); + return function () { + element.data = (called = ++called % 2); + }; +};
\ No newline at end of file diff --git a/node_modules/immediate/lib/nextTick.js b/node_modules/immediate/lib/nextTick.js new file mode 100644 index 00000000..6acc0d76 --- /dev/null +++ b/node_modules/immediate/lib/nextTick.js @@ -0,0 +1,11 @@ +'use strict'; +exports.test = function () { + // Don't get fooled by e.g. browserify environments. + return (typeof process !== 'undefined') && !process.browser; +}; + +exports.install = function (func) { + return function () { + process.nextTick(func); + }; +}; diff --git a/node_modules/immediate/lib/stateChange.js b/node_modules/immediate/lib/stateChange.js new file mode 100644 index 00000000..5b2316d7 --- /dev/null +++ b/node_modules/immediate/lib/stateChange.js @@ -0,0 +1,24 @@ +'use strict'; + +exports.test = function () { + return 'document' in global && 'onreadystatechange' in global.document.createElement('script'); +}; + +exports.install = function (handle) { + return function () { + + // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted + // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called. + var scriptEl = global.document.createElement('script'); + scriptEl.onreadystatechange = function () { + handle(); + + scriptEl.onreadystatechange = null; + scriptEl.parentNode.removeChild(scriptEl); + scriptEl = null; + }; + global.document.documentElement.appendChild(scriptEl); + + return handle; + }; +};
\ No newline at end of file diff --git a/node_modules/immediate/lib/timeout.js b/node_modules/immediate/lib/timeout.js new file mode 100644 index 00000000..bd97fd2f --- /dev/null +++ b/node_modules/immediate/lib/timeout.js @@ -0,0 +1,10 @@ +'use strict'; +exports.test = function () { + return true; +}; + +exports.install = function (t) { + return function () { + setTimeout(t, 0); + }; +};
\ No newline at end of file |
