From 1e93ab1628e230762471737a1d2586b5bc86b496 Mon Sep 17 00:00:00 2001
From: Mestery <mestery@pm.me>
Date: Fri, 27 Aug 2021 22:43:43 +0200
Subject: [PATCH] fix: global and timers this arg in browser

---
 src/internal/errors.ts | 8 ++++----
 src/setImmediate.ts    | 4 ++--
 src/setTimeoutUnref.ts | 2 +-
 src/volume.ts          | 2 +-
 4 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/internal/errors.ts b/src/internal/errors.ts
index f5e7074a7..a5b4fb426 100644
--- a/src/internal/errors.ts
+++ b/src/internal/errors.ts
@@ -21,7 +21,7 @@ function makeNodeError(Base) {
   };
 }
 
-class AssertionError extends global.Error {
+class AssertionError extends globalThis.Error {
   generatedMessage: any;
   name: any;
   code: any;
@@ -74,9 +74,9 @@ function E(sym, val) {
   messages[sym] = typeof val === 'function' ? val : String(val);
 }
 
-export const Error = makeNodeError(global.Error);
-export const TypeError = makeNodeError(global.TypeError);
-export const RangeError = makeNodeError(global.RangeError);
+export const Error = makeNodeError(globalThis.Error);
+export const TypeError = makeNodeError(globalThis.TypeError);
+export const RangeError = makeNodeError(globalThis.RangeError);
 
 export {
   message,
diff --git a/src/setImmediate.ts b/src/setImmediate.ts
index cf15a242a..cc5f73b18 100644
--- a/src/setImmediate.ts
+++ b/src/setImmediate.ts
@@ -1,7 +1,7 @@
 type TSetImmediate = (callback: (...args) => void, args?) => void;
 let _setImmediate: TSetImmediate;
 
-if (typeof setImmediate === 'function') _setImmediate = setImmediate.bind(global);
-else _setImmediate = setTimeout.bind(global);
+if (typeof setImmediate === 'function') _setImmediate = setImmediate.bind(globalThis);
+else _setImmediate = setTimeout.bind(globalThis);
 
 export default _setImmediate as TSetImmediate;
diff --git a/src/setTimeoutUnref.ts b/src/setTimeoutUnref.ts
index 21d05f9ec..a35612e08 100644
--- a/src/setTimeoutUnref.ts
+++ b/src/setTimeoutUnref.ts
@@ -5,7 +5,7 @@ export type TSetTimeout = (callback: (...args) => void, time?: number, args?: an
  * only in Node's environment it will "unref" its macro task.
  */
 function setTimeoutUnref(callback, time?, args?): object {
-  const ref = setTimeout.apply(null, arguments);
+  const ref = setTimeout.apply(globalThis, arguments);
   if (ref && typeof ref === 'object' && typeof ref.unref === 'function') ref.unref();
   return ref;
 }
diff --git a/src/volume.ts b/src/volume.ts
index 565118b17..a7e4c8b92 100644
--- a/src/volume.ts
+++ b/src/volume.ts
@@ -2220,7 +2220,7 @@ export class StatWatcher extends EventEmitter {
 
   start(path: string, persistent: boolean = true, interval: number = 5007) {
     this.filename = pathToFilename(path);
-    this.setTimeout = persistent ? setTimeout : setTimeoutUnref;
+    this.setTimeout = persistent ? setTimeout.bind(globalThis) : setTimeoutUnref;
     this.interval = interval;
     this.prev = this.vol.statSync(this.filename);
     this.loop();