@emmanuel-nike/ark-notify-js 0.1.6 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/config.ts","../../src/utils.ts","../../src/connection-token.ts","../../src/client.ts","../../src/connection.ts","../../src/sse.ts","../../src/react/context.ts","../../src/react/ArkNotifyProvider.tsx","../../src/react/useArkNotify.ts","../../src/react/hooks.ts","../../src/react/useApplications.ts","../../src/react/usePlatformAuth.ts","../../src/react/useSSE.ts"],"names":["useRef","useCallback","useEffect","useState"],"mappings":"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","file":"index.js","sourcesContent":["export const DEFAULT_BASE_URL = 'https://ark-notify-933303906015.europe-north1.run.app'\n\nlet configuredBaseUrl: string | undefined\n\nexport interface ArkNotifyGlobalConfig {\n baseUrl?: string\n}\n\n/** Set the default base URL once at application startup. */\nexport function configureArkNotify(config: ArkNotifyGlobalConfig): void {\n if (config.baseUrl !== undefined) {\n configuredBaseUrl = config.baseUrl\n }\n}\n\nexport function resolveBaseUrl(baseUrl?: string): string {\n return (baseUrl ?? configuredBaseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '')\n}\n","import type { ApiError } from './types'\n\nexport class ArkNotifyError extends Error {\n readonly status: number\n readonly code: string\n readonly retryAfterSec?: number\n readonly reason?: string\n\n constructor(status: number, body: ApiError) {\n super(body.message)\n this.name = 'ArkNotifyError'\n this.status = status\n this.code = body.error\n this.retryAfterSec = body.retryAfterSec\n this.reason = body.reason\n }\n}\n\nexport function toWebSocketUrl(baseUrl: string, path: string): string {\n const httpUrl = new URL(path, baseUrl).href\n // Avoid assigning to url.protocol — not supported in React Native and some runtimes.\n return httpUrl.replace(/^https:/i, 'wss:').replace(/^http:/i, 'ws:')\n}\n\nexport function resolveValue<T>(value: T | (() => T)): T {\n return typeof value === 'function' ? (value as () => T)() : value\n}\n\nexport function isPrivateChannel(channel: string): boolean {\n return channel.startsWith('private-')\n}\n","import { resolveBaseUrl } from './config'\nimport type { AppCredentials, ConnectionTokenInput, ConnectionTokenResponse } from './types'\nimport { ArkNotifyError } from './utils'\n\nexport interface FetchConnectionTokenOptions extends ConnectionTokenInput {\n baseUrl?: string\n appKey: string\n /** Required unless the application has a serverAuthUrl (or one is passed in the request). */\n credentials?: AppCredentials\n fetch?: typeof fetch\n}\n\nfunction requiresAppSecret(options: FetchConnectionTokenOptions): boolean {\n if ('serverAuthUrl' in options) {\n const value = options.serverAuthUrl\n return value === null || value === ''\n }\n if ('server_auth_url' in options) {\n const value = options.server_auth_url\n return value === null || value === ''\n }\n return false\n}\n\nfunction buildConnectionTokenRequest(\n options: FetchConnectionTokenOptions\n): {\n url: string\n headers: Record<string, string>\n body: ConnectionTokenInput\n} {\n const {\n baseUrl,\n appKey,\n credentials,\n client_id,\n clientId,\n user_data,\n userData,\n ttl,\n capabilities,\n server_auth_url,\n serverAuthUrl,\n } = options\n\n const resolvedClientId = client_id ?? clientId\n if (!resolvedClientId) {\n throw new Error('client_id is required to fetch a connection token')\n }\n\n if (requiresAppSecret(options) && !credentials) {\n throw new Error('credentials are required when serverAuthUrl is explicitly set to null')\n }\n\n const body: ConnectionTokenInput = {\n client_id: resolvedClientId,\n user_data: user_data ?? userData,\n ttl,\n capabilities,\n }\n\n if ('serverAuthUrl' in options) {\n body.serverAuthUrl = serverAuthUrl\n } else if ('server_auth_url' in options) {\n body.server_auth_url = server_auth_url\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n if (credentials) {\n headers['X-App-Key'] = credentials.appKey\n headers['X-App-Secret'] = credentials.secret\n }\n\n return {\n url: `${resolveBaseUrl(baseUrl)}/api/v1/apps/${appKey}/connection-token`,\n headers,\n body,\n }\n}\n\n/**\n * Request a signed connection token from the Ark Notify API.\n *\n * Authentication depends on server auth configuration:\n * - Application or request has a `serverAuthUrl`: public `appKey` only (frontend-safe).\n * - No `serverAuthUrl`: `credentials` with app key + secret (backend-only).\n */\nexport async function fetchConnectionToken(\n options: FetchConnectionTokenOptions\n): Promise<ConnectionTokenResponse> {\n const { fetch: fetchFn = globalThis.fetch.bind(globalThis) } = options\n const { url, headers, body } = buildConnectionTokenRequest(options)\n\n const response = await fetchFn(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n let errorBody: { error: string; message: string; reason?: string; retryAfterSec?: number }\n try {\n errorBody = await response.json()\n } catch {\n errorBody = { error: 'request_failed', message: response.statusText }\n }\n throw new ArkNotifyError(response.status, errorBody)\n }\n\n return response.json() as Promise<ConnectionTokenResponse>\n}\n","import { resolveBaseUrl } from './config'\nimport { fetchConnectionToken } from './connection-token'\nimport { ArkNotifyError, resolveValue } from './utils'\nimport type {\n Application,\n ArkNotifyClientConfig,\n AppCredentials,\n AuthResponse,\n ChannelAuthInput,\n ChannelAuthResponse,\n ConnectionTokenInput,\n ConnectionTokenResponse,\n CreateApplicationInput,\n HealthResponse,\n LoginInput,\n PublishEventInput,\n PublishEventResponse,\n UpdateApplicationInput,\n User,\n} from './types'\n\ntype RequestOptions = {\n method?: string\n body?: unknown\n headers?: Record<string, string>\n credentials?: AppCredentials\n}\n\nexport class ArkNotifyClient {\n private readonly baseUrl: string\n private readonly fetchFn: typeof fetch\n private token?: string | (() => string | null | undefined)\n\n constructor(config: Readonly<ArkNotifyClientConfig> = {}) {\n this.baseUrl = resolveBaseUrl(config?.baseUrl)\n this.token = config.token\n this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis)\n }\n\n setToken(token: string | null): void {\n this.token = token ?? undefined\n }\n\n private getAuthHeader(): string | undefined {\n const token = resolveValue(this.token)\n return token ? `Bearer ${token}` : undefined\n }\n\n private async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers,\n }\n\n const auth = this.getAuthHeader()\n if (auth) {\n headers.Authorization = auth\n }\n\n if (options.credentials) {\n headers['X-App-Key'] = options.credentials.appKey\n headers['X-App-Secret'] = options.credentials.secret\n }\n\n const response = await this.fetchFn(`${this.baseUrl}${path}`, {\n method: options.method ?? 'GET',\n headers,\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n })\n\n if (!response.ok) {\n let body: { error: string; message: string; reason?: string; retryAfterSec?: number }\n try {\n body = await response.json()\n } catch {\n body = { error: 'request_failed', message: response.statusText }\n }\n throw new ArkNotifyError(response.status, body)\n }\n\n if (response.status === 204) {\n return undefined as T\n }\n\n return response.json() as Promise<T>\n }\n\n // ── Health ──────────────────────────────────────────────────────────────\n\n health(): Promise<HealthResponse> {\n return this.request('/health')\n }\n\n // ── Platform auth ───────────────────────────────────────────────────────\n\n login(input: LoginInput): Promise<AuthResponse> {\n return this.request('/api/v1/auth/login', { method: 'POST', body: input })\n }\n\n me(): Promise<{ user: User }> {\n return this.request('/api/v1/auth/me')\n }\n\n // ── Applications ────────────────────────────────────────────────────────\n\n listApplications(): Promise<{ apps: Application[] }> {\n return this.request('/api/v1/applications')\n }\n\n createApplication(input: CreateApplicationInput): Promise<{ app: Application }> {\n return this.request('/api/v1/applications', { method: 'POST', body: input })\n }\n\n getApplication(id: string): Promise<{ app: Application }> {\n return this.request(`/api/v1/applications/${id}`)\n }\n\n updateApplication(id: string, input: UpdateApplicationInput): Promise<{ app: Application }> {\n return this.request(`/api/v1/applications/${id}`, { method: 'PUT', body: input })\n }\n\n deleteApplication(id: string): Promise<{ deleted: boolean; id: string }> {\n return this.request(`/api/v1/applications/${id}`, { method: 'DELETE' })\n }\n\n regenerateSecret(id: string): Promise<{ app: Application }> {\n return this.request(`/api/v1/applications/${id}/regenerate-secret`, {\n method: 'POST',\n })\n }\n\n // ── Data plane ──────────────────────────────────────────────────────────\n\n publishEvent(\n appKey: string,\n credentials: AppCredentials,\n input: PublishEventInput\n ): Promise<PublishEventResponse> {\n return this.request(`/api/v1/apps/${appKey}/events`, {\n method: 'POST',\n body: input,\n credentials,\n })\n }\n\n authorizeChannel(\n appKey: string,\n credentials: AppCredentials,\n input: ChannelAuthInput\n ): Promise<ChannelAuthResponse> {\n return this.request(`/api/v1/apps/${appKey}/auth`, {\n method: 'POST',\n body: input,\n credentials,\n })\n }\n\n issueConnectionToken(\n appKey: string,\n input: ConnectionTokenInput,\n credentials?: AppCredentials\n ): Promise<ConnectionTokenResponse> {\n return fetchConnectionToken({\n baseUrl: this.baseUrl,\n appKey,\n credentials,\n ...input,\n fetch: this.fetchFn,\n })\n }\n}\n","import { resolveBaseUrl } from './config'\nimport { fetchConnectionToken } from './connection-token'\nimport type {\n ArkNotifyConnectionConfig,\n ChannelEventHandler,\n ConnectedMessage,\n ConnectionState,\n EventMessage,\n PresenceMessage,\n ServerMessage,\n SubscribeOptions,\n} from './types'\nimport { isPrivateChannel, resolveValue, toWebSocketUrl } from './utils'\n\ntype EventMap = {\n state: (state: ConnectionState) => void\n connected: (message: ConnectedMessage) => void\n event: (message: EventMessage) => void\n presence: (message: PresenceMessage) => void\n message: (message: ServerMessage) => void\n error: (error: { code: string; message: string }) => void\n close: (event: { code: number; reason: string }) => void\n}\n\ntype EventName = keyof EventMap\n\nexport class ArkNotifyConnection {\n private readonly config: Required<\n Pick<\n ArkNotifyConnectionConfig,\n 'baseUrl' | 'appKey' | 'autoReconnect' | 'reconnectDelayMs' | 'maxReconnectDelayMs'\n >\n > &\n ArkNotifyConnectionConfig\n\n private ws: WebSocket | null = null\n private state: ConnectionState = 'disconnected'\n private connectionId: string | null = null\n private clientId: string | null = null\n private authenticated = false\n private readonly subscribedChannels = new Set<string>()\n private readonly pendingSubscriptions = new Map<string, SubscribeOptions>()\n private readonly listeners = new Map<EventName, Set<EventMap[EventName]>>()\n private reconnectAttempt = 0\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private intentionalClose = false\n private connectPromise: Promise<void> | null = null\n private readonly WebSocketCtor: typeof WebSocket\n\n constructor(config: ArkNotifyConnectionConfig) {\n this.config = {\n autoReconnect: true,\n reconnectDelayMs: 1000,\n maxReconnectDelayMs: 30000,\n ...config,\n baseUrl: resolveBaseUrl(config.baseUrl),\n }\n this.WebSocketCtor = config.WebSocket ?? globalThis.WebSocket\n }\n\n getConnectionState(): ConnectionState {\n return this.state\n }\n\n getConnectionId(): string | null {\n return this.connectionId\n }\n\n getClientId(): string | null {\n return this.clientId\n }\n\n isAuthenticated(): boolean {\n return this.authenticated\n }\n\n getSubscribedChannels(): string[] {\n return [...this.subscribedChannels]\n }\n\n on<E extends EventName>(event: E, handler: EventMap[E]): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set())\n }\n this.listeners.get(event)!.add(handler)\n return () => this.off(event, handler)\n }\n\n off<E extends EventName>(event: E, handler: EventMap[E]): void {\n this.listeners.get(event)?.delete(handler)\n }\n\n private emit<E extends EventName>(event: E, ...args: Parameters<EventMap[E]>): void {\n for (const handler of this.listeners.get(event) ?? []) {\n ;(handler as (...a: Parameters<EventMap[E]>) => void)(...args)\n }\n }\n\n private setState(state: ConnectionState): void {\n if (this.state !== state) {\n this.state = state\n this.emit('state', state)\n }\n }\n\n connect(): Promise<void> {\n if (this.ws?.readyState === WebSocket.OPEN || this.ws?.readyState === WebSocket.CONNECTING) {\n return Promise.resolve()\n }\n\n if (this.connectPromise) {\n return this.connectPromise\n }\n\n this.connectPromise = this.doConnect().finally(() => {\n this.connectPromise = null\n })\n\n return this.connectPromise\n }\n\n private async doConnect(): Promise<void> {\n this.intentionalClose = false\n this.clearReconnectTimer()\n this.setState(this.reconnectAttempt > 0 ? 'reconnecting' : 'connecting')\n\n const url = new URL(toWebSocketUrl(this.config.baseUrl, `/app/${this.config.appKey}`))\n\n let token = resolveValue(this.config.token)\n if (!token && this.config.clientId) {\n const result = await fetchConnectionToken({\n baseUrl: this.config.baseUrl,\n appKey: this.config.appKey,\n credentials: this.config.credentials,\n client_id: this.config.clientId,\n user_data: this.config.userData,\n serverAuthUrl: this.config.serverAuthUrl,\n fetch: this.config.fetch,\n })\n token = result.token\n }\n\n if (token) {\n url.searchParams.set('token', token)\n } else if (this.config.clientId) {\n url.searchParams.set('clientId', this.config.clientId)\n }\n\n this.ws = new this.WebSocketCtor(url.toString())\n\n this.ws.onopen = () => {\n this.reconnectAttempt = 0\n }\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data as string)\n }\n\n this.ws.onerror = () => {\n this.emit('error', { code: 'websocket_error', message: 'WebSocket error' })\n }\n\n this.ws.onclose = (event) => {\n this.ws = null\n this.connectionId = null\n this.emit('close', { code: event.code, reason: event.reason })\n\n if (!this.intentionalClose && this.config.autoReconnect) {\n this.scheduleReconnect()\n } else {\n this.setState('failed')\n }\n }\n }\n\n disconnect(): void {\n this.intentionalClose = true\n this.clearReconnectTimer()\n this.subscribedChannels.clear()\n this.pendingSubscriptions.clear()\n if (this.ws) {\n this.ws.close()\n this.ws = null\n }\n this.setState('disconnected')\n }\n\n private scheduleReconnect(): void {\n this.setState('reconnecting')\n const delay = Math.min(\n this.config.reconnectDelayMs * 2 ** this.reconnectAttempt,\n this.config.maxReconnectDelayMs\n )\n this.reconnectAttempt++\n this.reconnectTimer = setTimeout(() => void this.connect(), delay)\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n }\n\n private send(payload: Record<string, unknown>): void {\n if (this.ws?.readyState !== WebSocket.OPEN) {\n throw new Error('WebSocket is not connected')\n }\n this.ws.send(JSON.stringify(payload))\n }\n\n private handleMessage(raw: string): void {\n let message: ServerMessage\n try {\n message = JSON.parse(raw) as ServerMessage\n } catch {\n this.emit('error', { code: 'invalid_json', message: 'Invalid JSON from server' })\n return\n }\n\n this.emit('message', message)\n\n switch (message.type) {\n case 'connected': {\n this.connectionId = message.connection_id\n this.clientId = message.client_id\n this.authenticated = message.authenticated\n this.setState('connected')\n this.emit('connected', message)\n this.resubscribeAll()\n break\n }\n case 'event':\n this.emit('event', message)\n break\n case 'presence':\n this.emit('presence', message)\n break\n case 'subscribed':\n this.subscribedChannels.add(message.channel)\n break\n case 'unsubscribed':\n this.subscribedChannels.delete(message.channel)\n break\n case 'error':\n this.emit('error', { code: message.code, message: message.message })\n break\n case 'ping':\n this.send({ action: 'ping' })\n break\n default:\n break\n }\n }\n\n private resubscribeAll(): void {\n for (const [channel, options] of this.pendingSubscriptions) {\n void this.subscribe(channel, options)\n }\n }\n\n async subscribe(channel: string, options: SubscribeOptions = {}): Promise<void> {\n this.pendingSubscriptions.set(channel, options)\n\n if (this.state !== 'connected' || !this.connectionId) {\n return\n }\n\n const payload: Record<string, unknown> = {\n action: 'subscribe',\n channel,\n }\n\n if (options.history) payload.history = true\n if (options.presence) {\n payload.presence = true\n if (options.presence_data) payload.presence_data = options.presence_data\n }\n\n if (isPrivateChannel(channel)) {\n if (options.auth) {\n payload.auth = options.auth\n } else if (this.config.onPrivateChannelAuth) {\n payload.auth = await this.config.onPrivateChannelAuth(channel, this.connectionId)\n } else {\n throw new Error(\n `Private channel \"${channel}\" requires auth. Provide options.auth or onPrivateChannelAuth.`\n )\n }\n }\n\n this.send(payload)\n }\n\n unsubscribe(channel: string): void {\n this.pendingSubscriptions.delete(channel)\n this.subscribedChannels.delete(channel)\n if (this.state === 'connected') {\n this.send({ action: 'unsubscribe', channel })\n }\n }\n\n publish(channel: string, event: string, data?: unknown): void {\n this.send({ action: 'publish', channel, event, data })\n }\n\n presenceEnter(channel: string, data: Record<string, unknown>): void {\n this.send({ action: 'presence_enter', channel, data })\n }\n\n presenceUpdate(channel: string, data: Record<string, unknown>): void {\n this.send({ action: 'presence_update', channel, data })\n }\n\n presenceLeave(channel: string): void {\n this.send({ action: 'presence_leave', channel })\n }\n\n presenceSync(channel: string): void {\n this.send({ action: 'presence_sync', channel })\n }\n\n ping(): void {\n this.send({ action: 'ping' })\n }\n\n bind(channel: string, event: string, handler: ChannelEventHandler): () => void {\n const listener = (message: EventMessage) => {\n if (message.channel === channel && message.event === event) {\n handler(message.data, message)\n }\n }\n return this.on('event', listener)\n }\n\n bindAll(channel: string, handler: ChannelEventHandler): () => void {\n const listener = (message: EventMessage) => {\n if (message.channel === channel) {\n handler(message.data, message)\n }\n }\n return this.on('event', listener)\n }\n}\n","import { resolveBaseUrl } from './config'\nimport type {\n ArkNotifySSEConfig,\n ConnectedMessage,\n EventMessage,\n PresenceMessage,\n ServerMessage,\n} from './types'\nimport { isPrivateChannel, resolveValue } from './utils'\n\ntype SSEEventMap = {\n connected: (message: ConnectedMessage) => void\n event: (message: EventMessage) => void\n presence: (message: PresenceMessage) => void\n message: (message: ServerMessage) => void\n error: (error: Error) => void\n close: () => void\n}\n\ntype SSEEventName = keyof SSEEventMap\n\nexport class ArkNotifySSE {\n private readonly config: ArkNotifySSEConfig & { baseUrl: string }\n private es: EventSource | null = null\n private connectionId: string | null = null\n private listeners = new Map<SSEEventName, Set<SSEEventMap[SSEEventName]>>()\n private readonly EventSourceCtor: typeof EventSource\n\n constructor(config: ArkNotifySSEConfig) {\n this.config = { ...config, baseUrl: resolveBaseUrl(config.baseUrl) }\n this.EventSourceCtor = config.EventSource ?? globalThis.EventSource\n }\n\n getConnectionId(): string | null {\n return this.connectionId\n }\n\n on<E extends SSEEventName>(event: E, handler: SSEEventMap[E]): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set())\n }\n this.listeners.get(event)!.add(handler as SSEEventMap[SSEEventName])\n return () => this.off(event, handler)\n }\n\n off<E extends SSEEventName>(event: E, handler: SSEEventMap[E]): void {\n this.listeners.get(event)?.delete(handler as SSEEventMap[SSEEventName])\n }\n\n private emit<E extends SSEEventName>(event: E, ...args: Parameters<SSEEventMap[E]>): void {\n for (const handler of this.listeners.get(event) ?? []) {\n ;(handler as (...a: Parameters<SSEEventMap[E]>) => void)(...args)\n }\n }\n\n async connect(): Promise<void> {\n if (this.es) return\n\n const base = this.config.baseUrl.replace(/\\/$/, '')\n const url = new URL(`${base}/app/${this.config.appKey}/stream`)\n url.searchParams.set('channels', this.config.channels.join(','))\n\n const token = resolveValue(this.config.token)\n if (token) {\n url.searchParams.set('token', token)\n } else if (this.config.clientId) {\n url.searchParams.set('clientId', this.config.clientId)\n }\n\n if (this.config.history) {\n url.searchParams.set('history', 'true')\n }\n\n if (this.config.user_data) {\n url.searchParams.set('user_data', JSON.stringify(this.config.user_data))\n }\n\n let authMap = this.config.auth ? { ...this.config.auth } : {}\n\n const privateChannels = this.config.channels.filter(isPrivateChannel)\n if (privateChannels.length > 0 && this.config.onPrivateChannelAuth && !this.config.auth) {\n // Private SSE channels need auth tokens in the query before connect.\n // Fetch tokens server-side and pass them via the `auth` option, or use WebSocket instead.\n }\n\n if (Object.keys(authMap).length > 0) {\n url.searchParams.set('auth', JSON.stringify(authMap))\n }\n\n this.es = new this.EventSourceCtor(url.toString())\n\n this.es.addEventListener('connected', (e) => {\n const message = JSON.parse((e as MessageEvent).data) as ConnectedMessage\n this.connectionId = message.connection_id\n this.emit('connected', message)\n this.emit('message', message)\n })\n\n this.es.addEventListener('event', (e) => {\n const message = JSON.parse((e as MessageEvent).data) as EventMessage\n this.emit('event', message)\n this.emit('message', message)\n })\n\n this.es.addEventListener('presence', (e) => {\n const message = JSON.parse((e as MessageEvent).data) as PresenceMessage\n this.emit('presence', message)\n this.emit('message', message)\n })\n\n this.es.onerror = () => {\n this.emit('error', new Error('SSE connection error'))\n }\n }\n\n disconnect(): void {\n if (this.es) {\n this.es.close()\n this.es = null\n this.connectionId = null\n this.emit('close')\n }\n }\n\n bind(channel: string, event: string, handler: (data: unknown, message: EventMessage) => void): () => void {\n const listener = (message: EventMessage) => {\n if (message.channel === channel && message.event === event) {\n handler(message.data, message)\n }\n }\n return this.on('event', listener)\n }\n\n bindAll(channel: string, handler: (data: unknown, message: EventMessage) => void): () => void {\n const listener = (message: EventMessage) => {\n if (message.channel === channel) {\n handler(message.data, message)\n }\n }\n return this.on('event', listener)\n }\n}\n","import { createContext, useContext } from 'react'\nimport type { ArkNotifyClient } from '../client'\nimport type { ArkNotifyConnection } from '../connection'\nimport type { ArkNotifySSE } from '../sse'\nimport type { ArkNotifyConnectionConfig, ArkNotifySSEConfig } from '../types'\n\nexport interface ArkNotifyContextValue {\n baseUrl: string\n client: ArkNotifyClient\n createConnection: (config: Omit<ArkNotifyConnectionConfig, 'baseUrl'>) => ArkNotifyConnection\n createSSE: (config: Omit<ArkNotifySSEConfig, 'baseUrl'>) => ArkNotifySSE\n}\n\nexport const ArkNotifyContext = createContext<ArkNotifyContextValue | null>(null)\n\nexport function useArkNotifyContext(): ArkNotifyContextValue {\n const ctx = useContext(ArkNotifyContext)\n if (!ctx) {\n throw new Error('useArkNotify must be used within an ArkNotifyProvider')\n }\n return ctx\n}\n","import { useCallback, useEffect, useMemo, useRef, type ReactNode } from 'react'\nimport { ArkNotifyClient } from '../client'\nimport { resolveBaseUrl } from '../config'\nimport { ArkNotifyConnection } from '../connection'\nimport { ArkNotifySSE } from '../sse'\nimport type { ArkNotifyClientConfig, ArkNotifyConnectionConfig, ArkNotifySSEConfig } from '../types'\nimport { ArkNotifyContext } from './context'\n\nexport interface ArkNotifyProviderProps {\n children: ReactNode\n baseUrl?: string\n token?: ArkNotifyClientConfig['token']\n fetch?: ArkNotifyClientConfig['fetch']\n}\n\nexport function ArkNotifyProvider({\n children,\n baseUrl,\n token,\n fetch: fetchFn,\n}: Readonly<ArkNotifyProviderProps>) {\n const resolvedBaseUrl = useMemo(() => resolveBaseUrl(baseUrl), [baseUrl])\n const clientRef = useRef<ArkNotifyClient | null>(null)\n\n clientRef.current ??= new ArkNotifyClient({ baseUrl, token, fetch: fetchFn })\n\n const client = clientRef.current\n\n useEffect(() => {\n if (token === undefined) return\n const resolved = typeof token === 'function' ? (token() ?? null) : (token ?? null)\n client.setToken(resolved)\n }, [client, token])\n\n const createConnection = useCallback(\n (config: Omit<ArkNotifyConnectionConfig, 'baseUrl'>) =>\n new ArkNotifyConnection({ baseUrl: resolvedBaseUrl, ...config }),\n [resolvedBaseUrl]\n )\n\n const createSSE = useCallback(\n (config: Omit<ArkNotifySSEConfig, 'baseUrl'>) =>\n new ArkNotifySSE({ baseUrl: resolvedBaseUrl, ...config }),\n [resolvedBaseUrl]\n )\n\n const value = useMemo(\n () => ({ baseUrl: resolvedBaseUrl, client, createConnection, createSSE }),\n [resolvedBaseUrl, client, createConnection, createSSE]\n )\n\n return <ArkNotifyContext.Provider value={value}>{children}</ArkNotifyContext.Provider>\n}\n","import { useArkNotifyContext } from './context'\n\nexport function useArkNotify() {\n return useArkNotifyContext()\n}\n","import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport type { ArkNotifyConnection } from '../connection'\nimport type {\n ArkNotifyConnectionConfig,\n ChannelEventHandler,\n ConnectedMessage,\n ConnectionState,\n EventMessage,\n PresenceMemberInfo,\n PresenceMessage,\n SubscribeOptions,\n} from '../types'\nimport { useArkNotify } from './useArkNotify'\n\nexport interface UseConnectionOptions\n extends Omit<ArkNotifyConnectionConfig, 'baseUrl'> {\n enabled?: boolean\n}\n\nexport interface UseConnectionResult {\n connection: ArkNotifyConnection | null\n state: ConnectionState\n connectionId: string | null\n clientId: string | null\n authenticated: boolean\n connectedMessage: ConnectedMessage | null\n connect: () => Promise<void>\n disconnect: () => void\n}\n\nexport function useConnection(options: UseConnectionOptions): UseConnectionResult {\n const { createConnection } = useArkNotify()\n const { enabled = true, ...connectionConfig } = options\n\n const connectionRef = useRef<ArkNotifyConnection | null>(null)\n const [connectedMessage, setConnectedMessage] = useState<ConnectedMessage | null>(null)\n\n if (!connectionRef.current) {\n connectionRef.current = createConnection(connectionConfig)\n }\n\n const connection = connectionRef.current!\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n const unsubscribers = [\n connection.on('state', onStoreChange),\n connection.on('connected', (msg) => {\n setConnectedMessage(msg)\n onStoreChange()\n }),\n ]\n return () => unsubscribers.forEach((u) => u())\n },\n [connection]\n )\n\n const getSnapshot = useCallback(() => connection.getConnectionState(), [connection])\n const state = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n useEffect(() => {\n if (enabled) {\n connection.connect()\n }\n return () => connection.disconnect()\n }, [connection, enabled])\n\n const connect = useCallback(() => connection.connect(), [connection])\n const disconnect = useCallback(() => connection.disconnect(), [connection])\n\n return {\n connection,\n state,\n connectionId: connection.getConnectionId(),\n clientId: connection.getClientId(),\n authenticated: connection.isAuthenticated(),\n connectedMessage,\n connect,\n disconnect,\n }\n}\n\nexport interface UseChannelOptions extends SubscribeOptions {\n enabled?: boolean\n onEvent?: (event: string, data: unknown, message: EventMessage) => void\n}\n\nexport interface UseChannelResult {\n subscribed: boolean\n subscribe: (opts?: SubscribeOptions) => Promise<void>\n unsubscribe: () => void\n publish: (event: string, data?: unknown) => void\n bind: (event: string, handler: ChannelEventHandler) => () => void\n}\n\nexport function useChannel(\n connection: ArkNotifyConnection | null,\n channel: string,\n options: UseChannelOptions = {}\n): UseChannelResult {\n const { enabled = true, onEvent, ...subscribeOptions } = options\n const [subscribed, setSubscribed] = useState(false)\n const subscribeOptionsRef = useRef(subscribeOptions)\n subscribeOptionsRef.current = subscribeOptions\n\n const subscribe = useCallback(\n async (opts?: SubscribeOptions) => {\n if (!connection) return\n await connection.subscribe(channel, { ...subscribeOptionsRef.current, ...opts })\n setSubscribed(true)\n },\n [connection, channel]\n )\n\n const unsubscribe = useCallback(() => {\n connection?.unsubscribe(channel)\n setSubscribed(false)\n }, [connection, channel])\n\n const publish = useCallback(\n (event: string, data?: unknown) => {\n connection?.publish(channel, event, data)\n },\n [connection, channel]\n )\n\n const bind = useCallback(\n (event: string, handler: ChannelEventHandler) => {\n if (!connection) return () => {}\n return connection.bind(channel, event, handler)\n },\n [connection, channel]\n )\n\n useEffect(() => {\n if (!connection || !enabled || !channel) return\n\n const unsubSubscribed = connection.on('message', (msg) => {\n if (msg.type === 'subscribed' && msg.channel === channel) {\n setSubscribed(true)\n }\n if (msg.type === 'unsubscribed' && msg.channel === channel) {\n setSubscribed(false)\n }\n })\n\n const unsubEvent = onEvent\n ? connection.on('event', (msg) => {\n if (msg.channel === channel) {\n onEvent(msg.event, msg.data, msg)\n }\n })\n : () => {}\n\n void subscribe()\n\n return () => {\n unsubSubscribed()\n unsubEvent()\n connection.unsubscribe(channel)\n setSubscribed(false)\n }\n }, [connection, channel, enabled, subscribe, onEvent])\n\n return { subscribed, subscribe, unsubscribe, publish, bind }\n}\n\nexport interface UsePresenceResult {\n members: PresenceMemberInfo[]\n enter: (data: Record<string, unknown>) => void\n update: (data: Record<string, unknown>) => void\n leave: () => void\n sync: () => void\n}\n\nexport function usePresence(\n connection: ArkNotifyConnection | null,\n channel: string,\n options: { enabled?: boolean; initialData?: Record<string, unknown> } = {}\n): UsePresenceResult {\n const { enabled = true, initialData } = options\n const [members, setMembers] = useState<PresenceMemberInfo[]>([])\n\n useEffect(() => {\n if (!connection || !enabled || !channel) return\n\n const unsubscribe = connection.on('presence', (msg: PresenceMessage) => {\n if (msg.channel !== channel) return\n\n if (msg.action === 'sync' && msg.members) {\n setMembers(msg.members)\n } else if (msg.action === 'enter' && msg.member) {\n setMembers((prev) => {\n const filtered = prev.filter((m) => m.clientId !== msg.member!.clientId)\n return [...filtered, msg.member!]\n })\n } else if (msg.action === 'leave' && msg.member) {\n setMembers((prev) => prev.filter((m) => m.clientId !== msg.member!.clientId))\n } else if (msg.action === 'update' && msg.member) {\n setMembers((prev) =>\n prev.map((m) => (m.clientId === msg.member!.clientId ? msg.member! : m))\n )\n }\n })\n\n if (initialData) {\n connection.presenceEnter(channel, initialData)\n }\n\n return unsubscribe\n }, [connection, channel, enabled, initialData])\n\n const enter = useCallback(\n (data: Record<string, unknown>) => connection?.presenceEnter(channel, data),\n [connection, channel]\n )\n const update = useCallback(\n (data: Record<string, unknown>) => connection?.presenceUpdate(channel, data),\n [connection, channel]\n )\n const leave = useCallback(() => connection?.presenceLeave(channel), [connection, channel])\n const sync = useCallback(() => connection?.presenceSync(channel), [connection, channel])\n\n return { members, enter, update, leave, sync }\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport type {\n Application,\n CreateApplicationInput,\n UpdateApplicationInput,\n} from '../types'\nimport { ArkNotifyError } from '../utils'\nimport { useArkNotify } from './useArkNotify'\n\nexport interface UseApplicationsResult {\n apps: Application[]\n loading: boolean\n error: ArkNotifyError | null\n refresh: () => Promise<void>\n create: (input: CreateApplicationInput) => Promise<Application>\n update: (id: string, input: UpdateApplicationInput) => Promise<Application>\n remove: (id: string) => Promise<void>\n regenerateSecret: (id: string) => Promise<Application>\n getById: (id: string) => Promise<Application>\n}\n\nexport function useApplications(): UseApplicationsResult {\n const { client } = useArkNotify()\n const [apps, setApps] = useState<Application[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<ArkNotifyError | null>(null)\n\n const refresh = useCallback(async () => {\n setLoading(true)\n setError(null)\n try {\n const { apps: list } = await client.listApplications()\n setApps(list)\n } catch (err) {\n if (err instanceof ArkNotifyError) setError(err)\n } finally {\n setLoading(false)\n }\n }, [client])\n\n useEffect(() => {\n void refresh()\n }, [refresh])\n\n const create = useCallback(\n async (input: CreateApplicationInput) => {\n const { app } = await client.createApplication(input)\n setApps((prev) => [...prev, app])\n return app\n },\n [client]\n )\n\n const update = useCallback(\n async (id: string, input: UpdateApplicationInput) => {\n const { app } = await client.updateApplication(id, input)\n setApps((prev) => prev.map((a) => (a.id === id ? app : a)))\n return app\n },\n [client]\n )\n\n const remove = useCallback(\n async (id: string) => {\n await client.deleteApplication(id)\n setApps((prev) => prev.filter((a) => a.id !== id))\n },\n [client]\n )\n\n const regenerateSecret = useCallback(\n async (id: string) => {\n const { app } = await client.regenerateSecret(id)\n setApps((prev) => prev.map((a) => (a.id === id ? app : a)))\n return app\n },\n [client]\n )\n\n const getById = useCallback(\n async (id: string) => {\n const { app } = await client.getApplication(id)\n return app\n },\n [client]\n )\n\n return { apps, loading, error, refresh, create, update, remove, regenerateSecret, getById }\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport type { LoginInput, User } from '../types'\nimport { ArkNotifyError } from '../utils'\nimport { useArkNotify } from './useArkNotify'\n\nconst TOKEN_STORAGE_KEY = 'ark-notify-js-token'\n\nexport interface UsePlatformAuthOptions {\n storageKey?: string\n persist?: boolean\n}\n\nexport interface UsePlatformAuthResult {\n user: User | null\n token: string | null\n loading: boolean\n error: ArkNotifyError | null\n login: (input: LoginInput) => Promise<void>\n logout: () => void\n refreshUser: () => Promise<void>\n isAuthenticated: boolean\n}\n\nexport function usePlatformAuth(options: UsePlatformAuthOptions = {}): UsePlatformAuthResult {\n const { client } = useArkNotify()\n const storageKey = options.storageKey ?? TOKEN_STORAGE_KEY\n const persist = options.persist ?? true\n\n const [user, setUser] = useState<User | null>(null)\n const [token, setToken] = useState<string | null>(() => {\n if (!persist || typeof window === 'undefined') return null\n return localStorage.getItem(storageKey)\n })\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<ArkNotifyError | null>(null)\n\n const saveToken = useCallback(\n (newToken: string | null) => {\n setToken(newToken)\n client.setToken(newToken)\n if (persist && typeof window !== 'undefined') {\n if (newToken) {\n localStorage.setItem(storageKey, newToken)\n } else {\n localStorage.removeItem(storageKey)\n }\n }\n },\n [client, persist, storageKey]\n )\n\n const refreshUser = useCallback(async () => {\n if (!token) {\n setUser(null)\n return\n }\n setLoading(true)\n setError(null)\n try {\n client.setToken(token)\n const { user: fetched } = await client.me()\n setUser(fetched)\n } catch (err) {\n setUser(null)\n if (err instanceof ArkNotifyError) {\n setError(err)\n if (err.status === 401) saveToken(null)\n }\n } finally {\n setLoading(false)\n }\n }, [client, token, saveToken])\n\n useEffect(() => {\n if (token) {\n client.setToken(token)\n void refreshUser()\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n const login = useCallback(\n async (input: LoginInput) => {\n setLoading(true)\n setError(null)\n try {\n const res = await client.login(input)\n saveToken(res.token)\n setUser(res.user)\n } catch (err) {\n if (err instanceof ArkNotifyError) setError(err)\n throw err\n } finally {\n setLoading(false)\n }\n },\n [client, saveToken]\n )\n\n const logout = useCallback(() => {\n saveToken(null)\n setUser(null)\n setError(null)\n }, [saveToken])\n\n return {\n user,\n token,\n loading,\n error,\n login,\n logout,\n refreshUser,\n isAuthenticated: !!user && !!token,\n }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { ArkNotifySSE } from '../sse'\nimport type { ArkNotifySSEConfig, ConnectedMessage, EventMessage } from '../types'\nimport { useArkNotify } from './useArkNotify'\n\nexport interface UseSSEOptions extends Omit<ArkNotifySSEConfig, 'baseUrl'> {\n enabled?: boolean\n onEvent?: (event: string, data: unknown, message: EventMessage) => void\n}\n\nexport interface UseSSEResult {\n sse: ArkNotifySSE | null\n connected: boolean\n connectionId: string | null\n connectedMessage: ConnectedMessage | null\n connect: () => void\n disconnect: () => void\n bind: (channel: string, event: string, handler: (data: unknown) => void) => () => void\n}\n\nexport function useSSE(options: UseSSEOptions): UseSSEResult {\n const { createSSE } = useArkNotify()\n const { enabled = true, onEvent, ...sseConfig } = options\n\n const sseRef = useRef<ArkNotifySSE | null>(null)\n const [connected, setConnected] = useState(false)\n const [connectedMessage, setConnectedMessage] = useState<ConnectedMessage | null>(null)\n\n if (!sseRef.current) {\n sseRef.current = createSSE(sseConfig)\n }\n\n const sse = sseRef.current!\n\n useEffect(() => {\n if (!enabled) return\n\n const unsubs = [\n sse.on('connected', (msg) => {\n setConnected(true)\n setConnectedMessage(msg)\n }),\n sse.on('close', () => {\n setConnected(false)\n setConnectedMessage(null)\n }),\n onEvent\n ? sse.on('event', (msg) => onEvent(msg.event, msg.data, msg))\n : () => {},\n ]\n\n void sse.connect()\n\n return () => {\n unsubs.forEach((u) => u())\n sse.disconnect()\n setConnected(false)\n }\n }, [sse, enabled, onEvent])\n\n const connect = useCallback(() => void sse.connect(), [sse])\n const disconnect = useCallback(() => sse.disconnect(), [sse])\n\n const bind = useCallback(\n (channel: string, event: string, handler: (data: unknown) => void) =>\n sse.bind(channel, event, (data) => handler(data)),\n [sse]\n )\n\n return {\n sse,\n connected,\n connectionId: sse.getConnectionId(),\n connectedMessage,\n connect,\n disconnect,\n bind,\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/config.ts","../../src/utils.ts","../../src/connection-token.ts","../../src/client.ts","../../src/connection.ts","../../src/sse.ts","../../src/react/context.ts","../../src/react/ArkNotifyProvider.tsx","../../src/react/useArkNotify.ts","../../src/react/hooks.ts","../../src/react/useApplications.ts","../../src/react/usePlatformAuth.ts","../../src/react/useSSE.ts"],"names":["useRef","useCallback","useEffect","useState"],"mappings":";;;;AAAO,IAAM,gBAAA,GAAmB;AAEhC,IAAI,iBAAA;AAOG,SAAS,mBAAmB,MAAA,EAAqC;AACtE,EAAA,IAAI,MAAA,CAAO,YAAY,MAAA,EAAW;AAChC,IAAA,iBAAA,GAAoB,MAAA,CAAO,OAAA;AAAA,EAC7B;AACF;AAEO,SAAS,eAAe,OAAA,EAA0B;AACvD,EAAA,OAAA,CAAQ,OAAA,IAAW,iBAAA,IAAqB,gBAAA,EAAkB,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC7E;;;ACfO,IAAM,cAAA,GAAN,cAA6B,KAAA,CAAM;AAAA,EAMxC,WAAA,CAAY,QAAgB,IAAA,EAAgB;AAC1C,IAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,KAAA;AACjB,IAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,aAAA;AAC1B,IAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AAAA,EACrB;AACF,CAAA;AAEO,SAAS,cAAA,CAAe,SAAiB,IAAA,EAAsB;AACpE,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChD,EAAA,MAAM,iBAAiB,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,GAAO,IAAI,IAAI,CAAA,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,cAAc,CAAA,EAAG,cAAc,CAAA,CAAA;AAElD,EAAA,OAAO,QAAQ,OAAA,CAAQ,UAAA,EAAY,MAAM,CAAA,CAAE,OAAA,CAAQ,WAAW,KAAK,CAAA;AACrE;AAGO,SAAS,iBAAA,CACd,KACA,MAAA,EACQ;AACR,EAAA,MAAM,QAAQ,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAChC,MAAA,CAAO,CAAC,KAAA,KAAqC;AAC5C,IAAA,MAAM,KAAA,GAAQ,MAAM,CAAC,CAAA;AACrB,IAAA,OAAO,UAAU,MAAA,IAAa,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,SAAS,KAAA,KAAU,EAAA;AAAA,EAC/E,CAAC,CAAA,CACA,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,CAAA,EAAG,mBAAmB,GAAG,CAAC,IAAI,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAE,CAAA,CAC/E,KAAK,GAAG,CAAA;AAEX,EAAA,IAAI,CAAC,OAAO,OAAO,GAAA;AAEnB,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AAC5C,EAAA,OAAO,CAAA,EAAG,GAAG,CAAA,EAAG,SAAS,GAAG,KAAK,CAAA,CAAA;AACnC;AAEO,SAAS,aAAgB,KAAA,EAAyB;AACvD,EAAA,OAAO,OAAO,KAAA,KAAU,UAAA,GAAc,KAAA,EAAkB,GAAI,KAAA;AAC9D;AAEO,SAAS,iBAAiB,OAAA,EAA0B;AACzD,EAAA,OAAO,OAAA,CAAQ,WAAW,UAAU,CAAA;AACtC;;;ACvCA,SAAS,kBAAkB,OAAA,EAA+C;AACxE,EAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,IAAA,MAAM,QAAQ,OAAA,CAAQ,aAAA;AACtB,IAAA,OAAO,KAAA,KAAU,QAAQ,KAAA,KAAU,EAAA;AAAA,EACrC;AACA,EAAA,IAAI,qBAAqB,OAAA,EAAS;AAChC,IAAA,MAAM,QAAQ,OAAA,CAAQ,eAAA;AACtB,IAAA,OAAO,KAAA,KAAU,QAAQ,KAAA,KAAU,EAAA;AAAA,EACrC;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,4BACP,OAAA,EAKA;AACA,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,mBAAmB,SAAA,IAAa,QAAA;AACtC,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,EACrE;AAEA,EAAA,IAAI,iBAAA,CAAkB,OAAO,CAAA,IAAK,CAAC,WAAA,EAAa;AAC9C,IAAA,MAAM,IAAI,MAAM,uEAAuE,CAAA;AAAA,EACzF;AAEA,EAAA,MAAM,IAAA,GAA6B;AAAA,IACjC,SAAA,EAAW,gBAAA;AAAA,IACX,WAAW,SAAA,IAAa,QAAA;AAAA,IACxB,GAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,mBAAmB,OAAA,EAAS;AAC9B,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB,CAAA,MAAA,IAAW,qBAAqB,OAAA,EAAS;AACvC,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AAAA,EACzB;AAEA,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,cAAA,EAAgB;AAAA,GAClB;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAA,CAAQ,WAAW,IAAI,WAAA,CAAY,MAAA;AACnC,IAAA,OAAA,CAAQ,cAAc,IAAI,WAAA,CAAY,MAAA;AAAA,EACxC;AAEA,EAAA,OAAO;AAAA,IACL,KAAK,CAAA,EAAG,cAAA,CAAe,OAAO,CAAC,gBAAgB,MAAM,CAAA,iBAAA,CAAA;AAAA,IACrD,OAAA;AAAA,IACA;AAAA,GACF;AACF;AASA,eAAsB,qBACpB,OAAA,EACkC;AAClC,EAAA,MAAM,EAAE,OAAO,OAAA,GAAU,UAAA,CAAW,MAAM,IAAA,CAAK,UAAU,GAAE,GAAI,OAAA;AAC/D,EAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAS,IAAA,EAAK,GAAI,4BAA4B,OAAO,CAAA;AAElE,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA,EAAK;AAAA,IAClC,MAAA,EAAQ,MAAA;AAAA,IACR,OAAA;AAAA,IACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,GAC1B,CAAA;AAED,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI;AACF,MAAA,SAAA,GAAY,MAAM,SAAS,IAAA,EAAK;AAAA,IAClC,CAAA,CAAA,MAAQ;AACN,MAAA,SAAA,GAAY,EAAE,KAAA,EAAO,gBAAA,EAAkB,OAAA,EAAS,SAAS,UAAA,EAAW;AAAA,IACtE;AACA,IAAA,MAAM,IAAI,cAAA,CAAe,QAAA,CAAS,MAAA,EAAQ,SAAS,CAAA;AAAA,EACrD;AAEA,EAAA,OAAO,SAAS,IAAA,EAAK;AACvB;;;ACrFO,IAAM,kBAAN,MAAsB;AAAA,EAK3B,WAAA,CAAY,MAAA,GAA0C,EAAC,EAAG;AACxD,IAAA,IAAA,CAAK,OAAA,GAAU,cAAA,CAAe,MAAA,EAAQ,OAAO,CAAA;AAC7C,IAAA,IAAA,CAAK,QAAQ,MAAA,CAAO,KAAA;AACpB,IAAA,IAAA,CAAK,UAAU,MAAA,CAAO,KAAA,IAAS,UAAA,CAAW,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,EACjE;AAAA,EAEA,SAAS,KAAA,EAA4B;AACnC,IAAA,IAAA,CAAK,QAAQ,KAAA,IAAS,MAAA;AAAA,EACxB;AAAA,EAEQ,aAAA,GAAoC;AAC1C,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AACrC,IAAA,OAAO,KAAA,GAAQ,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,GAAK,MAAA;AAAA,EACrC;AAAA,EAEA,MAAc,OAAA,CAAW,IAAA,EAAc,OAAA,GAA0B,EAAC,EAAe;AAC/E,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,cAAA,EAAgB,kBAAA;AAAA,MAChB,GAAG,OAAA,CAAQ;AAAA,KACb;AAEA,IAAA,MAAM,IAAA,GAAO,KAAK,aAAA,EAAc;AAChC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAA,CAAQ,aAAA,GAAgB,IAAA;AAAA,IAC1B;AAEA,IAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,MAAA,OAAA,CAAQ,WAAW,CAAA,GAAI,OAAA,CAAQ,WAAA,CAAY,MAAA;AAC3C,MAAA,OAAA,CAAQ,cAAc,CAAA,GAAI,OAAA,CAAQ,WAAA,CAAY,MAAA;AAAA,IAChD;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI;AAAA,MAC5D,MAAA,EAAQ,QAAQ,MAAA,IAAU,KAAA;AAAA,MAC1B,OAAA;AAAA,MACA,IAAA,EAAM,QAAQ,IAAA,KAAS,MAAA,GAAY,KAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA,GAAI;AAAA,KACnE,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,IAAI,IAAA;AACJ,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,MAAM,SAAS,IAAA,EAAK;AAAA,MAC7B,CAAA,CAAA,MAAQ;AACN,QAAA,IAAA,GAAO,EAAE,KAAA,EAAO,gBAAA,EAAkB,OAAA,EAAS,SAAS,UAAA,EAAW;AAAA,MACjE;AACA,MAAA,MAAM,IAAI,cAAA,CAAe,QAAA,CAAS,MAAA,EAAQ,IAAI,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA,EAIA,MAAA,GAAkC;AAChC,IAAA,OAAO,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,EAC/B;AAAA;AAAA,EAIA,MAAM,KAAA,EAA0C;AAC9C,IAAA,OAAO,IAAA,CAAK,QAAQ,oBAAA,EAAsB,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA;AAAA,EAC3E;AAAA,EAEA,EAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,QAAQ,iBAAiB,CAAA;AAAA,EACvC;AAAA;AAAA,EAIA,gBAAA,GAAqD;AACnD,IAAA,OAAO,IAAA,CAAK,QAAQ,sBAAsB,CAAA;AAAA,EAC5C;AAAA,EAEA,kBAAkB,KAAA,EAA8D;AAC9E,IAAA,OAAO,IAAA,CAAK,QAAQ,sBAAA,EAAwB,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,OAAO,CAAA;AAAA,EAC7E;AAAA,EAEA,eAAe,EAAA,EAA2C;AACxD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,qBAAA,EAAwB,EAAE,CAAA,CAAE,CAAA;AAAA,EAClD;AAAA,EAEA,iBAAA,CAAkB,IAAY,KAAA,EAA8D;AAC1F,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,qBAAA,EAAwB,EAAE,CAAA,CAAA,EAAI,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,EAClF;AAAA,EAEA,kBAAkB,EAAA,EAAuD;AACvE,IAAA,OAAO,IAAA,CAAK,QAAQ,CAAA,qBAAA,EAAwB,EAAE,IAAI,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,EACxE;AAAA,EAEA,iBAAiB,EAAA,EAA2C;AAC1D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,qBAAA,EAAwB,EAAE,CAAA,kBAAA,CAAA,EAAsB;AAAA,MAClE,MAAA,EAAQ;AAAA,KACT,CAAA;AAAA,EACH;AAAA;AAAA,EAIA,YAAA,CACE,MAAA,EACA,WAAA,EACA,KAAA,EAC+B;AAC/B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,aAAA,EAAgB,MAAM,CAAA,OAAA,CAAA,EAAW;AAAA,MACnD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,KAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,gBAAA,CACE,MAAA,EACA,WAAA,EACA,KAAA,EAC8B;AAC9B,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,aAAA,EAAgB,MAAM,CAAA,KAAA,CAAA,EAAS;AAAA,MACjD,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,KAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,oBAAA,CACE,MAAA,EACA,KAAA,EACA,WAAA,EACkC;AAClC,IAAA,OAAO,oBAAA,CAAqB;AAAA,MAC1B,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAA;AAAA,MACA,WAAA;AAAA,MACA,GAAG,KAAA;AAAA,MACH,OAAO,IAAA,CAAK;AAAA,KACb,CAAA;AAAA,EACH;AACF,CAAA;;;AChJO,IAAM,sBAAN,MAA0B;AAAA,EAuB/B,YAAY,MAAA,EAAmC;AAd/C,IAAA,IAAA,CAAQ,EAAA,GAAuB,IAAA;AAC/B,IAAA,IAAA,CAAQ,KAAA,GAAyB,cAAA;AACjC,IAAA,IAAA,CAAQ,YAAA,GAA8B,IAAA;AACtC,IAAA,IAAA,CAAQ,QAAA,GAA0B,IAAA;AAClC,IAAA,IAAA,CAAQ,aAAA,GAAgB,KAAA;AACxB,IAAA,IAAA,CAAiB,kBAAA,uBAAyB,GAAA,EAAY;AACtD,IAAA,IAAA,CAAiB,oBAAA,uBAA2B,GAAA,EAA8B;AAC1E,IAAA,IAAA,CAAiB,SAAA,uBAAgB,GAAA,EAAyC;AAC1E,IAAA,IAAA,CAAQ,gBAAA,GAAmB,CAAA;AAC3B,IAAA,IAAA,CAAQ,cAAA,GAAuD,IAAA;AAC/D,IAAA,IAAA,CAAQ,gBAAA,GAAmB,KAAA;AAC3B,IAAA,IAAA,CAAQ,cAAA,GAAuC,IAAA;AAI7C,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,aAAA,EAAe,IAAA;AAAA,MACf,gBAAA,EAAkB,GAAA;AAAA,MAClB,mBAAA,EAAqB,GAAA;AAAA,MACrB,GAAG,MAAA;AAAA,MACH,OAAA,EAAS,cAAA,CAAe,MAAA,CAAO,OAAO;AAAA,KACxC;AACA,IAAA,IAAA,CAAK,aAAA,GAAgB,MAAA,CAAO,SAAA,IAAa,UAAA,CAAW,SAAA;AAAA,EACtD;AAAA,EAEA,kBAAA,GAAsC;AACpC,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,WAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA,EAEA,eAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA,EAEA,qBAAA,GAAkC;AAChC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,kBAAkB,CAAA;AAAA,EACpC;AAAA,EAEA,EAAA,CAAwB,OAAU,OAAA,EAAkC;AAClE,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IACrC;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,OAAO,CAAA;AACtC,IAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,OAAO,CAAA;AAAA,EACtC;AAAA,EAEA,GAAA,CAAyB,OAAU,OAAA,EAA4B;AAC7D,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEQ,IAAA,CAA0B,UAAa,IAAA,EAAqC;AAClF,IAAA,KAAA,MAAW,WAAW,IAAA,CAAK,SAAA,CAAU,IAAI,KAAK,CAAA,IAAK,EAAC,EAAG;AACpD,MAAC,OAAA,CAAoD,GAAG,IAAI,CAAA;AAAA,IAC/D;AAAA,EACF;AAAA,EAEQ,SAAS,KAAA,EAA8B;AAC7C,IAAA,IAAI,IAAA,CAAK,UAAU,KAAA,EAAO;AACxB,MAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAA,GAAyB;AACvB,IAAA,IAAI,IAAA,CAAK,IAAI,UAAA,KAAe,SAAA,CAAU,QAAQ,IAAA,CAAK,EAAA,EAAI,UAAA,KAAe,SAAA,CAAU,UAAA,EAAY;AAC1F,MAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,IACzB;AAEA,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,OAAO,IAAA,CAAK,cAAA;AAAA,IACd;AAEA,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA,CAAK,SAAA,EAAU,CAAE,QAAQ,MAAM;AACnD,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB,CAAC,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA,EAEA,MAAc,SAAA,GAA2B;AACvC,IAAA,IAAA,CAAK,gBAAA,GAAmB,KAAA;AACxB,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,gBAAA,GAAmB,CAAA,GAAI,iBAAiB,YAAY,CAAA;AAEvE,IAAA,IAAI,KAAA,GAAQ,eAAe,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,KAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,CAAE,CAAA;AAE5E,IAAA,IAAI,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAC1C,IAAA,IAAI,CAAC,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU;AAClC,MAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAAqB;AAAA,QACxC,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,QACrB,MAAA,EAAQ,KAAK,MAAA,CAAO,MAAA;AAAA,QACpB,WAAA,EAAa,KAAK,MAAA,CAAO,WAAA;AAAA,QACzB,SAAA,EAAW,KAAK,MAAA,CAAO,QAAA;AAAA,QACvB,SAAA,EAAW,KAAK,MAAA,CAAO,QAAA;AAAA,QACvB,aAAA,EAAe,KAAK,MAAA,CAAO,aAAA;AAAA,QAC3B,KAAA,EAAO,KAAK,MAAA,CAAO;AAAA,OACpB,CAAA;AACD,MAAA,KAAA,GAAQ,MAAA,CAAO,KAAA;AAAA,IACjB;AAEA,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,GAAQ,iBAAA,CAAkB,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA;AAAA,IAC5C,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU;AAC/B,MAAA,KAAA,GAAQ,kBAAkB,KAAA,EAAO,EAAE,UAAU,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA;AAAA,IACrE;AAEA,IAAA,IAAA,CAAK,EAAA,GAAK,IAAI,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AAEtC,IAAA,IAAA,CAAK,EAAA,CAAG,SAAS,MAAM;AACrB,MAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AAAA,IAC1B,CAAA;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,SAAA,GAAY,CAAC,KAAA,KAAU;AAC7B,MAAA,IAAA,CAAK,aAAA,CAAc,MAAM,IAAc,CAAA;AAAA,IACzC,CAAA;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,UAAU,MAAM;AACtB,MAAA,IAAA,CAAK,KAAK,OAAA,EAAS,EAAE,MAAM,iBAAA,EAAmB,OAAA,EAAS,mBAAmB,CAAA;AAAA,IAC5E,CAAA;AAEA,IAAA,IAAA,CAAK,EAAA,CAAG,OAAA,GAAU,CAAC,KAAA,KAAU;AAC3B,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,MAAA,EAAQ,KAAA,CAAM,MAAA,EAAQ,CAAA;AAE7D,MAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,IAAoB,IAAA,CAAK,OAAO,aAAA,EAAe;AACvD,QAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,SAAS,QAAQ,CAAA;AAAA,MACxB;AAAA,IACF,CAAA;AAAA,EACF;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,mBAAmB,KAAA,EAAM;AAC9B,IAAA,IAAA,CAAK,qBAAqB,KAAA,EAAM;AAChC,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AAAA,IACZ;AACA,IAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAAA,EAC9B;AAAA,EAEQ,iBAAA,GAA0B;AAChC,IAAA,IAAA,CAAK,SAAS,cAAc,CAAA;AAC5B,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,MACjB,IAAA,CAAK,MAAA,CAAO,gBAAA,GAAmB,CAAA,IAAK,IAAA,CAAK,gBAAA;AAAA,MACzC,KAAK,MAAA,CAAO;AAAA,KACd;AACA,IAAA,IAAA,CAAK,gBAAA,EAAA;AACL,IAAA,IAAA,CAAK,iBAAiB,UAAA,CAAW,MAAM,KAAK,IAAA,CAAK,OAAA,IAAW,KAAK,CAAA;AAAA,EACnE;AAAA,EAEQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,YAAA,CAAa,KAAK,cAAc,CAAA;AAChC,MAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,KAAK,OAAA,EAAwC;AACnD,IAAA,IAAI,IAAA,CAAK,EAAA,EAAI,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AAC1C,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AACA,IAAA,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,EACtC;AAAA,EAEQ,cAAc,GAAA,EAAmB;AACvC,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,KAAK,OAAA,EAAS,EAAE,MAAM,cAAA,EAAgB,OAAA,EAAS,4BAA4B,CAAA;AAChF,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,WAAW,OAAO,CAAA;AAE5B,IAAA,QAAQ,QAAQ,IAAA;AAAM,MACpB,KAAK,WAAA,EAAa;AAChB,QAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,aAAA;AAC5B,QAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,SAAA;AACxB,QAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,aAAA;AAC7B,QAAA,IAAA,CAAK,SAAS,WAAW,CAAA;AACzB,QAAA,IAAA,CAAK,IAAA,CAAK,aAAa,OAAO,CAAA;AAC9B,QAAA,IAAA,CAAK,cAAA,EAAe;AACpB,QAAA;AAAA,MACF;AAAA,MACA,KAAK,OAAA;AACH,QAAA,IAAA,CAAK,IAAA,CAAK,SAAS,OAAO,CAAA;AAC1B,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,IAAA,CAAK,IAAA,CAAK,YAAY,OAAO,CAAA;AAC7B,QAAA;AAAA,MACF,KAAK,YAAA;AACH,QAAA,IAAA,CAAK,kBAAA,CAAmB,GAAA,CAAI,OAAA,CAAQ,OAAO,CAAA;AAC3C,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,IAAA,CAAK,kBAAA,CAAmB,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA;AAC9C,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,IAAA,CAAK,IAAA,CAAK,SAAS,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAM,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,CAAA;AACnE,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAC5B,QAAA;AAEA;AACJ,EACF;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,OAAO,CAAA,IAAK,KAAK,oBAAA,EAAsB;AAC1D,MAAA,KAAK,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,OAAO,CAAA;AAAA,IACtC;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CAAU,OAAA,EAAiB,OAAA,GAA4B,EAAC,EAAkB;AAC9E,IAAA,IAAA,CAAK,oBAAA,CAAqB,GAAA,CAAI,OAAA,EAAS,OAAO,CAAA;AAE9C,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,WAAA,IAAe,CAAC,KAAK,YAAA,EAAc;AACpD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAmC;AAAA,MACvC,MAAA,EAAQ,WAAA;AAAA,MACR;AAAA,KACF;AAEA,IAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,OAAA,GAAU,IAAA;AACvC,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,OAAA,CAAQ,QAAA,GAAW,IAAA;AACnB,MAAA,IAAI,OAAA,CAAQ,aAAA,EAAe,OAAA,CAAQ,aAAA,GAAgB,OAAA,CAAQ,aAAA;AAAA,IAC7D;AAEA,IAAA,IAAI,gBAAA,CAAiB,OAAO,CAAA,EAAG;AAC7B,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,OAAA,CAAQ,OAAO,OAAA,CAAQ,IAAA;AAAA,MACzB,CAAA,MAAA,IAAW,IAAA,CAAK,MAAA,CAAO,oBAAA,EAAsB;AAC3C,QAAA,OAAA,CAAQ,OAAO,MAAM,IAAA,CAAK,OAAO,oBAAA,CAAqB,OAAA,EAAS,KAAK,YAAY,CAAA;AAAA,MAClF,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,oBAAoB,OAAO,CAAA,8DAAA;AAAA,SAC7B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,EACnB;AAAA,EAEA,YAAY,OAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,oBAAA,CAAqB,OAAO,OAAO,CAAA;AACxC,IAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,OAAO,CAAA;AACtC,IAAA,IAAI,IAAA,CAAK,UAAU,WAAA,EAAa;AAC9B,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,MAAA,EAAQ,aAAA,EAAe,SAAS,CAAA;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,OAAA,CAAQ,OAAA,EAAiB,KAAA,EAAe,IAAA,EAAsB;AAC5D,IAAA,IAAA,CAAK,KAAK,EAAE,MAAA,EAAQ,WAAW,OAAA,EAAS,KAAA,EAAO,MAAM,CAAA;AAAA,EACvD;AAAA,EAEA,aAAA,CAAc,SAAiB,IAAA,EAAqC;AAClE,IAAA,IAAA,CAAK,KAAK,EAAE,MAAA,EAAQ,gBAAA,EAAkB,OAAA,EAAS,MAAM,CAAA;AAAA,EACvD;AAAA,EAEA,cAAA,CAAe,SAAiB,IAAA,EAAqC;AACnE,IAAA,IAAA,CAAK,KAAK,EAAE,MAAA,EAAQ,iBAAA,EAAmB,OAAA,EAAS,MAAM,CAAA;AAAA,EACxD;AAAA,EAEA,cAAc,OAAA,EAAuB;AACnC,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,MAAA,EAAQ,gBAAA,EAAkB,SAAS,CAAA;AAAA,EACjD;AAAA,EAEA,aAAa,OAAA,EAAuB;AAClC,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,MAAA,EAAQ,eAAA,EAAiB,SAAS,CAAA;AAAA,EAChD;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAA,EAC9B;AAAA,EAEA,IAAA,CAAK,OAAA,EAAiB,KAAA,EAAe,OAAA,EAA0C;AAC7E,IAAA,MAAM,QAAA,GAAW,CAAC,OAAA,KAA0B;AAC1C,MAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,OAAA,IAAW,OAAA,CAAQ,UAAU,KAAA,EAAO;AAC1D,QAAA,OAAA,CAAQ,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,QAAQ,CAAA;AAAA,EAClC;AAAA,EAEA,OAAA,CAAQ,SAAiB,OAAA,EAA0C;AACjE,IAAA,MAAM,QAAA,GAAW,CAAC,OAAA,KAA0B;AAC1C,MAAA,IAAI,OAAA,CAAQ,YAAY,OAAA,EAAS;AAC/B,QAAA,OAAA,CAAQ,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,QAAQ,CAAA;AAAA,EAClC;AACF,CAAA;;;AClUO,IAAM,eAAN,MAAmB;AAAA,EAOxB,YAAY,MAAA,EAA4B;AALxC,IAAA,IAAA,CAAQ,EAAA,GAAyB,IAAA;AACjC,IAAA,IAAA,CAAQ,YAAA,GAA8B,IAAA;AACtC,IAAA,IAAA,CAAiB,SAAA,uBAAgB,GAAA,EAAkD;AAIjF,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,MAAA,EAAQ,SAAS,cAAA,CAAe,MAAA,CAAO,OAAO,CAAA,EAAE;AACnE,IAAA,IAAA,CAAK,eAAA,GAAkB,MAAA,CAAO,WAAA,IAAe,UAAA,CAAW,WAAA;AAAA,EAC1D;AAAA,EAEA,eAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEA,EAAA,CAA2B,OAAU,OAAA,EAAqC;AACxE,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG;AAC9B,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IACrC;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,OAAO,CAAA;AACtC,IAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,OAAO,CAAA;AAAA,EACtC;AAAA,EAEA,GAAA,CAA4B,OAAU,OAAA,EAA+B;AACnE,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEQ,IAAA,CAA6B,UAAa,IAAA,EAAwC;AACxF,IAAA,KAAA,MAAW,WAAW,IAAA,CAAK,SAAA,CAAU,IAAI,KAAK,CAAA,IAAK,EAAC,EAAG;AACpD,MAAC,OAAA,CAAuD,GAAG,IAAI,CAAA;AAAA,IAClE;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAI,KAAK,EAAA,EAAI;AAEb,IAAA,MAAM,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAClD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,IAAA,GAAO,EAAE,GAAG,IAAA,CAAK,MAAA,CAAO,IAAA,EAAK,GAAI,EAAC;AAE9D,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,OAAO,gBAAgB,CAAA;AACpE,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,IAAK,IAAA,CAAK,OAAO,oBAAA,IAAwB,CAAC,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM;AAKzF,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAC5C,IAAA,MAAM,SAAA,GAAY,kBAAkB,CAAA,EAAG,IAAI,QAAQ,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,OAAA,CAAA,EAAW;AAAA,MAC9E,QAAA,EAAU,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,MACvC,OAAO,KAAA,IAAS,MAAA;AAAA,MAChB,QAAA,EAAU,CAAC,KAAA,IAAS,IAAA,CAAK,OAAO,QAAA,GAAW,IAAA,CAAK,OAAO,QAAA,GAAW,MAAA;AAAA,MAClE,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,MAAA,GAAS,MAAA;AAAA,MACxC,SAAA,EAAW,KAAK,MAAA,CAAO,SAAA,GAAY,KAAK,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA;AAAA,MAC3E,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,SAAS,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,GAAI;AAAA,KACnE,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,GAAK,IAAI,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA;AAE5C,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAA,CAAiB,WAAA,EAAa,CAAC,CAAA,KAAM;AAC3C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA;AACjC,MAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,aAAA;AAC5B,MAAA,IAAA,CAAK,IAAA,CAAK,aAAa,OAAO,CAAA;AAC9B,MAAA,IAAA,CAAK,IAAA,CAAK,WAAW,OAAO,CAAA;AAAA,IAC9B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA,KAAM;AACvC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA;AACjC,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,OAAO,CAAA;AAC1B,MAAA,IAAA,CAAK,IAAA,CAAK,WAAW,OAAO,CAAA;AAAA,IAC9B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,gBAAA,CAAiB,UAAA,EAAY,CAAC,CAAA,KAAM;AAC1C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAI,CAAA;AACjC,MAAA,IAAA,CAAK,IAAA,CAAK,YAAY,OAAO,CAAA;AAC7B,MAAA,IAAA,CAAK,IAAA,CAAK,WAAW,OAAO,CAAA;AAAA,IAC9B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,EAAA,CAAG,UAAU,MAAM;AACtB,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,IAAI,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAAA,IACtD,CAAA;AAAA,EACF;AAAA,EAEA,UAAA,GAAmB;AACjB,IAAA,IAAI,KAAK,EAAA,EAAI;AACX,MAAA,IAAA,CAAK,GAAG,KAAA,EAAM;AACd,MAAA,IAAA,CAAK,EAAA,GAAK,IAAA;AACV,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,MAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,IAAA,CACE,OAAA,EACA,KAAA,EACA,OAAA,EACY;AACZ,IAAA,MAAM,QAAA,GAAW,CAAC,OAAA,KAA0B;AAC1C,MAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,OAAA,IAAW,OAAA,CAAQ,UAAU,KAAA,EAAO;AAC1D,QAAA,OAAA,CAAQ,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,QAAQ,CAAA;AAAA,EAClC;AAAA,EAEA,OAAA,CAAQ,SAAiB,OAAA,EAAqE;AAC5F,IAAA,MAAM,QAAA,GAAW,CAAC,OAAA,KAA0B;AAC1C,MAAA,IAAI,OAAA,CAAQ,YAAY,OAAA,EAAS;AAC/B,QAAA,OAAA,CAAQ,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,OAAA,EAAS,QAAQ,CAAA;AAAA,EAClC;AACF,CAAA;ACxHO,IAAM,gBAAA,GAAmB,cAA4C,IAAI,CAAA;AAEzE,SAAS,mBAAA,GAA6C;AAC3D,EAAA,MAAM,GAAA,GAAM,WAAW,gBAAgB,CAAA;AACvC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,GAAA;AACT;ACNO,SAAS,iBAAA,CAAkB;AAAA,EAChC,QAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA,EAAO;AACT,CAAA,EAAqC;AACnC,EAAA,MAAM,eAAA,GAAkB,QAAQ,MAAM,cAAA,CAAe,OAAO,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AACxE,EAAA,MAAM,SAAA,GAAY,OAA+B,IAAI,CAAA;AAErD,EAAA,SAAA,CAAU,OAAA,KAAV,SAAA,CAAU,OAAA,GAAY,IAAI,eAAA,CAAgB,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,OAAA,EAAS,CAAA,CAAA;AAE5E,EAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AAEzB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,UAAU,MAAA,EAAW;AACzB,IAAA,MAAM,WAAW,OAAO,KAAA,KAAU,aAAc,KAAA,EAAM,IAAK,OAAS,KAAA,IAAS,IAAA;AAC7E,IAAA,MAAA,CAAO,SAAS,QAAQ,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAK,CAAC,CAAA;AAElB,EAAA,MAAM,gBAAA,GAAmB,WAAA;AAAA,IACvB,CAAC,WACC,IAAI,mBAAA,CAAoB,EAAE,OAAA,EAAS,eAAA,EAAiB,GAAG,MAAA,EAAQ,CAAA;AAAA,IACjE,CAAC,eAAe;AAAA,GAClB;AAEA,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,CAAC,WACC,IAAI,YAAA,CAAa,EAAE,OAAA,EAAS,eAAA,EAAiB,GAAG,MAAA,EAAQ,CAAA;AAAA,IAC1D,CAAC,eAAe;AAAA,GAClB;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA;AAAA,IACZ,OAAO,EAAE,OAAA,EAAS,eAAA,EAAiB,MAAA,EAAQ,kBAAkB,SAAA,EAAU,CAAA;AAAA,IACvE,CAAC,eAAA,EAAiB,MAAA,EAAQ,gBAAA,EAAkB,SAAS;AAAA,GACvD;AAEA,EAAA,uBAAO,GAAA,CAAC,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,OAAe,QAAA,EAAS,CAAA;AAC5D;;;AClDO,SAAS,YAAA,GAAe;AAC7B,EAAA,OAAO,mBAAA,EAAoB;AAC7B;AC0BO,SAAS,cAAc,OAAA,EAAoD;AAChF,EAAA,MAAM,EAAE,gBAAA,EAAiB,GAAI,YAAA,EAAa;AAC1C,EAAA,MAAM,EAAE,OAAA,GAAU,IAAA,EAAM,GAAG,kBAAiB,GAAI,OAAA;AAEhD,EAAA,MAAM,aAAA,GAAgBA,OAAmC,IAAI,CAAA;AAC7D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,SAAkC,IAAI,CAAA;AAEtF,EAAA,IAAI,CAAC,cAAc,OAAA,EAAS;AAC1B,IAAA,aAAA,CAAc,OAAA,GAAU,iBAAiB,gBAAgB,CAAA;AAAA,EAC3D;AAEA,EAAA,MAAM,aAAa,aAAA,CAAc,OAAA;AAEjC,EAAA,MAAM,SAAA,GAAYC,WAAAA;AAAA,IAChB,CAAC,aAAA,KAA8B;AAC7B,MAAA,MAAM,aAAA,GAAgB;AAAA,QACpB,UAAA,CAAW,EAAA,CAAG,OAAA,EAAS,aAAa,CAAA;AAAA,QACpC,UAAA,CAAW,EAAA,CAAG,WAAA,EAAa,CAAC,GAAA,KAAQ;AAClC,UAAA,mBAAA,CAAoB,GAAG,CAAA;AACvB,UAAA,aAAA,EAAc;AAAA,QAChB,CAAC;AAAA,OACH;AACA,MAAA,OAAO,MAAM,aAAA,CAAc,OAAA,CAAQ,CAAC,CAAA,KAAM,GAAG,CAAA;AAAA,IAC/C,CAAA;AAAA,IACA,CAAC,UAAU;AAAA,GACb;AAEA,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM,UAAA,CAAW,oBAAmB,EAAG,CAAC,UAAU,CAAC,CAAA;AACnF,EAAA,MAAM,KAAA,GAAQ,oBAAA,CAAqB,SAAA,EAAW,WAAA,EAAa,WAAW,CAAA;AAEtE,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,UAAA,CAAW,OAAA,EAAQ;AAAA,IACrB;AACA,IAAA,OAAO,MAAM,WAAW,UAAA,EAAW;AAAA,EACrC,CAAA,EAAG,CAAC,UAAA,EAAY,OAAO,CAAC,CAAA;AAExB,EAAA,MAAM,OAAA,GAAUD,YAAY,MAAM,UAAA,CAAW,SAAQ,EAAG,CAAC,UAAU,CAAC,CAAA;AACpE,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM,UAAA,CAAW,YAAW,EAAG,CAAC,UAAU,CAAC,CAAA;AAE1E,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA,EAAc,WAAW,eAAA,EAAgB;AAAA,IACzC,QAAA,EAAU,WAAW,WAAA,EAAY;AAAA,IACjC,aAAA,EAAe,WAAW,eAAA,EAAgB;AAAA,IAC1C,gBAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAeO,SAAS,UAAA,CACd,UAAA,EACA,OAAA,EACA,OAAA,GAA6B,EAAC,EACZ;AAClB,EAAA,MAAM,EAAE,OAAA,GAAU,IAAA,EAAM,OAAA,EAAS,GAAG,kBAAiB,GAAI,OAAA;AACzD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAClD,EAAA,MAAM,mBAAA,GAAsBD,OAAO,gBAAgB,CAAA;AACnD,EAAA,mBAAA,CAAoB,OAAA,GAAU,gBAAA;AAE9B,EAAA,MAAM,SAAA,GAAYC,WAAAA;AAAA,IAChB,OAAO,IAAA,KAA4B;AACjC,MAAA,IAAI,CAAC,UAAA,EAAY;AACjB,MAAA,MAAM,UAAA,CAAW,UAAU,OAAA,EAAS,EAAE,GAAG,mBAAA,CAAoB,OAAA,EAAS,GAAG,IAAA,EAAM,CAAA;AAC/E,MAAA,aAAA,CAAc,IAAI,CAAA;AAAA,IACpB,CAAA;AAAA,IACA,CAAC,YAAY,OAAO;AAAA,GACtB;AAEA,EAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,IAAA,UAAA,EAAY,YAAY,OAAO,CAAA;AAC/B,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,UAAA,EAAY,OAAO,CAAC,CAAA;AAExB,EAAA,MAAM,OAAA,GAAUA,WAAAA;AAAA,IACd,CAAC,OAAe,IAAA,KAAmB;AACjC,MAAA,UAAA,EAAY,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAO,IAAI,CAAA;AAAA,IAC1C,CAAA;AAAA,IACA,CAAC,YAAY,OAAO;AAAA,GACtB;AAEA,EAAA,MAAM,IAAA,GAAOA,WAAAA;AAAA,IACX,CAAC,OAAe,OAAA,KAAiC;AAC/C,MAAA,IAAI,CAAC,UAAA,EAAY,OAAO,MAAM;AAAA,MAAC,CAAA;AAC/B,MAAA,OAAO,UAAA,CAAW,IAAA,CAAK,OAAA,EAAS,KAAA,EAAO,OAAO,CAAA;AAAA,IAChD,CAAA;AAAA,IACA,CAAC,YAAY,OAAO;AAAA,GACtB;AAEA,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,OAAA,IAAW,CAAC,OAAA,EAAS;AAEzC,IAAA,MAAM,eAAA,GAAkB,UAAA,CAAW,EAAA,CAAG,SAAA,EAAW,CAAC,GAAA,KAAQ;AACxD,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,YAAA,IAAgB,GAAA,CAAI,YAAY,OAAA,EAAS;AACxD,QAAA,aAAA,CAAc,IAAI,CAAA;AAAA,MACpB;AACA,MAAA,IAAI,GAAA,CAAI,IAAA,KAAS,cAAA,IAAkB,GAAA,CAAI,YAAY,OAAA,EAAS;AAC1D,QAAA,aAAA,CAAc,KAAK,CAAA;AAAA,MACrB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,aAAa,OAAA,GACf,UAAA,CAAW,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AAC9B,MAAA,IAAI,GAAA,CAAI,YAAY,OAAA,EAAS;AAC3B,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,IAAA,EAAM,GAAG,CAAA;AAAA,MAClC;AAAA,IACF,CAAC,IACD,MAAM;AAAA,IAAC,CAAA;AAEX,IAAA,KAAK,SAAA,EAAU;AAEf,IAAA,OAAO,MAAM;AACX,MAAA,eAAA,EAAgB;AAChB,MAAA,UAAA,EAAW;AACX,MAAA,UAAA,CAAW,YAAY,OAAO,CAAA;AAC9B,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB,CAAA;AAAA,EACF,GAAG,CAAC,UAAA,EAAY,SAAS,OAAA,EAAS,SAAA,EAAW,OAAO,CAAC,CAAA;AAErD,EAAA,OAAO,EAAE,UAAA,EAAY,SAAA,EAAW,WAAA,EAAa,SAAS,IAAA,EAAK;AAC7D;AAUO,SAAS,WAAA,CACd,UAAA,EACA,OAAA,EACA,OAAA,GAAwE,EAAC,EACtD;AACnB,EAAA,MAAM,EAAE,OAAA,GAAU,IAAA,EAAM,WAAA,EAAY,GAAI,OAAA;AACxC,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,QAAA,CAA+B,EAAE,CAAA;AAE/D,EAAAA,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,OAAA,IAAW,CAAC,OAAA,EAAS;AAEzC,IAAA,MAAM,WAAA,GAAc,UAAA,CAAW,EAAA,CAAG,UAAA,EAAY,CAAC,GAAA,KAAyB;AACtE,MAAA,IAAI,GAAA,CAAI,YAAY,OAAA,EAAS;AAE7B,MAAA,IAAI,GAAA,CAAI,MAAA,KAAW,MAAA,IAAU,GAAA,CAAI,OAAA,EAAS;AACxC,QAAA,UAAA,CAAW,IAAI,OAAO,CAAA;AAAA,MACxB,CAAA,MAAA,IAAW,GAAA,CAAI,MAAA,KAAW,OAAA,IAAW,IAAI,MAAA,EAAQ;AAC/C,QAAA,UAAA,CAAW,CAAC,IAAA,KAAS;AACnB,UAAA,MAAM,QAAA,GAAW,KAAK,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,GAAA,CAAI,MAAA,CAAQ,QAAQ,CAAA;AACvE,UAAA,OAAO,CAAC,GAAG,QAAA,EAAU,GAAA,CAAI,MAAO,CAAA;AAAA,QAClC,CAAC,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,GAAA,CAAI,MAAA,KAAW,OAAA,IAAW,IAAI,MAAA,EAAQ;AAC/C,QAAA,UAAA,CAAW,CAAC,IAAA,KAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,GAAA,CAAI,MAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,MAC9E,CAAA,MAAA,IAAW,GAAA,CAAI,MAAA,KAAW,QAAA,IAAY,IAAI,MAAA,EAAQ;AAChD,QAAA,UAAA;AAAA,UAAW,CAAC,IAAA,KACV,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,QAAA,KAAa,GAAA,CAAI,MAAA,CAAQ,QAAA,GAAW,GAAA,CAAI,SAAU,CAAE;AAAA,SACzE;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,UAAA,CAAW,aAAA,CAAc,SAAS,WAAW,CAAA;AAAA,IAC/C;AAEA,IAAA,OAAO,WAAA;AAAA,EACT,GAAG,CAAC,UAAA,EAAY,OAAA,EAAS,OAAA,EAAS,WAAW,CAAC,CAAA;AAE9C,EAAA,MAAM,KAAA,GAAQD,WAAAA;AAAA,IACZ,CAAC,IAAA,KAAkC,UAAA,EAAY,aAAA,CAAc,SAAS,IAAI,CAAA;AAAA,IAC1E,CAAC,YAAY,OAAO;AAAA,GACtB;AACA,EAAA,MAAM,MAAA,GAASA,WAAAA;AAAA,IACb,CAAC,IAAA,KAAkC,UAAA,EAAY,cAAA,CAAe,SAAS,IAAI,CAAA;AAAA,IAC3E,CAAC,YAAY,OAAO;AAAA,GACtB;AACA,EAAA,MAAM,KAAA,GAAQA,WAAAA,CAAY,MAAM,UAAA,EAAY,aAAA,CAAc,OAAO,CAAA,EAAG,CAAC,UAAA,EAAY,OAAO,CAAC,CAAA;AACzF,EAAA,MAAM,IAAA,GAAOA,WAAAA,CAAY,MAAM,UAAA,EAAY,YAAA,CAAa,OAAO,CAAA,EAAG,CAAC,UAAA,EAAY,OAAO,CAAC,CAAA;AAEvF,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,OAAO,IAAA,EAAK;AAC/C;AC3MO,SAAS,eAAA,GAAyC;AACvD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAChC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIE,QAAAA,CAAwB,EAAE,CAAA;AAClD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAgC,IAAI,CAAA;AAE9D,EAAA,MAAM,OAAA,GAAUF,YAAY,YAAY;AACtC,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,MAAM,OAAO,gBAAA,EAAiB;AACrD,MAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,IACd,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,GAAA,YAAe,cAAA,EAAgB,QAAA,CAAS,GAAG,CAAA;AAAA,IACjD,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAAC,UAAU,MAAM;AACd,IAAA,KAAK,OAAA,EAAQ;AAAA,EACf,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,MAAA,GAASD,WAAAA;AAAA,IACb,OAAO,KAAA,KAAkC;AACvC,MAAA,MAAM,EAAE,GAAA,EAAI,GAAI,MAAM,MAAA,CAAO,kBAAkB,KAAK,CAAA;AACpD,MAAA,OAAA,CAAQ,CAAC,IAAA,KAAS,CAAC,GAAG,IAAA,EAAM,GAAG,CAAC,CAAA;AAChC,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,MAAA,GAASA,WAAAA;AAAA,IACb,OAAO,IAAY,KAAA,KAAkC;AACnD,MAAA,MAAM,EAAE,GAAA,EAAI,GAAI,MAAM,MAAA,CAAO,iBAAA,CAAkB,IAAI,KAAK,CAAA;AACxD,MAAA,OAAA,CAAQ,CAAC,IAAA,KAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,KAAO,EAAA,GAAK,GAAA,GAAM,CAAE,CAAC,CAAA;AAC1D,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,MAAA,GAASA,WAAAA;AAAA,IACb,OAAO,EAAA,KAAe;AACpB,MAAA,MAAM,MAAA,CAAO,kBAAkB,EAAE,CAAA;AACjC,MAAA,OAAA,CAAQ,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAC,CAAA;AAAA,IACnD,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,IACvB,OAAO,EAAA,KAAe;AACpB,MAAA,MAAM,EAAE,GAAA,EAAI,GAAI,MAAM,MAAA,CAAO,iBAAiB,EAAE,CAAA;AAChD,MAAA,OAAA,CAAQ,CAAC,IAAA,KAAS,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,EAAA,KAAO,EAAA,GAAK,GAAA,GAAM,CAAE,CAAC,CAAA;AAC1D,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,MAAM,OAAA,GAAUA,WAAAA;AAAA,IACd,OAAO,EAAA,KAAe;AACpB,MAAA,MAAM,EAAE,GAAA,EAAI,GAAI,MAAM,MAAA,CAAO,eAAe,EAAE,CAAA;AAC9C,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IACA,CAAC,MAAM;AAAA,GACT;AAEA,EAAA,OAAO,EAAE,MAAM,OAAA,EAAS,KAAA,EAAO,SAAS,MAAA,EAAQ,MAAA,EAAQ,MAAA,EAAQ,gBAAA,EAAkB,OAAA,EAAQ;AAC5F;ACnFA,IAAM,iBAAA,GAAoB,qBAAA;AAkBnB,SAAS,eAAA,CAAgB,OAAA,GAAkC,EAAC,EAA0B;AAC3F,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAChC,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,iBAAA;AACzC,EAAA,MAAM,OAAA,GAAU,QAAQ,OAAA,IAAW,IAAA;AAEnC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIE,SAAsB,IAAI,CAAA;AAClD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAwB,MAAM;AACtD,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,MAAA,KAAW,aAAa,OAAO,IAAA;AACtD,IAAA,OAAO,YAAA,CAAa,QAAQ,UAAU,CAAA;AAAA,EACxC,CAAC,CAAA;AACD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,SAAgC,IAAI,CAAA;AAE9D,EAAA,MAAM,SAAA,GAAYF,WAAAA;AAAA,IAChB,CAAC,QAAA,KAA4B;AAC3B,MAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,MAAA,MAAA,CAAO,SAAS,QAAQ,CAAA;AACxB,MAAA,IAAI,OAAA,IAAW,OAAO,MAAA,KAAW,WAAA,EAAa;AAC5C,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,QAAQ,CAAA;AAAA,QAC3C,CAAA,MAAO;AACL,UAAA,YAAA,CAAa,WAAW,UAAU,CAAA;AAAA,QACpC;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,OAAA,EAAS,UAAU;AAAA,GAC9B;AAEA,EAAA,MAAM,WAAA,GAAcA,YAAY,YAAY;AAC1C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,MAAA;AAAA,IACF;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AACb,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,SAAS,KAAK,CAAA;AACrB,MAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,OAAO,EAAA,EAAG;AAC1C,MAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,IACjB,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,MAAA,IAAI,eAAe,cAAA,EAAgB;AACjC,QAAA,QAAA,CAAS,GAAG,CAAA;AACZ,QAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK,SAAA,CAAU,IAAI,CAAA;AAAA,MACxC;AAAA,IACF,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,KAAA,EAAO,SAAS,CAAC,CAAA;AAE7B,EAAAC,UAAU,MAAM;AACd,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAA,CAAO,SAAS,KAAK,CAAA;AACrB,MAAA,KAAK,WAAA,EAAY;AAAA,IACnB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQD,WAAAA;AAAA,IACZ,OAAO,KAAA,KAAsB;AAC3B,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,CAAS,IAAI,CAAA;AACb,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AACpC,QAAA,SAAA,CAAU,IAAI,KAAK,CAAA;AACnB,QAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,MAClB,SAAS,GAAA,EAAK;AACZ,QAAA,IAAI,GAAA,YAAe,cAAA,EAAgB,QAAA,CAAS,GAAG,CAAA;AAC/C,QAAA,MAAM,GAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,MAClB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,QAAQ,SAAS;AAAA,GACpB;AAEA,EAAA,MAAM,MAAA,GAASA,YAAY,MAAM;AAC/B,IAAA,SAAA,CAAU,IAAI,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAA,QAAA,CAAS,IAAI,CAAA;AAAA,EACf,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEd,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA,EAAiB,CAAC,CAAC,IAAA,IAAQ,CAAC,CAAC;AAAA,GAC/B;AACF;AC9FO,SAAS,OAAO,OAAA,EAAsC;AAC3D,EAAA,MAAM,EAAE,SAAA,EAAU,GAAI,YAAA,EAAa;AACnC,EAAA,MAAM,EAAE,OAAA,GAAU,IAAA,EAAM,OAAA,EAAS,GAAG,WAAU,GAAI,OAAA;AAElD,EAAA,MAAM,MAAA,GAASD,OAA4B,IAAI,CAAA;AAC/C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIG,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,SAAkC,IAAI,CAAA;AAEtF,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAA,CAAO,OAAA,GAAU,UAAU,SAAS,CAAA;AAAA,EACtC;AAEA,EAAA,MAAM,MAAM,MAAA,CAAO,OAAA;AAEnB,EAAAD,UAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,GAAA,CAAI,EAAA,CAAG,WAAA,EAAa,CAAC,GAAA,KAAQ;AAC3B,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,mBAAA,CAAoB,GAAG,CAAA;AAAA,MACzB,CAAC,CAAA;AAAA,MACD,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,MAAM;AACpB,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,MAC1B,CAAC,CAAA;AAAA,MACD,OAAA,GACI,GAAA,CAAI,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,IAC1D,MAAM;AAAA,MAAC;AAAA,KACb;AAEA,IAAA,KAAK,IAAI,OAAA,EAAQ;AAEjB,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA;AACzB,MAAA,GAAA,CAAI,UAAA,EAAW;AACf,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,GAAA,EAAK,OAAA,EAAS,OAAO,CAAC,CAAA;AAE1B,EAAA,MAAM,OAAA,GAAUD,YAAY,MAAM,KAAK,IAAI,OAAA,EAAQ,EAAG,CAAC,GAAG,CAAC,CAAA;AAC3D,EAAA,MAAM,UAAA,GAAaA,YAAY,MAAM,GAAA,CAAI,YAAW,EAAG,CAAC,GAAG,CAAC,CAAA;AAE5D,EAAA,MAAM,IAAA,GAAOA,WAAAA;AAAA,IACX,CAAC,OAAA,EAAiB,KAAA,EAAe,OAAA,KAC/B,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,KAAA,EAAO,CAAC,IAAA,KAAS,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,IAClD,CAAC,GAAG;AAAA,GACN;AAEA,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA,EAAc,IAAI,eAAA,EAAgB;AAAA,IAClC,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF","file":"index.js","sourcesContent":["export const DEFAULT_BASE_URL = 'https://ark-notify-933303906015.europe-north1.run.app'\n\nlet configuredBaseUrl: string | undefined\n\nexport interface ArkNotifyGlobalConfig {\n baseUrl?: string\n}\n\n/** Set the default base URL once at application startup. */\nexport function configureArkNotify(config: ArkNotifyGlobalConfig): void {\n if (config.baseUrl !== undefined) {\n configuredBaseUrl = config.baseUrl\n }\n}\n\nexport function resolveBaseUrl(baseUrl?: string): string {\n return (baseUrl ?? configuredBaseUrl ?? DEFAULT_BASE_URL).replace(/\\/$/, '')\n}\n","import type { ApiError } from './types'\n\nexport class ArkNotifyError extends Error {\n readonly status: number\n readonly code: string\n readonly retryAfterSec?: number\n readonly reason?: string\n\n constructor(status: number, body: ApiError) {\n super(body.message)\n this.name = 'ArkNotifyError'\n this.status = status\n this.code = body.error\n this.retryAfterSec = body.retryAfterSec\n this.reason = body.reason\n }\n}\n\nexport function toWebSocketUrl(baseUrl: string, path: string): string {\n const normalizedBase = baseUrl.replace(/\\/$/, '')\n const normalizedPath = path.startsWith('/') ? path : `/${path}`\n const httpUrl = `${normalizedBase}${normalizedPath}`\n // Avoid URL.protocol — not supported in React Native and some runtimes.\n return httpUrl.replace(/^https:/i, 'wss:').replace(/^http:/i, 'ws:')\n}\n\n/** Append query params without URLSearchParams (unsupported in React Native). */\nexport function appendQueryParams(\n url: string,\n params: Record<string, string | undefined | null | false>\n): string {\n const query = Object.entries(params)\n .filter((entry): entry is [string, string] => {\n const value = entry[1]\n return value !== undefined && value !== null && value !== false && value !== ''\n })\n .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value)}`)\n .join('&')\n\n if (!query) return url\n\n const separator = url.includes('?') ? '&' : '?'\n return `${url}${separator}${query}`\n}\n\nexport function resolveValue<T>(value: T | (() => T)): T {\n return typeof value === 'function' ? (value as () => T)() : value\n}\n\nexport function isPrivateChannel(channel: string): boolean {\n return channel.startsWith('private-')\n}\n","import { resolveBaseUrl } from './config'\nimport type { AppCredentials, ConnectionTokenInput, ConnectionTokenResponse } from './types'\nimport { ArkNotifyError } from './utils'\n\nexport interface FetchConnectionTokenOptions extends ConnectionTokenInput {\n baseUrl?: string\n appKey: string\n /** Required unless the application has a serverAuthUrl (or one is passed in the request). */\n credentials?: AppCredentials\n fetch?: typeof fetch\n}\n\nfunction requiresAppSecret(options: FetchConnectionTokenOptions): boolean {\n if ('serverAuthUrl' in options) {\n const value = options.serverAuthUrl\n return value === null || value === ''\n }\n if ('server_auth_url' in options) {\n const value = options.server_auth_url\n return value === null || value === ''\n }\n return false\n}\n\nfunction buildConnectionTokenRequest(\n options: FetchConnectionTokenOptions\n): {\n url: string\n headers: Record<string, string>\n body: ConnectionTokenInput\n} {\n const {\n baseUrl,\n appKey,\n credentials,\n client_id,\n clientId,\n user_data,\n userData,\n ttl,\n capabilities,\n server_auth_url,\n serverAuthUrl,\n } = options\n\n const resolvedClientId = client_id ?? clientId\n if (!resolvedClientId) {\n throw new Error('client_id is required to fetch a connection token')\n }\n\n if (requiresAppSecret(options) && !credentials) {\n throw new Error('credentials are required when serverAuthUrl is explicitly set to null')\n }\n\n const body: ConnectionTokenInput = {\n client_id: resolvedClientId,\n user_data: user_data ?? userData,\n ttl,\n capabilities,\n }\n\n if ('serverAuthUrl' in options) {\n body.serverAuthUrl = serverAuthUrl\n } else if ('server_auth_url' in options) {\n body.server_auth_url = server_auth_url\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n }\n\n if (credentials) {\n headers['X-App-Key'] = credentials.appKey\n headers['X-App-Secret'] = credentials.secret\n }\n\n return {\n url: `${resolveBaseUrl(baseUrl)}/api/v1/apps/${appKey}/connection-token`,\n headers,\n body,\n }\n}\n\n/**\n * Request a signed connection token from the Ark Notify API.\n *\n * Authentication depends on server auth configuration:\n * - Application or request has a `serverAuthUrl`: public `appKey` only (frontend-safe).\n * - No `serverAuthUrl`: `credentials` with app key + secret (backend-only).\n */\nexport async function fetchConnectionToken(\n options: FetchConnectionTokenOptions\n): Promise<ConnectionTokenResponse> {\n const { fetch: fetchFn = globalThis.fetch.bind(globalThis) } = options\n const { url, headers, body } = buildConnectionTokenRequest(options)\n\n const response = await fetchFn(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n })\n\n if (!response.ok) {\n let errorBody: { error: string; message: string; reason?: string; retryAfterSec?: number }\n try {\n errorBody = await response.json()\n } catch {\n errorBody = { error: 'request_failed', message: response.statusText }\n }\n throw new ArkNotifyError(response.status, errorBody)\n }\n\n return response.json() as Promise<ConnectionTokenResponse>\n}\n","import { resolveBaseUrl } from './config'\nimport { fetchConnectionToken } from './connection-token'\nimport { ArkNotifyError, resolveValue } from './utils'\nimport type {\n Application,\n ArkNotifyClientConfig,\n AppCredentials,\n AuthResponse,\n ChannelAuthInput,\n ChannelAuthResponse,\n ConnectionTokenInput,\n ConnectionTokenResponse,\n CreateApplicationInput,\n HealthResponse,\n LoginInput,\n PublishEventInput,\n PublishEventResponse,\n UpdateApplicationInput,\n User,\n} from './types'\n\ntype RequestOptions = {\n method?: string\n body?: unknown\n headers?: Record<string, string>\n credentials?: AppCredentials\n}\n\nexport class ArkNotifyClient {\n private readonly baseUrl: string\n private readonly fetchFn: typeof fetch\n private token?: string | (() => string | null | undefined)\n\n constructor(config: Readonly<ArkNotifyClientConfig> = {}) {\n this.baseUrl = resolveBaseUrl(config?.baseUrl)\n this.token = config.token\n this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis)\n }\n\n setToken(token: string | null): void {\n this.token = token ?? undefined\n }\n\n private getAuthHeader(): string | undefined {\n const token = resolveValue(this.token)\n return token ? `Bearer ${token}` : undefined\n }\n\n private async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...options.headers,\n }\n\n const auth = this.getAuthHeader()\n if (auth) {\n headers.Authorization = auth\n }\n\n if (options.credentials) {\n headers['X-App-Key'] = options.credentials.appKey\n headers['X-App-Secret'] = options.credentials.secret\n }\n\n const response = await this.fetchFn(`${this.baseUrl}${path}`, {\n method: options.method ?? 'GET',\n headers,\n body: options.body !== undefined ? JSON.stringify(options.body) : undefined,\n })\n\n if (!response.ok) {\n let body: { error: string; message: string; reason?: string; retryAfterSec?: number }\n try {\n body = await response.json()\n } catch {\n body = { error: 'request_failed', message: response.statusText }\n }\n throw new ArkNotifyError(response.status, body)\n }\n\n if (response.status === 204) {\n return undefined as T\n }\n\n return response.json() as Promise<T>\n }\n\n // ── Health ──────────────────────────────────────────────────────────────\n\n health(): Promise<HealthResponse> {\n return this.request('/health')\n }\n\n // ── Platform auth ───────────────────────────────────────────────────────\n\n login(input: LoginInput): Promise<AuthResponse> {\n return this.request('/api/v1/auth/login', { method: 'POST', body: input })\n }\n\n me(): Promise<{ user: User }> {\n return this.request('/api/v1/auth/me')\n }\n\n // ── Applications ────────────────────────────────────────────────────────\n\n listApplications(): Promise<{ apps: Application[] }> {\n return this.request('/api/v1/applications')\n }\n\n createApplication(input: CreateApplicationInput): Promise<{ app: Application }> {\n return this.request('/api/v1/applications', { method: 'POST', body: input })\n }\n\n getApplication(id: string): Promise<{ app: Application }> {\n return this.request(`/api/v1/applications/${id}`)\n }\n\n updateApplication(id: string, input: UpdateApplicationInput): Promise<{ app: Application }> {\n return this.request(`/api/v1/applications/${id}`, { method: 'PUT', body: input })\n }\n\n deleteApplication(id: string): Promise<{ deleted: boolean; id: string }> {\n return this.request(`/api/v1/applications/${id}`, { method: 'DELETE' })\n }\n\n regenerateSecret(id: string): Promise<{ app: Application }> {\n return this.request(`/api/v1/applications/${id}/regenerate-secret`, {\n method: 'POST',\n })\n }\n\n // ── Data plane ──────────────────────────────────────────────────────────\n\n publishEvent(\n appKey: string,\n credentials: AppCredentials,\n input: PublishEventInput\n ): Promise<PublishEventResponse> {\n return this.request(`/api/v1/apps/${appKey}/events`, {\n method: 'POST',\n body: input,\n credentials,\n })\n }\n\n authorizeChannel(\n appKey: string,\n credentials: AppCredentials,\n input: ChannelAuthInput\n ): Promise<ChannelAuthResponse> {\n return this.request(`/api/v1/apps/${appKey}/auth`, {\n method: 'POST',\n body: input,\n credentials,\n })\n }\n\n issueConnectionToken(\n appKey: string,\n input: ConnectionTokenInput,\n credentials?: AppCredentials\n ): Promise<ConnectionTokenResponse> {\n return fetchConnectionToken({\n baseUrl: this.baseUrl,\n appKey,\n credentials,\n ...input,\n fetch: this.fetchFn,\n })\n }\n}\n","import { resolveBaseUrl } from './config'\nimport { fetchConnectionToken } from './connection-token'\nimport type {\n ArkNotifyConnectionConfig,\n ChannelEventHandler,\n ConnectedMessage,\n ConnectionState,\n EventMessage,\n PresenceMessage,\n ServerMessage,\n SubscribeOptions,\n} from './types'\nimport { isPrivateChannel, appendQueryParams, resolveValue, toWebSocketUrl } from './utils'\n\ntype EventMap = {\n state: (state: ConnectionState) => void\n connected: (message: ConnectedMessage) => void\n event: (message: EventMessage) => void\n presence: (message: PresenceMessage) => void\n message: (message: ServerMessage) => void\n error: (error: { code: string; message: string }) => void\n close: (event: { code: number; reason: string }) => void\n}\n\ntype EventName = keyof EventMap\n\nexport class ArkNotifyConnection {\n private readonly config: Required<\n Pick<\n ArkNotifyConnectionConfig,\n 'baseUrl' | 'appKey' | 'autoReconnect' | 'reconnectDelayMs' | 'maxReconnectDelayMs'\n >\n > &\n ArkNotifyConnectionConfig\n\n private ws: WebSocket | null = null\n private state: ConnectionState = 'disconnected'\n private connectionId: string | null = null\n private clientId: string | null = null\n private authenticated = false\n private readonly subscribedChannels = new Set<string>()\n private readonly pendingSubscriptions = new Map<string, SubscribeOptions>()\n private readonly listeners = new Map<EventName, Set<EventMap[EventName]>>()\n private reconnectAttempt = 0\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private intentionalClose = false\n private connectPromise: Promise<void> | null = null\n private readonly WebSocketCtor: typeof WebSocket\n\n constructor(config: ArkNotifyConnectionConfig) {\n this.config = {\n autoReconnect: true,\n reconnectDelayMs: 1000,\n maxReconnectDelayMs: 30000,\n ...config,\n baseUrl: resolveBaseUrl(config.baseUrl),\n }\n this.WebSocketCtor = config.WebSocket ?? globalThis.WebSocket\n }\n\n getConnectionState(): ConnectionState {\n return this.state\n }\n\n getConnectionId(): string | null {\n return this.connectionId\n }\n\n getClientId(): string | null {\n return this.clientId\n }\n\n isAuthenticated(): boolean {\n return this.authenticated\n }\n\n getSubscribedChannels(): string[] {\n return [...this.subscribedChannels]\n }\n\n on<E extends EventName>(event: E, handler: EventMap[E]): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set())\n }\n this.listeners.get(event)!.add(handler)\n return () => this.off(event, handler)\n }\n\n off<E extends EventName>(event: E, handler: EventMap[E]): void {\n this.listeners.get(event)?.delete(handler)\n }\n\n private emit<E extends EventName>(event: E, ...args: Parameters<EventMap[E]>): void {\n for (const handler of this.listeners.get(event) ?? []) {\n ;(handler as (...a: Parameters<EventMap[E]>) => void)(...args)\n }\n }\n\n private setState(state: ConnectionState): void {\n if (this.state !== state) {\n this.state = state\n this.emit('state', state)\n }\n }\n\n connect(): Promise<void> {\n if (this.ws?.readyState === WebSocket.OPEN || this.ws?.readyState === WebSocket.CONNECTING) {\n return Promise.resolve()\n }\n\n if (this.connectPromise) {\n return this.connectPromise\n }\n\n this.connectPromise = this.doConnect().finally(() => {\n this.connectPromise = null\n })\n\n return this.connectPromise\n }\n\n private async doConnect(): Promise<void> {\n this.intentionalClose = false\n this.clearReconnectTimer()\n this.setState(this.reconnectAttempt > 0 ? 'reconnecting' : 'connecting')\n\n let wsUrl = toWebSocketUrl(this.config.baseUrl, `/app/${this.config.appKey}`)\n\n let token = resolveValue(this.config.token)\n if (!token && this.config.clientId) {\n const result = await fetchConnectionToken({\n baseUrl: this.config.baseUrl,\n appKey: this.config.appKey,\n credentials: this.config.credentials,\n client_id: this.config.clientId,\n user_data: this.config.userData,\n serverAuthUrl: this.config.serverAuthUrl,\n fetch: this.config.fetch,\n })\n token = result.token\n }\n\n if (token) {\n wsUrl = appendQueryParams(wsUrl, { token })\n } else if (this.config.clientId) {\n wsUrl = appendQueryParams(wsUrl, { clientId: this.config.clientId })\n }\n\n this.ws = new this.WebSocketCtor(wsUrl)\n\n this.ws.onopen = () => {\n this.reconnectAttempt = 0\n }\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data as string)\n }\n\n this.ws.onerror = () => {\n this.emit('error', { code: 'websocket_error', message: 'WebSocket error' })\n }\n\n this.ws.onclose = (event) => {\n this.ws = null\n this.connectionId = null\n this.emit('close', { code: event.code, reason: event.reason })\n\n if (!this.intentionalClose && this.config.autoReconnect) {\n this.scheduleReconnect()\n } else {\n this.setState('failed')\n }\n }\n }\n\n disconnect(): void {\n this.intentionalClose = true\n this.clearReconnectTimer()\n this.subscribedChannels.clear()\n this.pendingSubscriptions.clear()\n if (this.ws) {\n this.ws.close()\n this.ws = null\n }\n this.setState('disconnected')\n }\n\n private scheduleReconnect(): void {\n this.setState('reconnecting')\n const delay = Math.min(\n this.config.reconnectDelayMs * 2 ** this.reconnectAttempt,\n this.config.maxReconnectDelayMs\n )\n this.reconnectAttempt++\n this.reconnectTimer = setTimeout(() => void this.connect(), delay)\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n }\n\n private send(payload: Record<string, unknown>): void {\n if (this.ws?.readyState !== WebSocket.OPEN) {\n throw new Error('WebSocket is not connected')\n }\n this.ws.send(JSON.stringify(payload))\n }\n\n private handleMessage(raw: string): void {\n let message: ServerMessage\n try {\n message = JSON.parse(raw) as ServerMessage\n } catch {\n this.emit('error', { code: 'invalid_json', message: 'Invalid JSON from server' })\n return\n }\n\n this.emit('message', message)\n\n switch (message.type) {\n case 'connected': {\n this.connectionId = message.connection_id\n this.clientId = message.client_id\n this.authenticated = message.authenticated\n this.setState('connected')\n this.emit('connected', message)\n this.resubscribeAll()\n break\n }\n case 'event':\n this.emit('event', message)\n break\n case 'presence':\n this.emit('presence', message)\n break\n case 'subscribed':\n this.subscribedChannels.add(message.channel)\n break\n case 'unsubscribed':\n this.subscribedChannels.delete(message.channel)\n break\n case 'error':\n this.emit('error', { code: message.code, message: message.message })\n break\n case 'ping':\n this.send({ action: 'ping' })\n break\n default:\n break\n }\n }\n\n private resubscribeAll(): void {\n for (const [channel, options] of this.pendingSubscriptions) {\n void this.subscribe(channel, options)\n }\n }\n\n async subscribe(channel: string, options: SubscribeOptions = {}): Promise<void> {\n this.pendingSubscriptions.set(channel, options)\n\n if (this.state !== 'connected' || !this.connectionId) {\n return\n }\n\n const payload: Record<string, unknown> = {\n action: 'subscribe',\n channel,\n }\n\n if (options.history) payload.history = true\n if (options.presence) {\n payload.presence = true\n if (options.presence_data) payload.presence_data = options.presence_data\n }\n\n if (isPrivateChannel(channel)) {\n if (options.auth) {\n payload.auth = options.auth\n } else if (this.config.onPrivateChannelAuth) {\n payload.auth = await this.config.onPrivateChannelAuth(channel, this.connectionId)\n } else {\n throw new Error(\n `Private channel \"${channel}\" requires auth. Provide options.auth or onPrivateChannelAuth.`\n )\n }\n }\n\n this.send(payload)\n }\n\n unsubscribe(channel: string): void {\n this.pendingSubscriptions.delete(channel)\n this.subscribedChannels.delete(channel)\n if (this.state === 'connected') {\n this.send({ action: 'unsubscribe', channel })\n }\n }\n\n publish(channel: string, event: string, data?: unknown): void {\n this.send({ action: 'publish', channel, event, data })\n }\n\n presenceEnter(channel: string, data: Record<string, unknown>): void {\n this.send({ action: 'presence_enter', channel, data })\n }\n\n presenceUpdate(channel: string, data: Record<string, unknown>): void {\n this.send({ action: 'presence_update', channel, data })\n }\n\n presenceLeave(channel: string): void {\n this.send({ action: 'presence_leave', channel })\n }\n\n presenceSync(channel: string): void {\n this.send({ action: 'presence_sync', channel })\n }\n\n ping(): void {\n this.send({ action: 'ping' })\n }\n\n bind(channel: string, event: string, handler: ChannelEventHandler): () => void {\n const listener = (message: EventMessage) => {\n if (message.channel === channel && message.event === event) {\n handler(message.data, message)\n }\n }\n return this.on('event', listener)\n }\n\n bindAll(channel: string, handler: ChannelEventHandler): () => void {\n const listener = (message: EventMessage) => {\n if (message.channel === channel) {\n handler(message.data, message)\n }\n }\n return this.on('event', listener)\n }\n}\n","import { resolveBaseUrl } from './config'\nimport type {\n ArkNotifySSEConfig,\n ConnectedMessage,\n EventMessage,\n PresenceMessage,\n ServerMessage,\n} from './types'\nimport { isPrivateChannel, appendQueryParams, resolveValue } from './utils'\n\ntype SSEEventMap = {\n connected: (message: ConnectedMessage) => void\n event: (message: EventMessage) => void\n presence: (message: PresenceMessage) => void\n message: (message: ServerMessage) => void\n error: (error: Error) => void\n close: () => void\n}\n\ntype SSEEventName = keyof SSEEventMap\n\nexport class ArkNotifySSE {\n private readonly config: ArkNotifySSEConfig & { baseUrl: string }\n private es: EventSource | null = null\n private connectionId: string | null = null\n private readonly listeners = new Map<SSEEventName, Set<SSEEventMap[SSEEventName]>>()\n private readonly EventSourceCtor: typeof EventSource\n\n constructor(config: ArkNotifySSEConfig) {\n this.config = { ...config, baseUrl: resolveBaseUrl(config.baseUrl) }\n this.EventSourceCtor = config.EventSource ?? globalThis.EventSource\n }\n\n getConnectionId(): string | null {\n return this.connectionId\n }\n\n on<E extends SSEEventName>(event: E, handler: SSEEventMap[E]): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set())\n }\n this.listeners.get(event)!.add(handler)\n return () => this.off(event, handler)\n }\n\n off<E extends SSEEventName>(event: E, handler: SSEEventMap[E]): void {\n this.listeners.get(event)?.delete(handler)\n }\n\n private emit<E extends SSEEventName>(event: E, ...args: Parameters<SSEEventMap[E]>): void {\n for (const handler of this.listeners.get(event) ?? []) {\n ;(handler as (...a: Parameters<SSEEventMap[E]>) => void)(...args)\n }\n }\n\n async connect(): Promise<void> {\n if (this.es) return\n\n const base = this.config.baseUrl.replace(/\\/$/, '')\n const authMap = this.config.auth ? { ...this.config.auth } : {}\n\n const privateChannels = this.config.channels.filter(isPrivateChannel)\n if (privateChannels.length > 0 && this.config.onPrivateChannelAuth && !this.config.auth) {\n // Private SSE channels need auth tokens in the query before connect.\n // Fetch tokens server-side and pass them via the `auth` option, or use WebSocket instead.\n }\n\n const token = resolveValue(this.config.token)\n const streamUrl = appendQueryParams(`${base}/app/${this.config.appKey}/stream`, {\n channels: this.config.channels.join(','),\n token: token || undefined,\n clientId: !token && this.config.clientId ? this.config.clientId : undefined,\n history: this.config.history ? 'true' : undefined,\n user_data: this.config.user_data ? JSON.stringify(this.config.user_data) : undefined,\n auth: Object.keys(authMap).length > 0 ? JSON.stringify(authMap) : undefined,\n })\n\n this.es = new this.EventSourceCtor(streamUrl)\n\n this.es.addEventListener('connected', (e) => {\n const message = JSON.parse(e.data) as ConnectedMessage\n this.connectionId = message.connection_id\n this.emit('connected', message)\n this.emit('message', message)\n })\n\n this.es.addEventListener('event', (e) => {\n const message = JSON.parse(e.data) as EventMessage\n this.emit('event', message)\n this.emit('message', message)\n })\n\n this.es.addEventListener('presence', (e) => {\n const message = JSON.parse(e.data) as PresenceMessage\n this.emit('presence', message)\n this.emit('message', message)\n })\n\n this.es.onerror = () => {\n this.emit('error', new Error('SSE connection error'))\n }\n }\n\n disconnect(): void {\n if (this.es) {\n this.es.close()\n this.es = null\n this.connectionId = null\n this.emit('close')\n }\n }\n\n bind(\n channel: string,\n event: string,\n handler: (data: unknown, message: EventMessage) => void\n ): () => void {\n const listener = (message: EventMessage) => {\n if (message.channel === channel && message.event === event) {\n handler(message.data, message)\n }\n }\n return this.on('event', listener)\n }\n\n bindAll(channel: string, handler: (data: unknown, message: EventMessage) => void): () => void {\n const listener = (message: EventMessage) => {\n if (message.channel === channel) {\n handler(message.data, message)\n }\n }\n return this.on('event', listener)\n }\n}\n","import { createContext, useContext } from 'react'\nimport type { ArkNotifyClient } from '../client'\nimport type { ArkNotifyConnection } from '../connection'\nimport type { ArkNotifySSE } from '../sse'\nimport type { ArkNotifyConnectionConfig, ArkNotifySSEConfig } from '../types'\n\nexport interface ArkNotifyContextValue {\n baseUrl: string\n client: ArkNotifyClient\n createConnection: (config: Omit<ArkNotifyConnectionConfig, 'baseUrl'>) => ArkNotifyConnection\n createSSE: (config: Omit<ArkNotifySSEConfig, 'baseUrl'>) => ArkNotifySSE\n}\n\nexport const ArkNotifyContext = createContext<ArkNotifyContextValue | null>(null)\n\nexport function useArkNotifyContext(): ArkNotifyContextValue {\n const ctx = useContext(ArkNotifyContext)\n if (!ctx) {\n throw new Error('useArkNotify must be used within an ArkNotifyProvider')\n }\n return ctx\n}\n","import { useCallback, useEffect, useMemo, useRef, type ReactNode } from 'react'\nimport { ArkNotifyClient } from '../client'\nimport { resolveBaseUrl } from '../config'\nimport { ArkNotifyConnection } from '../connection'\nimport { ArkNotifySSE } from '../sse'\nimport type { ArkNotifyClientConfig, ArkNotifyConnectionConfig, ArkNotifySSEConfig } from '../types'\nimport { ArkNotifyContext } from './context'\n\nexport interface ArkNotifyProviderProps {\n children: ReactNode\n baseUrl?: string\n token?: ArkNotifyClientConfig['token']\n fetch?: ArkNotifyClientConfig['fetch']\n}\n\nexport function ArkNotifyProvider({\n children,\n baseUrl,\n token,\n fetch: fetchFn,\n}: Readonly<ArkNotifyProviderProps>) {\n const resolvedBaseUrl = useMemo(() => resolveBaseUrl(baseUrl), [baseUrl])\n const clientRef = useRef<ArkNotifyClient | null>(null)\n\n clientRef.current ??= new ArkNotifyClient({ baseUrl, token, fetch: fetchFn })\n\n const client = clientRef.current\n\n useEffect(() => {\n if (token === undefined) return\n const resolved = typeof token === 'function' ? (token() ?? null) : (token ?? null)\n client.setToken(resolved)\n }, [client, token])\n\n const createConnection = useCallback(\n (config: Omit<ArkNotifyConnectionConfig, 'baseUrl'>) =>\n new ArkNotifyConnection({ baseUrl: resolvedBaseUrl, ...config }),\n [resolvedBaseUrl]\n )\n\n const createSSE = useCallback(\n (config: Omit<ArkNotifySSEConfig, 'baseUrl'>) =>\n new ArkNotifySSE({ baseUrl: resolvedBaseUrl, ...config }),\n [resolvedBaseUrl]\n )\n\n const value = useMemo(\n () => ({ baseUrl: resolvedBaseUrl, client, createConnection, createSSE }),\n [resolvedBaseUrl, client, createConnection, createSSE]\n )\n\n return <ArkNotifyContext.Provider value={value}>{children}</ArkNotifyContext.Provider>\n}\n","import { useArkNotifyContext } from './context'\n\nexport function useArkNotify() {\n return useArkNotifyContext()\n}\n","import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport type { ArkNotifyConnection } from '../connection'\nimport type {\n ArkNotifyConnectionConfig,\n ChannelEventHandler,\n ConnectedMessage,\n ConnectionState,\n EventMessage,\n PresenceMemberInfo,\n PresenceMessage,\n SubscribeOptions,\n} from '../types'\nimport { useArkNotify } from './useArkNotify'\n\nexport interface UseConnectionOptions\n extends Omit<ArkNotifyConnectionConfig, 'baseUrl'> {\n enabled?: boolean\n}\n\nexport interface UseConnectionResult {\n connection: ArkNotifyConnection | null\n state: ConnectionState\n connectionId: string | null\n clientId: string | null\n authenticated: boolean\n connectedMessage: ConnectedMessage | null\n connect: () => Promise<void>\n disconnect: () => void\n}\n\nexport function useConnection(options: UseConnectionOptions): UseConnectionResult {\n const { createConnection } = useArkNotify()\n const { enabled = true, ...connectionConfig } = options\n\n const connectionRef = useRef<ArkNotifyConnection | null>(null)\n const [connectedMessage, setConnectedMessage] = useState<ConnectedMessage | null>(null)\n\n if (!connectionRef.current) {\n connectionRef.current = createConnection(connectionConfig)\n }\n\n const connection = connectionRef.current!\n\n const subscribe = useCallback(\n (onStoreChange: () => void) => {\n const unsubscribers = [\n connection.on('state', onStoreChange),\n connection.on('connected', (msg) => {\n setConnectedMessage(msg)\n onStoreChange()\n }),\n ]\n return () => unsubscribers.forEach((u) => u())\n },\n [connection]\n )\n\n const getSnapshot = useCallback(() => connection.getConnectionState(), [connection])\n const state = useSyncExternalStore(subscribe, getSnapshot, getSnapshot)\n\n useEffect(() => {\n if (enabled) {\n connection.connect()\n }\n return () => connection.disconnect()\n }, [connection, enabled])\n\n const connect = useCallback(() => connection.connect(), [connection])\n const disconnect = useCallback(() => connection.disconnect(), [connection])\n\n return {\n connection,\n state,\n connectionId: connection.getConnectionId(),\n clientId: connection.getClientId(),\n authenticated: connection.isAuthenticated(),\n connectedMessage,\n connect,\n disconnect,\n }\n}\n\nexport interface UseChannelOptions extends SubscribeOptions {\n enabled?: boolean\n onEvent?: (event: string, data: unknown, message: EventMessage) => void\n}\n\nexport interface UseChannelResult {\n subscribed: boolean\n subscribe: (opts?: SubscribeOptions) => Promise<void>\n unsubscribe: () => void\n publish: (event: string, data?: unknown) => void\n bind: (event: string, handler: ChannelEventHandler) => () => void\n}\n\nexport function useChannel(\n connection: ArkNotifyConnection | null,\n channel: string,\n options: UseChannelOptions = {}\n): UseChannelResult {\n const { enabled = true, onEvent, ...subscribeOptions } = options\n const [subscribed, setSubscribed] = useState(false)\n const subscribeOptionsRef = useRef(subscribeOptions)\n subscribeOptionsRef.current = subscribeOptions\n\n const subscribe = useCallback(\n async (opts?: SubscribeOptions) => {\n if (!connection) return\n await connection.subscribe(channel, { ...subscribeOptionsRef.current, ...opts })\n setSubscribed(true)\n },\n [connection, channel]\n )\n\n const unsubscribe = useCallback(() => {\n connection?.unsubscribe(channel)\n setSubscribed(false)\n }, [connection, channel])\n\n const publish = useCallback(\n (event: string, data?: unknown) => {\n connection?.publish(channel, event, data)\n },\n [connection, channel]\n )\n\n const bind = useCallback(\n (event: string, handler: ChannelEventHandler) => {\n if (!connection) return () => {}\n return connection.bind(channel, event, handler)\n },\n [connection, channel]\n )\n\n useEffect(() => {\n if (!connection || !enabled || !channel) return\n\n const unsubSubscribed = connection.on('message', (msg) => {\n if (msg.type === 'subscribed' && msg.channel === channel) {\n setSubscribed(true)\n }\n if (msg.type === 'unsubscribed' && msg.channel === channel) {\n setSubscribed(false)\n }\n })\n\n const unsubEvent = onEvent\n ? connection.on('event', (msg) => {\n if (msg.channel === channel) {\n onEvent(msg.event, msg.data, msg)\n }\n })\n : () => {}\n\n void subscribe()\n\n return () => {\n unsubSubscribed()\n unsubEvent()\n connection.unsubscribe(channel)\n setSubscribed(false)\n }\n }, [connection, channel, enabled, subscribe, onEvent])\n\n return { subscribed, subscribe, unsubscribe, publish, bind }\n}\n\nexport interface UsePresenceResult {\n members: PresenceMemberInfo[]\n enter: (data: Record<string, unknown>) => void\n update: (data: Record<string, unknown>) => void\n leave: () => void\n sync: () => void\n}\n\nexport function usePresence(\n connection: ArkNotifyConnection | null,\n channel: string,\n options: { enabled?: boolean; initialData?: Record<string, unknown> } = {}\n): UsePresenceResult {\n const { enabled = true, initialData } = options\n const [members, setMembers] = useState<PresenceMemberInfo[]>([])\n\n useEffect(() => {\n if (!connection || !enabled || !channel) return\n\n const unsubscribe = connection.on('presence', (msg: PresenceMessage) => {\n if (msg.channel !== channel) return\n\n if (msg.action === 'sync' && msg.members) {\n setMembers(msg.members)\n } else if (msg.action === 'enter' && msg.member) {\n setMembers((prev) => {\n const filtered = prev.filter((m) => m.clientId !== msg.member!.clientId)\n return [...filtered, msg.member!]\n })\n } else if (msg.action === 'leave' && msg.member) {\n setMembers((prev) => prev.filter((m) => m.clientId !== msg.member!.clientId))\n } else if (msg.action === 'update' && msg.member) {\n setMembers((prev) =>\n prev.map((m) => (m.clientId === msg.member!.clientId ? msg.member! : m))\n )\n }\n })\n\n if (initialData) {\n connection.presenceEnter(channel, initialData)\n }\n\n return unsubscribe\n }, [connection, channel, enabled, initialData])\n\n const enter = useCallback(\n (data: Record<string, unknown>) => connection?.presenceEnter(channel, data),\n [connection, channel]\n )\n const update = useCallback(\n (data: Record<string, unknown>) => connection?.presenceUpdate(channel, data),\n [connection, channel]\n )\n const leave = useCallback(() => connection?.presenceLeave(channel), [connection, channel])\n const sync = useCallback(() => connection?.presenceSync(channel), [connection, channel])\n\n return { members, enter, update, leave, sync }\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport type {\n Application,\n CreateApplicationInput,\n UpdateApplicationInput,\n} from '../types'\nimport { ArkNotifyError } from '../utils'\nimport { useArkNotify } from './useArkNotify'\n\nexport interface UseApplicationsResult {\n apps: Application[]\n loading: boolean\n error: ArkNotifyError | null\n refresh: () => Promise<void>\n create: (input: CreateApplicationInput) => Promise<Application>\n update: (id: string, input: UpdateApplicationInput) => Promise<Application>\n remove: (id: string) => Promise<void>\n regenerateSecret: (id: string) => Promise<Application>\n getById: (id: string) => Promise<Application>\n}\n\nexport function useApplications(): UseApplicationsResult {\n const { client } = useArkNotify()\n const [apps, setApps] = useState<Application[]>([])\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<ArkNotifyError | null>(null)\n\n const refresh = useCallback(async () => {\n setLoading(true)\n setError(null)\n try {\n const { apps: list } = await client.listApplications()\n setApps(list)\n } catch (err) {\n if (err instanceof ArkNotifyError) setError(err)\n } finally {\n setLoading(false)\n }\n }, [client])\n\n useEffect(() => {\n void refresh()\n }, [refresh])\n\n const create = useCallback(\n async (input: CreateApplicationInput) => {\n const { app } = await client.createApplication(input)\n setApps((prev) => [...prev, app])\n return app\n },\n [client]\n )\n\n const update = useCallback(\n async (id: string, input: UpdateApplicationInput) => {\n const { app } = await client.updateApplication(id, input)\n setApps((prev) => prev.map((a) => (a.id === id ? app : a)))\n return app\n },\n [client]\n )\n\n const remove = useCallback(\n async (id: string) => {\n await client.deleteApplication(id)\n setApps((prev) => prev.filter((a) => a.id !== id))\n },\n [client]\n )\n\n const regenerateSecret = useCallback(\n async (id: string) => {\n const { app } = await client.regenerateSecret(id)\n setApps((prev) => prev.map((a) => (a.id === id ? app : a)))\n return app\n },\n [client]\n )\n\n const getById = useCallback(\n async (id: string) => {\n const { app } = await client.getApplication(id)\n return app\n },\n [client]\n )\n\n return { apps, loading, error, refresh, create, update, remove, regenerateSecret, getById }\n}\n","import { useCallback, useEffect, useState } from 'react'\nimport type { LoginInput, User } from '../types'\nimport { ArkNotifyError } from '../utils'\nimport { useArkNotify } from './useArkNotify'\n\nconst TOKEN_STORAGE_KEY = 'ark-notify-js-token'\n\nexport interface UsePlatformAuthOptions {\n storageKey?: string\n persist?: boolean\n}\n\nexport interface UsePlatformAuthResult {\n user: User | null\n token: string | null\n loading: boolean\n error: ArkNotifyError | null\n login: (input: LoginInput) => Promise<void>\n logout: () => void\n refreshUser: () => Promise<void>\n isAuthenticated: boolean\n}\n\nexport function usePlatformAuth(options: UsePlatformAuthOptions = {}): UsePlatformAuthResult {\n const { client } = useArkNotify()\n const storageKey = options.storageKey ?? TOKEN_STORAGE_KEY\n const persist = options.persist ?? true\n\n const [user, setUser] = useState<User | null>(null)\n const [token, setToken] = useState<string | null>(() => {\n if (!persist || typeof window === 'undefined') return null\n return localStorage.getItem(storageKey)\n })\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<ArkNotifyError | null>(null)\n\n const saveToken = useCallback(\n (newToken: string | null) => {\n setToken(newToken)\n client.setToken(newToken)\n if (persist && typeof window !== 'undefined') {\n if (newToken) {\n localStorage.setItem(storageKey, newToken)\n } else {\n localStorage.removeItem(storageKey)\n }\n }\n },\n [client, persist, storageKey]\n )\n\n const refreshUser = useCallback(async () => {\n if (!token) {\n setUser(null)\n return\n }\n setLoading(true)\n setError(null)\n try {\n client.setToken(token)\n const { user: fetched } = await client.me()\n setUser(fetched)\n } catch (err) {\n setUser(null)\n if (err instanceof ArkNotifyError) {\n setError(err)\n if (err.status === 401) saveToken(null)\n }\n } finally {\n setLoading(false)\n }\n }, [client, token, saveToken])\n\n useEffect(() => {\n if (token) {\n client.setToken(token)\n void refreshUser()\n }\n }, []) // eslint-disable-line react-hooks/exhaustive-deps\n\n const login = useCallback(\n async (input: LoginInput) => {\n setLoading(true)\n setError(null)\n try {\n const res = await client.login(input)\n saveToken(res.token)\n setUser(res.user)\n } catch (err) {\n if (err instanceof ArkNotifyError) setError(err)\n throw err\n } finally {\n setLoading(false)\n }\n },\n [client, saveToken]\n )\n\n const logout = useCallback(() => {\n saveToken(null)\n setUser(null)\n setError(null)\n }, [saveToken])\n\n return {\n user,\n token,\n loading,\n error,\n login,\n logout,\n refreshUser,\n isAuthenticated: !!user && !!token,\n }\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport type { ArkNotifySSE } from '../sse'\nimport type { ArkNotifySSEConfig, ConnectedMessage, EventMessage } from '../types'\nimport { useArkNotify } from './useArkNotify'\n\nexport interface UseSSEOptions extends Omit<ArkNotifySSEConfig, 'baseUrl'> {\n enabled?: boolean\n onEvent?: (event: string, data: unknown, message: EventMessage) => void\n}\n\nexport interface UseSSEResult {\n sse: ArkNotifySSE | null\n connected: boolean\n connectionId: string | null\n connectedMessage: ConnectedMessage | null\n connect: () => void\n disconnect: () => void\n bind: (channel: string, event: string, handler: (data: unknown) => void) => () => void\n}\n\nexport function useSSE(options: UseSSEOptions): UseSSEResult {\n const { createSSE } = useArkNotify()\n const { enabled = true, onEvent, ...sseConfig } = options\n\n const sseRef = useRef<ArkNotifySSE | null>(null)\n const [connected, setConnected] = useState(false)\n const [connectedMessage, setConnectedMessage] = useState<ConnectedMessage | null>(null)\n\n if (!sseRef.current) {\n sseRef.current = createSSE(sseConfig)\n }\n\n const sse = sseRef.current!\n\n useEffect(() => {\n if (!enabled) return\n\n const unsubs = [\n sse.on('connected', (msg) => {\n setConnected(true)\n setConnectedMessage(msg)\n }),\n sse.on('close', () => {\n setConnected(false)\n setConnectedMessage(null)\n }),\n onEvent\n ? sse.on('event', (msg) => onEvent(msg.event, msg.data, msg))\n : () => {},\n ]\n\n void sse.connect()\n\n return () => {\n unsubs.forEach((u) => u())\n sse.disconnect()\n setConnected(false)\n }\n }, [sse, enabled, onEvent])\n\n const connect = useCallback(() => void sse.connect(), [sse])\n const disconnect = useCallback(() => sse.disconnect(), [sse])\n\n const bind = useCallback(\n (channel: string, event: string, handler: (data: unknown) => void) =>\n sse.bind(channel, event, (data) => handler(data)),\n [sse]\n )\n\n return {\n sse,\n connected,\n connectionId: sse.getConnectionId(),\n connectedMessage,\n connect,\n disconnect,\n bind,\n }\n}\n"]}
@@ -3,7 +3,7 @@
3
3
  var crypto = require('crypto');
4
4
 
5
5
  // src/server-auth.ts
6
- var CLIENT_ID_PATTERN = /^[a-zA-Z0-9_\-.@]{1,128}$/;
6
+ var CLIENT_ID_PATTERN = /^[a-zA-Z0-9_\-.@\+]{1,128}$/;
7
7
  var DEFAULT_TTL_SECONDS = 3600;
8
8
  var MAX_TTL_SECONDS = 86400;
9
9
  var DEFAULT_CAPABILITIES = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server-auth.ts"],"names":["createHmac"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createHmac } from 'node:crypto'\nimport type {\n ConnectionCapabilities,\n CreateAuthorizedServerAuthResponseOptions,\n HandleServerAuthOptions,\n ServerAuthApprovedResponse,\n ServerAuthDeniedResponse,\n ServerAuthRequest,\n ServerAuthResponse,\n ServerAuthDecision,\n} from './types'\n\nconst CLIENT_ID_PATTERN = /^[a-zA-Z0-9_\\-.@]{1,128}$/\nconst DEFAULT_TTL_SECONDS = 3600\nconst MAX_TTL_SECONDS = 86400\n\nconst DEFAULT_CAPABILITIES: ConnectionCapabilities = {\n subscribe: true,\n publish: true,\n presence: true,\n}\n\nexport function isValidClientId(clientId: unknown): clientId is string {\n return typeof clientId === 'string' && CLIENT_ID_PATTERN.test(clientId)\n}\n\nfunction normalizeCapabilities(\n capabilities?: Partial<ConnectionCapabilities> | null\n): ConnectionCapabilities {\n if (!capabilities || typeof capabilities !== 'object') {\n return { ...DEFAULT_CAPABILITIES }\n }\n\n return {\n subscribe: capabilities.subscribe !== false,\n publish: capabilities.publish !== false,\n presence: capabilities.presence !== false,\n }\n}\n\nfunction resolveTokenTtl(ttl?: number | null): number {\n if (ttl === undefined || ttl === null) {\n return DEFAULT_TTL_SECONDS\n }\n\n if (!Number.isInteger(ttl) || ttl <= 0) {\n throw new Error('ttl must be a positive integer (seconds)')\n }\n\n return Math.min(ttl, MAX_TTL_SECONDS)\n}\n\nfunction encodePayload(payload: Record<string, unknown>): string {\n return Buffer.from(JSON.stringify(payload)).toString('base64url')\n}\n\nfunction computeConnectionTokenSignature(\n secret: string,\n appKey: string,\n payloadEncoded: string\n): string {\n return createHmac('sha256', secret).update(`${appKey}.${payloadEncoded}`).digest('hex')\n}\n\n/** Build a signed connection token in Ark Notify format. */\nexport function buildConnectionToken(\n appKey: string,\n secret: string,\n options: {\n clientId: string\n exp: number\n capabilities?: Partial<ConnectionCapabilities>\n }\n): string {\n if (!isValidClientId(options.clientId)) {\n throw new Error('clientId must be 1-128 alphanumeric characters')\n }\n\n const payloadEncoded = encodePayload({\n client_id: options.clientId,\n exp: options.exp,\n capabilities: normalizeCapabilities(options.capabilities),\n })\n\n const signature = computeConnectionTokenSignature(secret, appKey, payloadEncoded)\n return `${appKey}.${payloadEncoded}.${signature}`\n}\n\n/**\n * Parse the JSON body Ark Notify sends to your `serverAuthUrl`.\n * Returns null when the payload is invalid.\n */\nexport function parseServerAuthRequest(body: unknown): ServerAuthRequest | null {\n if (!body || typeof body !== 'object') {\n return null\n }\n\n const record = body as Record<string, unknown>\n const client_id = record.client_id ?? record.clientId\n\n if (!isValidClientId(client_id)) {\n return null\n }\n\n const user_data = record.user_data ?? record.userData\n const capabilities = record.capabilities\n const ttl = record.ttl\n\n return {\n client_id,\n user_data:\n user_data === undefined\n ? null\n : user_data && typeof user_data === 'object'\n ? (user_data as Record<string, unknown>)\n : null,\n capabilities:\n capabilities && typeof capabilities === 'object'\n ? (capabilities as Partial<ConnectionCapabilities>)\n : null,\n ttl: typeof ttl === 'number' ? ttl : null,\n }\n}\n\n/**\n * Build an approved response for your `serverAuthUrl` webhook.\n *\n * - Without `credentials`: returns `{ allowed: true, client_id, ... }` (option A).\n * - With `credentials`: returns `{ token }` with a pre-signed token (option B).\n */\nexport function createAuthorizedServerAuthResponse(\n options: CreateAuthorizedServerAuthResponseOptions\n): ServerAuthApprovedResponse {\n if (!isValidClientId(options.clientId)) {\n throw new Error('clientId must be 1-128 alphanumeric characters')\n }\n\n const capabilities = normalizeCapabilities(options.capabilities)\n const ttl = resolveTokenTtl(options.ttl)\n\n if (options.credentials) {\n const exp = Math.floor(Date.now() / 1000) + ttl\n return {\n token: buildConnectionToken(options.credentials.appKey, options.credentials.secret, {\n clientId: options.clientId,\n exp,\n capabilities,\n }),\n }\n }\n\n return {\n allowed: true,\n client_id: options.clientId,\n capabilities,\n ttl,\n }\n}\n\n/** Build a denied response for your `serverAuthUrl` webhook. */\nexport function createDeniedServerAuthResponse(reason?: string): ServerAuthDeniedResponse {\n return reason ? { allowed: false, reason } : { allowed: false }\n}\n\n/**\n * Authenticate an incoming `serverAuthUrl` request and return the webhook response\n * body Ark Notify expects.\n */\nexport async function handleServerAuth(\n options: HandleServerAuthOptions\n): Promise<ServerAuthResponse> {\n const decision: ServerAuthDecision = await options.isAuthorized(options.request)\n\n if (decision === false) {\n return createDeniedServerAuthResponse()\n }\n\n const clientId = decision.clientId ?? options.request.client_id\n if (!isValidClientId(clientId)) {\n return createDeniedServerAuthResponse('invalid_client_id')\n }\n\n try {\n return createAuthorizedServerAuthResponse({\n clientId,\n capabilities: decision.capabilities ?? options.request.capabilities ?? undefined,\n ttl: decision.ttl ?? options.request.ttl ?? undefined,\n credentials: options.credentials,\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : 'invalid_request'\n return createDeniedServerAuthResponse(message)\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/server-auth.ts"],"names":["createHmac"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createHmac } from 'node:crypto'\nimport type {\n ConnectionCapabilities,\n CreateAuthorizedServerAuthResponseOptions,\n HandleServerAuthOptions,\n ServerAuthApprovedResponse,\n ServerAuthDeniedResponse,\n ServerAuthRequest,\n ServerAuthResponse,\n ServerAuthDecision,\n} from './types'\n\nconst CLIENT_ID_PATTERN = /^[a-zA-Z0-9_\\-.@\\+]{1,128}$/\nconst DEFAULT_TTL_SECONDS = 3600\nconst MAX_TTL_SECONDS = 86400\n\nconst DEFAULT_CAPABILITIES: ConnectionCapabilities = {\n subscribe: true,\n publish: true,\n presence: true,\n}\n\nexport function isValidClientId(clientId: unknown): clientId is string {\n return typeof clientId === 'string' && CLIENT_ID_PATTERN.test(clientId)\n}\n\nfunction normalizeCapabilities(\n capabilities?: Partial<ConnectionCapabilities> | null\n): ConnectionCapabilities {\n if (!capabilities || typeof capabilities !== 'object') {\n return { ...DEFAULT_CAPABILITIES }\n }\n\n return {\n subscribe: capabilities.subscribe !== false,\n publish: capabilities.publish !== false,\n presence: capabilities.presence !== false,\n }\n}\n\nfunction resolveTokenTtl(ttl?: number | null): number {\n if (ttl === undefined || ttl === null) {\n return DEFAULT_TTL_SECONDS\n }\n\n if (!Number.isInteger(ttl) || ttl <= 0) {\n throw new Error('ttl must be a positive integer (seconds)')\n }\n\n return Math.min(ttl, MAX_TTL_SECONDS)\n}\n\nfunction encodePayload(payload: Record<string, unknown>): string {\n return Buffer.from(JSON.stringify(payload)).toString('base64url')\n}\n\nfunction computeConnectionTokenSignature(\n secret: string,\n appKey: string,\n payloadEncoded: string\n): string {\n return createHmac('sha256', secret).update(`${appKey}.${payloadEncoded}`).digest('hex')\n}\n\n/** Build a signed connection token in Ark Notify format. */\nexport function buildConnectionToken(\n appKey: string,\n secret: string,\n options: {\n clientId: string\n exp: number\n capabilities?: Partial<ConnectionCapabilities>\n }\n): string {\n if (!isValidClientId(options.clientId)) {\n throw new Error('clientId must be 1-128 alphanumeric characters')\n }\n\n const payloadEncoded = encodePayload({\n client_id: options.clientId,\n exp: options.exp,\n capabilities: normalizeCapabilities(options.capabilities),\n })\n\n const signature = computeConnectionTokenSignature(secret, appKey, payloadEncoded)\n return `${appKey}.${payloadEncoded}.${signature}`\n}\n\n/**\n * Parse the JSON body Ark Notify sends to your `serverAuthUrl`.\n * Returns null when the payload is invalid.\n */\nexport function parseServerAuthRequest(body: unknown): ServerAuthRequest | null {\n if (!body || typeof body !== 'object') {\n return null\n }\n\n const record = body as Record<string, unknown>\n const client_id = record.client_id ?? record.clientId\n\n if (!isValidClientId(client_id)) {\n return null\n }\n\n const user_data = record.user_data ?? record.userData\n const capabilities = record.capabilities\n const ttl = record.ttl\n\n return {\n client_id,\n user_data:\n user_data === undefined\n ? null\n : user_data && typeof user_data === 'object'\n ? (user_data as Record<string, unknown>)\n : null,\n capabilities:\n capabilities && typeof capabilities === 'object'\n ? (capabilities as Partial<ConnectionCapabilities>)\n : null,\n ttl: typeof ttl === 'number' ? ttl : null,\n }\n}\n\n/**\n * Build an approved response for your `serverAuthUrl` webhook.\n *\n * - Without `credentials`: returns `{ allowed: true, client_id, ... }` (option A).\n * - With `credentials`: returns `{ token }` with a pre-signed token (option B).\n */\nexport function createAuthorizedServerAuthResponse(\n options: CreateAuthorizedServerAuthResponseOptions\n): ServerAuthApprovedResponse {\n if (!isValidClientId(options.clientId)) {\n throw new Error('clientId must be 1-128 alphanumeric characters')\n }\n\n const capabilities = normalizeCapabilities(options.capabilities)\n const ttl = resolveTokenTtl(options.ttl)\n\n if (options.credentials) {\n const exp = Math.floor(Date.now() / 1000) + ttl\n return {\n token: buildConnectionToken(options.credentials.appKey, options.credentials.secret, {\n clientId: options.clientId,\n exp,\n capabilities,\n }),\n }\n }\n\n return {\n allowed: true,\n client_id: options.clientId,\n capabilities,\n ttl,\n }\n}\n\n/** Build a denied response for your `serverAuthUrl` webhook. */\nexport function createDeniedServerAuthResponse(reason?: string): ServerAuthDeniedResponse {\n return reason ? { allowed: false, reason } : { allowed: false }\n}\n\n/**\n * Authenticate an incoming `serverAuthUrl` request and return the webhook response\n * body Ark Notify expects.\n */\nexport async function handleServerAuth(\n options: HandleServerAuthOptions\n): Promise<ServerAuthResponse> {\n const decision: ServerAuthDecision = await options.isAuthorized(options.request)\n\n if (decision === false) {\n return createDeniedServerAuthResponse()\n }\n\n const clientId = decision.clientId ?? options.request.client_id\n if (!isValidClientId(clientId)) {\n return createDeniedServerAuthResponse('invalid_client_id')\n }\n\n try {\n return createAuthorizedServerAuthResponse({\n clientId,\n capabilities: decision.capabilities ?? options.request.capabilities ?? undefined,\n ttl: decision.ttl ?? options.request.ttl ?? undefined,\n credentials: options.credentials,\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : 'invalid_request'\n return createDeniedServerAuthResponse(message)\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  import { createHmac } from 'crypto';
2
2
 
3
3
  // src/server-auth.ts
4
- var CLIENT_ID_PATTERN = /^[a-zA-Z0-9_\-.@]{1,128}$/;
4
+ var CLIENT_ID_PATTERN = /^[a-zA-Z0-9_\-.@\+]{1,128}$/;
5
5
  var DEFAULT_TTL_SECONDS = 3600;
6
6
  var MAX_TTL_SECONDS = 86400;
7
7
  var DEFAULT_CAPABILITIES = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server-auth.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { createHmac } from 'node:crypto'\nimport type {\n ConnectionCapabilities,\n CreateAuthorizedServerAuthResponseOptions,\n HandleServerAuthOptions,\n ServerAuthApprovedResponse,\n ServerAuthDeniedResponse,\n ServerAuthRequest,\n ServerAuthResponse,\n ServerAuthDecision,\n} from './types'\n\nconst CLIENT_ID_PATTERN = /^[a-zA-Z0-9_\\-.@]{1,128}$/\nconst DEFAULT_TTL_SECONDS = 3600\nconst MAX_TTL_SECONDS = 86400\n\nconst DEFAULT_CAPABILITIES: ConnectionCapabilities = {\n subscribe: true,\n publish: true,\n presence: true,\n}\n\nexport function isValidClientId(clientId: unknown): clientId is string {\n return typeof clientId === 'string' && CLIENT_ID_PATTERN.test(clientId)\n}\n\nfunction normalizeCapabilities(\n capabilities?: Partial<ConnectionCapabilities> | null\n): ConnectionCapabilities {\n if (!capabilities || typeof capabilities !== 'object') {\n return { ...DEFAULT_CAPABILITIES }\n }\n\n return {\n subscribe: capabilities.subscribe !== false,\n publish: capabilities.publish !== false,\n presence: capabilities.presence !== false,\n }\n}\n\nfunction resolveTokenTtl(ttl?: number | null): number {\n if (ttl === undefined || ttl === null) {\n return DEFAULT_TTL_SECONDS\n }\n\n if (!Number.isInteger(ttl) || ttl <= 0) {\n throw new Error('ttl must be a positive integer (seconds)')\n }\n\n return Math.min(ttl, MAX_TTL_SECONDS)\n}\n\nfunction encodePayload(payload: Record<string, unknown>): string {\n return Buffer.from(JSON.stringify(payload)).toString('base64url')\n}\n\nfunction computeConnectionTokenSignature(\n secret: string,\n appKey: string,\n payloadEncoded: string\n): string {\n return createHmac('sha256', secret).update(`${appKey}.${payloadEncoded}`).digest('hex')\n}\n\n/** Build a signed connection token in Ark Notify format. */\nexport function buildConnectionToken(\n appKey: string,\n secret: string,\n options: {\n clientId: string\n exp: number\n capabilities?: Partial<ConnectionCapabilities>\n }\n): string {\n if (!isValidClientId(options.clientId)) {\n throw new Error('clientId must be 1-128 alphanumeric characters')\n }\n\n const payloadEncoded = encodePayload({\n client_id: options.clientId,\n exp: options.exp,\n capabilities: normalizeCapabilities(options.capabilities),\n })\n\n const signature = computeConnectionTokenSignature(secret, appKey, payloadEncoded)\n return `${appKey}.${payloadEncoded}.${signature}`\n}\n\n/**\n * Parse the JSON body Ark Notify sends to your `serverAuthUrl`.\n * Returns null when the payload is invalid.\n */\nexport function parseServerAuthRequest(body: unknown): ServerAuthRequest | null {\n if (!body || typeof body !== 'object') {\n return null\n }\n\n const record = body as Record<string, unknown>\n const client_id = record.client_id ?? record.clientId\n\n if (!isValidClientId(client_id)) {\n return null\n }\n\n const user_data = record.user_data ?? record.userData\n const capabilities = record.capabilities\n const ttl = record.ttl\n\n return {\n client_id,\n user_data:\n user_data === undefined\n ? null\n : user_data && typeof user_data === 'object'\n ? (user_data as Record<string, unknown>)\n : null,\n capabilities:\n capabilities && typeof capabilities === 'object'\n ? (capabilities as Partial<ConnectionCapabilities>)\n : null,\n ttl: typeof ttl === 'number' ? ttl : null,\n }\n}\n\n/**\n * Build an approved response for your `serverAuthUrl` webhook.\n *\n * - Without `credentials`: returns `{ allowed: true, client_id, ... }` (option A).\n * - With `credentials`: returns `{ token }` with a pre-signed token (option B).\n */\nexport function createAuthorizedServerAuthResponse(\n options: CreateAuthorizedServerAuthResponseOptions\n): ServerAuthApprovedResponse {\n if (!isValidClientId(options.clientId)) {\n throw new Error('clientId must be 1-128 alphanumeric characters')\n }\n\n const capabilities = normalizeCapabilities(options.capabilities)\n const ttl = resolveTokenTtl(options.ttl)\n\n if (options.credentials) {\n const exp = Math.floor(Date.now() / 1000) + ttl\n return {\n token: buildConnectionToken(options.credentials.appKey, options.credentials.secret, {\n clientId: options.clientId,\n exp,\n capabilities,\n }),\n }\n }\n\n return {\n allowed: true,\n client_id: options.clientId,\n capabilities,\n ttl,\n }\n}\n\n/** Build a denied response for your `serverAuthUrl` webhook. */\nexport function createDeniedServerAuthResponse(reason?: string): ServerAuthDeniedResponse {\n return reason ? { allowed: false, reason } : { allowed: false }\n}\n\n/**\n * Authenticate an incoming `serverAuthUrl` request and return the webhook response\n * body Ark Notify expects.\n */\nexport async function handleServerAuth(\n options: HandleServerAuthOptions\n): Promise<ServerAuthResponse> {\n const decision: ServerAuthDecision = await options.isAuthorized(options.request)\n\n if (decision === false) {\n return createDeniedServerAuthResponse()\n }\n\n const clientId = decision.clientId ?? options.request.client_id\n if (!isValidClientId(clientId)) {\n return createDeniedServerAuthResponse('invalid_client_id')\n }\n\n try {\n return createAuthorizedServerAuthResponse({\n clientId,\n capabilities: decision.capabilities ?? options.request.capabilities ?? undefined,\n ttl: decision.ttl ?? options.request.ttl ?? undefined,\n credentials: options.credentials,\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : 'invalid_request'\n return createDeniedServerAuthResponse(message)\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/server-auth.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { createHmac } from 'node:crypto'\nimport type {\n ConnectionCapabilities,\n CreateAuthorizedServerAuthResponseOptions,\n HandleServerAuthOptions,\n ServerAuthApprovedResponse,\n ServerAuthDeniedResponse,\n ServerAuthRequest,\n ServerAuthResponse,\n ServerAuthDecision,\n} from './types'\n\nconst CLIENT_ID_PATTERN = /^[a-zA-Z0-9_\\-.@\\+]{1,128}$/\nconst DEFAULT_TTL_SECONDS = 3600\nconst MAX_TTL_SECONDS = 86400\n\nconst DEFAULT_CAPABILITIES: ConnectionCapabilities = {\n subscribe: true,\n publish: true,\n presence: true,\n}\n\nexport function isValidClientId(clientId: unknown): clientId is string {\n return typeof clientId === 'string' && CLIENT_ID_PATTERN.test(clientId)\n}\n\nfunction normalizeCapabilities(\n capabilities?: Partial<ConnectionCapabilities> | null\n): ConnectionCapabilities {\n if (!capabilities || typeof capabilities !== 'object') {\n return { ...DEFAULT_CAPABILITIES }\n }\n\n return {\n subscribe: capabilities.subscribe !== false,\n publish: capabilities.publish !== false,\n presence: capabilities.presence !== false,\n }\n}\n\nfunction resolveTokenTtl(ttl?: number | null): number {\n if (ttl === undefined || ttl === null) {\n return DEFAULT_TTL_SECONDS\n }\n\n if (!Number.isInteger(ttl) || ttl <= 0) {\n throw new Error('ttl must be a positive integer (seconds)')\n }\n\n return Math.min(ttl, MAX_TTL_SECONDS)\n}\n\nfunction encodePayload(payload: Record<string, unknown>): string {\n return Buffer.from(JSON.stringify(payload)).toString('base64url')\n}\n\nfunction computeConnectionTokenSignature(\n secret: string,\n appKey: string,\n payloadEncoded: string\n): string {\n return createHmac('sha256', secret).update(`${appKey}.${payloadEncoded}`).digest('hex')\n}\n\n/** Build a signed connection token in Ark Notify format. */\nexport function buildConnectionToken(\n appKey: string,\n secret: string,\n options: {\n clientId: string\n exp: number\n capabilities?: Partial<ConnectionCapabilities>\n }\n): string {\n if (!isValidClientId(options.clientId)) {\n throw new Error('clientId must be 1-128 alphanumeric characters')\n }\n\n const payloadEncoded = encodePayload({\n client_id: options.clientId,\n exp: options.exp,\n capabilities: normalizeCapabilities(options.capabilities),\n })\n\n const signature = computeConnectionTokenSignature(secret, appKey, payloadEncoded)\n return `${appKey}.${payloadEncoded}.${signature}`\n}\n\n/**\n * Parse the JSON body Ark Notify sends to your `serverAuthUrl`.\n * Returns null when the payload is invalid.\n */\nexport function parseServerAuthRequest(body: unknown): ServerAuthRequest | null {\n if (!body || typeof body !== 'object') {\n return null\n }\n\n const record = body as Record<string, unknown>\n const client_id = record.client_id ?? record.clientId\n\n if (!isValidClientId(client_id)) {\n return null\n }\n\n const user_data = record.user_data ?? record.userData\n const capabilities = record.capabilities\n const ttl = record.ttl\n\n return {\n client_id,\n user_data:\n user_data === undefined\n ? null\n : user_data && typeof user_data === 'object'\n ? (user_data as Record<string, unknown>)\n : null,\n capabilities:\n capabilities && typeof capabilities === 'object'\n ? (capabilities as Partial<ConnectionCapabilities>)\n : null,\n ttl: typeof ttl === 'number' ? ttl : null,\n }\n}\n\n/**\n * Build an approved response for your `serverAuthUrl` webhook.\n *\n * - Without `credentials`: returns `{ allowed: true, client_id, ... }` (option A).\n * - With `credentials`: returns `{ token }` with a pre-signed token (option B).\n */\nexport function createAuthorizedServerAuthResponse(\n options: CreateAuthorizedServerAuthResponseOptions\n): ServerAuthApprovedResponse {\n if (!isValidClientId(options.clientId)) {\n throw new Error('clientId must be 1-128 alphanumeric characters')\n }\n\n const capabilities = normalizeCapabilities(options.capabilities)\n const ttl = resolveTokenTtl(options.ttl)\n\n if (options.credentials) {\n const exp = Math.floor(Date.now() / 1000) + ttl\n return {\n token: buildConnectionToken(options.credentials.appKey, options.credentials.secret, {\n clientId: options.clientId,\n exp,\n capabilities,\n }),\n }\n }\n\n return {\n allowed: true,\n client_id: options.clientId,\n capabilities,\n ttl,\n }\n}\n\n/** Build a denied response for your `serverAuthUrl` webhook. */\nexport function createDeniedServerAuthResponse(reason?: string): ServerAuthDeniedResponse {\n return reason ? { allowed: false, reason } : { allowed: false }\n}\n\n/**\n * Authenticate an incoming `serverAuthUrl` request and return the webhook response\n * body Ark Notify expects.\n */\nexport async function handleServerAuth(\n options: HandleServerAuthOptions\n): Promise<ServerAuthResponse> {\n const decision: ServerAuthDecision = await options.isAuthorized(options.request)\n\n if (decision === false) {\n return createDeniedServerAuthResponse()\n }\n\n const clientId = decision.clientId ?? options.request.client_id\n if (!isValidClientId(clientId)) {\n return createDeniedServerAuthResponse('invalid_client_id')\n }\n\n try {\n return createAuthorizedServerAuthResponse({\n clientId,\n capabilities: decision.capabilities ?? options.request.capabilities ?? undefined,\n ttl: decision.ttl ?? options.request.ttl ?? undefined,\n credentials: options.credentials,\n })\n } catch (err) {\n const message = err instanceof Error ? err.message : 'invalid_request'\n return createDeniedServerAuthResponse(message)\n }\n}\n"]}
@@ -119,7 +119,7 @@ declare class ArkNotifySSE {
119
119
  private readonly config;
120
120
  private es;
121
121
  private connectionId;
122
- private listeners;
122
+ private readonly listeners;
123
123
  private readonly EventSourceCtor;
124
124
  constructor(config: ArkNotifySSEConfig);
125
125
  getConnectionId(): string | null;
@@ -140,7 +140,9 @@ declare class ArkNotifyError extends Error {
140
140
  constructor(status: number, body: ApiError);
141
141
  }
142
142
  declare function toWebSocketUrl(baseUrl: string, path: string): string;
143
+ /** Append query params without URLSearchParams (unsupported in React Native). */
144
+ declare function appendQueryParams(url: string, params: Record<string, string | undefined | null | false>): string;
143
145
  declare function resolveValue<T>(value: T | (() => T)): T;
144
146
  declare function isPrivateChannel(channel: string): boolean;
145
147
 
146
- export { ArkNotifyClient as A, DEFAULT_BASE_URL as D, ArkNotifyConnection as a, ArkNotifyError as b, type ArkNotifyGlobalConfig as c, ArkNotifySSE as d, configureArkNotify as e, resolveValue as f, isPrivateChannel as i, resolveBaseUrl as r, toWebSocketUrl as t };
148
+ export { ArkNotifyClient as A, DEFAULT_BASE_URL as D, ArkNotifyConnection as a, ArkNotifyError as b, type ArkNotifyGlobalConfig as c, ArkNotifySSE as d, appendQueryParams as e, configureArkNotify as f, resolveValue as g, isPrivateChannel as i, resolveBaseUrl as r, toWebSocketUrl as t };
@@ -119,7 +119,7 @@ declare class ArkNotifySSE {
119
119
  private readonly config;
120
120
  private es;
121
121
  private connectionId;
122
- private listeners;
122
+ private readonly listeners;
123
123
  private readonly EventSourceCtor;
124
124
  constructor(config: ArkNotifySSEConfig);
125
125
  getConnectionId(): string | null;
@@ -140,7 +140,9 @@ declare class ArkNotifyError extends Error {
140
140
  constructor(status: number, body: ApiError);
141
141
  }
142
142
  declare function toWebSocketUrl(baseUrl: string, path: string): string;
143
+ /** Append query params without URLSearchParams (unsupported in React Native). */
144
+ declare function appendQueryParams(url: string, params: Record<string, string | undefined | null | false>): string;
143
145
  declare function resolveValue<T>(value: T | (() => T)): T;
144
146
  declare function isPrivateChannel(channel: string): boolean;
145
147
 
146
- export { ArkNotifyClient as A, DEFAULT_BASE_URL as D, ArkNotifyConnection as a, ArkNotifyError as b, type ArkNotifyGlobalConfig as c, ArkNotifySSE as d, configureArkNotify as e, resolveValue as f, isPrivateChannel as i, resolveBaseUrl as r, toWebSocketUrl as t };
148
+ export { ArkNotifyClient as A, DEFAULT_BASE_URL as D, ArkNotifyConnection as a, ArkNotifyError as b, type ArkNotifyGlobalConfig as c, ArkNotifySSE as d, appendQueryParams as e, configureArkNotify as f, resolveValue as g, isPrivateChannel as i, resolveBaseUrl as r, toWebSocketUrl as t };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@emmanuel-nike/ark-notify-js",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "JavaScript SDK for Ark Notify — real-time pub/sub, presence, and platform management",
5
5
  "license": "MIT",
6
6
  "type": "module",