{"version":3,"sources":["../src/browser/runtime.ts"],"names":["generateId"],"mappings":"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","file":"chunk-CR5B6FHB.cjs","sourcesContent":["import { generateId } from \"../core/utils\";\nimport type { Message, StreamEvent } from \"../types\";\n\nconst DEFAULT_SESSION_MAX_AGE_SECONDS = 24 * 60 * 60;\nconst MAX_SESSION_MAX_AGE_SECONDS = 30 * 24 * 60 * 60;\nconst DEFAULT_VISITOR_MAX_AGE_SECONDS = 90 * 24 * 60 * 60;\nconst MAX_VISITOR_MAX_AGE_SECONDS = 90 * 24 * 60 * 60;\nconst TOKEN_REFRESH_SKEW_MS = 30_000;\n\nexport type BrowserRuntimeEvent =\n  | { type: \"session.created\" | \"session.resumed\" | \"session.cleared\"; sessionId?: string }\n  | { type: \"message.started\"; idempotencyKey: string }\n  | { type: \"message.completed\"; idempotencyKey: string; executionId?: string }\n  | { type: \"message.failed\"; idempotencyKey: string; error: BrowserChatError }\n  | { type: \"feedback.submitted\"; executionId: string; value: 1 | -1 }\n  | { type: \"token.refreshed\"; expiresAt: number };\n\nexport interface BrowserMessageContext {\n  [key: string]: unknown;\n}\n\nexport interface BrowserRuntimeMessage {\n  /** Text stored in chat history and displayed after a resume. */\n  content: string;\n  /** Structured, untrusted page context supplied separately to the agent. */\n  context?: BrowserMessageContext;\n  /** Stable key used when the same request must be retried. */\n  idempotencyKey?: string;\n}\n\nexport interface BrowserRuntimeConfig {\n  /** Public browser-only API key. Never pass a management/provider key. */\n  apiKey: string;\n  agentId: string;\n  baseUrl?: string;\n  workspaceId?: string;\n  title?: string;\n  metadata?: Record<string, unknown>;\n  /** Enable anonymous visitor attribution across browser chat sessions. Defaults to false. */\n  visitorTracking?: boolean;\n  /** Optional anonymous end-user ID used only for trace attribution. */\n  visitorId?: string;\n  /** Maximum lifetime of the browser visitor ID in seconds. Defaults to 90 days. */\n  visitorMaxAge?: number;\n  persistSession?: boolean;\n  sessionMaxAge?: number;\n  /** Override the localStorage namespace without changing authorization. */\n  storageKey?: string;\n  /** Coordinates one resumable session between same-origin tabs. Defaults to true. */\n  coordinateTabs?: boolean;\n  /** Host-owned observability hook; the runtime never sends analytics elsewhere. */\n  onEvent?: (event: BrowserRuntimeEvent) => void;\n}\n\nexport interface BrowserSessionSnapshot {\n  sessionId: string;\n  resumeToken: string;\n  lastActivityAt: number;\n}\n\nexport interface BrowserSessionResponse {\n  id?: string;\n  session_id?: string;\n  agent_id?: string;\n  title?: string;\n  resume_token?: string;\n  visitor_id?: string;\n  created_at?: string;\n}\n\ninterface BrowserMessageResponse {\n  id?: string;\n  role?: string;\n  content?: string;\n  created_at?: string;\n  metadata?: Record<string, unknown>;\n}\n\ninterface ApiEnvelope<T> {\n  data?: T;\n  error?: string | { message?: string };\n  message?: string;\n}\n\ninterface SessionBroadcast {\n  source: string;\n  type: \"session\" | \"clear\";\n  snapshot?: BrowserSessionSnapshot;\n}\n\nexport class BrowserChatError extends Error {\n  constructor(\n    message: string,\n    readonly status: number,\n    readonly retryable = status === 0 || status === 408 || status === 429 || status >= 500,\n  ) {\n    super(message);\n    this.name = \"BrowserChatError\";\n  }\n}\n\nexport interface BrowserChatRuntime {\n  readonly sessionId: string;\n  createSession(title?: string): Promise<BrowserSessionResponse>;\n  hydrate(): Promise<Message[]>;\n  listMessages(): Promise<Message[]>;\n  sendMessageStream(\n    message: BrowserRuntimeMessage,\n    signal?: AbortSignal,\n  ): AsyncGenerator<StreamEvent>;\n  newSession(): Promise<void>;\n  /** Forget the cross-session visitor identity without affecting the active chat. */\n  clearVisitor(): void;\n  submitFeedback(executionId: string, value: 1 | -1): Promise<void>;\n  disconnect(): void;\n}\n\nfunction cleanBase(value: string): string {\n  return value.trim().replace(/\\/+$/, \"\");\n}\n\nfunction apiError(status: number, payload: ApiEnvelope<unknown>): BrowserChatError {\n  const detail =\n    typeof payload.error === \"string\"\n      ? payload.error\n      : payload.error?.message || payload.message || `Request failed (${status}).`;\n  return new BrowserChatError(detail, status);\n}\n\nfunction sessionIsValid(value: Partial<BrowserSessionSnapshot>, maxAgeMs: number): boolean {\n  const age = Date.now() - Number(value.lastActivityAt);\n  return (\n    typeof value.sessionId === \"string\" &&\n    /^[0-9A-Za-z]{27}$/.test(value.sessionId) &&\n    typeof value.resumeToken === \"string\" &&\n    value.resumeToken.length >= 32 &&\n    Number.isFinite(age) &&\n    age >= 0 &&\n    age <= maxAgeMs\n  );\n}\n\nfunction visitorIDIsValid(value: unknown): value is string {\n  return typeof value === \"string\" && /^[0-9A-Za-z]{27}$/.test(value);\n}\n\nfunction messageFromApi(item: BrowserMessageResponse): Message | null {\n  if (item.role !== \"user\" && item.role !== \"assistant\" && item.role !== \"system\") return null;\n  return {\n    id: item.id || generateId(),\n    role: item.role,\n    content: typeof item.content === \"string\" ? item.content : \"\",\n    status: \"complete\",\n    createdAt: item.created_at ? new Date(item.created_at) : new Date(),\n    metadata: item.metadata,\n    executionId:\n      typeof item.metadata?.execution_id === \"string\" ? item.metadata.execution_id : undefined,\n  };\n}\n\nfunction decodeEvent(eventName: string, data: Record<string, unknown>): StreamEvent | null {\n  switch (eventName) {\n    case \"error\":\n      return { type: \"error\", error: String(data.message || data.error || \"Stream error\") };\n    case \"execution\":\n      return { type: \"execution\", executionId: String(data.execution_id || \"\") };\n    case \"content\":\n      return { type: \"content\", content: String(data.content || \"\") };\n    case \"thinking\":\n      return { type: \"thinking\", thinking: String(data.content || \"\") };\n    case \"tool_start\":\n      return {\n        type: \"tool_start\",\n        toolCallId: String(data.id || \"\"),\n        toolName: String(data.name || \"\"),\n      };\n    case \"tool_end\":\n      return {\n        type: \"tool_end\",\n        toolCallId: String(data.id || \"\"),\n        toolName: String(data.name || \"\"),\n        toolSummary: String(data.summary || \"\"),\n      };\n    case \"ui\":\n      return { type: \"ui\", ui: data };\n    case \"done\":\n    case \"complete\":\n      return { type: \"done\", output: data.output ?? data.result ?? data };\n    default:\n      return null;\n  }\n}\n\nasync function* readSSE(response: Response): AsyncGenerator<StreamEvent> {\n  if (!response.body) throw new BrowserChatError(\"Streaming response body is unavailable.\", 502);\n  const reader = response.body.getReader();\n  const decoder = new TextDecoder();\n  let buffer = \"\";\n\n  try {\n    while (true) {\n      const { value, done } = await reader.read();\n      buffer += decoder.decode(value || new Uint8Array(), { stream: !done });\n      const blocks = buffer.split(/\\r?\\n\\r?\\n/);\n      buffer = blocks.pop() || \"\";\n      for (const block of blocks) {\n        const eventName = block.match(/^event:\\s*(.+)$/m)?.[1]?.trim() || \"message\";\n        const raw = block\n          .split(/\\r?\\n/)\n          .filter((line) => line.startsWith(\"data:\"))\n          .map((line) => line.slice(5).trim())\n          .join(\"\\n\");\n        if (!raw) continue;\n        let data: Record<string, unknown>;\n        try {\n          data = JSON.parse(raw) as Record<string, unknown>;\n        } catch {\n          if (eventName === \"content\") yield { type: \"content\", content: raw };\n          continue;\n        }\n        const event = decodeEvent(eventName, data);\n        if (event) yield event;\n      }\n      if (done) break;\n    }\n  } finally {\n    reader.releaseLock();\n  }\n}\n\nexport function createBrowserChatRuntime(config: BrowserRuntimeConfig): BrowserChatRuntime {\n  if (!config.apiKey) throw new Error(\"@promptrails/ai-chat: browser apiKey is required.\");\n  if (!config.agentId) throw new Error(\"@promptrails/ai-chat: agentId is required.\");\n\n  const requestedMaxAge = Number(config.sessionMaxAge);\n  const sessionMaxAge =\n    Number.isFinite(requestedMaxAge) && requestedMaxAge > 0\n      ? Math.min(Math.floor(requestedMaxAge), MAX_SESSION_MAX_AGE_SECONDS)\n      : DEFAULT_SESSION_MAX_AGE_SECONDS;\n  const requestedVisitorMaxAge = Number(config.visitorMaxAge);\n  const visitorMaxAge =\n    Number.isFinite(requestedVisitorMaxAge) && requestedVisitorMaxAge > 0\n      ? Math.min(Math.floor(requestedVisitorMaxAge), MAX_VISITOR_MAX_AGE_SECONDS)\n      : DEFAULT_VISITOR_MAX_AGE_SECONDS;\n  const apiUrl = `${cleanBase(config.baseUrl || \"https://api.promptrails.ai\")}/api/v1`;\n  const storageKey =\n    config.storageKey ||\n    `promptrails-chat-widget:${config.workspaceId || \"default\"}:${config.agentId}`;\n  const visitorStorageKey = `${storageKey}:visitor`;\n  const source = generateId();\n  const listeners = new Set<(event: BrowserRuntimeEvent) => void>();\n\n  let sessionId = \"\";\n  let resumeToken = \"\";\n  let visitorId =\n    config.visitorTracking === true && visitorIDIsValid(config.visitorId) ? config.visitorId : \"\";\n  let visitorCreatedAt = visitorId ? Date.now() : 0;\n  let accessToken = \"\";\n  let accessTokenExpiresAt = 0;\n  let tokenPromise: Promise<string> | null = null;\n  let sessionPromise: Promise<string> | null = null;\n  let channel: BroadcastChannel | null = null;\n\n  const emit = (event: BrowserRuntimeEvent) => {\n    config.onEvent?.(event);\n    listeners.forEach((listener) => listener(event));\n  };\n\n  function storage(): Storage | null {\n    if (config.persistSession === false || typeof window === \"undefined\") return null;\n    try {\n      return window.localStorage;\n    } catch {\n      return null;\n    }\n  }\n\n  function visitorStorage(): Storage | null {\n    if (typeof window === \"undefined\") return null;\n    try {\n      return window.localStorage;\n    } catch {\n      return null;\n    }\n  }\n\n  function restoreVisitor(): void {\n    if (config.visitorTracking !== true || visitorId) return;\n    try {\n      const raw = visitorStorage()?.getItem(visitorStorageKey);\n      if (!raw) return;\n      const saved = JSON.parse(raw) as { visitorId?: string; createdAt?: number };\n      const age = Date.now() - Number(saved.createdAt);\n      if (\n        visitorIDIsValid(saved.visitorId) &&\n        Number.isFinite(age) &&\n        age >= 0 &&\n        age <= visitorMaxAge * 1000\n      ) {\n        visitorId = saved.visitorId;\n        visitorCreatedAt = Number(saved.createdAt);\n      } else {\n        visitorStorage()?.removeItem(visitorStorageKey);\n      }\n    } catch {\n      try {\n        visitorStorage()?.removeItem(visitorStorageKey);\n      } catch {\n        // Persistence is optional.\n      }\n    }\n  }\n\n  function persistVisitor(): void {\n    if (config.visitorTracking !== true || !visitorId) return;\n    try {\n      if (!visitorCreatedAt) visitorCreatedAt = Date.now();\n      visitorStorage()?.setItem(\n        visitorStorageKey,\n        JSON.stringify({ visitorId, createdAt: visitorCreatedAt }),\n      );\n    } catch {\n      // Persistence is optional.\n    }\n  }\n\n  function snapshot(): BrowserSessionSnapshot | null {\n    if (!sessionId || !resumeToken) return null;\n    return { sessionId, resumeToken, lastActivityAt: Date.now() };\n  }\n\n  function broadcast(type: SessionBroadcast[\"type\"], next?: BrowserSessionSnapshot): void {\n    channel?.postMessage({ source, type, snapshot: next } satisfies SessionBroadcast);\n  }\n\n  function clearPersistedSession(notify = true): void {\n    try {\n      storage()?.removeItem(storageKey);\n    } catch {\n      // Persistence is optional.\n    }\n    if (notify) broadcast(\"clear\");\n  }\n\n  function persist(notify = true): void {\n    const next = snapshot();\n    if (!next) return;\n    try {\n      storage()?.setItem(storageKey, JSON.stringify(next));\n    } catch {\n      // Persistence is optional.\n    }\n    if (notify) broadcast(\"session\", next);\n  }\n\n  function restore(): boolean {\n    try {\n      const raw = storage()?.getItem(storageKey);\n      if (!raw) return false;\n      const parsed = JSON.parse(raw) as Partial<BrowserSessionSnapshot> & { chatId?: string };\n      const saved = { ...parsed, sessionId: parsed.sessionId || parsed.chatId };\n      if (!sessionIsValid(saved, sessionMaxAge * 1000)) {\n        clearPersistedSession();\n        return false;\n      }\n      sessionId = String(saved.sessionId);\n      resumeToken = String(saved.resumeToken);\n      persist();\n      return true;\n    } catch {\n      clearPersistedSession();\n      return false;\n    }\n  }\n\n  if (\n    config.coordinateTabs !== false &&\n    config.persistSession !== false &&\n    typeof BroadcastChannel !== \"undefined\"\n  ) {\n    channel = new BroadcastChannel(`${storageKey}:channel`);\n    channel.onmessage = (event: MessageEvent<SessionBroadcast>) => {\n      const message = event.data;\n      if (!message || message.source === source) return;\n      if (message.type === \"clear\") {\n        sessionId = \"\";\n        resumeToken = \"\";\n        clearPersistedSession(false);\n        emit({ type: \"session.cleared\" });\n      } else if (message.snapshot && sessionIsValid(message.snapshot, sessionMaxAge * 1000)) {\n        sessionId = message.snapshot.sessionId;\n        resumeToken = message.snapshot.resumeToken;\n        persist(false);\n        emit({ type: \"session.resumed\", sessionId });\n      }\n    };\n  }\n\n  async function ensureAccessToken(force = false): Promise<string> {\n    if (!force && accessToken && Date.now() < accessTokenExpiresAt - TOKEN_REFRESH_SKEW_MS) {\n      return accessToken;\n    }\n    if (!force && tokenPromise) return tokenPromise;\n\n    tokenPromise = (async () => {\n      let response: Response;\n      try {\n        response = await fetch(`${apiUrl}/browser/chat/token`, {\n          method: \"POST\",\n          mode: \"cors\",\n          credentials: \"omit\",\n          headers: {\n            Accept: \"application/json\",\n            \"Content-Type\": \"application/json\",\n            \"X-API-Key\": config.apiKey,\n          },\n          body: JSON.stringify({ agent_id: config.agentId }),\n        });\n      } catch (error) {\n        throw new BrowserChatError(error instanceof Error ? error.message : \"Network error.\", 0);\n      }\n      const payload = (await response.json().catch(() => ({}))) as ApiEnvelope<{\n        access_token?: string;\n        expires_in?: number;\n      }>;\n      if (!response.ok) throw apiError(response.status, payload);\n      accessToken = String(payload.data?.access_token || \"\");\n      accessTokenExpiresAt = Date.now() + (Number(payload.data?.expires_in) || 900) * 1000;\n      if (!accessToken) throw new BrowserChatError(\"Temporary chat token was not returned.\", 502);\n      emit({ type: \"token.refreshed\", expiresAt: accessTokenExpiresAt });\n      return accessToken;\n    })();\n\n    try {\n      return await tokenPromise;\n    } finally {\n      tokenPromise = null;\n    }\n  }\n\n  async function request<T>(\n    path: string,\n    options: RequestInit = {},\n    retry = true,\n  ): Promise<ApiEnvelope<T>> {\n    const token = await ensureAccessToken();\n    let response: Response;\n    try {\n      response = await fetch(`${apiUrl}${path}`, {\n        mode: \"cors\",\n        credentials: \"omit\",\n        ...options,\n        headers: {\n          Accept: \"application/json\",\n          Authorization: `Bearer ${token}`,\n          ...(sessionId && resumeToken ? { \"X-Chat-Resume-Token\": resumeToken } : {}),\n          ...(options.body ? { \"Content-Type\": \"application/json\" } : {}),\n          ...options.headers,\n        },\n      });\n    } catch (error) {\n      throw new BrowserChatError(error instanceof Error ? error.message : \"Network error.\", 0);\n    }\n    const payload = (await response.json().catch(() => ({}))) as ApiEnvelope<T>;\n    if (response.status === 401 && retry) {\n      await ensureAccessToken(true);\n      return request<T>(path, options, false);\n    }\n    if (!response.ok) throw apiError(response.status, payload);\n    return payload;\n  }\n\n  async function ensureSession(): Promise<string> {\n    if (sessionId && resumeToken) return sessionId;\n    if (sessionPromise) return sessionPromise;\n    sessionPromise = (async () => {\n      if (visitorId && visitorCreatedAt && Date.now() - visitorCreatedAt > visitorMaxAge * 1000) {\n        visitorId = \"\";\n        visitorCreatedAt = 0;\n        try {\n          visitorStorage()?.removeItem(visitorStorageKey);\n        } catch {\n          // Persistence is optional.\n        }\n      }\n      restoreVisitor();\n      const payload = await request<BrowserSessionResponse>(\"/browser/chat/sessions\", {\n        method: \"POST\",\n        body: JSON.stringify({\n          agent_id: config.agentId,\n          title: config.title || \"Website chat\",\n          metadata: config.metadata || { channel: \"browser_widget\" },\n          ...(config.visitorTracking === true ? { visitor_tracking: true } : {}),\n          ...(visitorId ? { visitor_id: visitorId } : {}),\n        }),\n      });\n      sessionId = String(payload.data?.id || payload.data?.session_id || \"\");\n      resumeToken = String(payload.data?.resume_token || \"\");\n      const returnedVisitorID = payload.data?.visitor_id;\n      if (config.visitorTracking === true && visitorIDIsValid(returnedVisitorID)) {\n        visitorId = returnedVisitorID;\n        persistVisitor();\n      }\n      if (!sessionId || !resumeToken) {\n        throw new BrowserChatError(\"Chat session could not be created.\", 502);\n      }\n      persist();\n      emit({ type: \"session.created\", sessionId });\n      return sessionId;\n    })();\n    try {\n      return await sessionPromise;\n    } finally {\n      sessionPromise = null;\n    }\n  }\n\n  async function openStream(\n    message: BrowserRuntimeMessage,\n    signal?: AbortSignal,\n    forceToken = false,\n  ): Promise<Response> {\n    const token = await ensureAccessToken(forceToken);\n    return fetch(\n      `${apiUrl}/browser/chat/sessions/${encodeURIComponent(sessionId)}/messages/stream`,\n      {\n        method: \"POST\",\n        mode: \"cors\",\n        credentials: \"omit\",\n        headers: {\n          Accept: \"text/event-stream\",\n          \"Content-Type\": \"application/json\",\n          Authorization: `Bearer ${token}`,\n          \"X-Chat-Resume-Token\": resumeToken,\n        },\n        body: JSON.stringify({\n          content: message.content,\n          ...(message.context ? { client_context: message.context } : {}),\n          idempotency_key: message.idempotencyKey,\n        }),\n        signal,\n      },\n    );\n  }\n\n  const runtime: BrowserChatRuntime = {\n    get sessionId() {\n      return sessionId;\n    },\n\n    async createSession(title?: string): Promise<BrowserSessionResponse> {\n      if (sessionId && resumeToken) {\n        return {\n          id: sessionId,\n          agent_id: config.agentId,\n          title: title || config.title,\n          ...(visitorId ? { visitor_id: visitorId } : {}),\n        };\n      }\n      await ensureSession();\n      return {\n        id: sessionId,\n        agent_id: config.agentId,\n        title: title || config.title,\n        ...(visitorId ? { visitor_id: visitorId } : {}),\n      };\n    },\n\n    async hydrate(): Promise<Message[]> {\n      if (!restore()) return [];\n      try {\n        const messages = await runtime.listMessages();\n        emit({ type: \"session.resumed\", sessionId });\n        return messages;\n      } catch (error) {\n        if (error instanceof BrowserChatError && (error.status === 403 || error.status === 404)) {\n          sessionId = \"\";\n          resumeToken = \"\";\n          clearPersistedSession();\n          emit({ type: \"session.cleared\" });\n          return [];\n        }\n        throw error;\n      }\n    },\n\n    async listMessages(): Promise<Message[]> {\n      if (!sessionId || !resumeToken) return [];\n      const payload = await request<BrowserMessageResponse[]>(\n        `/browser/chat/sessions/${encodeURIComponent(sessionId)}/messages?limit=50`,\n      );\n      persist();\n      return (Array.isArray(payload.data) ? payload.data : [])\n        .map(messageFromApi)\n        .filter((message): message is Message => message !== null);\n    },\n\n    async *sendMessageStream(message, signal): AsyncGenerator<StreamEvent> {\n      await ensureSession();\n      const idempotencyKey = message.idempotencyKey || generateId();\n      const requestMessage = { ...message, idempotencyKey };\n      emit({ type: \"message.started\", idempotencyKey });\n      let executionId: string | undefined;\n\n      try {\n        let response: Response;\n        try {\n          response = await openStream(requestMessage, signal);\n        } catch (error) {\n          if (signal?.aborted) throw error;\n          response = await openStream(requestMessage, signal);\n        }\n        if (response.status === 401) response = await openStream(requestMessage, signal, true);\n        if (!response.ok || !response.body) {\n          const payload = (await response.json().catch(() => ({}))) as ApiEnvelope<unknown>;\n          throw apiError(response.status, payload);\n        }\n        persist();\n        for await (const event of readSSE(response)) {\n          if (event.type === \"execution\") executionId = event.executionId;\n          yield event;\n        }\n        persist();\n        emit({ type: \"message.completed\", idempotencyKey, executionId });\n      } catch (error) {\n        const normalized =\n          error instanceof BrowserChatError\n            ? error\n            : new BrowserChatError(error instanceof Error ? error.message : String(error), 0);\n        emit({ type: \"message.failed\", idempotencyKey, error: normalized });\n        throw normalized;\n      }\n    },\n\n    async newSession(): Promise<void> {\n      const previousId = sessionId;\n      const previousResumeToken = resumeToken;\n      sessionId = \"\";\n      resumeToken = \"\";\n      sessionPromise = null;\n      clearPersistedSession();\n      emit({ type: \"session.cleared\" });\n      if (!previousId || !previousResumeToken) return;\n      try {\n        const token = await ensureAccessToken();\n        await fetch(`${apiUrl}/browser/chat/sessions/${encodeURIComponent(previousId)}`, {\n          method: \"DELETE\",\n          mode: \"cors\",\n          credentials: \"omit\",\n          headers: {\n            Authorization: `Bearer ${token}`,\n            \"X-Chat-Resume-Token\": previousResumeToken,\n          },\n        });\n      } catch {\n        // Local reset must not be blocked by best-effort server revocation.\n      }\n    },\n\n    clearVisitor(): void {\n      visitorId = \"\";\n      visitorCreatedAt = 0;\n      try {\n        visitorStorage()?.removeItem(visitorStorageKey);\n      } catch {\n        // Persistence is optional.\n      }\n    },\n\n    async submitFeedback(executionId: string, value: 1 | -1): Promise<void> {\n      if (!sessionId || !resumeToken) throw new BrowserChatError(\"No active chat session.\", 409);\n      await request(`/browser/chat/sessions/${encodeURIComponent(sessionId)}/feedback`, {\n        method: \"POST\",\n        body: JSON.stringify({ execution_id: executionId, value }),\n      });\n      persist();\n      emit({ type: \"feedback.submitted\", executionId, value });\n    },\n\n    disconnect(): void {\n      accessToken = \"\";\n      accessTokenExpiresAt = 0;\n      tokenPromise = null;\n      sessionPromise = null;\n      channel?.close();\n      channel = null;\n      listeners.clear();\n    },\n  };\n\n  return runtime;\n}\n"]}