| '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 | 
| }; |