{
  "version": 3,
  "sources": ["../../src/matchmaker/RegisteredHandler.ts"],
  "sourcesContent": ["import { IncomingMessage } from 'http';\nimport { EventEmitter } from 'events';\nimport { logger } from '../Logger.js';\nimport { RoomCache, SortOptions } from './driver/api.js';\n\nimport { Room } from './../Room.js';\nimport { updateLobby } from './Lobby.js';\nimport { Type } from '../utils/types.js';\n\nexport const INVALID_OPTION_KEYS: Array<keyof RoomCache> = [\n  'clients',\n  'locked',\n  'private',\n  // 'maxClients', - maxClients can be useful as filter options\n  'metadata',\n  'name',\n  'processId',\n  'roomId',\n];\n\nexport type ValidateAuthTokenCallback = (token: string, request?: IncomingMessage) => Promise<any>;\n\nexport class RegisteredHandler extends EventEmitter {\n  public filterOptions: string[] = [];\n  public sortOptions?: SortOptions;\n\n  constructor(\n    public name: string,\n    public klass: Type<Room>,\n    public options: any\n  ) {\n    super();\n\n    if (typeof(klass) !== 'function') {\n      logger.debug('You are likely not importing your room class correctly.');\n      throw new Error(`class is expected but ${typeof(klass)} was provided.`);\n    }\n  }\n\n  public enableRealtimeListing() {\n    this.on('create', (room) => updateLobby(room));\n    this.on('lock', (room) => updateLobby(room));\n    this.on('unlock', (room) => updateLobby(room));\n    this.on('join', (room) => updateLobby(room));\n    this.on('leave', (room, _, willDispose) => {\n      if (!willDispose) {\n        updateLobby(room);\n      }\n    });\n    this.on('dispose', (room) => updateLobby(room, false));\n    this.on('visibility-change', (room, isVisible) => updateLobby(room, isVisible));\n\n    return this;\n  }\n\n  public filterBy(options: string[]) {\n    this.filterOptions = options;\n    return this;\n  }\n\n  public sortBy(options: SortOptions) {\n    this.sortOptions = options;\n    return this;\n  }\n\n  public getFilterOptions(options: any) {\n    return this.filterOptions.reduce((prev, curr, i, arr) => {\n      const field = arr[i];\n      if (options.hasOwnProperty(field)) {\n        if (INVALID_OPTION_KEYS.indexOf(field as any) !== -1) {\n          logger.warn(`option \"${field}\" has internal usage and is going to be ignored.`);\n\n        } else {\n          prev[field] = options[field];\n        }\n      }\n      return prev;\n    }, {});\n  }\n}\n"],
  "mappings": ";AACA,SAAS,oBAAoB;AAC7B,SAAS,cAAc;AAIvB,SAAS,mBAAmB;AAGrB,IAAM,sBAA8C;AAAA,EACzD;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,IAAM,oBAAN,cAAgC,aAAa;AAAA,EAIlD,YACS,MACA,OACA,SACP;AACA,UAAM;AAJC;AACA;AACA;AANT,SAAO,gBAA0B,CAAC;AAUhC,QAAI,OAAO,UAAW,YAAY;AAChC,aAAO,MAAM,yDAAyD;AACtE,YAAM,IAAI,MAAM,yBAAyB,OAAO,KAAM,gBAAgB;AAAA,IACxE;AAAA,EACF;AAAA,EAEO,wBAAwB;AAC7B,SAAK,GAAG,UAAU,CAAC,SAAS,YAAY,IAAI,CAAC;AAC7C,SAAK,GAAG,QAAQ,CAAC,SAAS,YAAY,IAAI,CAAC;AAC3C,SAAK,GAAG,UAAU,CAAC,SAAS,YAAY,IAAI,CAAC;AAC7C,SAAK,GAAG,QAAQ,CAAC,SAAS,YAAY,IAAI,CAAC;AAC3C,SAAK,GAAG,SAAS,CAAC,MAAM,GAAG,gBAAgB;AACzC,UAAI,CAAC,aAAa;AAChB,oBAAY,IAAI;AAAA,MAClB;AAAA,IACF,CAAC;AACD,SAAK,GAAG,WAAW,CAAC,SAAS,YAAY,MAAM,KAAK,CAAC;AACrD,SAAK,GAAG,qBAAqB,CAAC,MAAM,cAAc,YAAY,MAAM,SAAS,CAAC;AAE9E,WAAO;AAAA,EACT;AAAA,EAEO,SAAS,SAAmB;AACjC,SAAK,gBAAgB;AACrB,WAAO;AAAA,EACT;AAAA,EAEO,OAAO,SAAsB;AAClC,SAAK,cAAc;AACnB,WAAO;AAAA,EACT;AAAA,EAEO,iBAAiB,SAAc;AACpC,WAAO,KAAK,cAAc,OAAO,CAAC,MAAM,MAAM,GAAG,QAAQ;AACvD,YAAM,QAAQ,IAAI,CAAC;AACnB,UAAI,QAAQ,eAAe,KAAK,GAAG;AACjC,YAAI,oBAAoB,QAAQ,KAAY,MAAM,IAAI;AACpD,iBAAO,KAAK,WAAW,KAAK,kDAAkD;AAAA,QAEhF,OAAO;AACL,eAAK,KAAK,IAAI,QAAQ,KAAK;AAAA,QAC7B;AAAA,MACF;AACA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAAA,EACP;AACF;",
  "names": []
}
