@yourroad/sdk 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/dist/index.cjs +7 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +275 -151
- package/dist/index.js.map +1 -1
- package/package.json +8 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/bootstrap/bootstrapClient.ts","../src/context/mergeContext.ts","../src/bridge/protocol.ts","../src/bridge/BridgeController.ts","../src/errors/YourRoadError.ts","../src/events/EventEmitter.ts","../src/lifecycle/focus.ts","../src/lifecycle/scrollLock.ts","../src/iframe/IframeController.ts","../src/overlay/styles.ts","../src/overlay/OverlayController.ts","../src/session/sessionMarker.ts","../src/session/sessionClient.ts","../src/session/SessionController.ts","../src/client/YourRoadClient.ts","../src/index.ts"],"sourcesContent":["import type { YourRoadSurface } from '../config/types';\n\nconst BOOTSTRAP_ENDPOINT = 'https://tsajlkcfcvjqqjxfigbw.supabase.co/functions/v1/bootstrap-embed-access';\n\ninterface BootstrapRequest {\n partnerKey: string;\n surface: YourRoadSurface;\n}\n\nexport interface BootstrapResult {\n iframeUrl: string;\n expiresAt: string;\n}\n\nfunction validateResponse(value: unknown): BootstrapResult {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) throw new Error('Invalid bootstrap response.');\n const { iframeUrl, expiresAt } = value as Record<string, unknown>;\n if (typeof iframeUrl !== 'string' || iframeUrl.trim() === '') throw new Error('Invalid bootstrap response.');\n let parsedUrl: URL;\n try { parsedUrl = new URL(iframeUrl); } catch { throw new Error('Invalid bootstrap response.'); }\n if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:') throw new Error('Invalid bootstrap response.');\n if (typeof expiresAt !== 'string' || expiresAt.trim() === '' || Number.isNaN(Date.parse(expiresAt))) {\n throw new Error('Invalid bootstrap response.');\n }\n return { iframeUrl, expiresAt };\n}\n\nexport async function requestBootstrap(request: BootstrapRequest, signal: AbortSignal): Promise<BootstrapResult> {\n const response = await fetch(BOOTSTRAP_ENDPOINT, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n credentials: 'omit',\n cache: 'no-store',\n signal,\n });\n if (!response.ok) throw new Error('Bootstrap request was unsuccessful.');\n return validateResponse(await response.json());\n}\n","import type { YourRoadContext, YourRoadContextUpdate } from './types';\n\nconst defined = <T extends object>(value: T | undefined): Partial<T> =>\n Object.fromEntries(Object.entries(value ?? {}).filter(([, item]) => item !== undefined)) as Partial<T>;\n\n/** Merges known context sections. Explicit `undefined` values are ignored. */\nexport function mergeContext(current: YourRoadContext, update: YourRoadContextUpdate): YourRoadContext {\n const next: YourRoadContext = { ...current, ...defined(update) };\n for (const key of ['vehicle', 'dealer', 'page'] as const) {\n if (update[key] !== undefined) next[key] = { ...current[key], ...defined(update[key]) };\n }\n return next;\n}\n\nexport const copyContext = (context?: YourRoadContext): YourRoadContext => mergeContext({}, context ?? {});\n","import type { YourRoadContext } from '../context/types';\n\nexport const BRIDGE_VERSION = 1 as const;\n\nexport type BridgeMessage<T = unknown> = {\n source: 'yourroad.sdk' | 'yourroad.embed';\n version: typeof BRIDGE_VERSION;\n type: string;\n requestId?: string;\n payload?: T;\n};\n\nexport type SdkBridgeMessage =\n | BridgeMessage & { source: 'yourroad.sdk'; type: 'ack' }\n | BridgeMessage<YourRoadContext> & { source: 'yourroad.sdk'; type: 'context' | 'context_updated'; payload: YourRoadContext }\n | BridgeMessage<{ sessionId: string }> & { source: 'yourroad.sdk'; type: 'journey_session'; payload: { sessionId: string } };\n","import { copyContext } from '../context/mergeContext';\nimport type { YourRoadContext } from '../context/types';\nimport { BRIDGE_VERSION, type SdkBridgeMessage } from './protocol';\n\nexport function runtimeOriginFromIframeUrl(iframeUrl: string): string {\n const url = new URL(iframeUrl);\n if (url.protocol !== 'https:' && url.protocol !== 'http:') throw new TypeError('The iframe URL must use HTTP(S).');\n return url.origin;\n}\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (value === null || typeof value !== 'object') return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\n\nconst isReadyMessage = (value: unknown): boolean => {\n if (!isPlainObject(value)) return false;\n return value.source === 'yourroad.embed'\n && value.version === BRIDGE_VERSION\n && value.type === 'ready'\n && value.payload === undefined\n && (value.requestId === undefined || typeof value.requestId === 'string');\n};\n\nconst isRestartMessage = (value: unknown): boolean => isPlainObject(value)\n && Object.keys(value).length === 3\n && value.source === 'yourroad.embed'\n && value.version === BRIDGE_VERSION\n && value.type === 'journey_session_restart';\n\nexport class BridgeController {\n private ready = false;\n private started = false;\n\n constructor(\n private readonly iframe: HTMLIFrameElement,\n private readonly trustedRuntimeOrigin: string,\n private readonly getCurrentContext: () => YourRoadContext,\n private readonly getJourneySessionId: () => string,\n private readonly onJourneySessionRestart: () => void,\n ) {}\n\n start(): void {\n if (this.started) return;\n window.addEventListener('message', this.handleMessage);\n this.started = true;\n }\n\n contextUpdated(currentContext: YourRoadContext): void {\n if (!this.ready) return;\n this.post({\n source: 'yourroad.sdk',\n version: BRIDGE_VERSION,\n type: 'context_updated',\n payload: copyContext(currentContext),\n });\n }\n\n destroy(): void {\n if (this.started) window.removeEventListener('message', this.handleMessage);\n this.started = false;\n this.ready = false;\n }\n\n private readonly handleMessage = (event: MessageEvent): void => {\n if (event.origin !== this.trustedRuntimeOrigin) return;\n const iframeWindow = this.iframe.contentWindow;\n if (iframeWindow === null || event.source !== iframeWindow) return;\n if (this.ready) {\n if (isRestartMessage(event.data)) this.onJourneySessionRestart();\n return;\n }\n if (!isReadyMessage(event.data)) return;\n this.ready = true;\n this.post({ source: 'yourroad.sdk', version: BRIDGE_VERSION, type: 'ack' });\n this.post({\n source: 'yourroad.sdk',\n version: BRIDGE_VERSION,\n type: 'context',\n payload: copyContext(this.getCurrentContext()),\n });\n this.sendJourneySession(this.getJourneySessionId());\n };\n\n sendJourneySession(sessionId: string): void {\n if (!this.ready) return;\n this.post({ source: 'yourroad.sdk', version: BRIDGE_VERSION, type: 'journey_session', payload: { sessionId } });\n }\n\n private post(message: SdkBridgeMessage): void {\n const iframeWindow = this.iframe.contentWindow;\n if (iframeWindow === null) return;\n try {\n iframeWindow.postMessage(message, this.trustedRuntimeOrigin);\n } catch {\n // The iframe may be removed concurrently; bridge delivery is best-effort.\n }\n }\n}\n","export type YourRoadErrorCode = 'INVALID_INITIALISATION' | 'INVALID_SURFACE' | 'DESTROYED' | 'BOOTSTRAP_FAILED' | 'OVERLAY_CREATION_FAILED' | 'IFRAME_LOAD_FAILED';\n\nexport class YourRoadError extends Error {\n readonly name = 'YourRoadError';\n constructor(public readonly code: YourRoadErrorCode, message: string, options?: ErrorOptions) {\n super(message, options);\n }\n}\n","export type Handler<T> = (payload: T) => void;\n\nexport class EventEmitter<Events extends object> {\n private listeners = new Map<keyof Events, Set<Handler<never>>>();\n\n on<K extends keyof Events>(event: K, handler: Handler<Events[K]>): () => void {\n const handlers = this.listeners.get(event) ?? new Set();\n handlers.add(handler as Handler<never>);\n this.listeners.set(event, handlers);\n return () => handlers.delete(handler as Handler<never>);\n }\n\n emit<K extends keyof Events>(event: K, payload: Events[K]): void {\n this.listeners.get(event)?.forEach((handler) => handler(payload as never));\n }\n\n clear(): void { this.listeners.clear(); }\n}\n","export class FocusLifecycle {\n private previous: HTMLElement | null = null;\n capture(): void { this.previous = document.activeElement instanceof HTMLElement ? document.activeElement : null; }\n moveTo(element: HTMLElement): void { element.focus(); }\n restore(): void {\n if (this.previous?.isConnected) this.previous.focus();\n this.previous = null;\n }\n}\n","interface SavedStyles { position: string; top: string; left: string; right: string; width: string; overflow: string }\n\nexport class ScrollLock {\n private saved?: SavedStyles;\n private scrollX = 0;\n private scrollY = 0;\n\n lock(): void {\n if (this.saved) return;\n const style = document.body.style;\n this.saved = { position: style.position, top: style.top, left: style.left, right: style.right, width: style.width, overflow: style.overflow };\n this.scrollX = window.scrollX;\n this.scrollY = window.scrollY;\n Object.assign(style, { position: 'fixed', top: `-${this.scrollY}px`, left: `-${this.scrollX}px`, right: '0', width: '100%', overflow: 'hidden' });\n }\n\n unlock(): void {\n if (!this.saved) return;\n Object.assign(document.body.style, this.saved);\n this.saved = undefined;\n window.scrollTo(this.scrollX, this.scrollY);\n }\n}\n","export class IframeController {\n readonly element: HTMLIFrameElement;\n constructor(source: string, onError: () => void) {\n this.element = document.createElement('iframe');\n this.element.dataset.yourroadFrame = '';\n this.element.title = 'YourRoad pre-approval';\n this.element.src = source;\n this.element.addEventListener('error', onError, { once: true });\n }\n destroy(): void { this.element.remove(); }\n}\n","export const SDK_Z_INDEX = 2147483000;\n\nexport const SDK_STYLES = `\n[data-yourroad-overlay-root] { all: initial; position: fixed; inset: 0; z-index: ${SDK_Z_INDEX}; display: block; font-family: system-ui, sans-serif; color: #111; }\n[data-yourroad-scrim] { all: initial; position: absolute; inset: 0; display: block; background: rgba(0, 0, 0, .55); }\n[data-yourroad-panel] { all: initial; box-sizing: border-box; position: absolute; inset-block: 0; inset-inline-end: 0; display: flex; flex-direction: column; width: min(520px, 92vw); height: 100vh; height: 100dvh; background: #fff; box-shadow: -8px 0 30px rgba(0,0,0,.2); }\n[data-yourroad-close] { all: unset; box-sizing: border-box; position: absolute; z-index: 1; inset-block-start: max(12px, env(safe-area-inset-top)); inset-inline-end: max(12px, env(safe-area-inset-right)); width: 44px; height: 44px; display: grid; place-items: center; border-radius: 999px; background: #fff; color: #111; box-shadow: 0 1px 8px rgba(0,0,0,.25); cursor: pointer; font: 28px/1 system-ui, sans-serif; }\n[data-yourroad-close]:focus-visible { outline: 3px solid #1769e0; outline-offset: 2px; }\n[data-yourroad-frame] { all: initial; box-sizing: border-box; display: block; width: 100%; height: 100%; border: 0; background: #fff; }\n@media (max-width: 600px) { [data-yourroad-panel] { width: 100vw; max-width: none; } }\n`;\n\nexport function ensureStyles(): HTMLStyleElement {\n const existing = document.head.querySelector<HTMLStyleElement>('style[data-yourroad-sdk]');\n if (existing) return existing;\n const style = document.createElement('style');\n style.dataset.yourroadSdk = '';\n style.textContent = SDK_STYLES;\n document.head.append(style);\n return style;\n}\n","import { IframeController } from '../iframe/IframeController';\nimport { ensureStyles } from './styles';\n\nexport class OverlayController {\n readonly root: HTMLDivElement;\n readonly closeButton: HTMLButtonElement;\n readonly iframe: IframeController;\n private readonly abort = new AbortController();\n\n constructor(source: string, onClose: () => void, onFrameError: () => void) {\n ensureStyles();\n this.root = document.createElement('div');\n this.root.dataset.yourroadOverlayRoot = '';\n this.root.setAttribute('role', 'dialog');\n this.root.setAttribute('aria-modal', 'true');\n this.root.setAttribute('aria-label', 'YourRoad pre-approval');\n const scrim = document.createElement('div');\n scrim.dataset.yourroadScrim = '';\n const panel = document.createElement('div');\n panel.dataset.yourroadPanel = '';\n this.closeButton = document.createElement('button');\n this.closeButton.type = 'button';\n this.closeButton.dataset.yourroadClose = '';\n this.closeButton.setAttribute('aria-label', 'Close YourRoad');\n this.closeButton.textContent = '×';\n this.iframe = new IframeController(source, onFrameError);\n panel.append(this.closeButton, this.iframe.element);\n this.root.append(scrim, panel);\n const signal = this.abort.signal;\n scrim.addEventListener('click', onClose, { signal });\n this.closeButton.addEventListener('click', onClose, { signal });\n document.addEventListener('keydown', (event) => { if (event.key === 'Escape') onClose(); }, { signal });\n }\n\n mount(): void { document.body.append(this.root); }\n destroy(): void {\n this.abort.abort();\n this.iframe.destroy();\n this.root.remove();\n if (!document.querySelector('[data-yourroad-overlay-root]')) {\n document.head.querySelector('style[data-yourroad-sdk]')?.remove();\n }\n }\n}\n","export const JOURNEY_SESSION_MARKER_KEY = 'yr_journey_session_pre_approval_v1';\n\nexport const isUuid = (value: unknown): value is string =>\n typeof value === 'string'\n && /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n\nexport interface SessionMarker {\n read(): string | undefined;\n write(sessionId: string): void;\n clear(): void;\n}\n\ntype MarkerStorage = Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;\n\nfunction resolveStorage(): MarkerStorage | undefined {\n try { return globalThis.localStorage; } catch { return undefined; }\n}\n\nexport function createSessionMarker(storage: MarkerStorage | undefined = resolveStorage()): SessionMarker {\n const clear = (): void => {\n try { storage?.removeItem(JOURNEY_SESSION_MARKER_KEY); } catch { /* Storage is optional. */ }\n };\n return {\n read() {\n let value: string | null;\n try { value = storage?.getItem(JOURNEY_SESSION_MARKER_KEY) ?? null; } catch { return undefined; }\n if (value === null) return undefined;\n if (!isUuid(value)) { clear(); return undefined; }\n return value;\n },\n write(sessionId) {\n if (!isUuid(sessionId)) return;\n try { storage?.setItem(JOURNEY_SESSION_MARKER_KEY, sessionId); } catch { /* Keep the in-memory session usable. */ }\n },\n clear,\n };\n}\n","import { isUuid } from './sessionMarker';\n\nconst CREATE_ENDPOINT = 'https://tsajlkcfcvjqqjxfigbw.supabase.co/functions/v1/create-embed-journey-session';\nconst PROBE_ENDPOINT = 'https://tsajlkcfcvjqqjxfigbw.supabase.co/functions/v1/probe-embed-journey-session';\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (value === null || typeof value !== 'object') return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\nconst isDate = (value: unknown): value is string => typeof value === 'string' && value.trim() !== '' && !Number.isNaN(Date.parse(value));\nconst options = (body: object, signal?: AbortSignal): RequestInit => ({\n method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body),\n credentials: 'omit', cache: 'no-store', signal,\n});\n\nexport async function createJourneySession(partnerKey: string, signal?: AbortSignal): Promise<string> {\n const response = await fetch(CREATE_ENDPOINT, options({ partnerKey, surface: 'pre-approval' }, signal));\n if (response.status !== 201) throw new Error('Journey session creation was unsuccessful.');\n const value: unknown = await response.json();\n if (!isPlainObject(value) || !isUuid(value.sessionId) || !isDate(value.expiresAt)) throw new Error('Invalid journey session response.');\n return value.sessionId;\n}\n\nexport type ProbeResult = { status: 'resumable'; sessionId: string } | { status: 'expired' } | { status: 'invalid' };\n\nexport async function probeJourneySession(partnerKey: string, sessionId: string): Promise<ProbeResult> {\n const response = await fetch(PROBE_ENDPOINT, options({ partnerKey, surface: 'pre-approval', sessionId }));\n const value: unknown = await response.json();\n if (!isPlainObject(value)) throw new Error('Invalid journey session probe response.');\n if (response.status === 200 && value.status === 'resumable' && value.sessionId === sessionId && isDate(value.expiresAt)) {\n return { status: 'resumable', sessionId };\n }\n if (response.status === 410 && value.status === 'expired' && value.code === 'SESSION_EXPIRED') return { status: 'expired' };\n if (response.status === 404 && value.status === 'invalid' && value.code === 'SESSION_INVALID') return { status: 'invalid' };\n throw new Error('Journey session probe was unsuccessful.');\n}\n","import { createJourneySession, probeJourneySession } from './sessionClient';\nimport { createSessionMarker, type SessionMarker } from './sessionMarker';\n\ntype State =\n | { kind: 'cold' }\n | { kind: 'probing'; completion: Promise<void> }\n | { kind: 'active'; sessionId: string }\n | { kind: 'expired'; sessionId: string }\n | { kind: 'probe_failed' };\n\nexport class SessionController {\n private state: State = { kind: 'cold' };\n private restart?: Promise<string>;\n\n constructor(private readonly partnerKey: string, private readonly marker: SessionMarker = createSessionMarker()) {\n const sessionId = marker.read();\n if (!sessionId) return;\n const completion = this.probe(sessionId);\n this.state = { kind: 'probing', completion };\n }\n\n async resolveForOpen(signal: AbortSignal): Promise<string> {\n if (this.state.kind === 'probing') await this.state.completion;\n if (this.state.kind === 'probe_failed') throw new Error('Journey session validity could not be established.');\n if (this.state.kind === 'active' || this.state.kind === 'expired') return this.state.sessionId;\n const sessionId = await createJourneySession(this.partnerKey, signal);\n this.marker.write(sessionId);\n this.state = { kind: 'active', sessionId };\n return sessionId;\n }\n\n restartExpired(signal: AbortSignal): Promise<string> | undefined {\n if (this.state.kind !== 'expired') return undefined;\n if (this.restart) return this.restart;\n const operation = createJourneySession(this.partnerKey, signal).then((sessionId) => {\n this.marker.write(sessionId);\n this.state = { kind: 'active', sessionId };\n return sessionId;\n }).finally(() => { if (this.restart === operation) this.restart = undefined; });\n this.restart = operation;\n return operation;\n }\n\n private async probe(sessionId: string): Promise<void> {\n try {\n const result = await probeJourneySession(this.partnerKey, sessionId);\n if (result.status === 'resumable') this.state = { kind: 'active', sessionId };\n else if (result.status === 'expired') { this.marker.clear(); this.state = { kind: 'expired', sessionId }; }\n else { this.marker.clear(); this.state = { kind: 'cold' }; }\n } catch { this.state = { kind: 'probe_failed' }; }\n }\n}\n","import type { YourRoadInitConfig, YourRoadSurface } from '../config/types';\nimport { requestBootstrap } from '../bootstrap/bootstrapClient';\nimport { BridgeController, runtimeOriginFromIframeUrl } from '../bridge/BridgeController';\nimport { copyContext, mergeContext } from '../context/mergeContext';\nimport type { YourRoadContext, YourRoadContextUpdate } from '../context/types';\nimport { YourRoadError } from '../errors/YourRoadError';\nimport { EventEmitter } from '../events/EventEmitter';\nimport { FocusLifecycle } from '../lifecycle/focus';\nimport { ScrollLock } from '../lifecycle/scrollLock';\nimport { OverlayController } from '../overlay/OverlayController';\nimport { SessionController } from '../session/SessionController';\n\nexport interface OpenOptions { surface: YourRoadSurface; context?: YourRoadContext }\nexport interface YourRoadEvents { opened: undefined; closed: undefined; error: YourRoadError }\n\nexport interface YourRoadClient {\n open(options: OpenOptions): Promise<void>;\n updateContext(update: YourRoadContextUpdate): void;\n close(): void;\n on<K extends keyof YourRoadEvents>(event: K, handler: (payload: YourRoadEvents[K]) => void): () => void;\n destroy(): void;\n}\n\nclass YourRoadClientImpl implements YourRoadClient {\n private readonly events = new EventEmitter<YourRoadEvents>();\n private readonly scroll = new ScrollLock();\n private readonly focus = new FocusLifecycle();\n private overlay?: OverlayController;\n private bridge?: BridgeController;\n private context: YourRoadContext = {};\n private destroyed = false;\n private opening?: Promise<void>;\n private bootstrapAbort?: AbortController;\n private restartAbort?: AbortController;\n private readonly session: SessionController;\n\n constructor(private readonly config: Readonly<YourRoadInitConfig>) {\n this.session = new SessionController(config.partnerKey);\n }\n\n async open(options: OpenOptions): Promise<void> {\n this.assertUsable();\n if (!options || options.surface !== 'pre-approval') throw this.fail('INVALID_SURFACE', 'The only supported surface is \"pre-approval\".');\n if (this.overlay) return;\n if (this.opening) return this.opening;\n this.context = copyContext(options.context);\n const abort = new AbortController();\n this.bootstrapAbort = abort;\n const operation = this.performOpen(options.surface, abort);\n this.opening = operation;\n return operation;\n }\n\n updateContext(update: YourRoadContextUpdate): void {\n this.assertUsable();\n this.context = mergeContext(this.context, update);\n this.bridge?.contextUpdated(this.context);\n }\n\n close(): void {\n this.assertUsable();\n if (this.bootstrapAbort) {\n this.bootstrapAbort.abort();\n this.bootstrapAbort = undefined;\n this.opening = undefined;\n }\n this.restartAbort?.abort();\n this.restartAbort = undefined;\n if (!this.overlay) return;\n this.bridge?.destroy();\n this.bridge = undefined;\n this.overlay.destroy();\n this.overlay = undefined;\n this.scroll.unlock();\n this.focus.restore();\n this.events.emit('closed', undefined);\n }\n\n on<K extends keyof YourRoadEvents>(event: K, handler: (payload: YourRoadEvents[K]) => void): () => void {\n this.assertUsable();\n return this.events.on(event, handler);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.close();\n this.events.clear();\n this.context = {};\n this.destroyed = true;\n }\n\n private async performOpen(surface: YourRoadSurface, abort: AbortController): Promise<void> {\n try {\n const [bootstrap, sessionId] = await Promise.all([\n requestBootstrap({ partnerKey: this.config.partnerKey, surface }, abort.signal),\n this.session.resolveForOpen(abort.signal),\n ]);\n const { iframeUrl } = bootstrap;\n if (abort.signal.aborted || this.destroyed || this.bootstrapAbort !== abort) return;\n this.focus.capture();\n try {\n this.overlay = new OverlayController(iframeUrl, () => this.close(), () => this.fail('IFRAME_LOAD_FAILED', 'The embedded experience failed to load.'));\n this.bridge = new BridgeController(\n this.overlay.iframe.element,\n runtimeOriginFromIframeUrl(iframeUrl),\n () => copyContext(this.context),\n () => sessionId,\n () => this.restartExpiredSession(this.bridge),\n );\n this.bridge.start();\n this.overlay.mount();\n this.scroll.lock();\n this.focus.moveTo(this.overlay.closeButton);\n this.events.emit('opened', undefined);\n } catch (cause) {\n this.bridge?.destroy();\n this.bridge = undefined;\n this.overlay?.destroy();\n this.overlay = undefined;\n this.scroll.unlock();\n this.focus.restore();\n throw this.fail('OVERLAY_CREATION_FAILED', 'The YourRoad overlay could not be created.', cause);\n }\n } catch (cause) {\n if (abort.signal.aborted) return;\n if (cause instanceof YourRoadError) throw cause;\n throw this.fail('BOOTSTRAP_FAILED', 'The YourRoad experience could not be started securely.', cause);\n } finally {\n if (this.bootstrapAbort === abort) {\n this.bootstrapAbort = undefined;\n this.opening = undefined;\n }\n }\n }\n\n private restartExpiredSession(bridge: BridgeController | undefined): void {\n if (this.destroyed || bridge === undefined || bridge !== this.bridge || this.restartAbort) return;\n const restartAbort = new AbortController();\n this.restartAbort = restartAbort;\n const operation = this.session.restartExpired(restartAbort.signal);\n if (!operation) { this.restartAbort = undefined; return; }\n void operation.then((sessionId) => {\n if (!this.destroyed && !restartAbort.signal.aborted && this.bridge === bridge) bridge.sendJourneySession(sessionId);\n }).catch(() => { /* The runtime may offer a later explicit retry. */ }).finally(() => {\n if (this.restartAbort === restartAbort) this.restartAbort = undefined;\n });\n }\n\n private assertUsable(): void { if (this.destroyed) throw new YourRoadError('DESTROYED', 'This YourRoad SDK instance has been destroyed.'); }\n private fail(code: ConstructorParameters<typeof YourRoadError>[0], message: string, cause?: unknown): YourRoadError {\n const error = new YourRoadError(code, message, cause === undefined ? undefined : { cause });\n this.events.emit('error', error);\n return error;\n }\n}\n\nexport function createYourRoadClient(config: Readonly<YourRoadInitConfig>): YourRoadClient {\n return new YourRoadClientImpl(config);\n}\n","import { createYourRoadClient, type YourRoadClient } from './client/YourRoadClient';\nimport type { YourRoadInitConfig } from './config/types';\nimport { YourRoadError } from './errors/YourRoadError';\n\nexport type { OpenOptions, YourRoadClient, YourRoadEvents } from './client/YourRoadClient';\nexport type { YourRoadInitConfig, YourRoadSurface } from './config/types';\nexport type { DealerContext, PageContext, VehicleContext, YourRoadContext, YourRoadContextUpdate } from './context/types';\nexport { YourRoadError };\n\nexport class YourRoad {\n static init(config: YourRoadInitConfig): YourRoadClient {\n if (!config || typeof config.partnerKey !== 'string' || config.partnerKey.trim() === '') {\n throw new YourRoadError('INVALID_INITIALISATION', 'partnerKey must be a non-empty string.');\n }\n return createYourRoadClient({ partnerKey: config.partnerKey });\n }\n}\n"],"names":["BOOTSTRAP_ENDPOINT","validateResponse","value","iframeUrl","expiresAt","parsedUrl","requestBootstrap","request","signal","response","defined","item","mergeContext","current","update","next","key","copyContext","context","BRIDGE_VERSION","runtimeOriginFromIframeUrl","url","isPlainObject","prototype","isReadyMessage","isRestartMessage","BridgeController","iframe","trustedRuntimeOrigin","getCurrentContext","getJourneySessionId","onJourneySessionRestart","__publicField","event","iframeWindow","currentContext","sessionId","message","YourRoadError","code","options","EventEmitter","handler","handlers","payload","_a","FocusLifecycle","element","ScrollLock","style","IframeController","source","onError","SDK_Z_INDEX","SDK_STYLES","ensureStyles","existing","OverlayController","onClose","onFrameError","scrim","panel","JOURNEY_SESSION_MARKER_KEY","isUuid","resolveStorage","createSessionMarker","storage","clear","CREATE_ENDPOINT","PROBE_ENDPOINT","isDate","body","createJourneySession","partnerKey","probeJourneySession","SessionController","marker","completion","operation","result","YourRoadClientImpl","config","abort","_b","surface","bootstrap","cause","bridge","restartAbort","error","createYourRoadClient","YourRoad"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/bootstrap/bootstrapClient.ts","../src/context/mergeContext.ts","../src/bridge/protocol.ts","../src/bridge/BridgeController.ts","../src/errors/YourRoadError.ts","../src/events/EventEmitter.ts","../src/lifecycle/focus.ts","../src/lifecycle/scrollLock.ts","../src/iframe/IframeController.ts","../src/overlay/styles.ts","../src/overlay/OverlayController.ts","../src/session/sessionMarker.ts","../src/session/sessionClient.ts","../src/session/SessionController.ts","../src/client/YourRoadClient.ts","../src/index.ts"],"sourcesContent":["import type { YourRoadSurface } from '../config/types';\n\nconst BOOTSTRAP_ENDPOINT = 'https://tsajlkcfcvjqqjxfigbw.supabase.co/functions/v1/bootstrap-embed-access';\n\ninterface BootstrapRequest {\n partnerKey: string;\n surface: YourRoadSurface;\n}\n\nexport interface BootstrapResult {\n iframeUrl: string;\n expiresAt: string;\n}\n\nfunction validateResponse(value: unknown): BootstrapResult {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) throw new Error('Invalid bootstrap response.');\n const { iframeUrl, expiresAt } = value as Record<string, unknown>;\n if (typeof iframeUrl !== 'string' || iframeUrl.trim() === '') throw new Error('Invalid bootstrap response.');\n let parsedUrl: URL;\n try { parsedUrl = new URL(iframeUrl); } catch { throw new Error('Invalid bootstrap response.'); }\n if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:') throw new Error('Invalid bootstrap response.');\n if (typeof expiresAt !== 'string' || expiresAt.trim() === '' || Number.isNaN(Date.parse(expiresAt))) {\n throw new Error('Invalid bootstrap response.');\n }\n return { iframeUrl, expiresAt };\n}\n\nexport async function requestBootstrap(request: BootstrapRequest, signal: AbortSignal): Promise<BootstrapResult> {\n const response = await fetch(BOOTSTRAP_ENDPOINT, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n credentials: 'omit',\n cache: 'no-store',\n signal,\n });\n if (!response.ok) throw new Error('Bootstrap request was unsuccessful.');\n return validateResponse(await response.json());\n}\n","import type { YourRoadContext, YourRoadContextUpdate } from './types';\n\nconst defined = <T extends object>(value: T | undefined): Partial<T> =>\n Object.fromEntries(Object.entries(value ?? {}).filter(([, item]) => item !== undefined)) as Partial<T>;\n\n/** Merges known context sections. Explicit `undefined` values are ignored. */\nexport function mergeContext(current: YourRoadContext, update: YourRoadContextUpdate): YourRoadContext {\n const next: YourRoadContext = { ...current, ...defined(update) };\n for (const key of ['vehicle', 'dealer', 'page'] as const) {\n if (update[key] !== undefined) next[key] = { ...current[key], ...defined(update[key]) };\n }\n return next;\n}\n\nexport const copyContext = (context?: YourRoadContext): YourRoadContext => mergeContext({}, context ?? {});\n","import type { YourRoadContext } from '../context/types';\n\nexport const BRIDGE_VERSION = 1 as const;\n\nexport type BridgeMessage<T = unknown> = {\n source: 'yourroad.sdk' | 'yourroad.embed';\n version: typeof BRIDGE_VERSION;\n type: string;\n requestId?: string;\n payload?: T;\n};\n\nexport type SdkBridgeMessage =\n | BridgeMessage & { source: 'yourroad.sdk'; type: 'ack' }\n | BridgeMessage<YourRoadContext> & { source: 'yourroad.sdk'; type: 'context' | 'context_updated'; payload: YourRoadContext }\n | BridgeMessage<{ sessionId: string }> & { source: 'yourroad.sdk'; type: 'journey_session'; payload: { sessionId: string } };\n\n/** Identity-free, exact-shape lifecycle messages accepted from a trusted runtime. */\nexport type RuntimeLifecycleMessage =\n | { source: 'yourroad.embed'; version: typeof BRIDGE_VERSION; type: 'journey_session_restart' }\n | { source: 'yourroad.embed'; version: typeof BRIDGE_VERSION; type: 'journey_reset' };\n","import { copyContext } from '../context/mergeContext';\nimport type { YourRoadContext } from '../context/types';\nimport { BRIDGE_VERSION, type SdkBridgeMessage } from './protocol';\n\nexport function runtimeOriginFromIframeUrl(iframeUrl: string): string {\n const url = new URL(iframeUrl);\n if (url.protocol !== 'https:' && url.protocol !== 'http:') throw new TypeError('The iframe URL must use HTTP(S).');\n return url.origin;\n}\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (value === null || typeof value !== 'object') return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\n\nconst isReadyMessage = (value: unknown): boolean => {\n if (!isPlainObject(value)) return false;\n return value.source === 'yourroad.embed'\n && value.version === BRIDGE_VERSION\n && value.type === 'ready'\n && value.payload === undefined\n && (value.requestId === undefined || typeof value.requestId === 'string');\n};\n\nconst isLifecycleMessage = (value: unknown, type: 'journey_session_restart' | 'journey_reset'): boolean => isPlainObject(value)\n && Object.keys(value).length === 3\n && value.source === 'yourroad.embed'\n && value.version === BRIDGE_VERSION\n && value.type === type;\n\nexport class BridgeController {\n private ready = false;\n private started = false;\n private readinessSettled = false;\n private readonly readiness: Promise<void>;\n private resolveReadiness!: () => void;\n private rejectReadiness!: (reason: unknown) => void;\n\n constructor(\n private readonly iframe: HTMLIFrameElement,\n private readonly trustedRuntimeOrigin: string,\n private readonly getCurrentContext: () => YourRoadContext,\n private readonly getJourneySessionId: () => string,\n private readonly onJourneySessionRestart: () => void,\n private readonly onJourneyReset: () => void = () => undefined,\n ) {\n this.readiness = new Promise<void>((resolve, reject) => {\n this.resolveReadiness = resolve;\n this.rejectReadiness = reject;\n });\n // A client that only calls open() need not observe readiness. Keep teardown\n // rejection handled while preserving the original promise for prepare().\n void this.readiness.catch(() => undefined);\n }\n\n start(): void {\n if (this.started) return;\n window.addEventListener('message', this.handleMessage);\n this.started = true;\n }\n\n contextUpdated(currentContext: YourRoadContext): void {\n if (!this.ready) return;\n this.post({\n source: 'yourroad.sdk',\n version: BRIDGE_VERSION,\n type: 'context_updated',\n payload: copyContext(currentContext),\n });\n }\n\n whenReady(): Promise<void> { return this.readiness; }\n\n failReadiness(reason: unknown): void {\n if (this.readinessSettled) return;\n this.readinessSettled = true;\n this.rejectReadiness(reason);\n }\n\n destroy(): void {\n if (this.started) window.removeEventListener('message', this.handleMessage);\n this.started = false;\n this.ready = false;\n this.failReadiness(new Error('The runtime bridge was destroyed before it became ready.'));\n }\n\n private readonly handleMessage = (event: MessageEvent): void => {\n if (event.origin !== this.trustedRuntimeOrigin) return;\n const iframeWindow = this.iframe.contentWindow;\n if (iframeWindow === null || event.source !== iframeWindow) return;\n if (this.ready) {\n if (isLifecycleMessage(event.data, 'journey_session_restart')) this.onJourneySessionRestart();\n else if (isLifecycleMessage(event.data, 'journey_reset')) this.onJourneyReset();\n return;\n }\n if (!isReadyMessage(event.data)) return;\n this.ready = true;\n this.post({ source: 'yourroad.sdk', version: BRIDGE_VERSION, type: 'ack' });\n this.post({\n source: 'yourroad.sdk',\n version: BRIDGE_VERSION,\n type: 'context',\n payload: copyContext(this.getCurrentContext()),\n });\n this.sendJourneySession(this.getJourneySessionId());\n this.readinessSettled = true;\n this.resolveReadiness();\n };\n\n sendJourneySession(sessionId: string): void {\n if (!this.ready) return;\n this.post({ source: 'yourroad.sdk', version: BRIDGE_VERSION, type: 'journey_session', payload: { sessionId } });\n }\n\n private post(message: SdkBridgeMessage): void {\n const iframeWindow = this.iframe.contentWindow;\n if (iframeWindow === null) return;\n try {\n iframeWindow.postMessage(message, this.trustedRuntimeOrigin);\n } catch {\n // The iframe may be removed concurrently; bridge delivery is best-effort.\n }\n }\n}\n","export type YourRoadErrorCode = 'INVALID_INITIALISATION' | 'INVALID_SURFACE' | 'DESTROYED' | 'BOOTSTRAP_FAILED' | 'OVERLAY_CREATION_FAILED' | 'IFRAME_LOAD_FAILED';\n\nexport class YourRoadError extends Error {\n readonly name = 'YourRoadError';\n constructor(public readonly code: YourRoadErrorCode, message: string, options?: ErrorOptions) {\n super(message, options);\n }\n}\n","export type Handler<T> = (payload: T) => void;\n\nexport class EventEmitter<Events extends object> {\n private listeners = new Map<keyof Events, Set<Handler<never>>>();\n\n on<K extends keyof Events>(event: K, handler: Handler<Events[K]>): () => void {\n const handlers = this.listeners.get(event) ?? new Set();\n handlers.add(handler as Handler<never>);\n this.listeners.set(event, handlers);\n return () => handlers.delete(handler as Handler<never>);\n }\n\n emit<K extends keyof Events>(event: K, payload: Events[K]): void {\n this.listeners.get(event)?.forEach((handler) => handler(payload as never));\n }\n\n clear(): void { this.listeners.clear(); }\n}\n","export class FocusLifecycle {\n private previous: HTMLElement | null = null;\n capture(): void {\n // A secure runtime replacement is one continuous visible interaction.\n if (this.previous?.isConnected) return;\n this.previous = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n }\n moveTo(element: HTMLElement): void { element.focus(); }\n restore(): void {\n if (this.previous?.isConnected) this.previous.focus();\n this.previous = null;\n }\n}\n","interface SavedStyles { position: string; top: string; left: string; right: string; width: string; overflow: string }\n\nexport class ScrollLock {\n private saved?: SavedStyles;\n private scrollX = 0;\n private scrollY = 0;\n\n lock(): void {\n if (this.saved) return;\n const style = document.body.style;\n this.saved = { position: style.position, top: style.top, left: style.left, right: style.right, width: style.width, overflow: style.overflow };\n this.scrollX = window.scrollX;\n this.scrollY = window.scrollY;\n Object.assign(style, { position: 'fixed', top: `-${this.scrollY}px`, left: `-${this.scrollX}px`, right: '0', width: '100%', overflow: 'hidden' });\n }\n\n unlock(): void {\n if (!this.saved) return;\n Object.assign(document.body.style, this.saved);\n this.saved = undefined;\n window.scrollTo(this.scrollX, this.scrollY);\n }\n}\n","export class IframeController {\n readonly element: HTMLIFrameElement;\n constructor(source: string, onError: () => void) {\n this.element = document.createElement('iframe');\n this.element.dataset.yourroadFrame = '';\n this.element.title = 'YourRoad pre-approval';\n this.element.src = source;\n this.element.addEventListener('error', onError, { once: true });\n }\n destroy(): void { this.element.remove(); }\n}\n","export const SDK_Z_INDEX = 2147483000;\n\nexport const SDK_STYLES = `\n[data-yourroad-overlay-root] { all: initial; position: fixed; inset: 0; z-index: ${SDK_Z_INDEX}; display: block; font-family: system-ui, sans-serif; color: #111; }\n[data-yourroad-overlay-root][hidden] { display: none; pointer-events: none; }\n[data-yourroad-scrim] { all: initial; position: absolute; inset: 0; display: block; background: rgba(0, 0, 0, .55); }\n[data-yourroad-panel] { all: initial; box-sizing: border-box; position: absolute; inset-block: 0; inset-inline-end: 0; display: flex; flex-direction: column; width: min(520px, 92vw); height: 100vh; height: 100dvh; padding-block-start: calc(max(12px, env(safe-area-inset-top)) + 56px); overflow: hidden; border-radius: 24px 0 0 24px; background: #fff; box-shadow: -8px 0 30px rgba(0,0,0,.2); }\n[data-yourroad-close] { all: unset; box-sizing: border-box; position: absolute; z-index: 1; inset-block-start: max(12px, env(safe-area-inset-top)); inset-inline-end: max(12px, env(safe-area-inset-right)); width: 44px; height: 44px; display: grid; place-items: center; border-radius: 999px; background: #fff; color: #111; box-shadow: 0 1px 8px rgba(0,0,0,.25); cursor: pointer; font: 28px/1 system-ui, sans-serif; }\n[data-yourroad-close]:focus-visible { outline: 3px solid #1769e0; outline-offset: 2px; }\n[data-yourroad-frame] { all: initial; box-sizing: border-box; display: block; flex: 1 1 auto; min-height: 0; width: 100%; border: 0; background: #fff; }\n@media (max-width: 600px) { [data-yourroad-panel] { inset-block-start: auto; inset-block-end: 0; inset-inline-end: 0; width: 100vw; max-width: none; height: 92vh; height: 92dvh; border-radius: 24px 24px 0 0; box-shadow: 0 -8px 30px rgba(0,0,0,.2); } }\n`;\n\nexport function ensureStyles(): HTMLStyleElement {\n const existing = document.head.querySelector<HTMLStyleElement>('style[data-yourroad-sdk]');\n if (existing) return existing;\n const style = document.createElement('style');\n style.dataset.yourroadSdk = '';\n style.textContent = SDK_STYLES;\n document.head.append(style);\n return style;\n}\n","import { IframeController } from '../iframe/IframeController';\nimport { ensureStyles } from './styles';\n\nexport class OverlayController {\n readonly root: HTMLDivElement;\n readonly closeButton: HTMLButtonElement;\n readonly iframe: IframeController;\n private readonly abort = new AbortController();\n private visible = false;\n\n constructor(source: string, onClose: () => void, onFrameError: () => void) {\n ensureStyles();\n this.root = document.createElement('div');\n this.root.dataset.yourroadOverlayRoot = '';\n this.root.setAttribute('aria-label', 'YourRoad pre-approval');\n this.hide();\n const scrim = document.createElement('div');\n scrim.dataset.yourroadScrim = '';\n const panel = document.createElement('div');\n panel.dataset.yourroadPanel = '';\n this.closeButton = document.createElement('button');\n this.closeButton.type = 'button';\n this.closeButton.dataset.yourroadClose = '';\n this.closeButton.setAttribute('aria-label', 'Close YourRoad');\n const closeIcon = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n closeIcon.setAttribute('viewBox', '0 0 24 24');\n closeIcon.setAttribute('width', '24');\n closeIcon.setAttribute('height', '24');\n closeIcon.setAttribute('fill', 'none');\n closeIcon.setAttribute('stroke', 'currentColor');\n closeIcon.setAttribute('stroke-width', '2');\n closeIcon.setAttribute('stroke-linecap', 'round');\n closeIcon.setAttribute('aria-hidden', 'true');\n const closeIconPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n closeIconPath.setAttribute('d', 'M6 6l12 12M18 6L6 18');\n closeIcon.append(closeIconPath);\n this.closeButton.append(closeIcon);\n this.iframe = new IframeController(source, onFrameError);\n panel.append(this.closeButton, this.iframe.element);\n this.root.append(scrim, panel);\n const signal = this.abort.signal;\n scrim.addEventListener('click', onClose, { signal });\n this.closeButton.addEventListener('click', onClose, { signal });\n document.addEventListener('keydown', (event) => { if (this.visible && event.key === 'Escape') onClose(); }, { signal });\n }\n\n mount(): void { document.body.append(this.root); }\n show(): boolean {\n if (this.visible) return false;\n this.visible = true;\n this.root.hidden = false;\n this.root.inert = false;\n this.root.removeAttribute('aria-hidden');\n this.root.setAttribute('role', 'dialog');\n this.root.setAttribute('aria-modal', 'true');\n return true;\n }\n hide(): boolean {\n if (!this.visible && this.root.hidden) return false;\n const wasVisible = this.visible;\n this.visible = false;\n this.root.hidden = true;\n this.root.inert = true;\n this.root.setAttribute('aria-hidden', 'true');\n this.root.removeAttribute('role');\n this.root.removeAttribute('aria-modal');\n return wasVisible;\n }\n isVisible(): boolean { return this.visible; }\n destroy(): void {\n this.abort.abort();\n this.iframe.destroy();\n this.root.remove();\n if (!document.querySelector('[data-yourroad-overlay-root]')) {\n document.head.querySelector('style[data-yourroad-sdk]')?.remove();\n }\n }\n}\n","export const JOURNEY_SESSION_MARKER_KEY = 'yr_journey_session_pre_approval_v1';\n\nexport const isUuid = (value: unknown): value is string =>\n typeof value === 'string'\n && /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n\nexport interface SessionMarker {\n read(): string | undefined;\n write(sessionId: string): void;\n clear(): void;\n}\n\ntype MarkerStorage = Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;\n\nfunction resolveStorage(): MarkerStorage | undefined {\n try { return globalThis.localStorage; } catch { return undefined; }\n}\n\nexport function createSessionMarker(storage: MarkerStorage | undefined = resolveStorage()): SessionMarker {\n const clear = (): void => {\n try { storage?.removeItem(JOURNEY_SESSION_MARKER_KEY); } catch { /* Storage is optional. */ }\n };\n return {\n read() {\n let value: string | null;\n try { value = storage?.getItem(JOURNEY_SESSION_MARKER_KEY) ?? null; } catch { return undefined; }\n if (value === null) return undefined;\n if (!isUuid(value)) { clear(); return undefined; }\n return value;\n },\n write(sessionId) {\n if (!isUuid(sessionId)) return;\n try { storage?.setItem(JOURNEY_SESSION_MARKER_KEY, sessionId); } catch { /* Keep the in-memory session usable. */ }\n },\n clear,\n };\n}\n","import { isUuid } from './sessionMarker';\n\nconst CREATE_ENDPOINT = 'https://tsajlkcfcvjqqjxfigbw.supabase.co/functions/v1/create-embed-journey-session';\nconst PROBE_ENDPOINT = 'https://tsajlkcfcvjqqjxfigbw.supabase.co/functions/v1/probe-embed-journey-session';\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> => {\n if (value === null || typeof value !== 'object') return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n};\nconst isDate = (value: unknown): value is string => typeof value === 'string' && value.trim() !== '' && !Number.isNaN(Date.parse(value));\nconst options = (body: object, signal?: AbortSignal): RequestInit => ({\n method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body),\n credentials: 'omit', cache: 'no-store', signal,\n});\n\nexport async function createJourneySession(partnerKey: string, signal?: AbortSignal): Promise<string> {\n const response = await fetch(CREATE_ENDPOINT, options({ partnerKey, surface: 'pre-approval' }, signal));\n if (response.status !== 201) throw new Error('Journey session creation was unsuccessful.');\n const value: unknown = await response.json();\n if (!isPlainObject(value) || !isUuid(value.sessionId) || !isDate(value.expiresAt)) throw new Error('Invalid journey session response.');\n return value.sessionId;\n}\n\nexport type ProbeResult = { status: 'resumable'; sessionId: string } | { status: 'expired' } | { status: 'invalid' };\n\nexport async function probeJourneySession(partnerKey: string, sessionId: string): Promise<ProbeResult> {\n const response = await fetch(PROBE_ENDPOINT, options({ partnerKey, surface: 'pre-approval', sessionId }));\n const value: unknown = await response.json();\n if (!isPlainObject(value)) throw new Error('Invalid journey session probe response.');\n if (response.status === 200 && value.status === 'resumable' && value.sessionId === sessionId && isDate(value.expiresAt)) {\n return { status: 'resumable', sessionId };\n }\n if (response.status === 410 && value.status === 'expired' && value.code === 'SESSION_EXPIRED') return { status: 'expired' };\n if (response.status === 404 && value.status === 'invalid' && value.code === 'SESSION_INVALID') return { status: 'invalid' };\n throw new Error('Journey session probe was unsuccessful.');\n}\n","import { createJourneySession, probeJourneySession } from './sessionClient';\nimport { createSessionMarker, type SessionMarker } from './sessionMarker';\n\ntype State =\n | { kind: 'cold' }\n | { kind: 'probing'; completion: Promise<void> }\n | { kind: 'active'; sessionId: string }\n | { kind: 'expired'; sessionId: string }\n | { kind: 'probe_failed' };\n\nexport class SessionController {\n private state: State = { kind: 'cold' };\n private restart?: Promise<string>;\n private generation = 0;\n\n constructor(private readonly partnerKey: string, private readonly marker: SessionMarker = createSessionMarker()) {\n const sessionId = marker.read();\n if (!sessionId) return;\n const completion = this.probe(sessionId, this.generation);\n this.state = { kind: 'probing', completion };\n }\n\n async resolveForOpen(signal: AbortSignal): Promise<string> {\n const generation = this.generation;\n if (this.state.kind === 'probing') await this.state.completion;\n if (generation !== this.generation) throw new Error('Journey session operation was superseded.');\n if (this.state.kind === 'probe_failed') throw new Error('Journey session validity could not be established.');\n if (this.state.kind === 'active' || this.state.kind === 'expired') return this.state.sessionId;\n const sessionId = await createJourneySession(this.partnerKey, signal);\n if (generation !== this.generation) throw new Error('Journey session operation was superseded.');\n this.marker.write(sessionId);\n this.state = { kind: 'active', sessionId };\n return sessionId;\n }\n\n restartExpired(signal: AbortSignal): Promise<string> | undefined {\n if (this.state.kind !== 'expired') return undefined;\n if (this.restart) return this.restart;\n const generation = this.generation;\n const operation = createJourneySession(this.partnerKey, signal).then((sessionId) => {\n if (generation !== this.generation) throw new Error('Journey session operation was superseded.');\n this.marker.write(sessionId);\n this.state = { kind: 'active', sessionId };\n return sessionId;\n }).finally(() => { if (this.restart === operation) this.restart = undefined; });\n this.restart = operation;\n return operation;\n }\n\n resetForNewJourney(): void {\n this.generation += 1;\n this.restart = undefined;\n this.marker.clear();\n this.state = { kind: 'cold' };\n }\n\n invalidatePendingOperations(): void {\n this.generation += 1;\n this.restart = undefined;\n }\n\n private async probe(sessionId: string, generation: number): Promise<void> {\n try {\n const result = await probeJourneySession(this.partnerKey, sessionId);\n if (generation !== this.generation) return;\n if (result.status === 'resumable') this.state = { kind: 'active', sessionId };\n else if (result.status === 'expired') { this.marker.clear(); this.state = { kind: 'expired', sessionId }; }\n else { this.marker.clear(); this.state = { kind: 'cold' }; }\n } catch { if (generation === this.generation) this.state = { kind: 'probe_failed' }; }\n }\n}\n","import type { YourRoadInitConfig, YourRoadSurface } from '../config/types';\nimport { requestBootstrap } from '../bootstrap/bootstrapClient';\nimport { BridgeController, runtimeOriginFromIframeUrl } from '../bridge/BridgeController';\nimport { copyContext, mergeContext } from '../context/mergeContext';\nimport type { YourRoadContext, YourRoadContextUpdate } from '../context/types';\nimport { YourRoadError } from '../errors/YourRoadError';\nimport { EventEmitter } from '../events/EventEmitter';\nimport { FocusLifecycle } from '../lifecycle/focus';\nimport { ScrollLock } from '../lifecycle/scrollLock';\nimport { OverlayController } from '../overlay/OverlayController';\nimport { SessionController } from '../session/SessionController';\n\nexport interface OpenOptions { surface: YourRoadSurface; context?: YourRoadContext }\nexport interface YourRoadEvents { opened: undefined; closed: undefined; error: YourRoadError }\n\nexport interface YourRoadClient {\n prepare(options: OpenOptions): Promise<void>;\n open(options: OpenOptions): Promise<void>;\n updateContext(update: YourRoadContextUpdate): void;\n close(): void;\n on<K extends keyof YourRoadEvents>(event: K, handler: (payload: YourRoadEvents[K]) => void): () => void;\n destroy(): void;\n}\n\nclass YourRoadClientImpl implements YourRoadClient {\n private readonly events = new EventEmitter<YourRoadEvents>();\n private readonly scroll = new ScrollLock();\n private readonly focus = new FocusLifecycle();\n private overlay?: OverlayController;\n private bridge?: BridgeController;\n private context: YourRoadContext = {};\n private destroyed = false;\n private preparing?: Promise<void>;\n private mounting?: Promise<void>;\n private wantsVisible = false;\n private visibilityRequest = 0;\n private bootstrapAbort?: AbortController;\n private restartAbort?: AbortController;\n private resetting?: Promise<void>;\n private readonly session: SessionController;\n\n constructor(private readonly config: Readonly<YourRoadInitConfig>) {\n this.session = new SessionController(config.partnerKey);\n }\n\n async open(options: OpenOptions): Promise<void> {\n this.assertUsable();\n this.validateOptions(options);\n this.adoptContext(options);\n const visibilityRequest = ++this.visibilityRequest;\n this.wantsVisible = true;\n if (this.overlay) { this.show(); return; }\n try {\n await this.ensureMounted(options.surface);\n } catch (cause) {\n if (this.visibilityRequest === visibilityRequest) this.wantsVisible = false;\n throw cause;\n }\n }\n\n async prepare(options: OpenOptions): Promise<void> {\n this.assertUsable();\n this.validateOptions(options);\n this.adoptContext(options);\n if (this.bridge) return this.bridge.whenReady();\n if (this.preparing) return this.preparing;\n const operation = this.performPrepare(options.surface);\n this.preparing = operation;\n return operation;\n }\n\n private async ensureMounted(surface: YourRoadSurface): Promise<void> {\n if (this.overlay) { if (this.wantsVisible) this.show(); return; }\n if (this.mounting) return this.mounting;\n const abort = new AbortController();\n this.bootstrapAbort = abort;\n const operation = this.performMount(surface, abort);\n this.mounting = operation;\n return operation;\n }\n\n updateContext(update: YourRoadContextUpdate): void {\n this.assertUsable();\n this.context = mergeContext(this.context, update);\n this.bridge?.contextUpdated(this.context);\n }\n\n close(): void {\n this.assertUsable();\n this.visibilityRequest += 1;\n this.wantsVisible = false;\n if (!this.overlay?.hide()) return;\n this.scroll.unlock();\n this.focus.restore();\n this.events.emit('closed', undefined);\n }\n\n on<K extends keyof YourRoadEvents>(event: K, handler: (payload: YourRoadEvents[K]) => void): () => void {\n this.assertUsable();\n return this.events.on(event, handler);\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.visibilityRequest += 1;\n this.wantsVisible = false;\n this.bootstrapAbort?.abort();\n this.bootstrapAbort = undefined;\n this.restartAbort?.abort();\n this.restartAbort = undefined;\n this.session.invalidatePendingOperations();\n this.bridge?.destroy();\n this.bridge = undefined;\n this.overlay?.destroy();\n this.overlay = undefined;\n this.scroll.unlock();\n this.focus.restore();\n this.events.clear();\n this.context = {};\n this.destroyed = true;\n }\n\n private async performPrepare(surface: YourRoadSurface): Promise<void> {\n try {\n await this.ensureMounted(surface);\n await this.bridge?.whenReady();\n } catch (cause) {\n if (!this.destroyed) throw cause;\n } finally {\n this.preparing = undefined;\n }\n }\n\n private async performMount(surface: YourRoadSurface, abort: AbortController, continuousVisibilityRequest?: number): Promise<void> {\n try {\n const [bootstrap, sessionId] = await Promise.all([\n requestBootstrap({ partnerKey: this.config.partnerKey, surface }, abort.signal),\n this.session.resolveForOpen(abort.signal),\n ]);\n const { iframeUrl } = bootstrap;\n if (abort.signal.aborted || this.destroyed || this.bootstrapAbort !== abort) return;\n try {\n const overlay = new OverlayController(iframeUrl, () => this.close(), () => this.runtimeFailed());\n this.overlay = overlay;\n const bridge = new BridgeController(\n overlay.iframe.element,\n runtimeOriginFromIframeUrl(iframeUrl),\n () => copyContext(this.context),\n () => sessionId,\n () => this.restartExpiredSession(bridge),\n () => this.resetJourneyRuntime(bridge, surface),\n );\n this.bridge = bridge;\n bridge.start();\n overlay.mount();\n if (this.wantsVisible) {\n this.show(continuousVisibilityRequest === undefined || this.visibilityRequest !== continuousVisibilityRequest);\n }\n } catch (cause) {\n this.bridge?.destroy();\n this.bridge = undefined;\n this.overlay?.destroy();\n this.overlay = undefined;\n this.scroll.unlock();\n this.focus.restore();\n throw this.fail('OVERLAY_CREATION_FAILED', 'The YourRoad overlay could not be created.', cause);\n }\n } catch (cause) {\n if (abort.signal.aborted) return;\n if (cause instanceof YourRoadError) throw cause;\n throw this.fail('BOOTSTRAP_FAILED', 'The YourRoad experience could not be started securely.', cause);\n } finally {\n if (this.bootstrapAbort === abort) {\n this.bootstrapAbort = undefined;\n this.mounting = undefined;\n }\n }\n }\n\n private show(emitEvent = true): void {\n if (!this.overlay?.show()) return;\n this.focus.capture();\n this.scroll.lock();\n this.focus.moveTo(this.overlay.closeButton);\n if (emitEvent) this.events.emit('opened', undefined);\n }\n\n private runtimeFailed(): void {\n const error = this.fail('IFRAME_LOAD_FAILED', 'The embedded experience failed to load.');\n this.bridge?.failReadiness(error);\n this.bridge?.destroy();\n this.bridge = undefined;\n const wasVisible = this.overlay?.isVisible() ?? false;\n this.overlay?.destroy();\n this.overlay = undefined;\n if (wasVisible) { this.scroll.unlock(); this.focus.restore(); }\n }\n\n private validateOptions(options: OpenOptions): void {\n if (!options || options.surface !== 'pre-approval') throw this.fail('INVALID_SURFACE', 'The only supported surface is \"pre-approval\".');\n }\n\n private adoptContext(options: OpenOptions): void {\n if (options.context !== undefined) {\n this.context = copyContext(options.context);\n this.bridge?.contextUpdated(this.context);\n }\n }\n\n private restartExpiredSession(bridge: BridgeController | undefined): void {\n if (this.destroyed || bridge === undefined || bridge !== this.bridge || this.restartAbort) return;\n const restartAbort = new AbortController();\n this.restartAbort = restartAbort;\n const operation = this.session.restartExpired(restartAbort.signal);\n if (!operation) { this.restartAbort = undefined; return; }\n void operation.then((sessionId) => {\n if (!this.destroyed && !restartAbort.signal.aborted && this.bridge === bridge) bridge.sendJourneySession(sessionId);\n }).catch(() => { /* The runtime may offer a later explicit retry. */ }).finally(() => {\n if (this.restartAbort === restartAbort) this.restartAbort = undefined;\n });\n }\n\n private resetJourneyRuntime(bridge: BridgeController, surface: YourRoadSurface): void {\n if (this.destroyed || bridge !== this.bridge || this.resetting) return;\n const operation = this.performJourneyReset(surface);\n this.resetting = operation;\n void operation.catch(() => { /* Normal SDK error reporting is performed by the mount path. */ }).finally(() => {\n if (this.resetting === operation) this.resetting = undefined;\n });\n }\n\n private async performJourneyReset(surface: YourRoadSurface): Promise<void> {\n const continuousVisibilityRequest = this.overlay?.isVisible() ? this.visibilityRequest : undefined;\n this.bootstrapAbort?.abort();\n this.bootstrapAbort = undefined;\n this.mounting = undefined;\n this.restartAbort?.abort();\n this.restartAbort = undefined;\n this.session.resetForNewJourney();\n\n this.bridge?.destroy();\n this.bridge = undefined;\n this.overlay?.destroy();\n this.overlay = undefined;\n\n if (this.destroyed) return;\n const abort = new AbortController();\n this.bootstrapAbort = abort;\n const operation = this.performMount(surface, abort, continuousVisibilityRequest);\n this.mounting = operation;\n try {\n await operation;\n } catch (cause) {\n if (!this.destroyed && !this.overlay) {\n this.scroll.unlock();\n this.focus.restore();\n }\n throw cause;\n }\n }\n\n private assertUsable(): void { if (this.destroyed) throw new YourRoadError('DESTROYED', 'This YourRoad SDK instance has been destroyed.'); }\n private fail(code: ConstructorParameters<typeof YourRoadError>[0], message: string, cause?: unknown): YourRoadError {\n const error = new YourRoadError(code, message, cause === undefined ? undefined : { cause });\n this.events.emit('error', error);\n return error;\n }\n}\n\nexport function createYourRoadClient(config: Readonly<YourRoadInitConfig>): YourRoadClient {\n return new YourRoadClientImpl(config);\n}\n","import { createYourRoadClient, type YourRoadClient } from './client/YourRoadClient';\nimport type { YourRoadInitConfig } from './config/types';\nimport { YourRoadError } from './errors/YourRoadError';\n\nexport type { OpenOptions, YourRoadClient, YourRoadEvents } from './client/YourRoadClient';\nexport type { YourRoadInitConfig, YourRoadSurface } from './config/types';\nexport type { DealerContext, PageContext, VehicleContext, YourRoadContext, YourRoadContextUpdate } from './context/types';\nexport { YourRoadError };\n\nexport class YourRoad {\n static init(config: YourRoadInitConfig): YourRoadClient {\n if (!config || typeof config.partnerKey !== 'string' || config.partnerKey.trim() === '') {\n throw new YourRoadError('INVALID_INITIALISATION', 'partnerKey must be a non-empty string.');\n }\n return createYourRoadClient({ partnerKey: config.partnerKey });\n }\n}\n"],"names":["BOOTSTRAP_ENDPOINT","validateResponse","value","iframeUrl","expiresAt","parsedUrl","requestBootstrap","request","signal","response","defined","item","mergeContext","current","update","next","key","copyContext","context","BRIDGE_VERSION","runtimeOriginFromIframeUrl","url","isPlainObject","prototype","isReadyMessage","isLifecycleMessage","type","BridgeController","iframe","trustedRuntimeOrigin","getCurrentContext","getJourneySessionId","onJourneySessionRestart","onJourneyReset","__publicField","event","iframeWindow","resolve","reject","currentContext","reason","sessionId","message","YourRoadError","code","options","EventEmitter","handler","handlers","payload","_a","FocusLifecycle","element","ScrollLock","style","IframeController","source","onError","SDK_Z_INDEX","SDK_STYLES","ensureStyles","existing","OverlayController","onClose","onFrameError","scrim","panel","closeIcon","closeIconPath","wasVisible","JOURNEY_SESSION_MARKER_KEY","isUuid","resolveStorage","createSessionMarker","storage","clear","CREATE_ENDPOINT","PROBE_ENDPOINT","isDate","body","createJourneySession","partnerKey","probeJourneySession","SessionController","marker","completion","generation","operation","result","YourRoadClientImpl","config","visibilityRequest","cause","surface","abort","_b","_c","_d","continuousVisibilityRequest","bootstrap","overlay","bridge","emitEvent","error","restartAbort","_e","createYourRoadClient","YourRoad"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yourroad/sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Framework-independent browser SDK for hosting YourRoad embedded experiences",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
@@ -22,7 +22,10 @@
|
|
|
22
22
|
"require": "./dist/index.cjs"
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
|
-
"files": [
|
|
25
|
+
"files": [
|
|
26
|
+
"dist",
|
|
27
|
+
"README.md"
|
|
28
|
+
],
|
|
26
29
|
"scripts": {
|
|
27
30
|
"build": "vite build",
|
|
28
31
|
"test": "vitest run",
|
|
@@ -42,6 +45,8 @@
|
|
|
42
45
|
"vite-plugin-dts": "^4.4.0",
|
|
43
46
|
"vitest": "^3.2.4"
|
|
44
47
|
},
|
|
45
|
-
"engines": {
|
|
48
|
+
"engines": {
|
|
49
|
+
"node": ">=18"
|
|
50
|
+
},
|
|
46
51
|
"license": "UNLICENSED"
|
|
47
52
|
}
|