{"version":3,"file":"Immediate.js","sourceRoot":"","sources":["../../src/util/Immediate.ts"],"names":[],"mappings":"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","sourcesContent":["/**\nSome credit for this helper goes to http://github.com/YuzuJS/setImmediate\n*/\n\nimport {  root  } from './root';\n\nexport class ImmediateDefinition {\n  setImmediate: (cb: () => void) => number;\n\n  clearImmediate: (handle: number) => void;\n\n  private identify(o: any): string {\n    return this.root.Object.prototype.toString.call(o);\n  }\n\n  tasksByHandle: any;\n\n  nextHandle: number;\n\n  currentlyRunningATask: boolean;\n\n  constructor(private root: any) {\n    if (root.setImmediate && typeof root.setImmediate === 'function') {\n      this.setImmediate = root.setImmediate.bind(root);\n      this.clearImmediate = root.clearImmediate.bind(root);\n    } else {\n      this.nextHandle = 1;\n      this.tasksByHandle = {};\n      this.currentlyRunningATask = false;\n\n      // Don't get fooled by e.g. browserify environments.\n      if (this.canUseProcessNextTick()) {\n        // For Node.js before 0.9\n        this.setImmediate = this.createProcessNextTickSetImmediate();\n      } else if (this.canUsePostMessage()) {\n        // For non-IE10 modern browsers\n        this.setImmediate = this.createPostMessageSetImmediate();\n      } else if (this.canUseMessageChannel()) {\n        // For web workers, where supported\n        this.setImmediate = this.createMessageChannelSetImmediate();\n      } else if (this.canUseReadyStateChange()) {\n        // For IE 6–8\n        this.setImmediate = this.createReadyStateChangeSetImmediate();\n      } else {\n        // For older browsers\n        this.setImmediate = this.createSetTimeoutSetImmediate();\n      }\n\n      let ci = function clearImmediate(handle: any) {\n        delete (<any>clearImmediate).instance.tasksByHandle[handle];\n      };\n\n      (<any>ci).instance = this;\n\n      this.clearImmediate = ci;\n    }\n  }\n\n  canUseProcessNextTick() {\n    return this.identify(this.root.process) === '[object process]';\n  }\n\n  canUseMessageChannel() {\n    return Boolean(this.root.MessageChannel);\n  }\n\n  canUseReadyStateChange() {\n    const document = this.root.document;\n    return Boolean(document && 'onreadystatechange' in document.createElement('script'));\n  }\n\n  canUsePostMessage() {\n    const root = this.root;\n    // The test against `importScripts` prevents this implementation from being installed inside a web worker,\n    // where `root.postMessage` means something completely different and can't be used for this purpose.\n    if (root.postMessage && !root.importScripts) {\n      let postMessageIsAsynchronous = true;\n      let oldOnMessage = root.onmessage;\n      root.onmessage = function() {\n        postMessageIsAsynchronous = false;\n      };\n      root.postMessage('', '*');\n      root.onmessage = oldOnMessage;\n      return postMessageIsAsynchronous;\n    }\n\n    return false;\n  }\n\n  // This function accepts the same arguments as setImmediate, but\n  // returns a function that requires no arguments.\n  partiallyApplied(handler: any, ...args: any[]) {\n    let fn = function result () {\n      const { handler, args } = <any>result;\n      if (typeof handler === 'function') {\n        handler.apply(undefined, args);\n      } else {\n        (new Function('' + handler))();\n      }\n    };\n\n    (<any>fn).handler = handler;\n    (<any>fn).args = args;\n\n    return fn;\n  }\n\n  addFromSetImmediateArguments(args: any[]) {\n    this.tasksByHandle[this.nextHandle] = this.partiallyApplied.apply(undefined, args);\n    return this.nextHandle++;\n  }\n\n  createProcessNextTickSetImmediate() {\n    let fn = function setImmediate() {\n      const { instance } = (<any>setImmediate);\n      let handle = instance.addFromSetImmediateArguments(arguments);\n      instance.root.process.nextTick(instance.partiallyApplied(instance.runIfPresent, handle));\n      return handle;\n    };\n\n    (<any>fn).instance = this;\n\n    return fn;\n  }\n\n  createPostMessageSetImmediate() {\n    // Installs an event handler on `global` for the `message` event: see\n    // * https://developer.mozilla.org/en/DOM/window.postMessage\n    // * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages\n    const root = this.root;\n\n    let messagePrefix = 'setImmediate$' + root.Math.random() + '$';\n    let onGlobalMessage = function globalMessageHandler(event: any) {\n      const instance = (<any>globalMessageHandler).instance;\n      if (event.source === root &&\n        typeof event.data === 'string' &&\n        event.data.indexOf(messagePrefix) === 0) {\n        instance.runIfPresent(+event.data.slice(messagePrefix.length));\n      }\n    };\n    (<any>onGlobalMessage).instance = this;\n\n    root.addEventListener('message', onGlobalMessage, false);\n\n    let fn = function setImmediate() {\n      const { messagePrefix, instance } = (<any>setImmediate);\n      let handle = instance.addFromSetImmediateArguments(arguments);\n      instance.root.postMessage(messagePrefix + handle, '*');\n      return handle;\n    };\n\n    (<any>fn).instance = this;\n    (<any>fn).messagePrefix = messagePrefix;\n\n    return fn;\n  }\n\n  runIfPresent(handle: any) {\n    // From the spec: 'Wait until any invocations of this algorithm started before this one have completed.'\n    // So if we're currently running a task, we'll need to delay this invocation.\n    if (this.currentlyRunningATask) {\n      // Delay by doing a setTimeout. setImmediate was tried instead, but in Firefox 7 it generated a\n      // 'too much recursion' error.\n      this.root.setTimeout(this.partiallyApplied(this.runIfPresent, handle), 0);\n    } else {\n      let task = this.tasksByHandle[handle];\n      if (task) {\n        this.currentlyRunningATask = true;\n        try {\n          task();\n        } finally {\n          this.clearImmediate(handle);\n          this.currentlyRunningATask = false;\n        }\n      }\n    }\n  }\n\n  createMessageChannelSetImmediate() {\n    let channel = new this.root.MessageChannel();\n    channel.port1.onmessage = (event: any) => {\n      let handle = event.data;\n      this.runIfPresent(handle);\n    };\n\n    let fn = function setImmediate() {\n      const { channel, instance } = (<any>setImmediate);\n      let handle = instance.addFromSetImmediateArguments(arguments);\n      channel.port2.postMessage(handle);\n      return handle;\n    };\n\n    (<any>fn).channel = channel;\n    (<any>fn).instance = this;\n\n    return fn;\n  }\n\n  createReadyStateChangeSetImmediate() {\n    let fn = function setImmediate() {\n      const instance = (<any>setImmediate).instance;\n      const root = instance.root;\n      const doc = root.document;\n      const html = doc.documentElement;\n\n      let handle = instance.addFromSetImmediateArguments(arguments);\n      // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n      // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n      let script = doc.createElement('script');\n      script.onreadystatechange = () => {\n        instance.runIfPresent(handle);\n        script.onreadystatechange = null;\n        html.removeChild(script);\n        script = null;\n      };\n      html.appendChild(script);\n      return handle;\n    };\n\n    (<any>fn).instance = this;\n\n    return fn;\n  }\n\n  createSetTimeoutSetImmediate() {\n    let fn = function setImmediate() {\n      const instance = (<any>setImmediate).instance;\n      let handle = instance.addFromSetImmediateArguments(arguments);\n      instance.root.setTimeout(instance.partiallyApplied(instance.runIfPresent, handle), 0);\n      return handle;\n    };\n\n    (<any>fn).instance = this;\n\n    return fn;\n  }\n}\nexport const Immediate = new ImmediateDefinition(root);\n"]}