{
  "version": 3,
  "sources": ["../../src/rooms/RelayRoom.ts"],
  "sourcesContent": ["import { CloseCode } from '@colyseus/shared-types';\nimport { defineTypes, MapSchema, Schema } from '@colyseus/schema';\n\nimport { Room } from '../Room.ts';\nimport type { Client } from '../Transport.ts';\n\nclass Player extends Schema {\n  public connected: boolean;\n  public name: string;\n  public sessionId: string;\n}\ndefineTypes(Player, {\n  connected: 'boolean',\n  name: 'string',\n  sessionId: 'string',\n});\n\nclass State extends Schema {\n  public players = new MapSchema<Player>();\n}\ndefineTypes(State, {\n  players: { map: Player },\n});\n\n/**\n * client.joinOrCreate(\"relayroom\", {\n *   maxClients: 10,\n *   allowReconnectionTime: 20\n * });\n */\n\nexport class RelayRoom extends Room {\n  public state = new State();\n  public allowReconnectionTime: number = 0;\n\n  public onCreate(options: Partial<{\n    maxClients: number,\n    allowReconnectionTime: number,\n    metadata: any,\n  }>) {\n    if (options.maxClients) {\n      this.maxClients = options.maxClients;\n    }\n\n    if (options.allowReconnectionTime) {\n      this.allowReconnectionTime = Math.min(options.allowReconnectionTime, 40);\n    }\n\n    if (options.metadata) {\n      this.setMetadata(options.metadata);\n    }\n\n    this.onMessage('*', (client: Client, type: string | number, message: any) => {\n      this.broadcast(type, [client.sessionId, message], { except: client });\n    });\n  }\n\n  public onJoin(client: Client, options: any = {}) {\n    const player = new Player();\n\n    player.connected = true;\n    player.sessionId = client.sessionId;\n\n    if (options.name) {\n      player.name = options.name;\n    }\n\n    this.state.players.set(client.sessionId, player);\n  }\n\n  public async onLeave(client: Client, code: number) {\n    if (this.allowReconnectionTime > 0) {\n      const player = this.state.players.get(client.sessionId);\n      player.connected = false;\n\n      try {\n        if (code === CloseCode.CONSENTED) {\n          throw new Error('consented leave');\n        }\n\n        await this.allowReconnection(client, this.allowReconnectionTime);\n        player.connected = true;\n\n      } catch (e) {\n        this.state.players.delete(client.sessionId);\n      }\n    }\n  }\n\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAA0B;AAC1B,oBAA+C;AAE/C,kBAAqB;AAGrB,IAAM,SAAN,cAAqB,qBAAO;AAI5B;AAAA,IACA,2BAAY,QAAQ;AAAA,EAClB,WAAW;AAAA,EACX,MAAM;AAAA,EACN,WAAW;AACb,CAAC;AAED,IAAM,QAAN,cAAoB,qBAAO;AAAA,EAA3B;AAAA;AACE,SAAO,UAAU,IAAI,wBAAkB;AAAA;AACzC;AAAA,IACA,2BAAY,OAAO;AAAA,EACjB,SAAS,EAAE,KAAK,OAAO;AACzB,CAAC;AASM,IAAM,YAAN,cAAwB,iBAAK;AAAA,EAA7B;AAAA;AACL,SAAO,QAAQ,IAAI,MAAM;AACzB,SAAO,wBAAgC;AAAA;AAAA,EAEhC,SAAS,SAIZ;AACF,QAAI,QAAQ,YAAY;AACtB,WAAK,aAAa,QAAQ;AAAA,IAC5B;AAEA,QAAI,QAAQ,uBAAuB;AACjC,WAAK,wBAAwB,KAAK,IAAI,QAAQ,uBAAuB,EAAE;AAAA,IACzE;AAEA,QAAI,QAAQ,UAAU;AACpB,WAAK,YAAY,QAAQ,QAAQ;AAAA,IACnC;AAEA,SAAK,UAAU,KAAK,CAAC,QAAgB,MAAuB,YAAiB;AAC3E,WAAK,UAAU,MAAM,CAAC,OAAO,WAAW,OAAO,GAAG,EAAE,QAAQ,OAAO,CAAC;AAAA,IACtE,CAAC;AAAA,EACH;AAAA,EAEO,OAAO,QAAgB,UAAe,CAAC,GAAG;AAC/C,UAAM,SAAS,IAAI,OAAO;AAE1B,WAAO,YAAY;AACnB,WAAO,YAAY,OAAO;AAE1B,QAAI,QAAQ,MAAM;AAChB,aAAO,OAAO,QAAQ;AAAA,IACxB;AAEA,SAAK,MAAM,QAAQ,IAAI,OAAO,WAAW,MAAM;AAAA,EACjD;AAAA,EAEA,MAAa,QAAQ,QAAgB,MAAc;AACjD,QAAI,KAAK,wBAAwB,GAAG;AAClC,YAAM,SAAS,KAAK,MAAM,QAAQ,IAAI,OAAO,SAAS;AACtD,aAAO,YAAY;AAEnB,UAAI;AACF,YAAI,SAAS,8BAAU,WAAW;AAChC,gBAAM,IAAI,MAAM,iBAAiB;AAAA,QACnC;AAEA,cAAM,KAAK,kBAAkB,QAAQ,KAAK,qBAAqB;AAC/D,eAAO,YAAY;AAAA,MAErB,SAAS,GAAG;AACV,aAAK,MAAM,QAAQ,OAAO,OAAO,SAAS;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAEF;",
  "names": []
}
