{"version":3,"sources":["../../src/sharing/consumeHandoffToken.ts","../../src/sharing/createHandoffRouteHandler.ts","../../src/lib/message-protocol.ts","../../src/sharing/multiAccountAutoAdd.ts"],"sourcesContent":["import type {\r\n  ConsumeHandoffTokenOptions,\r\n  HandoffFailureReason,\r\n  HandoffResult,\r\n} from './types';\r\n\r\nconst DEFAULT_TIMEOUT_MS = 5_000;\r\n\r\nfunction mapStatusToReason(status: number): HandoffFailureReason {\r\n  switch (status) {\r\n    case 410: return 'expired';\r\n    case 409: return 'consumed';\r\n    case 403: return 'wrong_target';\r\n    default:  return 'unknown';\r\n  }\r\n}\r\n\r\n/**\r\n * Server-side handoff token redemption.\r\n *\r\n * Calls the destination's own PHP backend at `POST /api/v1/inbound/handoff/exchange`\r\n * (controller mounted by `auth-service-helper` in phase D2c). The backend relays\r\n * to auth-service `POST /handoff-tokens/{token}/exchange` with its X-API-KEY,\r\n * then returns the resolved user + session token to this Next layer.\r\n *\r\n * Never call auth-service directly from here — keep service API keys in PHP.\r\n */\r\nexport async function consumeHandoffToken(\r\n  options: ConsumeHandoffTokenOptions,\r\n): Promise<HandoffResult> {\r\n  const { token, backendUrl, serviceApiKey, internalToken } = options;\r\n  const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\r\n\r\n  const controller = new AbortController();\r\n  const timer = setTimeout(() => controller.abort(), timeoutMs);\r\n\r\n  let response: Response;\r\n  try {\r\n    response = await fetch(`${backendUrl}/api/v1/inbound/handoff/exchange`, {\r\n      method: 'POST',\r\n      headers: {\r\n        'Content-Type': 'application/json',\r\n        Accept: 'application/json',\r\n        'X-API-KEY': serviceApiKey,\r\n        'X-Internal-Token': internalToken,\r\n      },\r\n      body: JSON.stringify({ token }),\r\n      signal: controller.signal,\r\n      cache: 'no-store',\r\n    });\r\n  } catch {\r\n    clearTimeout(timer);\r\n    return { ok: false, reason: 'network' };\r\n  }\r\n  clearTimeout(timer);\r\n\r\n  if (!response.ok) {\r\n    return { ok: false, reason: mapStatusToReason(response.status), status: response.status };\r\n  }\r\n\r\n  let body: unknown;\r\n  try {\r\n    body = await response.json();\r\n  } catch {\r\n    return { ok: false, reason: 'unknown', status: response.status };\r\n  }\r\n\r\n  if (!isExchangeBody(body)) {\r\n    return { ok: false, reason: 'unknown', status: response.status };\r\n  }\r\n\r\n  return {\r\n    ok: true,\r\n    user: {\r\n      uuid: body.user.uuid,\r\n      name: body.user.name,\r\n      email: body.user.email,\r\n    },\r\n    sessionToken: body.session_token,\r\n    shareId: body.share_id,\r\n    nextPath: body.next_path ?? '/',\r\n  };\r\n}\r\n\r\nfunction isExchangeBody(value: unknown): value is {\r\n  user: { uuid: string; name: string; email: string };\r\n  session_token: string;\r\n  share_id: string;\r\n  next_path?: string | null;\r\n} {\r\n  if (!value || typeof value !== 'object') return false;\r\n  const v = value as Record<string, unknown>;\r\n  if (typeof v.session_token !== 'string') return false;\r\n  if (typeof v.share_id !== 'string') return false;\r\n  const u = v.user as Record<string, unknown> | undefined;\r\n  if (!u || typeof u !== 'object') return false;\r\n  return (\r\n    typeof u.uuid === 'string' &&\r\n    typeof u.name === 'string' &&\r\n    typeof u.email === 'string'\r\n  );\r\n}\r\n","import { consumeHandoffToken } from './consumeHandoffToken';\r\n\r\nexport interface CreateHandoffRouteHandlerOptions {\r\n  /** Destination's own PHP backend base URL (server env var). */\r\n  backendUrl: string;\r\n  /** Destination's service API key (server env var). */\r\n  serviceApiKey: string;\r\n  /** Internal shared secret between this Next server and its PHP backend. */\r\n  internalToken: string;\r\n  /** Where to send users on missing/invalid tokens. Default: `/login`. */\r\n  loginPath?: string;\r\n  /** Landing page path that runs the client-side multi-account auto-add. Default: `/auth/handoff/landing`. */\r\n  landingPath?: string;\r\n}\r\n\r\n/**\r\n * Build a Next App Router GET handler for `app/auth/handoff/route.ts`.\r\n *\r\n * Consumer usage (copy-pasta — package can't ship route files):\r\n *\r\n * ```ts\r\n * // src/app/auth/handoff/route.ts\r\n * import { createHandoffRouteHandler } from '@benbraide/auth-service-nextjs/sharing';\r\n *\r\n * export const GET = createHandoffRouteHandler({\r\n *   backendUrl: process.env.NEXT_PUBLIC_BACKEND_URL!,\r\n *   serviceApiKey: process.env.NEXT_SERVICE_API_KEY!,\r\n *   internalToken: process.env.NEXT_INTERNAL_TOKEN!,\r\n * });\r\n * ```\r\n */\r\nexport function createHandoffRouteHandler(\r\n  options: CreateHandoffRouteHandlerOptions,\r\n) {\r\n  const loginPath = options.loginPath ?? '/login';\r\n  const landingPath = options.landingPath ?? '/auth/handoff/landing';\r\n\r\n  return async function GET(request: Request): Promise<Response> {\r\n    const url = new URL(request.url);\r\n    const token = url.searchParams.get('token');\r\n    const nextParam = url.searchParams.get('next');\r\n\r\n    if (!token) {\r\n      return Response.redirect(new URL(loginPath, url), 302);\r\n    }\r\n\r\n    const result = await consumeHandoffToken({\r\n      token,\r\n      backendUrl: options.backendUrl,\r\n      serviceApiKey: options.serviceApiKey,\r\n      internalToken: options.internalToken,\r\n    });\r\n\r\n    if (!result.ok) {\r\n      const errUrl = new URL(loginPath, url);\r\n      errUrl.searchParams.set('error', `handoff_${result.reason}`);\r\n      return Response.redirect(errUrl, 302);\r\n    }\r\n\r\n    const bridge = new URL(landingPath, url);\r\n    bridge.searchParams.set('account_uuid', result.user.uuid);\r\n    bridge.searchParams.set('session_token', result.sessionToken);\r\n    bridge.searchParams.set('next', nextParam ?? result.nextPath);\r\n    bridge.searchParams.set('toast', `Now viewing as ${result.user.name}`);\r\n    return Response.redirect(bridge, 302);\r\n  };\r\n}\r\n","/**\r\n * Message types for PostMessage communication between iframe and parent window\r\n */\r\nexport const MESSAGE_TYPES = {\r\n  // Handshake messages\r\n  READY: 'READY',                          // iframe → host: Iframe loaded and ready\r\n  HANDSHAKE: 'HANDSHAKE',                  // host → iframe: Host origin identification\r\n  HANDSHAKE_ACK: 'HANDSHAKE_ACK',          // iframe → host: Origin validated, connection established\r\n\r\n  // Unified Action Protocol (new)\r\n  ACTION_REQUEST: 'ACTION_REQUEST',        // host → iframe: Unified action request\r\n  URL_REDIRECT: 'URL_REDIRECT',            // iframe → host: Unified navigation request\r\n\r\n  // Account query messages (legacy - kept for backward compatibility)\r\n  GET_ACCOUNTS: 'GET_ACCOUNTS',            // host → iframe: Request account list\r\n  ACCOUNTS_DATA: 'ACCOUNTS_DATA',          // iframe → host: Send account data\r\n\r\n  // Account action messages (legacy - kept for backward compatibility)\r\n  SWITCH_ACCOUNT: 'SWITCH_ACCOUNT',        // host → iframe: Request account switch\r\n  ACCOUNT_SWITCHED: 'ACCOUNT_SWITCHED',    // iframe → host: Account switch completed\r\n  ADD_ACCOUNT: 'ADD_ACCOUNT',              // host → iframe: Request add account flow\r\n  ACCOUNT_ADDED: 'ACCOUNT_ADDED',          // iframe → host: Account added successfully\r\n\r\n  // Cross-product handoff (Sharing protocol — F3/F4/A6)\r\n  // Values MUST be SCREAMING_SNAKE to match the auth-service iframe's own\r\n  // MESSAGE_TYPES registry (resources/js/widgets/message-protocol.js). The\r\n  // iframe's isValidMessage() whitelists by value, so a kebab-case slug is\r\n  // silently dropped and the handoff never completes.\r\n  ADD_ACCOUNT_WITH_TOKEN: 'ADD_ACCOUNT_WITH_TOKEN',                  // host → iframe: push a pre-authenticated account\r\n  ADD_ACCOUNT_WITH_TOKEN_OK: 'ADD_ACCOUNT_WITH_TOKEN_OK',            // iframe → host: cookie written, account appended\r\n  ADD_ACCOUNT_WITH_TOKEN_FAILED: 'ADD_ACCOUNT_WITH_TOKEN_FAILED',    // iframe → host: backend rejected the session token\r\n\r\n  // Prep–Sign–Promote pattern (v1.4 sharing/prep/*)\r\n  PREP_SIGNED:      'prep-signed',         // peer iframe → host: signature captured, prep flipped to 'signed'\r\n  PREP_SIGN_FAILED: 'prep-sign-failed',    // peer iframe → host: signature rejected by intent handler\r\n\r\n  MANAGE_ACCOUNT: 'MANAGE_ACCOUNT',        // iframe → host: Request account management flow\r\n  UPDATE_AVATAR: 'UPDATE_AVATAR',          // iframe → host: Request avatar update flow\r\n  LOGOUT_ACCOUNT: 'LOGOUT_ACCOUNT',        // host → iframe: Request logout specific account\r\n  ACCOUNT_LOGGED_OUT: 'ACCOUNT_LOGGED_OUT', // iframe → host: Account logged out\r\n  LOGOUT_ALL: 'LOGOUT_ALL',                // host → iframe: Request logout all accounts\r\n  ALL_LOGGED_OUT: 'ALL_LOGGED_OUT',        // iframe → host: All accounts logged out\r\n\r\n  // Interactive request messages (iframe → host)\r\n  CONFIRM_REQUEST: 'CONFIRM_REQUEST',      // iframe → host: Request user confirmation\r\n  PROMPT_REQUEST: 'PROMPT_REQUEST',        // iframe → host: Request user text input\r\n  ALERT_REQUEST: 'ALERT_REQUEST',          // iframe → host: Request user acknowledgment\r\n  REQUEST_RESPONSE: 'REQUEST_RESPONSE',    // host → iframe: Response to interactive request\r\n\r\n  // Event notifications\r\n  SESSION_CHANGED: 'SESSION_CHANGED',      // iframe → host: Session state changed\r\n  TOKEN_REFRESHED: 'TOKEN_REFRESHED',      // iframe → host: Auth token refreshed\r\n  SIZE_CHANGED: 'SIZE_CHANGED',            // iframe → host: Content height changed\r\n\r\n  // External session management\r\n  SET_SESSION: 'SET_SESSION',              // host → iframe: Set session from external login\r\n  SESSION_SET: 'SESSION_SET',              // iframe → host: Confirm session was set\r\n\r\n  // Page context messages\r\n  SET_PAGE_URL: 'SET_PAGE_URL',            // host → iframe: Update current page URL\r\n\r\n  // Error messages\r\n  ERROR: 'ERROR',                          // both ways: Error notification\r\n  UNAUTHORIZED: 'UNAUTHORIZED',            // iframe → host: Origin not authorized\r\n} as const;\r\n\r\n/**\r\n * PostMessage message structure\r\n */\r\nexport interface PostMessageData {\r\n  type: string;\r\n  payload?: any;\r\n  requestId?: string;\r\n  timestamp?: number;\r\n  version?: string;\r\n}\r\n\r\n/**\r\n * Session change event payload\r\n */\r\nexport interface SessionChangedPayload {\r\n  isAuthenticated: boolean;\r\n  currentUser: any;\r\n  accounts: any[];\r\n}\r\n\r\n/**\r\n * Account switched event payload\r\n */\r\nexport interface AccountSwitchedPayload {\r\n  uuid: string;\r\n  name: string;\r\n  email: string;\r\n  avatar_url?: string;\r\n}\r\n\r\n/**\r\n * Error event payload\r\n */\r\nexport interface ErrorPayload {\r\n  message: string;\r\n  code?: string;\r\n  details?: any;\r\n}\r\n\r\n/**\r\n * Resize event payload\r\n */\r\nexport interface ResizePayload {\r\n  height: number;\r\n}\r\n\r\n/**\r\n * Action request payload (Unified Action Protocol)\r\n */\r\nexport interface ActionRequestPayload {\r\n  action: string;\r\n  params: Record<string, any>;\r\n}\r\n\r\n/**\r\n * URL redirect payload (Unified Action Protocol)\r\n */\r\nexport interface UrlRedirectPayload {\r\n  url: string;\r\n  reason?: string;\r\n  openInNewTab?: boolean;\r\n}\r\n\r\n/**\r\n * Sharing protocol — request payload sent by `multiAccountAutoAdd` (F4) to the\r\n * auth-service iframe (A6). The iframe redeems the session token at its own\r\n * backend, writes the destination-scoped session cookie, and acks with\r\n * ADD_ACCOUNT_WITH_TOKEN_OK (or ..._FAILED).\r\n */\r\nexport interface AddAccountWithTokenPayload {\r\n  /** UUID of the user being added — must match the user the session token was issued for. */\r\n  accountUuid: string;\r\n  /** Short-lived session token returned by the handoff exchange (F1). */\r\n  sessionToken: string;\r\n}\r\n\r\n/**\r\n * Sharing protocol — iframe → host: cookie written and account appended.\r\n */\r\nexport interface AddAccountWithTokenOkPayload {\r\n  accountUuid: string;\r\n}\r\n\r\n/**\r\n * Sharing protocol — iframe → host: redemption failed.\r\n *\r\n * `reason` is one of:\r\n * - `http_401` — session token invalid / expired (auth-service rejected)\r\n * - `http_4xx` / `http_5xx` — generic upstream error\r\n * - `network` — fetch to iframe's own backend failed\r\n * - `mismatch` — session token's user didn't match `accountUuid`\r\n */\r\nexport interface AddAccountWithTokenFailedPayload {\r\n  reason: string;\r\n  message?: string;\r\n}\r\n\r\n/**\r\n * Prep–Sign–Promote (v1.4) — iframe → host: signature captured.\r\n * Fires from the peer's /sharing/embed/{slug}/{prep_id} surface after a\r\n * successful POST to .../submit. The orchestrator's <PrepEmbed> listens\r\n * for this to chain into Sharing::shareUser + Sharing::promote.\r\n */\r\nexport interface PrepSignedPayload {\r\n  prep_id: string;\r\n}\r\n\r\n/**\r\n * Prep–Sign–Promote (v1.4) — iframe → host: signature rejected.\r\n * `error` mirrors the JSON body's `error` field from /submit (e.g.\r\n * `handler_rejected`, `invalid_state`, `not_found`).\r\n */\r\nexport interface PrepSignFailedPayload {\r\n  prep_id: string;\r\n  error: string;\r\n  message?: string;\r\n}\r\n","import { MESSAGE_TYPES } from '../lib/message-protocol';\r\nimport type {\r\n  AddAccountWithTokenFailedPayload,\r\n  AddAccountWithTokenOkPayload,\r\n  AddAccountWithTokenPayload,\r\n} from '../lib/message-protocol';\r\nimport type { PostMessageClient } from '../lib/client';\r\n\r\nexport class MultiAccountAutoAddError extends Error {\r\n  constructor(public readonly reason: string, message?: string) {\r\n    super(message ?? `multi-account auto-add failed: ${reason}`);\r\n    this.name = 'MultiAccountAutoAddError';\r\n  }\r\n}\r\n\r\nexport interface SwitcherApi {\r\n  addAccount: () => Promise<void>;\r\n  switchAccount: (uuid: string) => Promise<void>;\r\n}\r\n\r\nexport interface MultiAccountAutoAddOptions {\r\n  accountUuid: string;\r\n  sessionToken: string;\r\n  switcher: SwitcherApi;\r\n  /** The live PostMessageClient (typically from AccountSwitcherProvider context). */\r\n  client: Pick<PostMessageClient, 'on' | 'off'>;\r\n  /**\r\n   * Function that posts a typed message to the iframe. Defaults to the\r\n   * private `sendMessage` of PostMessageClient — injected here for unit\r\n   * testability since the real method is private.\r\n   */\r\n  sendMessage: (type: string, payload: unknown) => void;\r\n  /** Override the default 5000ms ack timeout. */\r\n  timeoutMs?: number;\r\n}\r\n\r\nconst DEFAULT_TIMEOUT_MS = 5_000;\r\n\r\n/**\r\n * Push a pre-authenticated account into the destination's account switcher.\r\n *\r\n * 1. Sends ADD_ACCOUNT_WITH_TOKEN over postMessage\r\n * 2. Awaits ADD_ACCOUNT_WITH_TOKEN_OK / _FAILED (timeout-guarded)\r\n * 3. On OK, calls switcher.switchAccount(accountUuid)\r\n * 4. On FAILED or timeout, throws MultiAccountAutoAddError\r\n *\r\n * Used by HandoffLanding (F5). The iframe-side handler is the A6 work.\r\n */\r\nexport async function multiAccountAutoAdd(\r\n  options: MultiAccountAutoAddOptions,\r\n): Promise<void> {\r\n  const { accountUuid, sessionToken, switcher, client, sendMessage } = options;\r\n  const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\r\n\r\n  const payload: AddAccountWithTokenPayload = { accountUuid, sessionToken };\r\n\r\n  await new Promise<void>((resolve, reject) => {\r\n    let settled = false;\r\n    let timer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n    const cleanup = () => {\r\n      client.off(MESSAGE_TYPES.ADD_ACCOUNT_WITH_TOKEN_OK, onOk);\r\n      client.off(MESSAGE_TYPES.ADD_ACCOUNT_WITH_TOKEN_FAILED, onFailed);\r\n      if (timer) clearTimeout(timer);\r\n    };\r\n\r\n    const settle = (fn: () => void) => {\r\n      if (settled) return;\r\n      settled = true;\r\n      cleanup();\r\n      fn();\r\n    };\r\n\r\n    const onOk = (msg: { payload?: AddAccountWithTokenOkPayload }) => {\r\n      const ack = msg?.payload;\r\n      if (!ack || ack.accountUuid !== accountUuid) {\r\n        settle(() => reject(new MultiAccountAutoAddError(\r\n          'mismatch',\r\n          `ack uuid ${ack?.accountUuid ?? 'undefined'} != requested ${accountUuid}`,\r\n        )));\r\n        return;\r\n      }\r\n      settle(() => resolve());\r\n    };\r\n\r\n    const onFailed = (msg: { payload?: AddAccountWithTokenFailedPayload }) => {\r\n      const fail = msg?.payload;\r\n      settle(() => reject(new MultiAccountAutoAddError(\r\n        fail?.reason ?? 'unknown',\r\n        fail?.message,\r\n      )));\r\n    };\r\n\r\n    client.on(MESSAGE_TYPES.ADD_ACCOUNT_WITH_TOKEN_OK, onOk);\r\n    client.on(MESSAGE_TYPES.ADD_ACCOUNT_WITH_TOKEN_FAILED, onFailed);\r\n\r\n    timer = setTimeout(() => {\r\n      settle(() => reject(new MultiAccountAutoAddError(\r\n        'timeout',\r\n        `no ack within ${timeoutMs}ms`,\r\n      )));\r\n    }, timeoutMs);\r\n\r\n    sendMessage(MESSAGE_TYPES.ADD_ACCOUNT_WITH_TOKEN, payload);\r\n  });\r\n\r\n  await switcher.switchAccount(accountUuid);\r\n}\r\n"],"mappings":"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","names":["DEFAULT_TIMEOUT_MS"]}