@jokkoo/sdk-web 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/debug.ts","../src/api/client.ts","../src/api/types.ts","../src/realtime/realtime-events.ts","../src/realtime/realtime-client.ts","../src/core/config.ts","../src/core/jwt.ts","../src/core/token-manager.ts","../src/core/jokkoo.ts","../src/types/chat-message.ts","../src/i18n/en.ts","../src/i18n/fr.ts","../src/i18n/index.ts","../src/lib/satisfaction.ts","../src/lib/activity.ts","../src/lib/attachment-media.ts","../src/lib/closed-conversation-policy.ts","../src/lib/constants.ts","../src/lib/conversation-display.ts","../src/lib/file-upload.ts","../src/lib/format.ts","../src/lib/message-mapper.ts","../src/lib/message-pagination.ts","../src/lib/realtime-mappers.ts","../src/lib/voice-recording.ts","../src/lib/voice-upload.ts"],"names":["page"],"mappings":"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","file":"index.mjs","sourcesContent":["const LOG_PREFIX = \"[Jokkoo]\"\n\nexport interface DebugLogger {\n log: (message: string, ...details: unknown[]) => void\n warn: (message: string, ...details: unknown[]) => void\n error: (message: string, ...details: unknown[]) => void\n request: (method: string, url: string, details?: Record<string, unknown>) => void\n response: (\n method: string,\n url: string,\n status: number,\n durationMs: number,\n details?: Record<string, unknown>\n ) => void\n requestError: (\n method: string,\n url: string,\n durationMs: number,\n error: unknown\n ) => void\n}\n\nfunction noop(): void {}\n\nfunction createNoopLogger(): DebugLogger {\n return {\n log: noop,\n warn: noop,\n error: noop,\n request: noop,\n response: noop,\n requestError: noop,\n }\n}\n\nexport function createDebugLogger(enabled: boolean): DebugLogger {\n if (!enabled) {\n return createNoopLogger()\n }\n\n return {\n log(message, ...details) {\n if (details.length > 0) {\n console.log(`${LOG_PREFIX} ${message}`, ...details)\n return\n }\n\n console.log(`${LOG_PREFIX} ${message}`)\n },\n warn(message, ...details) {\n if (details.length > 0) {\n console.warn(`${LOG_PREFIX} ${message}`, ...details)\n return\n }\n\n console.warn(`${LOG_PREFIX} ${message}`)\n },\n error(message, ...details) {\n if (details.length > 0) {\n console.error(`${LOG_PREFIX} ${message}`, ...details)\n return\n }\n\n console.error(`${LOG_PREFIX} ${message}`)\n },\n request(method, url, details) {\n if (details) {\n console.log(`${LOG_PREFIX} → ${method} ${url}`, details)\n return\n }\n\n console.log(`${LOG_PREFIX} → ${method} ${url}`)\n },\n response(method, url, status, durationMs, details) {\n const summary = `${LOG_PREFIX} ← ${method} ${url} ${status} (${durationMs}ms)`\n if (details) {\n console.log(summary, details)\n return\n }\n\n console.log(summary)\n },\n requestError(method, url, durationMs, error) {\n console.error(`${LOG_PREFIX} ✕ ${method} ${url} (${durationMs}ms)`, error)\n },\n }\n}\n\nexport function redactToken(token: string): string {\n if (token.length < 9) {\n return \"***\"\n }\n\n return `${token.slice(0, 4)}…${token.slice(-4)}`\n}\n","import { createDebugLogger, redactToken } from \"../core/debug\"\nimport type { TokenManager } from \"../core/token-manager\"\nimport type { ResolvedJokkooConfig } from \"../types\"\nimport type {\n Conversation,\n Message,\n PaginatedResponse,\n SendMessagePayload,\n UnreadCountResponse,\n ClosedConversationPolicy,\n} from \"./types\"\n\nexport const CLIENT_TOKEN_HEADER = \"x-client-token\"\nexport const USER_TOKEN_HEADER = \"x-user-token\"\n\nexport class JokkooApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly body?: unknown\n ) {\n super(message)\n this.name = \"JokkooApiError\"\n }\n}\n\nexport class JokkooApiClient {\n private readonly debug: ReturnType<typeof createDebugLogger>\n\n constructor(\n private readonly config: ResolvedJokkooConfig,\n private readonly tokenManager: TokenManager\n ) {\n this.debug = createDebugLogger(config.debug)\n }\n\n resolveUrl(path: string): string {\n if (path.startsWith(\"http://\") || path.startsWith(\"https://\")) {\n return path\n }\n return `${this.config.baseUrl}${path}`\n }\n\n async getConversations(\n limit: number,\n offset: number\n ): Promise<PaginatedResponse<Conversation>> {\n return this.request<PaginatedResponse<Conversation>>(\n \"GET\",\n `/api/conversations?limit=${limit}&offset=${offset}`\n )\n }\n\n async getUnreadCount(): Promise<UnreadCountResponse> {\n return this.request<UnreadCountResponse>(\"GET\", \"/api/conversations/unread-count\")\n }\n\n async markAsRead(conversationId: number): Promise<void> {\n await this.request<void>(\"POST\", `/api/conversations/${conversationId}/read`)\n }\n\n async getMessages(\n conversationId: number,\n limit: number,\n offset: number\n ): Promise<PaginatedResponse<Message>> {\n return this.request<PaginatedResponse<Message>>(\n \"GET\",\n `/api/conversations/${conversationId}/messages?limit=${limit}&offset=${offset}`\n )\n }\n\n async sendMessage(payload: SendMessagePayload): Promise<Message> {\n return this.request<Message>(\"POST\", \"/api/conversations/messages\", {\n body: JSON.stringify(payload),\n })\n }\n\n async requestUploadUrl(fileName: string, mimeType: string, provider: \"s3\" | \"r2\" = \"s3\") {\n return this.request<{ fileId: string; uploadUrl: string; expiresAt: string }>(\n \"POST\",\n \"/api/storage/sdk/upload-url\",\n {\n body: JSON.stringify({ provider, fileName, mimeType }),\n }\n )\n }\n\n async confirmUpload(fileId: string) {\n return this.request<{ id: string; fileName: string; mimeType: string; size?: number | null }>(\n \"POST\",\n `/api/storage/sdk/confirm/${fileId}`\n )\n }\n\n async getDownloadUrl(fileId: string) {\n return this.request<{ downloadUrl: string; expiresAt: string }>(\n \"GET\",\n `/api/storage/sdk/download-url/${fileId}`\n )\n }\n\n async getConversationPolicies(): Promise<ClosedConversationPolicy> {\n return this.request<ClosedConversationPolicy>(\"GET\", \"/api/conversations/policies\")\n }\n\n async recordSatisfaction(conversationId: number, score: number): Promise<void> {\n await this.request<void>(\"POST\", `/api/conversations/${conversationId}/satisfaction`, {\n body: JSON.stringify({ score }),\n })\n }\n\n private async request<T>(\n method: string,\n path: string,\n init?: RequestInit,\n isRetry = false\n ): Promise<T> {\n const userToken = await this.tokenManager.getToken()\n const url = `${this.config.baseUrl}${path}`\n const httpMethod = init?.method ?? method\n const startedAt = Date.now()\n\n let requestBody: unknown\n if (init?.body && typeof init.body === \"string\") {\n try {\n requestBody = JSON.parse(init.body) as unknown\n } catch {\n requestBody = init.body\n }\n }\n\n this.debug.request(httpMethod, url, {\n clientToken: redactToken(this.config.clientToken),\n userToken: redactToken(userToken),\n body: requestBody,\n })\n\n try {\n const response = await fetch(url, {\n ...init,\n method: httpMethod,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n [CLIENT_TOKEN_HEADER]: this.config.clientToken,\n [USER_TOKEN_HEADER]: userToken,\n ...init?.headers,\n },\n })\n\n const durationMs = Date.now() - startedAt\n\n if (!response.ok) {\n let body: unknown\n try {\n body = await response.json()\n } catch {\n body = undefined\n }\n\n const message =\n typeof body === \"object\" &&\n body !== null &&\n \"message\" in body &&\n typeof (body as { message: unknown }).message === \"string\"\n ? (body as { message: string }).message\n : `Request failed with status ${response.status}`\n\n if (response.status === 401 && !isRetry) {\n this.debug.log(\"Received 401. Invalidating token and retrying once.\")\n this.tokenManager.invalidateCachedToken()\n await this.tokenManager.refreshToken()\n return this.request(method, path, init, true)\n }\n\n const error = new JokkooApiError(message, response.status, body)\n this.debug.requestError(httpMethod, url, durationMs, {\n status: response.status,\n message,\n body,\n })\n throw error\n }\n\n if (response.status === 204) {\n this.debug.response(httpMethod, url, response.status, durationMs)\n return undefined as T\n }\n\n const responseText = await response.text()\n if (!responseText.trim()) {\n this.debug.response(httpMethod, url, response.status, durationMs)\n return undefined as T\n }\n\n const data = JSON.parse(responseText) as T\n this.debug.response(httpMethod, url, response.status, durationMs, summarizeResponse(data))\n\n return data\n } catch (error) {\n if (!(error instanceof JokkooApiError)) {\n const durationMs = Date.now() - startedAt\n this.debug.requestError(httpMethod, url, durationMs, error)\n }\n\n throw error\n }\n }\n}\n\nfunction summarizeResponse(data: unknown): Record<string, unknown> | undefined {\n if (!data || typeof data !== \"object\") {\n return undefined\n }\n\n if (\"data\" in data && Array.isArray((data as { data: unknown }).data)) {\n const paginated = data as { data: unknown[]; total?: number; limit?: number; offset?: number }\n return {\n itemCount: paginated.data.length,\n total: paginated.total,\n limit: paginated.limit,\n offset: paginated.offset,\n }\n }\n\n if (\"id\" in data) {\n const entity = data as { id: unknown; conversationId?: unknown }\n return {\n id: entity.id,\n conversationId: entity.conversationId,\n }\n }\n\n return undefined\n}\n","export type ConversationStatus = \"open\" | \"pending\" | \"pending_closure\" | \"snoozed\" | \"closed\"\n\nexport type ChannelType = \"mobile\" | \"web\" | \"whatsapp\" | \"email\"\n\nexport type MessageSenderType = \"end_user\" | \"agent\" | \"system\"\n\nexport type MessageType = \"comment\" | \"note\" | \"activity\"\n\nexport interface MessageMetadata {\n activityType?: string\n isVoiceMessage?: boolean\n audioDurationMs?: number\n [key: string]: unknown\n}\n\nexport interface MessageAttachment {\n fileId: string\n fileName: string\n mimeType: string\n size?: number | null\n}\n\nexport type ConversationId = number\n\nexport type ClosedConversationReplyBehavior = \"create_new\" | \"reopen\"\n\nexport interface ClosedConversationPolicy {\n endUserReplyBehavior: ClosedConversationReplyBehavior\n reopenGracePeriodDays: number\n}\n\nexport interface Conversation {\n id: ConversationId\n channelType: ChannelType\n status: ConversationStatus\n lastMessageText: string | null\n lastMessageSenderType?: MessageSenderType | null\n assignedAgentName?: string | null\n assignedAgentAvatarUrl?: string | null\n createdAt: string\n updatedAt: string\n closedAt?: string | null\n}\n\nexport interface UnreadCountResponse {\n count: number\n conversationIds: number[]\n}\n\nexport interface Message {\n id: number\n conversationId: number\n endUserId: number\n senderId: string | null\n senderType: MessageSenderType\n messageType?: MessageType\n metadata?: MessageMetadata | null\n attachments?: MessageAttachment[]\n content: string\n createdAt: string\n}\n\nexport interface PaginatedResponse<T> {\n data: T[]\n total: number\n limit: number\n offset: number\n}\n\nexport interface SendMessagePayload {\n content: string\n conversationId?: number\n forceNew?: boolean\n fileIds?: string[]\n metadata?: MessageMetadata | null\n}\n\nexport interface SatisfactionPayload {\n score: number\n}\n\nexport const NEW_CONVERSATION_ID = 0\n","export const REALTIME_EVENTS = {\n ping: \"ping\",\n pong: \"pong\",\n messageCreated: \"message.created\",\n conversationCreated: \"conversation.created\",\n conversationUpdated: \"conversation.updated\",\n} as const\n\nexport const REALTIME_NAMESPACE = \"/sdk\"\n","import { io, type Socket } from \"socket.io-client\"\n\nimport type { TokenManager } from \"../core/token-manager\"\nimport type { ResolvedJokkooConfig } from \"../types\"\nimport { REALTIME_NAMESPACE } from \"./realtime-events\"\nimport type { RealtimeStatus, RealtimeStatusListener } from \"./types\"\n\nexport class JokkooRealtimeClient {\n private socket: Socket | null = null\n private status: RealtimeStatus = \"disconnected\"\n private readonly listeners = new Set<RealtimeStatusListener>()\n\n constructor(\n private readonly config: ResolvedJokkooConfig,\n private readonly tokenManager: TokenManager,\n ) {}\n\n async connect(): Promise<void> {\n if (this.socket?.connected) {\n return\n }\n\n this.disconnect()\n\n const userToken = await this.tokenManager.getToken()\n\n this.socket = io(`${this.config.baseUrl}${REALTIME_NAMESPACE}`, {\n auth: {\n clientToken: this.config.clientToken,\n userToken,\n },\n autoConnect: true,\n reconnection: true,\n reconnectionAttempts: Infinity,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 30_000,\n transports: [\"websocket\"],\n })\n\n this.socket.on(\"connect\", () => {\n this.setStatus(\"connected\")\n })\n\n this.socket.on(\"disconnect\", () => {\n this.setStatus(\"disconnected\")\n })\n\n this.socket.on(\"connect_error\", () => {\n this.setStatus(\"error\")\n })\n\n this.socket.io.on(\"reconnect_attempt\", () => {\n void this.refreshAuth()\n this.setStatus(\"connecting\")\n })\n\n this.setStatus(\"connecting\")\n }\n\n disconnect(): void {\n if (this.socket) {\n this.socket.removeAllListeners()\n this.socket.io.removeAllListeners()\n this.socket.disconnect()\n this.socket = null\n }\n\n this.setStatus(\"disconnected\")\n }\n\n getStatus(): RealtimeStatus {\n return this.status\n }\n\n onStatusChange(listener: RealtimeStatusListener): () => void {\n this.listeners.add(listener)\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n /** @internal For future event subscription by feature modules */\n getSocket(): Socket | null {\n return this.socket\n }\n\n private async refreshAuth(): Promise<void> {\n if (!this.socket) {\n return\n }\n\n try {\n const freshToken = await this.tokenManager.getToken()\n this.socket.auth = {\n clientToken: this.config.clientToken,\n userToken: freshToken,\n }\n } catch {\n // Reconnect will retry with the latest token on the next attempt.\n }\n }\n\n private setStatus(status: RealtimeStatus): void {\n this.status = status\n for (const listener of this.listeners) {\n listener(status)\n }\n }\n}\n","import type { JokkooConfig, ResolvedJokkooConfig } from \"../types\"\n\nexport const DEFAULT_BASE_URL = \"https://api.jokkoo.ai\"\nexport const DEFAULT_TOKEN_REFRESH_BUFFER_SECONDS = 60\nexport const DEFAULT_LOCALE = \"fr\"\n\nexport function normalizeBaseUrl(baseUrl: string): string {\n let url = baseUrl.trim().replace(/\\/+$/, \"\")\n\n if (url.endsWith(\"/v1\")) {\n url = url.slice(0, -3)\n }\n\n if (url.endsWith(\"/api\")) {\n url = url.slice(0, -4)\n }\n\n return url\n}\n\nexport class JokkooConfigError extends Error {\n constructor(message: string) {\n super(message)\n this.name = \"JokkooConfigError\"\n }\n}\n\nexport function validateConfig(config: JokkooConfig): ResolvedJokkooConfig {\n if (!config || typeof config !== \"object\") {\n throw new JokkooConfigError(\"Jokkoo.init() requires a configuration object.\")\n }\n\n if (!config.clientToken || typeof config.clientToken !== \"string\") {\n throw new JokkooConfigError(\"clientToken is required and must be a non-empty string.\")\n }\n\n if (typeof config.userTokenProvider !== \"function\") {\n throw new JokkooConfigError(\"userTokenProvider is required and must be a function.\")\n }\n\n if (config.baseUrl !== undefined && typeof config.baseUrl !== \"string\") {\n throw new JokkooConfigError(\"baseUrl must be a string when provided.\")\n }\n\n if (config.locale !== undefined && typeof config.locale !== \"string\") {\n throw new JokkooConfigError(\"locale must be a string when provided.\")\n }\n\n if (config.debug !== undefined && typeof config.debug !== \"boolean\") {\n throw new JokkooConfigError(\"debug must be a boolean when provided.\")\n }\n\n if (\n config.tokenRefreshBufferSeconds !== undefined &&\n (typeof config.tokenRefreshBufferSeconds !== \"number\" ||\n config.tokenRefreshBufferSeconds < 0)\n ) {\n throw new JokkooConfigError(\n \"tokenRefreshBufferSeconds must be a non-negative number when provided.\"\n )\n }\n\n return {\n clientToken: config.clientToken.trim(),\n userTokenProvider: config.userTokenProvider,\n baseUrl: normalizeBaseUrl(config.baseUrl ?? DEFAULT_BASE_URL),\n locale: config.locale ?? DEFAULT_LOCALE,\n debug: config.debug ?? false,\n tokenRefreshBufferSeconds:\n config.tokenRefreshBufferSeconds ?? DEFAULT_TOKEN_REFRESH_BUFFER_SECONDS,\n }\n}\n","/**\n * Pure-JS base64url decode for JWT payload parsing (no atob dependency).\n */\nfunction base64UrlDecode(input: string): string {\n const base64 = input.replace(/-/g, \"+\").replace(/_/g, \"/\")\n const padded = base64 + \"=\".repeat((4 - (base64.length % 4)) % 4)\n\n if (typeof globalThis.atob === \"function\") {\n return globalThis.atob(padded)\n }\n\n const chars = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\"\n let output = \"\"\n let buffer = 0\n let bits = 0\n\n for (const char of padded) {\n if (char === \"=\") {\n break\n }\n const value = chars.indexOf(char)\n if (value === -1) {\n throw new Error(\"Invalid base64 character in JWT payload.\")\n }\n buffer = (buffer << 6) | value\n bits += 6\n if (bits >= 8) {\n bits -= 8\n output += String.fromCharCode((buffer >> bits) & 0xff)\n }\n }\n\n return output\n}\n\nexport function decodeJwtExp(token: string): number | null {\n const parts = token.split(\".\")\n if (parts.length < 2) {\n return null\n }\n\n try {\n const payload = JSON.parse(base64UrlDecode(parts[1])) as { exp?: unknown }\n return typeof payload.exp === \"number\" ? payload.exp : null\n } catch {\n return null\n }\n}\n\nexport function isTokenExpired(\n token: string,\n refreshBufferSeconds: number,\n nowSeconds: number = Math.floor(Date.now() / 1000)\n): boolean {\n const exp = decodeJwtExp(token)\n if (exp === null) {\n return true\n }\n\n return exp - refreshBufferSeconds <= nowSeconds\n}\n","import type { ResolvedJokkooConfig, TokenState, TokenStateListener } from \"../types\"\nimport { createDebugLogger, redactToken } from \"./debug\"\nimport { decodeJwtExp, isTokenExpired } from \"./jwt\"\n\nexport class TokenManager {\n private readonly debug: ReturnType<typeof createDebugLogger>\n private cachedToken: string | null = null\n private refreshTimer: ReturnType<typeof setTimeout> | null = null\n private inflightRefresh: Promise<string> | null = null\n private state: TokenState = \"idle\"\n private listeners = new Set<TokenStateListener>()\n\n constructor(private readonly config: ResolvedJokkooConfig) {\n this.debug = createDebugLogger(config.debug)\n }\n\n subscribe(listener: TokenStateListener): () => void {\n this.listeners.add(listener)\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n getState(): TokenState {\n return this.state\n }\n\n async getToken(): Promise<string> {\n if (this.cachedToken && !isTokenExpired(this.cachedToken, this.config.tokenRefreshBufferSeconds)) {\n this.debug.log(\"Using cached user token.\", { token: redactToken(this.cachedToken) })\n return this.cachedToken\n }\n\n this.debug.log(\"Cached user token missing or expired. Refreshing.\")\n return this.refreshToken()\n }\n\n invalidateCachedToken(): void {\n this.cachedToken = null\n this.debug.log(\"Cached token invalidated.\")\n }\n\n async refreshToken(): Promise<string> {\n if (this.inflightRefresh) {\n return this.inflightRefresh\n }\n\n this.setState(\"loading\")\n this.debug.log(\"Fetching user token from userTokenProvider.\")\n\n this.inflightRefresh = this.config\n .userTokenProvider()\n .then((token) => {\n if (!token || typeof token !== \"string\") {\n throw new Error(\"userTokenProvider must return a non-empty string.\")\n }\n\n this.cachedToken = token\n this.scheduleRefresh(token)\n this.setState(\"ready\")\n this.debug.log(\"User token refreshed.\", { token: redactToken(token) })\n return token\n })\n .catch((error: unknown) => {\n const normalized =\n error instanceof Error ? error : new Error(\"Failed to obtain user token.\")\n this.setState(\"error\", normalized)\n this.debug.error(\"Failed to refresh user token.\", normalized)\n throw normalized\n })\n .finally(() => {\n this.inflightRefresh = null\n })\n\n return this.inflightRefresh\n }\n\n destroy(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer)\n this.refreshTimer = null\n }\n this.cachedToken = null\n this.inflightRefresh = null\n this.listeners.clear()\n this.setState(\"idle\")\n }\n\n private scheduleRefresh(token: string): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer)\n this.refreshTimer = null\n }\n\n const exp = decodeJwtExp(token)\n if (exp === null) {\n return\n }\n\n const nowSeconds = Math.floor(Date.now() / 1000)\n const refreshAtSeconds = exp - this.config.tokenRefreshBufferSeconds\n const delayMs = Math.max((refreshAtSeconds - nowSeconds) * 1000, 0)\n\n this.debug.log(\"Scheduled proactive token refresh.\", { delayMs })\n\n this.refreshTimer = setTimeout(() => {\n this.debug.log(\"Running proactive token refresh.\")\n void this.refreshToken().catch((error) => {\n this.debug.warn(\"Proactive token refresh failed.\", error)\n })\n }, delayMs)\n }\n\n private setState(state: TokenState, error?: Error): void {\n this.state = state\n for (const listener of this.listeners) {\n listener(state, error)\n }\n }\n}\n","import type { JokkooConfig, JokkooState, ResolvedJokkooConfig } from \"../types\"\nimport { JokkooRealtimeClient } from \"../realtime/realtime-client\"\nimport { validateConfig } from \"./config\"\nimport { createDebugLogger } from \"./debug\"\nimport { TokenManager } from \"./token-manager\"\n\nclass JokkooSDK {\n private config: ResolvedJokkooConfig | null = null\n private tokenManager: TokenManager | null = null\n private realtimeClient: JokkooRealtimeClient | null = null\n private initialized = false\n\n init(config: JokkooConfig): void {\n const debug = createDebugLogger(config.debug ?? this.config?.debug ?? false)\n\n if (this.initialized) {\n debug.warn(\"init() called more than once. Reinitializing SDK.\")\n this.destroy()\n }\n\n this.config = validateConfig(config)\n this.tokenManager = new TokenManager(this.config)\n this.realtimeClient = new JokkooRealtimeClient(this.config, this.tokenManager)\n this.initialized = true\n\n const sdkDebug = createDebugLogger(this.config.debug)\n sdkDebug.log(\"SDK initialized.\", {\n baseUrl: this.config.baseUrl,\n locale: this.config.locale,\n tokenRefreshBufferSeconds: this.config.tokenRefreshBufferSeconds,\n })\n }\n\n destroy(): void {\n const debug = createDebugLogger(this.config?.debug ?? false)\n this.realtimeClient?.disconnect()\n this.realtimeClient = null\n this.tokenManager?.destroy()\n this.tokenManager = null\n this.config = null\n this.initialized = false\n debug.log(\"SDK destroyed.\")\n }\n\n isInitialized(): boolean {\n return this.initialized\n }\n\n getState(): JokkooState {\n return {\n initialized: this.initialized,\n clientToken: this.config?.clientToken,\n baseUrl: this.config?.baseUrl,\n locale: this.config?.locale,\n }\n }\n\n /** @internal Used by UI and future messaging modules */\n getTokenManager(): TokenManager {\n this.assertInitialized()\n return this.tokenManager!\n }\n\n /** @internal Used by UI and future messaging modules */\n getRealtimeClient(): JokkooRealtimeClient {\n this.assertInitialized()\n return this.realtimeClient!\n }\n\n /** @internal Used by UI and future messaging modules */\n getConfig(): ResolvedJokkooConfig {\n this.assertInitialized()\n return this.config!\n }\n\n private assertInitialized(): void {\n if (!this.initialized || !this.config || !this.tokenManager) {\n throw new Error(\"Jokkoo SDK is not initialized. Call Jokkoo.init() first.\")\n }\n }\n}\n\nexport const Jokkoo = new JokkooSDK()\n\nexport { JokkooRealtimeClient } from \"../realtime/realtime-client\"\nexport { TokenManager } from \"./token-manager\"\nexport { validateConfig, JokkooConfigError } from \"./config\"\n","import type { MessageAttachment } from \"../api/types\"\n\nexport type ChatMessageSender = \"user\" | \"agent\" | \"system\"\n\nexport interface ChatAttachment {\n fileId: string\n fileName: string\n mimeType: string\n size?: number | null\n}\n\nexport interface ChatMessage {\n id: string\n sender: ChatMessageSender\n text: string\n timestamp: string\n agentName?: string\n agentInitials?: string\n agentAvatarUrl?: string | null\n attachments?: ChatAttachment[]\n metadata?: Record<string, unknown> | null\n}\n\nexport function mapApiAttachmentToChatAttachment(\n attachment: MessageAttachment\n): ChatAttachment {\n return {\n fileId: attachment.fileId,\n fileName: attachment.fileName,\n mimeType: attachment.mimeType,\n size: attachment.size,\n }\n}\n","import type { Translations } from \"./translations\"\n\nexport const en: Translations = {\n supportCenter: \"Support Center\",\n activeConversation: (count) => `${count} active ticket${count === 1 ? \"\" : \"s\"}`,\n myRequests: \"My Requests\",\n newSupportRequest: \"New Support Request\",\n noConversationsYet: \"No conversations yet.\",\n unableToLoadConversations: \"Unable to load conversations.\",\n retry: \"Retry\",\n newRequest: \"New request\",\n support: \"Support\",\n noMessagesYet: \"No messages yet\",\n newSupportRequestHeader: \"New support request\",\n request: \"Request\",\n typeYourMessage: \"Type your message...\",\n sendMessage: \"Send message\",\n recordVoiceMessage: \"Record voice message\",\n unableToLoadMessages: \"Unable to load messages.\",\n discussionEnded: \"This discussion has been ended\",\n discussionClosedCanReply: \"This discussion is closed. You can reply to reopen it.\",\n rateConversation: \"Rate your conversation\",\n rateConversationDescription: \"How satisfied are you with our support?\",\n thankYouForRating: \"Thank you for your feedback!\",\n ratingVeryUnsatisfied: \"Very unsatisfied\",\n ratingUnsatisfied: \"Unsatisfied\",\n ratingNeutral: \"Neutral\",\n ratingSatisfied: \"Satisfied\",\n ratingVerySatisfied: \"Very satisfied\",\n sendMessageError: \"Unable to send your message. Please try again.\",\n statusNew: \"New\",\n statusInProgress: \"In Progress\",\n statusResolved: \"Resolved\",\n statusEnded: \"Ended\",\n ticketResolved: \"This ticket has been resolved\",\n supportAgent: \"Support Agent\",\n welcomeMessage: \"Hello, How can we help you ?\",\n now: \"now\",\n newMessageIndicator: (count) =>\n count === 1 ? \"1 new message\" : `${count} new messages`,\n attachFile: \"Attach file\",\n pickPhotoLibrary: \"Photo library\",\n pickCamera: \"Camera\",\n pickDocument: \"Document\",\n cancel: \"Cancel\",\n uploadFailed: \"Upload failed\",\n maxAttachmentsReached: \"You can attach up to 5 files per message\",\n sharedFiles: \"Shared files\",\n uploadingAttachment: \"Uploading\",\n attachmentReady: \"Ready to send\",\n retryUpload: \"Retry\",\n openExternally: \"Open externally\",\n downloadAttachment: \"Download\",\n previewUnavailableInApp: \"This file cannot be previewed in the app. Use the options below to open or download it.\",\n previewLoadFailed: \"Unable to load this attachment.\",\n previewImageFile: \"Image\",\n previewVideoFile: \"Video\",\n previewDocumentFile: \"Document\",\n voiceMessage: \"Voice message\",\n recording: \"Recording...\",\n tapToRecord: \"Tap to record\",\n cancelRecording: \"Cancel\",\n sendRecording: \"Send recording\",\n microphonePermissionDenied: \"Microphone access is required to record voice messages.\",\n voiceMessageTooShort: \"Hold to record a longer voice message.\",\n}\n","import type { Translations } from \"./translations\"\n\nexport const fr: Translations = {\n supportCenter: \"Centre d'assistance\",\n activeConversation: (count) =>\n `${count} ticket${count > 1 ? \"s\" : \"\"} actif${count > 1 ? \"s\" : \"\"}`,\n myRequests: \"Mes demandes\",\n newSupportRequest: \"Nouvelle demande\",\n noConversationsYet: \"Aucune conversation pour le moment.\",\n unableToLoadConversations: \"Impossible de charger les conversations.\",\n retry: \"Réessayer\",\n newRequest: \"Nouvelle demande\",\n support: \"Support\",\n noMessagesYet: \"Aucun message pour le moment\",\n newSupportRequestHeader: \"Nouvelle demande\",\n request: \"Demande\",\n typeYourMessage: \"Tapez votre message...\",\n sendMessage: \"Envoyer le message\",\n recordVoiceMessage: \"Enregistrer un message vocal\",\n unableToLoadMessages: \"Impossible de charger les messages.\",\n discussionEnded: \"Cette discussion est terminée\",\n discussionClosedCanReply: \"Cette discussion est clôturée. Vous pouvez répondre pour la rouvrir.\",\n rateConversation: \"Notez votre conversation\",\n rateConversationDescription: \"Quelle est votre satisfaction concernant notre support ?\",\n thankYouForRating: \"Merci pour votre retour !\",\n ratingVeryUnsatisfied: \"Très insatisfait\",\n ratingUnsatisfied: \"Insatisfait\",\n ratingNeutral: \"Neutre\",\n ratingSatisfied: \"Satisfait\",\n ratingVerySatisfied: \"Très satisfait\",\n sendMessageError: \"Impossible d'envoyer votre message. Veuillez réessayer.\",\n statusNew: \"Nouveau\",\n statusInProgress: \"En cours\",\n statusResolved: \"Résolu\",\n statusEnded: \"Terminé\",\n ticketResolved: \"Ce ticket a été résolu\",\n supportAgent: \"Agent de support\",\n welcomeMessage: \"Bonjour, comment pouvons-nous vous aider ?\",\n now: \"maintenant\",\n newMessageIndicator: (count) =>\n count === 1 ? \"1 nouveau message\" : `${count} nouveaux messages`,\n attachFile: \"Joindre un fichier\",\n pickPhotoLibrary: \"Photothèque\",\n pickCamera: \"Appareil photo\",\n pickDocument: \"Document\",\n cancel: \"Annuler\",\n uploadFailed: \"Échec du téléversement\",\n maxAttachmentsReached: \"Vous pouvez joindre jusqu'à 5 fichiers par message\",\n sharedFiles: \"Fichiers partagés\",\n uploadingAttachment: \"Téléversement\",\n attachmentReady: \"Prêt à envoyer\",\n retryUpload: \"Réessayer\",\n openExternally: \"Ouvrir en externe\",\n downloadAttachment: \"Télécharger\",\n previewUnavailableInApp: \"Ce fichier ne peut pas être prévisualisé dans l'application. Utilisez les options ci-dessous pour l'ouvrir ou le télécharger.\",\n previewLoadFailed: \"Impossible de charger cette pièce jointe.\",\n previewImageFile: \"Image\",\n previewVideoFile: \"Vidéo\",\n previewDocumentFile: \"Document\",\n voiceMessage: \"Message vocal\",\n recording: \"Enregistrement...\",\n tapToRecord: \"Appuyez pour enregistrer\",\n cancelRecording: \"Annuler\",\n sendRecording: \"Envoyer l'enregistrement\",\n microphonePermissionDenied: \"L'accès au microphone est requis pour enregistrer des messages vocaux.\",\n voiceMessageTooShort: \"Maintenez plus longtemps pour enregistrer un message vocal.\",\n}\n","import { en } from \"./en\"\nimport { fr } from \"./fr\"\nimport type { Translations } from \"./translations\"\n\nexport type { Translations } from \"./translations\"\nexport { en, fr }\n\nexport function getTranslations(locale?: string): Translations {\n if (locale === \"en\") {\n return en\n }\n\n return fr\n}\n","import type { ConversationStatus, Message } from \"../api/types\"\n\nexport function isSatisfactionRequestMessage(message: Message): boolean {\n return (\n message.messageType === \"activity\" &&\n message.metadata?.activityType === \"satisfaction_request\"\n )\n}\n\nexport function getSatisfactionSurveyMessage(messages: Message[]): string | undefined {\n const surveyMessage = [...messages].reverse().find(isSatisfactionRequestMessage)\n const content = surveyMessage?.content?.trim()\n\n return content && content.length > 0 ? content : undefined\n}\n\nexport function conversationNeedsRating(\n status: ConversationStatus | undefined,\n messages: Message[]\n): boolean {\n if (status === \"closed\") {\n return false\n }\n\n if (status === \"pending_closure\") {\n return true\n }\n\n return messages.some(isSatisfactionRequestMessage)\n}\n","import type { Message } from \"../api/types\"\nimport { isSatisfactionRequestMessage } from \"./satisfaction\"\n\nconst TICKET_ACTIVITY_TYPES = new Set([\"ticket_created\", \"ticket_status_changed\"])\n\nexport function isTicketActivityMessage(message: Message): boolean {\n const activityType = message.metadata?.activityType\n return (\n message.messageType === \"activity\" &&\n typeof activityType === \"string\" &&\n TICKET_ACTIVITY_TYPES.has(activityType)\n )\n}\n\n/**\n * Activity messages that should render as passive in-thread events\n * (no bubble, no sender). Satisfaction surveys stay special-cased elsewhere.\n */\nexport function isPassiveActivityMessage(message: Message): boolean {\n if (isSatisfactionRequestMessage(message)) {\n return false\n }\n\n return isTicketActivityMessage(message) || message.senderType === \"system\"\n}\n\n/** Agent and system messages (including ticket activities) count toward unread. */\nexport function shouldCountMessageAsUnread(message: Message): boolean {\n return message.senderType === \"agent\" || message.senderType === \"system\"\n}\n","export function isImageMimeType(mimeType: string): boolean {\n return mimeType.startsWith(\"image/\")\n}\n\nexport function isVideoMimeType(mimeType: string): boolean {\n return mimeType.startsWith(\"video/\")\n}\n\nexport function isAudioMimeType(mimeType: string): boolean {\n return mimeType.startsWith(\"audio/\")\n}\n\nexport function isDocumentMimeType(mimeType: string): boolean {\n return !isImageMimeType(mimeType) && !isVideoMimeType(mimeType) && !isAudioMimeType(mimeType)\n}\n\nexport function canPreviewInApp(mimeType: string): boolean {\n return isImageMimeType(mimeType)\n}\n\nexport function formatAttachmentSize(size?: number | null): string {\n if (!size || size <= 0) {\n return \"\"\n }\n\n if (size < 1024) {\n return `${size} B`\n }\n\n if (size < 1024 * 1024) {\n return `${(size / 1024).toFixed(1)} KB`\n }\n\n return `${(size / (1024 * 1024)).toFixed(1)} MB`\n}\n\nexport function formatAudioDuration(durationMs: number): string {\n const totalSeconds = Math.max(0, Math.floor(durationMs / 1000))\n const minutes = Math.floor(totalSeconds / 60)\n const seconds = totalSeconds % 60\n\n return `${minutes}:${seconds.toString().padStart(2, \"0\")}`\n}\n\nexport function isVoiceMessageMetadata(\n metadata?: Record<string, unknown> | null\n): metadata is { isVoiceMessage: true; audioDurationMs?: number } {\n return metadata?.isVoiceMessage === true\n}\n","import type { ClosedConversationPolicy, Conversation } from \"../api/types\"\n\nexport function isWithinReopenGracePeriod(\n conversation: Pick<Conversation, \"closedAt\">,\n policy: Pick<ClosedConversationPolicy, \"reopenGracePeriodDays\">\n): boolean {\n if (!conversation.closedAt || policy.reopenGracePeriodDays <= 0) {\n return false\n }\n\n const graceEnd = new Date(conversation.closedAt)\n graceEnd.setDate(graceEnd.getDate() + policy.reopenGracePeriodDays)\n\n return new Date() <= graceEnd\n}\n\nexport function canReplyToClosedConversation(\n conversation: Pick<Conversation, \"status\" | \"closedAt\">,\n policy: ClosedConversationPolicy | undefined\n): boolean {\n if (conversation.status !== \"closed\" || !policy) {\n return false\n }\n\n if (policy.endUserReplyBehavior !== \"reopen\") {\n return false\n }\n\n return isWithinReopenGracePeriod(conversation, policy)\n}\n","export const MESSAGE_CONTENT_MIN_LENGTH = 2\nexport const MESSAGE_CONTENT_MAX_LENGTH = 2000\n\nexport const MAX_IMAGE_SIZE_BYTES = 5 * 1024 * 1024\nexport const MAX_VIDEO_SIZE_BYTES = 25 * 1024 * 1024\nexport const MAX_DOCUMENT_SIZE_BYTES = 10 * 1024 * 1024\nexport const MAX_AUDIO_SIZE_BYTES = 25 * 1024 * 1024\nexport const MAX_ATTACHMENTS_PER_MESSAGE = 5\n\nexport const ALLOWED_IMAGE_MIME_TYPES = [\n \"image/jpeg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n] as const\n\nexport const ALLOWED_VIDEO_MIME_TYPES = [\"video/mp4\", \"video/quicktime\", \"video/webm\"] as const\n\nexport const ALLOWED_DOCUMENT_MIME_TYPES = [\n \"application/pdf\",\n \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\n] as const\n\nexport const ALLOWED_AUDIO_MIME_TYPES = [\n \"audio/aac\",\n \"audio/mp4\",\n \"audio/mpeg\",\n \"audio/webm\",\n] as const\n\nexport const ALLOWED_ATTACHMENT_MIME_TYPES = [\n ...ALLOWED_IMAGE_MIME_TYPES,\n ...ALLOWED_VIDEO_MIME_TYPES,\n ...ALLOWED_DOCUMENT_MIME_TYPES,\n ...ALLOWED_AUDIO_MIME_TYPES,\n] as const\n\nexport const VOICE_MESSAGE_MIME_TYPE = \"audio/mp4\" as const\nexport const VOICE_MESSAGE_STORAGE_PROVIDER = \"s3\" as const\n","import type { Conversation } from \"../api/types\"\nimport type { Translations } from \"../i18n\"\n\ntype ConversationTitleSource = Pick<Conversation, \"assignedAgentName\" | \"status\">\n\nexport function getInitialsFromName(name: string): string {\n const parts = name.trim().split(/\\s+/).filter(Boolean)\n if (parts.length === 0) {\n return \"?\"\n }\n\n if (parts.length === 1) {\n return parts[0]!.slice(0, 2).toUpperCase()\n }\n\n return `${parts[0]![0] ?? \"\"}${parts[parts.length - 1]![0] ?? \"\"}`.toUpperCase()\n}\n\nexport function getConversationDisplayName(\n conversation: ConversationTitleSource,\n t: Translations\n): string {\n if (conversation.status === \"pending\") {\n return t.newRequest\n }\n\n if (conversation.assignedAgentName) {\n return conversation.assignedAgentName\n }\n\n return t.support\n}\n\nexport function getAgentInitials(\n assignedAgentName: string | null | undefined,\n fallback: string\n): string {\n if (!assignedAgentName) {\n return fallback\n }\n\n return getInitialsFromName(assignedAgentName)\n}\n\nexport function getAgentDisplayName(\n assignedAgentName: string | null | undefined,\n t: Translations\n): string {\n return assignedAgentName ?? t.supportAgent\n}\n","import type { JokkooApiClient } from \"../api/client\"\nimport {\n ALLOWED_ATTACHMENT_MIME_TYPES,\n MAX_ATTACHMENTS_PER_MESSAGE,\n MAX_AUDIO_SIZE_BYTES,\n MAX_DOCUMENT_SIZE_BYTES,\n MAX_IMAGE_SIZE_BYTES,\n MAX_VIDEO_SIZE_BYTES,\n} from \"./constants\"\n\nexport type PendingAttachmentStatus = \"pending\" | \"uploading\" | \"confirming\" | \"confirmed\" | \"error\"\n\nexport interface PendingAttachment {\n id: string\n fileName: string\n mimeType: string\n uri: string\n size: number\n status: PendingAttachmentStatus\n progress: number\n error?: string\n confirmedFileId?: string\n}\n\nfunction getMaxSizeForMimeType(mimeType: string): number {\n if (mimeType.startsWith(\"image/\")) {\n return MAX_IMAGE_SIZE_BYTES\n }\n\n if (mimeType.startsWith(\"video/\")) {\n return MAX_VIDEO_SIZE_BYTES\n }\n\n if (mimeType.startsWith(\"audio/\")) {\n return MAX_AUDIO_SIZE_BYTES\n }\n\n return MAX_DOCUMENT_SIZE_BYTES\n}\n\nfunction validateAttachment(mimeType: string, size: number): string | null {\n if (!(ALLOWED_ATTACHMENT_MIME_TYPES as readonly string[]).includes(mimeType)) {\n return \"Unsupported file type\"\n }\n\n if (size > getMaxSizeForMimeType(mimeType)) {\n return \"File exceeds the maximum allowed size\"\n }\n\n return null\n}\n\nexport async function uploadAttachmentFile(\n apiClient: JokkooApiClient,\n attachment: PendingAttachment,\n onProgress: (progress: number, status: PendingAttachmentStatus) => void\n): Promise<PendingAttachment> {\n onProgress(10, \"uploading\")\n\n const { fileId, uploadUrl } = await apiClient.requestUploadUrl(\n attachment.fileName,\n attachment.mimeType\n )\n\n onProgress(40, \"uploading\")\n\n const fileResponse = await fetch(attachment.uri)\n const blob = await fileResponse.blob()\n\n const uploadResponse = await fetch(uploadUrl, {\n method: \"PUT\",\n body: blob,\n headers: {\n \"Content-Type\": attachment.mimeType,\n },\n })\n\n if (!uploadResponse.ok) {\n throw new Error(\"Upload failed\")\n }\n\n onProgress(75, \"confirming\")\n await apiClient.confirmUpload(fileId)\n\n return {\n ...attachment,\n status: \"confirmed\",\n progress: 100,\n confirmedFileId: fileId,\n }\n}\n\nexport function createPendingAttachment(input: {\n fileName: string\n mimeType: string\n uri: string\n size: number\n}): PendingAttachment {\n const validationError = validateAttachment(input.mimeType, input.size)\n\n return {\n id: `${input.fileName}-${Date.now()}`,\n fileName: input.fileName,\n mimeType: input.mimeType,\n uri: input.uri,\n size: input.size,\n status: validationError ? \"error\" : \"pending\",\n progress: 0,\n error: validationError ?? undefined,\n }\n}\n\nexport function canAddMoreAttachments(currentCount: number): boolean {\n return currentCount < MAX_ATTACHMENTS_PER_MESSAGE\n}\n","export type SupportedLocale = \"fr\" | \"en\"\n\nconst MONTH_LABELS: Record<SupportedLocale, string[]> = {\n en: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n fr: [\"Jan\", \"Fév\", \"Mar\", \"Avr\", \"Mai\", \"Juin\", \"Juil\", \"Aoû\", \"Sep\", \"Oct\", \"Nov\", \"Déc\"],\n}\n\nfunction resolveLocale(locale?: string): SupportedLocale {\n return locale === \"en\" ? \"en\" : \"fr\"\n}\n\nexport function formatMessageTimestamp(\n value: string | Date,\n locale?: string\n): string {\n const date = typeof value === \"string\" ? new Date(value) : value\n const monthLabels = MONTH_LABELS[resolveLocale(locale)]\n const month = monthLabels[date.getMonth()]\n const day = date.getDate()\n const hours = String(date.getHours()).padStart(2, \"0\")\n const minutes = String(date.getMinutes()).padStart(2, \"0\")\n return `${month} ${day} · ${hours}:${minutes}`\n}\n\nexport function formatRelativeTimestamp(\n value: string | Date,\n options?: { locale?: string; nowLabel?: string }\n): string {\n const date = typeof value === \"string\" ? new Date(value) : value\n const now = Date.now()\n const diffMs = now - date.getTime()\n const diffMinutes = Math.floor(diffMs / 60_000)\n const nowLabel = options?.nowLabel ?? \"now\"\n\n if (diffMinutes < 1) {\n return nowLabel\n }\n\n if (diffMinutes < 60) {\n return `${diffMinutes}min`\n }\n\n const diffHours = Math.floor(diffMinutes / 60)\n if (diffHours < 24) {\n return `${diffHours}h`\n }\n\n const monthLabels = MONTH_LABELS[resolveLocale(options?.locale)]\n const month = monthLabels[date.getMonth()]\n const day = date.getDate()\n return `${month} ${day}`\n}\n","import type { Message } from \"../api/types\"\nimport type { Translations } from \"../i18n\"\nimport { getAgentDisplayName, getAgentInitials } from \"./conversation-display\"\nimport type { ChatMessage } from \"../types/chat-message\"\nimport { formatMessageTimestamp } from \"./format\"\n\nexport function mapMessageToChatMessage(\n message: Message,\n translations: Translations,\n locale?: string,\n assignedAgentName?: string | null,\n assignedAgentAvatarUrl?: string | null\n): ChatMessage {\n const sender =\n message.senderType === \"end_user\"\n ? \"user\"\n : message.senderType === \"agent\"\n ? \"agent\"\n : \"system\"\n\n const agentName =\n sender === \"agent\" ? getAgentDisplayName(assignedAgentName, translations) : undefined\n const agentInitials =\n sender === \"agent\" ? getAgentInitials(assignedAgentName, \"SA\") : undefined\n const agentAvatarUrl = sender === \"agent\" ? (assignedAgentAvatarUrl ?? null) : null\n\n return {\n id: String(message.id),\n sender,\n text: message.content,\n timestamp: formatMessageTimestamp(message.createdAt, locale),\n agentName,\n agentInitials,\n agentAvatarUrl,\n attachments: message.attachments?.map((attachment) => ({\n fileId: attachment.fileId,\n fileName: attachment.fileName,\n mimeType: attachment.mimeType,\n size: attachment.size,\n })),\n metadata: message.metadata ?? null,\n }\n}\n\nexport function createWelcomeMessage(translations: Translations): ChatMessage {\n return {\n id: \"welcome\",\n sender: \"agent\",\n agentInitials: \"AB\",\n text: translations.welcomeMessage,\n timestamp: \"\",\n }\n}\n","import { JokkooApiClient } from \"../api/client\"\nimport type { Message, PaginatedResponse } from \"../api/types\"\n\nexport type MessagesPageParam = \"latest\" | number\n\nexport async function fetchMessagesPage(\n apiClient: JokkooApiClient,\n conversationId: number,\n pageSize: number,\n pageParam: MessagesPageParam\n): Promise<PaginatedResponse<Message>> {\n if (pageParam === \"latest\") {\n const probe = await apiClient.getMessages(conversationId, 1, 0)\n const offset = Math.max(0, probe.total - pageSize)\n const page = await apiClient.getMessages(conversationId, pageSize, offset)\n return {\n ...page,\n data: [...page.data].reverse(),\n }\n }\n\n const page = await apiClient.getMessages(conversationId, pageSize, pageParam)\n return {\n ...page,\n data: [...page.data].reverse(),\n }\n}\n\nexport function getOlderMessagesPageParam(lastPage: PaginatedResponse<Message>): number | undefined {\n const oldestLoadedOffset = lastPage.offset\n if (oldestLoadedOffset <= 0) {\n return undefined\n }\n\n return Math.max(0, oldestLoadedOffset - lastPage.limit)\n}\n","import type { ChannelType, Conversation, ConversationStatus, Message } from \"../api/types\"\n\nexport type RealtimeConversationPayload = {\n id: number\n endUserId: number\n channelType: ChannelType | string\n status: string\n lastMessageText: string | null\n lastMessageAt?: string | Date | null\n assignedAgentName?: string | null\n createdAt: string | Date\n updatedAt: string | Date\n}\n\nfunction toIsoString(value: string | Date | null | undefined): string {\n if (!value) {\n return new Date().toISOString()\n }\n\n return typeof value === \"string\" ? value : value.toISOString()\n}\n\nfunction mapRealtimeStatus(status: string): ConversationStatus {\n if (status === \"closed\") {\n return \"closed\"\n }\n\n if (status === \"pending_closure\") {\n return \"pending_closure\"\n }\n\n if (status === \"snoozed\") {\n return \"snoozed\"\n }\n\n if (status === \"pending\") {\n return \"pending\"\n }\n\n return \"open\"\n}\n\nexport function mapRealtimeConversationPayload(\n conversation: RealtimeConversationPayload\n): Conversation {\n return {\n id: conversation.id,\n channelType: conversation.channelType as ChannelType,\n status: mapRealtimeStatus(conversation.status),\n lastMessageText: conversation.lastMessageText,\n assignedAgentName: conversation.assignedAgentName ?? null,\n createdAt: toIsoString(conversation.createdAt),\n updatedAt: toIsoString(conversation.lastMessageAt ?? conversation.updatedAt),\n }\n}\n\nexport function normalizeRealtimeMessage(message: Message): Message {\n return {\n ...message,\n id: Number(message.id),\n conversationId: Number(message.conversationId),\n endUserId: Number(message.endUserId),\n createdAt:\n typeof message.createdAt === \"string\"\n ? message.createdAt\n : new Date(message.createdAt).toISOString(),\n }\n}\n","export const VOICE_WAVEFORM_BAR_COUNT = 32\nexport const VOICE_METERING_HISTORY_SIZE = VOICE_WAVEFORM_BAR_COUNT\nexport const VOICE_METERING_IDLE_LEVEL = 0.14\nexport const VOICE_METERING_SMOOTHING = 0.38\n\nexport function normalizeMeteringLevel(metering: number): number {\n const clampedDb = Math.max(-58, Math.min(0, metering))\n const linear = (clampedDb + 58) / 58\n const curved = Math.pow(linear, 0.72)\n return Math.max(VOICE_METERING_IDLE_LEVEL, Math.min(1, curved))\n}\n\nexport function smoothMeteringSample(previous: number, next: number, alpha = VOICE_METERING_SMOOTHING): number {\n return previous + (next - previous) * alpha\n}\n\nexport function createIdleMeteringLevels(barCount = VOICE_WAVEFORM_BAR_COUNT): number[] {\n return Array.from({ length: barCount }, () => VOICE_METERING_IDLE_LEVEL)\n}\n\nexport function shiftMeteringLevel(levels: number[], newLevel: number): number[] {\n if (levels.length === 0) {\n return createIdleMeteringLevels()\n }\n\n if (levels.length === 1) {\n return [levels[0], newLevel]\n }\n\n return [...levels.slice(1), newLevel]\n}\n\nexport function applyLiveBarVariation(level: number, index: number): number {\n const wobble = 0.82 + 0.18 * Math.sin(index * 0.85 + level * 4.2)\n return Math.max(VOICE_METERING_IDLE_LEVEL, Math.min(1, level * wobble))\n}\n\nexport function createPlaybackBarHeights(count: number, seed: number): number[] {\n const heights: number[] = []\n\n for (let index = 0; index < count; index += 1) {\n const wave = Math.sin((index + seed) * 0.65) * 0.35 + 0.55\n heights.push(Math.max(0.2, Math.min(1, wave)))\n }\n\n return heights\n}\n\nexport function blendLiveWaveformLevels(levels: number[]): number[] {\n if (levels.length <= 2) {\n return levels\n }\n\n return levels.map((level, index) => {\n const previous = levels[index - 1] ?? level\n const next = levels[index + 1] ?? level\n const blended = level * 0.55 + previous * 0.225 + next * 0.225\n return Math.max(VOICE_METERING_IDLE_LEVEL, Math.min(1, blended))\n })\n}\n","import type { JokkooApiClient } from \"../api/client\"\nimport { VOICE_MESSAGE_MIME_TYPE, VOICE_MESSAGE_STORAGE_PROVIDER } from \"./constants\"\n\nexport async function uploadVoiceRecording(\n apiClient: JokkooApiClient,\n uri: string,\n fileName: string,\n onProgress?: (progress: number) => void\n): Promise<string> {\n onProgress?.(10)\n\n const { fileId, uploadUrl } = await apiClient.requestUploadUrl(\n fileName,\n VOICE_MESSAGE_MIME_TYPE,\n VOICE_MESSAGE_STORAGE_PROVIDER\n )\n\n onProgress?.(40)\n\n const fileResponse = await fetch(uri)\n const blob = await fileResponse.blob()\n\n const uploadResponse = await fetch(uploadUrl, {\n method: \"PUT\",\n body: blob,\n headers: {\n \"Content-Type\": VOICE_MESSAGE_MIME_TYPE,\n },\n })\n\n if (!uploadResponse.ok) {\n throw new Error(\"Voice upload failed\")\n }\n\n onProgress?.(75)\n await apiClient.confirmUpload(fileId)\n onProgress?.(100)\n\n return fileId\n}\n\n/** Upload a voice recording Blob directly (preferred for web MediaRecorder). */\nexport async function uploadVoiceBlob(\n apiClient: JokkooApiClient,\n blob: Blob,\n fileName: string,\n mimeType: string = VOICE_MESSAGE_MIME_TYPE,\n onProgress?: (progress: number) => void\n): Promise<string> {\n onProgress?.(10)\n\n const { fileId, uploadUrl } = await apiClient.requestUploadUrl(\n fileName,\n mimeType,\n VOICE_MESSAGE_STORAGE_PROVIDER\n )\n\n onProgress?.(40)\n\n const uploadResponse = await fetch(uploadUrl, {\n method: \"PUT\",\n body: blob,\n headers: {\n \"Content-Type\": mimeType,\n },\n })\n\n if (!uploadResponse.ok) {\n throw new Error(\"Voice upload failed\")\n }\n\n onProgress?.(75)\n await apiClient.confirmUpload(fileId)\n onProgress?.(100)\n\n return fileId\n}\n\nexport function createVoiceMessageFileName(extension = \"m4a\"): string {\n return `voice-${Date.now()}.${extension}`\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@jokkoo/sdk-web",
3
+ "version": "0.1.0",
4
+ "description": "Jokkoo framework-agnostic client embed SDK core (API, realtime, token management)",
5
+ "license": "Apache-2.0",
6
+ "author": "Jokkoo",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://gitlab.baamtu.com/jokkoo/jokkoo-sdks.git",
10
+ "directory": "typescript/packages/sdk-web"
11
+ },
12
+ "main": "./dist/index.js",
13
+ "module": "./dist/index.mjs",
14
+ "types": "./dist/index.d.ts",
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/index.d.ts",
18
+ "import": "./dist/index.mjs",
19
+ "require": "./dist/index.js"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist",
24
+ "README.md",
25
+ "LICENSE"
26
+ ],
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "dependencies": {
31
+ "socket.io-client": "^4.8.3"
32
+ },
33
+ "devDependencies": {
34
+ "@eslint/js": "^9.22.0",
35
+ "eslint": "^9.22.0",
36
+ "tsup": "^8.4.0",
37
+ "typescript": "^5.8.2",
38
+ "typescript-eslint": "^8.26.1",
39
+ "vitest": "^3.0.9"
40
+ },
41
+ "scripts": {
42
+ "build": "tsup",
43
+ "test": "vitest run --reporter=default --reporter=junit --outputFile=junit-report.xml",
44
+ "lint": "eslint src",
45
+ "typecheck": "tsc --noEmit"
46
+ }
47
+ }