{
  "version": 3,
  "sources": ["../src/WebSocketClient.ts"],
  "sourcesContent": ["// <reference types=\"bun-types\" />\n\n// \"bun-types\" is currently conflicting with \"ws\" types.\n// @ts-ignore\nimport type { ServerWebSocket } from 'bun';\nimport EventEmitter from 'events';\n\nimport { Protocol, type Client, type ClientPrivate, ClientState, type ISendOptions, getMessageBytes, logger, debugMessage } from '@colyseus/core';\n\nexport class WebSocketWrapper extends EventEmitter {\n  public ws: ServerWebSocket<any>;\n\n  constructor(ws: ServerWebSocket<any>) {\n    super();\n    this.ws = ws;\n  }\n}\n\nexport class WebSocketClient implements Client, ClientPrivate {\n  '~messages': any;\n\n  public id: string;\n  public ref: WebSocketWrapper;\n\n  public sessionId: string;\n  public state: ClientState = ClientState.JOINING;\n  public reconnectionToken: string;\n\n  public _enqueuedMessages: any[] = [];\n  public _afterNextPatchQueue;\n  public _reconnectionToken: string;\n  public _joinedAt: number;\n\n  constructor(id: string, ref: WebSocketWrapper,) {\n    this.id = this.sessionId = id;\n    this.ref = ref;\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' -> %j\", 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, [data]]);\n      return;\n    }\n\n    if (this.state !== ClientState.JOINED) {\n      // sending messages during `onJoin` or `onReconnect`.\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(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\n    // WebSocket is globally available on Bun runtime\n    // @ts-ignore\n    if (this.ref.ws.readyState !== WebSocket.OPEN) {\n      return;\n    }\n\n    // Bun's sendBinary requires an ArrayBufferView (Uint8Array, etc).\n    // Ensure we don't pass a plain number[] array.\n    this.ref.ws.sendBinary(ArrayBuffer.isView(data) ? data : new Uint8Array(data));\n  }\n\n  public error(code: number, message: string = '', cb?: (err?: Error) => void) {\n    this.raw(getMessageBytes[Protocol.ERROR](code, message));\n\n    if (cb) {\n      // (same API as \"ws\" transport)\n      setTimeout(cb, 1);\n    }\n  }\n\n  get readyState() {\n    return this.ref.ws.readyState;\n  }\n\n  public leave(code?: number, data?: string) {\n    this.ref.ws.close(code, data);\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: any) {\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;AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,oBAAyB;AAEzB,kBAAiI;AAE1H,IAAM,mBAAN,cAA+B,cAAAA,QAAa;AAAA,EAGjD,YAAY,IAA0B;AACpC,UAAM;AACN,SAAK,KAAK;AAAA,EACZ;AACF;AAEO,IAAM,kBAAN,MAAuD;AAAA,EAe5D,YAAY,IAAY,KAAwB;AARhD,SAAO,QAAqB,wBAAY;AAGxC,SAAO,oBAA2B,CAAC;AAMjC,SAAK,KAAK,KAAK,YAAY;AAC3B,SAAK,MAAM;AAAA,EACb;AAAA,EAEO,UAAU,MAAuB,OAA4B,SAAwB;AAC1F,kCAAa,iCAAiC,KAAK,WAAW,MAAM,KAAK;AAEzE,SAAK;AAAA,MACH,4BAAgB,IAAI,qBAAS,iBAAiB,MAAM,QAAW,KAAK;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAAA,EAEO,KAAK,eAAoB,kBAAuC,SAAwB;AAC7F,kCAAa,2BAA2B,KAAK,WAAW,eAAe,gBAAgB;AAEvF,SAAK;AAAA,MACH,4BAAgB,IAAI,qBAAS,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,IAAI,CAAC,CAAC;AAC7C;AAAA,IACF;AAEA,QAAI,KAAK,UAAU,wBAAY,QAAQ;AAKrC,WAAK,mBAAmB,KAAK,IAAI;AACjC;AAAA,IACF;AAEA,SAAK,IAAI,MAAM,OAAO;AAAA,EACxB;AAAA,EAEO,IAAI,MAA2B,SAAwB,IAA4B;AAKxF,QAAI,KAAK,IAAI,GAAG,eAAe,UAAU,MAAM;AAC7C;AAAA,IACF;AAIA,SAAK,IAAI,GAAG,WAAW,YAAY,OAAO,IAAI,IAAI,OAAO,IAAI,WAAW,IAAI,CAAC;AAAA,EAC/E;AAAA,EAEO,MAAM,MAAc,UAAkB,IAAI,IAA4B;AAC3E,SAAK,IAAI,4BAAgB,qBAAS,KAAK,EAAE,MAAM,OAAO,CAAC;AAEvD,QAAI,IAAI;AAEN,iBAAW,IAAI,CAAC;AAAA,IAClB;AAAA,EACF;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK,IAAI,GAAG;AAAA,EACrB;AAAA,EAEO,MAAM,MAAe,MAAe;AACzC,SAAK,IAAI,GAAG,MAAM,MAAM,IAAI;AAAA,EAC9B;AAAA,EAEO,MAAM,MAAe,MAAe;AACzC,uBAAO,KAAK,mEAAmE;AAC/E,QAAI;AACF,YAAM,IAAI,MAAM;AAAA,IAClB,SAAS,GAAQ;AACf,yBAAO,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": ["EventEmitter"]
}
