molstar
Version:
A comprehensive macromolecular library.
194 lines • 7.43 kB
JavaScript
/**
* Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info.
*
* @author David Sehnal <david.sehnal@gmail.com>
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.Scheduler = void 0;
var tslib_1 = require("tslib");
function createImmediateActions() {
var global = (function () {
var _window = typeof window !== 'undefined' && window;
var _self = typeof self !== 'undefined' && typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope && self;
var _global = typeof global !== 'undefined' && global;
return _window || _global || _self;
})();
var tasksByHandle = {};
var doc = typeof document !== 'undefined' ? document : void 0;
var nextHandle = 1; // Spec says greater than zero
var registerImmediate;
function setImmediate(callback) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
// Callback can either be a function or a string
if (typeof callback !== 'function') {
callback = new Function('' + callback);
}
// Store and register the task
var task = { callback: callback, args: args };
tasksByHandle[nextHandle] = task;
registerImmediate(nextHandle);
return nextHandle++;
}
function clearImmediate(handle) {
delete tasksByHandle[handle];
}
function run(task) {
var callback = task.callback;
var args = task.args;
switch (args.length) {
case 0:
callback();
break;
case 1:
callback(args[0]);
break;
case 2:
callback(args[0], args[1]);
break;
case 3:
callback(args[0], args[1], args[2]);
break;
default:
callback.apply(undefined, args);
break;
}
}
function runIfPresent(handle) {
var task = tasksByHandle[handle];
clearImmediate(handle);
run(task);
}
function installNextTickImplementation() {
registerImmediate = function (handle) {
process.nextTick(function () { runIfPresent(handle); });
};
}
function canUsePostMessage() {
if (global && global.postMessage && !global.importScripts) {
var postMessageIsAsynchronous_1 = true;
var oldOnMessage = global.onmessage;
global.onmessage = function () {
postMessageIsAsynchronous_1 = false;
};
global.postMessage('', '*');
global.onmessage = oldOnMessage;
return postMessageIsAsynchronous_1;
}
}
function installPostMessageImplementation() {
// Installs an event handler on `global` for the `message` event: see
// * https://developer.mozilla.org/en/DOM/window.postMessage
// * http://www.whatwg.org/specs/web-apps/current-work/multipage/comms.html#crossDocumentMessages
var messagePrefix = 'setImmediate$' + Math.random() + '$';
var onGlobalMessage = function (event) {
if (event.source === global &&
typeof event.data === 'string' &&
event.data.indexOf(messagePrefix) === 0) {
runIfPresent(+event.data.slice(messagePrefix.length));
}
};
if (window.addEventListener) {
window.addEventListener('message', onGlobalMessage, false);
}
else {
window.attachEvent('onmessage', onGlobalMessage);
}
registerImmediate = function (handle) {
window.postMessage(messagePrefix + handle, '*');
};
}
function installMessageChannelImplementation() {
var channel = new MessageChannel();
channel.port1.onmessage = function (event) {
var handle = event.data;
runIfPresent(handle);
};
registerImmediate = function (handle) {
channel.port2.postMessage(handle);
};
}
function installReadyStateChangeImplementation() {
var html = doc.documentElement;
registerImmediate = function (handle) {
// 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 script = doc.createElement('script');
script.onreadystatechange = function () {
runIfPresent(handle);
script.onreadystatechange = null;
html.removeChild(script);
script = null;
};
html.appendChild(script);
};
}
function installSetTimeoutImplementation() {
registerImmediate = function (handle) {
setTimeout(runIfPresent, 0, handle);
};
}
// Don't get fooled by e.g. browserify environments.
if (typeof process !== 'undefined' && {}.toString.call(process) === '[object process]') {
// For Node.js before 0.9
installNextTickImplementation();
}
else if (canUsePostMessage()) {
// For non-IE10 modern browsers
installPostMessageImplementation();
}
else if (typeof MessageChannel !== 'undefined') {
// For web workers, where supported
installMessageChannelImplementation();
}
else if (doc && 'onreadystatechange' in doc.createElement('script')) {
// For IE 6–8
installReadyStateChangeImplementation();
}
else {
// For older browsers
installSetTimeoutImplementation();
}
return {
setImmediate: setImmediate,
clearImmediate: clearImmediate
};
}
var immediateActions = (function () {
if (typeof setImmediate !== 'undefined') {
if (typeof window !== 'undefined') {
return {
setImmediate: function (handler) {
var _a;
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
return (_a = window).setImmediate.apply(_a, (0, tslib_1.__spreadArray)([handler], args, false));
},
clearImmediate: function (handle) { return window.clearImmediate(handle); }
};
}
else {
return { setImmediate: setImmediate, clearImmediate: clearImmediate };
}
}
return createImmediateActions();
}());
function resolveImmediate(res) {
immediateActions.setImmediate(res);
}
var Scheduler = {
setImmediate: immediateActions.setImmediate,
clearImmediate: immediateActions.clearImmediate,
immediatePromise: function () { return new Promise(resolveImmediate); },
delay: function (timeout, value) {
if (value === void 0) { value = void 0; }
return new Promise(function (r) { return setTimeout(r, timeout, value); });
}
};
exports.Scheduler = Scheduler;
//# sourceMappingURL=scheduler.js.map
;