| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 | var global = require('../internals/global');var apply = require('../internals/function-apply');var bind = require('../internals/function-bind-context');var isCallable = require('../internals/is-callable');var hasOwn = require('../internals/has-own-property');var fails = require('../internals/fails');var html = require('../internals/html');var arraySlice = require('../internals/array-slice');var createElement = require('../internals/document-create-element');var validateArgumentsLength = require('../internals/validate-arguments-length');var IS_IOS = require('../internals/engine-is-ios');var IS_NODE = require('../internals/engine-is-node');var set = global.setImmediate;var clear = global.clearImmediate;var process = global.process;var Dispatch = global.Dispatch;var Function = global.Function;var MessageChannel = global.MessageChannel;var String = global.String;var counter = 0;var queue = {};var ONREADYSTATECHANGE = 'onreadystatechange';var $location, defer, channel, port;try {  // Deno throws a ReferenceError on `location` access without `--location` flag  $location = global.location;} catch (error) { /* empty */ }var run = function (id) {  if (hasOwn(queue, id)) {    var fn = queue[id];    delete queue[id];    fn();  }};var runner = function (id) {  return function () {    run(id);  };};var listener = function (event) {  run(event.data);};var post = function (id) {  // old engines have not location.origin  global.postMessage(String(id), $location.protocol + '//' + $location.host);};// Node.js 0.9+ & IE10+ has setImmediate, otherwise:if (!set || !clear) {  set = function setImmediate(handler) {    validateArgumentsLength(arguments.length, 1);    var fn = isCallable(handler) ? handler : Function(handler);    var args = arraySlice(arguments, 1);    queue[++counter] = function () {      apply(fn, undefined, args);    };    defer(counter);    return counter;  };  clear = function clearImmediate(id) {    delete queue[id];  };  // Node.js 0.8-  if (IS_NODE) {    defer = function (id) {      process.nextTick(runner(id));    };  // Sphere (JS game engine) Dispatch API  } else if (Dispatch && Dispatch.now) {    defer = function (id) {      Dispatch.now(runner(id));    };  // Browsers with MessageChannel, includes WebWorkers  // except iOS - https://github.com/zloirock/core-js/issues/624  } else if (MessageChannel && !IS_IOS) {    channel = new MessageChannel();    port = channel.port2;    channel.port1.onmessage = listener;    defer = bind(port.postMessage, port);  // Browsers with postMessage, skip WebWorkers  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'  } else if (    global.addEventListener &&    isCallable(global.postMessage) &&    !global.importScripts &&    $location && $location.protocol !== 'file:' &&    !fails(post)  ) {    defer = post;    global.addEventListener('message', listener, false);  // IE8-  } else if (ONREADYSTATECHANGE in createElement('script')) {    defer = function (id) {      html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {        html.removeChild(this);        run(id);      };    };  // Rest old browsers  } else {    defer = function (id) {      setTimeout(runner(id), 0);    };  }}module.exports = {  set: set,  clear: clear};
 |