{"version":3,"sources":["../src/service/baseClient.ts","../src/internal/error.ts","../src/service/session.ts","../../schemas/grant.ts","../../schemas/request/grantChannelRequest.ts","../src/service/Service.ts","../src/service/patterns.ts","../src/service/types.ts","../src/client/react/context/TopicContext.ts","../src/client/react/utils/withTimeout.ts","../src/client/react/utils/helpers.ts","../src/client/react/utils/id.ts","../src/client/react/hooks/useChannelInternal.ts","../src/client/react/utils/createChannel.ts","../src/client/react/context/ErebusContext.ts","../src/server/rpc.ts","../src/client/core/authorize.ts","../src/internal/logger/consola.ts","../../schemas/messageBody.ts","../../schemas/packetEnvelope.ts","../src/client/core/wire.ts","../src/internal/validateWebSocketUrl.ts","../src/client/core/backoff.ts","../src/client/core/pubsub/ConnectionManager.ts","../src/client/core/pubsub/AckManager.ts","../src/client/core/pubsub/SubscriptionManager.ts","../src/client/core/pubsub/MessageProcessor.ts","../src/client/core/pubsub/GrantManager.ts","../src/client/core/pubsub/HeartbeatManager.ts","../src/client/core/pubsub/Presence.ts","../src/client/core/pubsub/PubSubConnection.ts","../src/client/core/pubsub/StateManager.ts","../src/client/core/pubsub/ErebusPubSubClient.ts","../src/client/core/Erebus.ts","../src/client/react/provider/ErebusProvider.tsx","../src/client/react/provider/TopicProvider.tsx","../src/client/core/types.ts","../src/server/app.ts","../src/server/adapter/next/createRouteHandler.ts"],"names":["CLIENT_NAME","baseClient","base_url","ky","request","ErebusError","message","more","ErebusSession","grantRequest","client","channel","topic","scope","expiration","now","min","max","response","data","error","HTTPError","Access","GrantScopeEnum","z","SECRET_KEY_REGEX","secretKeySchema","ErebusService","secret_api_key","userId","orgPattern","org","groupPattern","group","TopicContext","createContext","useTopic","ctx","useContext","withTimeout","p","ms","label","timeoutId","finished","resolve","v","e","joinAndConnect","timeout","genId","useChannelInternal","channelName","schema","messages","setMessages","useState","isError","setIsError","setError","isSubscribed","setIsSubscribed","statusRef","useRef","forceRender","setMsgStatus","id","patch","prev","x","getMessageStatus","useEffect","success","msg","parsedPayload","ack","presence","publish","payload","opts","maxRetries","baseDelay","attempts","attemptOnce","reject","err","lastErr","i","delay","r","createChannel","ErebusContext","useErebus","context","createRpcClient","baseUrl","hc","Authorize","errorData","logger","createConsola","MessageBodySchema","RequestId","ConnectPacket","SubscribePacket","UnsubscribePacket","PresencePacket","PublishPacket","BaseAck","AckPublishOk","AckPublishErr","AckSubscription","AckResultSchema","AckPacket","PacketEnvelopeSchema","encodeEnvelope","pkt","encoded","parseServerFrame","raw","parsed","parseAckPacket","ackResult","path","subscriptionAck","successAck","errorAck","validateWebSocketUrl","url","backoff","attempt","capMs","base","jitter","BackpressureError","NotConnectedError","ConnectionManager","#url","#channel","#ws","#retry","#state","#connectionId","#grant","#autoReconnect","#onMessage","#log","#debugHexDump","config","options","ws","#createWebSocket","#setupWebSocketListeners","res","bufferedAmount","grant","connectUrl","ev","#handleMessage","#reconnect","hex","#getHexDump","dataStr","#convertToString","arrayBuffer","uint8","buf","bckOff","AckManager","#pendingPublishes","#clientMsgIdToRequestId","#pendingSubscriptions","#subscriptionMsgIdToRequestId","connectionId","requestId","pending","ackPacket","#handlePublishAck","#handleSubscriptionAck","clientMsgId","#createAckResponse","k","#createSubscriptionResponse","reason","result","errorResult","SubscriptionManager","#subs","#subscribedTopics","#unsubscribedTopics","MessageProcessor","#ackManager","#presenceManager","onMessage","ackManager","presenceManager","packet","#handleAckPacket","GRANT_CACHE_KEY","logSensitiveData","prefix","GrantManager","#tokenProvider","tokenProvider","token","grantJWT","HeartbeatManager","#intervalMs","#intervalId","#sendHeartbeat","intervalMs","sendHeartbeat","log","wasRunning","PresenceManager","#presenceHandlers","handler","handlers","presencePacket","presenceEvent","count","PubSubConnection","#connectionManager","#subscriptionManager","#messageProcessor","#grantManager","#heartbeatManager","#ackTimeoutMs","connectionConfig","rawMessage","topicsToResubscribe","callback","timeoutMs","#publishInternal","withAck","nanoid","consola","StateManager","#connectionState","#subscriptions","#processedMessages","#handlers","#lastActivity","#error","#isReconnecting","#reconnectAttempts","state","#updateActivity","_","status","messageId","ids","reconnecting","ErebusPubSubClientNew","#conn","#stateManager","#debug","instanceId","m","onAck","messageBody","startTime","checkReadiness","counts","handlerCount","n","connectionObject","debugObj","actualMessageBody","fn","ErebusClient","authorize","ErebusProvider","children","authBaseUrl","wsBaseUrl","makeClient","jsx","TopicProvider","logTypeInfo","value","createApp","sessionOrProvider","app","Hono","c","next","reqId","session","started","routes","zValidator","startAuthServer","port","server","serve","createRouteHandler","req","body","handle"],"mappings":"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","file":"index.cjs","sourcesContent":["import ky from \"ky\";\n\nconst CLIENT_NAME = \"erebus-service-client\";\n\ninterface BaseClientOptions {\n  base_url?: string;\n}\n\nexport const baseClient = ({ base_url }: BaseClientOptions) =>\n  ky.create({\n    prefixUrl: base_url ?? \"https://api.erebus.sh/v1/\",\n    headers: {\n      \"content-type\": \"application/json\",\n    },\n    hooks: {\n      beforeRequest: [\n        (request) => {\n          request.headers.set(\"x-client\", CLIENT_NAME);\n        },\n      ],\n    },\n  });\n","export class ErebusError extends Error {\n  constructor(message: string, more?: string) {\n    super(message + (more ? `: ${more}` : \"\"));\n  }\n}\n","import type { Access } from \"@repo/schemas/grant\";\nimport { baseClient } from \"./baseClient\";\nimport { ErebusError } from \"../internal/error\";\nimport type { GrantRequest } from \"@repo/schemas/request/grantChannelRequest\";\nimport { HTTPError } from \"ky\";\n\nexport class ErebusSession {\n  constructor(\n    private readonly grantRequest: GrantRequest,\n    private readonly client: ReturnType<typeof baseClient>,\n  ) {\n    if (!this.grantRequest.secret_key) {\n      throw new ErebusError(\n        [\n          \"Secret key is required to create a session. Use the ErebusService class method.\",\n          \"example:\",\n          \"const service = new ErebusService({ secret_api_key: 'test' });\",\n          \"const session = await service.prepareSession({ userId: 'test' });\",\n        ].join(\"\\n\"),\n      );\n    }\n    if (!this.grantRequest.userId) {\n      throw new ErebusError(\n        [\n          \"User ID is required to create a session. Use the ErebusService class method.\",\n          \"example:\",\n          \"const service = new ErebusService({ secret_api_key: 'test' });\",\n          \"const session = await service.prepareSession({ userId: 'test' });\",\n        ].join(\"\\n\"),\n      );\n    }\n    // Set default expiration to 2 hours from now\n    this.grantRequest.expiresAt = Math.floor(Date.now() / 1000) + 2 * 60 * 60; // 2 hours from now\n  }\n\n  public join(channel: string) {\n    if (!channel) {\n      throw new ErebusError(\"Channel is required to join.\");\n    }\n\n    if (!/^[A-Za-z0-9_]+$/.test(channel)) {\n      throw new ErebusError(\n        \"Channel name must not contain spaces or special characters. Only letters, numbers, and underscores are allowed.\",\n      );\n    }\n\n    if (channel.length > 64) {\n      throw new ErebusError(\"Channel name must be less than 64 characters.\");\n    }\n\n    this.grantRequest.channel = channel;\n  }\n\n  public allow(topic: string, scope: Access) {\n    if (!this.grantRequest.channel) {\n      throw new ErebusError(\n        [\n          \"You must set a channel before allowing access to any topics.\",\n          \"Please call join(channel) first.\",\n          \"example:\",\n          \"session.join('channel_name');\",\n        ].join(\"\\n\"),\n      );\n    }\n\n    if (!topic) {\n      throw new ErebusError(\"Topic is required to allow access.\");\n    }\n\n    if (topic !== \"*\" && !/^[A-Za-z0-9_]+$/.test(topic)) {\n      throw new ErebusError(\n        \"Topic name must not contain spaces or special characters. Only letters, numbers, and underscores are allowed. Use '*' to allow all topics.\",\n      );\n    }\n\n    if (topic.length > 64) {\n      throw new ErebusError(\"Topic name must be less than 64 characters.\");\n    }\n\n    if (this.grantRequest.topics.length > 64) {\n      throw new ErebusError(\n        \"Connecting to more than 64 topics at once is inefficient. Please reduce the number of topics in this grant.\",\n      );\n    }\n\n    if (!scope) {\n      throw new ErebusError(\"Scope is required to allow access.\");\n    }\n\n    this.grantRequest.topics.push({\n      topic,\n      scope,\n    });\n  }\n\n  public setExpiration(expiration: number) {\n    const now = Math.floor(Date.now() / 1000); // current time in seconds\n    const min = now + 10 * 60; // 10 minutes from now\n    const max = now + 2 * 60 * 60; // 2 hours from now\n\n    if (typeof expiration !== \"number\" || !Number.isFinite(expiration)) {\n      throw new ErebusError(\n        \"Expiration must be a valid number (unix timestamp in seconds).\",\n      );\n    }\n    if (expiration < min) {\n      throw new ErebusError(\"Expiration must be at least 10 minutes from now.\");\n    }\n    if (expiration > max) {\n      throw new ErebusError(\"Expiration cannot be more than 2 hours from now.\");\n    }\n    this.grantRequest.expiresAt = expiration;\n  }\n\n  /**\n   * Last function to be called to get the signed JWT token.\n   *\n   * @returns\n   */\n  public async authorize(): Promise<string> {\n    if (!this.grantRequest.channel) {\n      throw new ErebusError(\n        \"You must set a channel before allowing access to any topics. Please call join(channel) first.\",\n      );\n    }\n\n    if (this.grantRequest.topics.length === 0) {\n      throw new ErebusError(\n        [\n          \"At least one topic is required. Please use the allow method to grant access to topics.\",\n          \"example:\",\n          \"session.allow('topic-1', Access.Read);\",\n        ].join(\"\\n\"),\n      );\n    }\n\n    if (this.grantRequest.topics.length > 64) {\n      throw new ErebusError(\n        [\n          \"Connecting to more than 64 topics at once is inefficient. Please reduce the number of topics in this grant.\",\n        ].join(\"\\n\"),\n      );\n    }\n\n    const request = this.grantRequest;\n    try {\n      const response = await this.client.post(\"api/v1/grant-channel\", {\n        json: request,\n      });\n\n      if (!response.ok) {\n        throw new ErebusError(\n          [\n            \"The server returned an error.\",\n            \"Please check your API key and ensure you have provided a valid topics array (at least one and less than 64 topics). Please try again.\",\n            \"If the problem persists, please contact support: sdk@erebus.sh\",\n          ].join(\"\\n\"),\n        );\n      }\n      console.log(\n        \"[ErebusSession.authorize] Response received for user:\",\n        this.grantRequest.userId,\n      );\n      const data = (await response.json()) as { grant_jwt: string };\n      if (!data) {\n        throw new ErebusError(\n          [\n            \"The server returned an empty response or invalid data.\",\n            \"Please check your API key and try again.\",\n            \"If the problem persists, please contact support: sdk@erebus.sh\",\n          ].join(\"\\n\"),\n        );\n      }\n      return data.grant_jwt;\n    } catch (error: unknown) {\n      if (error instanceof HTTPError) {\n        console.error(error);\n        if (error.response.status === 401) {\n          throw new ErebusError(\n            \"Invalid API key or token. Please check your API key and try again.\",\n            JSON.stringify(await error.response.json()),\n          );\n        } else if (error.response.status === 400) {\n          throw new ErebusError(\n            \"Invalid topics array. Please check your topics array and try again.\",\n            JSON.stringify(await error.response.json()),\n          );\n        } else if (error.response.status === 500) {\n          throw new ErebusError(\n            \"Internal server error. Please try again later.\",\n            JSON.stringify(await error.response.json()),\n          );\n        }\n        throw new ErebusError(\n          `Failed to get token: ${error.response.statusText}`,\n          JSON.stringify(await error.response.json()),\n        );\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Debug object for the session.\n   */\n  get __debugObject(): {\n    grant: GrantRequest;\n    client: ReturnType<typeof baseClient>;\n  } {\n    return {\n      grant: this.grantRequest,\n      client: this.client,\n    };\n  }\n}\n","import { z } from \"zod\";\n\n/**\n * Grant scope enum for read, write, read-write and huh?\n */\nexport enum Access {\n  Read = \"read\",\n  Write = \"write\",\n  ReadWrite = \"read-write\",\n  Huh = \"huh?\",\n}\n\nexport const GrantScopeEnum = z.enum(\n  Object.values(Access) as [string, ...string[]],\n);\nexport type GrantScope = z.infer<typeof GrantScopeEnum>;\n\n/**\n * This is the grant for connection to the channel.\n */\nexport const GrantSchema = z.object({\n  // Project data\n  project_id: z.string(),\n  key_id: z.string(),\n\n  // Channel data\n  channel: z.string(),\n  // Topics: contain everything the user is allowed to subscribe to, or a wildcard \"*\"\n  topics: z.array(\n    z.object({\n      topic: z.string(),\n      scope: GrantScopeEnum,\n    }),\n  ),\n\n  // Client data\n  userId: z.string().min(1), // The actor making the request\n\n  // Token metadata\n  issuedAt: z.number(), // When token was issued\n  expiresAt: z.number(),\n});\n\nexport type Grant = z.infer<typeof GrantSchema>;\n","import { z } from \"zod\";\nimport { GrantScopeEnum } from \"../grant\";\n\nconst SECRET_KEY_REGEX = /^(sk-er-|dv-er-)[\\w-]{48}$/;\n\nexport const secretKeySchema = z\n  .string()\n  .min(1)\n  .regex(SECRET_KEY_REGEX, \"Invalid API key format\");\n/**\n * This grant only grant you connection to the channel, but don't grant you to subscribe to any topic in the channel.\n * You need to grant the topic access separately.\n */\nexport const grantRequestSchema = z.object({\n  secret_key: secretKeySchema,\n  // Channel data\n  channel: z.string().min(1),\n  // Topics: contain everything the user is allowed to subscribe to, or a wildcard \"*\"\n  topics: z\n    .array(\n      z.object({\n        topic: z.string(),\n        scope: GrantScopeEnum,\n      }),\n    )\n    .min(1),\n  userId: z.string().min(1),\n  expiresAt: z.number(),\n});\n\nexport type GrantRequest = z.infer<typeof grantRequestSchema>;\n","import { baseClient } from \"./baseClient\";\nimport { ErebusSession } from \"./session\";\nimport { ErebusError } from \"../internal/error\";\nimport {\n  type GrantRequest,\n  secretKeySchema,\n} from \"@repo/schemas/request/grantChannelRequest\";\n\nexport class ErebusService {\n  private readonly client: ReturnType<typeof baseClient>;\n  private grantRequest: GrantRequest = {\n    userId: \"\",\n    channel: \"\",\n    topics: [],\n    expiresAt: 0,\n    secret_key: \"dv-er-abcdefghijklmnopqrstuvwxyzABCDEFGsH1234abcdddddd\",\n  };\n  constructor({\n    secret_api_key,\n    base_url,\n  }: {\n    secret_api_key: string;\n    base_url?: string;\n  }) {\n    // Validate the secret_api_key using the regex from grantChannelRequest.ts\n    if (!secretKeySchema.safeParse(secret_api_key).success) {\n      throw new ErebusError(\"Invalid API key format\");\n    }\n    this.grantRequest.secret_key = secret_api_key;\n    this.client = baseClient({ base_url: base_url ?? \"https://api.erebus.sh\" });\n  }\n\n  public async prepareSession({ userId }: { userId: string }) {\n    if (!userId) {\n      throw new ErebusError(\n        \"User ID is required to create a session. Use the ErebusService.prepareSession() method.\",\n      );\n    }\n    this.grantRequest.userId = userId;\n    return new ErebusSession(this.grantRequest, this.client);\n  }\n}\n","// Keep all pattern formatting in one place (avoid string soup in handlers)\nexport function orgPattern(org: string) {\n  return `${org}:*`;\n}\n\nexport function groupPattern(org: string, group?: string) {\n  return group ? `${org}:${group}:*` : `${org}:*`; // fallback if no group\n}\n","// @grant.ts\nexport enum Access {\n  Read = \"read\",\n  Write = \"write\",\n  ReadWrite = \"read-write\",\n  Huh = \"huh?\",\n}\n","\"use client\";\nimport type { ErebusPubSubClient } from \"@/client/core/pubsub\";\nimport { ErebusError } from \"@/internal/error\";\nimport { createContext, useContext } from \"react\";\n\ntype TopicCtx = {\n  topic: string;\n  client: ErebusPubSubClient;\n};\n\nexport const TopicContext = createContext<TopicCtx | null>(null);\n\nexport function useTopic() {\n  const ctx = useContext(TopicContext);\n  if (!ctx) throw new ErebusError(\"useTopic must be used within TopicProvider\");\n  return ctx;\n}\n","import { ErebusError } from \"@/service\";\n\nexport async function withTimeout<T>(\n  p: Promise<T>,\n  ms: number,\n  label: string,\n): Promise<{ value?: T; error?: Error }> {\n  let timeoutId: ReturnType<typeof setTimeout>;\n  let finished = false;\n\n  return new Promise<{ value?: T; error?: Error }>((resolve) => {\n    timeoutId = setTimeout(() => {\n      if (!finished) {\n        finished = true;\n        resolve({\n          error: new ErebusError(`${label} timeout after ${ms}ms`),\n        });\n      }\n    }, ms);\n\n    p.then(\n      (v) => {\n        if (!finished) {\n          finished = true;\n          clearTimeout(timeoutId);\n          resolve({ value: v });\n        }\n      },\n      (e) => {\n        if (!finished) {\n          finished = true;\n          clearTimeout(timeoutId);\n          // Wrap non-Error objects in an Error for type safety\n          const error =\n            e instanceof Error\n              ? e\n              : new ErebusError(\n                  typeof e === \"string\"\n                    ? e\n                    : `Unknown error in ${label}: ${JSON.stringify(e)}`,\n                );\n          resolve({ error });\n        }\n      },\n    );\n  });\n}\n","import type { ErebusPubSubClient } from \"@/client/core/pubsub\";\nimport { ErebusError } from \"@/service\";\nimport { withTimeout } from \"./withTimeout\";\n\n/**\n * Attempts to join a channel and connect the client, with timeout and error handling.\n * Ensures that errors from withTimeout are properly handled and surfaced.\n */\nexport async function joinAndConnect(\n  client: ErebusPubSubClient,\n  channel: string,\n  timeout: number = 10000,\n): Promise<{ success: boolean; error: ErebusError | null }> {\n  try {\n    client.joinChannel(channel);\n    const { error } = await withTimeout(\n      client.connect(),\n      timeout,\n      \"joinAndConnect\",\n    );\n    if (error) {\n      console.error(\n        \"[joinAndConnect] Failed to join and connect (timeout or connect error)\",\n        error,\n      );\n      return {\n        success: false,\n        error:\n          error instanceof ErebusError\n            ? error\n            : new ErebusError(error?.message ?? \"Failed to join and connect\"),\n      };\n    }\n    console.log(\"[joinAndConnect] Successfully joined and connected\");\n    return { success: true, error: null };\n  } catch (error) {\n    console.error(\n      \"[joinAndConnect] Failed to join and connect (exception)\",\n      error,\n    );\n    return {\n      success: false,\n      error:\n        error instanceof ErebusError\n          ? error\n          : new ErebusError(\n              error instanceof Error\n                ? error.message\n                : \"Failed to join and connect\",\n            ),\n    };\n  }\n}\n","export const genId = () =>\n  crypto.randomUUID() ??\n  String(Date.now()) + Math.random().toString(16).slice(2);\n","\"use client\";\n\nimport type { SchemaMap, Topic } from \"../utils/types\";\nimport { z } from \"zod\";\nimport { ErebusError } from \"@/service\";\nimport { useTopic } from \"../context/TopicContext\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { joinAndConnect } from \"../utils/helpers\";\nimport type { PerMessageStatus, PublishOptions } from \"../utils/publishStatus\";\nimport { genId } from \"../utils/id\";\nimport type { MessageBody } from \"@repo/schemas/messageBody\";\n\nexport function useChannelInternal<S extends SchemaMap, K extends Topic<S>>(\n  channelName: K,\n  schema: S,\n) {\n  const { client, topic } = useTopic();\n  // topic comes from TopicProvider (the conversation room)\n  // channelName specifies which schema to use for validation\n\n  type PayloadT = z.infer<S[K]>;\n  type Message = Omit<MessageBody, \"payload\"> & { payload: PayloadT };\n  const [messages, setMessages] = useState<Message[]>([]);\n  const [isError, setIsError] = useState<boolean>(false);\n  const [error, setError] = useState<ErebusError | null>(null);\n  const [isSubscribed, setIsSubscribed] = useState<boolean>(false);\n\n  /**\n   * Track the status of each published message individually.\n   *\n   * Each message is processed asynchronously and maintains its own state,\n   * including a local ID for reference. This allows us to display and update\n   * the status of each message (e.g., sending, success, failed) independently,\n   * rather than relying on a single global error state.\n   *\n   * We use a Map to store the status of each message by its ID.\n   * When a status changes, we force a re-render to update the UI.\n   */\n  const statusRef = useRef<Map<string, PerMessageStatus>>(new Map());\n  const [, forceRender] = useState(0); // Used to trigger a re-render when statuses change\n\n  /**\n   * Helper function to update the status of a specific message.\n   * Mutates the status map and triggers a re-render.\n   */\n  const setMsgStatus = (id: string, patch: Partial<PerMessageStatus>) => {\n    const prev = statusRef.current.get(id) ?? {\n      id,\n      status: \"idle\",\n      attempts: 0,\n      error: null,\n    };\n    statusRef.current.set(id, { ...prev, ...patch });\n    forceRender((x) => x + 1);\n  };\n\n  // Expose a read-only snapshot for UI (optional)\n  const getMessageStatus = (id: string) => statusRef.current.get(id);\n\n  useEffect(() => {\n    (async () => {\n      const { success, error } = await joinAndConnect(client, channelName);\n      if (!success) {\n        setIsError(true);\n        setError(error);\n        return;\n      }\n      client.subscribe(\n        topic,\n        (msg) => {\n          // msg.payload contains the payload, so we parse it\n          if (!schema[channelName]) {\n            throw new ErebusError(\n              `Schema for channel \"${channelName}\" is not defined.`,\n            );\n          }\n          const parsedPayload = schema[channelName].parse(msg.payload);\n          setMessages((prev) => [\n            ...prev,\n            { ...msg, payload: parsedPayload } as Message,\n          ]);\n        },\n        (ack) => {\n          console.log(\"[useChannelInternal] Subscription ACK\", ack);\n          if (!ack.success) {\n            console.log(\"[useChannelInternal] Subscription ACK failed\", ack);\n            setIsError(true);\n            if (ack.error.code === \"TIMEOUT\") {\n              setError(\n                new ErebusError(\n                  \"Subscription failed: the server could not process your request to subscribe to the specified topic due to a timeout.\",\n                ),\n              );\n              return;\n            } else {\n              console.log(\"[useChannelInternal] Subscription ACK failed\", ack);\n              setError(\n                new ErebusError(\n                  \"Subscription failed: the server could not process your request to subscribe to the specified topic.\",\n                ),\n              );\n              return;\n            }\n          }\n          console.log(\"[useChannelInternal] Subscription ACK success\", ack);\n          setIsSubscribed(true);\n        },\n      );\n\n      client.onPresence(topic, (presence) => {\n        // TODO: Complete this, it's easy\n        if (presence.status === \"online\") {\n          console.log(\"[useChannelInternal] Presence online\", presence);\n        } else {\n          console.log(\"[useChannelInternal] Presence offline\", presence);\n        }\n      });\n    })();\n\n    return () => {\n      try {\n        client.unsubscribe(topic);\n        setIsSubscribed(false);\n      } catch {}\n    };\n  }, [client, topic]);\n\n  async function publish(\n    payload: PayloadT,\n    opts: PublishOptions = {},\n  ): Promise<{\n    id: string;\n    success: boolean;\n    attempts: number;\n    error: ErebusError | null;\n  }> {\n    // Validate before sending\n    if (!schema[channelName]) {\n      throw new ErebusError(\n        `Schema for channel \"${channelName}\" is not defined.`,\n      );\n    }\n    schema[channelName].parse(payload);\n\n    const id = genId();\n    const maxRetries = opts.maxRetries ?? 2;\n    const baseDelay = opts.baseDelayMs ?? 250;\n\n    setMsgStatus(id, { id, status: \"sending\", attempts: 0, error: null });\n\n    let attempts = 0;\n\n    const attemptOnce = () =>\n      new Promise<void>((resolve, reject) => {\n        attempts += 1;\n        setMsgStatus(id, { attempts });\n\n        client.publishWithAck({\n          topic,\n          messageBody: JSON.stringify(payload),\n          onAck: (ack) => {\n            if (ack.success) {\n              setMsgStatus(id, { status: \"success\", error: null });\n              resolve();\n            } else {\n              const code = ack.error?.code ?? \"UNKNOWN\";\n              const err =\n                code === \"TIMEOUT\"\n                  ? new ErebusError(\n                      \"Publish failed: the server timed out processing your publish request.\",\n                    )\n                  : new ErebusError(\n                      \"Publish failed: the server could not process your publish request.\",\n                    );\n              setMsgStatus(id, { status: \"failed\", error: err });\n              reject(err);\n            }\n          },\n          // If your client supports an explicit per-send timeout, pass opts.timeoutMs here\n        });\n      });\n\n    // Retry with exponential backoff (jitter optional)\n    let lastErr: ErebusError | null = null;\n    for (let i = 0; i <= maxRetries; i++) {\n      try {\n        await attemptOnce();\n        return { id, success: true, attempts, error: null };\n      } catch (e) {\n        lastErr =\n          e instanceof ErebusError\n            ? e\n            : new ErebusError(\"Unknown publish error\");\n        if (i < maxRetries) {\n          const delay = baseDelay * Math.pow(2, i);\n          await new Promise((r) => setTimeout(r, delay));\n          // Mark as re-sending for UI clarity\n          setMsgStatus(id, { status: \"sending\" });\n        }\n      }\n    }\n\n    // Exhausted retries\n    setMsgStatus(id, { status: \"failed\", error: lastErr });\n    return { id, success: false, attempts, error: lastErr };\n  }\n\n  return {\n    publish, // returns Promise with per-message result\n    messages,\n    // expose status accessors so UI can show per-message chips/spinners\n    getMessageStatus,\n    // you can also expose a snapshot for quick mapping:\n    messageStatuses: statusRef.current,\n    isError,\n    error,\n    isSubscribed,\n  };\n}\n","import { useChannelInternal } from \"../hooks/useChannelInternal\";\nimport type { SchemaMap, Topic } from \"./types\";\n\nexport function createChannel<S extends SchemaMap>(schema: S) {\n  return function useChannelForSchema<K extends Topic<S>>(channelName: K) {\n    return useChannelInternal<S, K>(channelName, schema);\n  };\n}\n","\"use client\";\n\nimport type { ErebusPubSubClient } from \"@/client/core/pubsub\";\nimport { ErebusError } from \"@/internal/error\";\nimport { createContext, useContext } from \"react\";\n\ntype ErebusContext = {\n  makeClient: () => ErebusPubSubClient;\n} | null;\n\nexport const ErebusContext = createContext<ErebusContext>(null);\n\nexport function useErebus() {\n  const context = useContext(ErebusContext);\n  if (!context) {\n    throw new ErebusError(\n      \"useErebusContext must be used within a ErebusProvider\",\n    );\n  }\n  return context;\n}\n","import { hc } from \"hono/client\";\n\n// Import only the routes type, not the entire app with server dependencies\nimport type { AppType as ServerRoutes } from \"./app\";\n\n// Re-export the AppType for client usage\nexport type AppType = ServerRoutes;\n\n/**\n * Creates an RPC client for communicating with the Erebus server\n * This function can be safely imported by client-side code\n */\nexport const createRpcClient = (baseUrl: string) => {\n  return hc<AppType>(baseUrl);\n};\n","import { createRpcClient } from \"@/server/rpc\";\n\n/**\n * This will call the server to generate a grant token\n */\nexport class Authorize {\n  private client: ReturnType<typeof createRpcClient>;\n\n  constructor(baseUrl: string) {\n    console.log(\"[AUTHORIZE] Constructor called with baseUrl:\", baseUrl);\n    this.client = createRpcClient(baseUrl);\n    console.log(\"[AUTHORIZE] RPC client created successfully\");\n  }\n\n  /**\n   * Calls the server to generate a grant token\n   * @returns The grant JWT token\n   */\n  async generateToken(channel: string): Promise<string> {\n    console.log(\"[AUTHORIZE] generateToken called with channel:\", channel);\n    try {\n      console.log(\"[AUTHORIZE] Making POST request to generate-token endpoint\");\n      const response = await this.client[\"api\"][\"generate-token\"].$post({\n        json: {\n          channel,\n        },\n      });\n\n      if (!response.ok) {\n        console.error(\n          \"[AUTHORIZE] generateToken failed with status:\",\n          response.status,\n          response.statusText,\n        );\n        throw new Error(\n          `The auth call failed: ${response.status} ${response.statusText} ${await response.text()}`,\n        );\n      }\n\n      const data = await response.json();\n      console.log(\"[AUTHORIZE] generateToken successful, token generated\");\n      return data.grant_jwt;\n    } catch (error) {\n      console.error(\n        \"[AUTHORIZE] generateToken error:\",\n        error instanceof Error ? error.message : \"Unknown error\",\n      );\n      throw new Error(\n        `Failed to generate token: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n      );\n    }\n  }\n\n  /**\n   * Calls the server health check endpoint\n   * @returns Promise with health check response\n   */\n  async healthCheck() {\n    console.log(\"[AUTHORIZE] healthCheck called\");\n    try {\n      console.log(\n        \"[AUTHORIZE] Making GET request to health-not-meaningful endpoint\",\n      );\n      const response = await this.client[\"api\"][\"health-not-meaningful\"].$get();\n      const data = await response.json();\n      console.log(\"[AUTHORIZE] healthCheck successful, response received\");\n      return data;\n    } catch (error) {\n      console.error(\n        \"[AUTHORIZE] healthCheck error:\",\n        error instanceof Error ? error.message : \"Unknown error\",\n      );\n      throw new Error(\n        `Health check failed: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n      );\n    }\n  }\n\n  /**\n   * Calls the server to generate a test token\n   * @returns Promise with the test token response\n   */\n  async generateTestToken() {\n    console.log(\"[AUTHORIZE] generateTestToken called\");\n    try {\n      console.log(\n        \"[AUTHORIZE] Making GET request to generate-token-test endpoint\",\n      );\n      const response = await this.client[\"api\"][\"generate-token-test\"].$get();\n\n      if (!response.ok) {\n        console.error(\n          \"[AUTHORIZE] generateTestToken failed with status:\",\n          response.status,\n        );\n        const errorData = await response.json();\n        console.log(\"[AUTHORIZE] generateTestToken error response:\", errorData);\n        return errorData;\n      }\n\n      const data = await response.json();\n      console.log(\n        \"[AUTHORIZE] generateTestToken successful, test token generated\",\n      );\n      return data;\n    } catch (error) {\n      console.error(\n        \"[AUTHORIZE] generateTestToken error:\",\n        error instanceof Error ? error.message : \"Unknown error\",\n      );\n      throw new Error(\n        `Failed to generate test token: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n      );\n    }\n  }\n}\n","import { createConsola } from \"consola\";\n\nexport const logger = createConsola({\n  level: 3,\n  formatOptions: {\n    colors: true,\n    date: true,\n    compact: false,\n    columns:\n      typeof process !== \"undefined\" && process.stdout && process.stdout.columns\n        ? process.stdout.columns\n        : 80,\n  },\n  defaults: {\n    tag: \"Erebus\",\n  },\n});\n","import { z } from \"zod\";\n\n// Preserve server-provided timestamp; coerce string/number/Date into Date\nexport const MessageBodySchema = z\n  .object({\n    id: z.string(), // globally unique, assigned by Erebus\n    topic: z.string().min(1), // room / topic (trust **our** routing, not client)\n    senderId: z.string().min(1), // derived from JWT / session\n    seq: z.string().min(1), // monotonic per channel\n    sentAt: z.coerce.date(), // server clock - set ONCE at ingress time, never overwritten\n    payload: z.string(), // string or object - allows client correlation data\n    // Performance instrumentation timestamps (optional, only in debug mode) - ALL MONOTONIC\n    t_ingress: z.number().optional(), // high-res timestamp when message received\n    t_enqueued: z.number().optional(), // after auth/routing, ready to broadcast\n    t_broadcast_begin: z.number().optional(), // before first socket write\n    t_ws_write_end: z.number().optional(), // after all socket writes complete\n    t_broadcast_end: z.number().optional(), // after all subscriber writes for this message are done\n    // Client-side correlation fields (optional)\n    clientMsgId: z.uuid().optional(), // client-generated correlation id\n    clientPublishTs: z.number().optional(), // client publish timestamp (wall clock ms since epoch)\n  })\n  .strict();\n\nexport type MessageBody = z.infer<typeof MessageBodySchema>;\n","import { z } from \"zod\";\nimport { MessageBodySchema } from \"./messageBody\";\n\n/** Optional but recommended: correlate requests ↔ acks */\nconst RequestId = z.string().min(1).optional();\n\n/** Client → Server */\nconst ConnectPacket = z.object({\n  packetType: z.literal(\"connect\"),\n  grantJWT: z.string().min(1),\n});\n\nconst SubscribePacket = z.object({\n  packetType: z.literal(\"subscribe\"),\n  requestId: RequestId,\n  topic: z.string().min(1),\n});\n\nconst UnsubscribePacket = z.object({\n  packetType: z.literal(\"unsubscribe\"),\n  requestId: RequestId,\n  topic: z.string().min(1),\n});\n\nconst PresencePacket = z.object({\n  packetType: z.literal(\"presence\"),\n  clientId: z.string().min(1),\n  topic: z.string().min(1),\n  status: z.enum([\"online\", \"offline\"]),\n});\n\nconst PublishPacket = z.object({\n  packetType: z.literal(\"publish\"),\n  ack: z.boolean().optional(),\n  requestId: RequestId,\n  topic: z.string().min(1),\n  payload: MessageBodySchema,\n  clientMsgId: z.string().min(1), // for idempotency (required for ACKs)\n});\n\n/** Server → Client (ACK) */\n// Base ACK structure - all ACKs start with type \"ack\"\nconst BaseAck = z.object({\n  type: z.literal(\"ack\"),\n  path: z.enum([\"publish\", \"subscribe\", \"unsubscribe\"]),\n  seq: z.string().min(1),\n  serverAssignedId: z.string().min(1),\n  clientMsgId: z.string().min(1),\n});\n\n// Publish ACK - success case\nconst AckPublishOk = BaseAck.extend({\n  path: z.literal(\"publish\"),\n  topic: z.string().min(1),\n  result: z.object({\n    ok: z.literal(true),\n    t_ingress: z.number(), // ms epoch\n  }),\n});\n\n// Publish ACK - error case\nconst AckPublishErr = BaseAck.extend({\n  path: z.literal(\"publish\"),\n  topic: z.string().min(1),\n  result: z.object({\n    ok: z.literal(false),\n    code: z.enum([\n      \"UNAUTHORIZED\",\n      \"FORBIDDEN\",\n      \"INVALID\",\n      \"RATE_LIMITED\",\n      \"INTERNAL\",\n    ]),\n    message: z.string().min(1),\n  }),\n});\n\n// Subscribe/Unsubscribe ACK\nconst AckSubscription = BaseAck.extend({\n  path: z.enum([\"subscribe\", \"unsubscribe\"]),\n  topic: z.string().min(1),\n  result: z.object({\n    ok: z.literal(true),\n    status: z.enum([\"subscribed\", \"unsubscribed\"]),\n  }),\n});\n\n/** Master ACK union discriminated by path */\nconst AckResultSchema = z.discriminatedUnion(\"path\", [\n  AckPublishOk,\n  AckPublishErr,\n  AckSubscription,\n]);\n\nconst AckPacket = z.object({\n  packetType: z.literal(\"ack\"),\n  clientMsgId: RequestId, // echo whatever the client sent (or null/undefined)\n  result: AckResultSchema,\n});\n\n/** Master envelope */\nexport const PacketEnvelopeSchema = z.discriminatedUnion(\"packetType\", [\n  ConnectPacket,\n  SubscribePacket,\n  UnsubscribePacket,\n  PresencePacket,\n  PublishPacket,\n  AckPacket,\n]);\n\nexport type PacketEnvelope = z.infer<typeof PacketEnvelopeSchema>;\n\n// Export individual packet types\nexport type ConnectPacketType = z.infer<typeof ConnectPacket>;\nexport type SubscribePacketType = z.infer<typeof SubscribePacket>;\nexport type UnsubscribePacketType = z.infer<typeof UnsubscribePacket>;\nexport type PresencePacketType = z.infer<typeof PresencePacket>;\nexport type PublishPacketType = z.infer<typeof PublishPacket>;\nexport type AckPacketType = z.infer<typeof AckPacket>;\n\n// Export ACK types\nexport type AckType = z.infer<typeof AckResultSchema>;\nexport type AckPublishOkType = z.infer<typeof AckPublishOk>;\nexport type AckPublishErrType = z.infer<typeof AckPublishErr>;\nexport type AckSubscriptionType = z.infer<typeof AckSubscription>;\n\n// Export schema objects for parsing\nexport {\n  ConnectPacket,\n  SubscribePacket,\n  UnsubscribePacket,\n  PresencePacket,\n  PublishPacket,\n  AckPacket,\n  AckPublishOk,\n  AckPublishErr,\n  AckSubscription,\n  BaseAck,\n};\n\n// Export base ACK structure\nexport type BaseAckType = z.infer<typeof BaseAck>;\n","import { logger } from \"@/internal/logger/consola\";\nimport {\n  PacketEnvelopeSchema,\n  type PacketEnvelope,\n  AckPublishOk,\n  AckPublishErr,\n  AckSubscription,\n  PresencePacket,\n} from \"@repo/schemas/packetEnvelope\";\nimport { MessageBodySchema, type MessageBody } from \"@repo/schemas/messageBody\";\n\nexport function encodeEnvelope(pkt: PacketEnvelope): string {\n  logger.info(\"[encodeEnvelope] called\", { packetType: pkt.packetType });\n  // validate before sending so bugs surface on the client side\n  logger.info(\"[encodeEnvelope] validating packet\", {\n    packetType: pkt.packetType,\n  });\n  PacketEnvelopeSchema.parse(pkt);\n  logger.info(\"[encodeEnvelope] packet validated\", {\n    packetType: pkt.packetType,\n  });\n  const encoded = JSON.stringify(pkt);\n  logger.info(\"[encodeEnvelope] packet encoded\", {\n    packetType: pkt.packetType,\n    encodedLength: encoded.length,\n  });\n  return encoded;\n}\n\nexport function parseServerFrame(raw: string): PacketEnvelope | null {\n  logger.info(\"[parseServerFrame] called\", { rawLength: raw.length });\n\n  // Basic validation\n  if (!raw || typeof raw !== \"string\" || raw.trim().length === 0) {\n    logger.warn(\"[parseServerFrame] Invalid raw data\", { raw });\n    return null;\n  }\n\n  try {\n    logger.info(\"[parseServerFrame] parsing JSON\");\n    const data = JSON.parse(raw);\n    logger.info(\"[parseServerFrame] JSON parsed\", { keys: Object.keys(data) });\n\n    // Additional validation before schema parsing\n    if (!data || typeof data !== \"object\") {\n      logger.warn(\"[parseServerFrame] Parsed data is not an object\", { data });\n      return null;\n    }\n\n    // Check if it's an ACK packet or message packet\n    if (data.packetType === \"ack\") {\n      logger.info(\"[parseServerFrame] validating ACK packet schema\");\n      // Handle ACK packets with custom parsing due to duplicate discriminator values\n      const parsed = parseAckPacket(data);\n      if (parsed) {\n        logger.info(\"[parseServerFrame] ACK packet validated\", {\n          clientMsgId: data.clientMsgId,\n        });\n        return parsed;\n      } else {\n        logger.warn(\"[parseServerFrame] ACK packet parsing failed\");\n        return null;\n      }\n    } else if (data.packetType === \"presence\") {\n      logger.info(\"[parseServerFrame] validating presence packet schema\");\n      const presence = PresencePacket.parse(data);\n      logger.info(\"[parseServerFrame] presence packet validated\", {\n        topic: presence.topic,\n        clientId: presence.clientId,\n      });\n      return presence as PacketEnvelope;\n    } else {\n      // Legacy message parsing for backward compatibility\n      if (!data.topic || typeof data.topic !== \"string\") {\n        logger.warn(\"[parseServerFrame] Missing or invalid topic\", { data });\n        return null;\n      }\n\n      logger.info(\"[parseServerFrame] validating message schema\");\n      const parsed = MessageBodySchema.parse(data);\n      logger.info(\"[parseServerFrame] message schema validated\", {\n        topic: parsed.topic,\n      });\n\n      // Convert to publish packet format\n      return {\n        packetType: \"publish\",\n        topic: parsed.topic,\n        payload: parsed,\n      } as PacketEnvelope;\n    }\n  } catch (err) {\n    logger.warn(\n      \"[parseServerFrame] failed\",\n      { error: err instanceof Error ? err.message : String(err) },\n      raw,\n    );\n    return null;\n  }\n}\n\n/**\n * Parse ACK packets with manual handling to avoid discriminated union issues\n */\nfunction parseAckPacket(data: any): PacketEnvelope | null {\n  try {\n    // Manual validation and parsing without relying on discriminated unions\n    if (data.packetType !== \"ack\") {\n      return null;\n    }\n\n    if (!data.result || typeof data.result !== \"object\") {\n      return null;\n    }\n\n    const ackResult = data.result;\n    const path = ackResult.path;\n\n    if (path === \"subscribe\" || path === \"unsubscribe\") {\n      // Handle subscription ACKs\n      const subscriptionAck = AckSubscription.parse(ackResult);\n      return {\n        packetType: \"ack\",\n        clientMsgId: data.clientMsgId,\n        result: subscriptionAck,\n      };\n    } else if (path === \"publish\") {\n      // Handle publish ACKs by checking the result structure\n      if (\n        ackResult.result &&\n        typeof ackResult.result === \"object\" &&\n        \"ok\" in ackResult.result\n      ) {\n        if (ackResult.result.ok) {\n          // Success ACK\n          const successAck = AckPublishOk.parse(ackResult);\n          return {\n            packetType: \"ack\",\n            clientMsgId: data.clientMsgId,\n            result: successAck,\n          };\n        } else {\n          // Error ACK\n          const errorAck = AckPublishErr.parse(ackResult);\n          return {\n            packetType: \"ack\",\n            clientMsgId: data.clientMsgId,\n            result: errorAck,\n          };\n        }\n      }\n    }\n\n    logger.warn(\"[parseAckPacket] Unknown ACK type\", { path });\n    return null;\n  } catch (error) {\n    logger.warn(\"[parseAckPacket] Failed to parse ACK packet\", { error });\n    return null;\n  }\n}\n\n/**\n * Legacy function for backward compatibility\n * @deprecated Use parseServerFrame instead\n */\nexport function parseMessageBody(raw: string): MessageBody | null {\n  logger.info(\"[parseMessageBody] called (legacy)\", { rawLength: raw.length });\n  const packet = parseServerFrame(raw);\n  if (packet && packet.packetType === \"publish\") {\n    return packet.payload;\n  }\n  return null;\n}\n","export function validateWebSocketUrl(raw?: string): boolean {\n  if (!raw) {\n    return false;\n  }\n\n  try {\n    const url = new URL(raw);\n    if (url.protocol !== \"ws:\" && url.protocol !== \"wss:\") {\n      return false;\n    }\n    // Ensure wss is used on non-localhost URLs\n    if (!url.hostname.includes(\"localhost\") && url.protocol === \"ws:\") {\n      return false;\n    }\n    return true;\n  } catch {\n    return false;\n  }\n}\n","import { logger } from \"@/internal/logger/consola\";\n\nexport function backoff(attempt: number, capMs = 5000) {\n  const base = 250 * Math.pow(2, attempt);\n  const jitter = Math.floor(Math.random() * 200);\n  const delay = Math.min(capMs, base) + jitter;\n  logger.info(\"backoff computed\", { attempt, capMs, base, jitter, delay });\n  return delay;\n}\n","import type { PacketEnvelope } from \"@repo/schemas/packetEnvelope\";\nimport type {\n  IConnectionManager,\n  ConnectionState,\n  ConnectionConfig,\n  OnMessage,\n  Logger,\n  OpenOptions,\n} from \"./interfaces\";\nimport { encodeEnvelope } from \"@/client/core/wire\";\nimport { logger } from \"@/internal/logger/consola\";\nimport { validateWebSocketUrl } from \"@/internal/validateWebSocketUrl\";\nimport { backoff } from \"../backoff\";\n\nexport class BackpressureError extends Error {}\nexport class NotConnectedError extends Error {}\n\n/**\n * Manages WebSocket connection lifecycle and basic communication\n */\nexport class ConnectionManager implements IConnectionManager {\n  #url: string;\n  #channel: string;\n  #ws?: WebSocket;\n  #retry = 0;\n  #state: ConnectionState = \"idle\";\n  #connectionId: string;\n  #grant: string;\n  #autoReconnect: boolean;\n  #onMessage: OnMessage;\n  #log: Logger;\n  #debugHexDump: boolean;\n\n  constructor(config: ConnectionConfig) {\n    this.#connectionId = `conn_${Math.random().toString(36).substring(2, 8)}`;\n    logger.info(`[${this.#connectionId}] ConnectionManager created`, {\n      url: config.url,\n    });\n\n    if (!validateWebSocketUrl(config.url)) {\n      logger.error(`[${this.#connectionId}] Invalid WebSocket URL`, {\n        url: config.url,\n      });\n      throw new Error(\"Invalid WebSocket URL\");\n    }\n\n    this.#url = config.url;\n    this.#channel = config.channel;\n    this.#grant = \"\"; // Initialize empty, will be set when opening\n    this.#onMessage = config.onMessage;\n    this.#log = config.log ?? (() => {});\n    this.#autoReconnect = config.autoReconnect ?? false;\n    this.#debugHexDump = config.debugHexDump ?? false;\n  }\n\n  // Getters\n  get state(): ConnectionState {\n    return this.#state;\n  }\n\n  get isConnected(): boolean {\n    return this.#state === \"open\";\n  }\n\n  get isConnecting(): boolean {\n    return this.#state === \"connecting\";\n  }\n\n  get isClosed(): boolean {\n    return this.#state === \"closed\";\n  }\n\n  get isIdle(): boolean {\n    return this.#state === \"idle\";\n  }\n\n  get connectionId(): string {\n    return this.#connectionId;\n  }\n\n  get url(): string {\n    return this.#url;\n  }\n\n  get bufferedAmount(): number {\n    return this.#ws?.bufferedAmount ?? 0;\n  }\n\n  get readyState(): number | undefined {\n    return this.#ws?.readyState;\n  }\n\n  get channel(): string {\n    return this.#channel;\n  }\n\n  async open(options: OpenOptions): Promise<void> {\n    logger.info(`[${this.#connectionId}] Opening connection`, {\n      timeout: options.timeout,\n    });\n    this.#log(\"info\", \"connection.open called\");\n\n    // Prevent multiple simultaneous connection attempts\n    if (this.#state === \"connecting\" || this.#state === \"open\") {\n      logger.info(\n        `[${this.#connectionId}] Connection already ${this.#state}, returning early`,\n      );\n      return;\n    }\n\n    // Validate that channel is set before connecting\n    if (!this.#channel || this.#channel.trim().length === 0) {\n      const error = \"Channel must be set before opening connection\";\n      logger.error(`[${this.#connectionId}] ${error}`, {\n        channel: this.#channel,\n      });\n      throw new Error(error);\n    }\n\n    logger.info(`[${this.#connectionId}] Setting state to connecting`);\n    this.#state = \"connecting\";\n\n    // Store the grant for potential reconnections\n    this.#grant = options.grant;\n\n    const ws = await this.#createWebSocket(options.grant);\n    this.#ws = ws;\n    this.#setupWebSocketListeners(ws);\n\n    if (options.timeout) {\n      logger.info(`[${this.#connectionId}] Setting connection timeout`, {\n        timeout: options.timeout,\n      });\n      const timeoutId = setTimeout(() => {\n        logger.error(`[${this.#connectionId}] Connection timeout reached`, {\n          timeout: options.timeout,\n        });\n        ws.close();\n        throw new Error(\"Connection timeout\");\n      }, options.timeout);\n\n      await new Promise<void>((res) =>\n        ws.addEventListener(\n          \"open\",\n          () => {\n            logger.info(\n              `[${this.#connectionId}] Connection opened within timeout, clearing timeout`,\n            );\n            clearTimeout(timeoutId);\n            res();\n          },\n          { once: true },\n        ),\n      );\n    } else {\n      logger.info(\n        `[${this.#connectionId}] Waiting for connection to open (no timeout)`,\n      );\n      await new Promise<void>((res) =>\n        ws.addEventListener(\n          \"open\",\n          () => {\n            logger.info(\n              `[${this.#connectionId}] Connection opened successfully`,\n            );\n            res();\n          },\n          { once: true },\n        ),\n      );\n    }\n  }\n\n  close(): void {\n    logger.info(\n      `[${this.#connectionId}] Connection close called (url: ${this.#url})`,\n    );\n    this.#log(\"info\", `connection close called (url: ${this.#url})`);\n\n    // Prevent further operations\n    this.#state = \"closed\";\n    logger.info(\n      `[${this.#connectionId}] Connection state set to closed (url: ${this.#url})`,\n    );\n\n    // Clear any pending timeouts and close WebSocket\n    if (this.#ws) {\n      try {\n        // Only close if not already closed\n        if (\n          this.#ws.readyState === WebSocket.OPEN ||\n          this.#ws.readyState === WebSocket.CONNECTING\n        ) {\n          this.#ws.close();\n        }\n      } catch (error) {\n        logger.warn(`[${this.#connectionId}] Error closing WebSocket`, {\n          error,\n        });\n      }\n      this.#ws = undefined;\n    }\n\n    logger.info(`[${this.#connectionId}] Connection closed and cleaned up`);\n  }\n\n  send(pkt: PacketEnvelope): void {\n    logger.info(`[${this.#connectionId}] Sending packet`, {\n      packetType: pkt.packetType,\n    });\n\n    // Validate packet\n    if (!pkt || typeof pkt !== \"object\") {\n      const error = \"Invalid packet: must be an object\";\n      logger.error(`[${this.#connectionId}] ${error}`, { pkt });\n      throw new Error(error);\n    }\n\n    if (!this.#ws || this.#ws.readyState !== WebSocket.OPEN) {\n      logger.error(\n        `[${this.#connectionId}] Cannot send packet - WebSocket not ready`,\n        {\n          hasWs: !!this.#ws,\n          readyState: this.#ws?.readyState,\n          state: this.#state,\n        },\n      );\n      throw new NotConnectedError(\n        \"Not connected readyState: \" + this.#ws?.readyState,\n      );\n    }\n\n    // Enhanced backpressure monitoring\n    const bufferedAmount = this.#ws.bufferedAmount;\n    if (bufferedAmount > 1_000_000) {\n      logger.error(\n        `[${this.#connectionId}] Critical backpressure - closing connection`,\n        {\n          buffered: bufferedAmount,\n          limit: 1_000_000,\n        },\n      );\n      this.#log(\"error\", \"critical backpressure; reconnecting\", {\n        buffered: bufferedAmount,\n      });\n      this.#ws.close();\n      throw new BackpressureError(\"Critical backpressure\");\n    }\n\n    try {\n      const encoded = encodeEnvelope(pkt);\n      logger.info(\n        `[ConnectionManager] [${this.#connectionId}] Packet encoded, sending via WebSocket`,\n        {\n          packetType: pkt.packetType,\n          encodedLength: encoded.length,\n        },\n      );\n      this.#ws.send(encoded);\n    } catch (error) {\n      logger.error(`[${this.#connectionId}] Error sending packet`, {\n        error,\n        packetType: pkt.packetType,\n      });\n      throw error;\n    }\n  }\n\n  /**\n   * Send raw string data directly through WebSocket (for heartbeats, etc.)\n   */\n  sendRaw(data: string): void {\n    logger.info(`[${this.#connectionId}] Sending raw data`, {\n      dataType: typeof data,\n      dataLength: data.length,\n    });\n\n    if (!this.#ws || this.#ws.readyState !== WebSocket.OPEN) {\n      logger.error(\n        `[${this.#connectionId}] Cannot send raw data - WebSocket not ready`,\n        {\n          hasWs: !!this.#ws,\n          readyState: this.#ws?.readyState,\n          state: this.#state,\n        },\n      );\n      throw new NotConnectedError(\n        \"Not connected readyState: \" + this.#ws?.readyState,\n      );\n    }\n\n    try {\n      this.#ws.send(data);\n      logger.info(`[${this.#connectionId}] Raw data sent successfully`);\n    } catch (error) {\n      logger.error(`[${this.#connectionId}] Error sending raw data`, {\n        error,\n        dataLength: data.length,\n      });\n      throw error;\n    }\n  }\n\n  setChannel(channel: string): void {\n    logger.info(`[${this.#connectionId}] Setting channel`, { channel });\n\n    // Validate channel\n    if (\n      !channel ||\n      typeof channel !== \"string\" ||\n      channel.trim().length === 0\n    ) {\n      const error = \"Invalid channel: must be a non-empty string\";\n      logger.error(`[${this.#connectionId}] ${error}`, { channel });\n      throw new Error(error);\n    }\n\n    this.#channel = channel;\n    logger.info(`[${this.#connectionId}] Channel set successfully`, {\n      channel: this.#channel,\n    });\n  }\n\n  async #createWebSocket(grant: string): Promise<WebSocket> {\n    const connectUrl = new URL(this.#url);\n    connectUrl.searchParams.set(\"grant\", grant);\n    logger.info(`[${this.#connectionId}] Creating WebSocket connection`, {\n      url: this.#url,\n      grant: grant.substring(0, 10) + \"...\", // Log partial grant for debugging\n    });\n\n    const ws = new WebSocket(connectUrl.toString());\n\n    try {\n      // Ensure we receive ArrayBuffer rather than Blob in browsers/JSDOM\n      if (\"binaryType\" in ws) {\n        (ws as WebSocket & { binaryType: string }).binaryType = \"arraybuffer\";\n      }\n    } catch {}\n\n    return ws;\n  }\n\n  #setupWebSocketListeners(ws: WebSocket): void {\n    ws.addEventListener(\n      \"open\",\n      () => {\n        logger.info(`[${this.#connectionId}] WebSocket opened successfully`);\n        this.#retry = 0;\n        this.#state = \"open\";\n        this.#log(\"info\", \"ws open\");\n      },\n      { once: true },\n    );\n\n    ws.addEventListener(\"message\", (ev) => {\n      this.#handleMessage(ev);\n    });\n\n    ws.addEventListener(\"close\", () => {\n      this.#log(\"warn\", \"ws close encountered\", { retry: this.#retry });\n      logger.warn(`[${this.#connectionId}] WebSocket close encountered`, {\n        retry: this.#retry,\n        state: this.#state,\n      });\n\n      // Only attempt reconnect if we're not already closed and auto-reconnect is enabled\n      if (this.#state !== \"closed\" && this.#autoReconnect) {\n        this.#reconnect();\n      } else {\n        // Mark as closed if not auto-reconnecting\n        this.#state = \"closed\";\n      }\n    });\n\n    ws.addEventListener(\"error\", (e) => {\n      this.#log(\"warn\", \"ws error\", e);\n      logger.warn(`[${this.#connectionId}] WebSocket error`, {\n        error: e,\n        state: this.#state,\n        readyState: ws.readyState,\n        url: this.#url,\n      });\n    });\n  }\n\n  async #handleMessage(ev: MessageEvent): Promise<void> {\n    this.#log(\"info\", \"ws message received\");\n\n    // Handle hex dump debugging\n    if (this.#debugHexDump) {\n      const hex = this.#getHexDump(ev.data);\n      console.log(`[${this.#connectionId}] WS message hex:`, hex);\n    }\n\n    try {\n      const dataStr = await this.#convertToString(ev.data);\n      if (dataStr.length === 0) {\n        logger.warn(`[${this.#connectionId}] Data string is empty, skipping`);\n        return;\n      }\n\n      // Forward to message processor via callback\n      this.#onMessage({ rawData: dataStr } as PacketEnvelope & {\n        rawData: string;\n      });\n    } catch (error) {\n      logger.error(`[${this.#connectionId}] Error handling message`, {\n        error,\n      });\n    }\n  }\n\n  #getHexDump(data: unknown): string {\n    if (typeof data === \"string\") {\n      return Buffer.from(data, \"utf8\").toString(\"hex\");\n    } else if (data instanceof ArrayBuffer) {\n      return Buffer.from(data).toString(\"hex\");\n    } else if (typeof data === \"object\" && data && \"arrayBuffer\" in data) {\n      // This is async, but for debug we'll return a placeholder\n      return \"[blob-data]\";\n    }\n    return \"\";\n  }\n\n  async #convertToString(data: unknown): Promise<string> {\n    if (typeof data === \"string\") {\n      return data;\n    } else if (typeof data === \"undefined\" || data === null) {\n      logger.warn(\n        `[${this.#connectionId}] Data is undefined or null, using empty string`,\n      );\n      return \"\";\n    } else if (\n      data &&\n      typeof data === \"object\" &&\n      \"arrayBuffer\" in data &&\n      typeof (data as { arrayBuffer: () => Promise<ArrayBuffer> })\n        .arrayBuffer === \"function\"\n    ) {\n      // Blob-like (supports arrayBuffer())\n      const arrayBuffer = await (\n        data as { arrayBuffer: () => Promise<ArrayBuffer> }\n      ).arrayBuffer();\n      const uint8 = new Uint8Array(arrayBuffer);\n      return new TextDecoder().decode(uint8);\n    } else if (typeof Buffer !== \"undefined\" && Buffer.isBuffer(data)) {\n      // Node Buffer\n      const buf = data as Buffer;\n      const uint8 = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n      return new TextDecoder().decode(uint8);\n    } else if (data instanceof ArrayBuffer) {\n      const uint8 = new Uint8Array(data);\n      return new TextDecoder().decode(uint8);\n    } else if (data instanceof Uint8Array) {\n      return new TextDecoder().decode(data);\n    } else {\n      return String(data);\n    }\n  }\n\n  #reconnect(): void {\n    if (this.#state === \"closed\" || this.#state === \"connecting\") {\n      logger.info(\n        `[${this.#connectionId}] Reconnect called but connection is ${this.#state}, ignoring`,\n      );\n      return;\n    }\n\n    logger.info(`[${this.#connectionId}] Starting reconnect process`);\n    this.#state = \"idle\"; // Reset to idle to allow reconnection\n\n    const bckOff = backoff(this.#retry, 5000);\n    this.#log(\"info\", \"scheduling reconnect\", { retry: this.#retry, bckOff });\n    logger.info(`[${this.#connectionId}] Scheduling reconnect`, {\n      retry: this.#retry,\n      backoff: bckOff,\n    });\n\n    this.#retry++;\n    setTimeout(() => {\n      logger.info(`[${this.#connectionId}] Executing scheduled reconnect`);\n      this.open({ grant: this.#grant, timeout: 5000 }).catch((error) => {\n        logger.error(`[${this.#connectionId}] Reconnect failed`, { error });\n        this.#state = \"closed\";\n      });\n    }, bckOff);\n  }\n}\n","import type { AckPacketType } from \"@repo/schemas/packetEnvelope\";\nimport type {\n  PendingPublish,\n  AckResponse,\n  PendingSubscription,\n  SubscriptionResponse,\n} from \"../types\";\nimport type { IAckManager } from \"./interfaces\";\nimport { logger } from \"@/internal/logger/consola\";\n\n/**\n * Manages ACK tracking and timeout handling for publish and subscription operations\n */\nexport class AckManager implements IAckManager {\n  #pendingPublishes = new Map<string, PendingPublish>();\n  #clientMsgIdToRequestId = new Map<string, string>();\n  #pendingSubscriptions = new Map<string, PendingSubscription>();\n  #subscriptionMsgIdToRequestId = new Map<string, string>();\n  #connectionId: string;\n\n  constructor(connectionId: string) {\n    this.#connectionId = connectionId;\n    logger.info(`[${this.#connectionId}] AckManager created`);\n  }\n\n  trackPublish(requestId: string, pending: PendingPublish): void {\n    logger.info(`[${this.#connectionId}] Tracking publish for ACK`, {\n      requestId,\n      clientMsgId: pending.clientMsgId,\n      topic: pending.topic,\n    });\n\n    this.#pendingPublishes.set(requestId, pending);\n    this.#clientMsgIdToRequestId.set(pending.clientMsgId, requestId);\n\n    // Set up timeout if specified\n    if (pending.timeoutId) {\n      logger.info(`[${this.#connectionId}] ACK timeout set`, {\n        requestId,\n        timeout: \"already configured\",\n      });\n    }\n  }\n\n  trackSubscription(requestId: string, pending: PendingSubscription): void {\n    logger.info(`[${this.#connectionId}] Tracking subscription for ACK`, {\n      requestId,\n      clientMsgId: pending.clientMsgId,\n      topic: pending.topic,\n      path: pending.path,\n      clientMsgIdType: typeof pending.clientMsgId,\n      clientMsgIdLength: pending.clientMsgId?.length,\n    });\n\n    this.#pendingSubscriptions.set(requestId, pending);\n    if (pending.clientMsgId) {\n      this.#subscriptionMsgIdToRequestId.set(pending.clientMsgId, requestId);\n      logger.info(`[${this.#connectionId}] Stored clientMsgId mapping`, {\n        clientMsgId: pending.clientMsgId,\n        requestId,\n        totalMappings: this.#subscriptionMsgIdToRequestId.size,\n      });\n    } else {\n      logger.info(\n        `[${this.#connectionId}] No clientMsgId provided for subscription tracking`,\n        {\n          requestId,\n          note: \"ACK matching will rely on other mechanisms\",\n        },\n      );\n    }\n\n    // Set up timeout if specified\n    if (pending.timeoutId) {\n      logger.info(`[${this.#connectionId}] Subscription ACK timeout set`, {\n        requestId,\n        timeout: \"already configured\",\n      });\n    }\n  }\n\n  handleAck(ackPacket: AckPacketType): void {\n    logger.info(`[${this.#connectionId}] Handling ACK packet`, {\n      clientMsgId: ackPacket.clientMsgId,\n      path: ackPacket.result.path,\n    });\n\n    // Route to appropriate handler based on ACK type\n    if (ackPacket.result.path === \"publish\") {\n      this.#handlePublishAck(ackPacket);\n    } else if (\n      ackPacket.result.path === \"subscribe\" ||\n      ackPacket.result.path === \"unsubscribe\"\n    ) {\n      this.#handleSubscriptionAck(ackPacket);\n    } else {\n      logger.warn(`[${this.#connectionId}] Unknown ACK path`, {\n        path: ackPacket.result.path,\n        clientMsgId: ackPacket.clientMsgId,\n      });\n    }\n  }\n\n  #handlePublishAck(ackPacket: AckPacketType): void {\n    const clientMsgId = ackPacket.clientMsgId;\n    if (!clientMsgId) {\n      logger.warn(\n        `[${this.#connectionId}] Publish ACK packet missing clientMsgId`,\n      );\n      return;\n    }\n\n    const requestId = this.#clientMsgIdToRequestId.get(clientMsgId);\n    if (!requestId) {\n      logger.warn(\n        `[${this.#connectionId}] No requestId found for publish clientMsgId`,\n        {\n          clientMsgId,\n        },\n      );\n      return;\n    }\n\n    const pending = this.#pendingPublishes.get(requestId);\n    if (!pending) {\n      logger.warn(`[${this.#connectionId}] No pending publish found for ACK`, {\n        requestId,\n        clientMsgId,\n      });\n      return;\n    }\n\n    // Clear timeout\n    if (pending.timeoutId) {\n      clearTimeout(pending.timeoutId);\n    }\n\n    // Remove from pending\n    this.#pendingPublishes.delete(requestId);\n    this.#clientMsgIdToRequestId.delete(clientMsgId);\n\n    // Create response based on ACK type\n    const response = this.#createAckResponse(ackPacket, pending);\n\n    logger.info(`[${this.#connectionId}] Calling publish ACK callback`, {\n      requestId,\n      clientMsgId,\n      success: response.success,\n    });\n\n    try {\n      pending.callback(response);\n    } catch (error) {\n      logger.error(`[${this.#connectionId}] Error in publish ACK callback`, {\n        error,\n        requestId,\n        clientMsgId,\n      });\n    }\n  }\n\n  #handleSubscriptionAck(ackPacket: AckPacketType): void {\n    const clientMsgId = ackPacket.clientMsgId;\n\n    // For subscription ACKs, clientMsgId might be optional/generated by server\n    let requestId: string | undefined;\n    let pending: PendingSubscription | undefined;\n\n    logger.info(`[${this.#connectionId}] Processing subscription ACK`, {\n      path: ackPacket.result.path,\n      topic: ackPacket.result.topic,\n      clientMsgId,\n      pendingSubscriptionCount: this.#pendingSubscriptions.size,\n      subscriptionMsgIdMappings: Array.from(\n        this.#subscriptionMsgIdToRequestId.entries(),\n      ).map(([k, v]) => `${k} -> ${v}`),\n    });\n\n    if (clientMsgId) {\n      requestId = this.#subscriptionMsgIdToRequestId.get(clientMsgId);\n      logger.info(\n        `[${this.#connectionId}] Looking up clientMsgId in mappings`,\n        {\n          clientMsgId,\n          foundRequestId: requestId,\n        },\n      );\n\n      if (requestId) {\n        pending = this.#pendingSubscriptions.get(requestId);\n        logger.info(\n          `[${this.#connectionId}] Looking up requestId in pending subscriptions`,\n          {\n            requestId,\n            foundPending: !!pending,\n          },\n        );\n      } else {\n        // Fallback: Check if clientMsgId directly matches a pending requestId\n        // This handles cases where server echoes requestId as clientMsgId\n        logger.info(\n          `[${this.#connectionId}] No direct mapping found, checking if clientMsgId matches a requestId`,\n          {\n            clientMsgId,\n          },\n        );\n        pending = this.#pendingSubscriptions.get(clientMsgId);\n        if (pending) {\n          requestId = clientMsgId;\n          logger.info(\n            `[${this.#connectionId}] Found pending subscription by matching clientMsgId to requestId`,\n            {\n              clientMsgId,\n              requestId,\n            },\n          );\n        }\n      }\n    }\n\n    if (!pending) {\n      // No tracked subscription - this is normal for optimistic subscriptions\n      logger.info(\n        `[${this.#connectionId}] Received untracked subscription ACK`,\n        {\n          path: ackPacket.result.path,\n          topic: ackPacket.result.topic,\n          clientMsgId,\n          note: \"This is normal for optimistic subscriptions\",\n        },\n      );\n      return;\n    }\n\n    logger.info(`[${this.#connectionId}] Handling tracked subscription ACK`, {\n      requestId,\n      clientMsgId,\n      topic: pending.topic,\n      path: pending.path,\n    });\n\n    // Clear timeout\n    if (pending.timeoutId) {\n      clearTimeout(pending.timeoutId);\n    }\n\n    // Remove from pending\n    this.#pendingSubscriptions.delete(requestId!);\n    if (clientMsgId) {\n      this.#subscriptionMsgIdToRequestId.delete(clientMsgId);\n    }\n\n    // Create response based on ACK type\n    const response = this.#createSubscriptionResponse(ackPacket, pending);\n\n    logger.info(`[${this.#connectionId}] Calling subscription ACK callback`, {\n      requestId,\n      clientMsgId,\n      topic: pending.topic,\n      success: response.success,\n    });\n\n    try {\n      pending.callback(response);\n    } catch (error) {\n      logger.error(\n        `[${this.#connectionId}] Error in subscription ACK callback`,\n        {\n          error,\n          requestId,\n          clientMsgId,\n          topic: pending.topic,\n        },\n      );\n    }\n  }\n\n  handlePublishTimeout(requestId: string): void {\n    logger.warn(`[${this.#connectionId}] Publish ACK timeout`, { requestId });\n\n    const pending = this.#pendingPublishes.get(requestId);\n    if (!pending) {\n      return; // Already handled\n    }\n\n    // Remove from pending\n    this.#pendingPublishes.delete(requestId);\n    this.#clientMsgIdToRequestId.delete(pending.clientMsgId);\n\n    // Create timeout error response\n    const response: AckResponse = {\n      success: false,\n      ack: {} as AckPacketType, // Empty ACK since we didn't receive one\n      error: {\n        code: \"TIMEOUT\",\n        message: \"Publish ACK not received within timeout\",\n      },\n      topic: pending.topic,\n    };\n\n    try {\n      pending.callback(response);\n    } catch (error) {\n      logger.error(\n        `[${this.#connectionId}] Error in publish timeout callback`,\n        {\n          error,\n          requestId,\n        },\n      );\n    }\n  }\n\n  handleSubscriptionTimeout(requestId: string): void {\n    logger.warn(`[${this.#connectionId}] Subscription ACK timeout`, {\n      requestId,\n    });\n\n    const pending = this.#pendingSubscriptions.get(requestId);\n    if (!pending) {\n      return; // Already handled\n    }\n\n    // Remove from pending\n    this.#pendingSubscriptions.delete(requestId);\n    if (pending.clientMsgId) {\n      this.#subscriptionMsgIdToRequestId.delete(pending.clientMsgId);\n    }\n\n    // Create timeout error response\n    const response: SubscriptionResponse = {\n      success: false,\n      error: {\n        code: \"TIMEOUT\",\n        message: \"Subscription ACK not received within timeout\",\n      },\n      topic: pending.topic,\n      path: pending.path,\n    };\n\n    try {\n      pending.callback(response);\n    } catch (error) {\n      logger.error(\n        `[${this.#connectionId}] Error in subscription timeout callback`,\n        {\n          error,\n          requestId,\n          topic: pending.topic,\n        },\n      );\n    }\n  }\n\n  cleanup(reason: string): void {\n    logger.info(`[${this.#connectionId}] Cleaning up pending operations`, {\n      publishCount: this.#pendingPublishes.size,\n      subscriptionCount: this.#pendingSubscriptions.size,\n      reason,\n    });\n\n    // Cleanup pending publishes\n    for (const [requestId, pending] of this.#pendingPublishes) {\n      // Clear timeout\n      if (pending.timeoutId) {\n        clearTimeout(pending.timeoutId);\n      }\n\n      // Create error response\n      const response: AckResponse = {\n        success: false,\n        ack: {} as AckPacketType,\n        error: {\n          code: \"CONNECTION_ERROR\",\n          message: reason,\n        },\n        topic: pending.topic,\n      };\n\n      try {\n        pending.callback(response);\n      } catch (error) {\n        logger.error(\n          `[${this.#connectionId}] Error in publish cleanup callback`,\n          {\n            error,\n            requestId,\n            clientMsgId: pending.clientMsgId,\n          },\n        );\n      }\n    }\n\n    // Cleanup pending subscriptions\n    for (const [requestId, pending] of this.#pendingSubscriptions) {\n      // Clear timeout\n      if (pending.timeoutId) {\n        clearTimeout(pending.timeoutId);\n      }\n\n      // Create error response\n      const response: SubscriptionResponse = {\n        success: false,\n        error: {\n          code: \"CONNECTION_ERROR\",\n          message: reason,\n        },\n        topic: pending.topic,\n        path: pending.path,\n      };\n\n      try {\n        pending.callback(response);\n      } catch (error) {\n        logger.error(\n          `[${this.#connectionId}] Error in subscription cleanup callback`,\n          {\n            error,\n            requestId,\n            clientMsgId: pending.clientMsgId,\n            topic: pending.topic,\n          },\n        );\n      }\n    }\n\n    this.#pendingPublishes.clear();\n    this.#clientMsgIdToRequestId.clear();\n    this.#pendingSubscriptions.clear();\n    this.#subscriptionMsgIdToRequestId.clear();\n  }\n\n  getPendingCount(): number {\n    return this.#pendingPublishes.size;\n  }\n\n  getPendingSubscriptionCount(): number {\n    return this.#pendingSubscriptions.size;\n  }\n\n  #createAckResponse(\n    ackPacket: AckPacketType,\n    pending: PendingPublish,\n  ): AckResponse {\n    if (ackPacket.result.path === \"publish\") {\n      if (\"result\" in ackPacket.result && ackPacket.result.result.ok) {\n        // Success ACK\n        return {\n          success: true,\n          ack: ackPacket,\n          seq: ackPacket.result.seq,\n          serverMsgId: ackPacket.result.serverAssignedId,\n          topic: ackPacket.result.topic!,\n        };\n      } else if (\"result\" in ackPacket.result && !ackPacket.result.result.ok) {\n        // Error ACK\n        return {\n          success: false,\n          ack: ackPacket,\n          error: {\n            code: ackPacket.result.result.code,\n            message: ackPacket.result.result.message,\n          },\n          topic: ackPacket.result.topic!,\n        };\n      } else {\n        // Malformed ACK\n        return {\n          success: false,\n          ack: ackPacket,\n          error: {\n            code: \"MALFORMED_ACK\",\n            message: \"ACK packet has invalid structure\",\n          },\n          topic: pending.topic,\n        };\n      }\n    } else {\n      // Non-publish ACK (subscription, etc.) - these are handled elsewhere or ignored\n      logger.info(`[${this.#connectionId}] Received non-publish ACK`, {\n        path: ackPacket.result.path,\n        clientMsgId: ackPacket.clientMsgId,\n        note: \"Subscription ACKs are not tracked in AckManager\",\n      });\n\n      // Return a generic error for non-publish ACKs that somehow got tracked\n      return {\n        success: false,\n        ack: ackPacket,\n        error: {\n          code: \"INVALID_ACK_TYPE\",\n          message: \"Received non-publish ACK for publish operation\",\n        },\n        topic: pending.topic,\n      };\n    }\n  }\n\n  #createSubscriptionResponse(\n    ackPacket: AckPacketType,\n    pending: PendingSubscription,\n  ): SubscriptionResponse {\n    if (\n      ackPacket.result.path === \"subscribe\" ||\n      ackPacket.result.path === \"unsubscribe\"\n    ) {\n      if (\"result\" in ackPacket.result) {\n        const result = ackPacket.result.result;\n\n        if (result.ok) {\n          // Success ACK - has status property\n          return {\n            success: true,\n            ack: ackPacket,\n            topic: ackPacket.result.topic!,\n            status: result.status as \"subscribed\" | \"unsubscribed\",\n            path: ackPacket.result.path,\n          };\n        } else {\n          // Error ACK - has code and message properties\n          const errorResult = result as any; // Type assertion since we know it's an error case\n          return {\n            success: false,\n            ack: ackPacket,\n            error: {\n              code: errorResult.code || \"SUBSCRIPTION_ERROR\",\n              message: errorResult.message || \"Subscription operation failed\",\n            },\n            topic: ackPacket.result.topic!,\n            path: ackPacket.result.path,\n          };\n        }\n      } else {\n        // Malformed subscription ACK\n        return {\n          success: false,\n          ack: ackPacket,\n          error: {\n            code: \"MALFORMED_ACK\",\n            message: \"Subscription ACK packet has invalid structure\",\n          },\n          topic: pending.topic,\n          path: pending.path,\n        };\n      }\n    } else {\n      // Wrong ACK type for subscription\n      return {\n        success: false,\n        ack: ackPacket,\n        error: {\n          code: \"INVALID_ACK_TYPE\",\n          message: \"Received non-subscription ACK for subscription operation\",\n        },\n        topic: pending.topic,\n        path: pending.path,\n      };\n    }\n  }\n}\n","import type { ISubscriptionManager, SubscriptionStatus } from \"./interfaces\";\nimport { logger } from \"@/internal/logger/consola\";\n\n/**\n * Manages topic subscriptions and optimistic subscription tracking\n */\nexport class SubscriptionManager implements ISubscriptionManager {\n  #subs = new Set<string>();\n  #subscribedTopics = new Set<string>();\n  #unsubscribedTopics = new Set<string>();\n  #connectionId: string;\n\n  constructor(connectionId: string) {\n    this.#connectionId = connectionId;\n    logger.info(`[${this.#connectionId}] SubscriptionManager created`);\n  }\n\n  // Getters\n  get subscriptions(): string[] {\n    return Array.from(this.#subs);\n  }\n\n  get subscribedTopics(): string[] {\n    return Array.from(this.#subscribedTopics).filter(\n      (topic) => !this.#unsubscribedTopics.has(topic),\n    );\n  }\n\n  get unsubscribedTopics(): string[] {\n    return Array.from(this.#unsubscribedTopics);\n  }\n\n  get subscriptionCount(): number {\n    return this.#subs.size;\n  }\n\n  subscribe(topic: string): void {\n    logger.info(`[${this.#connectionId}] Subscribe to topic`, { topic });\n\n    // Validate topic\n    if (!topic || typeof topic !== \"string\" || topic.trim().length === 0) {\n      const error = \"Invalid topic: must be a non-empty string\";\n      logger.error(`[${this.#connectionId}] ${error}`, { topic });\n      throw new Error(error);\n    }\n\n    // Optimistically mark as subscribed\n    this.#subscribedTopics.add(topic);\n    this.#unsubscribedTopics.delete(topic); // Remove from unsubscribed if it was there\n\n    this.#subs.add(topic);\n    logger.info(`[${this.#connectionId}] Topic added to subscriptions`, {\n      topic,\n      totalSubs: this.#subs.size,\n    });\n  }\n\n  unsubscribe(topic: string): void {\n    logger.info(`[${this.#connectionId}] Unsubscribe from topic`, { topic });\n\n    // Validate topic\n    if (!topic || typeof topic !== \"string\" || topic.trim().length === 0) {\n      const error = \"Invalid topic: must be a non-empty string\";\n      logger.error(`[${this.#connectionId}] ${error}`, { topic });\n      throw new Error(error);\n    }\n\n    // Optimistically mark as unsubscribed\n    this.#unsubscribedTopics.add(topic);\n    this.#subscribedTopics.delete(topic); // Remove from subscribed\n\n    this.#subs.delete(topic);\n    logger.info(`[${this.#connectionId}] Topic removed from subscriptions`, {\n      topic,\n      totalSubs: this.#subs.size,\n    });\n  }\n\n  isSubscribed(topic: string): boolean {\n    return (\n      this.#subscribedTopics.has(topic) && !this.#unsubscribedTopics.has(topic)\n    );\n  }\n\n  getSubscriptionStatus(topic: string): SubscriptionStatus {\n    if (\n      this.#subscribedTopics.has(topic) &&\n      !this.#unsubscribedTopics.has(topic)\n    ) {\n      return \"subscribed\";\n    } else if (this.#unsubscribedTopics.has(topic)) {\n      return \"unsubscribed\";\n    } else {\n      return \"pending\";\n    }\n  }\n\n  clear(): void {\n    logger.info(`[${this.#connectionId}] Clearing all subscriptions`);\n    this.#subs.clear();\n    this.#subscribedTopics.clear();\n    this.#unsubscribedTopics.clear();\n  }\n\n  getSubscriptionTracking(): {\n    subscribed: string[];\n    unsubscribed: string[];\n    pending: string[];\n  } {\n    const pending = Array.from(this.#subs).filter(\n      (topic) =>\n        !this.#subscribedTopics.has(topic) &&\n        !this.#unsubscribedTopics.has(topic),\n    );\n\n    return {\n      subscribed: this.subscribedTopics,\n      unsubscribed: this.unsubscribedTopics,\n      pending,\n    };\n  }\n\n  /**\n   * Get all topics that should be resubscribed on reconnect\n   */\n  getTopicsForResubscription(): string[] {\n    return Array.from(this.#subs);\n  }\n\n  /**\n   * Update subscription status based on server confirmation\n   */\n  confirmSubscription(topic: string): void {\n    logger.info(`[${this.#connectionId}] Confirming subscription`, { topic });\n    this.#subscribedTopics.add(topic);\n    this.#unsubscribedTopics.delete(topic);\n  }\n\n  /**\n   * Update subscription status based on server confirmation\n   */\n  confirmUnsubscription(topic: string): void {\n    logger.info(`[${this.#connectionId}] Confirming unsubscription`, { topic });\n    this.#unsubscribedTopics.add(topic);\n    this.#subscribedTopics.delete(topic);\n    this.#subs.delete(topic);\n  }\n}\n","import type {\n  PacketEnvelope,\n  AckPacketType,\n  PresencePacketType,\n} from \"@repo/schemas/packetEnvelope\";\nimport type { IMessageProcessor, OnMessage } from \"./interfaces\";\nimport type { IAckManager } from \"./interfaces\";\nimport type { PresenceManager } from \"./Presence\";\nimport { parseServerFrame } from \"@/client/core/wire\";\nimport { logger } from \"@/internal/logger/consola\";\n\n/**\n * Handles incoming message parsing and routing\n */\nexport class MessageProcessor implements IMessageProcessor {\n  #connectionId: string;\n  #onMessage: OnMessage;\n  #ackManager: IAckManager;\n  #presenceManager: PresenceManager;\n\n  constructor(\n    connectionId: string,\n    onMessage: OnMessage,\n    ackManager: IAckManager,\n    presenceManager: PresenceManager,\n  ) {\n    this.#connectionId = connectionId;\n    this.#onMessage = onMessage;\n    this.#ackManager = ackManager;\n    this.#presenceManager = presenceManager;\n    logger.info(`[${this.#connectionId}] MessageProcessor created`);\n  }\n\n  async processMessage(dataStr: string): Promise<PacketEnvelope | null> {\n    logger.info(`[${this.#connectionId}] Processing message`, {\n      dataLength: dataStr.length,\n    });\n\n    if (dataStr.length === 0) {\n      logger.warn(`[${this.#connectionId}] Data string is empty, skipping`);\n      return null;\n    }\n\n    // Ping packet just skip it\n    if (dataStr === \"ping\") {\n      logger.warn(`[${this.#connectionId}] Ping packet, skipping`, {\n        rawDataPreview: dataStr.slice(0, 200),\n      });\n      return null;\n    }\n\n    const parsed = parseServerFrame(dataStr);\n    if (!parsed) {\n      logger.warn(`[${this.#connectionId}] Failed to parse server frame`, {\n        rawDataPreview: dataStr.slice(0, 200),\n      });\n      return null;\n    }\n\n    logger.info(`[${this.#connectionId}] Parsed packet`, {\n      packetType: parsed.packetType,\n    });\n\n    await this.handlePacket(parsed);\n    return parsed;\n  }\n\n  async handlePacket(packet: PacketEnvelope): Promise<void> {\n    try {\n      // Handle ACK packets\n      if (packet.packetType === \"ack\") {\n        await this.#handleAckPacket(packet as AckPacketType);\n      } else if (packet.packetType === \"publish\") {\n        // Handle regular publish messages\n        logger.info(`[${this.#connectionId}] Handling publish message`, {\n          topic: packet.payload?.topic,\n          messageId: packet.payload?.id || \"unknown\",\n        });\n        this.#onMessage(packet);\n      } else if (packet.packetType === \"presence\") {\n        // Handle presence packets\n        logger.info(`[${this.#connectionId}] Handling presence packet`, {\n          topic: packet.topic,\n          clientId: packet.clientId,\n          status: packet.status,\n        });\n        this.#presenceManager.handlePresencePacket(\n          packet as PresencePacketType,\n        );\n      } else {\n        logger.warn(`[${this.#connectionId}] Unknown packet type`, {\n          packetType: packet.packetType,\n        });\n      }\n    } catch (error) {\n      logger.error(`[${this.#connectionId}] Error handling packet`, {\n        error,\n        packetType: packet.packetType,\n      });\n      // Don't rethrow - we want to keep the connection alive even if handlers fail\n    }\n  }\n\n  async #handleAckPacket(ackPacket: AckPacketType): Promise<void> {\n    logger.info(`[${this.#connectionId}] Processing ACK packet`, {\n      clientMsgId: ackPacket.clientMsgId,\n      path: ackPacket.result.path,\n    });\n\n    // Route all ACKs to the ACK manager - it will handle both publish and subscription ACKs\n    this.#ackManager.handleAck(ackPacket);\n  }\n}\n","import type { IGrantManager, TokenProvider } from \"./interfaces\";\nimport { logger } from \"@/internal/logger/consola\";\n\nconst GRANT_CACHE_KEY = \"erebus:grant\";\n\n// Helper function to safely log sensitive data\nfunction logSensitiveData(data: string, prefix: string = \"data\"): string {\n  if (!data || data.length < 8) return `${prefix}: [too short]`;\n  return `${prefix}: ${data.substring(0, 4)}...${data.substring(data.length - 4)}`;\n}\n\n/**\n * Manages grant/token caching and retrieval\n */\nexport class GrantManager implements IGrantManager {\n  #connectionId: string;\n  #tokenProvider: TokenProvider;\n\n  constructor(connectionId: string, tokenProvider: TokenProvider) {\n    this.#connectionId = connectionId;\n    this.#tokenProvider = tokenProvider;\n    logger.info(`[${this.#connectionId}] GrantManager created`);\n  }\n\n  getCachedGrant(): string | undefined {\n    logger.info(`[${this.#connectionId}] Attempting to get cached grant`);\n    try {\n      // Only in browser environments\n      if (typeof localStorage !== \"undefined\") {\n        const v = localStorage.getItem(GRANT_CACHE_KEY);\n        if (v) {\n          logger.info(`[${this.#connectionId}] Cached grant found`, {\n            grantPreview: logSensitiveData(v, \"cached_grant\"),\n          });\n        } else {\n          logger.info(`[${this.#connectionId}] No cached grant found`);\n        }\n        return v ?? undefined;\n      } else {\n        logger.info(\n          `[${this.#connectionId}] localStorage not available (non-browser environment)`,\n        );\n      }\n    } catch (error) {\n      logger.warn(`[${this.#connectionId}] Error accessing cached grant`, {\n        error,\n      });\n      // ignore storage access errors (Safari ITP, quota, etc.)\n    }\n    return undefined;\n  }\n\n  setCachedGrant(token: string): void {\n    logger.info(`[${this.#connectionId}] Setting cached grant`, {\n      grantPreview: logSensitiveData(token, \"grant_to_cache\"),\n    });\n    try {\n      if (typeof localStorage !== \"undefined\") {\n        localStorage.setItem(GRANT_CACHE_KEY, token);\n        logger.info(`[${this.#connectionId}] Grant cached successfully`);\n      } else {\n        logger.info(\n          `[${this.#connectionId}] Cannot cache grant - localStorage not available`,\n        );\n      }\n    } catch (error) {\n      logger.warn(`[${this.#connectionId}] Error caching grant`, { error });\n      // ignore\n    }\n  }\n\n  clearCachedGrant(): void {\n    logger.info(`[${this.#connectionId}] Clearing cached grant`);\n    try {\n      if (typeof localStorage !== \"undefined\") {\n        localStorage.removeItem(GRANT_CACHE_KEY);\n        logger.info(\n          `[${this.#connectionId}] Cached grant cleared successfully`,\n        );\n      } else {\n        logger.info(\n          `[${this.#connectionId}] Cannot clear grant - localStorage not available`,\n        );\n      }\n    } catch (error) {\n      logger.warn(`[${this.#connectionId}] Error clearing cached grant`, {\n        error,\n      });\n      // ignore\n    }\n  }\n\n  async getToken(channel: string): Promise<string> {\n    logger.info(`[${this.#connectionId}] Getting token from provider`, {\n      channel,\n    });\n    try {\n      const token = await this.#tokenProvider(channel);\n      if (!token) {\n        logger.error(\n          `[${this.#connectionId}] No token provided by token provider`,\n        );\n        throw new Error(\"No token provided\");\n      }\n      logger.info(`[${this.#connectionId}] Token received`, {\n        tokenPreview: logSensitiveData(token, \"token\"),\n        channel,\n      });\n      return token;\n    } catch (error) {\n      logger.error(\n        `[${this.#connectionId}] Error getting token from provider`,\n        { error, channel },\n      );\n      throw error;\n    }\n  }\n\n  /**\n   * Get token with caching logic\n   */\n  async getTokenWithCache(channel: string): Promise<string> {\n    // Prefer cached grant; if missing, ask provider and cache it\n    let grantJWT = this.getCachedGrant();\n    if (!grantJWT) {\n      logger.info(\n        `[${this.#connectionId}] No cached grant, requesting fresh token`,\n        { channel },\n      );\n      const fresh = await this.getToken(channel);\n      grantJWT = fresh;\n      if (grantJWT) {\n        logger.info(`[${this.#connectionId}] Fresh token received, caching it`);\n        this.setCachedGrant(grantJWT);\n      }\n    } else {\n      logger.info(`[${this.#connectionId}] Using cached grant`, {\n        channel,\n      });\n    }\n    return grantJWT;\n  }\n}\n","import type { IHeartbeatManager, Logger } from \"./interfaces\";\nimport { logger } from \"@/internal/logger/consola\";\n\n/**\n * Manages heartbeat/ping functionality to keep WebSocket connections alive\n */\nexport class HeartbeatManager implements IHeartbeatManager {\n  #connectionId: string;\n  #intervalMs: number;\n  #intervalId?: NodeJS.Timeout;\n  #sendHeartbeat: () => void;\n  #log: Logger;\n\n  constructor(\n    connectionId: string,\n    intervalMs: number,\n    sendHeartbeat: () => void,\n    log: Logger,\n  ) {\n    this.#connectionId = connectionId;\n    this.#intervalMs = intervalMs;\n    this.#sendHeartbeat = sendHeartbeat;\n    this.#log = log;\n    logger.info(`[${this.#connectionId}] HeartbeatManager created`, {\n      intervalMs,\n    });\n  }\n\n  get isRunning(): boolean {\n    return this.#intervalId !== undefined;\n  }\n\n  start(): void {\n    logger.info(`[${this.#connectionId}] Starting heartbeat`, {\n      intervalMs: this.#intervalMs,\n    });\n\n    // Stop any existing heartbeat first\n    this.stop();\n\n    this.#intervalId = setInterval(() => {\n      try {\n        /**\n         * Heartbeats are just a ping string, not a packet envelope\n         * it gets an auto response `pong` from the cloudflare gateway if it's still alive\n         */\n        this.#log(\"info\", \"sending heartbeat ping\");\n        logger.info(`[${this.#connectionId}] Sending heartbeat ping`);\n        this.#sendHeartbeat();\n      } catch (error) {\n        logger.error(`[${this.#connectionId}] Error sending heartbeat`, {\n          error,\n        });\n        // The error will be handled by the caller (typically the connection manager)\n        throw error;\n      }\n    }, this.#intervalMs);\n\n    logger.info(`[${this.#connectionId}] Heartbeat started successfully`);\n  }\n\n  stop(): void {\n    if (this.#intervalId) {\n      logger.info(`[${this.#connectionId}] Stopping heartbeat`);\n      clearInterval(this.#intervalId);\n      this.#intervalId = undefined;\n    } else {\n      logger.debug(`[${this.#connectionId}] No heartbeat to stop`);\n    }\n  }\n\n  /**\n   * Update the heartbeat interval (requires restart if running)\n   */\n  setInterval(intervalMs: number): void {\n    logger.info(`[${this.#connectionId}] Updating heartbeat interval`, {\n      oldInterval: this.#intervalMs,\n      newInterval: intervalMs,\n    });\n\n    const wasRunning = this.isRunning;\n    this.stop();\n    this.#intervalMs = intervalMs;\n\n    if (wasRunning) {\n      this.start();\n    }\n  }\n\n  /**\n   * Get current heartbeat interval\n   */\n  getInterval(): number {\n    return this.#intervalMs;\n  }\n}\n","import type { PresencePacketType } from \"@repo/schemas/packetEnvelope\";\nimport { logger } from \"@/internal/logger/consola\";\nimport type { Presence } from \"@/client/core/types\";\n\n/**\n * Handler function type for presence updates\n */\nexport type PresenceHandler = (presence: Presence) => void;\n\n/**\n * Manages presence event handlers for different topics\n */\nexport class PresenceManager {\n  #connectionId: string;\n  #presenceHandlers = new Map<string, Set<PresenceHandler>>();\n\n  constructor(connectionId: string) {\n    this.#connectionId = connectionId;\n    logger.info(`[${this.#connectionId}] PresenceManager created`);\n  }\n\n  /**\n   * Register a presence handler for a specific topic\n   * @param topic - The topic to listen for presence updates on\n   * @param handler - The callback function to handle presence updates\n   */\n  onPresence(topic: string, handler: PresenceHandler): void {\n    logger.info(`[${this.#connectionId}] Adding presence handler for topic`, {\n      topic,\n    });\n\n    // Validate inputs\n    if (!topic || typeof topic !== \"string\" || topic.trim().length === 0) {\n      const error = \"Invalid topic: must be a non-empty string\";\n      logger.error(`[${this.#connectionId}] ${error}`, { topic });\n      throw new Error(error);\n    }\n\n    if (typeof handler !== \"function\") {\n      const error = \"Invalid handler: must be a function\";\n      logger.error(`[${this.#connectionId}] ${error}`);\n      throw new Error(error);\n    }\n\n    // Initialize topic handler set if it doesn't exist\n    if (!this.#presenceHandlers.has(topic)) {\n      this.#presenceHandlers.set(topic, new Set());\n    }\n\n    // Add the handler\n    this.#presenceHandlers.get(topic)!.add(handler);\n\n    logger.info(`[${this.#connectionId}] Presence handler added`, {\n      topic,\n      totalHandlers: this.#presenceHandlers.get(topic)!.size,\n    });\n  }\n\n  /**\n   * Remove a presence handler for a specific topic\n   * @param topic - The topic to remove the handler from\n   * @param handler - The specific handler function to remove\n   */\n  offPresence(topic: string, handler: PresenceHandler): void {\n    logger.info(`[${this.#connectionId}] Removing presence handler for topic`, {\n      topic,\n    });\n\n    const handlers = this.#presenceHandlers.get(topic);\n    if (!handlers) {\n      logger.warn(`[${this.#connectionId}] No handlers found for topic`, {\n        topic,\n      });\n      return;\n    }\n\n    handlers.delete(handler);\n\n    // Clean up empty handler sets\n    if (handlers.size === 0) {\n      this.#presenceHandlers.delete(topic);\n    }\n\n    logger.info(`[${this.#connectionId}] Presence handler removed`, {\n      topic,\n      remainingHandlers: handlers.size,\n    });\n  }\n\n  /**\n   * Remove all presence handlers for a specific topic\n   * @param topic - The topic to clear all handlers for\n   */\n  clearPresenceHandlers(topic: string): void {\n    logger.info(\n      `[${this.#connectionId}] Clearing all presence handlers for topic`,\n      { topic },\n    );\n    this.#presenceHandlers.delete(topic);\n  }\n\n  /**\n   * Remove all presence handlers for all topics\n   */\n  clearAllPresenceHandlers(): void {\n    logger.info(`[${this.#connectionId}] Clearing all presence handlers`);\n    this.#presenceHandlers.clear();\n  }\n\n  /**\n   * Handle incoming presence packet\n   * @param presencePacket - The presence packet received from the server\n   */\n  handlePresencePacket(presencePacket: PresencePacketType): void {\n    logger.info(`[${this.#connectionId}] Handling presence packet`, {\n      clientId: presencePacket.clientId,\n      topic: presencePacket.topic,\n      status: presencePacket.status,\n    });\n\n    const handlers = this.#presenceHandlers.get(presencePacket.topic);\n    if (!handlers || handlers.size === 0) {\n      logger.debug(\n        `[${this.#connectionId}] No presence handlers found for topic`,\n        {\n          topic: presencePacket.topic,\n        },\n      );\n      return;\n    }\n\n    // Create presence event data\n    const presenceEvent: Presence = {\n      clientId: presencePacket.clientId,\n      topic: presencePacket.topic,\n      status: presencePacket.status,\n      timestamp: Date.now(),\n      // Include subscribers array if present (for enriched self presence updates)\n      // Use type assertion since the server may send additional fields\n      ...((presencePacket as any).subscribers && {\n        subscribers: (presencePacket as any).subscribers,\n      }),\n    };\n\n    // Call all handlers for this topic\n    for (const handler of handlers) {\n      try {\n        handler(presenceEvent);\n      } catch (error) {\n        logger.error(`[${this.#connectionId}] Error in presence handler`, {\n          error,\n          topic: presencePacket.topic,\n          clientId: presencePacket.clientId,\n        });\n        // Continue with other handlers even if one fails\n      }\n    }\n\n    logger.info(\n      `[${this.#connectionId}] Presence packet handled successfully`,\n      {\n        topic: presencePacket.topic,\n        handlersCount: handlers.size,\n      },\n    );\n  }\n\n  /**\n   * Get all topics that have presence handlers\n   */\n  getTopicsWithPresenceHandlers(): string[] {\n    return Array.from(this.#presenceHandlers.keys());\n  }\n\n  /**\n   * Get the number of presence handlers for a specific topic\n   */\n  getPresenceHandlerCount(topic: string): number {\n    return this.#presenceHandlers.get(topic)?.size || 0;\n  }\n\n  /**\n   * Get total number of presence handlers across all topics\n   */\n  getTotalPresenceHandlerCount(): number {\n    let count = 0;\n    for (const handlers of this.#presenceHandlers.values()) {\n      count += handlers.size;\n    }\n    return count;\n  }\n\n  /**\n   * Debug method to get all presence handlers\n   */\n  get __debugPresenceHandlers(): Map<string, Set<PresenceHandler>> {\n    return new Map(this.#presenceHandlers);\n  }\n}\n","import type { PacketEnvelope } from \"@repo/schemas/packetEnvelope\";\nimport type { MessageBody } from \"@repo/schemas/messageBody\";\nimport type {\n  AckCallback,\n  PendingPublish,\n  SubscriptionCallback,\n  PendingSubscription,\n} from \"../types\";\nimport type {\n  ConnectionConfig,\n  ConnectionHealth,\n  ConnectionState,\n  SubscriptionStatus,\n} from \"./interfaces\";\nimport { nanoid } from \"nanoid\";\nimport {\n  ConnectionManager,\n  BackpressureError,\n  NotConnectedError,\n} from \"./ConnectionManager\";\nimport { AckManager } from \"./AckManager\";\nimport { SubscriptionManager } from \"./SubscriptionManager\";\nimport { MessageProcessor } from \"./MessageProcessor\";\nimport { GrantManager } from \"./GrantManager\";\nimport { HeartbeatManager } from \"./HeartbeatManager\";\nimport { PresenceManager } from \"./Presence\";\nimport type { PresenceHandler } from \"./Presence\";\nimport { logger } from \"@/internal/logger/consola\";\nimport consola from \"consola\";\n\n// Re-export errors for backward compatibility\nexport { BackpressureError, NotConnectedError };\n\n/**\n * Main PubSub connection orchestrator that coordinates all subsystems\n */\nexport class PubSubConnection {\n  #connectionManager: ConnectionManager;\n  #ackManager: AckManager;\n  #subscriptionManager: SubscriptionManager;\n  #messageProcessor: MessageProcessor;\n  #grantManager: GrantManager;\n  #heartbeatManager: HeartbeatManager;\n  #presenceManager: PresenceManager;\n  #ackTimeoutMs = 30000; // 30 seconds timeout for ACKs\n  #connectionId: string;\n\n  constructor(config: ConnectionConfig) {\n    this.#connectionId = `conn_${Math.random().toString(36).slice(2, 8)}`;\n    logger.info(`[${this.#connectionId}] PubSubConnection constructor called`, {\n      url: config.url,\n      heartbeatMs: config.heartbeatMs ?? 25_000,\n    });\n\n    // Initialize all managers\n    this.#ackManager = new AckManager(this.#connectionId);\n    this.#subscriptionManager = new SubscriptionManager(this.#connectionId);\n    this.#presenceManager = new PresenceManager(this.#connectionId);\n    this.#grantManager = new GrantManager(\n      this.#connectionId,\n      config.tokenProvider,\n    );\n\n    // Create message processor with ACK and presence handling\n    this.#messageProcessor = new MessageProcessor(\n      this.#connectionId,\n      config.onMessage,\n      this.#ackManager,\n      this.#presenceManager,\n    );\n\n    // Create connection manager with message processing\n    const connectionConfig: ConnectionConfig = {\n      ...config,\n      onMessage: async (rawMessage: PacketEnvelope & { rawData?: string }) => {\n        // Handle the message processing\n        if (rawMessage.rawData) {\n          await this.#messageProcessor.processMessage(rawMessage.rawData);\n        } else {\n          // Direct packet handling for already parsed messages\n          await this.#messageProcessor.handlePacket(rawMessage);\n        }\n      },\n    };\n\n    this.#connectionManager = new ConnectionManager(connectionConfig);\n\n    // Create heartbeat manager\n    this.#heartbeatManager = new HeartbeatManager(\n      this.#connectionId,\n      config.heartbeatMs ?? 25_000,\n      () => this.#sendHeartbeat(),\n      config.log ?? (() => {}),\n    );\n\n    logger.info(`[${this.#connectionId}] PubSubConnection initialized`);\n  }\n\n  // Connection state getters\n  get state(): ConnectionState {\n    return this.#connectionManager.state;\n  }\n\n  get isConnected(): boolean {\n    return this.#connectionManager.isConnected;\n  }\n\n  get isConnecting(): boolean {\n    return this.#connectionManager.isConnecting;\n  }\n\n  get isClosed(): boolean {\n    return this.#connectionManager.isClosed;\n  }\n\n  get isIdle(): boolean {\n    return this.#connectionManager.isIdle;\n  }\n\n  get isReadable(): boolean {\n    return this.#connectionManager.isConnected;\n  }\n\n  get isWritable(): boolean {\n    return this.#connectionManager.isConnected;\n  }\n\n  get channel(): string {\n    return this.#connectionManager.channel;\n  }\n\n  get subscriptionCount(): number {\n    return this.#subscriptionManager.subscriptionCount;\n  }\n\n  get subscriptions(): string[] {\n    return this.#subscriptionManager.subscriptions;\n  }\n\n  get readyState(): number | undefined {\n    return this.#connectionManager.readyState;\n  }\n\n  get bufferedAmount(): number {\n    return this.#connectionManager.bufferedAmount;\n  }\n\n  get connectionId(): string {\n    return this.#connectionManager.connectionId;\n  }\n\n  get url(): string {\n    return this.#connectionManager.url;\n  }\n\n  get connectionHealth(): ConnectionHealth {\n    return {\n      state: this.state,\n      isConnected: this.isConnected,\n      isReadable: this.isReadable,\n      isWritable: this.isWritable,\n      channel: this.channel,\n      subscriptionCount: this.subscriptionCount,\n      readyState: this.readyState,\n      bufferedAmount: this.bufferedAmount,\n      connectionId: this.connectionId,\n      url: this.url,\n    };\n  }\n\n  get subscribedTopics(): string[] {\n    return this.#subscriptionManager.subscribedTopics;\n  }\n\n  get unsubscribedTopics(): string[] {\n    return this.#subscriptionManager.unsubscribedTopics;\n  }\n\n  get subscriptionTracking(): {\n    subscribed: string[];\n    unsubscribed: string[];\n    pending: string[];\n  } {\n    return this.#subscriptionManager.getSubscriptionTracking();\n  }\n\n  async open(timeout?: number): Promise<void> {\n    // Get grant token before opening connection\n    const grantJWT = await this.#grantManager.getTokenWithCache(this.channel);\n\n    // Open connection with grant and timeout\n    await this.#connectionManager.open({\n      grant: grantJWT,\n      timeout: timeout,\n    });\n\n    // Send connect packet\n    this.#connectionManager.send({ packetType: \"connect\", grantJWT });\n\n    // Start heartbeat\n    this.#heartbeatManager.start();\n\n    // Resubscribe to existing topics\n    const topicsToResubscribe =\n      this.#subscriptionManager.getTopicsForResubscription();\n    for (const topic of topicsToResubscribe) {\n      logger.info(`[${this.#connectionId}] Resubscribing to topic`, { topic });\n      this.#connectionManager.send({ packetType: \"subscribe\", topic });\n    }\n  }\n\n  close(): void {\n    // Stop heartbeat first\n    this.#heartbeatManager.stop();\n\n    // Clean up pending ACK callbacks\n    this.#ackManager.cleanup(\"Connection closed\");\n\n    // Close connection\n    this.#connectionManager.close();\n\n    // Clear subscriptions\n    this.#subscriptionManager.clear();\n\n    // Clear cached grant\n    this.#grantManager.clearCachedGrant();\n  }\n\n  subscribe(topic: string): void {\n    this.subscribeWithCallback(topic);\n  }\n\n  subscribeWithCallback(\n    topic: string,\n    callback?: SubscriptionCallback,\n    timeoutMs?: number,\n  ): void {\n    logger.info(`[${this.#connectionId}] Subscribe called`, {\n      topic,\n      hasCallback: !!callback,\n      timeout: timeoutMs,\n    });\n\n    this.#subscriptionManager.subscribe(topic);\n\n    if (this.isConnected) {\n      logger.info(\n        `[${this.#connectionId}] Connection open, sending subscribe packet`,\n        { topic },\n      );\n      try {\n        let requestId: string | undefined;\n        let clientMsgId: string | undefined;\n\n        // Set up ACK tracking if callback provided\n        if (callback) {\n          requestId = `sub_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n          // Optional clientMsgId for subscription tracking\n          if (\n            typeof crypto !== \"undefined\" &&\n            typeof crypto.randomUUID === \"function\"\n          ) {\n            clientMsgId = crypto.randomUUID();\n          }\n\n          const pending: PendingSubscription = {\n            requestId,\n            clientMsgId,\n            topic,\n            path: \"subscribe\",\n            callback,\n            timestamp: Date.now(),\n          };\n\n          // Set timeout for subscription ACK response\n          if (timeoutMs && timeoutMs > 0) {\n            pending.timeoutId = setTimeout(() => {\n              this.#ackManager.handleSubscriptionTimeout(requestId!);\n            }, timeoutMs);\n          }\n\n          this.#ackManager.trackSubscription(requestId, pending);\n        }\n\n        this.#connectionManager.send({\n          packetType: \"subscribe\",\n          topic,\n          ...(requestId && { requestId }),\n          ...(clientMsgId && { clientMsgId }),\n        });\n      } catch (error) {\n        logger.error(`[${this.#connectionId}] Error sending subscribe packet`, {\n          error,\n          topic,\n        });\n        // Revert the subscription on send failure\n        this.#subscriptionManager.unsubscribe(topic);\n        throw error;\n      }\n    } else {\n      logger.info(\n        `[${this.#connectionId}] Connection not open, subscription will be sent when connected`,\n        { topic },\n      );\n    }\n  }\n\n  unsubscribe(topic: string): void {\n    this.unsubscribeWithCallback(topic);\n  }\n\n  unsubscribeWithCallback(\n    topic: string,\n    callback?: SubscriptionCallback,\n    timeoutMs?: number,\n  ): void {\n    logger.info(`[${this.#connectionId}] Unsubscribe called`, {\n      topic,\n      hasCallback: !!callback,\n      timeout: timeoutMs,\n    });\n\n    this.#subscriptionManager.unsubscribe(topic);\n\n    if (this.isConnected) {\n      logger.info(\n        `[${this.#connectionId}] Connection open, sending unsubscribe packet`,\n        { topic },\n      );\n      try {\n        let requestId: string | undefined;\n        let clientMsgId: string | undefined;\n\n        // Set up ACK tracking if callback provided\n        if (callback) {\n          requestId = `unsub_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n\n          // Optional clientMsgId for subscription tracking\n          if (\n            typeof crypto !== \"undefined\" &&\n            typeof crypto.randomUUID === \"function\"\n          ) {\n            clientMsgId = crypto.randomUUID();\n          }\n\n          const pending: PendingSubscription = {\n            requestId,\n            clientMsgId,\n            topic,\n            path: \"unsubscribe\",\n            callback,\n            timestamp: Date.now(),\n          };\n\n          // Set timeout for subscription ACK response\n          if (timeoutMs && timeoutMs > 0) {\n            pending.timeoutId = setTimeout(() => {\n              this.#ackManager.handleSubscriptionTimeout(requestId!);\n            }, timeoutMs);\n          }\n\n          this.#ackManager.trackSubscription(requestId, pending);\n        }\n\n        this.#connectionManager.send({\n          packetType: \"unsubscribe\",\n          topic,\n          ...(requestId && { requestId }),\n          ...(clientMsgId && { clientMsgId }),\n        });\n      } catch (error) {\n        logger.error(\n          `[${this.#connectionId}] Error sending unsubscribe packet`,\n          {\n            error,\n            topic,\n          },\n        );\n        // Don't rethrow - we've already removed from subscriptions\n      }\n    } else {\n      logger.info(\n        `[${this.#connectionId}] Connection not open, unsubscription will be sent when connected`,\n        { topic },\n      );\n    }\n  }\n\n  publish(payload: MessageBody): void {\n    // Ignore the returned clientMsgId for regular publish (no ACK)\n    void this.#publishInternal(payload, false);\n  }\n\n  publishWithAck(\n    payload: MessageBody,\n    callback: AckCallback,\n    timeoutMs: number = this.#ackTimeoutMs,\n  ): Promise<string> {\n    return this.#publishInternal(payload, true, callback, timeoutMs);\n  }\n\n  isSubscribed(topic: string): boolean {\n    return this.#subscriptionManager.isSubscribed(topic);\n  }\n\n  getSubscriptionStatus(topic: string): SubscriptionStatus {\n    return this.#subscriptionManager.getSubscriptionStatus(topic);\n  }\n\n  setChannel(channel: string): void {\n    this.#connectionManager.setChannel(channel);\n    // Clear cached grant when channel changes\n    this.#grantManager.clearCachedGrant();\n  }\n\n  /**\n   * Register a presence handler for a specific topic\n   * @param topic - The topic to listen for presence updates on\n   * @param handler - The callback function to handle presence updates\n   */\n  onPresence(topic: string, handler: PresenceHandler): void {\n    this.#presenceManager.onPresence(topic, handler);\n  }\n\n  /**\n   * Remove a presence handler for a specific topic\n   * @param topic - The topic to remove the handler from\n   * @param handler - The specific handler function to remove\n   */\n  offPresence(topic: string, handler: PresenceHandler): void {\n    this.#presenceManager.offPresence(topic, handler);\n  }\n\n  /**\n   * Remove all presence handlers for a specific topic\n   * @param topic - The topic to clear all handlers for\n   */\n  clearPresenceHandlers(topic: string): void {\n    this.#presenceManager.clearPresenceHandlers(topic);\n  }\n\n  #publishInternal(\n    payload: MessageBody,\n    withAck: boolean = false,\n    callback?: AckCallback,\n    timeoutMs?: number,\n  ): Promise<string> {\n    logger.info(`[${this.#connectionId}] Publish called`, {\n      topic: payload.topic,\n      withAck,\n    });\n\n    // Validate payload\n    if (!payload || typeof payload !== \"object\") {\n      const error = \"Invalid payload: must be an object\";\n      logger.error(`[${this.#connectionId}] ${error}`, { payload });\n      throw new Error(error);\n    }\n\n    if (withAck && !callback) {\n      const error = \"ACK callback is required when withAck is true\";\n      logger.error(`[${this.#connectionId}] ${error}`);\n      throw new Error(error);\n    }\n\n    if (!this.isConnected) {\n      logger.error(`[${this.#connectionId}] Cannot publish - not connected`, {\n        state: this.state,\n      });\n      throw new NotConnectedError(\"Not connected\");\n    }\n\n    // Generate client correlation fields\n    let clientMsgId: string = `fallback_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n    let requestId: string | undefined;\n\n    try {\n      // Ensure client correlation fields exist\n      if (!payload.clientPublishTs) {\n        Object.assign(payload, { clientPublishTs: Date.now() });\n      }\n\n      // Generate or use existing clientMsgId\n      if (payload.clientMsgId) {\n        clientMsgId = payload.clientMsgId;\n      } else {\n        if (\n          typeof crypto !== \"undefined\" &&\n          typeof crypto.randomUUID === \"function\"\n        ) {\n          clientMsgId = crypto.randomUUID();\n        } else {\n          clientMsgId = `msg_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n        }\n        Object.assign(payload, { clientMsgId });\n      }\n\n      // Generate requestId for ACK tracking\n      if (withAck && callback) {\n        requestId = `req_${Date.now()}_${nanoid()}`;\n\n        // Set up ACK tracking\n        const pending: PendingPublish = {\n          requestId,\n          clientMsgId,\n          topic: payload.topic,\n          callback,\n          timestamp: Date.now(),\n        };\n\n        // Set timeout for ACK response\n        if (timeoutMs && timeoutMs > 0) {\n          pending.timeoutId = setTimeout(() => {\n            this.#ackManager.handlePublishTimeout(requestId!);\n          }, timeoutMs);\n        }\n\n        this.#ackManager.trackPublish(requestId, pending);\n      }\n    } catch (err) {\n      // Ensure fallback is set\n      Object.assign(payload, { clientMsgId });\n      logger.warn(\n        `[${this.#connectionId}] Error setting client fields, using fallback`,\n        { err, clientMsgId },\n      );\n    }\n\n    logger.info(`[${this.#connectionId}] Publishing message`, {\n      topic: payload.topic,\n      withAck,\n      requestId,\n      clientMsgId,\n    });\n\n    consola.info(\n      `[PubSubConnection] [${this.#connectionId}] Publishing message`,\n      {\n        topic: payload.topic,\n        withAck,\n      },\n    );\n\n    try {\n      // Server primarily uses payload.topic, but schema requires topic at envelope level too\n      this.#connectionManager.send({\n        packetType: \"publish\",\n        topic: payload.topic,\n        ack: withAck,\n        payload,\n        clientMsgId: clientMsgId!,\n        ...(withAck && requestId && { requestId }), // Only include requestId for ACK tracking\n      });\n    } catch (error) {\n      // Clean up ACK tracking on send failure\n      if (withAck && requestId) {\n        const pending = this.#ackManager.getPendingCount();\n        if (pending > 0) {\n          // This is a simplified cleanup - in practice the ACK manager\n          // would handle cleanup for the specific requestId\n        }\n      }\n\n      logger.error(`[${this.#connectionId}] Error publishing message`, {\n        error,\n        topic: payload.topic,\n      });\n      throw error;\n    }\n\n    return Promise.resolve(clientMsgId!);\n  }\n\n  #sendHeartbeat(): void {\n    if (!this.isConnected) {\n      logger.debug(\n        `[${this.#connectionId}] Skipping heartbeat - not connected`,\n      );\n      return;\n    }\n\n    try {\n      // Heartbeats are raw ping strings, not packet envelopes\n      this.#connectionManager.sendRaw(\"ping\");\n    } catch (error) {\n      logger.error(`[${this.#connectionId}] Error sending heartbeat`, {\n        error,\n      });\n      // Close connection to trigger reconnect\n      this.#connectionManager.close();\n      throw error;\n    }\n  }\n\n  // Debug methods for development\n  get __debugObject(): unknown {\n    return {\n      connectionManager: this.#connectionManager,\n      ackManager: this.#ackManager,\n      subscriptionManager: this.#subscriptionManager,\n      messageProcessor: this.#messageProcessor,\n      grantManager: this.#grantManager,\n      heartbeatManager: this.#heartbeatManager,\n    };\n  }\n\n  /**\n   * Development-only state getter\n   * @returns The current state of the connection\n   */\n  get __debugState(): string {\n    return this.#connectionManager.state;\n  }\n}\n","import type { ConnectionState, SubscriptionStatus } from \"./interfaces\";\nimport { logger } from \"@/internal/logger/consola\";\n\n/**\n * Manages the overall state of the pub/sub system\n * Consolidates connection state, subscription state, and message processing state\n */\nexport class StateManager {\n  #connectionId: string;\n  #connectionState: ConnectionState = \"idle\";\n  #channel: string | null = null;\n  #subscriptions = new Map<string, SubscriptionStatus>();\n  #processedMessages = new Set<string>();\n  #pendingSubscriptions = new Set<string>();\n  #handlers = new Map<string, Set<any>>();\n  #lastActivity = Date.now();\n  #error: Error | null = null;\n  #isReconnecting = false;\n  #reconnectAttempts = 0;\n\n  constructor(connectionId: string) {\n    this.#connectionId = connectionId;\n    logger.info(`[${this.#connectionId}] StateManager created`);\n  }\n\n  // Connection State Management\n  get connectionState(): ConnectionState {\n    return this.#connectionState;\n  }\n\n  setConnectionState(state: ConnectionState): void {\n    logger.info(`[${this.#connectionId}] Connection state changed`, {\n      from: this.#connectionState,\n      to: state,\n    });\n    this.#connectionState = state;\n    this.#updateActivity();\n  }\n\n  get isConnected(): boolean {\n    return this.#connectionState === \"open\";\n  }\n\n  get isConnecting(): boolean {\n    return this.#connectionState === \"connecting\";\n  }\n\n  get isClosed(): boolean {\n    return this.#connectionState === \"closed\";\n  }\n\n  get isIdle(): boolean {\n    return this.#connectionState === \"idle\";\n  }\n\n  // Channel Management\n  get channel(): string | null {\n    return this.#channel;\n  }\n\n  setChannel(channel: string): void {\n    logger.info(`[${this.#connectionId}] Channel set`, { channel });\n    this.#channel = channel;\n    this.#updateActivity();\n  }\n\n  // Subscription State Management\n  get subscriptionCount(): number {\n    return this.#subscriptions.size;\n  }\n\n  get activeTopics(): string[] {\n    return Array.from(this.#subscriptions.entries())\n      .filter(([_, status]) => status === \"subscribed\")\n      .map(([topic, _]) => topic);\n  }\n\n  get pendingTopics(): string[] {\n    return Array.from(this.#subscriptions.entries())\n      .filter(([_, status]) => status === \"pending\")\n      .map(([topic, _]) => topic);\n  }\n\n  get unsubscribedTopics(): string[] {\n    return Array.from(this.#subscriptions.entries())\n      .filter(([_, status]) => status === \"unsubscribed\")\n      .map(([topic, _]) => topic);\n  }\n\n  setSubscriptionStatus(topic: string, status: SubscriptionStatus): void {\n    logger.info(`[${this.#connectionId}] Subscription status updated`, {\n      topic,\n      status,\n    });\n    this.#subscriptions.set(topic, status);\n    this.#updateActivity();\n\n    // Update pending subscriptions set\n    if (status === \"subscribed\") {\n      this.#pendingSubscriptions.delete(topic);\n    } else if (status === \"pending\") {\n      this.#pendingSubscriptions.add(topic);\n    }\n  }\n\n  getSubscriptionStatus(topic: string): SubscriptionStatus {\n    return this.#subscriptions.get(topic) || \"unsubscribed\";\n  }\n\n  isSubscribed(topic: string): boolean {\n    return this.getSubscriptionStatus(topic) === \"subscribed\";\n  }\n\n  // Message Processing State\n  get processedMessagesCount(): number {\n    return this.#processedMessages.size;\n  }\n\n  addProcessedMessage(messageId: string): void {\n    this.#processedMessages.add(messageId);\n    this.#updateActivity();\n\n    // Clean up old message IDs to prevent memory leaks (keep last 1000)\n    if (this.#processedMessages.size > 1000) {\n      const ids = Array.from(this.#processedMessages);\n      this.#processedMessages.clear();\n      // Keep the most recent 500 IDs\n      ids.slice(-500).forEach((id) => this.#processedMessages.add(id));\n    }\n  }\n\n  isMessageProcessed(messageId: string): boolean {\n    return this.#processedMessages.has(messageId);\n  }\n\n  clearProcessedMessages(): void {\n    logger.info(`[${this.#connectionId}] Clearing processed messages`);\n    this.#processedMessages.clear();\n  }\n\n  // Handler Management\n  get handlerCount(): number {\n    let count = 0;\n    for (const handlers of this.#handlers.values()) {\n      count += handlers.size;\n    }\n    return count;\n  }\n\n  getTopicsWithHandlers(): string[] {\n    return Array.from(this.#handlers.keys());\n  }\n\n  getHandlerCountForTopic(topic: string): number {\n    return this.#handlers.get(topic)?.size || 0;\n  }\n\n  addHandler(topic: string, handler: any): void {\n    if (!this.#handlers.has(topic)) {\n      this.#handlers.set(topic, new Set());\n    }\n    this.#handlers.get(topic)!.add(handler);\n    this.#updateActivity();\n  }\n\n  removeHandler(topic: string, handler: any): void {\n    const handlers = this.#handlers.get(topic);\n    if (handlers) {\n      handlers.delete(handler);\n      if (handlers.size === 0) {\n        this.#handlers.delete(topic);\n      }\n    }\n    this.#updateActivity();\n  }\n\n  clearHandlers(topic: string): void {\n    this.#handlers.delete(topic);\n    this.#updateActivity();\n  }\n\n  getHandlers(topic: string): Set<any> | undefined {\n    return this.#handlers.get(topic);\n  }\n\n  // Pending Subscriptions Management\n  get pendingSubscriptionsCount(): number {\n    return this.#pendingSubscriptions.size;\n  }\n\n  addPendingSubscription(topic: string): void {\n    this.#pendingSubscriptions.add(topic);\n    this.#updateActivity();\n  }\n\n  removePendingSubscription(topic: string): void {\n    this.#pendingSubscriptions.delete(topic);\n    this.#updateActivity();\n  }\n\n  clearPendingSubscriptions(): void {\n    logger.info(`[${this.#connectionId}] Clearing pending subscriptions`);\n    this.#pendingSubscriptions.clear();\n  }\n\n  // Error State Management\n  get hasError(): boolean {\n    return this.#error !== null;\n  }\n\n  get error(): Error | null {\n    return this.#error;\n  }\n\n  setError(error: Error): void {\n    logger.error(`[${this.#connectionId}] Error set`, { error });\n    this.#error = error;\n    this.#updateActivity();\n  }\n\n  clearError(): void {\n    logger.info(`[${this.#connectionId}] Error cleared`);\n    this.#error = null;\n    this.#updateActivity();\n  }\n\n  // Reconnection State Management\n  get isReconnecting(): boolean {\n    return this.#isReconnecting;\n  }\n\n  setReconnecting(reconnecting: boolean): void {\n    this.#isReconnecting = reconnecting;\n    this.#updateActivity();\n  }\n\n  get reconnectAttempts(): number {\n    return this.#reconnectAttempts;\n  }\n\n  incrementReconnectAttempts(): void {\n    this.#reconnectAttempts++;\n    this.#updateActivity();\n  }\n\n  resetReconnectAttempts(): void {\n    this.#reconnectAttempts = 0;\n    this.#updateActivity();\n  }\n\n  // Activity Tracking\n  get lastActivity(): number {\n    return this.#lastActivity;\n  }\n\n  #updateActivity(): void {\n    this.#lastActivity = Date.now();\n  }\n\n  // State Summary and Debugging\n  get stateSummary(): {\n    connectionState: ConnectionState;\n    channel: string | null;\n    subscriptionCount: number;\n    handlerCount: number;\n    processedMessagesCount: number;\n    pendingSubscriptionsCount: number;\n    hasError: boolean;\n    isReconnecting: boolean;\n    reconnectAttempts: number;\n    lastActivity: number;\n  } {\n    return {\n      connectionState: this.#connectionState,\n      channel: this.#channel,\n      subscriptionCount: this.subscriptionCount,\n      handlerCount: this.handlerCount,\n      processedMessagesCount: this.processedMessagesCount,\n      pendingSubscriptionsCount: this.pendingSubscriptionsCount,\n      hasError: this.hasError,\n      isReconnecting: this.#isReconnecting,\n      reconnectAttempts: this.#reconnectAttempts,\n      lastActivity: this.#lastActivity,\n    };\n  }\n\n  // Reset and Cleanup\n  reset(): void {\n    logger.info(`[${this.#connectionId}] Resetting state manager`);\n    this.#connectionState = \"idle\";\n    this.#channel = null;\n    this.#subscriptions.clear();\n    this.#processedMessages.clear();\n    this.#pendingSubscriptions.clear();\n    this.#handlers.clear();\n    this.#error = null;\n    this.#isReconnecting = false;\n    this.#reconnectAttempts = 0;\n    this.#updateActivity();\n  }\n\n  clear(): void {\n    logger.info(`[${this.#connectionId}] Clearing state manager`);\n    this.#subscriptions.clear();\n    this.#processedMessages.clear();\n    this.#pendingSubscriptions.clear();\n    this.#handlers.clear();\n    this.#error = null;\n    this.#isReconnecting = false;\n    this.#reconnectAttempts = 0;\n    this.#updateActivity();\n  }\n\n  // Debug Methods\n  get __debugState(): {\n    connectionState: ConnectionState;\n    channel: string | null;\n    subscriptions: Map<string, SubscriptionStatus>;\n    handlers: Map<string, Set<any>>;\n    processedMessages: Set<string>;\n    pendingSubscriptions: Set<string>;\n    error: Error | null;\n    isReconnecting: boolean;\n    reconnectAttempts: number;\n    lastActivity: number;\n  } {\n    return {\n      connectionState: this.#connectionState,\n      channel: this.#channel,\n      subscriptions: new Map(this.#subscriptions),\n      handlers: new Map(this.#handlers),\n      processedMessages: new Set(this.#processedMessages),\n      pendingSubscriptions: new Set(this.#pendingSubscriptions),\n      error: this.#error,\n      isReconnecting: this.#isReconnecting,\n      reconnectAttempts: this.#reconnectAttempts,\n      lastActivity: this.#lastActivity,\n    };\n  }\n}\n","import type { MessageBody } from \"@repo/schemas/messageBody\";\nimport type { PacketEnvelope } from \"@repo/schemas/packetEnvelope\";\nimport type { AckCallback, SubscriptionCallback } from \"../types\";\nimport type { PresenceHandler } from \"./Presence\";\nimport { PubSubConnection } from \"./PubSubConnection\";\nimport { StateManager } from \"./StateManager\";\nimport { logger } from \"@/internal/logger/consola\";\nimport consola from \"consola\";\n\nexport type ErebusOptions = {\n  wsUrl: string;\n  tokenProvider: (channel: string) => Promise<string>;\n  heartbeatMs?: number;\n  log?: (l: \"info\" | \"warn\" | \"error\", msg: string, meta?: unknown) => void;\n  debug?: boolean;\n};\n\nexport type Handler = (\n  payload: MessageBody,\n  meta: { topic: string; seq: string; ts: number },\n) => void;\n\n/**\n * Refactored ErebusPubSub client using modular architecture\n */\nexport class ErebusPubSubClientNew {\n  #conn: PubSubConnection;\n  #stateManager: StateManager;\n  #debug: boolean;\n\n  constructor(opts: ErebusOptions) {\n    this.#debug = opts.debug ?? false;\n    const instanceId = Math.random().toString(36).substring(2, 8);\n\n    consola.info(`[Erebus:${instanceId}] Constructor called`, {\n      wsUrl: opts.wsUrl,\n      hasTokenProvider: !!opts.tokenProvider,\n      hasCustomLog: !!opts.log,\n    });\n\n    logger.info(\"Erebus constructor called\", { opts });\n\n    this.#conn = new PubSubConnection({\n      url: opts.wsUrl,\n      tokenProvider: opts.tokenProvider,\n      channel: \"\", // Empty channel initially, will be set via joinChannel\n      heartbeatMs: opts.heartbeatMs,\n      log: opts.log,\n      onMessage: (m: PacketEnvelope) => this.#handleMessage(m),\n    });\n\n    // Initialize state manager with connection ID and set channel immediately\n    this.#stateManager = new StateManager(this.#conn.connectionId);\n    // Channel will be set via joinChannel\n\n    consola.info(`[Erebus:${instanceId}] Instance created successfully`, {\n      wsUrl: opts.wsUrl,\n    });\n    logger.info(\"Erebus instance created\", {\n      wsUrl: opts.wsUrl,\n    });\n  }\n\n  connect(timeout?: number) {\n    const instanceId = this.#conn.connectionId;\n    consola.info(`[Erebus:${instanceId}] Connect called`, { timeout });\n    logger.info(\"Erebus.connect() called\");\n\n    if (!this.#stateManager.channel) {\n      const error =\n        \"Channel must be set before connecting. Call joinChannel(channel) first.\";\n      consola.error(`[Erebus:${instanceId}] ${error}`);\n      logger.error(\"Connect failed - no channel set\");\n      throw new Error(error);\n    }\n\n    // Channel is guaranteed to be set in constructor, no need to check\n    this.#stateManager.clearProcessedMessages();\n    return this.#conn.open(timeout);\n  }\n\n  // joinChannel method removed - channel is set in constructor\n\n  /**\n   * Join a channel for this client instance\n   * @param channel The channel to join\n   */\n  joinChannel(channel: string): void {\n    const instanceId = this.#conn.connectionId;\n    consola.info(`[Erebus:${instanceId}] Joining channel`, { channel });\n    logger.info(\"Erebus.joinChannel() called\", { channel });\n\n    if (\n      !channel ||\n      typeof channel !== \"string\" ||\n      channel.trim().length === 0\n    ) {\n      const error = \"Invalid channel: must be a non-empty string\";\n      consola.error(`[Erebus:${instanceId}] ${error}`, { channel });\n      logger.error(\"Invalid channel\", { channel });\n      throw new Error(error);\n    }\n\n    // Update both state manager and connection\n    this.#stateManager.setChannel(channel);\n    this.#conn.setChannel(channel);\n\n    consola.info(`[Erebus:${instanceId}] Channel joined successfully`, {\n      channel,\n    });\n    logger.info(\"Channel joined successfully\", { channel });\n  }\n\n  subscribe(\n    topic: string,\n    handler: Handler,\n    onAck?: SubscriptionCallback,\n    timeoutMs: number = 3000,\n  ) {\n    this.subscribeWithCallback(topic, handler, onAck, timeoutMs);\n  }\n\n  subscribeWithCallback(\n    topic: string,\n    handler: Handler,\n    onAck?: SubscriptionCallback,\n    timeoutMs?: number,\n  ) {\n    const instanceId = this.#conn.connectionId;\n    consola.info(`[Erebus:${instanceId}] Subscribe called`, {\n      topic,\n      hasAckCallback: !!onAck,\n      timeout: timeoutMs,\n    });\n    logger.info(\"Erebus.subscribe() called\", { topic });\n\n    if (!this.#stateManager.channel) {\n      const error =\n        \"Channel must be set before subscribing. Call joinChannel(channel) first.\";\n      consola.error(`[Erebus:${instanceId}] ${error}`, { topic });\n      logger.error(\"Subscribe failed - no channel set\", { topic });\n      throw new Error(error);\n    }\n\n    // Channel is guaranteed to be set in constructor, no need to check\n    if (!topic || typeof topic !== \"string\" || topic.trim().length === 0) {\n      const error = \"Invalid topic: must be a non-empty string\";\n      consola.error(`[Erebus:${instanceId}] ${error}`, { topic });\n      logger.error(\"Invalid topic\", { topic });\n      throw new Error(error);\n    }\n\n    if (typeof handler !== \"function\") {\n      const error = \"Invalid handler: must be a function\";\n      consola.error(`[Erebus:${instanceId}] ${error}`);\n      logger.error(\"Invalid handler\", { handlerType: typeof handler });\n      throw new Error(error);\n    }\n\n    this.#stateManager.addHandler(topic, handler);\n    this.#stateManager.addPendingSubscription(topic);\n    this.#conn.subscribeWithCallback(topic, onAck, timeoutMs);\n  }\n\n  unsubscribe(topic: string) {\n    this.unsubscribeWithCallback(topic);\n  }\n\n  unsubscribeWithCallback(\n    topic: string,\n    onAck?: SubscriptionCallback,\n    timeoutMs?: number,\n  ) {\n    const instanceId = this.#conn.connectionId;\n    consola.info(`[Erebus:${instanceId}] Unsubscribe called`, {\n      topic,\n      hasAckCallback: !!onAck,\n      timeout: timeoutMs,\n    });\n    logger.info(\"Unsubscribe function called\", { topic });\n\n    if (!topic || typeof topic !== \"string\" || topic.trim().length === 0) {\n      const error = \"Invalid topic: must be a non-empty string\";\n      consola.error(`[Erebus:${instanceId}] ${error}`, { topic });\n      logger.error(\"Invalid topic\", { topic });\n      throw new Error(error);\n    }\n\n    const handlers = this.#stateManager.getHandlers(topic);\n    if (!handlers || handlers.size === 0) {\n      consola.warn(\n        `[Erebus:${instanceId}] No handler set found during unsubscribe`,\n        { topic },\n      );\n      logger.warn(\"No handler set found during unsubscribe\", { topic });\n      return;\n    }\n\n    this.#stateManager.clearHandlers(topic);\n    this.#stateManager.removePendingSubscription(topic);\n    this.#conn.unsubscribeWithCallback(topic, onAck, timeoutMs);\n  }\n\n  publish({\n    topic,\n    messageBody,\n  }: {\n    topic: string;\n    messageBody: string;\n  }): Promise<string> {\n    return this.#publishInternal(topic, messageBody, false);\n  }\n\n  publishWithAck({\n    topic,\n    messageBody,\n    onAck,\n    timeoutMs = 3000,\n  }: {\n    topic: string;\n    messageBody: string;\n    onAck: AckCallback;\n    timeoutMs?: number;\n  }): Promise<string> {\n    return this.#publishInternal(topic, messageBody, true, onAck, timeoutMs);\n  }\n\n  close() {\n    const instanceId = this.#conn.connectionId;\n    consola.info(`[Erebus:${instanceId}] Close called`);\n    logger.info(\"Erebus.close() called\");\n    this.#conn.close();\n  }\n\n  /**\n   * Check if all subscriptions are ready (for more accurate latency testing)\n   * In a real implementation, this would wait for server acknowledgments\n   */\n  async waitForSubscriptionReadiness(timeoutMs: number = 1000): Promise<void> {\n    const startTime = Date.now();\n\n    return new Promise((resolve, reject) => {\n      const checkReadiness = () => {\n        // In a real implementation, we'd wait for server ACKs\n        // For now, we assume subscriptions are ready after a short delay\n        if (this.#stateManager.pendingSubscriptionsCount === 0) {\n          resolve();\n          return;\n        }\n\n        if (Date.now() - startTime > timeoutMs) {\n          reject(\n            new Error(`Subscription readiness timeout after ${timeoutMs}ms`),\n          );\n          return;\n        }\n\n        setTimeout(checkReadiness, 50);\n      };\n\n      // Simulate acknowledgment after a short delay\n      setTimeout(() => {\n        this.#stateManager.clearPendingSubscriptions();\n        checkReadiness();\n      }, 100);\n    });\n  }\n\n  /**\n   * Development-only summary (counts & topics) to avoid poking at Maps in every test.\n   */\n  get __debugSummary(): {\n    handlerCount: number;\n    topics: string[];\n    counts: Record<string, number>;\n  } {\n    const instanceId = this.#conn.connectionId;\n    consola.info(`[Erebus:${instanceId}] __debugSummary getter called`);\n    logger.info(\"Erebus.__debugSummary getter called\");\n\n    const counts: Record<string, number> = {};\n    let handlerCount = 0;\n    for (const topic of this.#stateManager.getTopicsWithHandlers()) {\n      const n = this.#stateManager.getHandlerCountForTopic(topic);\n      handlerCount += n;\n      counts[topic] = n;\n      consola.info(`[Erebus:${instanceId}] Counting handlers for topic`, {\n        topic,\n        count: n,\n      });\n      logger.info(\"Counting handlers for topic\", {\n        topic,\n        count: n,\n      });\n    }\n    consola.info(`[Erebus:${instanceId}] __debugSummary returning`, {\n      handlerCount,\n      topics: Object.keys(counts),\n      counts,\n    });\n    logger.info(\"Erebus.__debugSummary returning\", {\n      handlerCount,\n      topics: Object.keys(counts),\n      counts,\n    });\n    return {\n      handlerCount,\n      topics: Object.keys(counts),\n      counts,\n    };\n  }\n\n  /**\n   * Development-only access to the underlying Connection instance.\n   * Useful for asserting lifecycle calls in tests. Treat as read-only.\n   */\n  get __debugConn(): PubSubConnection {\n    const instanceId = this.#conn.connectionId;\n    consola.info(`[Erebus:${instanceId}] __debugConn getter called`);\n    logger.info(\"Erebus.__debugConn getter called\");\n    return this.#conn;\n  }\n\n  /**\n   * Development-only object for debugging\n   */\n  get __debugObject(): {\n    conn: PubSubConnection;\n    handlers: Map<string, Set<Handler>>;\n    connectionObject: {\n      url: string;\n      state: string;\n      subs: string[];\n      bufferedAmount: number;\n    };\n    handlerCount: number;\n    topics: string[];\n    counts: Record<string, number>;\n    processedMessagesCount: number;\n  } {\n    const instanceId = this.#conn.connectionId;\n    consola.info(`[Erebus:${instanceId}] __debugObject getter called`);\n    logger.info(\"Erebus.__debugObject getter called\");\n\n    const counts: Record<string, number> = {};\n    let handlerCount = 0;\n    for (const topic of this.#stateManager.getTopicsWithHandlers()) {\n      const n = this.#stateManager.getHandlerCountForTopic(topic);\n      handlerCount += n;\n      counts[topic] = n;\n      consola.info(\n        `[Erebus:${instanceId}] Counting handlers for topic (debugObject)`,\n        {\n          topic,\n          count: n,\n        },\n      );\n      logger.info(\"Counting handlers for topic (debugObject)\", {\n        topic,\n        count: n,\n      });\n    }\n\n    // Extract connection details from the connection object\n    const connectionObject = {\n      url: this.#conn.url,\n      state: this.#conn.state,\n      subs: this.#conn.subscriptions,\n      bufferedAmount: this.#conn.bufferedAmount,\n    };\n\n    const debugObj = {\n      conn: this.#conn,\n      handlers: this.#stateManager.__debugState.handlers,\n      connectionObject,\n      handlerCount,\n      topics: Object.keys(counts),\n      counts,\n      processedMessagesCount: this.#stateManager.processedMessagesCount,\n    };\n    consola.info(`[Erebus:${instanceId}] __debugObject returning`, debugObj);\n    logger.info(\"Erebus.__debugObject returning\", debugObj);\n    return debugObj;\n  }\n\n  // Getters\n  get connectionState(): string {\n    return this.#conn.state;\n  }\n\n  get isConnected(): boolean {\n    return this.#conn.isConnected;\n  }\n\n  get channel(): string | null {\n    return this.#stateManager.channel;\n  }\n\n  get subscriptionCount(): number {\n    return this.#stateManager.subscriptionCount;\n  }\n\n  get activeTopics(): string[] {\n    return this.#stateManager.activeTopics;\n  }\n\n  get pendingSubscriptionsCount(): number {\n    return this.#stateManager.pendingSubscriptionsCount;\n  }\n\n  get processedMessagesCount(): number {\n    return this.#stateManager.processedMessagesCount;\n  }\n\n  /**\n   * Register a presence handler for a specific topic\n   * @param topic - The topic to listen for presence updates on\n   * @param handler - The callback function to handle presence updates\n   */\n  onPresence(topic: string, handler: PresenceHandler): void {\n    const instanceId = this.#conn.connectionId;\n    consola.info(`[Erebus:${instanceId}] onPresence called`, { topic });\n    logger.info(\"Erebus.onPresence() called\", { topic });\n\n    if (!topic || typeof topic !== \"string\" || topic.trim().length === 0) {\n      const error = \"Invalid topic: must be a non-empty string\";\n      consola.error(`[Erebus:${instanceId}] ${error}`, { topic });\n      logger.error(\"Invalid topic for presence\", { topic });\n      throw new Error(error);\n    }\n\n    if (typeof handler !== \"function\") {\n      const error = \"Invalid handler: must be a function\";\n      consola.error(`[Erebus:${instanceId}] ${error}`);\n      logger.error(\"Invalid presence handler\", { handlerType: typeof handler });\n      throw new Error(error);\n    }\n\n    this.#conn.onPresence(topic, handler);\n    consola.info(\n      `[Erebus:${instanceId}] Presence handler registered for topic`,\n      {\n        topic,\n      },\n    );\n    logger.info(\"Presence handler registered\", { topic });\n  }\n\n  /**\n   * Remove a presence handler for a specific topic\n   * @param topic - The topic to remove the handler from\n   * @param handler - The specific handler function to remove\n   */\n  offPresence(topic: string, handler: PresenceHandler): void {\n    const instanceId = this.#conn.connectionId;\n    consola.info(`[Erebus:${instanceId}] offPresence called`, { topic });\n    logger.info(\"Erebus.offPresence() called\", { topic });\n\n    this.#conn.offPresence(topic, handler);\n    consola.info(`[Erebus:${instanceId}] Presence handler removed for topic`, {\n      topic,\n    });\n    logger.info(\"Presence handler removed\", { topic });\n  }\n\n  /**\n   * Remove all presence handlers for a specific topic\n   * @param topic - The topic to clear all handlers for\n   */\n  clearPresenceHandlers(topic: string): void {\n    const instanceId = this.#conn.connectionId;\n    consola.info(`[Erebus:${instanceId}] clearPresenceHandlers called`, {\n      topic,\n    });\n    logger.info(\"Erebus.clearPresenceHandlers() called\", { topic });\n\n    this.#conn.clearPresenceHandlers(topic);\n    consola.info(\n      `[Erebus:${instanceId}] All presence handlers cleared for topic`,\n      {\n        topic,\n      },\n    );\n    logger.info(\"All presence handlers cleared\", { topic });\n  }\n\n  /**\n   * Get connection health information\n   */\n  get connectionHealth(): {\n    state: string;\n    isConnected: boolean;\n    isReadable: boolean;\n    isWritable: boolean;\n    channel: string | null;\n    subscriptionCount: number;\n    pendingSubscriptionsCount: number;\n    processedMessagesCount: number;\n    connectionDetails: {\n      state: string;\n      isConnected: boolean;\n      isReadable: boolean;\n      isWritable: boolean;\n      channel: string;\n      subscriptionCount: number;\n      readyState: number | undefined;\n      bufferedAmount: number;\n      connectionId: string;\n      url: string;\n    };\n  } {\n    return {\n      state: this.connectionState,\n      isConnected: this.isConnected,\n      isReadable: this.isReadable,\n      isWritable: this.isWritable,\n      channel: this.channel,\n      subscriptionCount: this.subscriptionCount,\n      pendingSubscriptionsCount: this.pendingSubscriptionsCount,\n      processedMessagesCount: this.processedMessagesCount,\n      connectionDetails: {\n        state: this.#conn.state,\n        isConnected: this.#conn.isConnected,\n        isReadable: this.#conn.isReadable,\n        isWritable: this.#conn.isWritable,\n        channel: this.#conn.channel,\n        subscriptionCount: this.#conn.subscriptionCount,\n        readyState: this.#conn.readyState,\n        bufferedAmount: this.#conn.bufferedAmount,\n        connectionId: this.#conn.connectionId,\n        url: this.#conn.url,\n      },\n    };\n  }\n\n  /**\n   * Check if the connection is readable (can receive messages)\n   */\n  get isReadable(): boolean {\n    return this.#conn.isReadable;\n  }\n\n  /**\n   * Check if the connection is writable (can send messages)\n   */\n  get isWritable(): boolean {\n    return this.#conn.isWritable;\n  }\n\n  #publishInternal(\n    topic: string,\n    messageBody: string,\n    withAck: boolean = false,\n    onAck?: AckCallback,\n    timeoutMs?: number,\n  ): Promise<string> {\n    // Validation logic here (same as original)\n    if (!this.#stateManager.channel) {\n      throw new Error(\n        \"Channel must be set before publishing. Call joinChannel(channel) first.\",\n      );\n    }\n\n    // Channel is guaranteed to be set in constructor, no need to check\n    if (!topic || typeof topic !== \"string\" || topic.trim().length === 0) {\n      throw new Error(\"Invalid topic: must be a non-empty string\");\n    }\n\n    if (typeof messageBody !== \"string\") {\n      throw new Error(\"Invalid messageBody: must be a string\");\n    }\n\n    if (withAck && !onAck) {\n      throw new Error(\"ACK callback is required when using publishWithAck\");\n    }\n\n    // Generate message payload\n    const clientMsgId =\n      typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\"\n        ? crypto.randomUUID()\n        : `msg_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;\n\n    const actualMessageBody: MessageBody = {\n      id: \"TO_BE_SAT\",\n      topic,\n      senderId: \"TO_BE_SAT\",\n      seq: \"TO_BE_SAT\",\n      sentAt: new Date(),\n      payload: messageBody,\n      clientMsgId,\n      clientPublishTs: Date.now(),\n    };\n\n    return new Promise<string>((resolve, reject) => {\n      try {\n        if (withAck && onAck && timeoutMs) {\n          this.#conn.publishWithAck(actualMessageBody, onAck, timeoutMs);\n        } else {\n          this.#conn.publish(actualMessageBody);\n        }\n        resolve(clientMsgId);\n      } catch (error) {\n        reject(error);\n      }\n    });\n  }\n\n  #handleMessage(m: PacketEnvelope): void {\n    const instanceId = this.#conn.connectionId;\n    if (m.packetType !== \"publish\") {\n      if (this.#debug) {\n        consola.info(`[Erebus:${instanceId}] Ignoring non-message packetType`, {\n          packetType: m.packetType,\n        });\n      }\n      return;\n    }\n\n    const messageId = m.payload?.id || \"unknown\";\n\n    // Check for duplicate messages\n    if (this.#stateManager.isMessageProcessed(messageId)) {\n      if (this.#debug) {\n        consola.info(`[Erebus:${instanceId}] Skipping duplicate message`, {\n          messageId:\n            messageId.length > 8\n              ? `${messageId.substring(0, 4)}...${messageId.substring(messageId.length - 4)}`\n              : messageId,\n          topic: m.payload?.topic,\n        });\n      }\n      return;\n    }\n\n    this.#stateManager.addProcessedMessage(messageId);\n\n    const handlers = this.#stateManager.getHandlers(m.payload?.topic || \"\");\n    if (!handlers || handlers.size === 0) {\n      if (this.#debug) {\n        consola.warn(`[Erebus:${instanceId}] No handlers found for topic`, {\n          topic: m.payload?.topic,\n        });\n      }\n      return;\n    }\n\n    for (const fn of handlers) {\n      try {\n        fn(m.payload!, {\n          topic: m.payload!.topic,\n          seq: m.payload!.seq,\n          ts: m.payload!.sentAt.getTime(),\n        });\n      } catch (error) {\n        if (this.#debug) {\n          consola.error(\n            `[Erebus:${this.#conn.connectionId}] Error in message handler`,\n            {\n              error,\n              topic: m.payload?.topic,\n              messageId,\n            },\n          );\n        }\n      }\n    }\n  }\n}\n","import { ErebusError } from \"@/internal/error\";\nimport { Authorize } from \"./authorize\";\nimport { ErebusPubSubClientNew as ErebusPubSubClient } from \"./pubsub/ErebusPubSubClient\";\nexport enum ErebusClientState {\n  PubSub,\n}\n\nexport interface ErebusClientOptions {\n  client: ErebusClientState;\n  grantCacheLayer?: () => Promise<string | undefined>;\n  cacheGrant?: (grant: string) => void;\n  authBaseUrl: string;\n  wsBaseUrl?: string;\n}\n\nexport class ErebusClient {\n  static async createClient(\n    opts: ErebusClientOptions,\n  ): Promise<ErebusPubSubClient> {\n    switch (opts.client) {\n      case ErebusClientState.PubSub:\n        const pubSubClient = new ErebusPubSubClient({\n          wsUrl: opts.wsBaseUrl\n            ? `${opts.wsBaseUrl}/v1/pubsub`\n            : \"wss://gateway.erebus.sh/v1/pubsub\",\n          tokenProvider: async (channel: string) => {\n            const authorize = new Authorize(opts.authBaseUrl);\n            return await authorize.generateToken(channel);\n          },\n        });\n\n        return pubSubClient;\n      default:\n        throw new ErebusError(\"Invalid client state\");\n    }\n  }\n\n  static createClientSync(opts: ErebusClientOptions): ErebusPubSubClient {\n    switch (opts.client) {\n      case ErebusClientState.PubSub:\n        const pubSubClient = new ErebusPubSubClient({\n          wsUrl: opts.wsBaseUrl\n            ? `${opts.wsBaseUrl}/v1/pubsub`\n            : \"wss://gateway.erebus.sh/v1/pubsub\",\n          tokenProvider: (channel: string) => {\n            const authorize = new Authorize(opts.authBaseUrl);\n\n            // If the user provided a grant cache layer, we call it.\n            if (opts.grantCacheLayer) {\n              const grantPromise = opts.grantCacheLayer();\n              // grantCacheLayer returns a Promise<string | undefined>\n              return grantPromise.then((grant) => {\n                if (grant) {\n                  return grant;\n                }\n                // If no grant, just call the default token provider\n                return authorize.generateToken(channel);\n              });\n            }\n\n            // This will return a Promise<string>\n            const token = authorize.generateToken(channel).then((token) => {\n              if (opts.cacheGrant) {\n                opts.cacheGrant(token);\n              }\n              return token;\n            });\n            return token;\n          },\n        });\n\n        return pubSubClient;\n      default:\n        throw new ErebusError(\"Invalid client state\");\n    }\n  }\n}\n","\"use client\";\n\nimport type { ErebusPubSubClient } from \"@/client/core/pubsub\";\nimport { ErebusContext } from \"../context/ErebusContext\";\nimport type { ReactNode } from \"react\";\nimport { ErebusClient, ErebusClientState } from \"@/client/core/Erebus\";\n\ninterface ErebusProviderProps {\n  children: ReactNode;\n  authBaseUrl: string;\n  wsBaseUrl?: string;\n}\n\nexport function ErebusProvider({\n  children,\n  authBaseUrl,\n  wsBaseUrl,\n}: ErebusProviderProps) {\n  // Factory: each call gives you a new client bound to a channel\n  const makeClient = (): ErebusPubSubClient => {\n    return ErebusClient.createClientSync({\n      client: ErebusClientState.PubSub,\n      authBaseUrl,\n      wsBaseUrl,\n    });\n  };\n  return (\n    <ErebusContext.Provider value={{ makeClient }}>\n      {children}\n    </ErebusContext.Provider>\n  );\n}\n","\"use client\";\n\nimport { useErebus } from \"../context/ErebusContext\";\nimport { ErebusError } from \"@/internal/error\";\nimport { TopicContext } from \"../context/TopicContext\";\nimport React from \"react\";\n\ntype Props<K extends string> = {\n  children: React.ReactNode;\n  topic: K;\n};\n\nexport function TopicProvider<K extends string>({ children, topic }: Props<K>) {\n  const { makeClient } = useErebus();\n  const client = makeClient();\n\n  if (!client) {\n    throw new ErebusError(\"TopicProvider must be used within a ErebusProvider\");\n  }\n\n  return (\n    <TopicContext.Provider value={{ topic, client }}>\n      {children}\n    </TopicContext.Provider>\n  );\n}\n","import { logger } from \"@/internal/logger/consola\";\nimport type { AckPacketType } from \"@repo/schemas/packetEnvelope\";\n\nexport type ErebusOptions = {\n  wsUrl: string; // wss://...\n  tokenProvider: () => Promise<string> | string; // calls EREBUS_GRANT_URL\n  heartbeatMs?: number; // default 25_000\n  log?: (l: \"info\" | \"warn\" | \"error\", msg: string, meta?: unknown) => void;\n};\n\nexport type MessageMeta = {\n  topic: string;\n  seq?: string;\n  ts?: number;\n  region?: string;\n};\n\nexport type Unsubscribe = () => void;\n\n/**\n * ACK response for successful operations\n */\nexport type AckSuccess = {\n  success: true;\n  ack: AckPacketType;\n  seq: string;\n  serverMsgId: string;\n  topic: string;\n};\n\n/**\n * ACK response for failed operations\n */\nexport type AckError = {\n  success: false;\n  ack: AckPacketType;\n  error: {\n    code: string;\n    message: string;\n  };\n  topic: string;\n};\n\n/**\n * Combined ACK response type\n */\nexport type AckResponse = AckSuccess | AckError;\n\n/**\n * Callback function for ACK responses\n */\nexport type AckCallback = (response: AckResponse) => void;\n\n/**\n * Subscription response for successful operations\n */\nexport type SubscriptionSuccess = {\n  success: true;\n  ack: AckPacketType;\n  topic: string;\n  status: \"subscribed\" | \"unsubscribed\";\n  path: \"subscribe\" | \"unsubscribe\";\n};\n\n/**\n * Subscription response for failed operations\n */\nexport type SubscriptionError = {\n  success: false;\n  ack?: AckPacketType;\n  error: {\n    code: string;\n    message: string;\n  };\n  topic: string;\n  path: \"subscribe\" | \"unsubscribe\";\n};\n\n/**\n * Combined subscription response type\n */\nexport type SubscriptionResponse = SubscriptionSuccess | SubscriptionError;\n\n/**\n * Callback function for subscription responses\n */\nexport type SubscriptionCallback = (response: SubscriptionResponse) => void;\n\n/**\n * Pending publish request tracking\n */\nexport type PendingPublish = {\n  requestId: string;\n  clientMsgId: string;\n  topic: string;\n  callback: AckCallback;\n  timestamp: number;\n  timeoutId?: NodeJS.Timeout;\n};\n\n/**\n * Pending subscription request tracking\n */\nexport type PendingSubscription = {\n  requestId: string;\n  clientMsgId?: string;\n  topic: string;\n  path: \"subscribe\" | \"unsubscribe\";\n  callback: SubscriptionCallback;\n  timestamp: number;\n  timeoutId?: NodeJS.Timeout;\n};\n\nexport function logTypeInfo(label: string, value: unknown) {\n  logger.info(\"type info\", { label, valueType: typeof value });\n}\n\nexport type Presence = {\n  clientId: string;\n  topic: string;\n  status: \"online\" | \"offline\";\n  timestamp: number;\n  subscribers?: string[]; // Optional array of subscriber client IDs (for enriched self presence)\n};\n","import { Hono } from \"hono\";\nimport { logger } from \"@/internal/logger/consola\";\n\nimport { serve } from \"@hono/node-server\";\nimport { ErebusSession } from \"@/service/session\";\nimport { zValidator } from \"@hono/zod-validator\";\nimport { z } from \"zod\";\n\nexport type AppVars = {\n  reqId: string;\n  session?: ErebusSession;\n};\n\ntype SessionProvider = (req: Request) => ErebusSession | Promise<ErebusSession>;\n\nexport function createApp(sessionOrProvider?: ErebusSession | SessionProvider) {\n  const app = new Hono<{ Variables: AppVars }>();\n\n  app.onError((err, c) => {\n    logger.error(\"[unhandled]\", {\n      reqId: c.get(\"reqId\"),\n      err:\n        err instanceof Error\n          ? { name: err.name, message: err.message, stack: err.stack }\n          : err,\n      path: c.req.path,\n      method: c.req.method,\n    });\n    return c.json({ error: \"internal_error\", reqId: c.get(\"reqId\") }, 500);\n  });\n\n  app.notFound((c) => {\n    return c.json(\n      { error: \"not_found\", path: c.req.path, reqId: c.get(\"reqId\") },\n      404,\n    );\n  });\n\n  app.use(\"*\", async (c, next) => {\n    /**\n     * Generate a unique request id for the request to be identified by the logger\n     */\n    const reqId = crypto.randomUUID();\n    c.set(\"reqId\", reqId);\n\n    /**\n     * Inject session if provided\n     */\n    if (sessionOrProvider) {\n      if (typeof sessionOrProvider === \"function\") {\n        // It's a session provider - call it per request\n        const session = await sessionOrProvider(c.req.raw);\n        c.set(\"session\", session);\n      } else {\n        // It's a static session (for route handler usage)\n        c.set(\"session\", sessionOrProvider);\n      }\n    }\n\n    /**\n     * Log the request start time\n     */\n    const started = performance.now();\n    try {\n      await next();\n    } finally {\n      const ms = Math.round(performance.now() - started);\n      logger.info(`[${reqId}] ${c.req.method} ${c.req.path} -> ${ms}ms`);\n    }\n  });\n\n  // Add the routes using the shared routes function\n  return app.route(\"/\", routes);\n}\n\n// Define routes separately for RPC type inference\nconst routes = new Hono<{ Variables: AppVars }>()\n  /**\n   * Health check route\n   */\n  .get(\"/api/health-not-meaningful\", (c) =>\n    c.json({ ok: true, reqId: c.get(\"reqId\") }),\n  )\n  /**\n   * Generate a token route test\n   */\n  .get(\"/api/generate-token-test\", (c) => {\n    const session = c.get(\"session\");\n    if (!session) {\n      return c.json(\n        {\n          error: \"session_required, the server is not initialized properly\",\n          reqId: c.get(\"reqId\"),\n        },\n        400,\n      );\n    }\n\n    console.log(session.__debugObject);\n\n    logger.info(`[${c.get(\"reqId\")}] Generating token`);\n    return c.json({\n      token: \"test\",\n    });\n  })\n  /**\n   * This is the API to generate the token for the client\n   * it calls Erebus service to generate the token\n   */\n  .post(\n    \"/api/generate-token\",\n    zValidator(\n      \"json\",\n      z.object({\n        channel: z.string(),\n      }),\n    ),\n    async (c) => {\n      const session = c.get(\"session\");\n      const reqId = c.get(\"reqId\");\n      logger.info(`[${reqId}] Generating token`);\n\n      if (!session) {\n        return c.json(\n          {\n            error: \"session_required, the server is not initialized properly\",\n            reqId,\n          },\n          400,\n        );\n      }\n      let token = \"\"; // default value to avoid undefined\n      try {\n        token = await session.authorize();\n      } catch (error) {\n        logger.error(\n          `[${reqId}] Error generating token: ${error instanceof Error ? error.message : \"Unknown error\"}`,\n        );\n        return c.json(\n          {\n            error: \"error_generating_token\",\n            reqId,\n            message: error instanceof Error ? error.message : \"Unknown error\",\n          },\n          500,\n        );\n      }\n\n      return c.json({\n        grant_jwt: token,\n      });\n    },\n  );\n\n// Export the AppType for RPC client usage\nexport type AppType = typeof routes;\n\nexport type AuthorizeServer = (\n  req: Request,\n) => ErebusSession | Promise<ErebusSession>;\n\nexport const startAuthServer = async (\n  port: number,\n  authorize: AuthorizeServer,\n) => {\n  const app = createApp(authorize);\n  logger.info(`Attempting to start server on port ${port}...`);\n  const server = serve({\n    fetch: app.fetch,\n    port,\n  });\n  server.on(\"listening\", () => {\n    logger.info(`Server successfully started and is running on port ${port}`);\n  });\n  server.on(\"error\", (err: Error) => {\n    logger.error(`Server failed to start on port ${port}: ${err.message}`);\n  });\n  return server;\n};\n","import { handle } from \"hono/vercel\";\nimport { createApp } from \"@/server/app\";\nimport type { ErebusSession } from \"@/service/session\";\n\nexport type Authorize = (\n  channel: string,\n  ctx?: { req: Request },\n) => ErebusSession | Promise<ErebusSession>;\n\nexport function createRouteHandler({ authorize }: { authorize: Authorize }) {\n  const createHandler = async (req: Request): Promise<Response> => {\n    let channel = \"\";\n\n    try {\n      const body = (await req.clone().json()) as { channel?: unknown };\n      if (typeof body.channel === \"string\") {\n        channel = body.channel;\n      }\n    } catch {\n      // If parsing fails, channel remains empty\n    }\n\n    const session = await authorize(channel, { req });\n\n    // Create a new app instance with the session injected\n    const app = createApp(session);\n\n    const h = handle(app);\n    return await h(req);\n  };\n\n  return {\n    POST: createHandler,\n  };\n}\n"]}