{
  "version": 3,
  "sources": ["../src/uWebSocketClient.ts"],
  "sourcesContent": ["import EventEmitter from 'events';\nimport uWebSockets from 'uWebSockets.js';\n\nimport { getMessageBytes, Protocol, Client, ClientPrivate, ClientState, ISendOptions, logger, debugMessage } from '@colyseus/core';\n\nexport class uWebSocketWrapper extends EventEmitter {\n  constructor(public ws: uWebSockets.WebSocket<any>) {\n    super();\n  }\n}\n\nexport enum ReadyState {\n  CONNECTING = 0,\n  OPEN = 1,\n  CLOSING = 2,\n  CLOSED = 3,\n}\n\nexport class uWebSocketClient implements Client, ClientPrivate {\n  public sessionId: string;\n  public state: ClientState = ClientState.JOINING;\n  public readyState: number = ReadyState.OPEN;\n  public reconnectionToken: string;\n\n  public _enqueuedMessages: any[] = [];\n  public _afterNextPatchQueue;\n  public _reconnectionToken: string;\n  public _joinedAt: number;\n\n  constructor(\n    public id: string,\n    public _ref: uWebSocketWrapper,\n  ) {\n    this.sessionId = id;\n\n    _ref.on('close', () => this.readyState = ReadyState.CLOSED);\n  }\n\n  get ref() { return this._ref; }\n  set ref(_ref: uWebSocketWrapper) {\n    this._ref = _ref;\n    this.readyState = ReadyState.OPEN;\n  }\n\n  public sendBytes(type: string | number, bytes: Buffer | Uint8Array, options?: ISendOptions) {\n    debugMessage(\"send bytes(to %s): '%s' -> %j\", this.sessionId, type, bytes);\n\n    this.enqueueRaw(\n      getMessageBytes.raw(Protocol.ROOM_DATA_BYTES, type, undefined, bytes),\n      options,\n    );\n  }\n\n  public send(messageOrType: any, messageOrOptions?: any | ISendOptions, options?: ISendOptions) {\n    debugMessage(\"send(to %s): '%s' -> %O\", this.sessionId, messageOrType, messageOrOptions);\n\n    this.enqueueRaw(\n      getMessageBytes.raw(Protocol.ROOM_DATA, messageOrType, messageOrOptions),\n      options,\n    );\n  }\n\n  public enqueueRaw(data: Uint8Array | Buffer, options?: ISendOptions) {\n    // use room's afterNextPatch queue\n    if (options?.afterNextPatch) {\n      this._afterNextPatchQueue.push([this, [Buffer.from(data)]]);\n      return;\n    }\n\n    if (this.state === ClientState.JOINING) {\n      // sending messages during `onJoin`.\n      // - the client-side cannot register \"onMessage\" callbacks at this point.\n      // - enqueue the messages to be send after JOIN_ROOM message has been sent\n      // - create a new buffer for enqueued messages, as the underlying buffer might be modified\n      this._enqueuedMessages.push(Buffer.from(data));\n      return;\n    }\n\n    this.raw(data, options);\n  }\n\n  public raw(data: Uint8Array | Buffer, options?: ISendOptions, cb?: (err?: Error) => void) {\n    // skip if client not open\n    if (this.readyState !== ReadyState.OPEN) {\n      return;\n    }\n\n    this._ref.ws.send(data, true, false);\n  }\n\n  public error(code: number, message: string = '', cb?: (err?: Error) => void) {\n    this.raw(getMessageBytes[Protocol.ERROR](code, message));\n\n    // delay callback execution - uWS doesn't acknowledge when the message was sent\n    // (same API as \"ws\" transport)\n    setTimeout(cb, 1);\n  }\n\n  public leave(code?: number, data?: string) {\n    if (this.readyState !== ReadyState.OPEN) {\n      // connection already closed. ignore.\n      return;\n    }\n\n    this.readyState = ReadyState.CLOSING;\n\n    if (code !== undefined) {\n      this._ref.ws.end(code, data);\n\n    } else {\n      this._ref.ws.close();\n    }\n  }\n\n  public close(code?: number, data?: string) {\n    logger.warn('DEPRECATION WARNING: use client.leave() instead of client.close()');\n    try {\n      throw new Error();\n    } catch (e) {\n      logger.info(e.stack);\n    }\n    this.leave(code, data);\n  }\n\n  public toJSON() {\n    return { sessionId: this.sessionId, readyState: this.readyState };\n  }\n}\n"],
  "mappings": ";AAAA,OAAO,kBAAkB;AAGzB,SAAS,iBAAiB,UAAiC,aAA2B,QAAQ,oBAAoB;AAE3G,IAAM,oBAAN,cAAgC,aAAa;AAAA,EAClD,YAAmB,IAAgC;AACjD,UAAM;AADW;AAAA,EAEnB;AACF;AAEO,IAAK,aAAL,kBAAKA,gBAAL;AACL,EAAAA,wBAAA,gBAAa,KAAb;AACA,EAAAA,wBAAA,UAAO,KAAP;AACA,EAAAA,wBAAA,aAAU,KAAV;AACA,EAAAA,wBAAA,YAAS,KAAT;AAJU,SAAAA;AAAA,GAAA;AAOL,IAAM,mBAAN,MAAwD;AAAA,EAW7D,YACS,IACA,MACP;AAFO;AACA;AAXT,SAAO,QAAqB,YAAY;AACxC,SAAO,aAAqB;AAG5B,SAAO,oBAA2B,CAAC;AASjC,SAAK,YAAY;AAEjB,SAAK,GAAG,SAAS,MAAM,KAAK,aAAa,cAAiB;AAAA,EAC5D;AAAA,EAEA,IAAI,MAAM;AAAE,WAAO,KAAK;AAAA,EAAM;AAAA,EAC9B,IAAI,IAAI,MAAyB;AAC/B,SAAK,OAAO;AACZ,SAAK,aAAa;AAAA,EACpB;AAAA,EAEO,UAAU,MAAuB,OAA4B,SAAwB;AAC1F,iBAAa,iCAAiC,KAAK,WAAW,MAAM,KAAK;AAEzE,SAAK;AAAA,MACH,gBAAgB,IAAI,SAAS,iBAAiB,MAAM,QAAW,KAAK;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAAA,EAEO,KAAK,eAAoB,kBAAuC,SAAwB;AAC7F,iBAAa,2BAA2B,KAAK,WAAW,eAAe,gBAAgB;AAEvF,SAAK;AAAA,MACH,gBAAgB,IAAI,SAAS,WAAW,eAAe,gBAAgB;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAAA,EAEO,WAAW,MAA2B,SAAwB;AAEnE,QAAI,SAAS,gBAAgB;AAC3B,WAAK,qBAAqB,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC;AAC1D;AAAA,IACF;AAEA,QAAI,KAAK,UAAU,YAAY,SAAS;AAKtC,WAAK,kBAAkB,KAAK,OAAO,KAAK,IAAI,CAAC;AAC7C;AAAA,IACF;AAEA,SAAK,IAAI,MAAM,OAAO;AAAA,EACxB;AAAA,EAEO,IAAI,MAA2B,SAAwB,IAA4B;AAExF,QAAI,KAAK,eAAe,cAAiB;AACvC;AAAA,IACF;AAEA,SAAK,KAAK,GAAG,KAAK,MAAM,MAAM,KAAK;AAAA,EACrC;AAAA,EAEO,MAAM,MAAc,UAAkB,IAAI,IAA4B;AAC3E,SAAK,IAAI,gBAAgB,SAAS,KAAK,EAAE,MAAM,OAAO,CAAC;AAIvD,eAAW,IAAI,CAAC;AAAA,EAClB;AAAA,EAEO,MAAM,MAAe,MAAe;AACzC,QAAI,KAAK,eAAe,cAAiB;AAEvC;AAAA,IACF;AAEA,SAAK,aAAa;AAElB,QAAI,SAAS,QAAW;AACtB,WAAK,KAAK,GAAG,IAAI,MAAM,IAAI;AAAA,IAE7B,OAAO;AACL,WAAK,KAAK,GAAG,MAAM;AAAA,IACrB;AAAA,EACF;AAAA,EAEO,MAAM,MAAe,MAAe;AACzC,WAAO,KAAK,mEAAmE;AAC/E,QAAI;AACF,YAAM,IAAI,MAAM;AAAA,IAClB,SAAS,GAAG;AACV,aAAO,KAAK,EAAE,KAAK;AAAA,IACrB;AACA,SAAK,MAAM,MAAM,IAAI;AAAA,EACvB;AAAA,EAEO,SAAS;AACd,WAAO,EAAE,WAAW,KAAK,WAAW,YAAY,KAAK,WAAW;AAAA,EAClE;AACF;",
  "names": ["ReadyState"]
}
