{
  "version": 3,
  "sources": ["../../src/rooms/LobbyRoom.ts"],
  "sourcesContent": ["import * as matchMaker from '../MatchMaker.ts';\nimport type { IRoomCache } from '../matchmaker/LocalDriver/LocalDriver.ts';\nimport type { Client } from '../Transport.ts';\nimport { subscribeLobby } from '../matchmaker/Lobby.ts';\nimport { Room } from '../Room.ts';\n\n// TODO: use Schema state & filters on version 1.0.0\n\n// class DummyLobbyState extends Schema { // tslint:disable-line\n//   @type(\"number\") public _: number;\n// }\n\n//\n// Strongly-typed client messages for LobbyRoom\n// (This is optional, but recommended for better type safety and code generation for native SDKs)\n//\ntype LobbyClient = Client<{\n  messages: {\n    rooms: IRoomCache[];\n    '+': [roomId: string, room: IRoomCache];\n    '-': string;\n  }\n}>;\n\nexport interface FilterInput {\n  name?: string;\n  metadata?: any;\n}\n\nexport interface LobbyOptions {\n  filter?: FilterInput;\n}\n\nexport class LobbyRoom<Metadata = any> extends Room {\n  public rooms: IRoomCache<Metadata>[] = [];\n  public unsubscribeLobby: () => void;\n\n  public clientOptions: { [sessionId: string]: LobbyOptions } = {};\n\n  messages = {\n    filter: (client: LobbyClient, filter: FilterInput) => {\n      const clientOptions = this.clientOptions[client.sessionId];\n      if (!clientOptions) { return; }\n\n      clientOptions.filter = filter;\n      client.send('rooms', this.filterItemsForClient(clientOptions));\n    }\n  }\n\n  public async onCreate(options: any) {\n    // prevent LobbyRoom to notify itself\n    this['_listing'].unlisted = true;\n\n    this.unsubscribeLobby = await subscribeLobby((roomId, data) => {\n      const roomIndex = this.rooms.findIndex((room) => room.roomId === roomId);\n      const clients = this.clients.filter((client) => this.clientOptions[client.sessionId]);\n\n      if (!data) {\n        // remove room listing data\n        if (roomIndex !== -1) {\n          const previousData = this.rooms[roomIndex];\n\n          this.rooms.splice(roomIndex, 1);\n\n          clients.forEach((client) => {\n            if (this.filterItemForClient(previousData, this.clientOptions[client.sessionId].filter)) {\n              client.send('-', roomId);\n            }\n          });\n        }\n\n      } else if (roomIndex === -1) {\n        // append room listing data\n        this.rooms.push(data);\n\n        clients.forEach((client) => {\n          if (this.filterItemForClient(data, this.clientOptions[client.sessionId].filter)) {\n            client.send('+', [roomId, data]);\n          }\n        });\n\n      } else {\n        const previousData = this.rooms[roomIndex];\n\n        // replace room listing data\n        this.rooms[roomIndex] = data;\n\n        clients.forEach((client) => {\n          const hadData = this.filterItemForClient(previousData, this.clientOptions[client.sessionId].filter);\n          const hasData = this.filterItemForClient(data, this.clientOptions[client.sessionId].filter);\n\n          if (hadData && !hasData) {\n            client.send('-', roomId);\n\n          } else if (hasData) {\n            client.send('+', [roomId, data]);\n          }\n        });\n      }\n    });\n\n    this.rooms = await matchMaker.query({ private: false, unlisted: false });\n  }\n\n  public onJoin(client: LobbyClient, options: LobbyOptions) {\n    this.clientOptions[client.sessionId] = (\n      !Array.isArray(options) && // Defold (Lua) sends empty objects as Array instead of object\n      options\n    ) || {};\n    client.send('rooms', this.filterItemsForClient(this.clientOptions[client.sessionId]));\n  }\n\n  public onLeave(client: LobbyClient) {\n    delete this.clientOptions[client.sessionId];\n  }\n\n  public onDispose() {\n    if (this.unsubscribeLobby) {\n      this.unsubscribeLobby();\n    }\n  }\n\n  protected filterItemsForClient(options: LobbyOptions): IRoomCache<Metadata>[] {\n    const filter = options.filter;\n\n    return (filter)\n      ? this.rooms.filter((room) => this.filterItemForClient(room, filter))\n      : this.rooms;\n  }\n\n  protected filterItemForClient(room: IRoomCache, filter?: LobbyOptions['filter']) {\n    if (!filter) {\n      return true;\n    }\n\n    let isAllowed = true;\n\n    if (filter.name !== room.name) {\n      isAllowed = false;\n    }\n\n    if (filter.metadata) {\n      for (const field in filter.metadata) {\n        if (room.metadata[field] !== filter.metadata[field]) {\n          isAllowed = false;\n          break;\n        }\n      }\n    }\n\n    return isAllowed;\n  }\n\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAA4B;AAG5B,mBAA+B;AAC/B,kBAAqB;AA6Bd,IAAM,YAAN,cAAwC,iBAAK;AAAA,EAA7C;AAAA;AACL,SAAO,QAAgC,CAAC;AAGxC,SAAO,gBAAuD,CAAC;AAE/D,oBAAW;AAAA,MACT,QAAQ,CAAC,QAAqB,WAAwB;AACpD,cAAM,gBAAgB,KAAK,cAAc,OAAO,SAAS;AACzD,YAAI,CAAC,eAAe;AAAE;AAAA,QAAQ;AAE9B,sBAAc,SAAS;AACvB,eAAO,KAAK,SAAS,KAAK,qBAAqB,aAAa,CAAC;AAAA,MAC/D;AAAA,IACF;AAAA;AAAA,EAEA,MAAa,SAAS,SAAc;AAElC,SAAK,UAAU,EAAE,WAAW;AAE5B,SAAK,mBAAmB,UAAM,6BAAe,CAAC,QAAQ,SAAS;AAC7D,YAAM,YAAY,KAAK,MAAM,UAAU,CAAC,SAAS,KAAK,WAAW,MAAM;AACvE,YAAM,UAAU,KAAK,QAAQ,OAAO,CAAC,WAAW,KAAK,cAAc,OAAO,SAAS,CAAC;AAEpF,UAAI,CAAC,MAAM;AAET,YAAI,cAAc,IAAI;AACpB,gBAAM,eAAe,KAAK,MAAM,SAAS;AAEzC,eAAK,MAAM,OAAO,WAAW,CAAC;AAE9B,kBAAQ,QAAQ,CAAC,WAAW;AAC1B,gBAAI,KAAK,oBAAoB,cAAc,KAAK,cAAc,OAAO,SAAS,EAAE,MAAM,GAAG;AACvF,qBAAO,KAAK,KAAK,MAAM;AAAA,YACzB;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MAEF,WAAW,cAAc,IAAI;AAE3B,aAAK,MAAM,KAAK,IAAI;AAEpB,gBAAQ,QAAQ,CAAC,WAAW;AAC1B,cAAI,KAAK,oBAAoB,MAAM,KAAK,cAAc,OAAO,SAAS,EAAE,MAAM,GAAG;AAC/E,mBAAO,KAAK,KAAK,CAAC,QAAQ,IAAI,CAAC;AAAA,UACjC;AAAA,QACF,CAAC;AAAA,MAEH,OAAO;AACL,cAAM,eAAe,KAAK,MAAM,SAAS;AAGzC,aAAK,MAAM,SAAS,IAAI;AAExB,gBAAQ,QAAQ,CAAC,WAAW;AAC1B,gBAAM,UAAU,KAAK,oBAAoB,cAAc,KAAK,cAAc,OAAO,SAAS,EAAE,MAAM;AAClG,gBAAM,UAAU,KAAK,oBAAoB,MAAM,KAAK,cAAc,OAAO,SAAS,EAAE,MAAM;AAE1F,cAAI,WAAW,CAAC,SAAS;AACvB,mBAAO,KAAK,KAAK,MAAM;AAAA,UAEzB,WAAW,SAAS;AAClB,mBAAO,KAAK,KAAK,CAAC,QAAQ,IAAI,CAAC;AAAA,UACjC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,SAAK,QAAQ,MAAiB,iBAAM,EAAE,SAAS,OAAO,UAAU,MAAM,CAAC;AAAA,EACzE;AAAA,EAEO,OAAO,QAAqB,SAAuB;AACxD,SAAK,cAAc,OAAO,SAAS,IACjC,CAAC,MAAM,QAAQ,OAAO;AAAA,IACtB,WACG,CAAC;AACN,WAAO,KAAK,SAAS,KAAK,qBAAqB,KAAK,cAAc,OAAO,SAAS,CAAC,CAAC;AAAA,EACtF;AAAA,EAEO,QAAQ,QAAqB;AAClC,WAAO,KAAK,cAAc,OAAO,SAAS;AAAA,EAC5C;AAAA,EAEO,YAAY;AACjB,QAAI,KAAK,kBAAkB;AACzB,WAAK,iBAAiB;AAAA,IACxB;AAAA,EACF;AAAA,EAEU,qBAAqB,SAA+C;AAC5E,UAAM,SAAS,QAAQ;AAEvB,WAAQ,SACJ,KAAK,MAAM,OAAO,CAAC,SAAS,KAAK,oBAAoB,MAAM,MAAM,CAAC,IAClE,KAAK;AAAA,EACX;AAAA,EAEU,oBAAoB,MAAkB,QAAiC;AAC/E,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,QAAI,YAAY;AAEhB,QAAI,OAAO,SAAS,KAAK,MAAM;AAC7B,kBAAY;AAAA,IACd;AAEA,QAAI,OAAO,UAAU;AACnB,iBAAW,SAAS,OAAO,UAAU;AACnC,YAAI,KAAK,SAAS,KAAK,MAAM,OAAO,SAAS,KAAK,GAAG;AACnD,sBAAY;AACZ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEF;",
  "names": []
}
