UNPKG

browserfs

Version:

A filesystem in your browser!

69 lines (66 loc) 1.91 kB
import global from '../core/global'; /** * @hidden */ let bfsSetImmediate: (cb: Function) => any; if (typeof(setImmediate) !== "undefined") { bfsSetImmediate = setImmediate; } else { const gScope = global; const timeouts: (() => void)[] = []; const messageName = "zero-timeout-message"; const canUsePostMessage = function() { if (typeof gScope.importScripts !== 'undefined' || !gScope.postMessage) { return false; } let postMessageIsAsync = true; const oldOnMessage = gScope.onmessage; gScope.onmessage = function() { postMessageIsAsync = false; }; gScope.postMessage('', '*'); gScope.onmessage = oldOnMessage; return postMessageIsAsync; }; if (canUsePostMessage()) { bfsSetImmediate = function(fn: () => void) { timeouts.push(fn); gScope.postMessage(messageName, "*"); }; const handleMessage = function(event: MessageEvent) { if (event.source === self && event.data === messageName) { if (event.stopPropagation) { event.stopPropagation(); } else { event.cancelBubble = true; } if (timeouts.length > 0) { const fn = timeouts.shift()!; return fn(); } } }; if (gScope.addEventListener) { gScope.addEventListener('message', handleMessage, true); } else { gScope.attachEvent('onmessage', handleMessage); } } else if (gScope.MessageChannel) { // WebWorker MessageChannel const channel = new gScope.MessageChannel(); channel.port1.onmessage = (event: any) => { if (timeouts.length > 0) { return timeouts.shift()!(); } }; bfsSetImmediate = (fn: () => void) => { timeouts.push(fn); channel.port2.postMessage(''); }; } else { bfsSetImmediate = function(fn: () => void) { return setTimeout(fn, 0); }; } } export default bfsSetImmediate;