@emmanuel-nike/ark-notify-js 0.1.0
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.
- package/LICENSE +21 -0
- package/README.md +295 -0
- package/dist/index.cjs +564 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +16 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +552 -0
- package/dist/index.js.map +1 -0
- package/dist/react/index.cjs +963 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +109 -0
- package/dist/react/index.d.ts +109 -0
- package/dist/react/index.js +951 -0
- package/dist/react/index.js.map +1 -0
- package/dist/utils-Cw2SnD6p.d.cts +407 -0
- package/dist/utils-Cw2SnD6p.d.ts +407 -0
- package/package.json +120 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/config.ts","../../src/utils.ts","../../src/client.ts","../../src/connection-token.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","../../src/react/useAdminChannels.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 url = new URL(path, baseUrl)\n url.protocol = url.protocol === 'https:' ? 'wss:' : 'ws:'\n return url.toString()\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 { ArkNotifyError } from './utils'\nimport type {\n AdminChannelsResponse,\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'\nimport { resolveValue } from './utils'\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: 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(\n id: string,\n input: UpdateApplicationInput\n ): 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 // ── System admin ────────────────────────────────────────────────────────\n\n adminChannels(): Promise<AdminChannelsResponse> {\n return this.request('/api/v1/admin/channels')\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 credentials: AppCredentials,\n input: ConnectionTokenInput\n ): Promise<ConnectionTokenResponse> {\n return this.request(`/api/v1/apps/${appKey}/connection-token`, {\n method: 'POST',\n body: input,\n credentials,\n })\n }\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 credentials: AppCredentials\n fetch?: typeof fetch\n}\n\n/**\n * Request a signed connection token from the Ark Notify API.\n * Requires app credentials — use from your backend, not in browser code.\n */\nexport async function fetchConnectionToken(\n options: FetchConnectionTokenOptions\n): Promise<ConnectionTokenResponse> {\n const {\n baseUrl,\n appKey,\n credentials,\n fetch: fetchFn = globalThis.fetch.bind(globalThis),\n client_id,\n clientId,\n user_data,\n userData,\n ttl,\n capabilities,\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 const body: ConnectionTokenInput = {\n client_id: resolvedClientId,\n user_data: user_data ?? userData,\n ttl,\n capabilities,\n serverAuthUrl,\n }\n\n const url = `${resolveBaseUrl(baseUrl)}/api/v1/apps/${appKey}/connection-token`\n const response = await fetchFn(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-App-Key': credentials.appKey,\n 'X-App-Secret': credentials.secret,\n },\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 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 subscribedChannels = new Set<string>()\n private pendingSubscriptions = new Map<string, SubscribeOptions>()\n private 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 as EventMap[EventName])\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 as EventMap[EventName])\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(\n toWebSocketUrl(this.config.baseUrl, `/app/${this.config.appKey}`)\n )\n\n let token = resolveValue(this.config.token)\n if (!token && this.config.clientId && this.config.credentials) {\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.user_data,\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 extends ArkNotifyClientConfig {\n children: ReactNode\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: resolvedBaseUrl, 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","import { useCallback, useEffect, useState } from 'react'\nimport type { AdminChannelsResponse } from '../types'\nimport { ArkNotifyError } from '../utils'\nimport { useArkNotify } from './useArkNotify'\n\nexport function useAdminChannels() {\n const { client } = useArkNotify()\n const [data, setData] = useState<AdminChannelsResponse | null>(null)\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 result = await client.adminChannels()\n setData(result)\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 return { data, loading, error, refresh }\n}\n"]}
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
declare const DEFAULT_BASE_URL = "https://ark-notify-933303906015.europe-north1.run.app";
|
|
2
|
+
interface ArkNotifyGlobalConfig {
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
}
|
|
5
|
+
/** Set the default base URL once at application startup. */
|
|
6
|
+
declare function configureArkNotify(config: ArkNotifyGlobalConfig): void;
|
|
7
|
+
declare function resolveBaseUrl(baseUrl?: string): string;
|
|
8
|
+
|
|
9
|
+
type UserRole = 'SYSTEM_ADMIN' | 'ACCOUNT_ADMIN' | 'ACCOUNT_USER';
|
|
10
|
+
interface User {
|
|
11
|
+
id: string;
|
|
12
|
+
email: string;
|
|
13
|
+
firstName: string;
|
|
14
|
+
lastName: string;
|
|
15
|
+
role: UserRole;
|
|
16
|
+
createdAt: string;
|
|
17
|
+
}
|
|
18
|
+
interface ApiError {
|
|
19
|
+
error: string;
|
|
20
|
+
message: string;
|
|
21
|
+
reason?: string;
|
|
22
|
+
retryAfterSec?: number;
|
|
23
|
+
}
|
|
24
|
+
interface ConnectionCapabilities {
|
|
25
|
+
subscribe: boolean;
|
|
26
|
+
publish: boolean;
|
|
27
|
+
presence: boolean;
|
|
28
|
+
}
|
|
29
|
+
interface Application {
|
|
30
|
+
id: string;
|
|
31
|
+
name: string;
|
|
32
|
+
appKey: string;
|
|
33
|
+
tenantId: string;
|
|
34
|
+
authWebhookUrl: string | null;
|
|
35
|
+
requireClientAuth: boolean;
|
|
36
|
+
serverAuthUrl: string | null;
|
|
37
|
+
messageHistorySize: number;
|
|
38
|
+
createdAt: string;
|
|
39
|
+
updatedAt: string;
|
|
40
|
+
secret?: string;
|
|
41
|
+
}
|
|
42
|
+
interface CreateApplicationInput {
|
|
43
|
+
name: string;
|
|
44
|
+
authWebhookUrl?: string | null;
|
|
45
|
+
requireClientAuth?: boolean;
|
|
46
|
+
serverAuthUrl?: string | null;
|
|
47
|
+
messageHistorySize?: number;
|
|
48
|
+
}
|
|
49
|
+
interface UpdateApplicationInput {
|
|
50
|
+
name?: string;
|
|
51
|
+
authWebhookUrl?: string | null;
|
|
52
|
+
requireClientAuth?: boolean;
|
|
53
|
+
serverAuthUrl?: string | null;
|
|
54
|
+
messageHistorySize?: number;
|
|
55
|
+
}
|
|
56
|
+
interface LoginInput {
|
|
57
|
+
email: string;
|
|
58
|
+
password: string;
|
|
59
|
+
}
|
|
60
|
+
interface AuthResponse {
|
|
61
|
+
user: User;
|
|
62
|
+
token: string;
|
|
63
|
+
}
|
|
64
|
+
interface PublishEventInput {
|
|
65
|
+
channel: string;
|
|
66
|
+
event: string;
|
|
67
|
+
data?: unknown;
|
|
68
|
+
}
|
|
69
|
+
interface PublishEventResponse {
|
|
70
|
+
published: boolean;
|
|
71
|
+
channel: string;
|
|
72
|
+
event: string;
|
|
73
|
+
}
|
|
74
|
+
interface ChannelAuthInput {
|
|
75
|
+
socket_id?: string;
|
|
76
|
+
connection_id?: string;
|
|
77
|
+
channel_name: string;
|
|
78
|
+
user_data?: Record<string, unknown>;
|
|
79
|
+
}
|
|
80
|
+
interface ChannelAuthResponse {
|
|
81
|
+
auth: string;
|
|
82
|
+
}
|
|
83
|
+
interface ConnectionTokenInput {
|
|
84
|
+
client_id?: string;
|
|
85
|
+
clientId?: string;
|
|
86
|
+
user_data?: Record<string, unknown>;
|
|
87
|
+
userData?: Record<string, unknown>;
|
|
88
|
+
serverAuthUrl?: string | null;
|
|
89
|
+
server_auth_url?: string | null;
|
|
90
|
+
ttl?: number;
|
|
91
|
+
capabilities?: Partial<ConnectionCapabilities>;
|
|
92
|
+
}
|
|
93
|
+
interface ConnectionTokenResponse {
|
|
94
|
+
token: string;
|
|
95
|
+
client_id: string;
|
|
96
|
+
expires_at: number;
|
|
97
|
+
capabilities: ConnectionCapabilities;
|
|
98
|
+
}
|
|
99
|
+
interface PresenceMember {
|
|
100
|
+
connectionId: string;
|
|
101
|
+
clientId: string;
|
|
102
|
+
data: Record<string, unknown>;
|
|
103
|
+
updatedAt: number;
|
|
104
|
+
}
|
|
105
|
+
interface AdminConnection {
|
|
106
|
+
connectionId: string;
|
|
107
|
+
clientId: string;
|
|
108
|
+
transport: 'websocket' | 'sse';
|
|
109
|
+
authenticated: boolean;
|
|
110
|
+
connectedAt: number;
|
|
111
|
+
}
|
|
112
|
+
interface AdminChannel {
|
|
113
|
+
tenantId: string;
|
|
114
|
+
channel: string;
|
|
115
|
+
applicationId: string;
|
|
116
|
+
applicationName: string;
|
|
117
|
+
appKey: string;
|
|
118
|
+
subscriberCount: number;
|
|
119
|
+
presenceMemberCount: number;
|
|
120
|
+
presenceMembers: PresenceMember[];
|
|
121
|
+
connections: AdminConnection[];
|
|
122
|
+
analytics: {
|
|
123
|
+
eventsByType: Record<string, number>;
|
|
124
|
+
totalEvents: number;
|
|
125
|
+
lastEventAt: string | null;
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
interface AdminChannelsResponse {
|
|
129
|
+
generatedAt: string;
|
|
130
|
+
summary: {
|
|
131
|
+
totalApplications: number;
|
|
132
|
+
totalChannels: number;
|
|
133
|
+
totalConnections: number;
|
|
134
|
+
totalPresenceMembers: number;
|
|
135
|
+
totalSubscribers: number;
|
|
136
|
+
totalAnalyticsEvents: number;
|
|
137
|
+
};
|
|
138
|
+
channels: AdminChannel[];
|
|
139
|
+
connections: AdminConnection[];
|
|
140
|
+
analytics: {
|
|
141
|
+
eventsByType: Array<{
|
|
142
|
+
eventType: string;
|
|
143
|
+
eventCount: number;
|
|
144
|
+
}>;
|
|
145
|
+
recentEvents: unknown[];
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
type ConnectionState = 'disconnected' | 'connecting' | 'connected' | 'reconnecting' | 'failed';
|
|
149
|
+
interface ConnectedMessage {
|
|
150
|
+
type: 'connected';
|
|
151
|
+
connection_id: string;
|
|
152
|
+
client_id: string;
|
|
153
|
+
app_key: string;
|
|
154
|
+
authenticated: boolean;
|
|
155
|
+
channels?: string[];
|
|
156
|
+
}
|
|
157
|
+
interface EventMessage {
|
|
158
|
+
type: 'event';
|
|
159
|
+
channel: string;
|
|
160
|
+
event: string;
|
|
161
|
+
data: unknown;
|
|
162
|
+
clientId: string | null;
|
|
163
|
+
timestamp: number;
|
|
164
|
+
}
|
|
165
|
+
interface PresenceMemberInfo {
|
|
166
|
+
connectionId: string;
|
|
167
|
+
clientId: string;
|
|
168
|
+
data: Record<string, unknown>;
|
|
169
|
+
updatedAt: number;
|
|
170
|
+
}
|
|
171
|
+
type PresenceAction = 'enter' | 'leave' | 'update' | 'sync';
|
|
172
|
+
interface PresenceMessage {
|
|
173
|
+
type: 'presence';
|
|
174
|
+
channel: string;
|
|
175
|
+
action: PresenceAction;
|
|
176
|
+
member: PresenceMemberInfo | null;
|
|
177
|
+
members: PresenceMemberInfo[] | null;
|
|
178
|
+
timestamp: number;
|
|
179
|
+
}
|
|
180
|
+
interface SubscribedMessage {
|
|
181
|
+
type: 'subscribed';
|
|
182
|
+
channel: string;
|
|
183
|
+
}
|
|
184
|
+
interface UnsubscribedMessage {
|
|
185
|
+
type: 'unsubscribed';
|
|
186
|
+
channel: string;
|
|
187
|
+
}
|
|
188
|
+
interface PublishedMessage {
|
|
189
|
+
type: 'published';
|
|
190
|
+
channel: string;
|
|
191
|
+
event: string;
|
|
192
|
+
}
|
|
193
|
+
interface PongMessage {
|
|
194
|
+
type: 'pong';
|
|
195
|
+
timestamp: number;
|
|
196
|
+
}
|
|
197
|
+
interface PingMessage {
|
|
198
|
+
type: 'ping';
|
|
199
|
+
}
|
|
200
|
+
interface ServerErrorMessage {
|
|
201
|
+
type: 'error';
|
|
202
|
+
code: string;
|
|
203
|
+
message: string;
|
|
204
|
+
}
|
|
205
|
+
interface PresenceUpdatedMessage {
|
|
206
|
+
type: 'presence_updated';
|
|
207
|
+
channel: string;
|
|
208
|
+
data: Record<string, unknown>;
|
|
209
|
+
}
|
|
210
|
+
interface PresenceLeftMessage {
|
|
211
|
+
type: 'presence_left';
|
|
212
|
+
channel: string;
|
|
213
|
+
}
|
|
214
|
+
type ServerMessage = ConnectedMessage | EventMessage | PresenceMessage | SubscribedMessage | UnsubscribedMessage | PublishedMessage | PongMessage | PingMessage | ServerErrorMessage | PresenceUpdatedMessage | PresenceLeftMessage;
|
|
215
|
+
interface ArkNotifyClientConfig {
|
|
216
|
+
baseUrl?: string;
|
|
217
|
+
token?: string | (() => string | null | undefined);
|
|
218
|
+
fetch?: typeof fetch;
|
|
219
|
+
}
|
|
220
|
+
interface AppCredentials {
|
|
221
|
+
appKey: string;
|
|
222
|
+
secret: string;
|
|
223
|
+
}
|
|
224
|
+
type PrivateChannelAuthHandler = (channel: string, connectionId: string) => Promise<string>;
|
|
225
|
+
interface ArkNotifyConnectionConfig {
|
|
226
|
+
baseUrl?: string;
|
|
227
|
+
appKey: string;
|
|
228
|
+
clientId?: string;
|
|
229
|
+
/** Signed connection token, or a resolver. Omit to auto-fetch when `credentials` and `clientId` are set. */
|
|
230
|
+
token?: string | (() => string | null | undefined);
|
|
231
|
+
/** App credentials for auto-fetching a connection token (server-side only — never in browser code). */
|
|
232
|
+
credentials?: AppCredentials;
|
|
233
|
+
/** Forwarded to the connection-token endpoint when auto-fetching a token. */
|
|
234
|
+
user_data?: Record<string, unknown>;
|
|
235
|
+
autoReconnect?: boolean;
|
|
236
|
+
reconnectDelayMs?: number;
|
|
237
|
+
maxReconnectDelayMs?: number;
|
|
238
|
+
onPrivateChannelAuth?: PrivateChannelAuthHandler;
|
|
239
|
+
fetch?: typeof fetch;
|
|
240
|
+
WebSocket?: typeof WebSocket;
|
|
241
|
+
}
|
|
242
|
+
interface SubscribeOptions {
|
|
243
|
+
history?: boolean;
|
|
244
|
+
presence?: boolean;
|
|
245
|
+
presence_data?: Record<string, unknown>;
|
|
246
|
+
auth?: string;
|
|
247
|
+
}
|
|
248
|
+
interface ArkNotifySSEConfig {
|
|
249
|
+
baseUrl?: string;
|
|
250
|
+
appKey: string;
|
|
251
|
+
channels: string[];
|
|
252
|
+
clientId?: string;
|
|
253
|
+
token?: string | (() => string | null | undefined);
|
|
254
|
+
auth?: Record<string, string>;
|
|
255
|
+
user_data?: Record<string, unknown>;
|
|
256
|
+
history?: boolean;
|
|
257
|
+
onPrivateChannelAuth?: PrivateChannelAuthHandler;
|
|
258
|
+
EventSource?: typeof EventSource;
|
|
259
|
+
}
|
|
260
|
+
interface ChannelEventHandler<T = unknown> {
|
|
261
|
+
(data: T, message: EventMessage): void;
|
|
262
|
+
}
|
|
263
|
+
interface ChannelHandlers {
|
|
264
|
+
[eventName: string]: ChannelEventHandler;
|
|
265
|
+
}
|
|
266
|
+
interface HealthResponse {
|
|
267
|
+
status: string;
|
|
268
|
+
uptime: number;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
declare class ArkNotifyClient {
|
|
272
|
+
private readonly baseUrl;
|
|
273
|
+
private readonly fetchFn;
|
|
274
|
+
private token?;
|
|
275
|
+
constructor(config: ArkNotifyClientConfig);
|
|
276
|
+
setToken(token: string | null): void;
|
|
277
|
+
private getAuthHeader;
|
|
278
|
+
private request;
|
|
279
|
+
health(): Promise<HealthResponse>;
|
|
280
|
+
login(input: LoginInput): Promise<AuthResponse>;
|
|
281
|
+
me(): Promise<{
|
|
282
|
+
user: User;
|
|
283
|
+
}>;
|
|
284
|
+
listApplications(): Promise<{
|
|
285
|
+
apps: Application[];
|
|
286
|
+
}>;
|
|
287
|
+
createApplication(input: CreateApplicationInput): Promise<{
|
|
288
|
+
app: Application;
|
|
289
|
+
}>;
|
|
290
|
+
getApplication(id: string): Promise<{
|
|
291
|
+
app: Application;
|
|
292
|
+
}>;
|
|
293
|
+
updateApplication(id: string, input: UpdateApplicationInput): Promise<{
|
|
294
|
+
app: Application;
|
|
295
|
+
}>;
|
|
296
|
+
deleteApplication(id: string): Promise<{
|
|
297
|
+
deleted: boolean;
|
|
298
|
+
id: string;
|
|
299
|
+
}>;
|
|
300
|
+
regenerateSecret(id: string): Promise<{
|
|
301
|
+
app: Application;
|
|
302
|
+
}>;
|
|
303
|
+
adminChannels(): Promise<AdminChannelsResponse>;
|
|
304
|
+
publishEvent(appKey: string, credentials: AppCredentials, input: PublishEventInput): Promise<PublishEventResponse>;
|
|
305
|
+
authorizeChannel(appKey: string, credentials: AppCredentials, input: ChannelAuthInput): Promise<ChannelAuthResponse>;
|
|
306
|
+
issueConnectionToken(appKey: string, credentials: AppCredentials, input: ConnectionTokenInput): Promise<ConnectionTokenResponse>;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
type EventMap = {
|
|
310
|
+
state: (state: ConnectionState) => void;
|
|
311
|
+
connected: (message: ConnectedMessage) => void;
|
|
312
|
+
event: (message: EventMessage) => void;
|
|
313
|
+
presence: (message: PresenceMessage) => void;
|
|
314
|
+
message: (message: ServerMessage) => void;
|
|
315
|
+
error: (error: {
|
|
316
|
+
code: string;
|
|
317
|
+
message: string;
|
|
318
|
+
}) => void;
|
|
319
|
+
close: (event: {
|
|
320
|
+
code: number;
|
|
321
|
+
reason: string;
|
|
322
|
+
}) => void;
|
|
323
|
+
};
|
|
324
|
+
type EventName = keyof EventMap;
|
|
325
|
+
declare class ArkNotifyConnection {
|
|
326
|
+
private readonly config;
|
|
327
|
+
private ws;
|
|
328
|
+
private state;
|
|
329
|
+
private connectionId;
|
|
330
|
+
private clientId;
|
|
331
|
+
private authenticated;
|
|
332
|
+
private subscribedChannels;
|
|
333
|
+
private pendingSubscriptions;
|
|
334
|
+
private listeners;
|
|
335
|
+
private reconnectAttempt;
|
|
336
|
+
private reconnectTimer;
|
|
337
|
+
private intentionalClose;
|
|
338
|
+
private connectPromise;
|
|
339
|
+
private readonly WebSocketCtor;
|
|
340
|
+
constructor(config: ArkNotifyConnectionConfig);
|
|
341
|
+
getConnectionState(): ConnectionState;
|
|
342
|
+
getConnectionId(): string | null;
|
|
343
|
+
getClientId(): string | null;
|
|
344
|
+
isAuthenticated(): boolean;
|
|
345
|
+
getSubscribedChannels(): string[];
|
|
346
|
+
on<E extends EventName>(event: E, handler: EventMap[E]): () => void;
|
|
347
|
+
off<E extends EventName>(event: E, handler: EventMap[E]): void;
|
|
348
|
+
private emit;
|
|
349
|
+
private setState;
|
|
350
|
+
connect(): Promise<void>;
|
|
351
|
+
private doConnect;
|
|
352
|
+
disconnect(): void;
|
|
353
|
+
private scheduleReconnect;
|
|
354
|
+
private clearReconnectTimer;
|
|
355
|
+
private send;
|
|
356
|
+
private handleMessage;
|
|
357
|
+
private resubscribeAll;
|
|
358
|
+
subscribe(channel: string, options?: SubscribeOptions): Promise<void>;
|
|
359
|
+
unsubscribe(channel: string): void;
|
|
360
|
+
publish(channel: string, event: string, data?: unknown): void;
|
|
361
|
+
presenceEnter(channel: string, data: Record<string, unknown>): void;
|
|
362
|
+
presenceUpdate(channel: string, data: Record<string, unknown>): void;
|
|
363
|
+
presenceLeave(channel: string): void;
|
|
364
|
+
presenceSync(channel: string): void;
|
|
365
|
+
ping(): void;
|
|
366
|
+
bind(channel: string, event: string, handler: ChannelEventHandler): () => void;
|
|
367
|
+
bindAll(channel: string, handler: ChannelEventHandler): () => void;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
type SSEEventMap = {
|
|
371
|
+
connected: (message: ConnectedMessage) => void;
|
|
372
|
+
event: (message: EventMessage) => void;
|
|
373
|
+
presence: (message: PresenceMessage) => void;
|
|
374
|
+
message: (message: ServerMessage) => void;
|
|
375
|
+
error: (error: Error) => void;
|
|
376
|
+
close: () => void;
|
|
377
|
+
};
|
|
378
|
+
type SSEEventName = keyof SSEEventMap;
|
|
379
|
+
declare class ArkNotifySSE {
|
|
380
|
+
private readonly config;
|
|
381
|
+
private es;
|
|
382
|
+
private connectionId;
|
|
383
|
+
private listeners;
|
|
384
|
+
private readonly EventSourceCtor;
|
|
385
|
+
constructor(config: ArkNotifySSEConfig);
|
|
386
|
+
getConnectionId(): string | null;
|
|
387
|
+
on<E extends SSEEventName>(event: E, handler: SSEEventMap[E]): () => void;
|
|
388
|
+
off<E extends SSEEventName>(event: E, handler: SSEEventMap[E]): void;
|
|
389
|
+
private emit;
|
|
390
|
+
connect(): Promise<void>;
|
|
391
|
+
disconnect(): void;
|
|
392
|
+
bind(channel: string, event: string, handler: (data: unknown, message: EventMessage) => void): () => void;
|
|
393
|
+
bindAll(channel: string, handler: (data: unknown, message: EventMessage) => void): () => void;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
declare class ArkNotifyError extends Error {
|
|
397
|
+
readonly status: number;
|
|
398
|
+
readonly code: string;
|
|
399
|
+
readonly retryAfterSec?: number;
|
|
400
|
+
readonly reason?: string;
|
|
401
|
+
constructor(status: number, body: ApiError);
|
|
402
|
+
}
|
|
403
|
+
declare function toWebSocketUrl(baseUrl: string, path: string): string;
|
|
404
|
+
declare function resolveValue<T>(value: T | (() => T)): T;
|
|
405
|
+
declare function isPrivateChannel(channel: string): boolean;
|
|
406
|
+
|
|
407
|
+
export { toWebSocketUrl as $, type AppCredentials as A, type PresenceMember as B, type ConnectionTokenInput as C, DEFAULT_BASE_URL as D, type EventMessage as E, type PresenceMemberInfo as F, type PresenceMessage as G, type HealthResponse as H, type PresenceUpdatedMessage as I, type PrivateChannelAuthHandler as J, type PublishEventInput as K, type LoginInput as L, type PublishEventResponse as M, type PublishedMessage as N, type ServerMessage as O, type PingMessage as P, type SubscribeOptions as Q, type SubscribedMessage as R, type ServerErrorMessage as S, type UpdateApplicationInput as T, type UnsubscribedMessage as U, type User as V, type UserRole as W, configureArkNotify as X, isPrivateChannel as Y, resolveBaseUrl as Z, resolveValue as _, type ConnectionTokenResponse as a, type AdminChannel as b, type AdminChannelsResponse as c, type AdminConnection as d, type ApiError as e, type Application as f, ArkNotifyClient as g, type ArkNotifyClientConfig as h, ArkNotifyConnection as i, type ArkNotifyConnectionConfig as j, ArkNotifyError as k, type ArkNotifyGlobalConfig as l, ArkNotifySSE as m, type ArkNotifySSEConfig as n, type AuthResponse as o, type ChannelAuthInput as p, type ChannelAuthResponse as q, type ChannelEventHandler as r, type ChannelHandlers as s, type ConnectedMessage as t, type ConnectionCapabilities as u, type ConnectionState as v, type CreateApplicationInput as w, type PongMessage as x, type PresenceAction as y, type PresenceLeftMessage as z };
|