packages/web-ide-fs/src/browserfs/shim.ts (15 lines of code) (raw):
// why: We need to shim setImmediate for browserfs's LockedFS to work.
// https://github.com/jvilk/BrowserFS/blob/v1.4.3/src/generic/mutex.ts#L33
//
// BrowserFS shim is a bit outdated, so let's use a more modern approach.
// https://github.com/jvilk/BrowserFS/blob/v1.4.3/src/generic/setImmediate.ts
if (!global.setImmediate) {
// why: We use a factory function like this because NodeJS types for setImmediate
// expect a property `__promisify__`. This isn't actually used, but
// makes TypeScript happy.
global.setImmediate = (function setImmediateShimFactory() {
function setImmediateShim<TArgs extends unknown[]>(
callback: (...callbackArgs: TArgs) => void,
...args: TArgs
) {
// TODO: Investigate if we need another implementation for setImmediate.
// There's a **huge** performance win with `queueMicrotask` compared
// to `_.defer`.
queueMicrotask(() => callback.call(null, ...args));
return <NodeJS.Immediate>{};
}
setImmediateShim.__promisify__ = () => {
throw new Error('Not supported!');
};
return setImmediateShim;
})();
}