sabha-meetings-react 0.1.0 → 0.1.2
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/README.md +139 -0
- package/dist/index.d.mts +430 -1
- package/dist/index.d.ts +430 -1
- package/dist/index.js +1464 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1451 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +15 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
1
|
+
{"version":3,"sources":["../src/api/auth.ts","../src/api/meetings.ts","../src/errors.ts","../src/http/client.ts","../src/media/MediaController.ts","../src/security/ContentProtection.ts","../src/types.ts","../src/realtime/MeetingConnection.ts","../src/SabhaClient.ts","../src/react/SabhaContext.tsx","../src/react/SabhaProvider.tsx","../src/react/hooks.ts"],"names":["io","createContext","useMemo","useState","useEffect","useCallback","jsx","useContext"],"mappings":"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","file":"index.js","sourcesContent":["import type { HttpClient } from \"../http/client\";\nimport type {\n AuthSession,\n AuthUser,\n LoginInput,\n RegisterInput,\n SabhaTokens,\n VerifyEmailInput,\n} from \"../types\";\n\nfunction asUser(data: AuthUser): AuthUser {\n if (!data?.userId && !(data as { id?: string }).id) {\n throw new Error(\"Auth response missing userId\");\n }\n return {\n ...data,\n userId: data.userId || String((data as { id?: string }).id),\n };\n}\n\nfunction sessionFrom(data: AuthUser, cookie?: string | null): AuthSession {\n return {\n user: asUser(data),\n accessToken: data.token,\n refreshToken: data.refreshToken,\n sessionCookie: cookie ?? undefined,\n };\n}\n\nexport class AuthApi {\n constructor(\n private readonly http: HttpClient,\n private readonly getSessionCookie: () => string | undefined,\n ) {}\n\n async register(input: RegisterInput): Promise<unknown> {\n return this.http.request(\"/api/auth/register\", {\n method: \"POST\",\n auth: false,\n body: input,\n });\n }\n\n async verifyEmail(input: VerifyEmailInput): Promise<AuthSession> {\n const data = await this.http.request<AuthUser>(\"/api/auth/verify\", {\n method: \"POST\",\n auth: false,\n body: input,\n });\n return sessionFrom(data, this.getSessionCookie());\n }\n\n async login(input: LoginInput): Promise<AuthSession> {\n const data = await this.http.request<AuthUser>(\"/api/auth/login\", {\n method: \"POST\",\n auth: false,\n body: input,\n });\n return sessionFrom(data, this.getSessionCookie());\n }\n\n async refresh(refreshToken: string): Promise<SabhaTokens> {\n const data = await this.http.request<AuthUser>(\"/api/auth/refresh\", {\n method: \"POST\",\n auth: false,\n body: { refreshToken },\n });\n return {\n accessToken: data.token,\n refreshToken: data.refreshToken ?? refreshToken,\n sessionCookie: this.getSessionCookie(),\n };\n }\n\n async me(): Promise<AuthUser> {\n const data = await this.http.request<AuthUser>(\"/api/auth/me\", { method: \"GET\" });\n return asUser(data);\n }\n\n async logout(refreshToken?: string): Promise<void> {\n await this.http.request(\"/api/auth/logout\", {\n method: \"POST\",\n body: refreshToken ? { refreshToken } : {},\n });\n }\n}\n","import type { HttpClient } from \"../http/client\";\nimport type { CreateMeetingInput, Meeting, UpdateMeetingInput } from \"../types\";\n\ntype MeetingsListResponse = {\n ok?: boolean;\n meetings?: Meeting[];\n};\n\ntype MeetingResponse = {\n ok?: boolean;\n meeting?: Meeting;\n};\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" ? (value as Record<string, unknown>) : null;\n}\n\nexport function normalizeMeeting(raw: unknown): Meeting {\n const record = asRecord(raw) ?? {};\n const nested =\n (asRecord(record.meeting) as Meeting | null) ??\n (record as unknown as Meeting);\n\n const id = nested.id || (record.id as string | undefined);\n if (!id || typeof id !== \"string\") {\n throw new Error(\"Meeting response is missing an id\");\n }\n\n return {\n ...nested,\n id,\n title: typeof nested.title === \"string\" ? nested.title : \"Untitled meeting\",\n notes: typeof nested.notes === \"string\" ? nested.notes : nested.notes ?? \"\",\n code: typeof nested.code === \"string\" ? nested.code : undefined,\n startAt:\n typeof nested.startAt === \"string\" ? nested.startAt : new Date().toISOString(),\n durationMin: typeof nested.durationMin === \"number\" ? nested.durationMin : 30,\n timeZone: typeof nested.timeZone === \"string\" ? nested.timeZone : undefined,\n groupId: typeof nested.groupId === \"string\" ? nested.groupId : \"\",\n owner: Boolean(nested.owner),\n canEdit: nested.canEdit !== false,\n canCancel: nested.canCancel !== false,\n organizer: nested.organizer,\n invitees: Array.isArray(nested.invitees) ? nested.invitees : [],\n };\n}\n\nexport class MeetingsApi {\n constructor(private readonly http: HttpClient) {}\n\n async list(): Promise<Meeting[]> {\n const data = await this.http.request<MeetingsListResponse>(\"/api/meetings\", {\n method: \"GET\",\n });\n return (data.meetings ?? []).map(normalizeMeeting);\n }\n\n async create(input: CreateMeetingInput): Promise<Meeting> {\n const body = {\n title: input.title,\n startAt: input.startAt ?? new Date().toISOString(),\n durationMin: input.durationMin ?? 30,\n timeZone:\n input.timeZone ??\n (typeof Intl !== \"undefined\"\n ? Intl.DateTimeFormat().resolvedOptions().timeZone\n : \"UTC\"),\n inviteeIds: input.inviteeIds ?? [],\n ...(input.notes !== undefined ? { notes: input.notes } : {}),\n ...(input.groupId !== undefined ? { groupId: input.groupId } : {}),\n };\n\n const data = await this.http.request<MeetingResponse>(\"/api/meetings\", {\n method: \"POST\",\n body,\n });\n return normalizeMeeting(data.meeting ?? data);\n }\n\n async update(meetingId: string, input: UpdateMeetingInput): Promise<Meeting> {\n const data = await this.http.request<MeetingResponse>(`/api/meetings/${meetingId}`, {\n method: \"PATCH\",\n body: input,\n });\n return normalizeMeeting(data.meeting ?? data);\n }\n\n async cancel(meetingId: string): Promise<void> {\n await this.http.request(`/api/meetings/${meetingId}`, {\n method: \"DELETE\",\n });\n }\n}\n","export class SabhaError extends Error {\n readonly status?: number;\n readonly code?: string;\n readonly details?: unknown;\n\n constructor(\n message: string,\n options?: { status?: number; code?: string; details?: unknown; cause?: unknown },\n ) {\n super(message);\n this.name = \"SabhaError\";\n this.status = options?.status;\n this.code = options?.code;\n this.details = options?.details;\n if (options?.cause !== undefined) {\n (this as Error & { cause?: unknown }).cause = options.cause;\n }\n }\n}\n\nexport function toSabhaError(error: unknown, fallback = \"Sabha request failed\"): SabhaError {\n if (error instanceof SabhaError) return error;\n if (error instanceof Error) {\n return new SabhaError(error.message || fallback, { cause: error });\n }\n return new SabhaError(fallback, { details: error });\n}\n","import { SabhaError } from \"../errors\";\nimport type { SabhaTokens } from \"../types\";\n\nexport type HttpClientOptions = {\n baseUrl: string;\n getOrigin: () => string | undefined;\n getTokens: () => SabhaTokens | null;\n setTokens: (tokens: SabhaTokens | null) => void;\n withCredentials: boolean;\n onUnauthorized?: () => Promise<boolean>;\n /** Capture Set-Cookie `vm_session` outside browsers */\n onSessionCookie?: (cookie: string | null) => void;\n};\n\nexport type RequestOptions = {\n method?: string;\n body?: unknown;\n auth?: boolean;\n headers?: Record<string, string>;\n query?: Record<string, string | number | boolean | undefined | null>;\n};\n\nfunction joinUrl(baseUrl: string, path: string): string {\n const base = baseUrl.replace(/\\/+$/, \"\");\n const suffix = path.startsWith(\"/\") ? path : `/${path}`;\n return `${base}${suffix}`;\n}\n\nfunction buildQuery(query?: RequestOptions[\"query\"]): string {\n if (!query) return \"\";\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null) continue;\n params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `?${qs}` : \"\";\n}\n\nasync function parseBody(response: Response): Promise<unknown> {\n if (response.status === 204) return null;\n const text = await response.text();\n if (!text) return null;\n try {\n return JSON.parse(text) as unknown;\n } catch {\n return text;\n }\n}\n\nfunction messageFromBody(body: unknown, fallback: string): string {\n if (!body || typeof body !== \"object\") return fallback;\n const record = body as Record<string, unknown>;\n if (typeof record.message === \"string\") return record.message;\n if (typeof record.error === \"string\") return record.error;\n return fallback;\n}\n\nfunction readSetCookie(response: Response): string | null {\n // Node fetch / undici may expose getSetCookie(); browsers hide Set-Cookie.\n const anyHeaders = response.headers as Headers & { getSetCookie?: () => string[] };\n const list =\n typeof anyHeaders.getSetCookie === \"function\"\n ? anyHeaders.getSetCookie()\n : (() => {\n const single = response.headers.get(\"set-cookie\");\n return single ? [single] : [];\n })();\n\n for (const entry of list) {\n const match = /(?:^|,\\s*)vm_session=([^;]+)/i.exec(entry);\n if (match?.[1]) return match[1];\n }\n return null;\n}\n\nexport class HttpClient {\n constructor(private readonly options: HttpClientOptions) {}\n\n async request<T = unknown>(path: string, options: RequestOptions = {}): Promise<T> {\n const run = async (retried: boolean): Promise<T> => {\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n ...options.headers,\n };\n\n // Origin is a forbidden browser header; only set for non-browser runtimes.\n const runtime = globalThis as { window?: unknown; document?: unknown };\n const isBrowser =\n typeof runtime.window !== \"undefined\" && typeof runtime.document !== \"undefined\";\n const origin = this.options.getOrigin();\n if (!isBrowser && origin) headers.Origin = origin;\n\n const tokens = this.options.getTokens();\n const needsAuth = options.auth !== false;\n\n if (tokens?.accessToken) {\n headers.Authorization = `Bearer ${tokens.accessToken}`;\n } else if (needsAuth && !this.options.withCredentials && !tokens?.sessionCookie) {\n throw new SabhaError(\n \"Not authenticated. Call login() or pass accessToken/sessionCookie.\",\n { code: \"UNAUTHENTICATED\" },\n );\n }\n\n if (tokens?.sessionCookie) {\n headers.Cookie = `vm_session=${tokens.sessionCookie}`;\n }\n\n if (options.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n\n const response = await fetch(\n `${joinUrl(this.options.baseUrl, path)}${buildQuery(options.query)}`,\n {\n method: options.method ?? (options.body !== undefined ? \"POST\" : \"GET\"),\n headers,\n body: options.body === undefined ? undefined : JSON.stringify(options.body),\n credentials: this.options.withCredentials ? \"include\" : \"same-origin\",\n },\n );\n\n const session = readSetCookie(response);\n if (session) this.options.onSessionCookie?.(session);\n\n const body = await parseBody(response);\n\n if (response.status === 401 && needsAuth && !retried && this.options.onUnauthorized) {\n const refreshed = await this.options.onUnauthorized();\n if (refreshed) return run(true);\n }\n\n if (!response.ok) {\n throw new SabhaError(messageFromBody(body, `HTTP ${response.status}`), {\n status: response.status,\n details: body,\n });\n }\n\n return body as T;\n };\n\n return run(false);\n }\n}\n","import { SabhaError } from \"../errors\";\nimport type { LocalMediaState, MediaPolicy } from \"../types\";\n\ntype MediaListener = (state: LocalMediaState) => void;\n\n/**\n * Local A/V + screen-share controller for web meetings.\n * Publishes MediaStreams the host app can attach to <video>/<audio> elements.\n */\nexport class MediaController {\n private micStream: MediaStream | null = null;\n private camStream: MediaStream | null = null;\n private screenStream: MediaStream | null = null;\n private state: LocalMediaState;\n private readonly listeners = new Set<MediaListener>();\n\n constructor(private policy: MediaPolicy) {\n this.state = {\n audioEnabled: false,\n videoEnabled: false,\n screenSharing: false,\n screenOff: policy.screenOff,\n };\n }\n\n getMediaState(): LocalMediaState {\n return { ...this.state };\n }\n\n getMicrophoneStream(): MediaStream | null {\n return this.micStream;\n }\n\n getCameraStream(): MediaStream | null {\n return this.camStream;\n }\n\n getScreenStream(): MediaStream | null {\n return this.screenStream;\n }\n\n /** Combined local A/V tracks for attaching to a peer connection / video element. */\n getLocalStream(): MediaStream {\n const stream = new MediaStream();\n this.micStream?.getAudioTracks().forEach((t) => stream.addTrack(t));\n if (!this.state.screenOff) {\n this.camStream?.getVideoTracks().forEach((t) => stream.addTrack(t));\n }\n return stream;\n }\n\n onChange(listener: MediaListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n async start(policy?: Partial<MediaPolicy>): Promise<LocalMediaState> {\n if (policy) this.policy = { ...this.policy, ...policy };\n this.state.screenOff = this.policy.screenOff;\n\n if (this.policy.audio) await this.setAudioEnabled(true);\n if (this.policy.video && !this.policy.screenOff) await this.setVideoEnabled(true);\n\n return this.getMediaState();\n }\n\n async setAudioEnabled(enabled: boolean): Promise<LocalMediaState> {\n this.ensureMediaDevices();\n\n if (!enabled) {\n this.micStream?.getTracks().forEach((t) => {\n t.enabled = false;\n t.stop();\n });\n this.micStream = null;\n return this.publish({ audioEnabled: false });\n }\n\n if (!this.micStream) {\n this.micStream = await navigator.mediaDevices.getUserMedia({\n audio: true,\n video: false,\n });\n } else {\n this.micStream.getAudioTracks().forEach((t) => {\n t.enabled = true;\n });\n }\n\n return this.publish({ audioEnabled: true });\n }\n\n async setVideoEnabled(enabled: boolean): Promise<LocalMediaState> {\n this.ensureMediaDevices();\n\n if (!enabled) {\n this.camStream?.getTracks().forEach((t) => {\n t.enabled = false;\n t.stop();\n });\n this.camStream = null;\n return this.publish({ videoEnabled: false });\n }\n\n if (this.state.screenOff) {\n throw new SabhaError(\"Camera is unavailable while screen is off\", {\n code: \"SCREEN_OFF\",\n });\n }\n\n if (!this.camStream) {\n this.camStream = await navigator.mediaDevices.getUserMedia({\n audio: false,\n video: { facingMode: \"user\" },\n });\n } else {\n this.camStream.getVideoTracks().forEach((t) => {\n t.enabled = true;\n });\n }\n\n return this.publish({ videoEnabled: true });\n }\n\n async setScreenOff(off: boolean): Promise<LocalMediaState> {\n if (off) {\n await this.setVideoEnabled(false);\n await this.stopScreenShare();\n return this.publish({ screenOff: true, videoEnabled: false, screenSharing: false });\n }\n this.publish({ screenOff: false });\n if (this.policy.video) await this.setVideoEnabled(true);\n return this.getMediaState();\n }\n\n async startScreenShare(): Promise<LocalMediaState> {\n this.ensureMediaDevices();\n if (!this.policy.allowScreenShare) {\n throw new SabhaError(\"Screen sharing is disabled by media policy\", {\n code: \"SCREEN_SHARE_BLOCKED\",\n });\n }\n if (this.state.screenOff) {\n throw new SabhaError(\"Cannot share screen while screen is off\", {\n code: \"SCREEN_OFF\",\n });\n }\n\n this.screenStream = await navigator.mediaDevices.getDisplayMedia({\n video: true,\n audio: false,\n });\n\n const [track] = this.screenStream.getVideoTracks();\n track?.addEventListener(\"ended\", () => {\n void this.stopScreenShare();\n });\n\n return this.publish({ screenSharing: true });\n }\n\n async stopScreenShare(): Promise<LocalMediaState> {\n this.screenStream?.getTracks().forEach((t) => t.stop());\n this.screenStream = null;\n return this.publish({ screenSharing: false });\n }\n\n async toggleAudio(): Promise<LocalMediaState> {\n return this.setAudioEnabled(!this.state.audioEnabled);\n }\n\n async toggleVideo(): Promise<LocalMediaState> {\n return this.setVideoEnabled(!this.state.videoEnabled);\n }\n\n stopAll(): void {\n this.micStream?.getTracks().forEach((t) => t.stop());\n this.camStream?.getTracks().forEach((t) => t.stop());\n this.screenStream?.getTracks().forEach((t) => t.stop());\n this.micStream = null;\n this.camStream = null;\n this.screenStream = null;\n this.publish({\n audioEnabled: false,\n videoEnabled: false,\n screenSharing: false,\n });\n }\n\n private publish(patch: Partial<LocalMediaState>): LocalMediaState {\n this.state = { ...this.state, ...patch };\n const snapshot = this.getMediaState();\n for (const listener of this.listeners) listener(snapshot);\n return snapshot;\n }\n\n private ensureMediaDevices(): void {\n if (typeof navigator === \"undefined\" || !navigator.mediaDevices?.getUserMedia) {\n throw new SabhaError(\"Media devices are not available in this environment\", {\n code: \"MEDIA_UNAVAILABLE\",\n });\n }\n }\n}\n","import type { MediaPolicy } from \"../types\";\n\nexport type CaptureAttemptType = \"screenshot\" | \"recording\" | \"visibility\";\n\ntype CaptureListener = (event: {\n type: CaptureAttemptType;\n at: string;\n}) => void;\n\n/**\n * Best-effort web protections against screenshots / screen recording.\n * Browsers cannot fully block OS-level capture; this layer deters casual capture\n * and notifies the host app so it can blank the UI or end the meeting.\n */\nexport class ContentProtection {\n private enabled = false;\n private readonly listeners = new Set<CaptureListener>();\n private cleanups: Array<() => void> = [];\n private styleEl: HTMLStyleElement | null = null;\n\n constructor(private policy: Pick<MediaPolicy, \"blockScreenshots\" | \"blockScreenRecording\">) {}\n\n onCaptureAttempt(listener: CaptureListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n setPolicy(policy: Pick<MediaPolicy, \"blockScreenshots\" | \"blockScreenRecording\">): void {\n this.policy = policy;\n if (this.enabled) {\n this.disable();\n this.enable();\n }\n }\n\n enable(): void {\n if (typeof document === \"undefined\" || this.enabled) return;\n if (!this.policy.blockScreenshots && !this.policy.blockScreenRecording) return;\n\n this.enabled = true;\n this.injectStyles();\n this.bindGuards();\n }\n\n disable(): void {\n if (!this.enabled) return;\n this.enabled = false;\n for (const off of this.cleanups) off();\n this.cleanups = [];\n this.styleEl?.remove();\n this.styleEl = null;\n document.documentElement.classList.remove(\"sabha-content-protected\");\n }\n\n private injectStyles(): void {\n const style = document.createElement(\"style\");\n style.setAttribute(\"data-sabha-content-protection\", \"true\");\n style.textContent = `\n html.sabha-content-protected,\n html.sabha-content-protected body {\n -webkit-user-select: none !important;\n user-select: none !important;\n }\n html.sabha-content-protected video,\n html.sabha-content-protected canvas {\n -webkit-user-select: none !important;\n user-select: none !important;\n pointer-events: auto;\n }\n html.sabha-content-protected.sabha-capture-obscured body::after {\n content: \"\";\n position: fixed;\n inset: 0;\n background: #000;\n z-index: 2147483647;\n pointer-events: none;\n }\n `;\n document.head.appendChild(style);\n document.documentElement.classList.add(\"sabha-content-protected\");\n this.styleEl = style;\n }\n\n private bindGuards(): void {\n const onContextMenu = (event: Event) => {\n if (!this.policy.blockScreenshots) return;\n event.preventDefault();\n };\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!this.policy.blockScreenshots) return;\n const key = event.key?.toLowerCase?.() ?? \"\";\n const isPrintScreen = key === \"printscreen\";\n const isMacShot =\n (event.metaKey || event.shiftKey) &&\n (key === \"3\" || key === \"4\" || key === \"5\" || key === \"6\");\n if (isPrintScreen || isMacShot) {\n event.preventDefault();\n this.obscureBriefly();\n this.emit(\"screenshot\");\n }\n };\n\n const onVisibility = () => {\n if (document.visibilityState === \"hidden\") {\n if (this.policy.blockScreenRecording || this.policy.blockScreenshots) {\n document.documentElement.classList.add(\"sabha-capture-obscured\");\n this.emit(\"visibility\");\n }\n } else {\n document.documentElement.classList.remove(\"sabha-capture-obscured\");\n }\n };\n\n const onBlur = () => {\n if (this.policy.blockScreenshots) {\n document.documentElement.classList.add(\"sabha-capture-obscured\");\n this.emit(\"screenshot\");\n }\n };\n\n const onFocus = () => {\n document.documentElement.classList.remove(\"sabha-capture-obscured\");\n };\n\n // Detect getDisplayMedia usage against this tab when recording restriction is on.\n const originalGetDisplayMedia = navigator.mediaDevices?.getDisplayMedia?.bind(\n navigator.mediaDevices,\n );\n if (originalGetDisplayMedia && this.policy.blockScreenRecording) {\n navigator.mediaDevices.getDisplayMedia = async (_constraints) => {\n this.emit(\"recording\");\n this.obscureBriefly();\n throw new DOMException(\n \"Screen recording is blocked by Sabha meeting policy\",\n \"NotAllowedError\",\n );\n };\n this.cleanups.push(() => {\n if (navigator.mediaDevices && originalGetDisplayMedia) {\n navigator.mediaDevices.getDisplayMedia = originalGetDisplayMedia;\n }\n });\n }\n\n document.addEventListener(\"contextmenu\", onContextMenu, true);\n document.addEventListener(\"keydown\", onKeyDown, true);\n document.addEventListener(\"visibilitychange\", onVisibility);\n window.addEventListener(\"blur\", onBlur);\n window.addEventListener(\"focus\", onFocus);\n\n this.cleanups.push(\n () => document.removeEventListener(\"contextmenu\", onContextMenu, true),\n () => document.removeEventListener(\"keydown\", onKeyDown, true),\n () => document.removeEventListener(\"visibilitychange\", onVisibility),\n () => window.removeEventListener(\"blur\", onBlur),\n () => window.removeEventListener(\"focus\", onFocus),\n () => document.documentElement.classList.remove(\"sabha-capture-obscured\"),\n );\n }\n\n private obscureBriefly(): void {\n document.documentElement.classList.add(\"sabha-capture-obscured\");\n window.setTimeout(() => {\n document.documentElement.classList.remove(\"sabha-capture-obscured\");\n }, 1500);\n }\n\n private emit(type: CaptureAttemptType): void {\n const payload = { type, at: new Date().toISOString() };\n for (const listener of this.listeners) listener(payload);\n }\n}\n","export type SabhaTokens = {\n /** Optional bearer token (Postman-style). Live API primarily uses `vm_session` cookie. */\n accessToken?: string;\n refreshToken?: string;\n /** Session cookie value when running outside the browser (Node / RN). */\n sessionCookie?: string;\n};\n\nexport type SabhaConfig = {\n /** Sabha API base URL */\n baseUrl?: string;\n /**\n * Origin for auth CORS allow-list (server-side / RN).\n * Browsers set Origin automatically; still useful for documentation.\n */\n origin?: string;\n /** Optional bearer access token */\n accessToken?: string;\n refreshToken?: string;\n /** Persist/reuse `vm_session` outside the browser */\n sessionCookie?: string;\n /** Send cookies (`credentials: \"include\"`). Default true. */\n withCredentials?: boolean;\n socketPath?: string;\n socketEvents?: Partial<SabhaSocketEvents>;\n /**\n * Meeting media / capture policy applied when connecting.\n * Defaults enable mic+cam and block screenshots/recordings where possible.\n */\n mediaPolicy?: Partial<MediaPolicy>;\n};\n\nexport const DEFAULT_BASE_URL = \"https://sabha-api.sthanave.com\";\n\nexport type SabhaSocketEvents = {\n join: string;\n leave: string;\n participantJoined: string;\n participantLeft: string;\n meetingEnded: string;\n error: string;\n mediaState: string;\n};\n\nexport type SabhaOrg = {\n id: string;\n name: string;\n suspended: boolean;\n};\n\n/** Shape returned by POST /api/auth/login and GET /api/auth/me */\nexport type AuthUser = {\n ok?: boolean;\n userId: string;\n username: string;\n email: string;\n about?: string;\n photo?: string;\n lat?: number | null;\n lng?: number | null;\n termsAccepted?: boolean;\n role?: string;\n jobTitle?: string;\n permissions?: string[];\n platformRole?: string | null;\n platformAccess?: boolean;\n org?: SabhaOrg | null;\n pendingApproval?: unknown;\n /** Present when API returns JWT-style auth */\n token?: string;\n refreshToken?: string;\n [key: string]: unknown;\n};\n\nexport type LoginInput = {\n email: string;\n password: string;\n};\n\nexport type RegisterInput = {\n email: string;\n password: string;\n username: string;\n acceptTerms: boolean;\n};\n\nexport type VerifyEmailInput = {\n email: string;\n code: string;\n};\n\nexport type AuthSession = {\n user: AuthUser;\n accessToken?: string;\n refreshToken?: string;\n sessionCookie?: string;\n};\n\nexport type MeetingOrganizer = {\n id: string;\n username: string;\n photo?: string;\n online?: boolean;\n lastActive?: string;\n};\n\nexport type MeetingInvitee = {\n id: string;\n username?: string;\n photo?: string;\n [key: string]: unknown;\n};\n\n/** Shape returned under `meeting` / `meetings[]` from /api/meetings */\nexport type Meeting = {\n id: string;\n title: string;\n notes?: string;\n /** Join code, e.g. `rxv-scpd-ppe` */\n code?: string;\n startAt: string;\n durationMin: number;\n timeZone?: string;\n groupId?: string;\n owner?: boolean;\n canEdit?: boolean;\n canCancel?: boolean;\n organizer?: MeetingOrganizer;\n invitees?: MeetingInvitee[];\n inviteeIds?: string[];\n [key: string]: unknown;\n};\n\nexport type CreateMeetingInput = {\n title: string;\n startAt?: string;\n durationMin?: number;\n timeZone?: string;\n inviteeIds?: string[];\n notes?: string;\n groupId?: string;\n};\n\nexport type UpdateMeetingInput = {\n title?: string;\n startAt?: string;\n durationMin?: number;\n timeZone?: string;\n inviteeIds?: string[];\n notes?: string;\n [key: string]: unknown;\n};\n\nexport type MeetingConnectionState =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"joined\"\n | \"error\";\n\nexport type MeetingParticipant = {\n id: string;\n displayName?: string;\n username?: string;\n audioEnabled?: boolean;\n videoEnabled?: boolean;\n screenSharing?: boolean;\n [key: string]: unknown;\n};\n\nexport type MediaTrackKind = \"audio\" | \"video\" | \"screen\";\n\nexport type LocalMediaState = {\n audioEnabled: boolean;\n videoEnabled: boolean;\n screenSharing: boolean;\n screenOff: boolean;\n};\n\nexport type MediaPolicy = {\n /** Start with microphone enabled */\n audio: boolean;\n /** Start with camera enabled */\n video: boolean;\n /** Allow screen sharing */\n allowScreenShare: boolean;\n /** Soft “screen off” — stop publishing camera/screen locally */\n screenOff: boolean;\n /** Block screenshots / screen recording where the platform allows */\n blockScreenshots: boolean;\n /** Block OS / in-app screen recording where the platform allows */\n blockScreenRecording: boolean;\n};\n\nexport const DEFAULT_MEDIA_POLICY: MediaPolicy = {\n audio: true,\n video: true,\n allowScreenShare: true,\n screenOff: false,\n blockScreenshots: true,\n blockScreenRecording: true,\n};\n\nexport type MeetingRoomEventMap = {\n state: MeetingConnectionState;\n participantJoined: MeetingParticipant;\n participantLeft: { id: string };\n meetingEnded: { meetingId: string; reason?: string };\n mediaState: LocalMediaState;\n captureAttempt: { type: \"screenshot\" | \"recording\" | \"visibility\"; at: string };\n error: Error;\n raw: { event: string; payload: unknown };\n};\n","import { io, type Socket } from \"socket.io-client\";\nimport { SabhaError } from \"../errors\";\nimport { MediaController } from \"../media/MediaController\";\nimport { ContentProtection } from \"../security/ContentProtection\";\nimport type {\n LocalMediaState,\n MediaPolicy,\n MeetingConnectionState,\n MeetingParticipant,\n MeetingRoomEventMap,\n SabhaSocketEvents,\n} from \"../types\";\nimport { DEFAULT_MEDIA_POLICY } from \"../types\";\n\ntype Listener<T> = (payload: T) => void;\n\nconst DEFAULT_EVENTS: SabhaSocketEvents = {\n join: \"meeting:join\",\n leave: \"meeting:leave\",\n participantJoined: \"meeting:participant-joined\",\n participantLeft: \"meeting:participant-left\",\n meetingEnded: \"meeting:ended\",\n error: \"meeting:error\",\n mediaState: \"meeting:media-state\",\n};\n\nexport type MeetingConnectionOptions = {\n baseUrl: string;\n meetingId: string;\n accessToken?: string;\n sessionCookie?: string;\n withCredentials?: boolean;\n socketPath?: string;\n events?: Partial<SabhaSocketEvents>;\n mediaPolicy?: Partial<MediaPolicy>;\n};\n\nexport class MeetingConnection {\n private socket: Socket | null = null;\n private state: MeetingConnectionState = \"disconnected\";\n private readonly events: SabhaSocketEvents;\n private readonly mediaPolicy: MediaPolicy;\n readonly media: MediaController;\n readonly protection: ContentProtection;\n private readonly listeners = new Map<\n keyof MeetingRoomEventMap,\n Set<Listener<MeetingRoomEventMap[keyof MeetingRoomEventMap]>>\n >();\n private mediaUnsub: (() => void) | null = null;\n private captureUnsub: (() => void) | null = null;\n\n constructor(private readonly options: MeetingConnectionOptions) {\n this.events = { ...DEFAULT_EVENTS, ...options.events };\n this.mediaPolicy = { ...DEFAULT_MEDIA_POLICY, ...options.mediaPolicy };\n this.media = new MediaController(this.mediaPolicy);\n this.protection = new ContentProtection(this.mediaPolicy);\n }\n\n get meetingId(): string {\n return this.options.meetingId;\n }\n\n get connectionState(): MeetingConnectionState {\n return this.state;\n }\n\n getMediaState(): LocalMediaState {\n return this.media.getMediaState();\n }\n\n on<K extends keyof MeetingRoomEventMap>(\n event: K,\n listener: Listener<MeetingRoomEventMap[K]>,\n ): () => void {\n const set = this.listeners.get(event) ?? new Set();\n set.add(listener as Listener<MeetingRoomEventMap[keyof MeetingRoomEventMap]>);\n this.listeners.set(event, set);\n return () => {\n set.delete(listener as Listener<MeetingRoomEventMap[keyof MeetingRoomEventMap]>);\n };\n }\n\n async connect(): Promise<void> {\n if (this.socket?.connected) {\n await this.join();\n return;\n }\n\n this.setState(\"connecting\");\n\n await new Promise<void>((resolve, reject) => {\n const auth: Record<string, string> = {};\n if (this.options.accessToken) auth.token = this.options.accessToken;\n if (this.options.sessionCookie) auth.session = this.options.sessionCookie;\n\n const extraHeaders: Record<string, string> = {};\n if (this.options.accessToken) {\n extraHeaders.Authorization = `Bearer ${this.options.accessToken}`;\n }\n if (this.options.sessionCookie) {\n extraHeaders.Cookie = `vm_session=${this.options.sessionCookie}`;\n }\n\n const socket = io(this.options.baseUrl, {\n path: this.options.socketPath,\n transports: [\"websocket\", \"polling\"],\n withCredentials: this.options.withCredentials !== false,\n auth,\n extraHeaders,\n autoConnect: true,\n });\n\n this.socket = socket;\n\n const onConnect = () => {\n cleanup();\n this.setState(\"connected\");\n this.bindServerEvents(socket);\n this.join()\n .then(async () => {\n this.protection.enable();\n this.mediaUnsub = this.media.onChange((mediaState) => {\n this.emit(\"mediaState\", mediaState);\n socket.emit(this.events.mediaState, {\n meetingId: this.options.meetingId,\n ...mediaState,\n });\n });\n this.captureUnsub = this.protection.onCaptureAttempt((event) => {\n this.emit(\"captureAttempt\", event);\n });\n await this.media.start(this.mediaPolicy);\n resolve();\n })\n .catch(reject);\n };\n\n const onError = (error: Error) => {\n cleanup();\n this.setState(\"error\");\n this.emit(\"error\", error);\n reject(\n new SabhaError(error.message || \"Failed to connect to Sabha meetings\", {\n code: \"SOCKET_CONNECT_FAILED\",\n cause: error,\n }),\n );\n };\n\n const cleanup = () => {\n socket.off(\"connect\", onConnect);\n socket.off(\"connect_error\", onError);\n };\n\n socket.on(\"connect\", onConnect);\n socket.on(\"connect_error\", onError);\n });\n }\n\n async setAudioEnabled(enabled: boolean): Promise<LocalMediaState> {\n return this.media.setAudioEnabled(enabled);\n }\n\n async setVideoEnabled(enabled: boolean): Promise<LocalMediaState> {\n return this.media.setVideoEnabled(enabled);\n }\n\n async setScreenOff(off: boolean): Promise<LocalMediaState> {\n return this.media.setScreenOff(off);\n }\n\n async startScreenShare(): Promise<LocalMediaState> {\n return this.media.startScreenShare();\n }\n\n async stopScreenShare(): Promise<LocalMediaState> {\n return this.media.stopScreenShare();\n }\n\n async leave(): Promise<void> {\n const socket = this.socket;\n this.teardownMedia();\n if (!socket) return;\n\n await new Promise<void>((resolve) => {\n socket.timeout(5000).emit(\n this.events.leave,\n { meetingId: this.options.meetingId },\n () => resolve(),\n );\n setTimeout(() => resolve(), 500);\n });\n\n socket.disconnect();\n this.socket = null;\n this.setState(\"disconnected\");\n }\n\n disconnect(): void {\n this.teardownMedia();\n this.socket?.disconnect();\n this.socket = null;\n this.setState(\"disconnected\");\n }\n\n emitRaw(event: string, payload?: unknown): void {\n if (!this.socket?.connected) {\n throw new SabhaError(\"Meeting socket is not connected\", {\n code: \"SOCKET_NOT_CONNECTED\",\n });\n }\n this.socket.emit(event, payload);\n }\n\n private teardownMedia(): void {\n this.mediaUnsub?.();\n this.captureUnsub?.();\n this.mediaUnsub = null;\n this.captureUnsub = null;\n this.media.stopAll();\n this.protection.disable();\n }\n\n private async join(): Promise<void> {\n const socket = this.socket;\n if (!socket?.connected) {\n throw new SabhaError(\"Meeting socket is not connected\", {\n code: \"SOCKET_NOT_CONNECTED\",\n });\n }\n\n await new Promise<void>((resolve) => {\n let settled = false;\n const done = () => {\n if (settled) return;\n settled = true;\n this.setState(\"joined\");\n resolve();\n };\n\n socket.timeout(5000).emit(\n this.events.join,\n { meetingId: this.options.meetingId },\n () => done(),\n );\n setTimeout(done, 600);\n });\n }\n\n private bindServerEvents(socket: Socket): void {\n socket.on(this.events.participantJoined, (payload: MeetingParticipant) => {\n this.emit(\"participantJoined\", payload);\n this.emit(\"raw\", { event: this.events.participantJoined, payload });\n });\n\n socket.on(this.events.participantLeft, (payload: { id: string }) => {\n this.emit(\"participantLeft\", payload);\n this.emit(\"raw\", { event: this.events.participantLeft, payload });\n });\n\n socket.on(\n this.events.meetingEnded,\n (payload: { meetingId?: string; reason?: string }) => {\n this.emit(\"meetingEnded\", {\n meetingId: payload.meetingId ?? this.options.meetingId,\n reason: payload.reason,\n });\n this.emit(\"raw\", { event: this.events.meetingEnded, payload });\n this.setState(\"disconnected\");\n },\n );\n\n socket.on(this.events.error, (payload: unknown) => {\n const message =\n payload && typeof payload === \"object\" && \"message\" in payload\n ? String((payload as { message: unknown }).message)\n : \"Meeting socket error\";\n const error = new SabhaError(message, {\n details: payload,\n code: \"MEETING_SOCKET_ERROR\",\n });\n this.emit(\"error\", error);\n this.emit(\"raw\", { event: this.events.error, payload });\n });\n\n socket.on(\"disconnect\", () => {\n this.setState(\"disconnected\");\n });\n }\n\n private setState(state: MeetingConnectionState): void {\n this.state = state;\n this.emit(\"state\", state);\n }\n\n private emit<K extends keyof MeetingRoomEventMap>(\n event: K,\n payload: MeetingRoomEventMap[K],\n ): void {\n const set = this.listeners.get(event);\n if (!set) return;\n for (const listener of set) listener(payload);\n }\n}\n","import { AuthApi } from \"./api/auth\";\nimport { MeetingsApi } from \"./api/meetings\";\nimport { SabhaError, toSabhaError } from \"./errors\";\nimport { HttpClient } from \"./http/client\";\nimport { MeetingConnection } from \"./realtime/MeetingConnection\";\nimport type {\n AuthSession,\n AuthUser,\n CreateMeetingInput,\n LoginInput,\n MediaPolicy,\n Meeting,\n RegisterInput,\n SabhaConfig,\n SabhaTokens,\n UpdateMeetingInput,\n VerifyEmailInput,\n} from \"./types\";\nimport { DEFAULT_BASE_URL, DEFAULT_MEDIA_POLICY } from \"./types\";\n\nexport type SabhaClientStatus = {\n configured: boolean;\n authenticated: boolean;\n baseUrl: string;\n};\n\nexport class SabhaClient {\n private config: SabhaConfig = { baseUrl: DEFAULT_BASE_URL };\n private tokens: SabhaTokens | null = null;\n private user: AuthUser | null = null;\n private http: HttpClient | null = null;\n private authApi: AuthApi | null = null;\n private meetingsApi: MeetingsApi | null = null;\n private activeConnection: MeetingConnection | null = null;\n private refreshPromise: Promise<boolean> | null = null;\n private mediaPolicy: MediaPolicy = { ...DEFAULT_MEDIA_POLICY };\n\n configure(config: SabhaConfig = {}): this {\n const baseUrl = (config.baseUrl ?? this.config.baseUrl ?? DEFAULT_BASE_URL).replace(\n /\\/+$/,\n \"\",\n );\n\n this.config = {\n withCredentials: true,\n ...this.config,\n ...config,\n baseUrl,\n };\n\n this.mediaPolicy = {\n ...DEFAULT_MEDIA_POLICY,\n ...this.config.mediaPolicy,\n };\n\n this.tokens = {\n accessToken: config.accessToken ?? this.tokens?.accessToken,\n refreshToken: config.refreshToken ?? this.tokens?.refreshToken,\n sessionCookie: config.sessionCookie ?? this.tokens?.sessionCookie,\n };\n\n if (\n !this.tokens.accessToken &&\n !this.tokens.sessionCookie &&\n !this.tokens.refreshToken\n ) {\n // keep null when completely empty so status reads cleanly\n if (!config.accessToken && !config.sessionCookie && !config.refreshToken) {\n // leave existing tokens if any\n }\n }\n\n const hasAnyToken = Boolean(\n this.tokens.accessToken || this.tokens.sessionCookie || this.tokens.refreshToken,\n );\n if (!hasAnyToken) this.tokens = null;\n\n this.http = new HttpClient({\n baseUrl,\n withCredentials: this.config.withCredentials !== false,\n getOrigin: () => this.getOrigin(),\n getTokens: () => this.tokens,\n setTokens: (tokens) => {\n this.tokens = tokens;\n },\n onSessionCookie: (cookie) => {\n this.tokens = {\n ...(this.tokens ?? {}),\n sessionCookie: cookie ?? undefined,\n };\n },\n onUnauthorized: () => this.tryRefresh(),\n });\n this.authApi = new AuthApi(this.http, () => this.tokens?.sessionCookie);\n this.meetingsApi = new MeetingsApi(this.http);\n return this;\n }\n\n getStatus(): SabhaClientStatus {\n const configured = Boolean(this.http && this.config.baseUrl);\n const authenticated = Boolean(\n this.tokens?.accessToken ||\n this.tokens?.sessionCookie ||\n (this.config.withCredentials !== false && this.user),\n );\n return {\n configured,\n authenticated: authenticated || Boolean(this.user),\n baseUrl: this.config.baseUrl ?? DEFAULT_BASE_URL,\n };\n }\n\n getAccessToken(): string | null {\n return this.tokens?.accessToken ?? null;\n }\n\n getSessionCookie(): string | null {\n return this.tokens?.sessionCookie ?? null;\n }\n\n getUser(): AuthUser | null {\n return this.user;\n }\n\n getMediaPolicy(): MediaPolicy {\n return { ...this.mediaPolicy };\n }\n\n setMediaPolicy(policy: Partial<MediaPolicy>): void {\n this.mediaPolicy = { ...this.mediaPolicy, ...policy };\n this.config.mediaPolicy = this.mediaPolicy;\n }\n\n setTokens(tokens: SabhaTokens): void {\n this.ensureConfigured();\n this.tokens = tokens;\n }\n\n clearSession(): void {\n this.tokens = null;\n this.user = null;\n this.activeConnection?.disconnect();\n this.activeConnection = null;\n }\n\n async login(input: LoginInput): Promise<AuthSession> {\n const session = await this.auth().login(input);\n this.applySession(session);\n\n // Live API must establish HttpOnly `vm_session` (or return a token).\n // Login can return user JSON with ok:true while still leaving you signed out.\n try {\n const me = await this.auth().me();\n this.user = me;\n session.user = me;\n } catch (error) {\n this.clearSession();\n throw new SabhaError(\n \"Login returned a user profile but no Sabha session was established. \" +\n \"The API did not set `vm_session` (and no JWT token was returned), so \" +\n \"POST /api/meetings will return 401 Sign in first. Fix session cookies \" +\n \"on sabha-api (Set-Cookie: vm_session; SameSite=None; Secure for cross-origin) \" +\n \"or return a bearer token from /api/auth/login.\",\n {\n code: \"SESSION_NOT_ESTABLISHED\",\n status: 401,\n cause: error,\n },\n );\n }\n\n return session;\n }\n\n /** Throws if /api/auth/me fails — call before create/start meeting. */\n async ensureAuthenticated(): Promise<AuthUser> {\n try {\n return await this.me();\n } catch (error) {\n throw new SabhaError(\n \"Not signed in to Sabha. Call login() first, and ensure the `vm_session` cookie \" +\n \"is sent (credentials: 'include', CORS allow-credentials, allow-listed Origin).\",\n {\n code: \"UNAUTHENTICATED\",\n status: 401,\n cause: error,\n },\n );\n }\n }\n\n async register(input: RegisterInput): Promise<unknown> {\n return this.auth().register(input);\n }\n\n async verifyEmail(input: VerifyEmailInput): Promise<AuthSession> {\n const session = await this.auth().verifyEmail(input);\n this.applySession(session);\n return session;\n }\n\n async refreshSession(): Promise<SabhaTokens> {\n const refreshToken = this.tokens?.refreshToken;\n if (!refreshToken) {\n throw new SabhaError(\"No refresh token available\", { code: \"NO_REFRESH_TOKEN\" });\n }\n const tokens = await this.auth().refresh(refreshToken);\n this.tokens = { ...(this.tokens ?? {}), ...tokens };\n return tokens;\n }\n\n async me(): Promise<AuthUser> {\n const user = await this.auth().me();\n this.user = user;\n return user;\n }\n\n async logout(): Promise<void> {\n try {\n if (this.user || this.tokens) {\n await this.auth().logout(this.tokens?.refreshToken);\n }\n } finally {\n this.clearSession();\n }\n }\n\n async listMeetings(): Promise<Meeting[]> {\n return this.meetings().list();\n }\n\n async createMeeting(input: CreateMeetingInput): Promise<Meeting> {\n await this.ensureAuthenticated();\n return this.meetings().create(input);\n }\n\n async updateMeeting(meetingId: string, input: UpdateMeetingInput): Promise<Meeting> {\n return this.meetings().update(meetingId, input);\n }\n\n async cancelMeeting(meetingId: string): Promise<void> {\n await this.meetings().cancel(meetingId);\n if (this.activeConnection?.meetingId === meetingId) {\n this.activeConnection.disconnect();\n this.activeConnection = null;\n }\n }\n\n async startMeeting(\n input?: CreateMeetingInput & { meetingId?: string },\n ): Promise<{ meeting: Meeting; connection: MeetingConnection }> {\n await this.ensureAuthenticated();\n\n let meeting: Meeting;\n\n if (input?.meetingId) {\n const existing = (await this.listMeetings()).find((m) => m.id === input.meetingId);\n meeting =\n existing ??\n ({\n id: input.meetingId,\n title: input.title ?? \"Meeting\",\n startAt: new Date().toISOString(),\n durationMin: input.durationMin ?? 30,\n } satisfies Meeting);\n } else {\n meeting = await this.meetings().create({\n title: input?.title ?? \"Sabha Meeting\",\n startAt: input?.startAt,\n durationMin: input?.durationMin,\n timeZone: input?.timeZone,\n inviteeIds: input?.inviteeIds,\n notes: input?.notes,\n groupId: input?.groupId,\n });\n }\n\n const connection = await this.connect(meeting.id);\n return { meeting, connection };\n }\n\n async connect(meetingId: string): Promise<MeetingConnection> {\n this.ensureConfigured();\n\n if (this.activeConnection) {\n this.activeConnection.disconnect();\n this.activeConnection = null;\n }\n\n const connection = new MeetingConnection({\n baseUrl: this.config.baseUrl ?? DEFAULT_BASE_URL,\n meetingId,\n accessToken: this.tokens?.accessToken,\n sessionCookie: this.tokens?.sessionCookie,\n withCredentials: this.config.withCredentials !== false,\n socketPath: this.config.socketPath,\n events: this.config.socketEvents,\n mediaPolicy: this.mediaPolicy,\n });\n\n try {\n await connection.connect();\n this.activeConnection = connection;\n return connection;\n } catch (error) {\n connection.disconnect();\n throw toSabhaError(error, \"Failed to connect to Sabha meeting\");\n }\n }\n\n getConnection(): MeetingConnection | null {\n return this.activeConnection;\n }\n\n async leaveMeeting(): Promise<void> {\n if (!this.activeConnection) return;\n await this.activeConnection.leave();\n this.activeConnection = null;\n }\n\n private applySession(session: AuthSession): void {\n this.user = session.user;\n this.tokens = {\n accessToken: session.accessToken ?? this.tokens?.accessToken,\n refreshToken: session.refreshToken ?? this.tokens?.refreshToken,\n sessionCookie: session.sessionCookie ?? this.tokens?.sessionCookie,\n };\n }\n\n private async tryRefresh(): Promise<boolean> {\n if (!this.tokens?.refreshToken) return false;\n if (this.refreshPromise) return this.refreshPromise;\n\n this.refreshPromise = (async () => {\n try {\n await this.refreshSession();\n return true;\n } catch {\n return false;\n } finally {\n this.refreshPromise = null;\n }\n })();\n\n return this.refreshPromise;\n }\n\n private getOrigin(): string | undefined {\n if (this.config.origin) return this.config.origin;\n const win = (globalThis as { window?: { location?: { origin?: string } } }).window;\n if (win?.location?.origin) return win.location.origin;\n return undefined;\n }\n\n private ensureConfigured(): void {\n if (!this.http || !this.authApi || !this.meetingsApi) {\n this.configure(this.config);\n }\n if (!this.http || !this.authApi || !this.meetingsApi) {\n throw new SabhaError(\"Sabha client failed to configure\", {\n code: \"NOT_CONFIGURED\",\n });\n }\n }\n\n private auth(): AuthApi {\n this.ensureConfigured();\n return this.authApi!;\n }\n\n private meetings(): MeetingsApi {\n this.ensureConfigured();\n return this.meetingsApi!;\n }\n}\n\nexport function createSabhaClient(config?: SabhaConfig): SabhaClient {\n const client = new SabhaClient();\n client.configure(config ?? { baseUrl: DEFAULT_BASE_URL });\n return client;\n}\n","import { createContext } from \"react\";\nimport type { SabhaClient } from \"../SabhaClient\";\nimport type { MeetingConnection } from \"../realtime/MeetingConnection\";\nimport type {\n AuthUser,\n LocalMediaState,\n Meeting,\n MeetingConnectionState,\n} from \"../types\";\n\nexport type SabhaContextValue = {\n client: SabhaClient;\n ready: boolean;\n authenticated: boolean;\n user: AuthUser | null;\n meetings: Meeting[];\n meetingsLoading: boolean;\n connection: MeetingConnection | null;\n connectionState: MeetingConnectionState;\n mediaState: LocalMediaState;\n error: Error | null;\n refreshMeetings: () => Promise<Meeting[]>;\n createMeeting: SabhaClient[\"createMeeting\"];\n updateMeeting: SabhaClient[\"updateMeeting\"];\n cancelMeeting: SabhaClient[\"cancelMeeting\"];\n startMeeting: SabhaClient[\"startMeeting\"];\n connect: SabhaClient[\"connect\"];\n leaveMeeting: SabhaClient[\"leaveMeeting\"];\n login: SabhaClient[\"login\"];\n logout: SabhaClient[\"logout\"];\n setAudioEnabled: (enabled: boolean) => Promise<LocalMediaState>;\n setVideoEnabled: (enabled: boolean) => Promise<LocalMediaState>;\n setScreenOff: (off: boolean) => Promise<LocalMediaState>;\n startScreenShare: () => Promise<LocalMediaState>;\n stopScreenShare: () => Promise<LocalMediaState>;\n clearError: () => void;\n};\n\nexport const SabhaContext = createContext<SabhaContextValue | null>(null);\n","import {\n useCallback,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\nimport { createSabhaClient, type SabhaClient } from \"../SabhaClient\";\nimport type { MeetingConnection } from \"../realtime/MeetingConnection\";\nimport type {\n AuthUser,\n CreateMeetingInput,\n LocalMediaState,\n LoginInput,\n Meeting,\n MeetingConnectionState,\n SabhaConfig,\n UpdateMeetingInput,\n} from \"../types\";\nimport { DEFAULT_BASE_URL } from \"../types\";\nimport { SabhaContext, type SabhaContextValue } from \"./SabhaContext\";\n\nexport type SabhaProviderProps = SabhaConfig & {\n children: ReactNode;\n client?: SabhaClient;\n autoLoadMeetings?: boolean;\n};\n\nconst idleMedia: LocalMediaState = {\n audioEnabled: false,\n videoEnabled: false,\n screenSharing: false,\n screenOff: false,\n};\n\nexport function SabhaProvider({\n children,\n client: clientProp,\n autoLoadMeetings = true,\n ...config\n}: SabhaProviderProps) {\n const resolvedConfig: SabhaConfig = {\n baseUrl: DEFAULT_BASE_URL,\n withCredentials: true,\n ...config,\n };\n\n const client = useMemo(\n () => clientProp ?? createSabhaClient(resolvedConfig),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [\n clientProp,\n resolvedConfig.baseUrl,\n resolvedConfig.accessToken,\n resolvedConfig.sessionCookie,\n resolvedConfig.origin,\n ],\n );\n\n const [ready, setReady] = useState(false);\n const [authenticated, setAuthenticated] = useState(false);\n const [user, setUser] = useState<AuthUser | null>(null);\n const [meetings, setMeetings] = useState<Meeting[]>([]);\n const [meetingsLoading, setMeetingsLoading] = useState(false);\n const [connection, setConnection] = useState<MeetingConnection | null>(null);\n const [connectionState, setConnectionState] =\n useState<MeetingConnectionState>(\"disconnected\");\n const [mediaState, setMediaState] = useState<LocalMediaState>(idleMedia);\n const [error, setError] = useState<Error | null>(null);\n\n useEffect(() => {\n client.configure(resolvedConfig);\n setAuthenticated(client.getStatus().authenticated);\n setUser(client.getUser());\n setReady(true);\n }, [\n client,\n resolvedConfig.baseUrl,\n resolvedConfig.accessToken,\n resolvedConfig.sessionCookie,\n resolvedConfig.origin,\n resolvedConfig.withCredentials,\n ]);\n\n useEffect(() => {\n if (!connection) {\n setConnectionState(\"disconnected\");\n setMediaState(idleMedia);\n return;\n }\n setConnectionState(connection.connectionState);\n setMediaState(connection.getMediaState());\n const offState = connection.on(\"state\", setConnectionState);\n const offMedia = connection.on(\"mediaState\", setMediaState);\n return () => {\n offState();\n offMedia();\n };\n }, [connection]);\n\n const refreshMeetings = useCallback(async () => {\n setMeetingsLoading(true);\n setError(null);\n try {\n const list = await client.listMeetings();\n setMeetings(list);\n setAuthenticated(true);\n return list;\n } catch (err) {\n const next = err instanceof Error ? err : new Error(\"Failed to load meetings\");\n setError(next);\n throw next;\n } finally {\n setMeetingsLoading(false);\n }\n }, [client]);\n\n useEffect(() => {\n if (!ready || !autoLoadMeetings) return;\n void client\n .me()\n .then((me) => {\n setUser(me);\n setAuthenticated(true);\n return refreshMeetings();\n })\n .catch(() => {\n /* not logged in yet */\n });\n }, [ready, autoLoadMeetings, client, refreshMeetings]);\n\n const createMeeting = useCallback(\n async (input: CreateMeetingInput) => {\n setError(null);\n try {\n const meeting = await client.createMeeting(input);\n setMeetings((prev) => [meeting, ...prev.filter((m) => m.id !== meeting.id)]);\n return meeting;\n } catch (err) {\n const next = err instanceof Error ? err : new Error(\"Failed to create meeting\");\n setError(next);\n throw next;\n }\n },\n [client],\n );\n\n const updateMeeting = useCallback(\n async (meetingId: string, input: UpdateMeetingInput) => {\n setError(null);\n try {\n const meeting = await client.updateMeeting(meetingId, input);\n setMeetings((prev) => prev.map((m) => (m.id === meeting.id ? meeting : m)));\n return meeting;\n } catch (err) {\n const next = err instanceof Error ? err : new Error(\"Failed to update meeting\");\n setError(next);\n throw next;\n }\n },\n [client],\n );\n\n const cancelMeeting = useCallback(\n async (meetingId: string) => {\n setError(null);\n try {\n await client.cancelMeeting(meetingId);\n setMeetings((prev) => prev.filter((m) => m.id !== meetingId));\n if (connection?.meetingId === meetingId) {\n setConnection(null);\n }\n } catch (err) {\n const next = err instanceof Error ? err : new Error(\"Failed to cancel meeting\");\n setError(next);\n throw next;\n }\n },\n [client, connection],\n );\n\n const connect = useCallback(\n async (meetingId: string) => {\n setError(null);\n try {\n const next = await client.connect(meetingId);\n setConnection(next);\n return next;\n } catch (err) {\n const nextErr = err instanceof Error ? err : new Error(\"Failed to connect\");\n setError(nextErr);\n throw nextErr;\n }\n },\n [client],\n );\n\n const startMeeting = useCallback(\n async (input?: CreateMeetingInput & { meetingId?: string }) => {\n setError(null);\n try {\n const result = await client.startMeeting(input);\n setMeetings((prev) => [\n result.meeting,\n ...prev.filter((m) => m.id !== result.meeting.id),\n ]);\n setConnection(result.connection);\n return result;\n } catch (err) {\n const next = err instanceof Error ? err : new Error(\"Failed to start meeting\");\n setError(next);\n throw next;\n }\n },\n [client],\n );\n\n const leaveMeeting = useCallback(async () => {\n setError(null);\n try {\n await client.leaveMeeting();\n } finally {\n setConnection(null);\n setConnectionState(\"disconnected\");\n setMediaState(idleMedia);\n }\n }, [client]);\n\n const login = useCallback(\n async (input: LoginInput) => {\n setError(null);\n try {\n const session = await client.login(input);\n setAuthenticated(true);\n setUser(session.user);\n if (autoLoadMeetings) await refreshMeetings().catch(() => undefined);\n return session;\n } catch (err) {\n const next = err instanceof Error ? err : new Error(\"Login failed\");\n setError(next);\n throw next;\n }\n },\n [autoLoadMeetings, client, refreshMeetings],\n );\n\n const logout = useCallback(async () => {\n setError(null);\n try {\n await client.logout();\n } finally {\n setAuthenticated(false);\n setUser(null);\n setMeetings([]);\n setConnection(null);\n setConnectionState(\"disconnected\");\n setMediaState(idleMedia);\n }\n }, [client]);\n\n const setAudioEnabled = useCallback(\n async (enabled: boolean) => {\n if (!connection) throw new Error(\"Not connected to a meeting\");\n return connection.setAudioEnabled(enabled);\n },\n [connection],\n );\n\n const setVideoEnabled = useCallback(\n async (enabled: boolean) => {\n if (!connection) throw new Error(\"Not connected to a meeting\");\n return connection.setVideoEnabled(enabled);\n },\n [connection],\n );\n\n const setScreenOff = useCallback(\n async (off: boolean) => {\n if (!connection) throw new Error(\"Not connected to a meeting\");\n return connection.setScreenOff(off);\n },\n [connection],\n );\n\n const startScreenShare = useCallback(async () => {\n if (!connection) throw new Error(\"Not connected to a meeting\");\n return connection.startScreenShare();\n }, [connection]);\n\n const stopScreenShare = useCallback(async () => {\n if (!connection) throw new Error(\"Not connected to a meeting\");\n return connection.stopScreenShare();\n }, [connection]);\n\n const value = useMemo<SabhaContextValue>(\n () => ({\n client,\n ready,\n authenticated,\n user,\n meetings,\n meetingsLoading,\n connection,\n connectionState,\n mediaState,\n error,\n refreshMeetings,\n createMeeting,\n updateMeeting,\n cancelMeeting,\n startMeeting,\n connect,\n leaveMeeting,\n login,\n logout,\n setAudioEnabled,\n setVideoEnabled,\n setScreenOff,\n startScreenShare,\n stopScreenShare,\n clearError: () => setError(null),\n }),\n [\n client,\n ready,\n authenticated,\n user,\n meetings,\n meetingsLoading,\n connection,\n connectionState,\n mediaState,\n error,\n refreshMeetings,\n createMeeting,\n updateMeeting,\n cancelMeeting,\n startMeeting,\n connect,\n leaveMeeting,\n login,\n logout,\n setAudioEnabled,\n setVideoEnabled,\n setScreenOff,\n startScreenShare,\n stopScreenShare,\n ],\n );\n\n return <SabhaContext.Provider value={value}>{children}</SabhaContext.Provider>;\n}\n","import { useContext } from \"react\";\nimport { SabhaContext, type SabhaContextValue } from \"./SabhaContext\";\n\nexport function useSabha(): SabhaContextValue {\n const ctx = useContext(SabhaContext);\n if (!ctx) {\n throw new Error(\"useSabha must be used within <SabhaProvider>\");\n }\n return ctx;\n}\n\nexport function useSabhaMeetings() {\n const {\n meetings,\n meetingsLoading,\n refreshMeetings,\n createMeeting,\n updateMeeting,\n cancelMeeting,\n startMeeting,\n connect,\n leaveMeeting,\n connection,\n connectionState,\n mediaState,\n setAudioEnabled,\n setVideoEnabled,\n setScreenOff,\n startScreenShare,\n stopScreenShare,\n error,\n } = useSabha();\n\n return {\n meetings,\n meetingsLoading,\n refreshMeetings,\n createMeeting,\n updateMeeting,\n cancelMeeting,\n startMeeting,\n connect,\n leaveMeeting,\n connection,\n connectionState,\n mediaState,\n setAudioEnabled,\n setVideoEnabled,\n setScreenOff,\n startScreenShare,\n stopScreenShare,\n error,\n };\n}\n"]}
|