{
  "version": 3,
  "sources": ["../../src/utils/Utils.ts"],
  "sourcesContent": ["import nanoid from 'nanoid';\n\nimport { EventEmitter } from \"events\";\nimport { RoomException } from '../errors/RoomExceptions.js';\nimport { Type } from './types.js';\n\nimport { debugAndPrintError } from '../Debug.js';\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) => {\n        if (\n          errorWhiteList.indexOf(e.constructor) !== -1 &&\n          retries++ < maxRetries\n        ) {\n          setTimeout(() => {\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(func: (value: T) => any) {\n    return this.promise.then.apply(this.promise, arguments);\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: string) => void,\n  exceptionClass: Type<RoomException>,\n  methodName: string,\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) {\n      onError(new exceptionClass(e, e.message, ...args, ...additionalErrorArgs), methodName);\n      if (rethrow) { throw e; }\n    }\n  };\n}\n\nexport class HttpServerMock extends EventEmitter {}"],
  "mappings": "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",
  "names": []
}
