reflet-sdk 0.7.0 → 0.7.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.
@@ -1 +0,0 @@
1
- {"version":3,"file":"team-activation-DCqh71bl.js","names":[],"sources":["../src/sessions/team/team-activation.ts"],"sourcesContent":["const TEAM_ACTIVATION_PARAM = \"reflet-team\";\nconst STORAGE_KEY_PREFIX = \"reflet-team-access:\";\n\nexport function teamAccessStorageKey(publicKey: string): string {\n return `${STORAGE_KEY_PREFIX}${publicKey}`;\n}\n\nfunction readStoredExpiry(publicKey: string): number | null {\n try {\n const stored: unknown = JSON.parse(\n localStorage.getItem(teamAccessStorageKey(publicKey)) ?? \"null\"\n );\n if (\n typeof stored === \"object\" &&\n stored !== null &&\n \"expiresAt\" in stored &&\n typeof stored.expiresAt === \"number\"\n ) {\n return stored.expiresAt;\n }\n return null;\n } catch {\n return null;\n }\n}\n\n/** Zod-free on purpose: the widget calls this eagerly in every customer bundle before lazy-loading team tools. */\nexport function hasTeamActivation(publicKey: string): boolean {\n const expiresAt = readStoredExpiry(publicKey);\n return (\n (expiresAt !== null && expiresAt > Date.now()) ||\n new URL(window.location.href).searchParams.has(TEAM_ACTIVATION_PARAM)\n );\n}\n"],"mappings":";AAAA,MAAM,wBAAwB;AAC9B,MAAM,qBAAqB;AAE3B,SAAgB,qBAAqB,WAA2B;CAC9D,OAAO,GAAG,qBAAqB;AACjC;AAEA,SAAS,iBAAiB,WAAkC;CAC1D,IAAI;EACF,MAAM,SAAkB,KAAK,MAC3B,aAAa,QAAQ,qBAAqB,SAAS,CAAC,KAAK,MAC3D;EACA,IACE,OAAO,WAAW,YAClB,WAAW,QACX,eAAe,UACf,OAAO,OAAO,cAAc,UAE5B,OAAO,OAAO;EAEhB,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;;AAGA,SAAgB,kBAAkB,WAA4B;CAC5D,MAAM,YAAY,iBAAiB,SAAS;CAC5C,OACG,cAAc,QAAQ,YAAY,KAAK,IAAI,KAC5C,IAAI,IAAI,OAAO,SAAS,IAAI,CAAC,CAAC,aAAa,IAAI,qBAAqB;AAExE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"team-layer-gMWcOdCd.js","names":[],"sources":["../src/sessions/team/team-auth.ts","../src/sessions/team/team-sign-in-card.tsx","../src/sessions/team/team-layer.tsx"],"sourcesContent":["import { z } from \"zod\";\nimport { sessionApiErrorSchema } from \"../protocol\";\nimport { teamAccessStorageKey } from \"./team-activation\";\n\nconst TEAM_ACCESS_MESSAGE_TYPE = \"reflet:team-access\";\nconst POPUP_NAME = \"reflet-team-access\";\nconst POPUP_WIDTH_PX = 480;\nconst POPUP_HEIGHT_PX = 680;\nconst POPUP_CLOSED_POLL_MS = 500;\nconst SIGN_IN_TIMEOUT_MS = 5 * 60_000;\nconst PKCE_RANDOM_BYTES = 32;\nconst TRAILING_SLASHES = /\\/+$/;\nconst BASE64_PADDING = /[=]+$/;\n\nconst teamAccessSchema = z.object({\n expiresAt: z.number(),\n organizationName: z.string(),\n token: z.string().startsWith(\"fb_team_\"),\n});\n\nexport type TeamAccess = z.infer<typeof teamAccessSchema>;\n\nconst teamAccessMessageSchema = z.union([\n z.object({\n code: z.string().min(1),\n state: z.string(),\n type: z.literal(TEAM_ACCESS_MESSAGE_TYPE),\n }),\n z.object({\n error: z.literal(\"cancelled\"),\n state: z.string(),\n type: z.literal(TEAM_ACCESS_MESSAGE_TYPE),\n }),\n]);\n\nconst SIGN_IN_FAILURE_MESSAGES = {\n cancelled: \"Sign-in was cancelled.\",\n exchange_failed: \"Couldn't finish signing in to Reflet. Try again.\",\n popup_blocked:\n \"Your browser blocked the Reflet sign-in window. Allow pop-ups for this site, then try again.\",\n timeout: \"Signing in took too long. Try again.\",\n} as const;\n\nexport type TeamSignInFailure = keyof typeof SIGN_IN_FAILURE_MESSAGES;\n\nexport class TeamSignInError extends Error {\n readonly reason: TeamSignInFailure;\n\n constructor(reason: TeamSignInFailure, message?: string) {\n super(message ?? SIGN_IN_FAILURE_MESSAGES[reason]);\n this.name = \"TeamSignInError\";\n this.reason = reason;\n }\n}\n\nfunction base64Url(bytes: Uint8Array): string {\n return btoa(String.fromCharCode(...bytes))\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(BASE64_PADDING, \"\");\n}\n\nfunction randomBase64Url(): string {\n return base64Url(crypto.getRandomValues(new Uint8Array(PKCE_RANDOM_BYTES)));\n}\n\nasync function pkceChallengeFor(codeVerifier: string): Promise<string> {\n const digest = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(codeVerifier)\n );\n return base64Url(new Uint8Array(digest));\n}\n\nfunction apiEndpoint(apiUrl: string, path: string): string {\n return `${apiUrl.replace(TRAILING_SLASHES, \"\")}${path}`;\n}\n\nfunction parseStoredJson(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n\nfunction storedTeamAccess(publicKey: string): TeamAccess | null {\n try {\n const raw = localStorage.getItem(teamAccessStorageKey(publicKey));\n const parsed = teamAccessSchema.safeParse(\n raw === null ? null : parseStoredJson(raw)\n );\n return parsed.success ? parsed.data : null;\n } catch {\n return null;\n }\n}\n\nfunction persistTeamAccess(publicKey: string, access: TeamAccess | null): void {\n try {\n if (access) {\n localStorage.setItem(\n teamAccessStorageKey(publicKey),\n JSON.stringify(access)\n );\n } else {\n localStorage.removeItem(teamAccessStorageKey(publicKey));\n }\n } catch {\n // Storage disabled by browser policy: access then only lasts for this page.\n }\n}\n\nexport function readTeamAccess(publicKey: string): TeamAccess | null {\n const access = storedTeamAccess(publicKey);\n if (access && access.expiresAt > Date.now()) {\n return access;\n }\n persistTeamAccess(publicKey, null);\n return null;\n}\n\nfunction centeredPopupFeatures(): string {\n const left = Math.round(\n window.screenX + (window.outerWidth - POPUP_WIDTH_PX) / 2\n );\n const top = Math.round(\n window.screenY + (window.outerHeight - POPUP_HEIGHT_PX) / 2\n );\n return `popup,width=${POPUP_WIDTH_PX},height=${POPUP_HEIGHT_PX},left=${left},top=${top}`;\n}\n\nfunction waitForApprovedCode(options: {\n appOrigin: string;\n popup: Window;\n state: string;\n}): Promise<string> {\n // Executor form: the SDK targets ES2022, before `Promise.withResolvers`.\n return new Promise((resolve, reject) => {\n const listening = new AbortController();\n let closedOnLastPoll = false;\n const settle = (outcome: { code: string } | TeamSignInError) => {\n listening.abort();\n window.clearInterval(closedPoll);\n window.clearTimeout(timeout);\n if (outcome instanceof TeamSignInError) {\n reject(outcome);\n } else {\n resolve(outcome.code);\n }\n };\n const closedPoll = window.setInterval(() => {\n if (closedOnLastPoll) {\n settle(new TeamSignInError(\"cancelled\"));\n }\n closedOnLastPoll = options.popup.closed;\n }, POPUP_CLOSED_POLL_MS);\n const timeout = window.setTimeout(() => {\n options.popup.close();\n settle(new TeamSignInError(\"timeout\"));\n }, SIGN_IN_TIMEOUT_MS);\n window.addEventListener(\n \"message\",\n (event: MessageEvent) => {\n if (event.origin !== options.appOrigin) {\n return;\n }\n const message = teamAccessMessageSchema.safeParse(event.data);\n if (message.success && message.data.state === options.state) {\n settle(\n \"code\" in message.data\n ? { code: message.data.code }\n : new TeamSignInError(\"cancelled\")\n );\n }\n },\n { signal: listening.signal }\n );\n });\n}\n\nasync function exchangeCode(options: {\n apiUrl: string;\n code: string;\n codeVerifier: string;\n}): Promise<TeamAccess> {\n const response = await fetch(\n apiEndpoint(options.apiUrl, \"/api/v1/team/token\"),\n {\n body: JSON.stringify({\n code: options.code,\n codeVerifier: options.codeVerifier,\n }),\n headers: { \"Content-Type\": \"application/json\" },\n method: \"POST\",\n }\n );\n if (!response.ok) {\n const failure = sessionApiErrorSchema.safeParse(\n await response.json().catch(() => null)\n );\n throw new TeamSignInError(\n \"exchange_failed\",\n failure.success ? failure.data.error : undefined\n );\n }\n const access = teamAccessSchema.safeParse(\n await response.json().catch(() => null)\n );\n if (!access.success) {\n throw new TeamSignInError(\"exchange_failed\");\n }\n return access.data;\n}\n\n/** Call from a click handler: the popup opens before anything is awaited so browsers don't block it. */\nexport async function signInTeam(options: {\n apiUrl: string;\n appUrl: string;\n publicKey: string;\n}): Promise<TeamAccess> {\n const popup = window.open(\"about:blank\", POPUP_NAME, centeredPopupFeatures());\n if (!popup) {\n throw new TeamSignInError(\"popup_blocked\");\n }\n const codeVerifier = randomBase64Url();\n const state = randomBase64Url();\n const consentUrl = new URL(\"/auth/team\", options.appUrl);\n consentUrl.search = new URLSearchParams({\n code_challenge: await pkceChallengeFor(codeVerifier),\n origin: window.location.origin,\n public_key: options.publicKey,\n state,\n }).toString();\n popup.location.href = consentUrl.href;\n\n const code = await waitForApprovedCode({\n appOrigin: consentUrl.origin,\n popup,\n state,\n });\n const access = await exchangeCode({\n apiUrl: options.apiUrl,\n code,\n codeVerifier,\n });\n persistTeamAccess(options.publicKey, access);\n return access;\n}\n\nexport async function forgetTeamAccess(options: {\n apiUrl: string;\n publicKey: string;\n}): Promise<void> {\n const access = storedTeamAccess(options.publicKey);\n persistTeamAccess(options.publicKey, null);\n if (!access) {\n return;\n }\n await fetch(apiEndpoint(options.apiUrl, \"/api/v1/team/revoke\"), {\n headers: { Authorization: `Bearer ${access.token}` },\n method: \"POST\",\n });\n}\n","import { useState } from \"react\";\nimport { failureMessage } from \"../ui/session-workspace\";\nimport { signInTeam, type TeamAccess } from \"./team-auth\";\n\nexport interface TeamConnection {\n apiUrl: string;\n appUrl: string;\n publicKey: string;\n}\n\nfunction useTeamSignIn(\n connection: TeamConnection,\n onSignedIn: (access: TeamAccess) => void\n) {\n const [isSigningIn, setIsSigningIn] = useState(false);\n const [failure, setFailure] = useState<string | null>(null);\n\n const signIn = async () => {\n setIsSigningIn(true);\n setFailure(null);\n try {\n onSignedIn(await signInTeam(connection));\n } catch (error) {\n setFailure(failureMessage(error));\n }\n setIsSigningIn(false);\n };\n\n return { failure, isSigningIn, signIn };\n}\n\nfunction SignInActions({\n isSigningIn,\n onHide,\n onSignIn,\n}: {\n isSigningIn: boolean;\n onHide: () => void;\n onSignIn: () => void;\n}) {\n return (\n <div className=\"dt-actions\">\n <button\n className=\"dt-btn\"\n data-variant=\"primary\"\n disabled={isSigningIn}\n onClick={onSignIn}\n type=\"button\"\n >\n Sign in with Reflet\n </button>\n <button className=\"dt-btn\" onClick={onHide} type=\"button\">\n Hide\n </button>\n </div>\n );\n}\n\nexport function TeamSignInCard({\n connection,\n notice,\n onSignedIn,\n}: {\n connection: TeamConnection;\n notice: string | null;\n onSignedIn: (access: TeamAccess) => void;\n}) {\n const [isHidden, setIsHidden] = useState(false);\n const { failure, isSigningIn, signIn } = useTeamSignIn(\n connection,\n onSignedIn\n );\n\n if (isHidden) {\n return null;\n }\n return (\n <section aria-labelledby=\"rf-team-title\" className=\"dt-team-card glass\">\n <h2 className=\"dt-ses-subhead\" id=\"rf-team-title\">\n Reflet team tools\n </h2>\n <p className=\"dt-meta\">\n Sign in with your Reflet account to record a session on this app.\n </p>\n <p className=\"dt-meta\">\n Only members of the app's Reflet organization can sign in.\n </p>\n {notice && <p className=\"dt-meta\">{notice}</p>}\n {failure && (\n <p className=\"dt-error\" role=\"alert\">\n {failure}\n </p>\n )}\n <SignInActions\n isSigningIn={isSigningIn}\n onHide={() => setIsHidden(true)}\n onSignIn={signIn}\n />\n </section>\n );\n}\n","import { useState } from \"react\";\nimport {\n BarButton,\n DevtoolsBar,\n SessionsBarButton,\n} from \"../../devtools/client/devtools-bar\";\nimport { DevtoolsSheet } from \"../../devtools/client/devtools-sheet\";\nimport { DEVTOOLS_STYLES } from \"../../devtools/client/devtools-styles\";\nimport { Notices, reportFailure } from \"../../devtools/client/notices\";\nimport type { RefletFeedbackProps } from \"../../feedback/types\";\nimport { teamTransport } from \"../api/session-transports\";\nimport { purgeAccount } from \"../local/local-sessions\";\nimport { RecordingLayer } from \"../ui/recording/recording-layer\";\nimport { PersonIcon } from \"../ui/session-icons\";\nimport {\n type SessionWorkspace,\n SessionWorkspaceProvider,\n useWorkspaceLoader,\n type WorkspaceState,\n} from \"../ui/session-workspace\";\nimport { type SessionNavigation, SessionsPanel } from \"../ui/sessions-panel\";\nimport { SESSIONS_STYLES } from \"../ui/sessions-styles\";\nimport type { SessionTarget } from \"../ui/start/session-list\";\nimport { forgetTeamAccess, readTeamAccess, type TeamAccess } from \"./team-auth\";\nimport { type TeamConnection, TeamSignInCard } from \"./team-sign-in-card\";\n\nconst TEAM_TOOLS_LABEL = \"Reflet team tools\";\nconst REFUSED_SIGN_IN_COPY =\n \"Reflet no longer accepts this sign-in. Sign in again to record.\";\n\ninterface TeamPlacement {\n edge: \"bottom\" | \"top\";\n side: \"left\" | \"right\";\n}\n\nfunction AccountControls({\n access,\n onSignOut,\n workspace,\n}: {\n access: TeamAccess;\n onSignOut: () => void;\n workspace: SessionWorkspace | null;\n}) {\n const [isOpen, setIsOpen] = useState(false);\n const user = workspace?.account.userName ?? workspace?.account.userEmail;\n const label = user\n ? `Signed in as ${user} · ${access.organizationName}`\n : `Signed in · ${access.organizationName}`;\n return (\n <>\n <BarButton\n label={label}\n onClick={() => setIsOpen(!isOpen)}\n pressed={isOpen}\n >\n <PersonIcon />\n </BarButton>\n {isOpen && (\n <button className=\"dt-btn\" onClick={onSignOut} type=\"button\">\n Sign out\n </button>\n )}\n </>\n );\n}\n\nfunction SessionsBody({\n navigation,\n onStarted,\n state,\n}: {\n navigation: SessionNavigation;\n onStarted: () => void;\n state: WorkspaceState;\n}) {\n if (state.kind === \"ready\") {\n return <SessionsPanel navigation={navigation} onStarted={onStarted} />;\n }\n if (state.kind === \"failed\") {\n return (\n <div className=\"dt-empty\" role=\"alert\">\n <p>Sessions did not open: {state.message}</p>\n <button className=\"dt-btn\" onClick={state.retry} type=\"button\">\n Try again\n </button>\n </div>\n );\n }\n return <p className=\"dt-status\">Opening your sessions…</p>;\n}\n\nfunction TeamSheet({\n navigation,\n onOpenChange,\n side,\n state,\n}: {\n navigation: SessionNavigation;\n onOpenChange: (isOpen: boolean) => void;\n side: TeamPlacement[\"side\"];\n state: WorkspaceState;\n}) {\n return (\n <DevtoolsSheet\n label={TEAM_TOOLS_LABEL}\n onClose={() => onOpenChange(false)}\n onSelectTab={() => onOpenChange(true)}\n side={side}\n tab=\"sessions\"\n tabs={[\"sessions\"]}\n >\n <SessionsBody\n navigation={navigation}\n onStarted={() => onOpenChange(false)}\n state={state}\n />\n </DevtoolsSheet>\n );\n}\n\ninterface TeamSession {\n access: TeamAccess;\n apiUrl: string;\n onSignOut: (reason: string | null) => void;\n}\n\nfunction useTeamTransport(team: TeamSession) {\n const createTransport = () => ({\n apiUrl: team.apiUrl,\n transport: teamTransport({ apiUrl: team.apiUrl, token: team.access.token }),\n });\n const [current, setCurrent] = useState(createTransport);\n if (current.apiUrl !== team.apiUrl) {\n const next = createTransport();\n setCurrent(next);\n return next.transport;\n }\n return current.transport;\n}\n\nfunction useTeamWorkspace(team: TeamSession) {\n const { onSignOut } = team;\n const transport = useTeamTransport(team);\n const state = useWorkspaceLoader({\n onUnauthorized: () => onSignOut(REFUSED_SIGN_IN_COPY),\n surface: \"app\",\n transport,\n });\n const workspace = state.kind === \"ready\" ? state.workspace : null;\n\n const signOut = async () => {\n if (workspace) {\n await purgeAccount(workspace.account.key).catch((error: unknown) =>\n reportFailure(\"This device's session data was not removed\", error)\n );\n }\n onSignOut(null);\n };\n\n return { signOut, state, workspace };\n}\n\nfunction TeamTools({\n team,\n placement,\n}: {\n placement: TeamPlacement;\n team: TeamSession;\n}) {\n const { signOut, state, workspace } = useTeamWorkspace(team);\n const [isSheetOpen, setIsSheetOpen] = useState(false);\n const [open, setOpen] = useState<SessionTarget | null>(null);\n\n return (\n <SessionWorkspaceProvider workspace={workspace}>\n {isSheetOpen && (\n <TeamSheet\n navigation={{ onOpen: setOpen, open }}\n onOpenChange={setIsSheetOpen}\n side={placement.side}\n state={state}\n />\n )}\n <DevtoolsBar\n edge={placement.edge}\n label={TEAM_TOOLS_LABEL}\n side={placement.side}\n >\n <SessionsBarButton\n isOpen={isSheetOpen}\n onToggle={() => setIsSheetOpen(!isSheetOpen)}\n />\n <AccountControls\n access={team.access}\n onSignOut={signOut}\n workspace={workspace}\n />\n </DevtoolsBar>\n {workspace && (\n <RecordingLayer\n onFinished={(target) => {\n setOpen(target);\n setIsSheetOpen(true);\n }}\n />\n )}\n </SessionWorkspaceProvider>\n );\n}\n\nfunction placementFor(\n position: NonNullable<RefletFeedbackProps[\"position\"]>\n): TeamPlacement {\n return {\n edge: position.startsWith(\"top\") ? \"top\" : \"bottom\",\n side: position.endsWith(\"right\") ? \"right\" : \"left\",\n };\n}\n\nexport function TeamLayer({\n connection,\n position,\n}: {\n connection: TeamConnection;\n position: NonNullable<RefletFeedbackProps[\"position\"]>;\n}) {\n const { apiUrl, publicKey } = connection;\n const [access, setAccess] = useState(() => readTeamAccess(publicKey));\n const [notice, setNotice] = useState<string | null>(null);\n const signOut = (reason: string | null) => {\n setAccess(null);\n setNotice(reason);\n forgetTeamAccess({ apiUrl, publicKey }).catch((error: unknown) =>\n reportFailure(\"Signing out of Reflet did not finish\", error)\n );\n };\n const placement = placementFor(position);\n\n return (\n <div className=\"dt\">\n <style>{`${DEVTOOLS_STYLES}${SESSIONS_STYLES}`}</style>\n {access ? (\n <TeamTools\n placement={placement}\n team={{ access, apiUrl, onSignOut: signOut }}\n />\n ) : (\n <div\n className=\"dt-team-anchor\"\n data-edge={placement.edge}\n data-side={placement.side}\n >\n <TeamSignInCard\n connection={connection}\n notice={notice}\n onSignedIn={(signedIn) => {\n setAccess(signedIn);\n setNotice(null);\n }}\n />\n </div>\n )}\n <Notices />\n </div>\n );\n}\n"],"mappings":"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"}