{
  "version": 3,
  "sources": ["../../src/rooms/LobbyRoom.ts"],
  "sourcesContent": ["\nimport * as matchMaker from '../MatchMaker.js';\nimport { IRoomCache } from '../matchmaker/driver/local/LocalDriver.js';\nimport { subscribeLobby } from '../matchmaker/Lobby.js';\nimport { Room } from '../Room.js';\nimport { Client } from '../Transport.js';\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\nexport interface FilterInput {\n  name?: string;\n  metadata?: any;\n}\n\nexport interface LobbyOptions {\n  filter?: FilterInput;\n}\n\nexport class LobbyRoom extends Room { // tslint:disable-line\n  public rooms: IRoomCache[] = [];\n  public unsubscribeLobby: () => void;\n\n  public clientOptions: { [sessionId: string]: LobbyOptions } = {};\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    this.onMessage('filter', (client: Client, filter: FilterInput) => {\n      this.clientOptions[client.sessionId].filter = filter;\n      client.send('rooms', this.filterItemsForClient(this.clientOptions[client.sessionId]));\n    });\n  }\n\n  public onJoin(client: Client, options: LobbyOptions) {\n    this.clientOptions[client.sessionId] = options || {};\n    client.send('rooms', this.filterItemsForClient(this.clientOptions[client.sessionId]));\n  }\n\n  public onLeave(client: Client) {\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) {\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": "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",
  "names": []
}
