@snap/react-camera-kit 0.0.2 → 0.2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"CameraKitProvider.js","sourceRoot":"","sources":["../../src/CameraKitProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { createContext, useContext, useEffect, useState, ReactNode, useRef, useMemo, useCallback } from \"react\";\nimport {\n CameraKit,\n CameraKitBootstrapConfiguration,\n CameraKitSession,\n PublicContainer,\n Lens,\n LensLaunchData,\n CameraKitSource,\n CameraKitSessionEvents,\n ScreenRegions,\n Keyboard,\n} from \"@snap/camera-kit\";\nimport hash from \"stable-hash\";\nimport { CurrentLens, CurrentSource, NO_CURRENT_LENS, SourceInput, OutputSize } from \"./types\";\nimport { CameraKitLogger, InternalLogger, LogLevel, createNoopLogger, wrapLogger } from \"./internal/logging\";\nimport { ensureError } from \"./internal/error\";\nimport { createCameraKitSource } from \"./internal/sourceUtils\";\nimport { withSessionPaused } from \"./internal/sessionUtils\";\nimport { bootstrapCameraKitWithSession } from \"./internal/bootstrapUtils\";\nimport { metricsReporter, extendContainerWithMetrics } from \"./internal/metrics\";\n\n// How long to wait for a Lens \"ready\" event.\nconst readyTimeoutMs = 2000;\n\nexport type MetricEventHandlerFactory = () => (\n event:\n | { kind: \"bootstrap-attempt\" | \"bootstrap-success\" }\n | { kind: \"bootstrap-failure\" | \"lens-failure\"; error: Error },\n) => void;\n\n/**\n * Public context interface exposed to consumers via useCameraKit hook.\n * Provides access to Camera Kit SDK state, Lens management, source control, and playback options.\n */\ninterface CameraKitContextValue {\n /** Current SDK initialization status. */\n sdkStatus: \"uninitialized\" | \"initializing\" | \"ready\" | \"error\";\n\n /** Error that occurred during SDK initialization, if any. */\n sdkError: Error | undefined;\n\n /** Live canvas element for real-time preview rendering. */\n liveCanvas: HTMLCanvasElement | undefined;\n\n /** Capture canvas element for snapshot rendering. */\n captureCanvas: HTMLCanvasElement | undefined;\n\n /** Source state including status, input parameters, and any errors. */\n source: CurrentSource;\n\n /** Lens state including status, Lens object, and any errors. */\n lens: CurrentLens;\n\n /**\n * The {@link Keyboard} API enables applications to handle keyboard input requests from lenses.\n * When a lens requests a keyboard, the app displays it in its preferred UI. As users type,\n * the app sends the text back to the lens for display. The lens can also request keyboard dismissal,\n * prompting the app to remove the displayed keyboard.\n */\n keyboard: Keyboard | undefined;\n\n /** Attempts to re-initialize the SDK after an error. Only available when SDK is in error state. */\n reinitialize: () => void;\n\n /** Applies a media source (camera, video, or image) to the session. */\n applySource: (input: SourceInput, size?: OutputSize) => Promise<void>;\n\n /** Removes the current source from the session. */\n removeSource: () => Promise<void>;\n\n /** Array of lenses that have been loaded via fetchLens or fetchLenses. */\n lenses: Lens[];\n\n /** Loads a single Lens by ID and group ID. Returns cached Lens if already loaded. */\n fetchLens: (lensId: string, groupId: string) => Promise<Lens>;\n\n /** Loads all lenses from one or more Lens groups. */\n fetchLenses: (groupId: string | string[]) => Promise<Lens[]>;\n\n /**\n * Applies a Lens to the current session.\n * @param lensId - The Lens identifier\n * @param groupId - The Lens group identifier\n * @param launchData - Optional launch parameters for the Lens\n * @param lensReadyGuard - Optional async guard for coordinating Lens application\n * @returns Promise that resolves to true if Lens was applied successfully\n */\n applyLens: (\n lensId: string,\n groupId: string,\n launchData?: LensLaunchData,\n lensReadyGuard?: () => Promise<void>,\n ) => Promise<boolean>;\n\n /** Removes the currently applied Lens from the session. */\n removeLens: () => Promise<boolean>;\n\n /** Refreshes the current Lens by removing and reapplying it. */\n refreshLens: () => Promise<void>;\n\n /** Sets the muted state for audio playback. */\n setMuted: (muted: boolean) => void;\n\n /** Toggles the current muted state. */\n toggleMuted: () => void;\n\n /** Whether audio is currently muted. */\n isMuted: boolean;\n\n /** Current FPS limit, if set. */\n fpsLimit: number | undefined;\n\n /** Sets the maximum FPS for rendering. Useful for reducing resource usage. */\n setFPSLimit: (fpsLimit: number) => Promise<void>;\n\n /** Current screen regions configuration, if set. */\n screenRegions: ScreenRegions | undefined;\n\n /** Sets screen regions for Lens-aware UI layout. */\n setScreenRegions: (screenRegions: ScreenRegions) => Promise<void>;\n}\n\n// Internal context interface (includes dangerous APIs for internal use only)\ninterface InternalCameraKitContextValue extends CameraKitContextValue {\n cameraKit: CameraKit | undefined;\n currentSession: CameraKitSession | undefined;\n getLogger: (ns: string) => CameraKitLogger;\n}\n\nconst throwNoContext = () => {\n throw new Error(\"useCameraKit must be used within a CameraKitProvider\");\n};\n\nconst defaultCameraKitContextValue: CameraKitContextValue = {\n sdkStatus: \"uninitialized\",\n sdkError: undefined,\n liveCanvas: undefined,\n captureCanvas: undefined,\n source: {\n status: \"none\",\n error: undefined,\n input: undefined,\n initializedInput: undefined,\n },\n lens: NO_CURRENT_LENS,\n keyboard: undefined,\n lenses: [],\n isMuted: false,\n fpsLimit: undefined,\n screenRegions: undefined,\n reinitialize: throwNoContext,\n applySource: throwNoContext,\n removeSource: throwNoContext,\n fetchLens: throwNoContext,\n fetchLenses: throwNoContext,\n applyLens: throwNoContext,\n removeLens: throwNoContext,\n refreshLens: throwNoContext,\n setFPSLimit: throwNoContext,\n setMuted: throwNoContext,\n toggleMuted: throwNoContext,\n setScreenRegions: throwNoContext,\n};\n\n// Single context that includes everything (setters are internal)\nconst CameraKitContext = createContext<InternalCameraKitContextValue | undefined>(undefined);\n\n/**\n * Props for the CameraKitProvider component.\n * Extends Camera Kit bootstrap configuration with React-specific options.\n */\ninterface CameraKitProviderProps extends Omit<CameraKitBootstrapConfiguration, \"logger\"> {\n /**\n * Optional function to extend the Camera Kit dependency injection container.\n * This is the second parameter to bootstrapCameraKit and allows customization\n * of the SDK's internal dependencies.\n */\n extendContainer?: (container: PublicContainer) => PublicContainer;\n\n /**\n * Optional factory for creating bootstrap event handlers for metrics/analytics.\n * Useful for tracking SDK initialization success/failure in your analytics system.\n */\n createBootstrapEventHandler?: MetricEventHandlerFactory;\n\n /**\n * Optional custom logger implementation. If not provided, a no-op logger is used by default.\n * Pass createConsoleLogger() from './logging' for console-based logging in development.\n *\n * @example\n * ```tsx\n * import { createConsoleLogger } from '@snap/react-camera-kit';\n *\n * <CameraKitProvider logger={createConsoleLogger()} logLevel=\"debug\">\n * {children}\n * </CameraKitProvider>\n * ```\n */\n logger?: CameraKitLogger;\n\n /**\n * Optional log level to control logger verbosity. Defaults to \"info\" if not specified.\n * Supported levels: \"debug\", \"info\", \"warn\", \"error\".\n */\n logLevel?: LogLevel;\n\n /**\n * Browsers optimize tabs when they are hidden - for example, by pausing the execution of requestAnimationFrame\n * callbacks.\n *\n * If you need the CameraKitSession to continue rendering even when the tab is in the background, set this to true.\n * There is a small performance penalty, and it's a good practice to only render in the background if absolutely\n * necessary.\n */\n renderWhileTabHidden?: boolean;\n\n /**\n * Optional manual override for bootstrap stability. If provided, the provider will re-bootstrap\n * whenever this value changes, regardless of other config details.\n *\n * Useful when you want explicit control over when the SDK reinitializes.\n */\n stabilityKey?: string | number;\n\n /**\n * React children to render within the provider.\n */\n children: ReactNode;\n}\n\n/* ------------------------------ provider -------------------------------- */\n\n/**\n * Provider component that initializes and manages the Camera Kit SDK.\n *\n * This component handles SDK bootstrapping, session creation, and provides access to\n * Camera Kit functionality through React context. All Camera Kit hooks and components\n * must be used within this provider.\n *\n * The provider automatically manages SDK lifecycle, including initialization, cleanup,\n * and re-initialization when configuration changes.\n *\n * @example\n * ```tsx\n * import { CameraKitProvider, createConsoleLogger } from '@snap/react-camera-kit';\n *\n * function App() {\n * return (\n * <CameraKitProvider\n * apiToken=\"your-api-token\"\n * logger={createConsoleLogger()}\n * logLevel=\"debug\"\n * >\n * <YourCameraKitComponents />\n * </CameraKitProvider>\n * );\n * }\n * ```\n */\nexport const CameraKitProvider: React.FC<CameraKitProviderProps> = ({\n extendContainer,\n stabilityKey,\n children,\n createBootstrapEventHandler,\n logger: providedLogger,\n logLevel = \"info\",\n renderWhileTabHidden,\n ...bootstrapConfig\n}) => {\n // Prevent nesting CameraKitProvider within another CameraKitProvider\n const existingContext = useContext(CameraKitContext);\n if (existingContext) {\n throw new Error(\"CameraKitProvider cannot be nested within another CameraKitProvider.\");\n }\n\n const { rootLogger, log } = useMemo(() => {\n const rootLogger = wrapLogger({ ...(providedLogger ?? createNoopLogger()), logLevel }, \"react-camera-kit\");\n const currentLogger = wrapLogger(rootLogger, \"CameraKitProvider\");\n return { rootLogger, log: currentLogger };\n }, [providedLogger, logLevel]);\n\n // Cache for child loggers to ensure same namespace returns same instance\n const loggerCacheRef = useRef<Map<string, InternalLogger>>(new Map());\n\n // Clear cache when log changes to ensure child loggers get new parent\n useEffect(() => {\n loggerCacheRef.current.clear();\n }, [rootLogger]);\n\n // Helper to create child loggers for internal hooks\n const getLogger = useCallback(\n (ns: string) => {\n // Check cache first\n if (loggerCacheRef.current.has(ns)) {\n return loggerCacheRef.current.get(ns)!;\n }\n\n // Create and cache new child logger\n const childLogger = wrapLogger(rootLogger, ns);\n loggerCacheRef.current.set(ns, childLogger);\n return childLogger;\n },\n [rootLogger],\n );\n\n /** engine bootstrap + global state */\n const [cameraKitState, setCameraKitState] = useState<{\n kit?: CameraKit;\n session?: CameraKitSession;\n status: CameraKitContextValue[\"sdkStatus\"];\n error?: CameraKitContextValue[\"sdkError\"];\n }>({ status: \"uninitialized\" });\n\n /** per-provider session + ui states (single session for now) */\n const [source, setSource] = useState<CurrentSource>(defaultCameraKitContextValue.source);\n const [lens, setLens] = useState<CurrentLens>(defaultCameraKitContextValue.lens);\n const [bootstrapCounter, setBootstrapCounter] = useState(0);\n\n /** playback state */\n const [isMuted, setIsMuted] = useState(false);\n const [fpsLimit, setFpsLimitState] = useState<number | undefined>(undefined);\n const [screenRegions, setScreenRegionsState] = useState<ScreenRegions | undefined>(undefined);\n\n /** Lens manager state */\n const [lenses, setLenses] = useState<Lens[]>([]);\n const lensCache = useRef<Map<string, Lens>>(new Map());\n\n /** keep latest cameraKit in a ref for cleanup */\n const kitRef = useRef<{ kit: CameraKit; destroy: () => Promise<void> }>();\n\n /** keep metrics factory in a ref so swapping it doesn’t re-bootstrap */\n const eventFactoryRef = useRef<MetricEventHandlerFactory | undefined>(createBootstrapEventHandler);\n useEffect(() => {\n eventFactoryRef.current = createBootstrapEventHandler;\n }, [createBootstrapEventHandler]);\n\n /**\n * Semantic key:\n * - If stabilityKey is provided - use it as the sole trigger.\n * - Else hash a generic projection of { config, extendContainer } so ANY field change\n * in CameraKitBootstrapConfiguration (or extendContainer) reboots the SDK.\n */\n const bootstrapKey = useMemo(() => {\n if (stabilityKey != null) return String(stabilityKey);\n\n return hash({ config: bootstrapConfig, extendContainer, renderWhileTabHidden });\n }, [bootstrapConfig, extendContainer, renderWhileTabHidden, stabilityKey]);\n\n /* ---------------------------- bootstrap engine ------------------------- */\n useEffect(() => {\n const abortController = new AbortController();\n const emit = eventFactoryRef.current?.();\n\n setCameraKitState({ status: \"initializing\" });\n emit?.({ kind: \"bootstrap-attempt\" });\n log.info(\"bootstrap_attempt\");\n\n bootstrapCameraKitWithSession(\n bootstrapConfig,\n extendContainerWithMetrics(extendContainer),\n { renderWhileTabHidden },\n abortController.signal,\n log,\n )\n .then(({ kit, session, destroy }) => {\n // Store kit reference for cleanup\n kitRef.current = { kit, destroy };\n setCameraKitState({ kit, session, status: \"ready\" });\n log.info(\"bootstrap_success\");\n emit?.({ kind: \"bootstrap-success\" });\n metricsReporter.reportCount(\"bootstrap_success\");\n })\n .catch((error) => {\n // Ignore errors from aborted operations\n if (error.name === \"AbortError\") return;\n\n log.error(\"bootstrap_failure\", error);\n setCameraKitState({ kit: undefined, session: undefined, status: \"error\", error });\n emit?.({ kind: \"bootstrap-failure\", error });\n metricsReporter.reportCount(\"bootstrap_failure\");\n });\n\n return () => {\n abortController.abort();\n kitRef.current?.destroy();\n kitRef.current = undefined;\n };\n // Re-bootstrap when key changes or when manual counter bumps on reinit\n }, [bootstrapKey, bootstrapCounter]);\n\n /* --------------------------- Lens cache cleanup ------------------------ */\n // When Camera Kit errors, remove all Lenses from the local cache.\n // Otherwise, if any component tries to apply a Lens that broke Camera Kit before,\n // Lens manager will fail with cannot find Lens error.\n useEffect(() => {\n if (cameraKitState.session) {\n cameraKitState.session.events.addEventListener(\"error\", (event) => {\n if (event.detail.error.name === \"LensExecutionError\") {\n lensCache.current.clear();\n setLenses([]);\n }\n });\n }\n }, [cameraKitState.session]);\n\n /* ---------------------------- Lens manager methods --------------------- */\n const fetchLens = useCallback(\n async (lensId: string, groupId: string) => {\n try {\n if (!cameraKitState.kit) throw new Error(\"CameraKit not initialized.\");\n const key = `${groupId}:${lensId}`;\n if (lensCache.current.has(key)) return lensCache.current.get(key)!;\n const lens = await cameraKitState.kit.lensRepository.loadLens(lensId, groupId);\n lensCache.current.set(key, lens);\n setLenses((prev) => [...prev, lens]);\n return lens;\n } catch (error) {\n log.error(\"lens_load_failed\", { lensId, groupId }, error);\n throw error;\n }\n },\n [cameraKitState.kit, log],\n );\n\n const fetchLenses = useCallback(\n async (groupId: string | string[]) => {\n try {\n if (!cameraKitState.kit) throw new Error(\"CameraKit not initialized.\");\n\n const { lenses: loaded } = await cameraKitState.kit.lensRepository.loadLensGroups([groupId].flat());\n loaded.forEach((l) => {\n const key = `${l.groupId}:${l.id}`;\n if (!lensCache.current.has(key)) lensCache.current.set(key, l);\n });\n setLenses(Array.from(lensCache.current.values()));\n return loaded;\n } catch (error) {\n log.error(\"lens_group_load_failed\", { groupId }, error);\n throw error;\n }\n },\n [cameraKitState.kit, log],\n );\n\n const applyLens = useCallback(\n async (lensId: string, lensGroupId: string, launchData?: LensLaunchData, lensReadyGuard?: () => Promise<void>) => {\n const commonFields = {\n lensId,\n lensGroupId,\n lensLaunchData: launchData,\n lensReadyGuard,\n };\n let lens: Lens | undefined;\n\n try {\n if (!cameraKitState.session) throw new Error(\"No active session.\");\n\n setLens({\n ...commonFields,\n status: \"loading\",\n error: undefined,\n lens: undefined,\n });\n lens = await fetchLens(lensId, lensGroupId);\n\n // Caller might do an animation and wait for some rendering event.\n // If they return a Promise, we await it.\n const readyPromise = lensReadyGuard?.() ?? Promise.resolve();\n const applyPromise = cameraKitState.session.applyLens(lens, launchData);\n await Promise.race([\n Promise.all([applyPromise, readyPromise]),\n new Promise<void>((resolve) => setTimeout(resolve, readyTimeoutMs)),\n ]);\n setLens({\n ...commonFields,\n status: \"ready\",\n error: undefined,\n lens,\n });\n metricsReporter.reportCount(\"lens_apply_success\");\n return await applyPromise;\n } catch (cause) {\n const error = ensureError(cause);\n log.error(\"lens_apply_failed\", { lensId, lensGroupId }, error);\n setLens({ ...commonFields, status: \"error\", error, lens });\n metricsReporter.reportCount(\"lens_apply_failure\");\n throw error;\n }\n },\n [fetchLens, cameraKitState.session, log],\n );\n\n const removeLens = useCallback(async () => {\n try {\n if (!cameraKitState.session) throw new Error(\"No active session.\");\n\n const removed = await cameraKitState.session.removeLens();\n if (removed) setLens(NO_CURRENT_LENS);\n return removed;\n } catch (error) {\n log.error(\"lens_remove_failed\", error);\n throw error;\n }\n }, [cameraKitState.session, log]);\n\n const refreshLens = useCallback(async () => {\n const { lensId, lensGroupId, lensLaunchData, lensReadyGuard } = lens;\n\n if (!lensId || !lensGroupId) return;\n\n await removeLens();\n await applyLens(lensId, lensGroupId, lensLaunchData, lensReadyGuard);\n }, [lens, removeLens, applyLens]);\n\n /* ---------------------------- source manager methods ------------------- */\n const sourceCleanupRef = useRef<{\n mediaStream?: MediaStream;\n cameraKitSource?: CameraKitSource;\n }>({});\n\n const applySource = useCallback(\n async (input: SourceInput, size?: OutputSize) => {\n try {\n if (!cameraKitState.session) throw new Error(\"No active session.\");\n\n // Clean up previous source\n sourceCleanupRef.current.mediaStream?.getTracks().forEach((track) => track.stop());\n await sourceCleanupRef.current.cameraKitSource?.detach(() => {});\n sourceCleanupRef.current = {};\n\n setSource({\n input,\n status: \"loading\",\n error: undefined,\n initializedInput: undefined,\n });\n\n const { cameraKitSource, transform, inputSize, mediaStream, initializedSourceInput } =\n await createCameraKitSource(input);\n\n // Store refs for cleanup\n sourceCleanupRef.current = { cameraKitSource, mediaStream };\n\n // Pause session, set source, apply transforms and render size, then resume\n await withSessionPaused(cameraKitState.session, async () => {\n await cameraKitState.session!.setSource(cameraKitSource);\n await cameraKitSource.setTransform(transform);\n if (size?.mode === \"fixed\") {\n await cameraKitSource.setRenderSize(size.width, size.height);\n } else if (size?.mode === \"match-input\" && inputSize) {\n await cameraKitSource.setRenderSize(inputSize[0], inputSize[1]);\n }\n });\n\n setSource({\n input,\n initializedInput: initializedSourceInput,\n status: \"ready\",\n error: undefined,\n });\n } catch (cause) {\n const error = ensureError(cause);\n log.error(\"source_apply_failed\", { kind: input.kind }, error);\n setSource({\n input,\n status: \"error\",\n error,\n initializedInput: undefined,\n });\n throw error;\n }\n },\n [cameraKitState.session, log],\n );\n\n const removeSource = useCallback(async () => {\n try {\n // Clean up media stream and detach source\n sourceCleanupRef.current.mediaStream?.getTracks().forEach((track) => track.stop());\n await sourceCleanupRef.current.cameraKitSource?.detach(() => {});\n sourceCleanupRef.current = {};\n\n setSource({\n status: \"none\",\n error: undefined,\n input: undefined,\n initializedInput: undefined,\n });\n } catch (error) {\n log.error(\"source_remove_failed\", error);\n throw error;\n }\n }, [log]);\n\n /* ---------------------------- playback control methods ----------------- */\n const setFPSLimit = useCallback(\n async (fps: number) => {\n try {\n if (!cameraKitState.session) throw new Error(\"No active session.\");\n await cameraKitState.session.setFPSLimit(fps);\n setFpsLimitState(fps);\n } catch (error) {\n log.error(\"fps_limit_set_failed\", { fps }, error);\n throw error;\n }\n },\n [cameraKitState.session, log],\n );\n\n const setMuted = useCallback(\n (muted: boolean) => {\n if (!cameraKitState.session) throw new Error(\"No active session.\");\n if (muted) {\n cameraKitState.session.mute();\n } else {\n cameraKitState.session.unmute();\n }\n setIsMuted(muted);\n },\n [cameraKitState.session],\n );\n\n const toggleMuted = useCallback(() => {\n setMuted(!isMuted);\n }, [isMuted, setMuted]);\n\n const setScreenRegions = useCallback(\n async (regions: ScreenRegions) => {\n try {\n if (!cameraKitState.session) throw new Error(\"No active session.\");\n await cameraKitState.session.setScreenRegions(regions);\n setScreenRegionsState(regions);\n } catch (error) {\n log.error(\"screen_regions_set_failed\", error);\n throw error;\n }\n },\n [cameraKitState.session, log],\n );\n\n const abortCameraKit = useCallback(\n (error: unknown) => {\n cameraKitState.kit?.destroy().catch((cause) => {\n log.error(\"kit_destroy_failed\", cause);\n });\n setCameraKitState({ kit: undefined, status: \"error\", error: ensureError(error) });\n },\n [cameraKitState.kit, log],\n );\n\n useEffect(() => {\n if (!cameraKitState.session) return;\n\n function handleSessionError(event: CameraKitSessionEvents) {\n if (event.detail.error.name === \"LensExecutionError\") {\n // Update lens state to error, but don't abort the entire SDK.\n // This allows the user to apply a new lens and recover from the error.\n setLens((currentLens) => ({\n ...currentLens,\n status: \"error\",\n error: event.detail.error,\n }));\n } else if (event.detail.error.name === \"LensAbortError\") {\n // LensAbortError is a critical error that requires SDK re-initialization.\n // Abort the SDK so the user must call reinitialize() to recover.\n metricsReporter.reportCount(\"session_lens_abort_error\");\n abortCameraKit(event.detail.error);\n }\n }\n\n cameraKitState.session.events.addEventListener(\"error\", handleSessionError);\n\n return () => cameraKitState.session!.events.removeEventListener(\"error\", handleSessionError);\n }, [cameraKitState.session, abortCameraKit]);\n\n /* ---------------------------- memoised context ------------------------- */\n const ctxValue: InternalCameraKitContextValue = useMemo(\n () => ({\n cameraKit: cameraKitState.kit,\n currentSession: cameraKitState.session,\n sdkStatus: cameraKitState.status,\n sdkError: cameraKitState.error,\n\n // Canvas elements\n liveCanvas: cameraKitState.session?.output.live,\n captureCanvas: cameraKitState.session?.output.capture,\n\n source,\n lens,\n\n // Playback state\n isMuted,\n fpsLimit,\n screenRegions,\n\n keyboard: cameraKitState.session?.keyboard,\n\n getLogger,\n\n abortCameraKit,\n\n reinitialize: () => {\n if (cameraKitState.status === \"error\" && !cameraKitState.kit) {\n setBootstrapCounter((prev) => prev + 1);\n } else {\n throw new Error(\"Cannot re-initialize CameraKit when it is not in an aborted state.\");\n }\n },\n\n // Lens manager methods\n fetchLens,\n fetchLenses,\n applyLens,\n removeLens,\n refreshLens,\n lenses,\n\n // Source manager methods\n applySource,\n removeSource,\n\n // Playback control methods\n setFPSLimit,\n setMuted,\n toggleMuted,\n setScreenRegions,\n }),\n [\n cameraKitState,\n source,\n lens,\n isMuted,\n fpsLimit,\n screenRegions,\n getLogger,\n fetchLens,\n fetchLenses,\n applyLens,\n removeLens,\n refreshLens,\n lenses,\n applySource,\n removeSource,\n setFPSLimit,\n setMuted,\n toggleMuted,\n setScreenRegions,\n abortCameraKit,\n ],\n );\n\n return <CameraKitContext.Provider value={ctxValue}>{children}</CameraKitContext.Provider>;\n};\n\n/**\n * Internal hook with access to Camera Kit internals.\n * Only for use within react-camera-kit library components and hooks.\n *\n * @internal\n */\nexport const useInternalCameraKit = (): InternalCameraKitContextValue => {\n const context = useContext(CameraKitContext);\n if (!context) {\n throw new Error(\"useInternalCameraKit must be used within a CameraKitProvider\");\n }\n return context;\n};\n\n/**\n * Hook to access Camera Kit context and methods.\n *\n * Provides access to SDK state, Lens management, source control, and playback options.\n * Must be used within a CameraKitProvider.\n *\n * @returns Camera Kit context value with state and methods\n * @throws Error if used outside of CameraKitProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const {\n * sdkStatus,\n * lens,\n * applyLens,\n * removeLens,\n * liveCanvas\n * } = useCameraKit();\n *\n * useEffect(() => {\n * if (sdkStatus === 'ready') {\n * applyLens('lens-id', 'group-id');\n * }\n * }, [sdkStatus, applyLens]);\n *\n * return <div>{lens.status}</div>;\n * }\n * ```\n */\nexport const useCameraKit = (): CameraKitContextValue => {\n const context = useContext(CameraKitContext);\n if (!context) {\n throw new Error(\"useCameraKit must be used within a CameraKitProvider\");\n }\n // Return only the public API (exclude internal fields)\n const { cameraKit: _cameraKit, currentSession: _currentSession, getLogger: _getLogger, ...publicContext } = context;\n return publicContext;\n};\n"]}
1
+ {"version":3,"file":"CameraKitProvider.js","sourceRoot":"","sources":["../../src/CameraKitProvider.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { createContext, useContext, useEffect, useState, ReactNode, useRef, useMemo, useCallback } from \"react\";\nimport {\n CameraKit,\n CameraKitBootstrapConfiguration,\n CameraKitSession,\n PublicContainer,\n Lens,\n LensLaunchData,\n CameraKitSource,\n CameraKitSessionEvents,\n ScreenRegions,\n Keyboard,\n} from \"@snap/camera-kit\";\nimport hash from \"stable-hash\";\nimport { CurrentLens, CurrentSource, NO_CURRENT_LENS, SourceInput, OutputSize } from \"./types\";\nimport { CameraKitLogger, InternalLogger, LogLevel, createNoopLogger, wrapLogger } from \"./internal/logging\";\nimport { ensureError } from \"./internal/error\";\nimport { createCameraKitSource } from \"./internal/sourceUtils\";\nimport { withSessionPaused } from \"./internal/sessionUtils\";\nimport { bootstrapCameraKitWithSession } from \"./internal/bootstrapUtils\";\nimport { metricsReporter, extendContainerWithMetrics } from \"./internal/metrics\";\n\n// How long to wait for a Lens \"ready\" event.\nconst readyTimeoutMs = 2000;\n\nexport type MetricEventHandlerFactory = () => (\n event:\n | { kind: \"bootstrap-attempt\" | \"bootstrap-success\" }\n | { kind: \"bootstrap-failure\" | \"lens-failure\"; error: Error },\n) => void;\n\n/**\n * Public context interface exposed to consumers via useCameraKit hook.\n * Provides access to Camera Kit SDK state, Lens management, source control, and playback options.\n */\ninterface CameraKitContextValue {\n /** Current SDK initialization status. */\n sdkStatus: \"uninitialized\" | \"initializing\" | \"ready\" | \"error\";\n\n /** Error that occurred during SDK initialization, if any. */\n sdkError: Error | undefined;\n\n /** Live canvas element for real-time preview rendering. */\n liveCanvas: HTMLCanvasElement | undefined;\n\n /** Capture canvas element for snapshot rendering. */\n captureCanvas: HTMLCanvasElement | undefined;\n\n /** Source state including status, input parameters, and any errors. */\n source: CurrentSource;\n\n /** Lens state including status, Lens object, and any errors. */\n lens: CurrentLens;\n\n /**\n * The {@link Keyboard} API enables applications to handle keyboard input requests from lenses.\n * When a lens requests a keyboard, the app displays it in its preferred UI. As users type,\n * the app sends the text back to the lens for display. The lens can also request keyboard dismissal,\n * prompting the app to remove the displayed keyboard.\n */\n keyboard: Keyboard | undefined;\n\n /** Attempts to re-initialize the SDK after an error. Only available when SDK is in error state. */\n reinitialize: () => void;\n\n /** Applies a media source (camera, video, or image) to the session. */\n applySource: (input: SourceInput, size?: OutputSize) => Promise<void>;\n\n /** Removes the current source from the session. */\n removeSource: () => Promise<void>;\n\n /** Array of lenses that have been loaded via fetchLens or fetchLenses. */\n lenses: Lens[];\n\n /** Loads a single Lens by ID and group ID. Returns cached Lens if already loaded. */\n fetchLens: (lensId: string, groupId: string) => Promise<Lens>;\n\n /** Loads all lenses from one or more Lens groups. */\n fetchLenses: (groupId: string | string[]) => Promise<Lens[]>;\n\n /**\n * Applies a Lens to the current session.\n * @param lensId - The Lens identifier\n * @param groupId - The Lens group identifier\n * @param launchData - Optional launch parameters for the Lens\n * @param lensReadyGuard - Optional async guard for coordinating Lens application\n * @returns Promise that resolves to true if Lens was applied successfully\n */\n applyLens: (\n lensId: string,\n groupId: string,\n launchData?: LensLaunchData,\n lensReadyGuard?: () => Promise<void>,\n ) => Promise<boolean>;\n\n /** Removes the currently applied Lens from the session. */\n removeLens: () => Promise<boolean>;\n\n /** Refreshes the current Lens by removing and reapplying it. */\n refreshLens: () => Promise<void>;\n\n /** Sets the muted state for audio playback. */\n setMuted: (muted: boolean) => void;\n\n /** Toggles the current muted state. */\n toggleMuted: () => void;\n\n /** Whether audio is currently muted. */\n isMuted: boolean;\n\n /** Current FPS limit, if set. */\n fpsLimit: number | undefined;\n\n /** Sets the maximum FPS for rendering. Useful for reducing resource usage. */\n setFPSLimit: (fpsLimit: number) => Promise<void>;\n\n /** Current screen regions configuration, if set. */\n screenRegions: ScreenRegions | undefined;\n\n /** Sets screen regions for Lens-aware UI layout. */\n setScreenRegions: (screenRegions: ScreenRegions) => Promise<void>;\n}\n\n// Internal context interface (includes dangerous APIs for internal use only)\ninterface InternalCameraKitContextValue extends CameraKitContextValue {\n cameraKit: CameraKit | undefined;\n currentSession: CameraKitSession | undefined;\n getLogger: (ns: string) => CameraKitLogger;\n}\n\nconst throwNoContext = () => {\n throw new Error(\"useCameraKit must be used within a CameraKitProvider\");\n};\n\nconst defaultCameraKitContextValue: CameraKitContextValue = {\n sdkStatus: \"uninitialized\",\n sdkError: undefined,\n liveCanvas: undefined,\n captureCanvas: undefined,\n source: {\n status: \"none\",\n error: undefined,\n input: undefined,\n initializedInput: undefined,\n },\n lens: NO_CURRENT_LENS,\n keyboard: undefined,\n lenses: [],\n isMuted: false,\n fpsLimit: undefined,\n screenRegions: undefined,\n reinitialize: throwNoContext,\n applySource: throwNoContext,\n removeSource: throwNoContext,\n fetchLens: throwNoContext,\n fetchLenses: throwNoContext,\n applyLens: throwNoContext,\n removeLens: throwNoContext,\n refreshLens: throwNoContext,\n setFPSLimit: throwNoContext,\n setMuted: throwNoContext,\n toggleMuted: throwNoContext,\n setScreenRegions: throwNoContext,\n};\n\n// Single context that includes everything (setters are internal)\nconst CameraKitContext = createContext<InternalCameraKitContextValue | undefined>(undefined);\n\n/**\n * Props for the CameraKitProvider component.\n * Extends Camera Kit bootstrap configuration with React-specific options.\n */\ninterface CameraKitProviderProps extends Omit<CameraKitBootstrapConfiguration, \"logger\"> {\n /**\n * Optional function to extend the Camera Kit dependency injection container.\n * This is the second parameter to bootstrapCameraKit and allows customization\n * of the SDK's internal dependencies.\n */\n extendContainer?: (container: PublicContainer) => PublicContainer;\n\n /**\n * Optional factory for creating bootstrap event handlers for metrics/analytics.\n * Useful for tracking SDK initialization success/failure in your analytics system.\n */\n createBootstrapEventHandler?: MetricEventHandlerFactory;\n\n /**\n * Optional custom logger implementation. If not provided, a no-op logger is used by default.\n * Pass createConsoleLogger() from './logging' for console-based logging in development.\n *\n * @example\n * ```tsx\n * import { createConsoleLogger } from '@snap/react-camera-kit';\n *\n * <CameraKitProvider logger={createConsoleLogger()} logLevel=\"debug\">\n * {children}\n * </CameraKitProvider>\n * ```\n */\n logger?: CameraKitLogger;\n\n /**\n * Optional log level to control logger verbosity. Defaults to \"info\" if not specified.\n * Supported levels: \"debug\", \"info\", \"warn\", \"error\".\n */\n logLevel?: LogLevel;\n\n /**\n * Browsers optimize tabs when they are hidden - for example, by pausing the execution of requestAnimationFrame\n * callbacks.\n *\n * If you need the CameraKitSession to continue rendering even when the tab is in the background, set this to true.\n * There is a small performance penalty, and it's a good practice to only render in the background if absolutely\n * necessary.\n */\n renderWhileTabHidden?: boolean;\n\n /**\n * Optional manual override for bootstrap stability. If provided, the provider will re-bootstrap\n * whenever this value changes, regardless of other config details.\n *\n * Useful when you want explicit control over when the SDK reinitializes.\n */\n stabilityKey?: string | number;\n\n /**\n * React children to render within the provider.\n */\n children: ReactNode;\n}\n\n/* ------------------------------ provider -------------------------------- */\n\n/**\n * Provider component that initializes and manages the Camera Kit SDK.\n *\n * This component handles SDK bootstrapping, session creation, and provides access to\n * Camera Kit functionality through React context. All Camera Kit hooks and components\n * must be used within this provider.\n *\n * The provider automatically manages SDK lifecycle, including initialization, cleanup,\n * and re-initialization when configuration changes.\n *\n * @example\n * ```tsx\n * import { CameraKitProvider, createConsoleLogger } from '@snap/react-camera-kit';\n *\n * function App() {\n * return (\n * <CameraKitProvider\n * apiToken=\"your-api-token\"\n * logger={createConsoleLogger()}\n * logLevel=\"debug\"\n * >\n * <YourCameraKitComponents />\n * </CameraKitProvider>\n * );\n * }\n * ```\n */\nexport const CameraKitProvider: React.FC<CameraKitProviderProps> = ({\n extendContainer,\n stabilityKey,\n children,\n createBootstrapEventHandler,\n logger: providedLogger,\n logLevel = \"info\",\n renderWhileTabHidden,\n ...bootstrapConfig\n}) => {\n // Prevent nesting CameraKitProvider within another CameraKitProvider\n const existingContext = useContext(CameraKitContext);\n if (existingContext) {\n throw new Error(\"CameraKitProvider cannot be nested within another CameraKitProvider.\");\n }\n\n const { rootLogger, log } = useMemo(() => {\n const rootLogger = wrapLogger({ ...(providedLogger ?? createNoopLogger()), logLevel }, \"react-camera-kit\");\n const currentLogger = wrapLogger(rootLogger, \"CameraKitProvider\");\n return { rootLogger, log: currentLogger };\n }, [providedLogger, logLevel]);\n\n // Cache for child loggers to ensure same namespace returns same instance\n const loggerCacheRef = useRef<Map<string, InternalLogger>>(new Map());\n\n // Clear cache when log changes to ensure child loggers get new parent\n useEffect(() => {\n loggerCacheRef.current.clear();\n }, [rootLogger]);\n\n // Helper to create child loggers for internal hooks\n const getLogger = useCallback(\n (ns: string) => {\n // Check cache first\n if (loggerCacheRef.current.has(ns)) {\n return loggerCacheRef.current.get(ns)!;\n }\n\n // Create and cache new child logger\n const childLogger = wrapLogger(rootLogger, ns);\n loggerCacheRef.current.set(ns, childLogger);\n return childLogger;\n },\n [rootLogger],\n );\n\n /** engine bootstrap + global state */\n const [cameraKitState, setCameraKitState] = useState<{\n kit?: CameraKit;\n session?: CameraKitSession;\n status: CameraKitContextValue[\"sdkStatus\"];\n error?: CameraKitContextValue[\"sdkError\"];\n }>({ status: \"uninitialized\" });\n\n /** per-provider session + ui states (single session for now) */\n const [source, setSource] = useState<CurrentSource>(defaultCameraKitContextValue.source);\n const [lens, setLens] = useState<CurrentLens>(defaultCameraKitContextValue.lens);\n const [bootstrapCounter, setBootstrapCounter] = useState(0);\n\n /** playback state */\n const [isMuted, setIsMuted] = useState(false);\n const [fpsLimit, setFpsLimitState] = useState<number | undefined>(undefined);\n const [screenRegions, setScreenRegionsState] = useState<ScreenRegions | undefined>(undefined);\n\n /** Lens manager state */\n const [lenses, setLenses] = useState<Lens[]>([]);\n const lensCache = useRef<Map<string, Lens>>(new Map());\n\n /** keep latest cameraKit in a ref for cleanup */\n const kitRef = useRef<{ kit: CameraKit; destroy: () => Promise<void> }>();\n\n /** keep metrics factory in a ref so swapping it doesn’t re-bootstrap */\n const eventFactoryRef = useRef<MetricEventHandlerFactory | undefined>(createBootstrapEventHandler);\n useEffect(() => {\n eventFactoryRef.current = createBootstrapEventHandler;\n }, [createBootstrapEventHandler]);\n\n /**\n * Semantic key:\n * - If stabilityKey is provided - use it as the sole trigger.\n * - Else hash a generic projection of { config, extendContainer } so ANY field change\n * in CameraKitBootstrapConfiguration (or extendContainer) reboots the SDK.\n */\n const bootstrapKey = useMemo(() => {\n if (stabilityKey != null) return String(stabilityKey);\n\n return hash({ config: bootstrapConfig, extendContainer, renderWhileTabHidden });\n }, [bootstrapConfig, extendContainer, renderWhileTabHidden, stabilityKey]);\n\n /* ---------------------------- bootstrap engine ------------------------- */\n useEffect(() => {\n const abortController = new AbortController();\n const emit = eventFactoryRef.current?.();\n\n // Clear stale lens cache — the old kit's lensRepository is no longer valid.\n lensCache.current.clear();\n setLenses([]);\n\n setCameraKitState({ status: \"initializing\" });\n emit?.({ kind: \"bootstrap-attempt\" });\n log.info(\"bootstrap_attempt\");\n\n bootstrapCameraKitWithSession(\n bootstrapConfig,\n extendContainerWithMetrics(extendContainer),\n { renderWhileTabHidden },\n abortController.signal,\n log,\n )\n .then(({ kit, session, destroy }) => {\n // Store kit reference for cleanup\n kitRef.current = { kit, destroy };\n setCameraKitState({ kit, session, status: \"ready\" });\n log.info(\"bootstrap_success\");\n emit?.({ kind: \"bootstrap-success\" });\n metricsReporter.reportCount(\"bootstrap_success\");\n })\n .catch((error) => {\n // Ignore errors from aborted operations\n if (error.name === \"AbortError\") return;\n\n log.error(\"bootstrap_failure\", error);\n setCameraKitState({ kit: undefined, session: undefined, status: \"error\", error });\n emit?.({ kind: \"bootstrap-failure\", error });\n metricsReporter.reportCount(\"bootstrap_failure\");\n });\n\n return () => {\n abortController.abort();\n kitRef.current?.destroy();\n kitRef.current = undefined;\n };\n // Re-bootstrap when key changes or when manual counter bumps on reinit\n }, [bootstrapKey, bootstrapCounter]);\n\n /* --------------------------- Lens cache cleanup ------------------------ */\n // When Camera Kit errors, remove all Lenses from the local cache.\n // Otherwise, if any component tries to apply a Lens that broke Camera Kit before,\n // Lens manager will fail with cannot find Lens error.\n useEffect(() => {\n if (cameraKitState.session) {\n cameraKitState.session.events.addEventListener(\"error\", (event) => {\n if (event.detail.error.name === \"LensExecutionError\") {\n lensCache.current.clear();\n setLenses([]);\n }\n });\n }\n }, [cameraKitState.session]);\n\n /* ---------------------------- Lens manager methods --------------------- */\n const fetchLens = useCallback(\n async (lensId: string, groupId: string) => {\n try {\n if (!cameraKitState.kit) throw new Error(\"CameraKit not initialized.\");\n const key = `${groupId}:${lensId}`;\n if (lensCache.current.has(key)) return lensCache.current.get(key)!;\n const lens = await cameraKitState.kit.lensRepository.loadLens(lensId, groupId);\n lensCache.current.set(key, lens);\n setLenses((prev) => [...prev, lens]);\n return lens;\n } catch (error) {\n log.error(\"lens_load_failed\", { lensId, groupId }, error);\n throw error;\n }\n },\n [cameraKitState.kit, log],\n );\n\n const fetchLenses = useCallback(\n async (groupId: string | string[]) => {\n try {\n if (!cameraKitState.kit) throw new Error(\"CameraKit not initialized.\");\n\n const { lenses: loaded } = await cameraKitState.kit.lensRepository.loadLensGroups([groupId].flat());\n loaded.forEach((l) => {\n const key = `${l.groupId}:${l.id}`;\n if (!lensCache.current.has(key)) lensCache.current.set(key, l);\n });\n setLenses(Array.from(lensCache.current.values()));\n return loaded;\n } catch (error) {\n log.error(\"lens_group_load_failed\", { groupId }, error);\n throw error;\n }\n },\n [cameraKitState.kit, log],\n );\n\n const applyLens = useCallback(\n async (lensId: string, lensGroupId: string, launchData?: LensLaunchData, lensReadyGuard?: () => Promise<void>) => {\n const commonFields = {\n lensId,\n lensGroupId,\n lensLaunchData: launchData,\n lensReadyGuard,\n };\n let lens: Lens | undefined;\n\n try {\n if (!cameraKitState.session) throw new Error(\"No active session.\");\n\n setLens({\n ...commonFields,\n status: \"loading\",\n error: undefined,\n lens: undefined,\n });\n lens = await fetchLens(lensId, lensGroupId);\n\n // Caller might do an animation and wait for some rendering event.\n // If they return a Promise, we await it.\n const readyPromise = lensReadyGuard?.() ?? Promise.resolve();\n const applyPromise = cameraKitState.session.applyLens(lens, launchData);\n await Promise.race([\n Promise.all([applyPromise, readyPromise]),\n new Promise<void>((resolve) => setTimeout(resolve, readyTimeoutMs)),\n ]);\n setLens({\n ...commonFields,\n status: \"ready\",\n error: undefined,\n lens,\n });\n metricsReporter.reportCount(\"lens_apply_success\");\n return await applyPromise;\n } catch (cause) {\n const error = ensureError(cause);\n log.error(\"lens_apply_failed\", { lensId, lensGroupId }, error);\n setLens({ ...commonFields, status: \"error\", error, lens });\n metricsReporter.reportCount(\"lens_apply_failure\");\n throw error;\n }\n },\n [fetchLens, cameraKitState.session, log],\n );\n\n const removeLens = useCallback(async () => {\n try {\n if (!cameraKitState.session) throw new Error(\"No active session.\");\n\n const removed = await cameraKitState.session.removeLens();\n if (removed) setLens(NO_CURRENT_LENS);\n return removed;\n } catch (error) {\n log.error(\"lens_remove_failed\", error);\n throw error;\n }\n }, [cameraKitState.session, log]);\n\n const refreshLens = useCallback(async () => {\n const { lensId, lensGroupId, lensLaunchData, lensReadyGuard } = lens;\n\n if (!lensId || !lensGroupId) return;\n\n await removeLens();\n await applyLens(lensId, lensGroupId, lensLaunchData, lensReadyGuard);\n }, [lens, removeLens, applyLens]);\n\n /* ---------------------------- source manager methods ------------------- */\n const sourceCleanupRef = useRef<{\n mediaStream?: MediaStream;\n cameraKitSource?: CameraKitSource;\n }>({});\n\n const applySource = useCallback(\n async (input: SourceInput, size?: OutputSize) => {\n try {\n if (!cameraKitState.session) throw new Error(\"No active session.\");\n\n // Clean up previous source\n sourceCleanupRef.current.mediaStream?.getTracks().forEach((track) => track.stop());\n await sourceCleanupRef.current.cameraKitSource?.detach(() => {});\n sourceCleanupRef.current = {};\n\n setSource({\n input,\n status: \"loading\",\n error: undefined,\n initializedInput: undefined,\n });\n\n const { cameraKitSource, transform, inputSize, mediaStream, initializedSourceInput } =\n await createCameraKitSource(input);\n\n // Store refs for cleanup\n sourceCleanupRef.current = { cameraKitSource, mediaStream };\n\n // Pause session, set source, apply transforms and render size, then resume\n await withSessionPaused(cameraKitState.session, async () => {\n await cameraKitState.session!.setSource(cameraKitSource);\n await cameraKitSource.setTransform(transform);\n if (size?.mode === \"fixed\") {\n await cameraKitSource.setRenderSize(size.width, size.height);\n } else if (size?.mode === \"match-input\" && inputSize) {\n await cameraKitSource.setRenderSize(inputSize[0], inputSize[1]);\n }\n });\n\n setSource({\n input,\n initializedInput: initializedSourceInput,\n status: \"ready\",\n error: undefined,\n });\n } catch (cause) {\n const error = ensureError(cause);\n log.error(\"source_apply_failed\", { kind: input.kind }, error);\n setSource({\n input,\n status: \"error\",\n error,\n initializedInput: undefined,\n });\n throw error;\n }\n },\n [cameraKitState.session, log],\n );\n\n const removeSource = useCallback(async () => {\n try {\n // Clean up media stream and detach source\n sourceCleanupRef.current.mediaStream?.getTracks().forEach((track) => track.stop());\n await sourceCleanupRef.current.cameraKitSource?.detach(() => {});\n sourceCleanupRef.current = {};\n\n setSource({\n status: \"none\",\n error: undefined,\n input: undefined,\n initializedInput: undefined,\n });\n } catch (error) {\n log.error(\"source_remove_failed\", error);\n throw error;\n }\n }, [log]);\n\n /* ---------------------------- playback control methods ----------------- */\n const setFPSLimit = useCallback(\n async (fps: number) => {\n try {\n if (!cameraKitState.session) throw new Error(\"No active session.\");\n await cameraKitState.session.setFPSLimit(fps);\n setFpsLimitState(fps);\n } catch (error) {\n log.error(\"fps_limit_set_failed\", { fps }, error);\n throw error;\n }\n },\n [cameraKitState.session, log],\n );\n\n const setMuted = useCallback(\n (muted: boolean) => {\n if (!cameraKitState.session) throw new Error(\"No active session.\");\n if (muted) {\n cameraKitState.session.mute();\n } else {\n cameraKitState.session.unmute();\n }\n setIsMuted(muted);\n },\n [cameraKitState.session],\n );\n\n const toggleMuted = useCallback(() => {\n setMuted(!isMuted);\n }, [isMuted, setMuted]);\n\n const setScreenRegions = useCallback(\n async (regions: ScreenRegions) => {\n try {\n if (!cameraKitState.session) throw new Error(\"No active session.\");\n await cameraKitState.session.setScreenRegions(regions);\n setScreenRegionsState(regions);\n } catch (error) {\n log.error(\"screen_regions_set_failed\", error);\n throw error;\n }\n },\n [cameraKitState.session, log],\n );\n\n const abortCameraKit = useCallback(\n (error: unknown) => {\n cameraKitState.kit?.destroy().catch((cause) => {\n log.error(\"kit_destroy_failed\", cause);\n });\n setCameraKitState({ kit: undefined, status: \"error\", error: ensureError(error) });\n },\n [cameraKitState.kit, log],\n );\n\n useEffect(() => {\n if (!cameraKitState.session) return;\n\n function handleSessionError(event: CameraKitSessionEvents) {\n if (event.detail.error.name === \"LensExecutionError\") {\n // Update lens state to error, but don't abort the entire SDK.\n // This allows the user to apply a new lens and recover from the error.\n setLens((currentLens) => ({\n ...currentLens,\n status: \"error\",\n error: event.detail.error,\n }));\n } else if (event.detail.error.name === \"LensAbortError\") {\n // LensAbortError is a critical error that requires SDK re-initialization.\n // Abort the SDK so the user must call reinitialize() to recover.\n metricsReporter.reportCount(\"session_lens_abort_error\");\n abortCameraKit(event.detail.error);\n }\n }\n\n cameraKitState.session.events.addEventListener(\"error\", handleSessionError);\n\n return () => cameraKitState.session!.events.removeEventListener(\"error\", handleSessionError);\n }, [cameraKitState.session, abortCameraKit]);\n\n /* ---------------------------- memoised context ------------------------- */\n const ctxValue: InternalCameraKitContextValue = useMemo(\n () => ({\n cameraKit: cameraKitState.kit,\n currentSession: cameraKitState.session,\n sdkStatus: cameraKitState.status,\n sdkError: cameraKitState.error,\n\n // Canvas elements\n liveCanvas: cameraKitState.session?.output.live,\n captureCanvas: cameraKitState.session?.output.capture,\n\n source,\n lens,\n\n // Playback state\n isMuted,\n fpsLimit,\n screenRegions,\n\n keyboard: cameraKitState.session?.keyboard,\n\n getLogger,\n\n abortCameraKit,\n\n reinitialize: () => {\n if (cameraKitState.status === \"error\" && !cameraKitState.kit) {\n setBootstrapCounter((prev) => prev + 1);\n } else {\n throw new Error(\"Cannot re-initialize CameraKit when it is not in an aborted state.\");\n }\n },\n\n // Lens manager methods\n fetchLens,\n fetchLenses,\n applyLens,\n removeLens,\n refreshLens,\n lenses,\n\n // Source manager methods\n applySource,\n removeSource,\n\n // Playback control methods\n setFPSLimit,\n setMuted,\n toggleMuted,\n setScreenRegions,\n }),\n [\n cameraKitState,\n source,\n lens,\n isMuted,\n fpsLimit,\n screenRegions,\n getLogger,\n fetchLens,\n fetchLenses,\n applyLens,\n removeLens,\n refreshLens,\n lenses,\n applySource,\n removeSource,\n setFPSLimit,\n setMuted,\n toggleMuted,\n setScreenRegions,\n abortCameraKit,\n ],\n );\n\n return <CameraKitContext.Provider value={ctxValue}>{children}</CameraKitContext.Provider>;\n};\n\n/**\n * Internal hook with access to Camera Kit internals.\n * Only for use within react-camera-kit library components and hooks.\n *\n * @internal\n */\nexport const useInternalCameraKit = (): InternalCameraKitContextValue => {\n const context = useContext(CameraKitContext);\n if (!context) {\n throw new Error(\"useInternalCameraKit must be used within a CameraKitProvider\");\n }\n return context;\n};\n\n/**\n * Hook to access Camera Kit context and methods.\n *\n * Provides access to SDK state, Lens management, source control, and playback options.\n * Must be used within a CameraKitProvider.\n *\n * @returns Camera Kit context value with state and methods\n * @throws Error if used outside of CameraKitProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const {\n * sdkStatus,\n * lens,\n * applyLens,\n * removeLens,\n * liveCanvas\n * } = useCameraKit();\n *\n * useEffect(() => {\n * if (sdkStatus === 'ready') {\n * applyLens('lens-id', 'group-id');\n * }\n * }, [sdkStatus, applyLens]);\n *\n * return <div>{lens.status}</div>;\n * }\n * ```\n */\nexport const useCameraKit = (): CameraKitContextValue => {\n const context = useContext(CameraKitContext);\n if (!context) {\n throw new Error(\"useCameraKit must be used within a CameraKitProvider\");\n }\n // Return only the public API (exclude internal fields)\n const { cameraKit: _cameraKit, currentSession: _currentSession, getLogger: _getLogger, ...publicContext } = context;\n return publicContext;\n};\n"]}
@@ -10,6 +10,7 @@ export { useApplyLens } from "./useApplyLens";
10
10
  export { useApplySource } from "./useApplySource";
11
11
  export { usePlaybackOptions } from "./usePlaybackOptions";
12
12
  export type { PlaybackOptions } from "./usePlaybackOptions";
13
+ export { useLensFrameMetrics } from "./useLensFrameMetrics";
13
14
  export type { SourceStatus, LensStatus, CurrentSource, CurrentLens, CameraSourceInput, VideoSourceInput, ImageSourceInput, SourceInput, CameraSourceOutput, VideoSourceOutput, ImageSourceOutput, SourceOutput, FixedOutputSize, MatchInputSize, OutputSize, SourceOptions, CameraFacing, CameraConstraints, CameraRotation, CanvasType, CameraInfo, } from "./types";
14
15
  export { NO_CURRENT_LENS, isCameraSource, isVideoSource, isImageSource, CameraRotationOptions } from "./types";
15
16
  export { createCameraKitSource, DEFAULT_CAMERA_DEVICE_ID, defaultStreamResolution } from "./internal/sourceUtils";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACtE,YAAY,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGrE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACrD,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGjD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,YAAY,EACV,YAAY,EACZ,UAAU,EACV,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,UAAU,EACV,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,UAAU,GACX,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAG/G,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAClH,YAAY,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACtE,YAAY,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGrE,YAAY,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACrD,YAAY,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAGjD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,YAAY,EACV,YAAY,EACZ,UAAU,EACV,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,cAAc,EACd,UAAU,EACV,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,UAAU,EACV,UAAU,GACX,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAG/G,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAClH,YAAY,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/esm/index.js CHANGED
@@ -7,6 +7,7 @@ export { LiveCanvas, CaptureCanvas } from "./Canvas";
7
7
  export { useApplyLens } from "./useApplyLens";
8
8
  export { useApplySource } from "./useApplySource";
9
9
  export { usePlaybackOptions } from "./usePlaybackOptions";
10
+ export { useLensFrameMetrics } from "./useLensFrameMetrics";
10
11
  export { NO_CURRENT_LENS, isCameraSource, isVideoSource, isImageSource, CameraRotationOptions } from "./types";
11
12
  // Source utilities
12
13
  export { createCameraKitSource, DEFAULT_CAMERA_DEVICE_ID, defaultStreamResolution } from "./internal/sourceUtils";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKtE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGrD,QAAQ;AACR,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AA4B1D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAE/G,mBAAmB;AACnB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC","sourcesContent":["// Main components\nexport { CameraKitProvider, useCameraKit } from \"./CameraKitProvider\";\nexport type { MetricEventHandlerFactory } from \"./CameraKitProvider\";\n\n// Logging\nexport type { CameraKitLogger, LogLevel } from \"./internal/logging\";\nexport { createConsoleLogger, createNoopLogger } from \"./internal/logging\";\n\nexport { LensPlayer } from \"./LensPlayer\";\nexport type { LensPlayerProps } from \"./LensPlayer\";\n\nexport { LiveCanvas, CaptureCanvas } from \"./Canvas\";\nexport type { CanvasChildProps } from \"./Canvas\";\n\n// Hooks\nexport { useApplyLens } from \"./useApplyLens\";\nexport { useApplySource } from \"./useApplySource\";\nexport { usePlaybackOptions } from \"./usePlaybackOptions\";\nexport type { PlaybackOptions } from \"./usePlaybackOptions\";\n\n// Types\nexport type {\n SourceStatus,\n LensStatus,\n CurrentSource,\n CurrentLens,\n CameraSourceInput,\n VideoSourceInput,\n ImageSourceInput,\n SourceInput,\n CameraSourceOutput,\n VideoSourceOutput,\n ImageSourceOutput,\n SourceOutput,\n FixedOutputSize,\n MatchInputSize,\n OutputSize,\n SourceOptions,\n CameraFacing,\n CameraConstraints,\n CameraRotation,\n CanvasType,\n CameraInfo,\n} from \"./types\";\n\nexport { NO_CURRENT_LENS, isCameraSource, isVideoSource, isImageSource, CameraRotationOptions } from \"./types\";\n\n// Source utilities\nexport { createCameraKitSource, DEFAULT_CAMERA_DEVICE_ID, defaultStreamResolution } from \"./internal/sourceUtils\";\nexport type { SourceApplication, TupleOf } from \"./internal/sourceUtils\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKtE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGrD,QAAQ;AACR,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AA2B5D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAE/G,mBAAmB;AACnB,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC","sourcesContent":["// Main components\nexport { CameraKitProvider, useCameraKit } from \"./CameraKitProvider\";\nexport type { MetricEventHandlerFactory } from \"./CameraKitProvider\";\n\n// Logging\nexport type { CameraKitLogger, LogLevel } from \"./internal/logging\";\nexport { createConsoleLogger, createNoopLogger } from \"./internal/logging\";\n\nexport { LensPlayer } from \"./LensPlayer\";\nexport type { LensPlayerProps } from \"./LensPlayer\";\n\nexport { LiveCanvas, CaptureCanvas } from \"./Canvas\";\nexport type { CanvasChildProps } from \"./Canvas\";\n\n// Hooks\nexport { useApplyLens } from \"./useApplyLens\";\nexport { useApplySource } from \"./useApplySource\";\nexport { usePlaybackOptions } from \"./usePlaybackOptions\";\nexport type { PlaybackOptions } from \"./usePlaybackOptions\";\nexport { useLensFrameMetrics } from \"./useLensFrameMetrics\";\n\n// Types\nexport type {\n SourceStatus,\n LensStatus,\n CurrentSource,\n CurrentLens,\n CameraSourceInput,\n VideoSourceInput,\n ImageSourceInput,\n SourceInput,\n CameraSourceOutput,\n VideoSourceOutput,\n ImageSourceOutput,\n SourceOutput,\n FixedOutputSize,\n MatchInputSize,\n OutputSize,\n SourceOptions,\n CameraFacing,\n CameraConstraints,\n CameraRotation,\n CanvasType,\n CameraInfo,\n} from \"./types\";\n\nexport { NO_CURRENT_LENS, isCameraSource, isVideoSource, isImageSource, CameraRotationOptions } from \"./types\";\n\n// Source utilities\nexport { createCameraKitSource, DEFAULT_CAMERA_DEVICE_ID, defaultStreamResolution } from \"./internal/sourceUtils\";\nexport type { SourceApplication, TupleOf } from \"./internal/sourceUtils\";\n"]}
@@ -0,0 +1,31 @@
1
+ import { ComputedFrameMetrics } from "@snap/camera-kit";
2
+ interface UseLensFrameMetricsOptions {
3
+ /** Polling interval in milliseconds. How often measurement.measure() is called to update state. */
4
+ interval: number;
5
+ /** Whether measurement is active. Defaults to true. When false, no measurement is started and the hook returns undefined. */
6
+ enabled?: boolean;
7
+ }
8
+ /**
9
+ * Declaratively measures lens rendering performance.
10
+ *
11
+ * This hook manages the lifecycle of a {@link LensPerformanceMeasurement} from the CameraKit SDK.
12
+ * It begins measurement when a session is available, polls at the specified interval,
13
+ * resets when the active lens changes, and cleans up on unmount.
14
+ *
15
+ * @param options - Configuration options
16
+ * @returns The latest computed frame metrics, or undefined if no session is available.
17
+ *
18
+ * @example
19
+ * ```tsx
20
+ * function PerformanceOverlay() {
21
+ * const metrics = useLensFrameMetrics({ interval: 500 });
22
+ *
23
+ * if (!metrics) return null;
24
+ *
25
+ * return <div>FPS: {metrics.avgFps.toFixed(1)}</div>;
26
+ * }
27
+ * ```
28
+ */
29
+ export declare function useLensFrameMetrics(options: UseLensFrameMetricsOptions): ComputedFrameMetrics | undefined;
30
+ export {};
31
+ //# sourceMappingURL=useLensFrameMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLensFrameMetrics.d.ts","sourceRoot":"","sources":["../../src/useLensFrameMetrics.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAA8B,MAAM,kBAAkB,CAAC;AAGpF,UAAU,0BAA0B;IAClC,mGAAmG;IACnG,QAAQ,EAAE,MAAM,CAAC;IACjB,6HAA6H;IAC7H,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,oBAAoB,GAAG,SAAS,CA8CzG"}
@@ -0,0 +1,65 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+ import { useInternalCameraKit } from "./CameraKitProvider";
3
+ /**
4
+ * Declaratively measures lens rendering performance.
5
+ *
6
+ * This hook manages the lifecycle of a {@link LensPerformanceMeasurement} from the CameraKit SDK.
7
+ * It begins measurement when a session is available, polls at the specified interval,
8
+ * resets when the active lens changes, and cleans up on unmount.
9
+ *
10
+ * @param options - Configuration options
11
+ * @returns The latest computed frame metrics, or undefined if no session is available.
12
+ *
13
+ * @example
14
+ * ```tsx
15
+ * function PerformanceOverlay() {
16
+ * const metrics = useLensFrameMetrics({ interval: 500 });
17
+ *
18
+ * if (!metrics) return null;
19
+ *
20
+ * return <div>FPS: {metrics.avgFps.toFixed(1)}</div>;
21
+ * }
22
+ * ```
23
+ */
24
+ export function useLensFrameMetrics(options) {
25
+ const { enabled = true, interval } = options;
26
+ const { currentSession, lens } = useInternalCameraKit();
27
+ const [metrics, setMetrics] = useState(undefined);
28
+ const measurementRef = useRef(undefined);
29
+ const isFirstLensRender = useRef(true);
30
+ // Begin/end measurement lifecycle
31
+ useEffect(() => {
32
+ if (!currentSession || !enabled) {
33
+ setMetrics(undefined);
34
+ return;
35
+ }
36
+ const measurement = currentSession.metrics.beginMeasurement();
37
+ measurementRef.current = measurement;
38
+ return () => {
39
+ measurement.end();
40
+ measurementRef.current = undefined;
41
+ isFirstLensRender.current = true;
42
+ };
43
+ }, [currentSession, enabled]);
44
+ // Poll measurement on interval (separate so changing interval doesn't restart measurement)
45
+ useEffect(() => {
46
+ if (!currentSession || !enabled)
47
+ return;
48
+ const intervalId = setInterval(() => {
49
+ const result = measurementRef.current?.measure();
50
+ if (result)
51
+ setMetrics(result);
52
+ }, interval);
53
+ return () => clearInterval(intervalId);
54
+ }, [currentSession, enabled, interval]);
55
+ // Reset measurement when lens changes (skip on initial mount)
56
+ useEffect(() => {
57
+ if (isFirstLensRender.current) {
58
+ isFirstLensRender.current = false;
59
+ return;
60
+ }
61
+ measurementRef.current?.reset();
62
+ }, [lens.lensId]);
63
+ return metrics;
64
+ }
65
+ //# sourceMappingURL=useLensFrameMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLensFrameMetrics.js","sourceRoot":"","sources":["../../src/useLensFrameMetrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAS3D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAmC;IACrE,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC7C,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,oBAAoB,EAAE,CAAC;IACxD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAmC,SAAS,CAAC,CAAC;IACpF,MAAM,cAAc,GAAG,MAAM,CAAyC,SAAS,CAAC,CAAC;IACjF,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAEvC,kCAAkC;IAClC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,cAAc,IAAI,CAAC,OAAO,EAAE,CAAC;YAChC,UAAU,CAAC,SAAS,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC9D,cAAc,CAAC,OAAO,GAAG,WAAW,CAAC;QAErC,OAAO,GAAG,EAAE;YACV,WAAW,CAAC,GAAG,EAAE,CAAC;YAClB,cAAc,CAAC,OAAO,GAAG,SAAS,CAAC;YACnC,iBAAiB,CAAC,OAAO,GAAG,IAAI,CAAC;QACnC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;IAE9B,2FAA2F;IAC3F,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,cAAc,IAAI,CAAC,OAAO;YAAE,OAAO;QAExC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YAClC,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;YACjD,IAAI,MAAM;gBAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAEb,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAExC,8DAA8D;IAC9D,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;YAC9B,iBAAiB,CAAC,OAAO,GAAG,KAAK,CAAC;YAClC,OAAO;QACT,CAAC;QACD,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAClC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAElB,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { ComputedFrameMetrics, LensPerformanceMeasurement } from \"@snap/camera-kit\";\nimport { useInternalCameraKit } from \"./CameraKitProvider\";\n\ninterface UseLensFrameMetricsOptions {\n /** Polling interval in milliseconds. How often measurement.measure() is called to update state. */\n interval: number;\n /** Whether measurement is active. Defaults to true. When false, no measurement is started and the hook returns undefined. */\n enabled?: boolean;\n}\n\n/**\n * Declaratively measures lens rendering performance.\n *\n * This hook manages the lifecycle of a {@link LensPerformanceMeasurement} from the CameraKit SDK.\n * It begins measurement when a session is available, polls at the specified interval,\n * resets when the active lens changes, and cleans up on unmount.\n *\n * @param options - Configuration options\n * @returns The latest computed frame metrics, or undefined if no session is available.\n *\n * @example\n * ```tsx\n * function PerformanceOverlay() {\n * const metrics = useLensFrameMetrics({ interval: 500 });\n *\n * if (!metrics) return null;\n *\n * return <div>FPS: {metrics.avgFps.toFixed(1)}</div>;\n * }\n * ```\n */\nexport function useLensFrameMetrics(options: UseLensFrameMetricsOptions): ComputedFrameMetrics | undefined {\n const { enabled = true, interval } = options;\n const { currentSession, lens } = useInternalCameraKit();\n const [metrics, setMetrics] = useState<ComputedFrameMetrics | undefined>(undefined);\n const measurementRef = useRef<LensPerformanceMeasurement | undefined>(undefined);\n const isFirstLensRender = useRef(true);\n\n // Begin/end measurement lifecycle\n useEffect(() => {\n if (!currentSession || !enabled) {\n setMetrics(undefined);\n return;\n }\n\n const measurement = currentSession.metrics.beginMeasurement();\n measurementRef.current = measurement;\n\n return () => {\n measurement.end();\n measurementRef.current = undefined;\n isFirstLensRender.current = true;\n };\n }, [currentSession, enabled]);\n\n // Poll measurement on interval (separate so changing interval doesn't restart measurement)\n useEffect(() => {\n if (!currentSession || !enabled) return;\n\n const intervalId = setInterval(() => {\n const result = measurementRef.current?.measure();\n if (result) setMetrics(result);\n }, interval);\n\n return () => clearInterval(intervalId);\n }, [currentSession, enabled, interval]);\n\n // Reset measurement when lens changes (skip on initial mount)\n useEffect(() => {\n if (isFirstLensRender.current) {\n isFirstLensRender.current = false;\n return;\n }\n measurementRef.current?.reset();\n }, [lens.lensId]);\n\n return metrics;\n}\n"]}
@@ -1,3 +1,3 @@
1
1
  /** Package version — auto-synced from package.json by scripts/sync-version.sh. */
2
- export declare const VERSION = "0.0.2";
2
+ export declare const VERSION = "0.2.0";
3
3
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  /** Package version — auto-synced from package.json by scripts/sync-version.sh. */
2
- export const VERSION = "0.0.2";
2
+ export const VERSION = "0.2.0";
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC","sourcesContent":["/** Package version — auto-synced from package.json by scripts/sync-version.sh. */\nexport const VERSION = \"0.0.2\";\n"]}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC","sourcesContent":["/** Package version — auto-synced from package.json by scripts/sync-version.sh. */\nexport const VERSION = \"0.2.0\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@snap/react-camera-kit",
3
- "version": "0.0.2",
3
+ "version": "0.2.0",
4
4
  "description": "React Camera Kit for web applications",
5
5
  "type": "module",
6
6
  "main": "./dist/cjs/index.js",
@@ -58,6 +58,11 @@
58
58
  ],
59
59
  "author": "",
60
60
  "license": "MIT",
61
+ "repository": {
62
+ "type": "git",
63
+ "url": "https://github.com/Snapchat/react-camera-kit.git"
64
+ },
65
+ "homepage": "https://github.com/Snapchat/react-camera-kit#readme",
61
66
  "dependencies": {
62
67
  "stable-hash": "^0.0.6"
63
68
  },