123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- 'use strict';
- var globalThis = require('../internals/global-this');
- 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/environment-is-ios');
- var IS_NODE = require('../internals/environment-is-node');
-
- var set = globalThis.setImmediate;
- var clear = globalThis.clearImmediate;
- var process = globalThis.process;
- var Dispatch = globalThis.Dispatch;
- var Function = globalThis.Function;
- var MessageChannel = globalThis.MessageChannel;
- var String = globalThis.String;
- var counter = 0;
- var queue = {};
- var ONREADYSTATECHANGE = 'onreadystatechange';
- var $location, defer, channel, port;
-
- fails(function () {
- // Deno throws a ReferenceError on `location` access without `--location` flag
- $location = globalThis.location;
- });
-
- 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 eventListener = function (event) {
- run(event.data);
- };
-
- var globalPostMessageDefer = function (id) {
- // old engines have not location.origin
- globalThis.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 = eventListener;
- defer = bind(port.postMessage, port);
- // Browsers with postMessage, skip WebWorkers
- // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
- } else if (
- globalThis.addEventListener &&
- isCallable(globalThis.postMessage) &&
- !globalThis.importScripts &&
- $location && $location.protocol !== 'file:' &&
- !fails(globalPostMessageDefer)
- ) {
- defer = globalPostMessageDefer;
- globalThis.addEventListener('message', eventListener, 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
- };
|