{
  "version": 3,
  "sources": ["../../src/utils/Utils.ts"],
  "sourcesContent": ["import { nanoid } from 'nanoid';\nimport { type RoomException, type RoomMethodName } from '../errors/RoomExceptions.ts';\n\nimport { debugAndPrintError, debugMatchMaking } from '../Debug.ts';\n\nexport type Type<T> = new (...args: any[]) => T;\nexport type MethodName<T> = string & {\n  [K in keyof T]: T[K] extends (...args: any[]) => any ? K : never\n}[keyof T];\n\n/**\n * Utility type that extracts the return type of a method or the type of a property\n * from a given class/object type.\n *\n * - If the key is a method, returns the awaited return type of that method\n * - If the key is a property, returns the type of that property\n */\nexport type ExtractMethodOrPropertyType<\n  TClass,\n  TKey extends keyof TClass\n> = TClass[TKey] extends (...args: any[]) => infer R\n  ? Awaited<R>\n  : TClass[TKey];\n\n// remote room call timeouts\nexport const REMOTE_ROOM_SHORT_TIMEOUT = Number(process.env.COLYSEUS_PRESENCE_SHORT_TIMEOUT || 2000);\nexport const MAX_CONCURRENT_CREATE_ROOM_WAIT_TIME = Number(process.env.COLYSEUS_MAX_CONCURRENT_CREATE_ROOM_WAIT_TIME || 0.5);\n\nexport function generateId(length: number = 9) {\n  return nanoid(length);\n}\n\nexport function getBearerToken(authHeader: string) {\n  return (authHeader && authHeader.startsWith(\"Bearer \") && authHeader.substring(7, authHeader.length)) || undefined;\n}\n\n// nodemon sends SIGUSR2 before reloading\n// (https://github.com/remy/nodemon#controlling-shutdown-of-your-script)\n//\nconst signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGUSR2'];\n\nexport function registerGracefulShutdown(callback: (err?: Error) => void) {\n  /**\n   * Gracefully shutdown on uncaught errors\n   */\n  process.on('uncaughtException', (err) => {\n    debugAndPrintError(err);\n    callback(err);\n  });\n\n  signals.forEach((signal) =>\n    process.once(signal, () => callback()));\n}\n\nexport function retry<T = any>(\n  cb: Function,\n  maxRetries: number = 3,\n  errorWhiteList: any[] = [],\n  retries: number = 0,\n) {\n  return new Promise<T>((resolve, reject) => {\n    cb()\n      .then(resolve)\n      .catch((e: any) => {\n        if (\n          errorWhiteList.indexOf(e.constructor) !== -1 &&\n          retries++ < maxRetries\n        ) {\n          setTimeout(() => {\n            debugMatchMaking(\"retrying due to error (error: %s, retries: %s, maxRetries: %s)\", e.message, retries, maxRetries);\n            retry<T>(cb, maxRetries, errorWhiteList, retries).\n              then(resolve).\n              catch((e2) => reject(e2));\n          }, Math.floor(Math.random() * Math.pow(2, retries) * 400));\n\n        } else {\n          reject(e);\n        }\n      });\n  });\n}\n\nexport function spliceOne(arr: any[], index: number): boolean {\n  // manually splice availableRooms array\n  // http://jsperf.com/manual-splice\n  if (index === -1 || index >= arr.length) {\n    return false;\n  }\n\n  const len = arr.length - 1;\n  for (let i = index; i < len; i++) {\n    arr[i] = arr[i + 1];\n  }\n\n  arr.length = len;\n  return true;\n}\n\nexport class Deferred<T = any> {\n  public promise: Promise<T>;\n\n  public resolve: Function;\n  public reject: Function;\n\n  constructor(promise?: Promise<T>) {\n    this.promise = promise ?? new Promise<T>((resolve, reject) => {\n      this.resolve = resolve;\n      this.reject = reject;\n    });\n  }\n\n  public then(onFulfilled?: (value: T) => any, onRejected?: (reason: any) => any) {\n    return this.promise.then(onFulfilled, onRejected);\n  }\n\n  public catch(func: (value: any) => any) {\n    return this.promise.catch(func);\n  }\n\n  static reject (reason?: any) {\n    return new Deferred(Promise.reject(reason));\n  }\n\n  static resolve<T = any>(value?: T) {\n    return new Deferred<T>(Promise.resolve(value));\n  }\n\n}\n\nexport function merge(a: any, ...objs: any[]): any {\n  for (let i = 0, len = objs.length; i < len; i++) {\n    const b = objs[i];\n    for (const key in b) {\n      if (b.hasOwnProperty(key)) {\n        a[key] = b[key];\n      }\n    }\n  }\n  return a;\n}\n\nexport function wrapTryCatch(\n  method: Function,\n  onError: (error: RoomException, methodName: RoomMethodName) => void,\n  exceptionClass: Type<RoomException>,\n  methodName: RoomMethodName,\n  rethrow: boolean = false,\n  ...additionalErrorArgs: any[]\n) {\n  return (...args: any[]) => {\n    try {\n      const result = method(...args);\n      if (typeof (result?.catch) === \"function\") {\n        return result.catch((e: Error) => {\n          onError(new exceptionClass(e, e.message, ...args, ...additionalErrorArgs), methodName);\n          if (rethrow) { throw e; }\n        });\n      }\n      return result;\n    } catch (e: any) {\n      onError(new exceptionClass(e, e.message, ...args, ...additionalErrorArgs), methodName);\n      if (rethrow) { throw e; }\n    }\n  };\n}\n\n/**\n * Dynamically import a module using either require() or import()\n * based on the current module system (CJS vs ESM).\n *\n * This avoids double-loading packages when running in mixed ESM/CJS environments.\n * Errors are silently caught - await the promise and handle errors at usage site.\n */\nexport function dynamicImport<T = any>(moduleName: string): Promise<T> {\n  // __dirname exists in CJS but not in ESM\n  if (\n    typeof __dirname !== 'undefined' &&\n    // @ts-ignore\n    typeof (Bun) === 'undefined' // prevent bun from loading CJS modules\n  ) {\n    // CJS context - use require()\n    try {\n      return Promise.resolve(require(moduleName));\n    } catch (e: any) {\n      // If the error is not a MODULE_NOT_FOUND error, reject with the error.\n      if (e.code !== 'MODULE_NOT_FOUND') {\n        return Promise.reject(e);\n      }\n      return Promise.resolve(undefined);\n    }\n  } else {\n    // ESM context - use import()\n    const promise = import(/* @vite-ignore */ moduleName);\n    promise.catch(() => {}); // prevent unhandled rejection warnings\n    return promise;\n  }\n}\n"],
  "mappings": "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",
  "names": []
}
