{"mappings":"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","names":["WebSocketFactory","gt","gl","_a","_process","processVersions","versionString","nodeVersion","env","errorMessage","websocket_factory_default","version","DEFAULT_VERSION","version","VSN_1_0_0","VSN_2_0_0","DEFAULT_VSN","DEFAULT_TIMEOUT","MAX_PUSH_BUFFER_SIZE","CHANNEL_STATES","CHANNEL_EVENTS","CONNECTION_STATE","Serializer","allowedMetadataKeys","msg","callback","payload","message","_a","userPayload","_b","encodedUserPayload","encodingType","encodedPayload","topic","ref","joinRef","userEvent","rest","metadata","metaLength","header","view","offset","char","combined","rawPayload","result","jsonPayload","join_ref","event","buffer","kind","decoder","topicSize","userEventSize","metadataSize","payloadEncoding","parsedPayload","data","obj","keys","key","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","lastIdx","closeBrace","arr","valTrim","val","httpEndpointURL","socketUrl","wsUrl","Presence","PresenceAdapter","_PresenceAdapter","channel","opts","phoenixOptions","phoenixPresenceOptions","key","currentPresence","newPresence","onJoinPayload","leftPresence","onLeavePayload","state","cloneState","newState","presences","transformState","currentPresences","parseCurrentPresences","newPresences","leftPresences","presence","REALTIME_PRESENCE_LISTEN_EVENTS","RealtimePresence","channel","opts","PresenceAdapter","normalizeChannelError","reason","obj","detail","ChannelAdapter","socket","topic","params","phoenixParams","phoenixChannelParams","state","event","callback","refNumber","timeout","payload","push","MAX_PUSH_BUFFER_SIZE","removedPush","oldPayload","CHANNEL_STATES","filterBindings","options","REALTIME_POSTGRES_CHANGES_LISTEN_EVENT","REALTIME_LISTEN_TYPES","REALTIME_SUBSCRIBE_STATES","REALTIME_CHANNEL_STATES","CHANNEL_STATES","RealtimeChannel","_RealtimeChannel","state","topic","params","socket","ChannelAdapter","RealtimePresence","httpEndpointURL","_b","_a","callback","timeout","broadcast","presence","isPrivate","postgres_changes","r","presence_enabled","_c","accessTokenPayload","config","reason","normalizeChannelError","error","message","clientPostgresBindings","bindingsLen","newPostgresBindings","i","clientPostgresBinding","event","schema","table","filter","serverPostgresFilter","payload","opts","type","stateCheck","typeCheck","headers","options","response","errorMessage","errorBody","args","endpoint_payload","resolve","push","url","controller","id","typeLower","ref","binding","bind","bindId","bindEvent","_d","_f","_e","_g","close","leave","join","CHANNEL_EVENTS","postgresChanges","commit_timestamp","errors","other","kind","serverValue","clientValue","records","convertChangeData","Socket","SocketAdapter","endPoint","options","Socket","callback","code","reason","timeout","resolve","data","kind","msg","CONNECTION_STATE","CONNECTION_TIMEOUTS","RECONNECT_INTERVALS","DEFAULT_RECONNECT_FALLBACK","createMemorySessionStorage","store","key","index","_a","value","resolveSessionStorage","WORKER_SCRIPT","RealtimeClient","endPoint","options","Serializer","customFetch","args","socketAdapterOptions","SocketAdapter","httpEndpointURL","error","errorMessage","code","reason","channel","status","promises","result","kind","msg","data","CONNECTION_STATE","topic","params","realtimeTopic","exists","c","chan","RealtimeChannel","token","callback","tokenToSend","isManualToken","e","payload","DEFAULT_VERSION","CHANNEL_EVENTS","context","message","heartbeatCallback","latency","objectUrl","event","url","result_url","blob","_b","_c","DEFAULT_TIMEOUT","_d","_e","_f","_g","websocket_factory_default","_h","_j","tries","defaultEncode","defaultDecode","vsn","_k","DEFAULT_VSN","VSN_1_0_0","VSN_2_0_0","_l","_m"],"sources":["../esm/npm/@supabase/realtime-js@2.105.4/node_modules/@supabase/realtime-js/src/lib/websocket-factory.ts","../esm/npm/@supabase/realtime-js@2.105.4/node_modules/@supabase/realtime-js/src/lib/version.ts","../esm/npm/@supabase/realtime-js@2.105.4/node_modules/@supabase/realtime-js/src/lib/constants.ts","../esm/npm/@supabase/realtime-js@2.105.4/node_modules/@supabase/realtime-js/src/lib/serializer.ts","../esm/npm/@supabase/realtime-js@2.105.4/node_modules/@supabase/realtime-js/src/lib/transformers.ts","../esm/npm/@supabase/realtime-js@2.105.4/node_modules/@supabase/realtime-js/src/phoenix/presenceAdapter.ts","../esm/npm/@supabase/realtime-js@2.105.4/node_modules/@supabase/realtime-js/src/RealtimePresence.ts","../esm/npm/@supabase/realtime-js@2.105.4/node_modules/@supabase/realtime-js/src/lib/normalizeChannelError.ts","../esm/npm/@supabase/realtime-js@2.105.4/node_modules/@supabase/realtime-js/src/phoenix/channelAdapter.ts","../esm/npm/@supabase/realtime-js@2.105.4/node_modules/@supabase/realtime-js/src/RealtimeChannel.ts","../esm/npm/@supabase/realtime-js@2.105.4/node_modules/@supabase/realtime-js/src/phoenix/socketAdapter.ts","../esm/npm/@supabase/realtime-js@2.105.4/node_modules/@supabase/realtime-js/src/RealtimeClient.ts"],"sourcesContent":["export interface WebSocketLike {\n  readonly CONNECTING: number\n  readonly OPEN: number\n  readonly CLOSING: number\n  readonly CLOSED: number\n  readonly readyState: number\n  readonly url: string\n  readonly protocol: string\n\n  /**\n   * Closes the socket, optionally providing a close code and reason.\n   */\n  close(code?: number, reason?: string): void\n  /**\n   * Sends data through the socket using the underlying implementation.\n   */\n  send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void\n\n  onopen: ((this: any, ev: Event) =\u003e any) | null\n  onmessage: ((this: any, ev: MessageEvent) =\u003e any) | null\n  onclose: ((this: any, ev: CloseEvent) =\u003e any) | null\n  onerror: ((this: any, ev: Event) =\u003e any) | null\n\n  /**\n   * Registers an event listener on the socket (compatible with browser WebSocket API).\n   */\n  addEventListener(type: string, listener: EventListener): void\n  /**\n   * Removes a previously registered event listener.\n   */\n  removeEventListener(type: string, listener: EventListener): void\n\n  // Add additional properties that may exist on WebSocket implementations\n  binaryType?: string\n  bufferedAmount?: number\n  extensions?: string\n  dispatchEvent?: (event: Event) =\u003e boolean\n}\n\nexport interface WebSocketEnvironment {\n  type: 'native' | 'ws' | 'cloudflare' | 'unsupported'\n  /** WebSocket constructor for this environment, if available. */\n  wsConstructor?: typeof WebSocket\n  error?: string\n  workaround?: string\n}\n\n/**\n * Extended globalThis with optional runtime-specific properties\n * that may or may not exist depending on the environment.\n */\ninterface RuntimeGlobals {\n  WebSocket?: { new (url: string, protocols?: string | string[]): WebSocketLike }\n  WebSocketPair?: unknown\n  EdgeRuntime?: unknown\n}\n\n/**\n * Utilities for creating WebSocket instances across runtimes.\n */\nexport class WebSocketFactory {\n  /**\n   * Static-only utility – prevent instantiation.\n   */\n  private constructor() {}\n  private static detectEnvironment(): WebSocketEnvironment {\n    if (typeof WebSocket !== 'undefined') {\n      return { type: 'native', wsConstructor: WebSocket }\n    }\n\n    const gt = globalThis as typeof globalThis \u0026 RuntimeGlobals\n    if (typeof globalThis !== 'undefined' \u0026\u0026 typeof gt.WebSocket !== 'undefined') {\n      return { type: 'native', wsConstructor: gt.WebSocket as typeof WebSocket }\n    }\n\n    const gl =\n      typeof global !== 'undefined' ? (global as typeof global \u0026 RuntimeGlobals) : undefined\n    if (gl \u0026\u0026 typeof gl.WebSocket !== 'undefined') {\n      return { type: 'native', wsConstructor: gl.WebSocket as typeof WebSocket }\n    }\n\n    if (\n      typeof globalThis !== 'undefined' \u0026\u0026\n      typeof gt.WebSocketPair !== 'undefined' \u0026\u0026\n      typeof globalThis.WebSocket === 'undefined'\n    ) {\n      return {\n        type: 'cloudflare',\n        error:\n          'Cloudflare Workers detected. WebSocket clients are not supported in Cloudflare Workers.',\n        workaround:\n          'Use Cloudflare Workers WebSocket API for server-side WebSocket handling, or deploy to a different runtime.',\n      }\n    }\n\n    if (\n      (typeof globalThis !== 'undefined' \u0026\u0026 gt.EdgeRuntime) ||\n      (typeof navigator !== 'undefined' \u0026\u0026 navigator.userAgent?.includes('Vercel-Edge'))\n    ) {\n      return {\n        type: 'unsupported',\n        error:\n          'Edge runtime detected (Vercel Edge/Netlify Edge). WebSockets are not supported in edge functions.',\n        workaround:\n          'Use serverless functions or a different deployment target for WebSocket functionality.',\n      }\n    }\n\n    // Use dynamic property access to avoid Next.js Edge Runtime static analysis warnings\n    const _process = (globalThis as Record\u003cstring, unknown\u003e)['process'] as\n      | { versions?: { node?: string } }\n      | undefined\n    if (_process) {\n      const processVersions = _process['versions']\n      if (processVersions \u0026\u0026 processVersions['node']) {\n        // Remove 'v' prefix if present and parse the major version\n        const versionString = processVersions['node']\n        const nodeVersion = parseInt(versionString.replace(/^v/, '').split('.')[0])\n\n        // Node.js 22+ should have native WebSocket\n        if (nodeVersion \u003e= 22) {\n          // Check if native WebSocket is available (should be in Node.js 22+)\n          if (typeof globalThis.WebSocket !== 'undefined') {\n            return { type: 'native', wsConstructor: globalThis.WebSocket }\n          }\n          // If not available, user needs to provide it\n          return {\n            type: 'unsupported',\n            error: `Node.js ${nodeVersion} detected but native WebSocket not found.`,\n            workaround: 'Provide a WebSocket implementation via the transport option.',\n          }\n        }\n\n        // Node.js \u003c 22 doesn't have native WebSocket\n        return {\n          type: 'unsupported',\n          error: `Node.js ${nodeVersion} detected without native WebSocket support.`,\n          workaround:\n            'For Node.js \u003c 22, install \"ws\" package and provide it via the transport option:\\n' +\n            'import ws from \"ws\"\\n' +\n            'new RealtimeClient(url, { transport: ws })',\n        }\n      }\n    }\n\n    return {\n      type: 'unsupported',\n      error: 'Unknown JavaScript runtime without WebSocket support.',\n      workaround:\n        \"Ensure you're running in a supported environment (browser, Node.js, Deno) or provide a custom WebSocket implementation.\",\n    }\n  }\n\n  /**\n   * Returns the best available WebSocket constructor for the current runtime.\n   *\n   * @category Realtime\n   *\n   * @example Example with error handling\n   * ```ts\n   * try {\n   *   const WS = WebSocketFactory.getWebSocketConstructor()\n   *   const socket = new WS('wss://example.com/socket')\n   * } catch (error) {\n   *   console.error('WebSocket not available in this environment.', error)\n   * }\n   * ```\n   */\n  public static getWebSocketConstructor(): typeof WebSocket {\n    const env = this.detectEnvironment()\n    if (env.wsConstructor) {\n      return env.wsConstructor\n    }\n    let errorMessage = env.error || 'WebSocket not supported in this environment.'\n    if (env.workaround) {\n      errorMessage += `\\n\\nSuggested solution: ${env.workaround}`\n    }\n    throw new Error(errorMessage)\n  }\n\n  /**\n   * Detects whether the runtime can establish WebSocket connections.\n   *\n   * @category Realtime\n   *\n   * @example Example in a Node.js script\n   * ```ts\n   * if (!WebSocketFactory.isWebSocketSupported()) {\n   *   console.error('WebSockets are required for this script.')\n   *   process.exitCode = 1\n   * }\n   * ```\n   */\n  public static isWebSocketSupported(): boolean {\n    try {\n      const env = this.detectEnvironment()\n      return env.type === 'native' || env.type === 'ws'\n    } catch {\n      return false\n    }\n  }\n}\n\nexport default WebSocketFactory\n","// Generated automatically during releases by scripts/update-version-files.ts\n// This file provides runtime access to the package version for:\n// - HTTP request headers (e.g., X-Client-Info header for API requests)\n// - Debugging and support (identifying which version is running)\n// - Telemetry and logging (version reporting in errors/analytics)\n// - Ensuring build artifacts match the published package version\nexport const version = '2.105.4'\n","import { version } from './version'\nimport type {\n  SocketState,\n  ChannelState,\n  ChannelEvent as PhoenixChannelEvent,\n  Transport,\n  Vsn,\n} from '../phoenix/types'\n\nexport type { SocketState, ChannelState, Transport }\n\nexport const DEFAULT_VERSION = `realtime-js/${version}`\n\nexport const VSN_1_0_0: Vsn = '1.0.0'\nexport const VSN_2_0_0: Vsn = '2.0.0'\nexport const DEFAULT_VSN: Vsn = VSN_2_0_0\n\nexport const VERSION = version\n\nexport const DEFAULT_TIMEOUT = 10000\n\nexport const WS_CLOSE_NORMAL = 1000\nexport const MAX_PUSH_BUFFER_SIZE = 100\n\nexport const SOCKET_STATES = {\n  connecting: 0,\n  open: 1,\n  closing: 2,\n  closed: 3,\n} as const\n\nexport const CHANNEL_STATES = {\n  closed: 'closed',\n  errored: 'errored',\n  joined: 'joined',\n  joining: 'joining',\n  leaving: 'leaving',\n} as const\n\nexport type ChannelEvent = PhoenixChannelEvent | 'access_token'\n\nexport const 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} as const\n\nexport const TRANSPORTS = {\n  websocket: 'websocket',\n} as const\n\nexport type ConnectionState = 'connecting' | 'open' | 'closing' | 'closed' | (string \u0026 {})\n\nexport const CONNECTION_STATE = {\n  connecting: 'connecting',\n  open: 'open',\n  closing: 'closing',\n  closed: 'closed',\n} as const\n","// This file draws heavily from https://github.com/phoenixframework/phoenix/commit/cf098e9cf7a44ee6479d31d911a97d3c7430c6fe\n// License: https://github.com/phoenixframework/phoenix/blob/master/LICENSE.md\nexport type Msg\u003cT\u003e = {\n  join_ref?: string | null\n  ref?: string | null\n  topic: string\n  event: string\n  payload: T\n}\n\nexport default class Serializer {\n  HEADER_LENGTH = 1\n  USER_BROADCAST_PUSH_META_LENGTH = 6\n  KINDS = { userBroadcastPush: 3, userBroadcast: 4 }\n  BINARY_ENCODING = 0\n  JSON_ENCODING = 1\n  BROADCAST_EVENT = 'broadcast'\n\n  allowedMetadataKeys: string[] = []\n\n  constructor(allowedMetadataKeys?: string[] | null) {\n    this.allowedMetadataKeys = allowedMetadataKeys ?? []\n  }\n\n  encode(msg: Msg\u003c{ [key: string]: any }\u003e, callback: (result: ArrayBuffer | string) =\u003e any) {\n    if (\n      msg.event === this.BROADCAST_EVENT \u0026\u0026\n      !(msg.payload instanceof ArrayBuffer) \u0026\u0026\n      typeof msg.payload.event === 'string'\n    ) {\n      return callback(\n        this._binaryEncodeUserBroadcastPush(msg as Msg\u003c{ event: string } \u0026 { [key: string]: any }\u003e)\n      )\n    }\n\n    let payload = [msg.join_ref, msg.ref, msg.topic, msg.event, msg.payload]\n    return callback(JSON.stringify(payload))\n  }\n\n  private _binaryEncodeUserBroadcastPush(message: Msg\u003c{ event: string } \u0026 { [key: string]: any }\u003e) {\n    if (this._isArrayBuffer(message.payload?.payload)) {\n      return this._encodeBinaryUserBroadcastPush(message)\n    } else {\n      return this._encodeJsonUserBroadcastPush(message)\n    }\n  }\n\n  private _encodeBinaryUserBroadcastPush(message: Msg\u003c{ event: string } \u0026 { [key: string]: any }\u003e) {\n    const userPayload = message.payload?.payload ?? new ArrayBuffer(0)\n    return this._encodeUserBroadcastPush(message, this.BINARY_ENCODING, userPayload)\n  }\n\n  private _encodeJsonUserBroadcastPush(message: Msg\u003c{ event: string } \u0026 { [key: string]: any }\u003e) {\n    const userPayload = message.payload?.payload ?? {}\n    const encoder = new TextEncoder()\n    const encodedUserPayload = encoder.encode(JSON.stringify(userPayload)).buffer\n    return this._encodeUserBroadcastPush(message, this.JSON_ENCODING, encodedUserPayload)\n  }\n\n  private _encodeUserBroadcastPush(\n    message: Msg\u003c{ event: string } \u0026 { [key: string]: any }\u003e,\n    encodingType: number,\n    encodedPayload: ArrayBuffer\n  ) {\n    const topic = message.topic\n    const ref = message.ref ?? ''\n    const joinRef = message.join_ref ?? ''\n    const userEvent = message.payload.event\n\n    // Filter metadata based on allowed keys\n    const rest = this.allowedMetadataKeys\n      ? this._pick(message.payload, this.allowedMetadataKeys)\n      : {}\n\n    const metadata = Object.keys(rest).length === 0 ? '' : JSON.stringify(rest)\n\n    // Validate lengths don't exceed uint8 max value (255)\n    if (joinRef.length \u003e 255) {\n      throw new Error(`joinRef length ${joinRef.length} exceeds maximum of 255`)\n    }\n    if (ref.length \u003e 255) {\n      throw new Error(`ref length ${ref.length} exceeds maximum of 255`)\n    }\n    if (topic.length \u003e 255) {\n      throw new Error(`topic length ${topic.length} exceeds maximum of 255`)\n    }\n    if (userEvent.length \u003e 255) {\n      throw new Error(`userEvent length ${userEvent.length} exceeds maximum of 255`)\n    }\n    if (metadata.length \u003e 255) {\n      throw new Error(`metadata length ${metadata.length} exceeds maximum of 255`)\n    }\n\n    const metaLength =\n      this.USER_BROADCAST_PUSH_META_LENGTH +\n      joinRef.length +\n      ref.length +\n      topic.length +\n      userEvent.length +\n      metadata.length\n\n    const header = new ArrayBuffer(this.HEADER_LENGTH + metaLength)\n    let view = new DataView(header)\n    let offset = 0\n\n    view.setUint8(offset++, this.KINDS.userBroadcastPush) // kind\n    view.setUint8(offset++, joinRef.length)\n    view.setUint8(offset++, ref.length)\n    view.setUint8(offset++, topic.length)\n    view.setUint8(offset++, userEvent.length)\n    view.setUint8(offset++, metadata.length)\n    view.setUint8(offset++, encodingType)\n    Array.from(joinRef, (char) =\u003e view.setUint8(offset++, char.charCodeAt(0)))\n    Array.from(ref, (char) =\u003e view.setUint8(offset++, char.charCodeAt(0)))\n    Array.from(topic, (char) =\u003e view.setUint8(offset++, char.charCodeAt(0)))\n    Array.from(userEvent, (char) =\u003e view.setUint8(offset++, char.charCodeAt(0)))\n    Array.from(metadata, (char) =\u003e view.setUint8(offset++, char.charCodeAt(0)))\n\n    var combined = new Uint8Array(header.byteLength + encodedPayload.byteLength)\n    combined.set(new Uint8Array(header), 0)\n    combined.set(new Uint8Array(encodedPayload), header.byteLength)\n\n    return combined.buffer\n  }\n\n  decode(rawPayload: ArrayBuffer | string, callback: Function) {\n    if (this._isArrayBuffer(rawPayload)) {\n      let result = this._binaryDecode(rawPayload as ArrayBuffer)\n      return callback(result)\n    }\n\n    if (typeof rawPayload === 'string') {\n      const jsonPayload = JSON.parse(rawPayload)\n      const [join_ref, ref, topic, event, payload] = jsonPayload\n      return callback({ join_ref, ref, topic, event, payload })\n    }\n\n    return callback({})\n  }\n\n  private _binaryDecode(buffer: ArrayBuffer) {\n    const view = new DataView(buffer)\n    const kind = view.getUint8(0)\n    const decoder = new TextDecoder()\n    switch (kind) {\n      case this.KINDS.userBroadcast:\n        return this._decodeUserBroadcast(buffer, view, decoder)\n    }\n  }\n\n  private _decodeUserBroadcast(\n    buffer: ArrayBuffer,\n    view: DataView,\n    decoder: TextDecoder\n  ): {\n    join_ref: null\n    ref: null\n    topic: string\n    event: string\n    payload: { [key: string]: any }\n  } {\n    const topicSize = view.getUint8(1)\n    const userEventSize = view.getUint8(2)\n    const metadataSize = view.getUint8(3)\n    const payloadEncoding = view.getUint8(4)\n\n    let offset = this.HEADER_LENGTH + 4\n    const topic = decoder.decode(buffer.slice(offset, offset + topicSize))\n    offset = offset + topicSize\n    const userEvent = decoder.decode(buffer.slice(offset, offset + userEventSize))\n    offset = offset + userEventSize\n    const metadata = decoder.decode(buffer.slice(offset, offset + metadataSize))\n    offset = offset + metadataSize\n\n    const payload = buffer.slice(offset, buffer.byteLength)\n    const parsedPayload =\n      payloadEncoding === this.JSON_ENCODING ? JSON.parse(decoder.decode(payload)) : payload\n\n    const data: { [key: string]: any } = {\n      type: this.BROADCAST_EVENT,\n      event: userEvent,\n      payload: parsedPayload,\n    }\n\n    // Metadata is optional and always JSON encoded\n    if (metadataSize \u003e 0) {\n      data['meta'] = JSON.parse(metadata)\n    }\n\n    return { join_ref: null, ref: null, topic: topic, event: this.BROADCAST_EVENT, payload: data }\n  }\n\n  private _isArrayBuffer(buffer: any): boolean {\n    return buffer instanceof ArrayBuffer || buffer?.constructor?.name === 'ArrayBuffer'\n  }\n\n  private _pick(obj: Record\u003cstring, any\u003e | null | undefined, keys: string[]): Record\u003cstring, any\u003e {\n    if (!obj || typeof obj !== 'object') {\n      return {}\n    }\n    return Object.fromEntries(Object.entries(obj).filter(([key]) =\u003e keys.includes(key)))\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 | null,\n  options: { skipTypes?: string[] } = {}\n): Record =\u003e {\n  const skipTypes = options.skipTypes ?? []\n\n  if (!record) {\n    return {}\n  }\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 {\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  const wsUrl = new URL(socketUrl)\n\n  wsUrl.protocol = wsUrl.protocol.replace(/^ws/i, 'http')\n\n  wsUrl.pathname = wsUrl.pathname\n    .replace(/\\/+$/, '') // remove all trailing slashes\n    .replace(/\\/socket\\/websocket$/i, '') // remove the socket/websocket path\n    .replace(/\\/socket$/i, '') // remove the socket path\n    .replace(/\\/websocket$/i, '') // remove the websocket path\n\n  if (wsUrl.pathname === '' || wsUrl.pathname === '/') {\n    wsUrl.pathname = '/api/broadcast'\n  } else {\n    wsUrl.pathname = wsUrl.pathname + '/api/broadcast'\n  }\n\n  return wsUrl.href\n}\n","import { Presence } from '@supabase/phoenix'\nimport type { PresenceState, PresenceStates } from './types'\nimport type {\n  RealtimePresenceOptions,\n  RealtimePresenceState,\n  Presence as RealtimePresenceType,\n} from '../RealtimePresence'\nimport ChannelAdapter from './channelAdapter'\n\nexport default class PresenceAdapter {\n  private presence: Presence\n\n  constructor(channel: ChannelAdapter, opts?: RealtimePresenceOptions) {\n    const phoenixOptions = phoenixPresenceOptions(opts)\n    this.presence = new Presence(channel.getChannel(), phoenixOptions)\n\n    this.presence.onJoin((key, currentPresence, newPresence) =\u003e {\n      const onJoinPayload = PresenceAdapter.onJoinPayload(key, currentPresence, newPresence)\n      channel.getChannel().trigger('presence', onJoinPayload)\n    })\n\n    this.presence.onLeave((key, currentPresence, leftPresence) =\u003e {\n      const onLeavePayload = PresenceAdapter.onLeavePayload(key, currentPresence, leftPresence)\n      channel.getChannel().trigger('presence', onLeavePayload)\n    })\n\n    this.presence.onSync(() =\u003e {\n      channel.getChannel().trigger('presence', { event: 'sync' })\n    })\n  }\n\n  get state() {\n    return PresenceAdapter.transformState(this.presence.state)\n  }\n\n  /**\n   * @private\n   * Remove 'metas' key\n   * Change 'phx_ref' to 'presence_ref'\n   * Remove 'phx_ref' and 'phx_ref_prev'\n   *\n   * @example Transform state\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   */\n  static transformState(state: PresenceStates): RealtimePresenceState {\n    state = cloneState(state)\n\n    return Object.getOwnPropertyNames(state).reduce((newState, key) =\u003e {\n      const presences = state[key]\n      newState[key] = transformState(presences)\n\n      return newState\n    }, {} as RealtimePresenceState)\n  }\n\n  static onJoinPayload(key: string, currentPresence: PresenceState, newPresence: PresenceState) {\n    const currentPresences = parseCurrentPresences(currentPresence)\n    const newPresences = transformState(newPresence)\n\n    return {\n      event: 'join',\n      key,\n      currentPresences,\n      newPresences,\n    }\n  }\n\n  static onLeavePayload(key: string, currentPresence: PresenceState, leftPresence: PresenceState) {\n    const currentPresences = parseCurrentPresences(currentPresence)\n    const leftPresences = transformState(leftPresence)\n\n    return {\n      event: 'leave',\n      key,\n      currentPresences,\n      leftPresences,\n    }\n  }\n}\n\nfunction transformState(presences: PresenceState) {\n  return 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 RealtimePresenceType[]\n}\n\nfunction cloneState(state: PresenceStates): PresenceStates {\n  return JSON.parse(JSON.stringify(state))\n}\n\nfunction phoenixPresenceOptions(opts?: RealtimePresenceOptions) {\n  return opts?.events \u0026\u0026 { events: opts.events }\n}\n\nfunction parseCurrentPresences(currentPresences?: PresenceState) {\n  return currentPresences?.metas ? transformState(currentPresences) : []\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 RealtimeChannel from './RealtimeChannel'\nimport PresenceAdapter from './phoenix/presenceAdapter'\n\nexport type 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\nexport type RealtimePresenceOptions = {\n  events?: { state: string; diff: string }\n}\n\nexport default class RealtimePresence {\n  get state() {\n    return this.presenceAdapter.state\n  }\n\n  private presenceAdapter: PresenceAdapter\n\n  /**\n   * Creates a Presence helper that keeps the local presence state in sync with the server.\n   *\n   * @param channel - The realtime channel to bind to.\n   * @param opts - Optional custom event names, e.g. `{ events: { state: 'state', diff: 'diff' } }`.\n   *\n   * @category Realtime\n   *\n   * @example Example for a presence channel\n   * ```ts\n   * const presence = new RealtimePresence(channel)\n   *\n   * channel.on('presence', ({ event, key }) =\u003e {\n   *   console.log(`Presence ${event} on ${key}`)\n   * })\n   * ```\n   */\n  constructor(\n    public channel: RealtimeChannel,\n    opts?: RealtimePresenceOptions\n  ) {\n    this.presenceAdapter = new PresenceAdapter(this.channel.channelAdapter, opts)\n  }\n}\n","/**\n * Normalize the various shapes a channel error reason can take into a real `Error`.\n *\n * Transport-level channel errors arrive as a `CloseEvent`, a transport `Event`, an `Error`,\n * a string, or `undefined` depending on which path in the underlying socket fired. Server-reply\n * errors arrive as a payload object. This helper produces a consistent `Error` for every case\n * and preserves the original via `cause` so callers can still inspect the raw event.\n */\nexport function normalizeChannelError(reason: unknown): Error {\n  if (reason instanceof Error) {\n    return reason\n  }\n\n  if (typeof reason === 'string') {\n    return new Error(reason)\n  }\n\n  if (reason \u0026\u0026 typeof reason === 'object') {\n    const obj = reason as Record\u003cstring, unknown\u003e\n\n    if (typeof obj.code === 'number') {\n      const detail = typeof obj.reason === 'string' \u0026\u0026 obj.reason ? ` (${obj.reason})` : ''\n      return new Error(`socket closed: ${obj.code}${detail}`, { cause: reason })\n    }\n\n    return new Error('channel error: transport failure', { cause: reason })\n  }\n\n  return new Error('channel error: connection lost')\n}\n","import { Channel } from '@supabase/phoenix'\nimport { CHANNEL_STATES, MAX_PUSH_BUFFER_SIZE } from '../lib/constants'\nimport type { RealtimeChannelOptions } from '../RealtimeChannel'\nimport SocketAdapter from './socketAdapter'\nimport type {\n  ChannelBindingCallback,\n  ChannelOnMessage,\n  ChannelOnErrorCallback,\n  ChannelFilterBindings,\n  Params,\n  ChannelState,\n  Push,\n  Timer,\n} from './types'\n\nexport default class ChannelAdapter {\n  private channel: Channel\n  private socket: SocketAdapter\n\n  constructor(socket: SocketAdapter, topic: string, params: RealtimeChannelOptions) {\n    const phoenixParams = phoenixChannelParams(params)\n    this.channel = socket.getSocket().channel(topic, phoenixParams)\n    this.socket = socket\n  }\n\n  get state(): ChannelState {\n    return this.channel.state\n  }\n\n  set state(state: ChannelState) {\n    this.channel.state = state\n  }\n\n  get joinedOnce(): boolean {\n    return this.channel.joinedOnce\n  }\n\n  get joinPush(): Push {\n    return this.channel.joinPush\n  }\n\n  get rejoinTimer(): Timer {\n    return this.channel.rejoinTimer\n  }\n\n  on(event: string, callback: ChannelBindingCallback): number {\n    return this.channel.on(event, callback)\n  }\n\n  off(event: string, refNumber?: number) {\n    this.channel.off(event, refNumber)\n  }\n\n  subscribe(timeout?: number): Push {\n    return this.channel.join(timeout)\n  }\n\n  unsubscribe(timeout?: number): Push {\n    return this.channel.leave(timeout)\n  }\n\n  teardown() {\n    this.channel.teardown()\n  }\n\n  onClose(callback: ChannelBindingCallback) {\n    this.channel.onClose(callback)\n  }\n\n  onError(callback: ChannelOnErrorCallback): number {\n    return this.channel.onError(callback)\n  }\n\n  push(event: string, payload: { [key: string]: any }, timeout?: number): Push {\n    let push: Push\n\n    try {\n      push = this.channel.push(event, payload, timeout)\n    } catch (error) {\n      throw new Error(\n        `tried to push '${event}' to '${this.channel.topic}' before joining. Use channel.subscribe() before pushing events`\n      )\n    }\n\n    if (this.channel.pushBuffer.length \u003e MAX_PUSH_BUFFER_SIZE) {\n      const removedPush = this.channel.pushBuffer.shift()!\n      removedPush.cancelTimeout()\n      this.socket.log(\n        'channel',\n        `discarded push due to buffer overflow: ${removedPush.event}`,\n        removedPush.payload()\n      )\n    }\n    return push\n  }\n\n  updateJoinPayload(payload: Record\u003cstring, any\u003e) {\n    const oldPayload = this.channel.joinPush.payload()\n    this.channel.joinPush.payload = () =\u003e ({ ...oldPayload, ...payload })\n  }\n\n  canPush() {\n    return this.socket.isConnected() \u0026\u0026 this.state === CHANNEL_STATES.joined\n  }\n\n  isJoined() {\n    return this.state === CHANNEL_STATES.joined\n  }\n\n  isJoining() {\n    return this.state === CHANNEL_STATES.joining\n  }\n\n  isClosed() {\n    return this.state === CHANNEL_STATES.closed\n  }\n\n  isLeaving() {\n    return this.state === CHANNEL_STATES.leaving\n  }\n\n  updateFilterBindings(filterBindings: ChannelFilterBindings) {\n    this.channel.filterBindings = filterBindings\n  }\n\n  updatePayloadTransform(callback: ChannelOnMessage) {\n    this.channel.onMessage = callback\n  }\n\n  /**\n   * @internal\n   */\n  getChannel() {\n    return this.channel\n  }\n}\n\nfunction phoenixChannelParams(options: RealtimeChannelOptions): Params {\n  return {\n    config: {\n      ...{\n        broadcast: { ack: false, self: false },\n        presence: { key: '', enabled: false },\n        private: false,\n      },\n      ...options.config,\n    },\n  }\n}\n","import { CHANNEL_EVENTS, CHANNEL_STATES } from './lib/constants'\nimport type { ChannelState } from './lib/constants'\nimport type RealtimeClient from './RealtimeClient'\nimport RealtimePresence, { REALTIME_PRESENCE_LISTEN_EVENTS } from './RealtimePresence'\nimport type {\n  RealtimePresenceJoinPayload,\n  RealtimePresenceLeavePayload,\n  RealtimePresenceState,\n} from './RealtimePresence'\nimport * as Transformers from './lib/transformers'\nimport { httpEndpointURL } from './lib/transformers'\nimport { normalizeChannelError } from './lib/normalizeChannelError'\nimport ChannelAdapter from './phoenix/channelAdapter'\nimport { ChannelBindingCallback, ChannelOnErrorCallback } from './phoenix/types'\nimport type { Timer } from './phoenix/types'\n\ntype ReplayOption = {\n  since: number\n  limit?: number\n}\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     * replay option instructs server to replay broadcast messages\n     */\n    broadcast?: { self?: boolean; ack?: boolean; replay?: ReplayOption }\n    /**\n     * key option is used to track presence payload across clients\n     */\n    presence?: { key?: string; enabled?: boolean }\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 RealtimeChangesPayloadBase = {\n  schema: string\n  table: string\n}\n\ntype RealtimeBroadcastChangesPayloadBase = RealtimeChangesPayloadBase \u0026 {\n  id: string\n}\n\nexport type RealtimeBroadcastInsertPayload\u003cT extends { [key: string]: any }\u003e =\n  RealtimeBroadcastChangesPayloadBase \u0026 {\n    operation: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT}`\n    record: T\n    old_record: null\n  }\n\nexport type RealtimeBroadcastUpdatePayload\u003cT extends { [key: string]: any }\u003e =\n  RealtimeBroadcastChangesPayloadBase \u0026 {\n    operation: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE}`\n    record: T\n    old_record: T\n  }\n\nexport type RealtimeBroadcastDeletePayload\u003cT extends { [key: string]: any }\u003e =\n  RealtimeBroadcastChangesPayloadBase \u0026 {\n    operation: `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE}`\n    record: null\n    old_record: T\n  }\n\nexport type RealtimeBroadcastPayload\u003cT extends { [key: string]: any }\u003e =\n  | RealtimeBroadcastInsertPayload\u003cT\u003e\n  | RealtimeBroadcastUpdatePayload\u003cT\u003e\n  | RealtimeBroadcastDeletePayload\u003cT\u003e\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\u003cT extends `${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT}`\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' | (string \u0026 {})\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  POSTGRES_CHANGES = 'postgres_changes',\n  SYSTEM = 'system',\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\ntype PostgresChangesFilters = {\n  postgres_changes: {\n    id: string\n    event: string\n    schema?: string\n    table?: string\n    filter?: string\n  }[]\n}\n\ntype Binding = {\n  type: string\n  filter: { [key: string]: any }\n  callback: ChannelBindingCallback\n  ref: number\n  id?: string\n}\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: Record\u003cstring, Binding[]\u003e = {}\n  subTopic: string\n  broadcastEndpointURL: string\n  private: boolean\n  presence: RealtimePresence\n  /** @internal */\n  channelAdapter: ChannelAdapter\n\n  get state() {\n    return this.channelAdapter.state\n  }\n\n  set state(state: ChannelState) {\n    this.channelAdapter.state = state\n  }\n\n  get joinedOnce() {\n    return this.channelAdapter.joinedOnce\n  }\n\n  get timeout() {\n    return this.socket.timeout\n  }\n\n  get joinPush() {\n    return this.channelAdapter.joinPush\n  }\n\n  get rejoinTimer(): Timer {\n    return this.channelAdapter.rejoinTimer\n  }\n\n  /**\n   * Creates a channel that can broadcast messages, sync presence, and listen to Postgres changes.\n   *\n   * The topic determines which realtime stream you are subscribing to. Config options let you\n   * enable acknowledgement for broadcasts, presence tracking, or private channels.\n   *\n   * @category Realtime\n   *\n   * @example Using supabase-js (recommended)\n   * ```ts\n   * import { createClient } from '@supabase/supabase-js'\n   *\n   * const supabase = createClient('https://xyzcompany.supabase.co', 'your-publishable-key')\n   * const channel = supabase.channel('room1')\n   * channel\n   *   .on('broadcast', { event: 'cursor-pos' }, (payload) =\u003e console.log(payload))\n   *   .subscribe()\n   * ```\n   *\n   * @example Standalone import for bundle-sensitive environments\n   * ```ts\n   * import RealtimeClient from '@supabase/realtime-js'\n   *\n   * const client = new RealtimeClient('https://xyzcompany.supabase.co/realtime/v1', {\n   *   params: { apikey: 'your-publishable-key' },\n   * })\n   * const channel = new RealtimeChannel('realtime:public:messages', { config: {} }, client)\n   * ```\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: '', enabled: false },\n        private: false,\n      },\n      ...params.config,\n    }\n\n    this.channelAdapter = new ChannelAdapter(this.socket.socketAdapter, topic, this.params)\n    this.presence = new RealtimePresence(this)\n\n    this._onClose(() =\u003e {\n      this.socket._remove(this)\n    })\n\n    this._updateFilterTransform()\n\n    this.broadcastEndpointURL = httpEndpointURL(this.socket.socketAdapter.endPointURL())\n    this.private = this.params.config.private || false\n\n    if (!this.private \u0026\u0026 this.params.config?.broadcast?.replay) {\n      throw new Error(\n        `tried to use replay on public channel '${this.topic}'. It must be a private channel.`\n      )\n    }\n  }\n\n  /**\n   * Subscribe registers your client with the server\n   * @category Realtime\n   */\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    if (this.channelAdapter.isClosed()) {\n      const {\n        config: { broadcast, presence, private: isPrivate },\n      } = this.params\n\n      const postgres_changes = this.bindings.postgres_changes?.map((r) =\u003e r.filter) ?? []\n\n      const presence_enabled =\n        (!!this.bindings[REALTIME_LISTEN_TYPES.PRESENCE] \u0026\u0026\n          this.bindings[REALTIME_LISTEN_TYPES.PRESENCE].length \u003e 0) ||\n        this.params.config.presence?.enabled === true\n      const accessTokenPayload: { access_token?: string } = {}\n      const config = {\n        broadcast,\n        presence: { ...presence, enabled: presence_enabled },\n        postgres_changes,\n        private: isPrivate,\n      }\n\n      if (this.socket.accessTokenValue) {\n        accessTokenPayload.access_token = this.socket.accessTokenValue\n      }\n\n      this._onError((reason: unknown) =\u003e {\n        callback?.(REALTIME_SUBSCRIBE_STATES.CHANNEL_ERROR, normalizeChannelError(reason))\n      })\n\n      this._onClose(() =\u003e callback?.(REALTIME_SUBSCRIBE_STATES.CLOSED))\n\n      this.updateJoinPayload({ ...{ config }, ...accessTokenPayload })\n\n      this._updateFilterMessage()\n\n      this.channelAdapter\n        .subscribe(timeout)\n        .receive('ok', async ({ postgres_changes }: PostgresChangesFilters) =\u003e {\n          // Only refresh auth if using callback-based tokens\n          if (!this.socket._isManualToken()) {\n            this.socket.setAuth()\n          }\n          if (postgres_changes === undefined) {\n            callback?.(REALTIME_SUBSCRIBE_STATES.SUBSCRIBED)\n            return\n          }\n\n          this._updatePostgresBindings(postgres_changes, callback)\n        })\n        .receive('error', (error: { [key: string]: any }) =\u003e {\n          this.state = CHANNEL_STATES.errored\n          const message = Object.values(error).join(', ') || 'error'\n          callback?.(REALTIME_SUBSCRIBE_STATES.CHANNEL_ERROR, new Error(message, { cause: error }))\n        })\n        .receive('timeout', () =\u003e {\n          callback?.(REALTIME_SUBSCRIBE_STATES.TIMED_OUT)\n        })\n    }\n    return this\n  }\n\n  private _updatePostgresBindings(\n    postgres_changes: PostgresChangesFilters['postgres_changes'],\n    callback?: (status: REALTIME_SUBSCRIBE_STATES, err?: Error) =\u003e void\n  ) {\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 = postgres_changes \u0026\u0026 postgres_changes[i]\n\n      if (\n        serverPostgresFilter \u0026\u0026\n        serverPostgresFilter.event === event \u0026\u0026\n        RealtimeChannel.isFilterValueEqual(serverPostgresFilter.schema, schema) \u0026\u0026\n        RealtimeChannel.isFilterValueEqual(serverPostgresFilter.table, table) \u0026\u0026\n        RealtimeChannel.isFilterValueEqual(serverPostgresFilter.filter, filter)\n      ) {\n        newPostgresBindings.push({\n          ...clientPostgresBinding,\n          id: serverPostgresFilter.id,\n        })\n      } else {\n        this.unsubscribe()\n        this.state = CHANNEL_STATES.errored\n\n        callback?.(\n          REALTIME_SUBSCRIBE_STATES.CHANNEL_ERROR,\n          new Error('mismatch between server and client bindings for postgres changes')\n        )\n        return\n      }\n    }\n\n    this.bindings.postgres_changes = newPostgresBindings\n\n    if (this.state != CHANNEL_STATES.errored \u0026\u0026 callback) {\n      callback(REALTIME_SUBSCRIBE_STATES.SUBSCRIBED)\n    }\n  }\n\n  /**\n   * Returns the current presence state for this channel.\n   *\n   * The shape is a map keyed by presence key (for example a user id) where each entry contains the\n   * tracked metadata for that user.\n   *\n   * @category Realtime\n   */\n  presenceState\u003cT extends { [key: string]: any } = {}\u003e(): RealtimePresenceState\u003cT\u003e {\n    return this.presence.state as RealtimePresenceState\u003cT\u003e\n  }\n\n  /**\n   * Sends the supplied payload to the presence tracker so other subscribers can see that this\n   * client is online. Use `untrack` to stop broadcasting presence for the same key.\n   *\n   * @category Realtime\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  /**\n   * Removes the current presence state for this client.\n   *\n   * @category Realtime\n   */\n  async untrack(opts: { [key: string]: any } = {}): 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.PRESENCE}`,\n    filter: { event: '*' },\n    callback: (payload?: RealtimePresenceJoinPayload\u003cT\u003e | 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  on\u003cT extends { [key: string]: any }\u003e(\n    type: `${REALTIME_LISTEN_TYPES.POSTGRES_CHANGES}`,\n    filter: RealtimePostgresChangesFilter\u003c`${REALTIME_POSTGRES_CHANGES_LISTEN_EVENT}`\u003e,\n    callback: (payload: RealtimePostgresChangesPayload\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      meta?: {\n        replayed?: boolean\n        id: string\n      }\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      meta?: {\n        replayed?: boolean\n        id: string\n      }\n      payload: T\n    }) =\u003e void\n  ): RealtimeChannel\n  on\u003cT extends Record\u003cstring, unknown\u003e\u003e(\n    type: `${REALTIME_LISTEN_TYPES.BROADCAST}`,\n    filter: { event: REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.ALL },\n    callback: (payload: {\n      type: `${REALTIME_LISTEN_TYPES.BROADCAST}`\n      event: REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.ALL\n      payload: RealtimeBroadcastPayload\u003cT\u003e\n    }) =\u003e void\n  ): RealtimeChannel\n  on\u003cT extends { [key: string]: any }\u003e(\n    type: `${REALTIME_LISTEN_TYPES.BROADCAST}`,\n    filter: { event: REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT },\n    callback: (payload: {\n      type: `${REALTIME_LISTEN_TYPES.BROADCAST}`\n      event: REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.INSERT\n      payload: RealtimeBroadcastInsertPayload\u003cT\u003e\n    }) =\u003e void\n  ): RealtimeChannel\n  on\u003cT extends { [key: string]: any }\u003e(\n    type: `${REALTIME_LISTEN_TYPES.BROADCAST}`,\n    filter: { event: REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE },\n    callback: (payload: {\n      type: `${REALTIME_LISTEN_TYPES.BROADCAST}`\n      event: REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.UPDATE\n      payload: RealtimeBroadcastUpdatePayload\u003cT\u003e\n    }) =\u003e void\n  ): RealtimeChannel\n  on\u003cT extends { [key: string]: any }\u003e(\n    type: `${REALTIME_LISTEN_TYPES.BROADCAST}`,\n    filter: { event: REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE },\n    callback: (payload: {\n      type: `${REALTIME_LISTEN_TYPES.BROADCAST}`\n      event: REALTIME_POSTGRES_CHANGES_LISTEN_EVENT.DELETE\n      payload: RealtimeBroadcastDeletePayload\u003cT\u003e\n    }) =\u003e void\n  ): RealtimeChannel\n  on\u003cT extends { [key: string]: any }\u003e(\n    type: `${REALTIME_LISTEN_TYPES.SYSTEM}`,\n    filter: {},\n    callback: (payload: any) =\u003e void\n  ): RealtimeChannel\n  /**\n   * Listen to realtime events on this channel.\n   * @category Realtime\n   *\n   * @remarks\n   * - By default, Broadcast and Presence are enabled for all projects.\n   * - By default, listening to database changes is disabled for new projects due to database performance and security concerns. You can turn it on by managing Realtime's [replication](/docs/guides/api#realtime-api-overview).\n   * - You can receive the \"previous\" data for updates and deletes by setting the table's `REPLICA IDENTITY` to `FULL` (e.g., `ALTER TABLE your_table REPLICA IDENTITY FULL;`).\n   * - Row level security is not applied to delete statements. When RLS is enabled and replica identity is set to full, only the primary key is sent to clients.\n   *\n   * @example Listen to broadcast messages\n   * ```js\n   * const channel = supabase.channel(\"room1\")\n   *\n   * channel.on(\"broadcast\", { event: \"cursor-pos\" }, (payload) =\u003e {\n   *   console.log(\"Cursor position received!\", payload);\n   * }).subscribe((status) =\u003e {\n   *   if (status === \"SUBSCRIBED\") {\n   *     channel.send({\n   *       type: \"broadcast\",\n   *       event: \"cursor-pos\",\n   *       payload: { x: Math.random(), y: Math.random() },\n   *     });\n   *   }\n   * });\n   * ```\n   *\n   * @example Listen to presence sync\n   * ```js\n   * const channel = supabase.channel('room1')\n   * channel\n   *   .on('presence', { event: 'sync' }, () =\u003e {\n   *     console.log('Synced presence state: ', channel.presenceState())\n   *   })\n   *   .subscribe(async (status) =\u003e {\n   *     if (status === 'SUBSCRIBED') {\n   *       await channel.track({ online_at: new Date().toISOString() })\n   *     }\n   *   })\n   * ```\n   *\n   * @example Listen to presence join\n   * ```js\n   * const channel = supabase.channel('room1')\n   * channel\n   *   .on('presence', { event: 'join' }, ({ newPresences }) =\u003e {\n   *     console.log('Newly joined presences: ', newPresences)\n   *   })\n   *   .subscribe(async (status) =\u003e {\n   *     if (status === 'SUBSCRIBED') {\n   *       await channel.track({ online_at: new Date().toISOString() })\n   *     }\n   *   })\n   * ```\n   *\n   * @example Listen to presence leave\n   * ```js\n   * const channel = supabase.channel('room1')\n   * channel\n   *   .on('presence', { event: 'leave' }, ({ leftPresences }) =\u003e {\n   *     console.log('Newly left presences: ', leftPresences)\n   *   })\n   *   .subscribe(async (status) =\u003e {\n   *     if (status === 'SUBSCRIBED') {\n   *       await channel.track({ online_at: new Date().toISOString() })\n   *       await channel.untrack()\n   *     }\n   *   })\n   * ```\n   *\n   * @example Listen to all database changes\n   * ```js\n   * supabase\n   *   .channel('room1')\n   *   .on('postgres_changes', { event: '*', schema: '*' }, payload =\u003e {\n   *     console.log('Change received!', payload)\n   *   })\n   *   .subscribe()\n   * ```\n   *\n   * @example Listen to a specific table\n   * ```js\n   * supabase\n   *   .channel('room1')\n   *   .on('postgres_changes', { event: '*', schema: 'public', table: 'countries' }, payload =\u003e {\n   *     console.log('Change received!', payload)\n   *   })\n   *   .subscribe()\n   * ```\n   *\n   * @example Listen to inserts\n   * ```js\n   * supabase\n   *   .channel('room1')\n   *   .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'countries' }, payload =\u003e {\n   *     console.log('Change received!', payload)\n   *   })\n   *   .subscribe()\n   * ```\n   *\n   * @exampleDescription Listen to updates\n   * By default, Supabase will send only the updated record. If you want to receive the previous values as well you can\n   * enable full replication for the table you are listening to:\n   *\n   * ```sql\n   * alter table \"your_table\" replica identity full;\n   * ```\n   *\n   * @example Listen to updates\n   * ```js\n   * supabase\n   *   .channel('room1')\n   *   .on('postgres_changes', { event: 'UPDATE', schema: 'public', table: 'countries' }, payload =\u003e {\n   *     console.log('Change received!', payload)\n   *   })\n   *   .subscribe()\n   * ```\n   *\n   * @exampleDescription Listen to deletes\n   * By default, Supabase does not send deleted records. If you want to receive the deleted record you can\n   * enable full replication for the table you are listening to:\n   *\n   * ```sql\n   * alter table \"your_table\" replica identity full;\n   * ```\n   *\n   * @example Listen to deletes\n   * ```js\n   * supabase\n   *   .channel('room1')\n   *   .on('postgres_changes', { event: 'DELETE', schema: 'public', table: 'countries' }, payload =\u003e {\n   *     console.log('Change received!', payload)\n   *   })\n   *   .subscribe()\n   * ```\n   *\n   * @exampleDescription Listen to multiple events\n   * You can chain listeners if you want to listen to multiple events for each table.\n   *\n   * @example Listen to multiple events\n   * ```js\n   * supabase\n   *   .channel('room1')\n   *   .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'countries' }, handleRecordInserted)\n   *   .on('postgres_changes', { event: 'DELETE', schema: 'public', table: 'countries' }, handleRecordDeleted)\n   *   .subscribe()\n   * ```\n   *\n   * @exampleDescription Listen to row level changes\n   * You can listen to individual rows using the format `{table}:{col}=eq.{val}` - where `{col}` is the column name, and `{val}` is the value which you want to match.\n   *\n   * @example Listen to row level changes\n   * ```js\n   * supabase\n   *   .channel('room1')\n   *   .on('postgres_changes', { event: 'UPDATE', schema: 'public', table: 'countries', filter: 'id=eq.200' }, handleRecordUpdated)\n   *   .subscribe()\n   * ```\n   */\n  on(\n    type: `${REALTIME_LISTEN_TYPES}`,\n    filter: { event: string; [key: string]: string },\n    callback: (payload: any) =\u003e void\n  ): RealtimeChannel {\n    const stateCheck = this.channelAdapter.isJoined() || this.channelAdapter.isJoining()\n    const typeCheck =\n      type === REALTIME_LISTEN_TYPES.PRESENCE || type === REALTIME_LISTEN_TYPES.POSTGRES_CHANGES\n\n    if (stateCheck \u0026\u0026 typeCheck) {\n      this.socket.log(\n        'channel',\n        `cannot add \\`${type}\\` callbacks for ${this.topic} after \\`subscribe()\\`.`\n      )\n      throw new Error(`cannot add \\`${type}\\` callbacks for ${this.topic} after \\`subscribe()\\`.`)\n    }\n    return this._on(type, filter, callback)\n  }\n  /**\n   * Sends a broadcast message explicitly via REST API.\n   *\n   * This method always uses the REST API endpoint regardless of WebSocket connection state.\n   * Useful when you want to guarantee REST delivery or when gradually migrating from implicit REST fallback.\n   *\n   * @param event The name of the broadcast event\n   * @param payload Payload to be sent (required)\n   * @param opts Options including timeout\n   * @returns Promise resolving to object with success status, and error details if failed\n   *\n   * @category Realtime\n   */\n  async httpSend(\n    event: string,\n    payload: any,\n    opts: { timeout?: number } = {}\n  ): Promise\u003c{ success: true } | { success: false; status: number; error: string }\u003e {\n    if (payload === undefined || payload === null) {\n      return Promise.reject(new Error('Payload is required for httpSend()'))\n    }\n\n    const headers: Record\u003cstring, string\u003e = {\n      apikey: this.socket.apiKey ? this.socket.apiKey : '',\n      'Content-Type': 'application/json',\n    }\n\n    if (this.socket.accessTokenValue) {\n      headers['Authorization'] = `Bearer ${this.socket.accessTokenValue}`\n    }\n\n    const options = {\n      method: 'POST',\n      headers,\n      body: JSON.stringify({\n        messages: [\n          {\n            topic: this.subTopic,\n            event,\n            payload: payload,\n            private: this.private,\n          },\n        ],\n      }),\n    }\n\n    const response = await this._fetchWithTimeout(\n      this.broadcastEndpointURL,\n      options,\n      opts.timeout ?? this.timeout\n    )\n\n    if (response.status === 202) {\n      return { success: true }\n    }\n\n    let errorMessage = response.statusText\n    try {\n      const errorBody = await response.json()\n      errorMessage = errorBody.error || errorBody.message || errorMessage\n    } catch {}\n\n    return Promise.reject(new Error(errorMessage))\n  }\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   * @category Realtime\n   *\n   * @remarks\n   * - When using REST you don't need to subscribe to the channel\n   * - REST calls are only available from 2.37.0 onwards\n   *\n   * @example Send a message via websocket\n   * ```js\n   * const channel = supabase.channel('room1')\n   *\n   * channel.subscribe((status) =\u003e {\n   *   if (status === 'SUBSCRIBED') {\n   *     channel.send({\n   *       type: 'broadcast',\n   *       event: 'cursor-pos',\n   *       payload: { x: Math.random(), y: Math.random() },\n   *     })\n   *   }\n   * })\n   * ```\n   *\n   * @exampleResponse Send a message via websocket\n   * ```js\n   * ok | timed out | error\n   * ```\n   *\n   * @example Send a message via REST\n   * ```js\n   * supabase\n   *   .channel('room1')\n   *   .httpSend('cursor-pos', { x: Math.random(), y: Math.random() })\n   * ```\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.channelAdapter.canPush() \u0026\u0026 args.type === 'broadcast') {\n      console.warn(\n        'Realtime send() is automatically falling back to REST API. ' +\n          'This behavior will be deprecated in the future. ' +\n          'Please use httpSend() explicitly for REST delivery.'\n      )\n\n      const { event, payload: endpoint_payload } = args\n      const headers: Record\u003cstring, string\u003e = {\n        apikey: this.socket.apiKey ? this.socket.apiKey : '',\n        'Content-Type': 'application/json',\n      }\n\n      if (this.socket.accessTokenValue) {\n        headers['Authorization'] = `Bearer ${this.socket.accessTokenValue}`\n      }\n\n      const options = {\n        method: 'POST',\n        headers,\n        body: JSON.stringify({\n          messages: [\n            {\n              topic: this.subTopic,\n              event,\n              payload: endpoint_payload,\n              private: this.private,\n            },\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) {\n        if (error instanceof Error \u0026\u0026 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.channelAdapter.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  /**\n   * Updates the payload that will be sent the next time the channel joins (reconnects).\n   * Useful for rotating access tokens or updating config without re-creating the channel.\n   *\n   * @category Realtime\n   */\n  updateJoinPayload(payload: Record\u003cstring, any\u003e) {\n    this.channelAdapter.updateJoinPayload(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   * @category Realtime\n   */\n  async unsubscribe(timeout = this.timeout) {\n    return new Promise\u003cRealtimeChannelSendResponse\u003e((resolve) =\u003e {\n      this.channelAdapter\n        .unsubscribe(timeout)\n        .receive('ok', () =\u003e resolve('ok'))\n        .receive('timeout', () =\u003e resolve('timed out'))\n        .receive('error', () =\u003e resolve('error'))\n    })\n  }\n\n  /**\n   * Destroys and stops related timers.\n   *\n   * @category Realtime\n   */\n  teardown() {\n    this.channelAdapter.teardown()\n  }\n\n  /** @internal */\n  async _fetchWithTimeout(url: string, options: { [key: string]: any }, timeout: number) {\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  _on(type: string, filter: { [key: string]: any }, callback: ChannelBindingCallback) {\n    const typeLower = type.toLocaleLowerCase()\n\n    const ref = this.channelAdapter.on(type, callback)\n\n    const binding: Binding = {\n      type: typeLower,\n      filter: filter,\n      callback: callback,\n      ref: ref,\n    }\n\n    if (this.bindings[typeLower]) {\n      this.bindings[typeLower].push(binding)\n    } else {\n      this.bindings[typeLower] = [binding]\n    }\n\n    this._updateFilterMessage()\n\n    return this\n  }\n\n  /**\n   * Registers a callback that will be executed when the channel closes.\n   *\n   * @internal\n   */\n  private _onClose(callback: ChannelBindingCallback) {\n    this.channelAdapter.onClose(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: ChannelOnErrorCallback) {\n    this.channelAdapter.onError(callback)\n  }\n\n  /** @internal */\n  private _updateFilterMessage() {\n    this.channelAdapter.updateFilterBindings((binding, payload: any, ref) =\u003e {\n      const typeLower = binding.event.toLocaleLowerCase()\n\n      if (this._notThisChannelEvent(typeLower, ref)) {\n        return false\n      }\n\n      const bind = this.bindings[typeLower]?.find((bind) =\u003e bind.ref === binding.ref)\n\n      if (!bind) {\n        return true\n      }\n\n      if (['broadcast', 'presence', 'postgres_changes'].includes(typeLower)) {\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() === payload.data?.type.toLocaleLowerCase())\n          )\n        } else {\n          const bindEvent = bind?.filter?.event?.toLocaleLowerCase()\n          return bindEvent === '*' || bindEvent === payload?.event?.toLocaleLowerCase()\n        }\n      } else {\n        return bind.type.toLocaleLowerCase() === typeLower\n      }\n    })\n  }\n\n  /** @internal */\n  private _notThisChannelEvent(event: string, ref?: string | null) {\n    const { close, error, leave, join } = CHANNEL_EVENTS\n    const events: string[] = [close, error, leave, join]\n    return ref \u0026\u0026 events.includes(event) \u0026\u0026 ref !== this.joinPush.ref\n  }\n\n  /** @internal */\n  private _updateFilterTransform() {\n    this.channelAdapter.updatePayloadTransform((event, payload: any, ref) =\u003e {\n      if (typeof payload === 'object' \u0026\u0026 'ids' in payload) {\n        const postgresChanges = payload.data\n        const { schema, table, commit_timestamp, type, errors } = 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        return {\n          ...enrichedPayload,\n          ...this._getPayloadRecords(postgresChanges),\n        }\n      }\n\n      return payload\n    })\n  }\n\n  copyBindings(other: RealtimeChannel) {\n    if (this.joinedOnce) {\n      throw new Error('cannot copy bindings into joined channel')\n    }\n    for (const kind in other.bindings) {\n      for (const binding of other.bindings[kind]) {\n        this._on(binding.type, binding.filter, binding.callback)\n      }\n    }\n  }\n\n  /**\n   * Compares two optional filter values for equality.\n   * Treats undefined, null, and empty string as equivalent empty values.\n   * @internal\n   */\n  private static isFilterValueEqual(\n    serverValue: string | undefined | null,\n    clientValue: string | undefined\n  ): boolean {\n    const normalizedServer = serverValue ?? undefined\n    const normalizedClient = clientValue ?? undefined\n    return normalizedServer === normalizedClient\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(payload.columns, payload.record)\n    }\n\n    if (payload.type === 'UPDATE' || payload.type === 'DELETE') {\n      records.old = Transformers.convertChangeData(payload.columns, payload.old_record)\n    }\n\n    return records\n  }\n}\n","import { Socket } from '@supabase/phoenix'\nimport type {\n  Message,\n  SocketOnClose,\n  SocketOnMessage,\n  SocketOnOpen,\n  SocketOnError,\n  SocketOptions,\n  SocketStateChangeCallbacks,\n  Vsn,\n  Encode,\n  Decode,\n  HeartbeatCallback,\n  Timer,\n} from './types'\nimport { CONNECTION_STATE, ConnectionState } from '../lib/constants'\nimport type { HeartbeatTimer, WebSocketLikeConstructor } from '../RealtimeClient'\n\nexport default class SocketAdapter {\n  private socket: Socket\n\n  constructor(endPoint: string, options: SocketOptions) {\n    this.socket = new Socket(endPoint, options)\n  }\n\n  get timeout(): number {\n    return this.socket.timeout\n  }\n\n  get endPoint(): string {\n    return this.socket.endPoint\n  }\n\n  get transport(): WebSocketLikeConstructor {\n    return this.socket.transport as WebSocketLikeConstructor\n  }\n\n  get heartbeatIntervalMs(): number {\n    return this.socket.heartbeatIntervalMs\n  }\n\n  get heartbeatCallback(): HeartbeatCallback {\n    return this.socket.heartbeatCallback\n  }\n\n  set heartbeatCallback(callback: HeartbeatCallback) {\n    this.socket.heartbeatCallback = callback\n  }\n\n  get heartbeatTimer(): HeartbeatTimer {\n    return this.socket.heartbeatTimer\n  }\n\n  get pendingHeartbeatRef(): string | null {\n    return this.socket.pendingHeartbeatRef\n  }\n\n  get reconnectTimer(): Timer {\n    return this.socket.reconnectTimer\n  }\n\n  get vsn(): Vsn {\n    return this.socket.vsn\n  }\n\n  get encode(): Encode\u003cvoid\u003e {\n    return this.socket.encode\n  }\n\n  get decode(): Decode\u003cvoid\u003e {\n    return this.socket.decode\n  }\n\n  get reconnectAfterMs(): (tries: number) =\u003e number {\n    return this.socket.reconnectAfterMs\n  }\n\n  get sendBuffer(): (() =\u003e void)[] {\n    return this.socket.sendBuffer\n  }\n\n  get stateChangeCallbacks(): SocketStateChangeCallbacks {\n    return this.socket.stateChangeCallbacks\n  }\n\n  connect() {\n    this.socket.connect()\n  }\n\n  disconnect(\n    callback: () =\u003e void,\n    code?: number,\n    reason?: string,\n    timeout: number = 10000\n  ): Promise\u003c'ok' | 'timeout'\u003e {\n    return new Promise((resolve) =\u003e {\n      setTimeout(() =\u003e resolve('timeout'), timeout)\n      this.socket.disconnect(\n        () =\u003e {\n          callback()\n          resolve('ok')\n        },\n        code,\n        reason\n      )\n    })\n  }\n\n  push(data: Message\u003cRecord\u003cstring, unknown\u003e\u003e) {\n    this.socket.push(data)\n  }\n\n  log(kind: string, msg: string, data?: any) {\n    this.socket.log(kind, msg, data)\n  }\n\n  makeRef(): string {\n    return this.socket.makeRef()\n  }\n\n  onOpen(callback: SocketOnOpen) {\n    this.socket.onOpen(callback)\n  }\n\n  onClose(callback: SocketOnClose) {\n    this.socket.onClose(callback)\n  }\n\n  onError(callback: SocketOnError) {\n    this.socket.onError(callback)\n  }\n\n  onMessage(callback: SocketOnMessage) {\n    this.socket.onMessage(callback)\n  }\n\n  isConnected() {\n    return this.socket.isConnected()\n  }\n\n  isConnecting() {\n    return this.socket.connectionState() == CONNECTION_STATE.connecting\n  }\n\n  isDisconnecting() {\n    return this.socket.connectionState() == CONNECTION_STATE.closing\n  }\n\n  connectionState(): ConnectionState {\n    // @ts-ignore - requires better typing and exposing type in phoenix\n    return this.socket.connectionState()\n  }\n\n  endPointURL(): string {\n    return this.socket.endPointURL()\n  }\n\n  sendHeartbeat() {\n    this.socket.sendHeartbeat()\n  }\n\n  /**\n   * @internal\n   */\n  getSocket() {\n    return this.socket\n  }\n}\n","import WebSocketFactory, { WebSocketLike } from './lib/websocket-factory'\n\nimport {\n  CHANNEL_EVENTS,\n  CONNECTION_STATE,\n  DEFAULT_VERSION,\n  DEFAULT_TIMEOUT,\n  DEFAULT_VSN,\n  VSN_1_0_0,\n  VSN_2_0_0,\n} from './lib/constants'\n\nimport Serializer from './lib/serializer'\nimport { httpEndpointURL } from './lib/transformers'\nimport RealtimeChannel from './RealtimeChannel'\nimport type { RealtimeChannelOptions } from './RealtimeChannel'\nimport SocketAdapter from './phoenix/socketAdapter'\nimport type {\n  Message,\n  SocketOptions,\n  HeartbeatCallback,\n  Encode,\n  Decode,\n  Timer,\n  Vsn,\n} from './phoenix/types'\n\ntype Fetch = typeof fetch\n\nexport type LogLevel = 'info' | 'warn' | 'error' | (string \u0026 {})\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' | (string \u0026 {})\nexport type HeartbeatStatus = 'sent' | 'ok' | 'error' | 'timeout' | 'disconnected' | (string \u0026 {})\nexport type HeartbeatTimer = ReturnType\u003ctypeof setTimeout\u003e | undefined\n\n// Connection-related constants\nconst CONNECTION_TIMEOUTS = {\n  HEARTBEAT_INTERVAL: 25000,\n  RECONNECT_DELAY: 10,\n  HEARTBEAT_TIMEOUT_FALLBACK: 100,\n} as const\n\nconst RECONNECT_INTERVALS = [1000, 2000, 5000, 10000] as const\nconst DEFAULT_RECONNECT_FALLBACK = 10000\n\n/**\n * Minimal WebSocket constructor interface that RealtimeClient can work with.\n * Supply a compatible implementation (native WebSocket, `ws`, etc) when running outside the browser.\n */\nexport interface WebSocketLikeConstructor {\n  new (address: string | URL, subprotocols?: string | string[] | undefined): WebSocketLike\n  // Allow additional properties that may exist on WebSocket constructors\n  [key: string]: any\n}\n\nexport type RealtimeClientOptions = {\n  transport?: WebSocketLikeConstructor\n  timeout?: number\n  heartbeatIntervalMs?: number\n  heartbeatCallback?: (status: HeartbeatStatus, latency?: number) =\u003e void\n  vsn?: string\n  logger?: (kind: string, msg: string, data?: any) =\u003e void\n  encode?: Encode\u003cvoid\u003e\n  decode?: Decode\u003cvoid\u003e\n  reconnectAfterMs?: (tries: number) =\u003e number\n  headers?: { [key: string]: string }\n  params?: { [key: string]: any }\n  //Deprecated: Use it in favour of correct casing `logLevel`\n  log_level?: LogLevel\n  logLevel?: LogLevel\n  fetch?: Fetch\n  worker?: boolean\n  workerUrl?: string\n  accessToken?: () =\u003e Promise\u003cstring | null\u003e\n  disconnectOnEmptyChannelsAfterMs?: number\n  /**\n   * Storage compatible object used by the underlying socket for longpoll fallback history.\n   * Provide a custom implementation in environments where reading `globalThis.sessionStorage`\n   * throws (sandboxed iframes, in-app webviews, \"block third-party storage\" privacy modes).\n   * Defaults to `globalThis.sessionStorage` when accessible, otherwise an in-memory store.\n   */\n  sessionStorage?: Storage\n}\n\nfunction createMemorySessionStorage(): Storage {\n  const store = new Map\u003cstring, string\u003e()\n  return {\n    get length() {\n      return store.size\n    },\n    clear() {\n      store.clear()\n    },\n    getItem(key: string) {\n      return store.has(key) ? (store.get(key) as string) : null\n    },\n    key(index: number) {\n      return Array.from(store.keys())[index] ?? null\n    },\n    removeItem(key: string) {\n      store.delete(key)\n    },\n    setItem(key: string, value: string) {\n      store.set(key, String(value))\n    },\n  }\n}\n\nfunction resolveSessionStorage(): Storage {\n  try {\n    if (typeof globalThis !== 'undefined' \u0026\u0026 globalThis.sessionStorage) {\n      return globalThis.sessionStorage\n    }\n  } catch {\n    // Property access on `sessionStorage` itself throws in restricted-storage browsers.\n  }\n  return createMemorySessionStorage()\n}\n\nconst WORKER_SCRIPT = `\n  addEventListener(\"message\", (e) =\u003e {\n    if (e.data.event === \"start\") {\n      setInterval(() =\u003e postMessage({ event: \"keepAlive\" }), e.data.interval);\n    }\n  });`\n\nexport default class RealtimeClient {\n  /** @internal */\n  socketAdapter: SocketAdapter\n  channels: RealtimeChannel[] = new Array()\n\n  accessTokenValue: string | null = null\n  accessToken: (() =\u003e Promise\u003cstring | null\u003e) | null = null\n  apiKey: string | null = null\n\n  httpEndpoint: string = ''\n  /** @deprecated headers cannot be set on websocket connections */\n  headers?: { [key: string]: string } = {}\n  params?: { [key: string]: string } = {}\n\n  ref: number = 0\n\n  logLevel?: LogLevel\n\n  fetch: Fetch\n  worker?: boolean\n  workerUrl?: string\n  workerRef?: Worker\n\n  serializer: Serializer = new Serializer()\n\n  get endPoint() {\n    return this.socketAdapter.endPoint\n  }\n\n  get timeout() {\n    return this.socketAdapter.timeout\n  }\n\n  get transport() {\n    return this.socketAdapter.transport\n  }\n\n  get heartbeatCallback() {\n    return this.socketAdapter.heartbeatCallback\n  }\n\n  get heartbeatIntervalMs() {\n    return this.socketAdapter.heartbeatIntervalMs\n  }\n\n  get heartbeatTimer() {\n    if (this.worker) {\n      return this._workerHeartbeatTimer\n    }\n    return this.socketAdapter.heartbeatTimer\n  }\n\n  get pendingHeartbeatRef() {\n    if (this.worker) {\n      return this._pendingWorkerHeartbeatRef\n    }\n    return this.socketAdapter.pendingHeartbeatRef\n  }\n\n  get reconnectTimer(): Timer {\n    return this.socketAdapter.reconnectTimer\n  }\n\n  get vsn(): Vsn {\n    return this.socketAdapter.vsn\n  }\n\n  get encode() {\n    return this.socketAdapter.encode\n  }\n\n  get decode() {\n    return this.socketAdapter.decode\n  }\n\n  get reconnectAfterMs() {\n    return this.socketAdapter.reconnectAfterMs\n  }\n\n  get sendBuffer() {\n    return this.socketAdapter.sendBuffer\n  }\n\n  get stateChangeCallbacks(): {\n    open: [string, Function][]\n    close: [string, Function][]\n    error: [string, Function][]\n    message: [string, Function][]\n  } {\n    return this.socketAdapter.stateChangeCallbacks\n  }\n\n  private _manuallySetToken: boolean = false\n  private _authPromise: Promise\u003cvoid\u003e | null = null\n  private _workerHeartbeatTimer: HeartbeatTimer = undefined\n  private _pendingWorkerHeartbeatRef: string | null = null\n  private _pendingDisconnectTimer: ReturnType\u003ctypeof setTimeout\u003e | null = null\n  private _disconnectOnEmptyChannelsAfterMs: number = 0\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. This can be a custom implementation\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 Deprecated: headers cannot be set on websocket connections and this option will be removed in the future.\n   * @param options.heartbeatIntervalMs The millisec interval to send a heartbeat message.\n   * @param options.heartbeatCallback The optional function to handle heartbeat status and latency.\n   * @param options.logger The optional function for specialized logging, ie: logger: (kind, msg, data) =\u003e { console.log(`${kind}: ${msg}`, data) }\n   * @param options.logLevel Sets the log level for Realtime\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   * @param options.worker Use Web Worker to set a side flow. Defaults to false.\n   * @param options.workerUrl The URL of the worker script. Defaults to https://realtime.supabase.com/worker.js that includes a heartbeat event call to keep the connection alive.\n   * @param options.vsn The protocol version to use when connecting. Supported versions are \"1.0.0\" and \"2.0.0\". Defaults to \"2.0.0\".\n   *\n   * @category Realtime\n   *\n   * @example Using supabase-js (recommended)\n   * ```ts\n   * import { createClient } from '@supabase/supabase-js'\n   *\n   * const supabase = createClient('https://xyzcompany.supabase.co', 'your-publishable-key')\n   * const channel = supabase.channel('room1')\n   * channel\n   *   .on('broadcast', { event: 'cursor-pos' }, (payload) =\u003e console.log(payload))\n   *   .subscribe()\n   * ```\n   *\n   * @example Standalone import for bundle-sensitive environments\n   * ```ts\n   * import RealtimeClient from '@supabase/realtime-js'\n   *\n   * const client = new RealtimeClient('https://xyzcompany.supabase.co/realtime/v1', {\n   *   params: { apikey: 'your-publishable-key' },\n   * })\n   * client.connect()\n   * ```\n   */\n  constructor(endPoint: string, options?: RealtimeClientOptions) {\n    // Validate required parameters\n    if (!options?.params?.apikey) {\n      throw new Error('API key is required to connect to Realtime')\n    }\n    this.apiKey = options.params.apikey\n\n    const socketAdapterOptions = this._initializeOptions(options)\n\n    this.socketAdapter = new SocketAdapter(endPoint, socketAdapterOptions)\n    this.httpEndpoint = httpEndpointURL(endPoint)\n\n    this.fetch = this._resolveFetch(options?.fetch)\n  }\n\n  /**\n   * Connects the socket, unless already connected.\n   *\n   * @category Realtime\n   */\n  connect(): void {\n    // Skip if already connecting, disconnecting, or connected\n    if (this.isConnecting() || this.isDisconnecting() || this.isConnected()) {\n      return\n    }\n\n    // Trigger auth if needed and not already in progress\n    // This ensures auth is called for standalone RealtimeClient usage\n    // while avoiding race conditions with SupabaseClient's immediate setAuth call\n    if (this.accessToken \u0026\u0026 !this._authPromise) {\n      this._setAuthSafely('connect')\n    }\n\n    this._setupConnectionHandlers()\n\n    try {\n      this.socketAdapter.connect()\n    } catch (error) {\n      const errorMessage = (error as Error).message\n\n      // Provide helpful error message based on environment\n      if (errorMessage.includes('Node.js')) {\n        throw new Error(\n          `${errorMessage}\\n\\n` +\n            'To use Realtime in Node.js, you need to provide a WebSocket implementation:\\n\\n' +\n            'Option 1: Use Node.js 22+ which has native WebSocket support\\n' +\n            'Option 2: Install and provide the \"ws\" package:\\n\\n' +\n            '  npm install ws\\n\\n' +\n            '  import ws from \"ws\"\\n' +\n            '  const client = new RealtimeClient(url, {\\n' +\n            '    ...options,\\n' +\n            '    transport: ws\\n' +\n            '  })'\n        )\n      }\n      throw new Error(`WebSocket not available: ${errorMessage}`)\n    }\n\n    this._handleNodeJsRaceCondition()\n  }\n\n  /**\n   * Returns the URL of the websocket.\n   * @returns string The URL of the websocket.\n   *\n   * @category Realtime\n   */\n  endpointURL(): string {\n    return this.socketAdapter.endPointURL()\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   * @category Realtime\n   */\n  async disconnect(code?: number, reason?: string) {\n    this._cancelPendingDisconnect()\n    if (this.isDisconnecting()) {\n      return 'ok'\n    }\n    return await this.socketAdapter.disconnect(\n      () =\u003e {\n        clearInterval(this._workerHeartbeatTimer)\n        this._terminateWorker()\n      },\n      code,\n      reason\n    )\n  }\n\n  /**\n   * Returns all created channels\n   *\n   * @category Realtime\n   */\n  getChannels(): RealtimeChannel[] {\n    return this.channels\n  }\n\n  /**\n   * Unsubscribes, removes and tears down a single channel\n   * @param channel A RealtimeChannel instance\n   *\n   * @category Realtime\n   */\n  async removeChannel(channel: RealtimeChannel): Promise\u003cRealtimeRemoveChannelResponse\u003e {\n    const status = await channel.unsubscribe()\n\n    if (status === 'ok') {\n      channel.teardown()\n    }\n\n    return status\n  }\n\n  /**\n   * Unsubscribes, removes and tears down all channels\n   *\n   * @category Realtime\n   */\n  async removeAllChannels(): Promise\u003cRealtimeRemoveChannelResponse[]\u003e {\n    const promises = this.channels.map(async (channel) =\u003e {\n      const result = await channel.unsubscribe()\n      channel.teardown()\n      return result\n    })\n\n    const result = await Promise.all(promises)\n    await this.disconnect()\n    return result\n  }\n\n  /**\n   * Logs the message.\n   *\n   * For customized logging, `this.logger` can be overridden in Client constructor.\n   *\n   * @category Realtime\n   */\n  log(kind: string, msg: string, data?: any) {\n    this.socketAdapter.log(kind, msg, data)\n  }\n\n  /**\n   * Returns the current state of the socket.\n   *\n   * @category Realtime\n   */\n  connectionState() {\n    return this.socketAdapter.connectionState() || CONNECTION_STATE.closed\n  }\n\n  /**\n   * Returns `true` is the connection is open.\n   *\n   * @category Realtime\n   */\n  isConnected(): boolean {\n    return this.socketAdapter.isConnected()\n  }\n\n  /**\n   * Returns `true` if the connection is currently connecting.\n   *\n   * @category Realtime\n   */\n  isConnecting(): boolean {\n    return this.socketAdapter.isConnecting()\n  }\n\n  /**\n   * Returns `true` if the connection is currently disconnecting.\n   *\n   * @category Realtime\n   */\n  isDisconnecting(): boolean {\n    return this.socketAdapter.isDisconnecting()\n  }\n\n  /**\n   * Creates (or reuses) a {@link RealtimeChannel} for the provided topic.\n   *\n   * Topics are automatically prefixed with `realtime:` to match the Realtime service.\n   * If a channel with the same topic already exists it will be returned instead of creating\n   * a duplicate connection.\n   *\n   * @category Realtime\n   */\n  channel(topic: string, params: RealtimeChannelOptions = { config: {} }): RealtimeChannel {\n    const realtimeTopic = `realtime:${topic}`\n    const exists = this.getChannels().find((c: RealtimeChannel) =\u003e c.topic === realtimeTopic)\n\n    if (!exists) {\n      const chan = new RealtimeChannel(`realtime:${topic}`, params, this)\n      this._cancelPendingDisconnect()\n      this.channels.push(chan)\n\n      return chan\n    } else {\n      return exists\n    }\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   * @category Realtime\n   */\n  push(data: RealtimeMessage): void {\n    this.socketAdapter.push(data)\n  }\n\n  /**\n   * Sets the JWT access token used for channel subscription authorization and Realtime RLS.\n   *\n   * If param is null it will use the `accessToken` callback function or the token set on the client.\n   *\n   * On callback used, it will set the value of the token internal to the client.\n   *\n   * When a token is explicitly provided, it will be preserved across channel operations\n   * (including removeChannel and resubscribe). The `accessToken` callback will not be\n   * invoked until `setAuth()` is called without arguments.\n   *\n   * @param token A JWT string to override the token set on the client.\n   *\n   * @example Setting the authorization header\n   * // Use a manual token (preserved across resubscribes, ignores accessToken callback)\n   * client.realtime.setAuth('my-custom-jwt')\n   *\n   * // Switch back to using the accessToken callback\n   * client.realtime.setAuth()\n   *\n   * @category Realtime\n   */\n  async setAuth(token: string | null = null): Promise\u003cvoid\u003e {\n    this._authPromise = this._performAuth(token)\n    try {\n      await this._authPromise\n    } finally {\n      this._authPromise = null\n    }\n  }\n\n  /**\n   * Returns true if the current access token was explicitly set via setAuth(token),\n   * false if it was obtained via the accessToken callback.\n   * @internal\n   */\n  _isManualToken(): boolean {\n    return this._manuallySetToken\n  }\n\n  /**\n   * Sends a heartbeat message if the socket is connected.\n   *\n   * @category Realtime\n   */\n  async sendHeartbeat() {\n    this.socketAdapter.sendHeartbeat()\n  }\n\n  /**\n   * Sets a callback that receives lifecycle events for internal heartbeat messages.\n   * Useful for instrumenting connection health (e.g. sent/ok/timeout/disconnected).\n   *\n   * @category Realtime\n   */\n  onHeartbeat(callback: HeartbeatCallback) {\n    this.socketAdapter.heartbeatCallback = this._wrapHeartbeatCallback(callback)\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    if (customFetch) {\n      return (...args) =\u003e customFetch(...args)\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    return this.socketAdapter.makeRef()\n  }\n\n  /**\n   * Removes a channel from RealtimeClient\n   *\n   * @param channel An open subscription.\n   *\n   * @internal\n   */\n  _remove(channel: RealtimeChannel) {\n    this.channels = this.channels.filter((c) =\u003e c.topic !== channel.topic)\n    if (this.channels.length === 0) {\n      this.log('transport', 'no channels remaining, scheduling disconnect')\n      this._schedulePendingDisconnect()\n    }\n  }\n\n  /** @internal */\n  private _schedulePendingDisconnect() {\n    this._cancelPendingDisconnect()\n    if (this._disconnectOnEmptyChannelsAfterMs === 0) {\n      this.log('transport', 'disconnecting immediately - no channels')\n      this.disconnect()\n      return\n    }\n    this._pendingDisconnectTimer = setTimeout(() =\u003e {\n      this._pendingDisconnectTimer = null\n      if (this.channels.length === 0) {\n        this.log('transport', 'deferred disconnect fired - no channels, disconnecting')\n        this.disconnect()\n      }\n    }, this._disconnectOnEmptyChannelsAfterMs)\n    this.log(\n      'transport',\n      `deferred disconnect scheduled in ${this._disconnectOnEmptyChannelsAfterMs}ms`\n    )\n  }\n\n  /** @internal */\n  private _cancelPendingDisconnect() {\n    if (this._pendingDisconnectTimer !== null) {\n      this.log('transport', 'pending disconnect cancelled - channel activity detected')\n      clearTimeout(this._pendingDisconnectTimer)\n      this._pendingDisconnectTimer = null\n    }\n  }\n\n  /**\n   * Perform the actual auth operation\n   * @internal\n   */\n  private async _performAuth(token: string | null = null): Promise\u003cvoid\u003e {\n    let tokenToSend: string | null\n    let isManualToken = false\n\n    if (token) {\n      tokenToSend = token\n      // Track if this is a manually-provided token\n      isManualToken = true\n    } else if (this.accessToken) {\n      // Call the accessToken callback to get fresh token\n      try {\n        tokenToSend = await this.accessToken()\n      } catch (e) {\n        this.log('error', 'Error fetching access token from callback', e)\n        // Fall back to cached value if callback fails\n        tokenToSend = this.accessTokenValue\n      }\n    } else {\n      tokenToSend = this.accessTokenValue\n    }\n\n    // Track whether this token was manually set or fetched via callback\n    if (isManualToken) {\n      this._manuallySetToken = true\n    } else if (this.accessToken) {\n      // If we used the callback, clear the manual flag\n      this._manuallySetToken = false\n    }\n\n    if (this.accessTokenValue != tokenToSend) {\n      this.accessTokenValue = tokenToSend\n      this.channels.forEach((channel) =\u003e {\n        const payload = {\n          access_token: tokenToSend,\n          version: DEFAULT_VERSION,\n        }\n\n        tokenToSend \u0026\u0026 channel.updateJoinPayload(payload)\n\n        if (channel.joinedOnce \u0026\u0026 channel.channelAdapter.isJoined()) {\n          channel.channelAdapter.push(CHANNEL_EVENTS.access_token, {\n            access_token: tokenToSend,\n          })\n        }\n      })\n    }\n  }\n\n  /**\n   * Wait for any in-flight auth operations to complete\n   * @internal\n   */\n  private async _waitForAuthIfNeeded(): Promise\u003cvoid\u003e {\n    if (this._authPromise) {\n      await this._authPromise\n    }\n  }\n\n  /**\n   * Safely call setAuth with standardized error handling\n   * @internal\n   */\n  private _setAuthSafely(context = 'general'): void {\n    // Only refresh auth if using callback-based tokens\n    if (!this._isManualToken()) {\n      this.setAuth().catch((e) =\u003e {\n        this.log('error', `Error setting auth in ${context}`, e)\n      })\n    }\n  }\n\n  /** @internal */\n  private _setupConnectionHandlers(): void {\n    this.socketAdapter.onOpen(() =\u003e {\n      const authPromise =\n        this._authPromise ||\n        (this.accessToken \u0026\u0026 !this.accessTokenValue ? this.setAuth() : Promise.resolve())\n\n      authPromise.catch((e) =\u003e {\n        this.log('error', 'error waiting for auth on connect', e)\n      })\n\n      if (this.worker \u0026\u0026 !this.workerRef) {\n        this._startWorkerHeartbeat()\n      }\n    })\n    this.socketAdapter.onClose(() =\u003e {\n      if (this.worker \u0026\u0026 this.workerRef) {\n        this._terminateWorker()\n      }\n    })\n    this.socketAdapter.onMessage((message: Message\u003cany\u003e) =\u003e {\n      if (message.ref \u0026\u0026 message.ref === this._pendingWorkerHeartbeatRef) {\n        this._pendingWorkerHeartbeatRef = null\n      }\n    })\n  }\n\n  /** @internal */\n  private _handleNodeJsRaceCondition() {\n    if (this.socketAdapter.isConnected()) {\n      // hack: ensure onConnOpen is called\n      this.socketAdapter.getSocket().onConnOpen()\n    }\n  }\n\n  /** @internal */\n  private _wrapHeartbeatCallback(heartbeatCallback?: HeartbeatCallback): HeartbeatCallback {\n    return (status, latency) =\u003e {\n      if (status == 'sent') this._setAuthSafely()\n      if (heartbeatCallback) heartbeatCallback(status, latency)\n    }\n  }\n\n  /** @internal */\n  private _startWorkerHeartbeat() {\n    if (this.workerUrl) {\n      this.log('worker', `starting worker for from ${this.workerUrl}`)\n    } else {\n      this.log('worker', `starting default worker`)\n    }\n    const objectUrl = this._workerObjectUrl(this.workerUrl!)\n    this.workerRef = new Worker(objectUrl)\n    this.workerRef.onerror = (error) =\u003e {\n      this.log('worker', 'worker error', (error as ErrorEvent).message)\n      this._terminateWorker()\n      this.disconnect()\n    }\n    this.workerRef.onmessage = (event) =\u003e {\n      if (event.data.event === 'keepAlive') {\n        this.sendHeartbeat()\n      }\n    }\n    this.workerRef.postMessage({\n      event: 'start',\n      interval: this.heartbeatIntervalMs,\n    })\n  }\n\n  /**\n   * Terminate the Web Worker and clear the reference\n   * @internal\n   */\n  private _terminateWorker(): void {\n    if (this.workerRef) {\n      this.log('worker', 'terminating worker')\n      this.workerRef.terminate()\n      this.workerRef = undefined\n    }\n  }\n\n  /** @internal */\n  private _workerObjectUrl(url: string | undefined): string {\n    let result_url: string\n    if (url) {\n      result_url = url\n    } else {\n      const blob = new Blob([WORKER_SCRIPT], { type: 'application/javascript' })\n      result_url = URL.createObjectURL(blob)\n    }\n    return result_url\n  }\n\n  /**\n   * Initialize socket options with defaults\n   * @internal\n   */\n  private _initializeOptions(options?: RealtimeClientOptions): SocketOptions {\n    this.worker = options?.worker ?? false\n    this.accessToken = options?.accessToken ?? null\n\n    const result: SocketOptions = {}\n    result.timeout = options?.timeout ?? DEFAULT_TIMEOUT\n    result.heartbeatIntervalMs =\n      options?.heartbeatIntervalMs ?? CONNECTION_TIMEOUTS.HEARTBEAT_INTERVAL\n\n    this._disconnectOnEmptyChannelsAfterMs =\n      options?.disconnectOnEmptyChannelsAfterMs ??\n      2 * (options?.heartbeatIntervalMs ?? CONNECTION_TIMEOUTS.HEARTBEAT_INTERVAL)\n\n    // @ts-ignore - mismatch between phoenix and supabase\n    result.transport = options?.transport ?? WebSocketFactory.getWebSocketConstructor()\n    result.params = options?.params\n    result.logger = options?.logger\n    result.heartbeatCallback = this._wrapHeartbeatCallback(options?.heartbeatCallback)\n    result.sessionStorage = options?.sessionStorage ?? resolveSessionStorage()\n    result.reconnectAfterMs =\n      options?.reconnectAfterMs ??\n      ((tries: number) =\u003e {\n        return RECONNECT_INTERVALS[tries - 1] || DEFAULT_RECONNECT_FALLBACK\n      })\n\n    let defaultEncode: Encode\u003cvoid\u003e\n    let defaultDecode: Decode\u003cvoid\u003e\n\n    const vsn = options?.vsn ?? DEFAULT_VSN\n\n    switch (vsn) {\n      case VSN_1_0_0:\n        defaultEncode = (payload, callback) =\u003e {\n          return callback(JSON.stringify(payload))\n        }\n        defaultDecode = (payload, callback) =\u003e {\n          return callback(JSON.parse(payload as string))\n        }\n        break\n      case VSN_2_0_0:\n        defaultEncode = this.serializer.encode.bind(this.serializer)\n        defaultDecode = this.serializer.decode.bind(this.serializer)\n        break\n      default:\n        throw new Error(`Unsupported serializer version: ${result.vsn}`)\n    }\n\n    result.vsn = vsn\n    result.encode = options?.encode ?? defaultEncode\n    result.decode = options?.decode ?? defaultDecode\n\n    result.beforeReconnect = this._reconnectAuth.bind(this)\n\n    if (options?.logLevel || options?.log_level) {\n      this.logLevel = options.logLevel || options.log_level\n      result.params = { ...result.params, log_level: this.logLevel as string }\n    }\n\n    // Handle worker setup\n    if (this.worker) {\n      if (typeof window !== 'undefined' \u0026\u0026 !window.Worker) {\n        throw new Error('Web Worker is not supported')\n      }\n      this.workerUrl = options?.workerUrl\n      result.autoSendHeartbeat = !this.worker\n    }\n\n    return result\n  }\n\n  /** @internal */\n  private async _reconnectAuth() {\n    await this._waitForAuthIfNeeded()\n    if (!this.isConnected()) {\n      this.connect()\n    }\n  }\n}\n"],"version":3}
