{"mappings":"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","names":["version","DEFAULT_HEADERS","version","VSN","DEFAULT_TIMEOUT","WS_CLOSE_NORMAL","SOCKET_STATES","CHANNEL_STATES","CHANNEL_EVENTS","TRANSPORTS","CONNECTION_STATE","Serializer","rawPayload","callback","buffer","view","decoder","topicSize","eventSize","offset","topic","event","data","Timer","callback","timerCalc","PostgresTypes","convertChangeData","columns","record","options","skipTypes","_a","acc","rec_key","convertColumn","columnName","column","x","colType","value","convertCell","noop","type","dataType","toArray","toBoolean","toNumber","toJson","toTimestampString","parsedValue","error","lastIdx","closeBrace","arr","valTrim","val","httpEndpointURL","socketUrl","url","Push","channel","event","payload","timeout","DEFAULT_TIMEOUT","status","callback","_a","response","h","REALTIME_PRESENCE_LISTEN_EVENTS","RealtimePresence","_RealtimePresence","channel","opts","events","newState","onJoin","onLeave","onSync","diff","key","currentPresences","newPresences","leftPresences","currentState","state","transformedState","joins","leaves","presences","newPresenceRefs","m","curPresenceRefs","joinedPresences","_a","joinedPresenceRefs","curPresences","presenceRefsToRemove","obj","func","presence","callback","REALTIME_POSTGRES_CHANGES_LISTEN_EVENT","REALTIME_LISTEN_TYPES","REALTIME_SUBSCRIBE_STATES","REALTIME_CHANNEL_STATES","CHANNEL_STATES","RealtimeChannel","_RealtimeChannel","topic","params","socket","Push","CHANNEL_EVENTS","Timer","pushEvent","reason","payload","ref","RealtimePresence","httpEndpointURL","callback","timeout","broadcast","presence","isPrivate","e","accessTokenPayload","config","_b","_a","r","serverPostgresFilters","clientPostgresBindings","bindingsLen","newPostgresBindings","i","clientPostgresBinding","event","schema","table","filter","serverPostgresFilter","error","opts","type","args","endpoint_payload","options","response","resolve","push","_c","onClose","leavePush","url","controller","id","_event","_ref","typeLower","close","leave","join","handledPayload","bind","bindId","bindEvent","_e","_d","_f","postgresChanges","commit_timestamp","errors","binding","obj1","obj2","k","records","convertChangeData","noop","NATIVE_WEBSOCKET_AVAILABLE","RealtimeClient","endPoint","options","DEFAULT_HEADERS","DEFAULT_TIMEOUT","Serializer","customFetch","_fetch","args","fetch","TRANSPORTS","httpEndpointURL","accessToken","_a","tries","payload","callback","Timer","WSWebSocketDummy","WS","code","reason","channel","status","values_1","kind","msg","data","SOCKET_STATES","CONNECTION_STATE","topic","params","chan","RealtimeChannel","event","ref","result","token","CHANNEL_EVENTS","newRef","dupChannel","c","error","VSN","rawMessage","url","prefix","query","WS_CLOSE_NORMAL","address","_protocols"],"sources":["../esm/npm/@supabase/realtime-js@2.10.2/node_modules/@supabase/realtime-js/src/lib/version.ts","../esm/npm/@supabase/realtime-js@2.10.2/node_modules/@supabase/realtime-js/src/lib/constants.ts","../esm/npm/@supabase/realtime-js@2.10.2/node_modules/@supabase/realtime-js/src/lib/serializer.ts","../esm/npm/@supabase/realtime-js@2.10.2/node_modules/@supabase/realtime-js/src/lib/timer.ts","../esm/npm/@supabase/realtime-js@2.10.2/node_modules/@supabase/realtime-js/src/lib/transformers.ts","../esm/npm/@supabase/realtime-js@2.10.2/node_modules/@supabase/realtime-js/src/lib/push.ts","../esm/npm/@supabase/realtime-js@2.10.2/node_modules/@supabase/realtime-js/src/RealtimePresence.ts","../esm/npm/@supabase/realtime-js@2.10.2/node_modules/@supabase/realtime-js/src/RealtimeChannel.ts","../esm/npm/@supabase/realtime-js@2.10.2/node_modules/@supabase/realtime-js/src/RealtimeClient.ts"],"sourcesContent":["export const version = '2.10.2'\n","import { version } from './version'\n\nexport const DEFAULT_HEADERS = { 'X-Client-Info': `realtime-js/${version}` }\n\nexport const VSN: string = '1.0.0'\n\nexport const DEFAULT_TIMEOUT = 10000\n\nexport const WS_CLOSE_NORMAL = 1000\n\nexport enum SOCKET_STATES {\n  connecting = 0,\n  open = 1,\n  closing = 2,\n  closed = 3,\n}\n\nexport enum CHANNEL_STATES {\n  closed = 'closed',\n  errored = 'errored',\n  joined = 'joined',\n  joining = 'joining',\n  leaving = 'leaving',\n}\n\nexport enum CHANNEL_EVENTS {\n  close = 'phx_close',\n  error = 'phx_error',\n  join = 'phx_join',\n  reply = 'phx_reply',\n  leave = 'phx_leave',\n  access_token = 'access_token',\n}\n\nexport enum TRANSPORTS {\n  websocket = 'websocket',\n}\n\nexport enum CONNECTION_STATE {\n  Connecting = 'connecting',\n  Open = 'open',\n  Closing = 'closing',\n  Closed = 'closed',\n}\n","// This file draws heavily from https://github.com/phoenixframework/phoenix/commit/cf098e9cf7a44ee6479d31d911a97d3c7430c6fe\n// License: https://github.com/phoenixframework/phoenix/blob/master/LICENSE.md\n\nexport default class Serializer {\n  HEADER_LENGTH = 1\n\n  decode(rawPayload: ArrayBuffer | string, callback: Function) {\n    if (rawPayload.constructor === ArrayBuffer) {\n      return callback(this._binaryDecode(rawPayload))\n    }\n\n    if (typeof rawPayload === 'string') {\n      return callback(JSON.parse(rawPayload))\n    }\n\n    return callback({})\n  }\n\n  private _binaryDecode(buffer: ArrayBuffer) {\n    const view = new DataView(buffer)\n    const decoder = new TextDecoder()\n\n    return this._decodeBroadcast(buffer, view, decoder)\n  }\n\n  private _decodeBroadcast(\n    buffer: ArrayBuffer,\n    view: DataView,\n    decoder: TextDecoder\n  ): {\n    ref: null\n    topic: string\n    event: string\n    payload: { [key: string]: any }\n  } {\n    const topicSize = view.getUint8(1)\n    const eventSize = view.getUint8(2)\n    let offset = this.HEADER_LENGTH + 2\n    const topic = decoder.decode(buffer.slice(offset, offset + topicSize))\n    offset = offset + topicSize\n    const event = decoder.decode(buffer.slice(offset, offset + eventSize))\n    offset = offset + eventSize\n    const data = JSON.parse(\n      decoder.decode(buffer.slice(offset, buffer.byteLength))\n    )\n\n    return { ref: null, topic: topic, event: event, payload: data }\n  }\n}\n","/**\n * Creates a timer that accepts a `timerCalc` function to perform calculated timeout retries, such as exponential backoff.\n *\n * @example\n *    let reconnectTimer = new Timer(() =\u003e this.connect(), function(tries){\n *      return [1000, 5000, 10000][tries - 1] || 10000\n *    })\n *    reconnectTimer.scheduleTimeout() // fires after 1000\n *    reconnectTimer.scheduleTimeout() // fires after 5000\n *    reconnectTimer.reset()\n *    reconnectTimer.scheduleTimeout() // fires after 1000\n */\nexport default class Timer {\n  timer: number | undefined = undefined\n  tries: number = 0\n\n  constructor(public callback: Function, public timerCalc: Function) {\n    this.callback = callback\n    this.timerCalc = timerCalc\n  }\n\n  reset() {\n    this.tries = 0\n    clearTimeout(this.timer)\n  }\n\n  // Cancels any previous scheduleTimeout and schedules callback\n  scheduleTimeout() {\n    clearTimeout(this.timer)\n\n    this.timer = \u003cany\u003esetTimeout(() =\u003e {\n      this.tries = this.tries + 1\n      this.callback()\n    }, this.timerCalc(this.tries + 1))\n  }\n}\n","/**\n * Helpers to convert the change Payload into native JS types.\n */\n\n// Adapted from epgsql (src/epgsql_binary.erl), this module licensed under\n// 3-clause BSD found here: https://raw.githubusercontent.com/epgsql/epgsql/devel/LICENSE\n\nexport enum PostgresTypes {\n  abstime = 'abstime',\n  bool = 'bool',\n  date = 'date',\n  daterange = 'daterange',\n  float4 = 'float4',\n  float8 = 'float8',\n  int2 = 'int2',\n  int4 = 'int4',\n  int4range = 'int4range',\n  int8 = 'int8',\n  int8range = 'int8range',\n  json = 'json',\n  jsonb = 'jsonb',\n  money = 'money',\n  numeric = 'numeric',\n  oid = 'oid',\n  reltime = 'reltime',\n  text = 'text',\n  time = 'time',\n  timestamp = 'timestamp',\n  timestamptz = 'timestamptz',\n  timetz = 'timetz',\n  tsrange = 'tsrange',\n  tstzrange = 'tstzrange',\n}\n\ntype Columns = {\n  name: string // the column name. eg: \"user_id\"\n  type: string // the column type. eg: \"uuid\"\n  flags?: string[] // any special flags for the column. eg: [\"key\"]\n  type_modifier?: number // the type modifier. eg: 4294967295\n}[]\n\ntype BaseValue = null | string | number | boolean\ntype RecordValue = BaseValue | BaseValue[]\n\ntype Record = {\n  [key: string]: RecordValue\n}\n\n/**\n * Takes an array of columns and an object of string values then converts each string value\n * to its mapped type.\n *\n * @param {{name: String, type: String}[]} columns\n * @param {Object} record\n * @param {Object} options The map of various options that can be applied to the mapper\n * @param {Array} options.skipTypes The array of types that should not be converted\n *\n * @example convertChangeData([{name: 'first_name', type: 'text'}, {name: 'age', type: 'int4'}], {first_name: 'Paul', age:'33'}, {})\n * //=\u003e{ first_name: 'Paul', age: 33 }\n */\nexport const convertChangeData = (\n  columns: Columns,\n  record: Record,\n  options: { skipTypes?: string[] } = {}\n): Record =\u003e {\n  const skipTypes = options.skipTypes ?? []\n\n  return Object.keys(record).reduce((acc, rec_key) =\u003e {\n    acc[rec_key] = convertColumn(rec_key, columns, record, skipTypes)\n    return acc\n  }, {} as Record)\n}\n\n/**\n * Converts the value of an individual column.\n *\n * @param {String} columnName The column that you want to convert\n * @param {{name: String, type: String}[]} columns All of the columns\n * @param {Object} record The map of string values\n * @param {Array} skipTypes An array of types that should not be converted\n * @return {object} Useless information\n *\n * @example convertColumn('age', [{name: 'first_name', type: 'text'}, {name: 'age', type: 'int4'}], {first_name: 'Paul', age: '33'}, [])\n * //=\u003e 33\n * @example convertColumn('age', [{name: 'first_name', type: 'text'}, {name: 'age', type: 'int4'}], {first_name: 'Paul', age: '33'}, ['int4'])\n * //=\u003e \"33\"\n */\nexport const convertColumn = (\n  columnName: string,\n  columns: Columns,\n  record: Record,\n  skipTypes: string[]\n): RecordValue =\u003e {\n  const column = columns.find((x) =\u003e x.name === columnName)\n  const colType = column?.type\n  const value = record[columnName]\n\n  if (colType \u0026\u0026 !skipTypes.includes(colType)) {\n    return convertCell(colType, value)\n  }\n\n  return noop(value)\n}\n\n/**\n * If the value of the cell is `null`, returns null.\n * Otherwise converts the string value to the correct type.\n * @param {String} type A postgres column type\n * @param {String} value The cell value\n *\n * @example convertCell('bool', 't')\n * //=\u003e true\n * @example convertCell('int8', '10')\n * //=\u003e 10\n * @example convertCell('_int4', '{1,2,3,4}')\n * //=\u003e [1,2,3,4]\n */\nexport const convertCell = (type: string, value: RecordValue): RecordValue =\u003e {\n  // if data type is an array\n  if (type.charAt(0) === '_') {\n    const dataType = type.slice(1, type.length)\n    return toArray(value, dataType)\n  }\n\n  // If not null, convert to correct type.\n  switch (type) {\n    case PostgresTypes.bool:\n      return toBoolean(value)\n    case PostgresTypes.float4:\n    case PostgresTypes.float8:\n    case PostgresTypes.int2:\n    case PostgresTypes.int4:\n    case PostgresTypes.int8:\n    case PostgresTypes.numeric:\n    case PostgresTypes.oid:\n      return toNumber(value)\n    case PostgresTypes.json:\n    case PostgresTypes.jsonb:\n      return toJson(value)\n    case PostgresTypes.timestamp:\n      return toTimestampString(value) // Format to be consistent with PostgREST\n    case PostgresTypes.abstime: // To allow users to cast it based on Timezone\n    case PostgresTypes.date: // To allow users to cast it based on Timezone\n    case PostgresTypes.daterange:\n    case PostgresTypes.int4range:\n    case PostgresTypes.int8range:\n    case PostgresTypes.money:\n    case PostgresTypes.reltime: // To allow users to cast it based on Timezone\n    case PostgresTypes.text:\n    case PostgresTypes.time: // To allow users to cast it based on Timezone\n    case PostgresTypes.timestamptz: // To allow users to cast it based on Timezone\n    case PostgresTypes.timetz: // To allow users to cast it based on Timezone\n    case PostgresTypes.tsrange:\n    case PostgresTypes.tstzrange:\n      return noop(value)\n    default:\n      // Return the value for remaining types\n      return noop(value)\n  }\n}\n\nconst noop = (value: RecordValue): RecordValue =\u003e {\n  return value\n}\nexport const toBoolean = (value: RecordValue): RecordValue =\u003e {\n  switch (value) {\n    case 't':\n      return true\n    case 'f':\n      return false\n    default:\n      return value\n  }\n}\nexport const toNumber = (value: RecordValue): RecordValue =\u003e {\n  if (typeof value === 'string') {\n    const parsedValue = parseFloat(value)\n    if (!Number.isNaN(parsedValue)) {\n      return parsedValue\n    }\n  }\n  return value\n}\nexport const toJson = (value: RecordValue): RecordValue =\u003e {\n  if (typeof value === 'string') {\n    try {\n      return JSON.parse(value)\n    } catch (error) {\n      console.log(`JSON parse error: ${error}`)\n      return value\n    }\n  }\n  return value\n}\n\n/**\n * Converts a Postgres Array into a native JS array\n *\n * @example toArray('{}', 'int4')\n * //=\u003e []\n * @example toArray('{\"[2021-01-01,2021-12-31)\",\"(2021-01-01,2021-12-32]\"}', 'daterange')\n * //=\u003e ['[2021-01-01,2021-12-31)', '(2021-01-01,2021-12-32]']\n * @example toArray([1,2,3,4], 'int4')\n * //=\u003e [1,2,3,4]\n */\nexport const toArray = (value: RecordValue, type: string): RecordValue =\u003e {\n  if (typeof value !== 'string') {\n    return value\n  }\n\n  const lastIdx = value.length - 1\n  const closeBrace = value[lastIdx]\n  const openBrace = value[0]\n\n  // Confirm value is a Postgres array by checking curly brackets\n  if (openBrace === '{' \u0026\u0026 closeBrace === '}') {\n    let arr\n    const valTrim = value.slice(1, lastIdx)\n\n    // TODO: find a better solution to separate Postgres array data\n    try {\n      arr = JSON.parse('[' + valTrim + ']')\n    } catch (_) {\n      // WARNING: splitting on comma does not cover all edge cases\n      arr = valTrim ? valTrim.split(',') : []\n    }\n\n    return arr.map((val: BaseValue) =\u003e convertCell(type, val))\n  }\n\n  return value\n}\n\n/**\n * Fixes timestamp to be ISO-8601. Swaps the space between the date and time for a 'T'\n * See https://github.com/supabase/supabase/issues/18\n *\n * @example toTimestampString('2019-09-10 00:00:00')\n * //=\u003e '2019-09-10T00:00:00'\n */\nexport const toTimestampString = (value: RecordValue): RecordValue =\u003e {\n  if (typeof value === 'string') {\n    return value.replace(' ', 'T')\n  }\n\n  return value\n}\n\nexport const httpEndpointURL = (socketUrl: string): string =\u003e {\n  let url = socketUrl\n  url = url.replace(/^ws/i, 'http')\n  url = url.replace(/(\\/socket\\/websocket|\\/socket|\\/websocket)\\/?$/i, '')\n  return url.replace(/\\/+$/, '')\n}\n","import { DEFAULT_TIMEOUT } from '../lib/constants'\nimport type RealtimeChannel from '../RealtimeChannel'\n\nexport default class Push {\n  sent: boolean = false\n  timeoutTimer: number | undefined = undefined\n  ref: string = ''\n  receivedResp: {\n    status: string\n    response: { [key: string]: any }\n  } | null = null\n  recHooks: {\n    status: string\n    callback: Function\n  }[] = []\n  refEvent: string | null = null\n\n  /**\n   * Initializes the Push\n   *\n   * @param channel The Channel\n   * @param event The event, for example `\"phx_join\"`\n   * @param payload The payload, for example `{user_id: 123}`\n   * @param timeout The push timeout in milliseconds\n   */\n  constructor(\n    public channel: RealtimeChannel,\n    public event: string,\n    public payload: { [key: string]: any } = {},\n    public timeout: number = DEFAULT_TIMEOUT\n  ) {}\n\n  resend(timeout: number) {\n    this.timeout = timeout\n    this._cancelRefEvent()\n    this.ref = ''\n    this.refEvent = null\n    this.receivedResp = null\n    this.sent = false\n    this.send()\n  }\n\n  send() {\n    if (this._hasReceived('timeout')) {\n      return\n    }\n    this.startTimeout()\n    this.sent = true\n    this.channel.socket.push({\n      topic: this.channel.topic,\n      event: this.event,\n      payload: this.payload,\n      ref: this.ref,\n      join_ref: this.channel._joinRef(),\n    })\n  }\n\n  updatePayload(payload: { [key: string]: any }): void {\n    this.payload = { ...this.payload, ...payload }\n  }\n\n  receive(status: string, callback: Function) {\n    if (this._hasReceived(status)) {\n      callback(this.receivedResp?.response)\n    }\n\n    this.recHooks.push({ status, callback })\n    return this\n  }\n\n  startTimeout() {\n    if (this.timeoutTimer) {\n      return\n    }\n    this.ref = this.channel.socket._makeRef()\n    this.refEvent = this.channel._replyEventName(this.ref)\n\n    const callback = (payload: any) =\u003e {\n      this._cancelRefEvent()\n      this._cancelTimeout()\n      this.receivedResp = payload\n      this._matchReceive(payload)\n    }\n\n    this.channel._on(this.refEvent, {}, callback)\n\n    this.timeoutTimer = \u003cany\u003esetTimeout(() =\u003e {\n      this.trigger('timeout', {})\n    }, this.timeout)\n  }\n\n  trigger(status: string, response: any) {\n    if (this.refEvent)\n      this.channel._trigger(this.refEvent, { status, response })\n  }\n\n  destroy() {\n    this._cancelRefEvent()\n    this._cancelTimeout()\n  }\n\n  private _cancelRefEvent() {\n    if (!this.refEvent) {\n      return\n    }\n\n    this.channel._off(this.refEvent, {})\n  }\n\n  private _cancelTimeout() {\n    clearTimeout(this.timeoutTimer)\n    this.timeoutTimer = undefined\n  }\n\n  private _matchReceive({\n    status,\n    response,\n  }: {\n    status: string\n    response: Function\n  }) {\n    this.recHooks\n      .filter((h) =\u003e h.status === status)\n      .forEach((h) =\u003e h.callback(response))\n  }\n\n  private _hasReceived(status: string) {\n    return this.receivedResp \u0026\u0026 this.receivedResp.status === status\n  }\n}\n","/*\n  This file draws heavily from https://github.com/phoenixframework/phoenix/blob/d344ec0a732ab4ee204215b31de69cf4be72e3bf/assets/js/phoenix/presence.js\n  License: https://github.com/phoenixframework/phoenix/blob/d344ec0a732ab4ee204215b31de69cf4be72e3bf/LICENSE.md\n*/\n\nimport type {\n  PresenceOpts,\n  PresenceOnJoinCallback,\n  PresenceOnLeaveCallback,\n} from 'phoenix'\nimport type RealtimeChannel from './RealtimeChannel'\n\ntype Presence\u003cT extends { [key: string]: any } = {}\u003e = {\n  presence_ref: string\n} \u0026 T\n\nexport type RealtimePresenceState\u003cT extends { [key: string]: any } = {}\u003e = {\n  [key: string]: Presence\u003cT\u003e[]\n}\n\nexport type RealtimePresenceJoinPayload\u003cT extends { [key: string]: any }\u003e = {\n  event: `${REALTIME_PRESENCE_LISTEN_EVENTS.JOIN}`\n  key: string\n  currentPresences: Presence\u003cT\u003e[]\n  newPresences: Presence\u003cT\u003e[]\n}\n\nexport type RealtimePresenceLeavePayload\u003cT extends { [key: string]: any }\u003e = {\n  event: `${REALTIME_PRESENCE_LISTEN_EVENTS.LEAVE}`\n  key: string\n  currentPresences: Presence\u003cT\u003e[]\n  leftPresences: Presence\u003cT\u003e[]\n}\n\nexport enum REALTIME_PRESENCE_LISTEN_EVENTS {\n  SYNC = 'sync',\n  JOIN = 'join',\n  LEAVE = 'leave',\n}\n\ntype PresenceDiff = {\n  joins: RealtimePresenceState\n  leaves: RealtimePresenceState\n}\n\ntype RawPresenceState = {\n  [key: string]: {\n    metas: {\n      phx_ref?: string\n      phx_ref_prev?: string\n      [key: string]: any\n    }[]\n  }\n}\n\ntype RawPresenceDiff = {\n  joins: RawPresenceState\n  leaves: RawPresenceState\n}\n\ntype PresenceChooser\u003cT\u003e = (key: string, presences: Presence[]) =\u003e T\n\nexport default class RealtimePresence {\n  state: RealtimePresenceState = {}\n  pendingDiffs: RawPresenceDiff[] = []\n  joinRef: string | null = null\n  caller: {\n    onJoin: PresenceOnJoinCallback\n    onLeave: PresenceOnLeaveCallback\n    onSync: () =\u003e void\n  } = {\n    onJoin: () =\u003e {},\n    onLeave: () =\u003e {},\n    onSync: () =\u003e {},\n  }\n\n  /**\n   * Initializes the Presence.\n   *\n   * @param channel - The RealtimeChannel\n   * @param opts - The options,\n   *        for example `{events: {state: 'state', diff: 'diff'}}`\n   */\n  constructor(public channel: RealtimeChannel, opts?: PresenceOpts) {\n    const events = opts?.events || {\n      state: 'presence_state',\n      diff: 'presence_diff',\n    }\n\n    this.channel._on(events.state, {}, (newState: RawPresenceState) =\u003e {\n      const { onJoin, onLeave, onSync } = this.caller\n\n      this.joinRef = this.channel._joinRef()\n\n      this.state = RealtimePresence.syncState(\n        this.state,\n        newState,\n        onJoin,\n        onLeave\n      )\n\n      this.pendingDiffs.forEach((diff) =\u003e {\n        this.state = RealtimePresence.syncDiff(\n          this.state,\n          diff,\n          onJoin,\n          onLeave\n        )\n      })\n\n      this.pendingDiffs = []\n\n      onSync()\n    })\n\n    this.channel._on(events.diff, {}, (diff: RawPresenceDiff) =\u003e {\n      const { onJoin, onLeave, onSync } = this.caller\n\n      if (this.inPendingSyncState()) {\n        this.pendingDiffs.push(diff)\n      } else {\n        this.state = RealtimePresence.syncDiff(\n          this.state,\n          diff,\n          onJoin,\n          onLeave\n        )\n\n        onSync()\n      }\n    })\n\n    this.onJoin((key, currentPresences, newPresences) =\u003e {\n      this.channel._trigger('presence', {\n        event: 'join',\n        key,\n        currentPresences,\n        newPresences,\n      })\n    })\n\n    this.onLeave((key, currentPresences, leftPresences) =\u003e {\n      this.channel._trigger('presence', {\n        event: 'leave',\n        key,\n        currentPresences,\n        leftPresences,\n      })\n    })\n\n    this.onSync(() =\u003e {\n      this.channel._trigger('presence', { event: 'sync' })\n    })\n  }\n\n  /**\n   * Used to sync the list of presences on the server with the\n   * client's state.\n   *\n   * An optional `onJoin` and `onLeave` callback can be provided to\n   * react to changes in the client's local presences across\n   * disconnects and reconnects with the server.\n   *\n   * @internal\n   */\n  private static syncState(\n    currentState: RealtimePresenceState,\n    newState: RawPresenceState | RealtimePresenceState,\n    onJoin: PresenceOnJoinCallback,\n    onLeave: PresenceOnLeaveCallback\n  ): RealtimePresenceState {\n    const state = this.cloneDeep(currentState)\n    const transformedState = this.transformState(newState)\n    const joins: RealtimePresenceState = {}\n    const leaves: RealtimePresenceState = {}\n\n    this.map(state, (key: string, presences: Presence[]) =\u003e {\n      if (!transformedState[key]) {\n        leaves[key] = presences\n      }\n    })\n\n    this.map(transformedState, (key, newPresences: Presence[]) =\u003e {\n      const currentPresences: Presence[] = state[key]\n\n      if (currentPresences) {\n        const newPresenceRefs = newPresences.map(\n          (m: Presence) =\u003e m.presence_ref\n        )\n        const curPresenceRefs = currentPresences.map(\n          (m: Presence) =\u003e m.presence_ref\n        )\n        const joinedPresences: Presence[] = newPresences.filter(\n          (m: Presence) =\u003e curPresenceRefs.indexOf(m.presence_ref) \u003c 0\n        )\n        const leftPresences: Presence[] = currentPresences.filter(\n          (m: Presence) =\u003e newPresenceRefs.indexOf(m.presence_ref) \u003c 0\n        )\n\n        if (joinedPresences.length \u003e 0) {\n          joins[key] = joinedPresences\n        }\n\n        if (leftPresences.length \u003e 0) {\n          leaves[key] = leftPresences\n        }\n      } else {\n        joins[key] = newPresences\n      }\n    })\n\n    return this.syncDiff(state, { joins, leaves }, onJoin, onLeave)\n  }\n\n  /**\n   * Used to sync a diff of presence join and leave events from the\n   * server, as they happen.\n   *\n   * Like `syncState`, `syncDiff` accepts optional `onJoin` and\n   * `onLeave` callbacks to react to a user joining or leaving from a\n   * device.\n   *\n   * @internal\n   */\n  private static syncDiff(\n    state: RealtimePresenceState,\n    diff: RawPresenceDiff | PresenceDiff,\n    onJoin: PresenceOnJoinCallback,\n    onLeave: PresenceOnLeaveCallback\n  ): RealtimePresenceState {\n    const { joins, leaves } = {\n      joins: this.transformState(diff.joins),\n      leaves: this.transformState(diff.leaves),\n    }\n\n    if (!onJoin) {\n      onJoin = () =\u003e {}\n    }\n\n    if (!onLeave) {\n      onLeave = () =\u003e {}\n    }\n\n    this.map(joins, (key, newPresences: Presence[]) =\u003e {\n      const currentPresences: Presence[] = state[key] ?? []\n      state[key] = this.cloneDeep(newPresences)\n\n      if (currentPresences.length \u003e 0) {\n        const joinedPresenceRefs = state[key].map(\n          (m: Presence) =\u003e m.presence_ref\n        )\n        const curPresences: Presence[] = currentPresences.filter(\n          (m: Presence) =\u003e joinedPresenceRefs.indexOf(m.presence_ref) \u003c 0\n        )\n\n        state[key].unshift(...curPresences)\n      }\n\n      onJoin(key, currentPresences, newPresences)\n    })\n\n    this.map(leaves, (key, leftPresences: Presence[]) =\u003e {\n      let currentPresences: Presence[] = state[key]\n\n      if (!currentPresences) return\n\n      const presenceRefsToRemove = leftPresences.map(\n        (m: Presence) =\u003e m.presence_ref\n      )\n      currentPresences = currentPresences.filter(\n        (m: Presence) =\u003e presenceRefsToRemove.indexOf(m.presence_ref) \u003c 0\n      )\n\n      state[key] = currentPresences\n\n      onLeave(key, currentPresences, leftPresences)\n\n      if (currentPresences.length === 0) delete state[key]\n    })\n\n    return state\n  }\n\n  /** @internal */\n  private static map\u003cT = any\u003e(\n    obj: RealtimePresenceState,\n    func: PresenceChooser\u003cT\u003e\n  ): T[] {\n    return Object.getOwnPropertyNames(obj).map((key) =\u003e func(key, obj[key]))\n  }\n\n  /**\n   * Remove 'metas' key\n   * Change 'phx_ref' to 'presence_ref'\n   * Remove 'phx_ref' and 'phx_ref_prev'\n   *\n   * @example\n   * // returns {\n   *  abc123: [\n   *    { presence_ref: '2', user_id: 1 },\n   *    { presence_ref: '3', user_id: 2 }\n   *  ]\n   * }\n   * RealtimePresence.transformState({\n   *  abc123: {\n   *    metas: [\n   *      { phx_ref: '2', phx_ref_prev: '1' user_id: 1 },\n   *      { phx_ref: '3', user_id: 2 }\n   *    ]\n   *  }\n   * })\n   *\n   * @internal\n   */\n  private static transformState(\n    state: RawPresenceState | RealtimePresenceState\n  ): RealtimePresenceState {\n    state = this.cloneDeep(state)\n\n    return Object.getOwnPropertyNames(state).reduce((newState, key) =\u003e {\n      const presences = state[key]\n\n      if ('metas' in presences) {\n        newState[key] = presences.metas.map((presence) =\u003e {\n          presence['presence_ref'] = presence['phx_ref']\n\n          delete presence['phx_ref']\n          delete presence['phx_ref_prev']\n\n          return presence\n        }) as Presence[]\n      } else {\n        newState[key] = presences\n      }\n\n      return newState\n    }, {} as RealtimePresenceState)\n  }\n\n  /** @internal */\n  private static cloneDeep(obj: { [key: string]: any }) {\n    return JSON.parse(JSON.stringify(obj))\n  }\n\n  /** @internal */\n  private onJoin(callback: PresenceOnJoinCallback): void {\n    this.caller.onJoin = callback\n  }\n\n  /** @internal */\n  private onLeave(callback: PresenceOnLeaveCallback): void {\n    this.caller.onLeave = callback\n  }\n\n  /** @internal */\n  private onSync(callback: () =\u003e void): void {\n    this.caller.onSync = callback\n  }\n\n  /** @internal */\n  private inPendingSyncState(): boolean {\n    return !this.joinRef || this.joinRef !== this.channel._joinRef()\n  }\n}\n","import { CHANNEL_EVENTS, CHANNEL_STATES } from './lib/constants'\nimport Push from './lib/push'\nimport type RealtimeClient from './RealtimeClient'\nimport Timer from './lib/timer'\nimport RealtimePresence, {\n  REALTIME_PRESENCE_LISTEN_EVENTS,\n} from './RealtimePresence'\nimport type {\n  RealtimePresenceJoinPayload,\n  RealtimePresenceLeavePayload,\n  RealtimePresenceState,\n} from './RealtimePresence'\nimport * as Transformers from './lib/transformers'\nimport { httpEndpointURL } from './lib/transformers'\n\nexport type RealtimeChannelOptions = {\n  config: {\n    /**\n     * self option enables client to receive message it broadcast\n     * ack option instructs server to acknowledge that broadcast message was received\n     */\n    broadcast?: { self?: boolean; ack?: boolean }\n    /**\n     * key option is used to track presence payload across clients\n     */\n    presence?: { key?: string }\n    /**\n     * defines if the channel is private or not and if RLS policies will be used to check data\n     */\n    private?: boolean\n  }\n}\n\ntype RealtimePostgresChangesPayloadBase = {\n  schema: string\n  table: string\n  commit_timestamp: string\n  errors: string[]\n}\n\nexport type RealtimePostgresInsertPayload\u003cT extends { [key: string]: any }\u003e =\n  RealtimePostgresChangesPayloadBase \u0026 {\n    eventType: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT}`\n    new: T\n    old: {}\n  }\n\nexport type RealtimePostgresUpdatePayload\u003cT extends { [key: string]: any }\u003e =\n  RealtimePostgresChangesPayloadBase \u0026 {\n    eventType: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE}`\n    new: T\n    old: Partial\u003cT\u003e\n  }\n\nexport type RealtimePostgresDeletePayload\u003cT extends { [key: string]: any }\u003e =\n  RealtimePostgresChangesPayloadBase \u0026 {\n    eventType: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE}`\n    new: {}\n    old: Partial\u003cT\u003e\n  }\n\nexport type RealtimePostgresChangesPayload\u003cT extends { [key: string]: any }\u003e =\n  | RealtimePostgresInsertPayload\u003cT\u003e\n  | RealtimePostgresUpdatePayload\u003cT\u003e\n  | RealtimePostgresDeletePayload\u003cT\u003e\n\nexport type RealtimePostgresChangesFilter\u003c\n  T extends `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT}`\n\u003e = {\n  /**\n   * The type of database change to listen to.\n   */\n  event: T\n  /**\n   * The database schema to listen to.\n   */\n  schema: string\n  /**\n   * The database table to listen to.\n   */\n  table?: string\n  /**\n   * Receive database changes when filter is matched.\n   */\n  filter?: string\n}\n\nexport type RealtimeChannelSendResponse = 'ok' | 'timed out' | 'error'\n\nexport enum REALTIME_POSTGRES_CHANGES_LISTEN_EVENT {\n  ALL = '*',\n  INSERT = 'INSERT',\n  UPDATE = 'UPDATE',\n  DELETE = 'DELETE',\n}\n\nexport enum REALTIME_LISTEN_TYPES {\n  BROADCAST = 'broadcast',\n  PRESENCE = 'presence',\n  /**\n   * listen to Postgres changes.\n   */\n  POSTGRES_CHANGES = 'postgres_changes',\n}\n\nexport enum REALTIME_SUBSCRIBE_STATES {\n  SUBSCRIBED = 'SUBSCRIBED',\n  TIMED_OUT = 'TIMED_OUT',\n  CLOSED = 'CLOSED',\n  CHANNEL_ERROR = 'CHANNEL_ERROR',\n}\n\nexport const REALTIME_CHANNEL_STATES = CHANNEL_STATES\n\n/** A channel is the basic building block of Realtime\n * and narrows the scope of data flow to subscribed clients.\n * You can think of a channel as a chatroom where participants are able to see who's online\n * and send and receive messages.\n */\nexport default class RealtimeChannel {\n  bindings: {\n    [key: string]: {\n      type: string\n      filter: { [key: string]: any }\n      callback: Function\n      id?: string\n    }[]\n  } = {}\n  timeout: number\n  state = CHANNEL_STATES.closed\n  joinedOnce = false\n  joinPush: Push\n  rejoinTimer: Timer\n  pushBuffer: Push[] = []\n  presence: RealtimePresence\n  broadcastEndpointURL: string\n  subTopic: string\n\n  constructor(\n    /** Topic name can be any string. */\n    public topic: string,\n    public params: RealtimeChannelOptions = { config: {} },\n    public socket: RealtimeClient\n  ) {\n    this.subTopic = topic.replace(/^realtime:/i, '')\n    this.params.config = {\n      ...{\n        broadcast: { ack: false, self: false },\n        presence: { key: '' },\n        private: false,\n      },\n      ...params.config,\n    }\n    this.timeout = this.socket.timeout\n    this.joinPush = new Push(\n      this,\n      CHANNEL_EVENTS.join,\n      this.params,\n      this.timeout\n    )\n    this.rejoinTimer = new Timer(\n      () =\u003e this._rejoinUntilConnected(),\n      this.socket.reconnectAfterMs\n    )\n    this.joinPush.receive('ok', () =\u003e {\n      this.state = CHANNEL_STATES.joined\n      this.rejoinTimer.reset()\n      this.pushBuffer.forEach((pushEvent: Push) =\u003e pushEvent.send())\n      this.pushBuffer = []\n    })\n    this._onClose(() =\u003e {\n      this.rejoinTimer.reset()\n      this.socket.log('channel', `close ${this.topic} ${this._joinRef()}`)\n      this.state = CHANNEL_STATES.closed\n      this.socket._remove(this)\n    })\n    this._onError((reason: string) =\u003e {\n      if (this._isLeaving() || this._isClosed()) {\n        return\n      }\n      this.socket.log('channel', `error ${this.topic}`, reason)\n      this.state = CHANNEL_STATES.errored\n      this.rejoinTimer.scheduleTimeout()\n    })\n    this.joinPush.receive('timeout', () =\u003e {\n      if (!this._isJoining()) {\n        return\n      }\n      this.socket.log('channel', `timeout ${this.topic}`, this.joinPush.timeout)\n      this.state = CHANNEL_STATES.errored\n      this.rejoinTimer.scheduleTimeout()\n    })\n    this._on(CHANNEL_EVENTS.reply, {}, (payload: any, ref: string) =\u003e {\n      this._trigger(this._replyEventName(ref), payload)\n    })\n\n    this.presence = new RealtimePresence(this)\n\n    this.broadcastEndpointURL =\n      httpEndpointURL(this.socket.endPoint) + '/api/broadcast'\n  }\n\n  /** Subscribe registers your client with the server */\n  subscribe(\n    callback?: (status: `${REALTIME_SUBSCRIBE_STATES}`, err?: Error) =\u003e void,\n    timeout = this.timeout\n  ): RealtimeChannel {\n    if (!this.socket.isConnected()) {\n      this.socket.connect()\n    }\n\n    if (this.joinedOnce) {\n      throw `tried to subscribe multiple times. 'subscribe' can only be called a single time per channel instance`\n    } else {\n      const {\n        config: { broadcast, presence, private: isPrivate },\n      } = this.params\n      this._onError((e: Error) =\u003e callback \u0026\u0026 callback('CHANNEL_ERROR', e))\n      this._onClose(() =\u003e callback \u0026\u0026 callback('CLOSED'))\n\n      const accessTokenPayload: { access_token?: string } = {}\n      const config = {\n        broadcast,\n        presence,\n        postgres_changes:\n          this.bindings.postgres_changes?.map((r) =\u003e r.filter) ?? [],\n        private: isPrivate,\n      }\n\n      if (this.socket.accessToken) {\n        accessTokenPayload.access_token = this.socket.accessToken\n      }\n\n      this.updateJoinPayload({ ...{ config }, ...accessTokenPayload })\n\n      this.joinedOnce = true\n      this._rejoin(timeout)\n\n      this.joinPush\n        .receive(\n          'ok',\n          ({\n            postgres_changes: serverPostgresFilters,\n          }: {\n            postgres_changes: {\n              id: string\n              event: string\n              schema?: string\n              table?: string\n              filter?: string\n            }[]\n          }) =\u003e {\n            this.socket.accessToken \u0026\u0026\n              this.socket.setAuth(this.socket.accessToken)\n\n            if (serverPostgresFilters === undefined) {\n              callback \u0026\u0026 callback('SUBSCRIBED')\n              return\n            } else {\n              const clientPostgresBindings = this.bindings.postgres_changes\n              const bindingsLen = clientPostgresBindings?.length ?? 0\n              const newPostgresBindings = []\n\n              for (let i = 0; i \u003c bindingsLen; i++) {\n                const clientPostgresBinding = clientPostgresBindings[i]\n                const {\n                  filter: { event, schema, table, filter },\n                } = clientPostgresBinding\n                const serverPostgresFilter =\n                  serverPostgresFilters \u0026\u0026 serverPostgresFilters[i]\n\n                if (\n                  serverPostgresFilter \u0026\u0026\n                  serverPostgresFilter.event === event \u0026\u0026\n                  serverPostgresFilter.schema === schema \u0026\u0026\n                  serverPostgresFilter.table === table \u0026\u0026\n                  serverPostgresFilter.filter === filter\n                ) {\n                  newPostgresBindings.push({\n                    ...clientPostgresBinding,\n                    id: serverPostgresFilter.id,\n                  })\n                } else {\n                  this.unsubscribe()\n                  callback \u0026\u0026\n                    callback(\n                      'CHANNEL_ERROR',\n                      new Error(\n                        'mismatch between server and client bindings for postgres changes'\n                      )\n                    )\n                  return\n                }\n              }\n\n              this.bindings.postgres_changes = newPostgresBindings\n\n              callback \u0026\u0026 callback('SUBSCRIBED')\n              return\n            }\n          }\n        )\n        .receive('error', (error: { [key: string]: any }) =\u003e {\n          callback \u0026\u0026\n            callback(\n              'CHANNEL_ERROR',\n              new Error(\n                JSON.stringify(Object.values(error).join(', ') || 'error')\n              )\n            )\n          return\n        })\n        .receive('timeout', () =\u003e {\n          callback \u0026\u0026 callback('TIMED_OUT')\n          return\n        })\n    }\n\n    return this\n  }\n\n  presenceState\u003c\n    T extends { [key: string]: any } = {}\n  \u003e(): RealtimePresenceState\u003cT\u003e {\n    return this.presence.state as RealtimePresenceState\u003cT\u003e\n  }\n\n  async track(\n    payload: { [key: string]: any },\n    opts: { [key: string]: any } = {}\n  ): Promise\u003cRealtimeChannelSendResponse\u003e {\n    return await this.send(\n      {\n        type: 'presence',\n        event: 'track',\n        payload,\n      },\n      opts.timeout || this.timeout\n    )\n  }\n\n  async untrack(\n    opts: { [key: string]: any } = {}\n  ): Promise\u003cRealtimeChannelSendResponse\u003e {\n    return await this.send(\n      {\n        type: 'presence',\n        event: 'untrack',\n      },\n      opts\n    )\n  }\n\n  /**\n   * Creates an event handler that listens to changes.\n   */\n  on(\n    type: `${REALTIME_LISTEN_TYPES.PRESENCE}`,\n    filter: { event: `${REALTIME_PRESENCE_LISTEN_EVENTS.SYNC}` },\n    callback: () =\u003e void\n  ): RealtimeChannel\n  on\u003cT extends { [key: string]: any }\u003e(\n    type: `${REALTIME_LISTEN_TYPES.PRESENCE}`,\n    filter: { event: `${REALTIME_PRESENCE_LISTEN_EVENTS.JOIN}` },\n    callback: (payload: RealtimePresenceJoinPayload\u003cT\u003e) =\u003e void\n  ): RealtimeChannel\n  on\u003cT extends { [key: string]: any }\u003e(\n    type: `${REALTIME_LISTEN_TYPES.PRESENCE}`,\n    filter: { event: `${REALTIME_PRESENCE_LISTEN_EVENTS.LEAVE}` },\n    callback: (payload: RealtimePresenceLeavePayload\u003cT\u003e) =\u003e void\n  ): RealtimeChannel\n  on\u003cT extends { [key: string]: any }\u003e(\n    type: `${REALTIME_LISTEN_TYPES.POSTGRES_CHANGES}`,\n    filter: RealtimePostgresChangesFilter\u003c`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.ALL}`\u003e,\n    callback: (payload: RealtimePostgresChangesPayload\u003cT\u003e) =\u003e void\n  ): RealtimeChannel\n  on\u003cT extends { [key: string]: any }\u003e(\n    type: `${REALTIME_LISTEN_TYPES.POSTGRES_CHANGES}`,\n    filter: RealtimePostgresChangesFilter\u003c`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT}`\u003e,\n    callback: (payload: RealtimePostgresInsertPayload\u003cT\u003e) =\u003e void\n  ): RealtimeChannel\n  on\u003cT extends { [key: string]: any }\u003e(\n    type: `${REALTIME_LISTEN_TYPES.POSTGRES_CHANGES}`,\n    filter: RealtimePostgresChangesFilter\u003c`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE}`\u003e,\n    callback: (payload: RealtimePostgresUpdatePayload\u003cT\u003e) =\u003e void\n  ): RealtimeChannel\n  on\u003cT extends { [key: string]: any }\u003e(\n    type: `${REALTIME_LISTEN_TYPES.POSTGRES_CHANGES}`,\n    filter: RealtimePostgresChangesFilter\u003c`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE}`\u003e,\n    callback: (payload: RealtimePostgresDeletePayload\u003cT\u003e) =\u003e void\n  ): RealtimeChannel\n  /**\n   * The following is placed here to display on supabase.com/docs/reference/javascript/subscribe.\n   * @param type One of \"broadcast\", \"presence\", or \"postgres_changes\".\n   * @param filter Custom object specific to the Realtime feature detailing which payloads to receive.\n   * @param callback Function to be invoked when event handler is triggered.\n   */\n  on(\n    type: `${REALTIME_LISTEN_TYPES.BROADCAST}`,\n    filter: { event: string },\n    callback: (payload: {\n      type: `${REALTIME_LISTEN_TYPES.BROADCAST}`\n      event: string\n      [key: string]: any\n    }) =\u003e void\n  ): RealtimeChannel\n  on\u003cT extends { [key: string]: any }\u003e(\n    type: `${REALTIME_LISTEN_TYPES.BROADCAST}`,\n    filter: { event: string },\n    callback: (payload: {\n      type: `${REALTIME_LISTEN_TYPES.BROADCAST}`\n      event: string\n      payload: T\n    }) =\u003e void\n  ): RealtimeChannel\n  on(\n    type: `${REALTIME_LISTEN_TYPES}`,\n    filter: { event: string; [key: string]: string },\n    callback: (payload: any) =\u003e void\n  ): RealtimeChannel {\n    return this._on(type, filter, callback)\n  }\n  /**\n   * Sends a message into the channel.\n   *\n   * @param args Arguments to send to channel\n   * @param args.type The type of event to send\n   * @param args.event The name of the event being sent\n   * @param args.payload Payload to be sent\n   * @param opts Options to be used during the send process\n   */\n  async send(\n    args: {\n      type: 'broadcast' | 'presence' | 'postgres_changes'\n      event: string\n      payload?: any\n      [key: string]: any\n    },\n    opts: { [key: string]: any } = {}\n  ): Promise\u003cRealtimeChannelSendResponse\u003e {\n    if (!this._canPush() \u0026\u0026 args.type === 'broadcast') {\n      const { event, payload: endpoint_payload } = args\n      const options = {\n        method: 'POST',\n        headers: {\n          Authorization: this.socket.accessToken\n            ? `Bearer ${this.socket.accessToken}`\n            : '',\n          apikey: this.socket.apiKey ? this.socket.apiKey : '',\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({\n          messages: [\n            { topic: this.subTopic, event, payload: endpoint_payload },\n          ],\n        }),\n      }\n\n      try {\n        const response = await this._fetchWithTimeout(\n          this.broadcastEndpointURL,\n          options,\n          opts.timeout ?? this.timeout\n        )\n\n        await response.body?.cancel()\n        return response.ok ? 'ok' : 'error'\n      } catch (error: any) {\n        if (error.name === 'AbortError') {\n          return 'timed out'\n        } else {\n          return 'error'\n        }\n      }\n    } else {\n      return new Promise((resolve) =\u003e {\n        const push = this._push(args.type, args, opts.timeout || this.timeout)\n\n        if (args.type === 'broadcast' \u0026\u0026 !this.params?.config?.broadcast?.ack) {\n          resolve('ok')\n        }\n\n        push.receive('ok', () =\u003e resolve('ok'))\n        push.receive('error', () =\u003e resolve('error'))\n        push.receive('timeout', () =\u003e resolve('timed out'))\n      })\n    }\n  }\n\n  updateJoinPayload(payload: { [key: string]: any }): void {\n    this.joinPush.updatePayload(payload)\n  }\n\n  /**\n   * Leaves the channel.\n   *\n   * Unsubscribes from server events, and instructs channel to terminate on server.\n   * Triggers onClose() hooks.\n   *\n   * To receive leave acknowledgements, use the a `receive` hook to bind to the server ack, ie:\n   * channel.unsubscribe().receive(\"ok\", () =\u003e alert(\"left!\") )\n   */\n  unsubscribe(timeout = this.timeout): Promise\u003c'ok' | 'timed out' | 'error'\u003e {\n    this.state = CHANNEL_STATES.leaving\n    const onClose = () =\u003e {\n      this.socket.log('channel', `leave ${this.topic}`)\n      this._trigger(CHANNEL_EVENTS.close, 'leave', this._joinRef())\n    }\n\n    this.rejoinTimer.reset()\n    // Destroy joinPush to avoid connection timeouts during unscription phase\n    this.joinPush.destroy()\n\n    return new Promise((resolve) =\u003e {\n      const leavePush = new Push(this, CHANNEL_EVENTS.leave, {}, timeout)\n\n      leavePush\n        .receive('ok', () =\u003e {\n          onClose()\n          resolve('ok')\n        })\n        .receive('timeout', () =\u003e {\n          onClose()\n          resolve('timed out')\n        })\n        .receive('error', () =\u003e {\n          resolve('error')\n        })\n\n      leavePush.send()\n\n      if (!this._canPush()) {\n        leavePush.trigger('ok', {})\n      }\n    })\n  }\n\n  /** @internal */\n\n  async _fetchWithTimeout(\n    url: string,\n    options: { [key: string]: any },\n    timeout: number\n  ) {\n    const controller = new AbortController()\n    const id = setTimeout(() =\u003e controller.abort(), timeout)\n\n    const response = await this.socket.fetch(url, {\n      ...options,\n      signal: controller.signal,\n    })\n\n    clearTimeout(id)\n\n    return response\n  }\n\n  /** @internal */\n  _push(\n    event: string,\n    payload: { [key: string]: any },\n    timeout = this.timeout\n  ) {\n    if (!this.joinedOnce) {\n      throw `tried to push '${event}' to '${this.topic}' before joining. Use channel.subscribe() before pushing events`\n    }\n    let pushEvent = new Push(this, event, payload, timeout)\n    if (this._canPush()) {\n      pushEvent.send()\n    } else {\n      pushEvent.startTimeout()\n      this.pushBuffer.push(pushEvent)\n    }\n\n    return pushEvent\n  }\n\n  /**\n   * Overridable message hook\n   *\n   * Receives all events for specialized message handling before dispatching to the channel callbacks.\n   * Must return the payload, modified or unmodified.\n   *\n   * @internal\n   */\n  _onMessage(_event: string, payload: any, _ref?: string) {\n    return payload\n  }\n\n  /** @internal */\n  _isMember(topic: string): boolean {\n    return this.topic === topic\n  }\n\n  /** @internal */\n  _joinRef(): string {\n    return this.joinPush.ref\n  }\n\n  /** @internal */\n  _trigger(type: string, payload?: any, ref?: string) {\n    const typeLower = type.toLocaleLowerCase()\n    const { close, error, leave, join } = CHANNEL_EVENTS\n    const events: string[] = [close, error, leave, join]\n    if (ref \u0026\u0026 events.indexOf(typeLower) \u003e= 0 \u0026\u0026 ref !== this._joinRef()) {\n      return\n    }\n    let handledPayload = this._onMessage(typeLower, payload, ref)\n    if (payload \u0026\u0026 !handledPayload) {\n      throw 'channel onMessage callbacks must return the payload, modified or unmodified'\n    }\n\n    if (['insert', 'update', 'delete'].includes(typeLower)) {\n      this.bindings.postgres_changes\n        ?.filter((bind) =\u003e {\n          return (\n            bind.filter?.event === '*' ||\n            bind.filter?.event?.toLocaleLowerCase() === typeLower\n          )\n        })\n        .map((bind) =\u003e bind.callback(handledPayload, ref))\n    } else {\n      this.bindings[typeLower]\n        ?.filter((bind) =\u003e {\n          if (\n            ['broadcast', 'presence', 'postgres_changes'].includes(typeLower)\n          ) {\n            if ('id' in bind) {\n              const bindId = bind.id\n              const bindEvent = bind.filter?.event\n              return (\n                bindId \u0026\u0026\n                payload.ids?.includes(bindId) \u0026\u0026\n                (bindEvent === '*' ||\n                  bindEvent?.toLocaleLowerCase() ===\n                    payload.data?.type.toLocaleLowerCase())\n              )\n            } else {\n              const bindEvent = bind?.filter?.event?.toLocaleLowerCase()\n              return (\n                bindEvent === '*' ||\n                bindEvent === payload?.event?.toLocaleLowerCase()\n              )\n            }\n          } else {\n            return bind.type.toLocaleLowerCase() === typeLower\n          }\n        })\n        .map((bind) =\u003e {\n          if (typeof handledPayload === 'object' \u0026\u0026 'ids' in handledPayload) {\n            const postgresChanges = handledPayload.data\n            const { schema, table, commit_timestamp, type, errors } =\n              postgresChanges\n            const enrichedPayload = {\n              schema: schema,\n              table: table,\n              commit_timestamp: commit_timestamp,\n              eventType: type,\n              new: {},\n              old: {},\n              errors: errors,\n            }\n            handledPayload = {\n              ...enrichedPayload,\n              ...this._getPayloadRecords(postgresChanges),\n            }\n          }\n          bind.callback(handledPayload, ref)\n        })\n    }\n  }\n\n  /** @internal */\n  _isClosed(): boolean {\n    return this.state === CHANNEL_STATES.closed\n  }\n\n  /** @internal */\n  _isJoined(): boolean {\n    return this.state === CHANNEL_STATES.joined\n  }\n\n  /** @internal */\n  _isJoining(): boolean {\n    return this.state === CHANNEL_STATES.joining\n  }\n\n  /** @internal */\n  _isLeaving(): boolean {\n    return this.state === CHANNEL_STATES.leaving\n  }\n\n  /** @internal */\n  _replyEventName(ref: string): string {\n    return `chan_reply_${ref}`\n  }\n\n  /** @internal */\n  _on(type: string, filter: { [key: string]: any }, callback: Function) {\n    const typeLower = type.toLocaleLowerCase()\n\n    const binding = {\n      type: typeLower,\n      filter: filter,\n      callback: callback,\n    }\n\n    if (this.bindings[typeLower]) {\n      this.bindings[typeLower].push(binding)\n    } else {\n      this.bindings[typeLower] = [binding]\n    }\n\n    return this\n  }\n\n  /** @internal */\n  _off(type: string, filter: { [key: string]: any }) {\n    const typeLower = type.toLocaleLowerCase()\n\n    this.bindings[typeLower] = this.bindings[typeLower].filter((bind) =\u003e {\n      return !(\n        bind.type?.toLocaleLowerCase() === typeLower \u0026\u0026\n        RealtimeChannel.isEqual(bind.filter, filter)\n      )\n    })\n    return this\n  }\n\n  /** @internal */\n  private static isEqual(\n    obj1: { [key: string]: string },\n    obj2: { [key: string]: string }\n  ) {\n    if (Object.keys(obj1).length !== Object.keys(obj2).length) {\n      return false\n    }\n\n    for (const k in obj1) {\n      if (obj1[k] !== obj2[k]) {\n        return false\n      }\n    }\n\n    return true\n  }\n\n  /** @internal */\n  private _rejoinUntilConnected() {\n    this.rejoinTimer.scheduleTimeout()\n    if (this.socket.isConnected()) {\n      this._rejoin()\n    }\n  }\n\n  /**\n   * Registers a callback that will be executed when the channel closes.\n   *\n   * @internal\n   */\n  private _onClose(callback: Function) {\n    this._on(CHANNEL_EVENTS.close, {}, callback)\n  }\n\n  /**\n   * Registers a callback that will be executed when the channel encounteres an error.\n   *\n   * @internal\n   */\n  private _onError(callback: Function) {\n    this._on(CHANNEL_EVENTS.error, {}, (reason: string) =\u003e callback(reason))\n  }\n\n  /**\n   * Returns `true` if the socket is connected and the channel has been joined.\n   *\n   * @internal\n   */\n  private _canPush(): boolean {\n    return this.socket.isConnected() \u0026\u0026 this._isJoined()\n  }\n\n  /** @internal */\n  private _rejoin(timeout = this.timeout): void {\n    if (this._isLeaving()) {\n      return\n    }\n    this.socket._leaveOpenTopic(this.topic)\n    this.state = CHANNEL_STATES.joining\n    this.joinPush.resend(timeout)\n  }\n\n  /** @internal */\n  private _getPayloadRecords(payload: any) {\n    const records = {\n      new: {},\n      old: {},\n    }\n\n    if (payload.type === 'INSERT' || payload.type === 'UPDATE') {\n      records.new = Transformers.convertChangeData(\n        payload.columns,\n        payload.record\n      )\n    }\n\n    if (payload.type === 'UPDATE' || payload.type === 'DELETE') {\n      records.old = Transformers.convertChangeData(\n        payload.columns,\n        payload.old_record\n      )\n    }\n\n    return records\n  }\n}\n","import type { WebSocket as WSWebSocket } from 'ws'\n\nimport {\n  CHANNEL_EVENTS,\n  CONNECTION_STATE,\n  DEFAULT_HEADERS,\n  DEFAULT_TIMEOUT,\n  SOCKET_STATES,\n  TRANSPORTS,\n  VSN,\n  WS_CLOSE_NORMAL,\n} from './lib/constants'\nimport Serializer from './lib/serializer'\nimport Timer from './lib/timer'\n\nimport { httpEndpointURL } from './lib/transformers'\nimport RealtimeChannel from './RealtimeChannel'\nimport type { RealtimeChannelOptions } from './RealtimeChannel'\n\ntype Fetch = typeof fetch\n\nexport type Channel = {\n  name: string\n  inserted_at: string\n  updated_at: string\n  id: number\n}\n\nexport type RealtimeClientOptions = {\n  transport?: WebSocketLikeConstructor\n  timeout?: number\n  heartbeatIntervalMs?: number\n  logger?: Function\n  encode?: Function\n  decode?: Function\n  reconnectAfterMs?: Function\n  headers?: { [key: string]: string }\n  params?: { [key: string]: any }\n  log_level?: 'info' | 'debug' | 'warn' | 'error'\n  fetch?: Fetch\n}\n\nexport type RealtimeMessage = {\n  topic: string\n  event: string\n  payload: any\n  ref: string\n  join_ref?: string\n}\n\nexport type RealtimeRemoveChannelResponse = 'ok' | 'timed out' | 'error'\n\nconst noop = () =\u003e {}\n\ninterface WebSocketLikeConstructor {\n  new (\n    address: string | URL,\n    _ignored?: any,\n    options?: { headers: Object | undefined }\n  ): WebSocketLike\n}\n\ntype WebSocketLike = WebSocket | WSWebSocket | WSWebSocketDummy\n\ninterface WebSocketLikeError {\n  error: any\n  message: string\n  type: string\n}\n\nconst NATIVE_WEBSOCKET_AVAILABLE = typeof WebSocket !== 'undefined'\n\nexport default class RealtimeClient {\n  accessToken: string | null = null\n  apiKey: string | null = null\n  channels: RealtimeChannel[] = []\n  endPoint: string = ''\n  httpEndpoint: string = ''\n  headers?: { [key: string]: string } = DEFAULT_HEADERS\n  params?: { [key: string]: string } = {}\n  timeout: number = DEFAULT_TIMEOUT\n  transport: WebSocketLikeConstructor | null\n  heartbeatIntervalMs: number = 30000\n  heartbeatTimer: ReturnType\u003ctypeof setInterval\u003e | undefined = undefined\n  pendingHeartbeatRef: string | null = null\n  ref: number = 0\n  reconnectTimer: Timer\n  logger: Function = noop\n  encode: Function\n  decode: Function\n  reconnectAfterMs: Function\n  conn: WebSocketLike | null = null\n  sendBuffer: Function[] = []\n  serializer: Serializer = new Serializer()\n  stateChangeCallbacks: {\n    open: Function[]\n    close: Function[]\n    error: Function[]\n    message: Function[]\n  } = {\n    open: [],\n    close: [],\n    error: [],\n    message: [],\n  }\n  fetch: Fetch\n\n  /**\n   * Initializes the Socket.\n   *\n   * @param endPoint The string WebSocket endpoint, ie, \"ws://example.com/socket\", \"wss://example.com\", \"/socket\" (inherited host \u0026 protocol)\n   * @param httpEndpoint The string HTTP endpoint, ie, \"https://example.com\", \"/\" (inherited host \u0026 protocol)\n   * @param options.transport The Websocket Transport, for example WebSocket.\n   * @param options.timeout The default timeout in milliseconds to trigger push timeouts.\n   * @param options.params The optional params to pass when connecting.\n   * @param options.headers The optional headers to pass when connecting.\n   * @param options.heartbeatIntervalMs The millisec interval to send a heartbeat message.\n   * @param options.logger The optional function for specialized logging, ie: logger: (kind, msg, data) =\u003e { console.log(`${kind}: ${msg}`, data) }\n   * @param options.encode The function to encode outgoing messages. Defaults to JSON: (payload, callback) =\u003e callback(JSON.stringify(payload))\n   * @param options.decode The function to decode incoming messages. Defaults to Serializer's decode.\n   * @param options.reconnectAfterMs he optional function that returns the millsec reconnect interval. Defaults to stepped backoff off.\n   */\n  constructor(endPoint: string, options?: RealtimeClientOptions) {\n    this.endPoint = `${endPoint}/${TRANSPORTS.websocket}`\n    this.httpEndpoint = httpEndpointURL(endPoint)\n    if (options?.transport) {\n      this.transport = options.transport\n    } else {\n      this.transport = null\n    }\n    if (options?.params) this.params = options.params\n    if (options?.headers) this.headers = { ...this.headers, ...options.headers }\n    if (options?.timeout) this.timeout = options.timeout\n    if (options?.logger) this.logger = options.logger\n    if (options?.heartbeatIntervalMs)\n      this.heartbeatIntervalMs = options.heartbeatIntervalMs\n\n    const accessToken = options?.params?.apikey\n    if (accessToken) {\n      this.accessToken = accessToken\n      this.apiKey = accessToken\n    }\n\n    this.reconnectAfterMs = options?.reconnectAfterMs\n      ? options.reconnectAfterMs\n      : (tries: number) =\u003e {\n          return [1000, 2000, 5000, 10000][tries - 1] || 10000\n        }\n    this.encode = options?.encode\n      ? options.encode\n      : (payload: JSON, callback: Function) =\u003e {\n          return callback(JSON.stringify(payload))\n        }\n    this.decode = options?.decode\n      ? options.decode\n      : this.serializer.decode.bind(this.serializer)\n    this.reconnectTimer = new Timer(async () =\u003e {\n      this.disconnect()\n      this.connect()\n    }, this.reconnectAfterMs)\n\n    this.fetch = this._resolveFetch(options?.fetch)\n  }\n\n  /**\n   * Connects the socket, unless already connected.\n   */\n  connect(): void {\n    if (this.conn) {\n      return\n    }\n\n    if (this.transport) {\n      this.conn = new this.transport(this._endPointURL(), undefined, {\n        headers: this.headers,\n      })\n      return\n    }\n\n    if (NATIVE_WEBSOCKET_AVAILABLE) {\n      this.conn = new WebSocket(this._endPointURL())\n      this.setupConnection()\n      return\n    }\n\n    this.conn = new WSWebSocketDummy(this._endPointURL(), undefined, {\n      close: () =\u003e {\n        this.conn = null\n      },\n    })\n\n    import('ws').then(({ default: WS }) =\u003e {\n      this.conn = new WS(this._endPointURL(), undefined, {\n        headers: this.headers,\n      })\n      this.setupConnection()\n    })\n  }\n\n  /**\n   * Disconnects the socket.\n   *\n   * @param code A numeric status code to send on disconnect.\n   * @param reason A custom reason for the disconnect.\n   */\n  disconnect(code?: number, reason?: string): void {\n    if (this.conn) {\n      this.conn.onclose = function () {} // noop\n      if (code) {\n        this.conn.close(code, reason ?? '')\n      } else {\n        this.conn.close()\n      }\n      this.conn = null\n      // remove open handles\n      this.heartbeatTimer \u0026\u0026 clearInterval(this.heartbeatTimer)\n      this.reconnectTimer.reset()\n    }\n  }\n\n  /**\n   * Returns all created channels\n   */\n  getChannels(): RealtimeChannel[] {\n    return this.channels\n  }\n\n  /**\n   * Unsubscribes and removes a single channel\n   * @param channel A RealtimeChannel instance\n   */\n  async removeChannel(\n    channel: RealtimeChannel\n  ): Promise\u003cRealtimeRemoveChannelResponse\u003e {\n    const status = await channel.unsubscribe()\n    if (this.channels.length === 0) {\n      this.disconnect()\n    }\n    return status\n  }\n\n  /**\n   * Unsubscribes and removes all channels\n   */\n  async removeAllChannels(): Promise\u003cRealtimeRemoveChannelResponse[]\u003e {\n    const values_1 = await Promise.all(\n      this.channels.map((channel) =\u003e channel.unsubscribe())\n    )\n    this.disconnect()\n    return values_1\n  }\n\n  /**\n   * Logs the message.\n   *\n   * For customized logging, `this.logger` can be overridden.\n   */\n  log(kind: string, msg: string, data?: any) {\n    this.logger(kind, msg, data)\n  }\n\n  /**\n   * Returns the current state of the socket.\n   */\n  connectionState(): CONNECTION_STATE {\n    switch (this.conn \u0026\u0026 this.conn.readyState) {\n      case SOCKET_STATES.connecting:\n        return CONNECTION_STATE.Connecting\n      case SOCKET_STATES.open:\n        return CONNECTION_STATE.Open\n      case SOCKET_STATES.closing:\n        return CONNECTION_STATE.Closing\n      default:\n        return CONNECTION_STATE.Closed\n    }\n  }\n\n  /**\n   * Returns `true` is the connection is open.\n   */\n  isConnected(): boolean {\n    return this.connectionState() === CONNECTION_STATE.Open\n  }\n\n  channel(\n    topic: string,\n    params: RealtimeChannelOptions = { config: {} }\n  ): RealtimeChannel {\n    const chan = new RealtimeChannel(`realtime:${topic}`, params, this)\n    this.channels.push(chan)\n    return chan\n  }\n\n  /**\n   * Push out a message if the socket is connected.\n   *\n   * If the socket is not connected, the message gets enqueued within a local buffer, and sent out when a connection is next established.\n   */\n  push(data: RealtimeMessage): void {\n    const { topic, event, payload, ref } = data\n    const callback = () =\u003e {\n      this.encode(data, (result: any) =\u003e {\n        this.conn?.send(result)\n      })\n    }\n    this.log('push', `${topic} ${event} (${ref})`, payload)\n    if (this.isConnected()) {\n      callback()\n    } else {\n      this.sendBuffer.push(callback)\n    }\n  }\n\n  /**\n   * Sets the JWT access token used for channel subscription authorization and Realtime RLS.\n   *\n   * @param token A JWT string.\n   */\n  setAuth(token: string | null): void {\n    this.accessToken = token\n\n    this.channels.forEach((channel) =\u003e {\n      token \u0026\u0026 channel.updateJoinPayload({ access_token: token })\n\n      if (channel.joinedOnce \u0026\u0026 channel._isJoined()) {\n        channel._push(CHANNEL_EVENTS.access_token, { access_token: token })\n      }\n    })\n  }\n\n  /**\n   * Use either custom fetch, if provided, or default fetch to make HTTP requests\n   *\n   * @internal\n   */\n  _resolveFetch = (customFetch?: Fetch): Fetch =\u003e {\n    let _fetch: Fetch\n    if (customFetch) {\n      _fetch = customFetch\n    } else if (typeof fetch === 'undefined') {\n      _fetch = (...args) =\u003e\n        import('@supabase/node-fetch' as any).then(({ default: fetch }) =\u003e\n          fetch(...args)\n        )\n    } else {\n      _fetch = fetch\n    }\n    return (...args) =\u003e _fetch(...args)\n  }\n\n  /**\n   * Return the next message ref, accounting for overflows\n   *\n   * @internal\n   */\n  _makeRef(): string {\n    let newRef = this.ref + 1\n    if (newRef === this.ref) {\n      this.ref = 0\n    } else {\n      this.ref = newRef\n    }\n\n    return this.ref.toString()\n  }\n\n  /**\n   * Unsubscribe from channels with the specified topic.\n   *\n   * @internal\n   */\n  _leaveOpenTopic(topic: string): void {\n    let dupChannel = this.channels.find(\n      (c) =\u003e c.topic === topic \u0026\u0026 (c._isJoined() || c._isJoining())\n    )\n    if (dupChannel) {\n      this.log('transport', `leaving duplicate topic \"${topic}\"`)\n      dupChannel.unsubscribe()\n    }\n  }\n\n  /**\n   * Removes a subscription from the socket.\n   *\n   * @param channel An open subscription.\n   *\n   * @internal\n   */\n  _remove(channel: RealtimeChannel) {\n    this.channels = this.channels.filter(\n      (c: RealtimeChannel) =\u003e c._joinRef() !== channel._joinRef()\n    )\n  }\n\n  /**\n   * Sets up connection handlers.\n   *\n   * @internal\n   */\n  private setupConnection(): void {\n    if (this.conn) {\n      this.conn.binaryType = 'arraybuffer'\n      this.conn.onopen = () =\u003e this._onConnOpen()\n      this.conn.onerror = (error: WebSocketLikeError) =\u003e\n        this._onConnError(error as WebSocketLikeError)\n      this.conn.onmessage = (event: any) =\u003e this._onConnMessage(event)\n      this.conn.onclose = (event: any) =\u003e this._onConnClose(event)\n    }\n  }\n\n  /**\n   * Returns the URL of the websocket.\n   *\n   * @internal\n   */\n  private _endPointURL(): string {\n    return this._appendParams(\n      this.endPoint,\n      Object.assign({}, this.params, { vsn: VSN })\n    )\n  }\n\n  /** @internal */\n  private _onConnMessage(rawMessage: { data: any }) {\n    this.decode(rawMessage.data, (msg: RealtimeMessage) =\u003e {\n      let { topic, event, payload, ref } = msg\n\n      if (\n        (ref \u0026\u0026 ref === this.pendingHeartbeatRef) ||\n        event === payload?.type\n      ) {\n        this.pendingHeartbeatRef = null\n      }\n\n      this.log(\n        'receive',\n        `${payload.status || ''} ${topic} ${event} ${\n          (ref \u0026\u0026 '(' + ref + ')') || ''\n        }`,\n        payload\n      )\n      this.channels\n        .filter((channel: RealtimeChannel) =\u003e channel._isMember(topic))\n        .forEach((channel: RealtimeChannel) =\u003e\n          channel._trigger(event, payload, ref)\n        )\n      this.stateChangeCallbacks.message.forEach((callback) =\u003e callback(msg))\n    })\n  }\n\n  /** @internal */\n  private _onConnOpen() {\n    this.log('transport', `connected to ${this._endPointURL()}`)\n    this._flushSendBuffer()\n    this.reconnectTimer.reset()\n    this.heartbeatTimer \u0026\u0026 clearInterval(this.heartbeatTimer)\n    this.heartbeatTimer = setInterval(\n      () =\u003e this._sendHeartbeat(),\n      this.heartbeatIntervalMs\n    )\n    this.stateChangeCallbacks.open.forEach((callback) =\u003e callback())!\n  }\n\n  /** @internal */\n  private _onConnClose(event: any) {\n    this.log('transport', 'close', event)\n    this._triggerChanError()\n    this.heartbeatTimer \u0026\u0026 clearInterval(this.heartbeatTimer)\n    this.reconnectTimer.scheduleTimeout()\n    this.stateChangeCallbacks.close.forEach((callback) =\u003e callback(event))\n  }\n\n  /** @internal */\n  private _onConnError(error: WebSocketLikeError) {\n    this.log('transport', error.message)\n    this._triggerChanError()\n    this.stateChangeCallbacks.error.forEach((callback) =\u003e callback(error))\n  }\n\n  /** @internal */\n  private _triggerChanError() {\n    this.channels.forEach((channel: RealtimeChannel) =\u003e\n      channel._trigger(CHANNEL_EVENTS.error)\n    )\n  }\n\n  /** @internal */\n  private _appendParams(\n    url: string,\n    params: { [key: string]: string }\n  ): string {\n    if (Object.keys(params).length === 0) {\n      return url\n    }\n    const prefix = url.match(/\\?/) ? '\u0026' : '?'\n    const query = new URLSearchParams(params)\n\n    return `${url}${prefix}${query}`\n  }\n\n  /** @internal */\n  private _flushSendBuffer() {\n    if (this.isConnected() \u0026\u0026 this.sendBuffer.length \u003e 0) {\n      this.sendBuffer.forEach((callback) =\u003e callback())\n      this.sendBuffer = []\n    }\n  }\n  /** @internal */\n  private _sendHeartbeat() {\n    if (!this.isConnected()) {\n      return\n    }\n    if (this.pendingHeartbeatRef) {\n      this.pendingHeartbeatRef = null\n      this.log(\n        'transport',\n        'heartbeat timeout. Attempting to re-establish connection'\n      )\n      this.conn?.close(WS_CLOSE_NORMAL, 'hearbeat timeout')\n      return\n    }\n    this.pendingHeartbeatRef = this._makeRef()\n    this.push({\n      topic: 'phoenix',\n      event: 'heartbeat',\n      payload: {},\n      ref: this.pendingHeartbeatRef,\n    })\n    this.setAuth(this.accessToken)\n  }\n}\n\nclass WSWebSocketDummy {\n  binaryType: string = 'arraybuffer'\n  close: Function\n  onclose: Function = () =\u003e {}\n  onerror: Function = () =\u003e {}\n  onmessage: Function = () =\u003e {}\n  onopen: Function = () =\u003e {}\n  readyState: number = SOCKET_STATES.connecting\n  send: Function = () =\u003e {}\n  url: string | URL | null = null\n\n  constructor(\n    address: string,\n    _protocols: undefined,\n    options: { close: Function }\n  ) {\n    this.url = address\n    this.close = options.close\n  }\n}\n"],"version":3}
