@thor-commerce/app-bridge-react 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/navigation.ts","../src/core.ts","../src/runtime.ts"],"sourcesContent":["export interface BridgeNavigationGoPayload {\n path?: string;\n href?: string;\n pathname?: string;\n search?: string;\n hash?: string;\n}\n\nexport interface BridgeNavigationRedirectPayload extends BridgeNavigationGoPayload {}\n\nexport interface BridgeNavigationUpdatePayload {\n path: string;\n pathname: string;\n search: string;\n hash: string;\n}\n\nexport interface BridgeNavigationItem {\n path: string;\n label: string;\n matchPattern?: string;\n exactMatch?: boolean;\n}\n\nexport interface BridgeNavigationItemsPayload {\n items: BridgeNavigationItem[];\n}\n\nexport const EMBEDDED_LAUNCH_PARAMS = [\n \"appLoadId\",\n \"embedded\",\n \"hmac\",\n \"host\",\n \"id_token\",\n \"link_source\",\n \"locale\",\n \"project\",\n \"protocol\",\n \"session\",\n \"shop\",\n \"tenant\",\n \"timestamp\"\n] as const;\n\nconst NAVIGATION_BASE_URL = \"https://embedded-app.local\";\n\nfunction normalizeSearch(search: string) {\n if (!search) {\n return \"\";\n }\n\n return search.startsWith(\"?\") ? search : `?${search}`;\n}\n\nfunction normalizeHash(hash: string) {\n if (!hash) {\n return \"\";\n }\n\n return hash.startsWith(\"#\") ? hash : `#${hash}`;\n}\n\nexport function buildNavigationUpdatePayload(path: string): BridgeNavigationUpdatePayload {\n const sanitizedPath = sanitizeEmbeddedAppPath(path) ?? path;\n let pathname = sanitizedPath;\n let search = \"\";\n let hash = \"\";\n\n const hashIndex = pathname.indexOf(\"#\");\n if (hashIndex >= 0) {\n hash = pathname.slice(hashIndex);\n pathname = pathname.slice(0, hashIndex);\n }\n\n const searchIndex = pathname.indexOf(\"?\");\n if (searchIndex >= 0) {\n search = pathname.slice(searchIndex);\n pathname = pathname.slice(0, searchIndex);\n }\n\n return {\n path: `${pathname || \"/\"}${search}${hash}`,\n pathname: pathname || \"/\",\n search,\n hash\n };\n}\n\nexport function sanitizeEmbeddedAppPath(path: string | undefined) {\n if (!path) {\n return path;\n }\n\n const trimmedPath = path.trim();\n if (!trimmedPath) {\n return trimmedPath;\n }\n\n const url = new URL(trimmedPath, NAVIGATION_BASE_URL);\n let changed = false;\n\n for (const key of EMBEDDED_LAUNCH_PARAMS) {\n if (url.searchParams.has(key)) {\n url.searchParams.delete(key);\n changed = true;\n }\n }\n\n if (!changed) {\n return trimmedPath;\n }\n\n if (/^https?:\\/\\//i.test(trimmedPath)) {\n return url.toString();\n }\n\n return `${url.pathname}${url.search}${url.hash}`;\n}\n\nexport function preserveEmbeddedAppLaunchParams(\n path: string | undefined,\n currentHref: string | undefined\n) {\n if (!path || !currentHref) {\n return path;\n }\n\n try {\n const currentUrl = new URL(currentHref, NAVIGATION_BASE_URL);\n const nextUrl = new URL(path, currentUrl.href);\n\n if (nextUrl.origin !== currentUrl.origin) {\n return path;\n }\n\n let changed = false;\n for (const key of EMBEDDED_LAUNCH_PARAMS) {\n if (!nextUrl.searchParams.has(key) && currentUrl.searchParams.has(key)) {\n const value = currentUrl.searchParams.get(key);\n if (value != null) {\n nextUrl.searchParams.set(key, value);\n changed = true;\n }\n }\n }\n\n if (!changed) {\n return path;\n }\n\n if (/^https?:\\/\\//i.test(path)) {\n return nextUrl.toString();\n }\n\n return `${nextUrl.pathname}${nextUrl.search}${nextUrl.hash}`;\n } catch {\n return path;\n }\n}\n\nexport function resolveLocalNavigationPath(\n href: string,\n currentOrigin: string\n): string | null {\n if (!href || href.startsWith(\"#\")) {\n return null;\n }\n\n let destination: URL;\n try {\n destination = new URL(href, currentOrigin);\n } catch {\n return null;\n }\n\n if (destination.origin !== currentOrigin) {\n return null;\n }\n\n return sanitizeEmbeddedAppPath(\n `${destination.pathname}${destination.search}${destination.hash}`\n ) ?? null;\n}\n\nexport function resolveNavigationDestination(payload: unknown): string | null {\n if (typeof payload === \"string\") {\n return sanitizeEmbeddedAppPath(payload) ?? null;\n }\n\n if (!payload || typeof payload !== \"object\") {\n return null;\n }\n\n const value = payload as BridgeNavigationGoPayload;\n\n if (typeof value.path === \"string\" && value.path) {\n return sanitizeEmbeddedAppPath(value.path) ?? null;\n }\n\n if (typeof value.href === \"string\" && value.href) {\n return sanitizeEmbeddedAppPath(value.href) ?? null;\n }\n\n if (typeof value.pathname !== \"string\" || !value.pathname) {\n return null;\n }\n\n return (\n sanitizeEmbeddedAppPath(\n `${value.pathname}${normalizeSearch(value.search ?? \"\")}${normalizeHash(value.hash ?? \"\")}`\n ) ?? null\n );\n}\n\n\nfunction normalizeNavigationItemPath(path: string | undefined) {\n if (!path) {\n return null;\n }\n\n const trimmedPath = path.trim();\n if (!trimmedPath || /^https?:\\/\\//i.test(trimmedPath)) {\n return null;\n }\n\n const normalizedPath = trimmedPath.startsWith(\"/\") ? trimmedPath : \"/\" + trimmedPath;\n return sanitizeEmbeddedAppPath(normalizedPath) ?? normalizedPath;\n}\n\nexport function normalizeBridgeNavigationItem(\n item: BridgeNavigationItem\n): BridgeNavigationItem | null {\n const label = item.label?.trim();\n const path = normalizeNavigationItemPath(item.path);\n\n if (!label || !path) {\n return null;\n }\n\n const matchPattern = normalizeNavigationItemPath(item.matchPattern ?? item.path);\n\n return {\n label,\n path,\n ...(matchPattern ? {matchPattern} : {}),\n ...(item.exactMatch !== undefined ? {exactMatch: item.exactMatch} : {}),\n };\n}\n\nexport function normalizeBridgeNavigationItems(\n items: BridgeNavigationItem[] | undefined\n) {\n if (!items?.length) {\n return [];\n }\n\n return items.flatMap((item) => {\n const normalizedItem = normalizeBridgeNavigationItem(item);\n return normalizedItem ? [normalizedItem] : [];\n });\n}\n","import {\n preserveEmbeddedAppLaunchParams,\n resolveNavigationDestination,\n type BridgeNavigationGoPayload,\n type BridgeNavigationRedirectPayload\n} from \"./navigation\";\n\nexport type BridgeParticipant = \"embedded-app\" | \"dashboard\" | \"unknown\";\n\nexport type BridgeMessageKind = \"event\" | \"request\" | \"response\";\n\nexport interface BridgeErrorPayload {\n code: string;\n message: string;\n}\n\nexport interface BridgeMessage<TPayload = unknown> {\n namespace: string;\n version: \"1.0\";\n kind: BridgeMessageKind;\n id: string;\n type: string;\n source: BridgeParticipant;\n target?: BridgeParticipant;\n payload?: TPayload;\n replyTo?: string;\n error?: BridgeErrorPayload;\n}\n\nexport interface AppBridgeOptions {\n clientId?: string;\n source?: BridgeParticipant;\n target?: BridgeParticipant;\n namespace?: string;\n targetOrigin?: string;\n allowedOrigins?: string[];\n requestTimeoutMs?: number;\n selfWindow?: Window;\n targetWindow?: Window | null;\n}\n\nexport interface RequestOptions {\n timeoutMs?: number;\n}\n\nexport interface SessionTokenRequest {\n clientId?: string;\n}\n\nexport interface SessionTokenResponse {\n sessionToken?: string;\n idToken: string;\n exp?: number;\n project?: string;\n}\n\nexport interface ReceivedBridgeMessage<TPayload = unknown> extends BridgeMessage<TPayload> {\n origin: string;\n rawEvent: MessageEvent<unknown>;\n}\n\nexport type BridgeEventHandler<TPayload = unknown> = (\n message: ReceivedBridgeMessage<TPayload>\n) => void;\n\nexport type BridgeRequestHandler<TRequest = unknown, TResponse = unknown> = (\n payload: TRequest,\n message: ReceivedBridgeMessage<TRequest>\n) => TResponse | Promise<TResponse>;\n\nexport type Unsubscribe = () => void;\n\nconst DEFAULT_NAMESPACE = \"thorcommerce:app-bridge\";\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_REDIRECT_EVENT_TYPE = \"navigation:redirect\";\n\nfunction createMessageId() {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n\n return `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction resolveSelfWindow(explicitWindow?: Window) {\n if (explicitWindow) {\n return explicitWindow;\n }\n\n if (typeof window !== \"undefined\") {\n return window;\n }\n\n return undefined;\n}\n\nfunction resolveTargetWindow(selfWindow: Window | undefined, targetWindow?: Window | null) {\n if (targetWindow) {\n return targetWindow;\n }\n\n if (!selfWindow) {\n return undefined;\n }\n\n if (selfWindow.parent && selfWindow.parent !== selfWindow) {\n return selfWindow.parent;\n }\n\n return undefined;\n}\n\nfunction isDevelopmentEnvironment() {\n const nodeEnv =\n typeof globalThis !== \"undefined\" && \"process\" in globalThis\n ? (\n globalThis as typeof globalThis & {\n process?: { env?: { NODE_ENV?: string } };\n }\n ).process?.env?.NODE_ENV\n : undefined;\n\n if (nodeEnv) {\n return nodeEnv !== \"production\";\n }\n\n return true;\n}\n\nfunction hasAllowedOrigin(origin: string, allowedOrigins?: string[]) {\n if (!allowedOrigins || allowedOrigins.length === 0) {\n return true;\n }\n\n return allowedOrigins.includes(origin);\n}\n\nfunction isMessageTarget(value: unknown): value is Window {\n return !!value && typeof (value as Window).postMessage === \"function\";\n}\n\nfunction omitUndefinedFields<T extends object>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, fieldValue]) => fieldValue !== undefined)\n ) as T;\n}\n\nexport function isBridgeMessage<TPayload = unknown>(\n value: unknown,\n namespace = DEFAULT_NAMESPACE\n): value is BridgeMessage<TPayload> {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const message = value as Partial<BridgeMessage<TPayload>>;\n\n return (\n message.namespace === namespace &&\n message.version === \"1.0\" &&\n typeof message.kind === \"string\" &&\n typeof message.id === \"string\" &&\n typeof message.type === \"string\" &&\n typeof message.source === \"string\"\n );\n}\n\nexport class AppBridge {\n private readonly namespace: string;\n private readonly clientId?: string;\n private readonly source: BridgeParticipant;\n private readonly target: BridgeParticipant | undefined;\n private readonly targetOrigin: string;\n private readonly allowedOrigins?: string[];\n private readonly selfWindow?: Window;\n private readonly defaultTimeoutMs: number;\n private targetWindow?: Window;\n private readonly eventHandlers = new Map<string, Set<BridgeEventHandler>>();\n private readonly requestHandlers = new Map<string, BridgeRequestHandler>();\n private readonly pendingRequests = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n }\n >();\n private readonly messageListener: (event: MessageEvent<unknown>) => void;\n\n constructor(options: AppBridgeOptions = {}) {\n this.namespace = options.namespace ?? DEFAULT_NAMESPACE;\n this.clientId = options.clientId;\n this.source = options.source ?? \"embedded-app\";\n this.target = options.target;\n this.targetOrigin = options.targetOrigin ?? \"*\";\n this.allowedOrigins = options.allowedOrigins;\n this.defaultTimeoutMs = options.requestTimeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.selfWindow = resolveSelfWindow(options.selfWindow);\n this.targetWindow = resolveTargetWindow(this.selfWindow, options.targetWindow);\n this.messageListener = (event) => {\n this.handleMessage(event);\n };\n\n if (!this.selfWindow) {\n throw new Error(\n \"AppBridge requires a browser window. Pass selfWindow explicitly when constructing it outside global window scope.\"\n );\n }\n\n if (this.targetOrigin === \"*\" && isDevelopmentEnvironment()) {\n console.warn(\n 'AppBridge is using \"*\" as targetOrigin. Set targetOrigin explicitly for both the dashboard and embedded app in production.'\n );\n }\n\n this.selfWindow.addEventListener(\"message\", this.messageListener);\n }\n\n setTargetWindow(targetWindow: Window | null) {\n this.targetWindow = targetWindow ?? undefined;\n }\n\n hasTargetWindow() {\n return this.targetWindow !== undefined;\n }\n\n redirect(payload: string | BridgeNavigationRedirectPayload) {\n const destination = resolveNavigationDestination(payload);\n if (!destination) {\n throw new Error(\"AppBridge redirect requires a valid destination.\");\n }\n\n if (!this.targetWindow) {\n this.navigateSelf(destination);\n return;\n }\n\n this.postMessage<BridgeNavigationRedirectPayload>({\n kind: \"event\",\n type: DEFAULT_REDIRECT_EVENT_TYPE,\n payload: typeof payload === \"string\" ? { href: payload } : payload\n });\n }\n\n redirectToRemote(href: string) {\n this.redirect({ href });\n }\n\n redirectToApp(path: string | BridgeNavigationGoPayload) {\n this.redirect(typeof path === \"string\" ? { path } : path);\n }\n\n send<TPayload = unknown>(type: string, payload?: TPayload) {\n this.postMessage({\n kind: \"event\",\n type,\n payload\n });\n }\n\n request<TRequest = unknown, TResponse = unknown>(\n type: string,\n payload?: TRequest,\n options: RequestOptions = {}\n ) {\n const messageId = createMessageId();\n const timeoutMs = options.timeoutMs ?? this.defaultTimeoutMs;\n\n return new Promise<TResponse>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n this.pendingRequests.delete(messageId);\n reject(new Error(`Bridge request timed out for \"${type}\" after ${timeoutMs}ms.`));\n }, timeoutMs);\n\n this.pendingRequests.set(messageId, {\n resolve: (value) => resolve(value as TResponse),\n reject,\n timeoutId\n });\n\n try {\n this.postMessage({\n id: messageId,\n kind: \"request\",\n type,\n payload\n });\n } catch (error) {\n clearTimeout(timeoutId);\n this.pendingRequests.delete(messageId);\n reject(error instanceof Error ? error : new Error(\"Failed to send bridge request.\"));\n }\n });\n }\n\n getSessionToken(\n request: SessionTokenRequest = {},\n options: RequestOptions = {}\n ) {\n const resolvedRequest =\n request.clientId || this.clientId\n ? {\n ...request,\n clientId: request.clientId ?? this.clientId\n }\n : request;\n\n return this.request<SessionTokenRequest, SessionTokenResponse>(\n \"thor:session-token:get\",\n resolvedRequest,\n options\n );\n }\n\n on<TPayload = unknown>(type: string, handler: BridgeEventHandler<TPayload>): Unsubscribe {\n const handlers = this.eventHandlers.get(type) ?? new Set<BridgeEventHandler>();\n handlers.add(handler as BridgeEventHandler);\n this.eventHandlers.set(type, handlers);\n\n return () => {\n handlers.delete(handler as BridgeEventHandler);\n if (handlers.size === 0) {\n this.eventHandlers.delete(type);\n }\n };\n }\n\n onRequest<TRequest = unknown, TResponse = unknown>(\n type: string,\n handler: BridgeRequestHandler<TRequest, TResponse>\n ): Unsubscribe {\n this.requestHandlers.set(type, handler as BridgeRequestHandler);\n\n return () => {\n const registeredHandler = this.requestHandlers.get(type);\n if (registeredHandler === handler) {\n this.requestHandlers.delete(type);\n }\n };\n }\n\n destroy() {\n if (this.selfWindow) {\n this.selfWindow.removeEventListener(\"message\", this.messageListener);\n }\n\n for (const pendingRequest of this.pendingRequests.values()) {\n clearTimeout(pendingRequest.timeoutId);\n pendingRequest.reject(new Error(\"AppBridge destroyed before a response was received.\"));\n }\n\n this.pendingRequests.clear();\n this.eventHandlers.clear();\n this.requestHandlers.clear();\n }\n\n private handleMessage(event: MessageEvent<unknown>) {\n if (!hasAllowedOrigin(event.origin, this.allowedOrigins)) {\n return;\n }\n\n if (!isBridgeMessage(event.data, this.namespace)) {\n return;\n }\n\n const message = event.data;\n\n if (this.target && message.target && message.target !== this.source) {\n return;\n }\n\n const receivedMessage: ReceivedBridgeMessage = {\n ...message,\n origin: event.origin,\n rawEvent: event\n };\n\n if (\n message.kind === \"event\" &&\n message.type === DEFAULT_REDIRECT_EVENT_TYPE &&\n this.handleRedirectMessage(receivedMessage)\n ) {\n return;\n }\n\n if (message.kind === \"response\" && message.replyTo) {\n this.resolvePendingRequest(message.replyTo, message);\n return;\n }\n\n this.emitHandlers(message.type, receivedMessage);\n\n if (message.kind === \"request\") {\n void this.handleRequest(receivedMessage);\n }\n }\n\n private emitHandlers(type: string, message: ReceivedBridgeMessage) {\n const typeHandlers = this.eventHandlers.get(type);\n if (typeHandlers) {\n for (const handler of typeHandlers) {\n handler(message);\n }\n }\n\n if (type === \"*\") {\n return;\n }\n\n const wildcardHandlers = this.eventHandlers.get(\"*\");\n if (wildcardHandlers) {\n for (const handler of wildcardHandlers) {\n handler(message);\n }\n }\n }\n\n private async handleRequest(message: ReceivedBridgeMessage) {\n const handler = this.requestHandlers.get(message.type);\n if (!handler) {\n return;\n }\n\n const replyTarget = isMessageTarget(message.rawEvent.source)\n ? message.rawEvent.source\n : this.targetWindow;\n\n try {\n const payload = await handler(message.payload, message);\n this.postMessage(\n {\n kind: \"response\",\n type: message.type,\n payload,\n replyTo: message.id\n },\n replyTarget\n );\n } catch (error) {\n const bridgeError =\n error instanceof Error\n ? { code: \"request_handler_error\", message: error.message }\n : { code: \"request_handler_error\", message: \"Unknown request handler error.\" };\n\n this.postMessage(\n {\n kind: \"response\",\n type: message.type,\n error: bridgeError,\n replyTo: message.id\n },\n replyTarget\n );\n }\n }\n\n private resolvePendingRequest(messageId: string, message: BridgeMessage) {\n const pendingRequest = this.pendingRequests.get(messageId);\n if (!pendingRequest) {\n return;\n }\n\n clearTimeout(pendingRequest.timeoutId);\n this.pendingRequests.delete(messageId);\n\n if (message.error) {\n pendingRequest.reject(new Error(`${message.error.code}: ${message.error.message}`));\n return;\n }\n\n pendingRequest.resolve(message.payload);\n }\n\n private postMessage<TPayload = unknown>(\n partialMessage: Pick<BridgeMessage<TPayload>, \"kind\" | \"type\"> &\n Partial<Omit<BridgeMessage<TPayload>, \"namespace\" | \"version\" | \"source\">>,\n targetWindowOverride?: Window\n ) {\n const targetWindow = targetWindowOverride ?? this.targetWindow;\n if (!targetWindow) {\n throw new Error(\n \"AppBridge could not resolve a target window. Pass targetWindow explicitly or call setTargetWindow().\"\n );\n }\n\n const message = omitUndefinedFields({\n namespace: this.namespace,\n version: \"1.0\",\n id: partialMessage.id ?? createMessageId(),\n kind: partialMessage.kind,\n type: partialMessage.type,\n source: this.source,\n target: partialMessage.target ?? this.target,\n payload: partialMessage.payload,\n replyTo: partialMessage.replyTo,\n error: partialMessage.error\n }) as BridgeMessage<TPayload>;\n\n targetWindow.postMessage(message, this.targetOrigin);\n }\n\n private handleRedirectMessage(message: ReceivedBridgeMessage): boolean {\n const destination = resolveNavigationDestination(message.payload);\n if (!destination) {\n return false;\n }\n\n this.navigateSelf(destination);\n return true;\n }\n\n private navigateSelf(destination: string) {\n if (!this.selfWindow) {\n throw new Error(\"AppBridge could not resolve a browser window for redirect.\");\n }\n\n this.selfWindow.location.assign(\n preserveEmbeddedAppLaunchParams(destination, this.selfWindow.location.href) ?? destination\n );\n }\n}\n\nexport function createAppBridge(options: AppBridgeOptions = {}) {\n return new AppBridge(options);\n}\n","import {\n createAppBridge,\n type AppBridge,\n type AppBridgeOptions,\n type ReceivedBridgeMessage,\n} from \"./core\";\nimport {\n buildNavigationUpdatePayload,\n normalizeBridgeNavigationItems,\n preserveEmbeddedAppLaunchParams,\n resolveLocalNavigationPath,\n resolveNavigationDestination,\n sanitizeEmbeddedAppPath,\n type BridgeNavigationGoPayload,\n type BridgeNavigationItem,\n} from \"./navigation\";\n\nconst GLOBAL_RUNTIME_KEY = \"__thorEmbeddedAppRuntime__\";\nexport const THOR_NAVIGATE_EVENT = \"thor:navigate\";\n\nexport interface EmbeddedAppRuntimeConfig\n extends Omit<AppBridgeOptions, \"source\" | \"target\" | \"allowedOrigins\"> {\n clientId: string;\n currentPath?: string | null;\n navigationItems?: BridgeNavigationItem[];\n navigationEventType?: string;\n navigationUpdateEventType?: string;\n onNavigate?: (\n path: string,\n message?: ReceivedBridgeMessage<BridgeNavigationGoPayload>,\n ) => void;\n readyEventType?: string;\n readyPayload?: unknown;\n}\n\ntype GlobalWithRuntime = typeof globalThis & {\n [GLOBAL_RUNTIME_KEY]?: EmbeddedAppRuntime;\n};\n\nexport class EmbeddedAppRuntime {\n readonly bridge: AppBridge;\n\n private clientId: string;\n private currentPath: string | null = null;\n private navigationItems: BridgeNavigationItem[] = [];\n private navigationEventType = \"navigation:go\";\n private navigationUpdateEventType = \"navigation:update\";\n private readyEventType = \"app:ready\";\n private readyPayload: unknown;\n private hasSentReady = false;\n private lastSentNavigationItemsKey: string | null = null;\n private lastReportedPath: string | null = null;\n private pendingHostNavigationPath: string | null = null;\n private onNavigate?:\n | ((\n path: string,\n message?: ReceivedBridgeMessage<BridgeNavigationGoPayload>,\n ) => void)\n | undefined;\n private sessionTokenCache: {\n token: string;\n expiresAt?: number;\n } | null = null;\n private project: string | null;\n private pendingSessionToken: Promise<string> | null = null;\n private readonly selfWindow: Window;\n private readonly targetOrigin?: string;\n private readonly removeNavigationInterceptors: () => void;\n private readonly removeHistoryObserver: () => void;\n private readonly restoreFetch: () => void;\n private removeNavigationRequestHandler?: () => void;\n\n constructor(config: EmbeddedAppRuntimeConfig) {\n const resolvedWindow =\n config.selfWindow ?? (typeof window !== \"undefined\" ? window : undefined);\n if (!resolvedWindow) {\n throw new Error(\"EmbeddedAppRuntime requires a browser window.\");\n }\n\n this.selfWindow = resolvedWindow;\n this.targetOrigin = config.targetOrigin ?? getReferrerOrigin(resolvedWindow);\n this.clientId = config.clientId;\n this.currentPath = readCurrentPath(resolvedWindow);\n this.project = readInitialProject(resolvedWindow);\n this.readyPayload = config.readyPayload ?? { clientId: config.clientId };\n\n this.bridge = createAppBridge({\n allowedOrigins: this.targetOrigin ? [this.targetOrigin] : undefined,\n namespace: config.namespace,\n requestTimeoutMs: config.requestTimeoutMs,\n selfWindow: resolvedWindow,\n source: \"embedded-app\",\n target: \"dashboard\",\n targetOrigin: this.targetOrigin,\n targetWindow: config.targetWindow,\n });\n\n this.removeNavigationRequestHandler = this.bridge.on<\n BridgeNavigationGoPayload\n >(this.navigationEventType, (message) => {\n const destination = resolveNavigationDestination(message.payload);\n if (!destination) {\n return;\n }\n\n this.pendingHostNavigationPath =\n sanitizeEmbeddedAppPath(destination) ?? destination;\n\n const nextPath = preserveEmbeddedAppLaunchParams(\n destination,\n this.selfWindow.location.href,\n );\n this.navigate(nextPath ?? destination, message);\n });\n\n this.removeNavigationInterceptors = installNavigationInterceptors({\n bridge: this.bridge,\n selfWindow: this.selfWindow,\n navigate: (path) => this.navigate(path),\n });\n\n this.removeHistoryObserver = installHistoryObserver({\n selfWindow: this.selfWindow,\n onChange: (path) => {\n this.currentPath = path;\n this.syncBridgeState();\n },\n });\n\n this.restoreFetch = installFetchInterceptor({\n bridge: this.bridge,\n getClientId: () => this.clientId,\n getProject: () => this.project,\n setProject: (project) => {\n this.project = project;\n },\n readCachedToken: () => this.sessionTokenCache,\n writeCachedToken: (token) => {\n this.sessionTokenCache = token;\n },\n readPendingToken: () => this.pendingSessionToken,\n writePendingToken: (token) => {\n this.pendingSessionToken = token;\n },\n });\n\n this.update(config);\n }\n\n update(config: Partial<EmbeddedAppRuntimeConfig>) {\n if (config.clientId) {\n this.clientId = config.clientId;\n if (\n !this.readyPayload ||\n (typeof this.readyPayload === \"object\" &&\n this.readyPayload !== null &&\n \"clientId\" in this.readyPayload)\n ) {\n this.readyPayload = config.readyPayload ?? { clientId: config.clientId };\n }\n }\n\n if (config.currentPath !== undefined) {\n this.currentPath = config.currentPath;\n }\n\n if (config.navigationItems !== undefined) {\n this.navigationItems = normalizeBridgeNavigationItems(config.navigationItems);\n }\n\n if (config.onNavigate !== undefined) {\n this.onNavigate = config.onNavigate;\n }\n\n if (config.readyEventType) {\n this.readyEventType = config.readyEventType;\n }\n\n if (config.readyPayload !== undefined) {\n this.readyPayload = config.readyPayload;\n }\n\n if (config.targetWindow !== undefined) {\n this.bridge.setTargetWindow(config.targetWindow ?? null);\n }\n\n this.syncBridgeState();\n }\n\n clearNavigationHandler() {\n this.onNavigate = undefined;\n }\n\n destroy() {\n this.removeNavigationRequestHandler?.();\n this.removeNavigationInterceptors();\n this.removeHistoryObserver();\n this.restoreFetch();\n this.bridge.destroy();\n }\n\n private syncBridgeState() {\n if (!this.bridge.hasTargetWindow()) {\n return;\n }\n\n if (!this.hasSentReady) {\n this.bridge.send(this.readyEventType, this.readyPayload);\n this.hasSentReady = true;\n }\n\n const navigationItemsKey = JSON.stringify(this.navigationItems);\n if (navigationItemsKey !== this.lastSentNavigationItemsKey) {\n this.bridge.send(\"navigation:items:update\", {\n items: this.navigationItems,\n });\n this.lastSentNavigationItemsKey = navigationItemsKey;\n }\n\n if (this.currentPath) {\n if (this.currentPath === this.pendingHostNavigationPath) {\n this.pendingHostNavigationPath = null;\n this.lastReportedPath = this.currentPath;\n return;\n }\n\n if (this.currentPath === this.lastReportedPath) {\n return;\n }\n\n this.bridge.send(\n this.navigationUpdateEventType,\n buildNavigationUpdatePayload(this.currentPath),\n );\n this.lastReportedPath = this.currentPath;\n }\n }\n\n private navigate(\n path: string,\n message?: ReceivedBridgeMessage<BridgeNavigationGoPayload>,\n ) {\n if (this.onNavigate) {\n this.onNavigate(path, message);\n return;\n }\n\n if (dispatchNavigateEvent(this.selfWindow.document, path)) {\n return;\n }\n\n this.selfWindow.location.assign(path);\n }\n}\n\nexport function getOrCreateEmbeddedAppRuntime(\n config: EmbeddedAppRuntimeConfig,\n) {\n const globalScope = globalThis as GlobalWithRuntime;\n const existingRuntime = globalScope[GLOBAL_RUNTIME_KEY];\n\n if (existingRuntime) {\n existingRuntime.update(config);\n return existingRuntime;\n }\n\n const runtime = new EmbeddedAppRuntime(config);\n globalScope[GLOBAL_RUNTIME_KEY] = runtime;\n return runtime;\n}\n\nexport function getEmbeddedAppRuntime() {\n return (globalThis as GlobalWithRuntime)[GLOBAL_RUNTIME_KEY] ?? null;\n}\n\nfunction dispatchNavigateEvent(document: Document, path: string) {\n const event = new CustomEvent<{path: string}>(THOR_NAVIGATE_EVENT, {\n cancelable: true,\n detail: {path},\n });\n\n document.dispatchEvent(event);\n return event.defaultPrevented;\n}\n\nfunction readCurrentPath(selfWindow: Window) {\n return (\n sanitizeEmbeddedAppPath(\n `${selfWindow.location.pathname}${selfWindow.location.search}${selfWindow.location.hash}`,\n ) ?? null\n );\n}\n\nfunction installHistoryObserver({\n selfWindow,\n onChange,\n}: {\n selfWindow: Window;\n onChange: (path: string | null) => void;\n}) {\n const history = selfWindow.history;\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n const notify = () => {\n onChange(readCurrentPath(selfWindow));\n };\n\n history.pushState = function (...args) {\n originalPushState.apply(history, args);\n notify();\n };\n\n history.replaceState = function (...args) {\n originalReplaceState.apply(history, args);\n notify();\n };\n\n selfWindow.addEventListener(\"popstate\", notify);\n selfWindow.addEventListener(\"hashchange\", notify);\n\n notify();\n\n return () => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n selfWindow.removeEventListener(\"popstate\", notify);\n selfWindow.removeEventListener(\"hashchange\", notify);\n };\n}\n\nfunction getReferrerOrigin(explicitWindow?: Window) {\n const resolvedWindow =\n explicitWindow ?? (typeof window !== \"undefined\" ? window : undefined);\n const referrer = resolvedWindow?.document?.referrer;\n\n if (!referrer) {\n return undefined;\n }\n\n try {\n return new URL(referrer).origin;\n } catch {\n return undefined;\n }\n}\n\nfunction installNavigationInterceptors({\n bridge,\n selfWindow,\n navigate,\n}: {\n bridge: AppBridge;\n selfWindow: Window;\n navigate: (path: string) => void;\n}) {\n const document = selfWindow.document;\n const handleLocalNavigation = (path: string) => {\n const sanitizedPath = sanitizeEmbeddedAppPath(path);\n if (!sanitizedPath) {\n return;\n }\n\n const nextPath = preserveEmbeddedAppLaunchParams(\n sanitizedPath,\n selfWindow.location.href,\n );\n\n navigate(nextPath ?? sanitizedPath);\n };\n\n const handleDocumentClick = (event: MouseEvent) => {\n if (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof Element)) {\n return;\n }\n\n const anchor = target.closest(\"a[href]\");\n if (!(anchor instanceof HTMLAnchorElement)) {\n return;\n }\n\n if (anchor.hasAttribute(\"download\")) {\n return;\n }\n\n const targetWindow = anchor.target.toLowerCase();\n const href = anchor.getAttribute(\"href\");\n if (!href) {\n return;\n }\n\n if (targetWindow === \"_top\" || targetWindow === \"_parent\") {\n event.preventDefault();\n bridge.redirectToRemote(anchor.href);\n return;\n }\n\n if (targetWindow && targetWindow !== \"_self\") {\n return;\n }\n\n const nextPath = resolveLocalNavigationPath(href, selfWindow.location.origin);\n if (!nextPath) {\n return;\n }\n\n event.preventDefault();\n handleLocalNavigation(nextPath);\n };\n\n const originalOpen = selfWindow.open.bind(selfWindow);\n selfWindow.open = (url?: string | URL, target?: string, features?: string) => {\n if (url == null) {\n return originalOpen(url, target, features);\n }\n\n const href = typeof url === \"string\" ? url : url.toString();\n const targetName = (target ?? \"\").toLowerCase();\n\n if (targetName === \"_top\" || targetName === \"_parent\") {\n bridge.redirectToRemote(new URL(href, selfWindow.location.href).toString());\n return null;\n }\n\n if (!targetName || targetName === \"_self\") {\n const nextPath = resolveLocalNavigationPath(\n href,\n selfWindow.location.origin,\n );\n if (nextPath) {\n handleLocalNavigation(nextPath);\n return selfWindow;\n }\n }\n\n return originalOpen(url, target, features);\n };\n\n document.addEventListener(\"click\", handleDocumentClick, true);\n\n return () => {\n document.removeEventListener(\"click\", handleDocumentClick, true);\n selfWindow.open = originalOpen;\n };\n}\n\nfunction installFetchInterceptor({\n bridge,\n getClientId,\n getProject,\n setProject,\n readCachedToken,\n writeCachedToken,\n readPendingToken,\n writePendingToken,\n}: {\n bridge: AppBridge;\n getClientId: () => string;\n getProject: () => string | null;\n setProject: (project: string | null) => void;\n readCachedToken: () => { token: string; expiresAt?: number } | null;\n writeCachedToken: (\n token: { token: string; expiresAt?: number } | null,\n ) => void;\n readPendingToken: () => Promise<string> | null;\n writePendingToken: (token: Promise<string> | null) => void;\n}) {\n if (typeof window === \"undefined\") {\n return () => {};\n }\n\n const originalFetch = globalThis.fetch.bind(globalThis);\n\n const interceptedFetch = async (input: RequestInfo | URL, init?: RequestInit) => {\n if (!shouldAttachSessionToken(input)) {\n return originalFetch(input, init);\n }\n\n const existingAuthorization = getExistingAuthorization(input, init);\n if (existingAuthorization) {\n return originalFetch(input, init);\n }\n\n const nextHeaders = new Headers(\n input instanceof Request ? input.headers : init?.headers,\n );\n\n try {\n const sessionToken = await getSessionToken({\n bridge,\n clientId: getClientId(),\n project: getProject,\n setProject,\n readCachedToken,\n writeCachedToken,\n readPendingToken,\n writePendingToken,\n });\n\n nextHeaders.set(\"Authorization\", `Bearer ${sessionToken}`);\n } catch {\n if (!getProject()) {\n throw new Error(\"Missing Thor embedded session token\");\n }\n }\n\n if (!nextHeaders.has(\"X-Requested-With\")) {\n nextHeaders.set(\"X-Requested-With\", \"XMLHttpRequest\");\n }\n\n if (input instanceof Request) {\n return originalFetch(\n new Request(input, {\n headers: nextHeaders,\n }),\n );\n }\n\n return originalFetch(input, {\n ...init,\n headers: nextHeaders,\n });\n };\n\n globalThis.fetch = interceptedFetch;\n window.fetch = interceptedFetch;\n\n return () => {\n globalThis.fetch = originalFetch;\n window.fetch = originalFetch;\n };\n}\n\nasync function getSessionToken({\n bridge,\n clientId,\n project,\n setProject,\n readCachedToken,\n writeCachedToken,\n readPendingToken,\n writePendingToken,\n}: {\n bridge: AppBridge;\n clientId: string;\n project: () => string | null;\n setProject: (project: string | null) => void;\n readCachedToken: () => { token: string; expiresAt?: number } | null;\n writeCachedToken: (\n token: { token: string; expiresAt?: number } | null,\n ) => void;\n readPendingToken: () => Promise<string> | null;\n writePendingToken: (token: Promise<string> | null) => void;\n}) {\n const cachedToken = readCachedToken();\n if (cachedToken && !isExpired(cachedToken.expiresAt)) {\n return cachedToken.token;\n }\n\n const pendingToken = readPendingToken();\n if (pendingToken) {\n return pendingToken;\n }\n\n const nextPendingToken = bridge\n .getSessionToken({ clientId })\n .then((response) => {\n const token = response.sessionToken ?? response.idToken;\n if (!token) {\n throw new Error(\"Missing Thor embedded session token\");\n }\n\n if (response.project) {\n setProject(response.project);\n }\n\n writeCachedToken({\n token,\n expiresAt: normalizeTokenExpiry(token, response.exp),\n });\n writePendingToken(null);\n\n return token;\n })\n .catch((error) => {\n writePendingToken(null);\n throw error;\n });\n\n writePendingToken(nextPendingToken);\n return nextPendingToken;\n}\n\nfunction shouldAttachSessionToken(input: RequestInfo | URL) {\n if (typeof window === \"undefined\") {\n return false;\n }\n\n const requestUrl = resolveRequestUrl(input);\n return requestUrl.origin === window.location.origin;\n}\n\nfunction resolveRequestUrl(input: RequestInfo | URL) {\n if (input instanceof Request) {\n return new URL(input.url);\n }\n\n if (input instanceof URL) {\n return input;\n }\n\n return new URL(input, window.location.href);\n}\n\nfunction getExistingAuthorization(input: RequestInfo | URL, init?: RequestInit) {\n if (input instanceof Request && input.headers.has(\"Authorization\")) {\n return input.headers.get(\"Authorization\");\n }\n\n if (!init?.headers) {\n return null;\n }\n\n return new Headers(init.headers).get(\"Authorization\");\n}\n\nfunction normalizeTokenExpiry(token: string, explicitExp?: number) {\n const tokenExp = explicitExp ?? decodeJwtExpiry(token);\n return tokenExp ? tokenExp * 1000 : undefined;\n}\n\nfunction decodeJwtExpiry(token: string) {\n const [, payload] = token.split(\".\");\n if (!payload || typeof window === \"undefined\") {\n return undefined;\n }\n\n try {\n const normalized = payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized.padEnd(\n normalized.length + ((4 - (normalized.length % 4)) % 4),\n \"=\",\n );\n const json = JSON.parse(window.atob(padded)) as { exp?: unknown };\n\n return typeof json.exp === \"number\" ? json.exp : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isExpired(expiresAt?: number) {\n if (!expiresAt) {\n return false;\n }\n\n return Date.now() >= expiresAt - 5_000;\n}\n\nfunction readInitialProject(explicitWindow?: Window) {\n const resolvedWindow =\n explicitWindow ?? (typeof window !== \"undefined\" ? window : undefined);\n if (!resolvedWindow) {\n return null;\n }\n\n try {\n const url = new URL(resolvedWindow.location.href);\n return url.searchParams.get(\"project\");\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  getOrCreateEmbeddedAppRuntime
3
- } from "./chunk-IRTDLWEQ.js";
3
+ } from "./chunk-GEBMO3KT.js";
4
4
 
5
5
  // src/react.tsx
6
6
  import {
@@ -79,4 +79,4 @@ export {
79
79
  AppBridgeProvider,
80
80
  useAppBridge
81
81
  };
82
- //# sourceMappingURL=chunk-GX5V7AK7.js.map
82
+ //# sourceMappingURL=chunk-ORDG3T77.js.map
package/dist/index.cjs CHANGED
@@ -554,6 +554,10 @@ var EmbeddedAppRuntime = class {
554
554
  this.navigationEventType = "navigation:go";
555
555
  this.navigationUpdateEventType = "navigation:update";
556
556
  this.readyEventType = "app:ready";
557
+ this.hasSentReady = false;
558
+ this.lastSentNavigationItemsKey = null;
559
+ this.lastReportedPath = null;
560
+ this.pendingHostNavigationPath = null;
557
561
  this.sessionTokenCache = null;
558
562
  this.pendingSessionToken = null;
559
563
  const resolvedWindow = config.selfWindow ?? (typeof window !== "undefined" ? window : void 0);
@@ -563,6 +567,7 @@ var EmbeddedAppRuntime = class {
563
567
  this.selfWindow = resolvedWindow;
564
568
  this.targetOrigin = config.targetOrigin ?? getReferrerOrigin(resolvedWindow);
565
569
  this.clientId = config.clientId;
570
+ this.currentPath = readCurrentPath(resolvedWindow);
566
571
  this.project = readInitialProject(resolvedWindow);
567
572
  this.readyPayload = config.readyPayload ?? { clientId: config.clientId };
568
573
  this.bridge = createAppBridge({
@@ -580,6 +585,7 @@ var EmbeddedAppRuntime = class {
580
585
  if (!destination) {
581
586
  return;
582
587
  }
588
+ this.pendingHostNavigationPath = sanitizeEmbeddedAppPath(destination) ?? destination;
583
589
  const nextPath = preserveEmbeddedAppLaunchParams(
584
590
  destination,
585
591
  this.selfWindow.location.href
@@ -591,6 +597,13 @@ var EmbeddedAppRuntime = class {
591
597
  selfWindow: this.selfWindow,
592
598
  navigate: (path) => this.navigate(path)
593
599
  });
600
+ this.removeHistoryObserver = installHistoryObserver({
601
+ selfWindow: this.selfWindow,
602
+ onChange: (path) => {
603
+ this.currentPath = path;
604
+ this.syncBridgeState();
605
+ }
606
+ });
594
607
  this.restoreFetch = installFetchInterceptor({
595
608
  bridge: this.bridge,
596
609
  getClientId: () => this.clientId,
@@ -642,6 +655,7 @@ var EmbeddedAppRuntime = class {
642
655
  destroy() {
643
656
  this.removeNavigationRequestHandler?.();
644
657
  this.removeNavigationInterceptors();
658
+ this.removeHistoryObserver();
645
659
  this.restoreFetch();
646
660
  this.bridge.destroy();
647
661
  }
@@ -649,15 +663,31 @@ var EmbeddedAppRuntime = class {
649
663
  if (!this.bridge.hasTargetWindow()) {
650
664
  return;
651
665
  }
652
- this.bridge.send(this.readyEventType, this.readyPayload);
653
- this.bridge.send("navigation:items:update", {
654
- items: this.navigationItems
655
- });
666
+ if (!this.hasSentReady) {
667
+ this.bridge.send(this.readyEventType, this.readyPayload);
668
+ this.hasSentReady = true;
669
+ }
670
+ const navigationItemsKey = JSON.stringify(this.navigationItems);
671
+ if (navigationItemsKey !== this.lastSentNavigationItemsKey) {
672
+ this.bridge.send("navigation:items:update", {
673
+ items: this.navigationItems
674
+ });
675
+ this.lastSentNavigationItemsKey = navigationItemsKey;
676
+ }
656
677
  if (this.currentPath) {
678
+ if (this.currentPath === this.pendingHostNavigationPath) {
679
+ this.pendingHostNavigationPath = null;
680
+ this.lastReportedPath = this.currentPath;
681
+ return;
682
+ }
683
+ if (this.currentPath === this.lastReportedPath) {
684
+ return;
685
+ }
657
686
  this.bridge.send(
658
687
  this.navigationUpdateEventType,
659
688
  buildNavigationUpdatePayload(this.currentPath)
660
689
  );
690
+ this.lastReportedPath = this.currentPath;
661
691
  }
662
692
  }
663
693
  navigate(path, message) {
@@ -693,6 +723,39 @@ function dispatchNavigateEvent(document, path) {
693
723
  document.dispatchEvent(event);
694
724
  return event.defaultPrevented;
695
725
  }
726
+ function readCurrentPath(selfWindow) {
727
+ return sanitizeEmbeddedAppPath(
728
+ `${selfWindow.location.pathname}${selfWindow.location.search}${selfWindow.location.hash}`
729
+ ) ?? null;
730
+ }
731
+ function installHistoryObserver({
732
+ selfWindow,
733
+ onChange
734
+ }) {
735
+ const history = selfWindow.history;
736
+ const originalPushState = history.pushState;
737
+ const originalReplaceState = history.replaceState;
738
+ const notify = () => {
739
+ onChange(readCurrentPath(selfWindow));
740
+ };
741
+ history.pushState = function(...args) {
742
+ originalPushState.apply(history, args);
743
+ notify();
744
+ };
745
+ history.replaceState = function(...args) {
746
+ originalReplaceState.apply(history, args);
747
+ notify();
748
+ };
749
+ selfWindow.addEventListener("popstate", notify);
750
+ selfWindow.addEventListener("hashchange", notify);
751
+ notify();
752
+ return () => {
753
+ history.pushState = originalPushState;
754
+ history.replaceState = originalReplaceState;
755
+ selfWindow.removeEventListener("popstate", notify);
756
+ selfWindow.removeEventListener("hashchange", notify);
757
+ };
758
+ }
696
759
  function getReferrerOrigin(explicitWindow) {
697
760
  const resolvedWindow = explicitWindow ?? (typeof window !== "undefined" ? window : void 0);
698
761
  const referrer = resolvedWindow?.document?.referrer;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/navigation.ts","../src/core.ts","../src/react.tsx","../src/runtime.ts"],"sourcesContent":["export * from \"./core\";\nexport * from \"./navigation\";\nexport * from \"./react\";\nexport * from \"./runtime\";\n","export interface BridgeNavigationGoPayload {\n path?: string;\n href?: string;\n pathname?: string;\n search?: string;\n hash?: string;\n}\n\nexport interface BridgeNavigationRedirectPayload extends BridgeNavigationGoPayload {}\n\nexport interface BridgeNavigationUpdatePayload {\n path: string;\n pathname: string;\n search: string;\n hash: string;\n}\n\nexport interface BridgeNavigationItem {\n path: string;\n label: string;\n matchPattern?: string;\n exactMatch?: boolean;\n}\n\nexport interface BridgeNavigationItemsPayload {\n items: BridgeNavigationItem[];\n}\n\nexport const EMBEDDED_LAUNCH_PARAMS = [\n \"appLoadId\",\n \"embedded\",\n \"hmac\",\n \"host\",\n \"id_token\",\n \"link_source\",\n \"locale\",\n \"project\",\n \"protocol\",\n \"session\",\n \"shop\",\n \"tenant\",\n \"timestamp\"\n] as const;\n\nconst NAVIGATION_BASE_URL = \"https://embedded-app.local\";\n\nfunction normalizeSearch(search: string) {\n if (!search) {\n return \"\";\n }\n\n return search.startsWith(\"?\") ? search : `?${search}`;\n}\n\nfunction normalizeHash(hash: string) {\n if (!hash) {\n return \"\";\n }\n\n return hash.startsWith(\"#\") ? hash : `#${hash}`;\n}\n\nexport function buildNavigationUpdatePayload(path: string): BridgeNavigationUpdatePayload {\n const sanitizedPath = sanitizeEmbeddedAppPath(path) ?? path;\n let pathname = sanitizedPath;\n let search = \"\";\n let hash = \"\";\n\n const hashIndex = pathname.indexOf(\"#\");\n if (hashIndex >= 0) {\n hash = pathname.slice(hashIndex);\n pathname = pathname.slice(0, hashIndex);\n }\n\n const searchIndex = pathname.indexOf(\"?\");\n if (searchIndex >= 0) {\n search = pathname.slice(searchIndex);\n pathname = pathname.slice(0, searchIndex);\n }\n\n return {\n path: `${pathname || \"/\"}${search}${hash}`,\n pathname: pathname || \"/\",\n search,\n hash\n };\n}\n\nexport function sanitizeEmbeddedAppPath(path: string | undefined) {\n if (!path) {\n return path;\n }\n\n const trimmedPath = path.trim();\n if (!trimmedPath) {\n return trimmedPath;\n }\n\n const url = new URL(trimmedPath, NAVIGATION_BASE_URL);\n let changed = false;\n\n for (const key of EMBEDDED_LAUNCH_PARAMS) {\n if (url.searchParams.has(key)) {\n url.searchParams.delete(key);\n changed = true;\n }\n }\n\n if (!changed) {\n return trimmedPath;\n }\n\n if (/^https?:\\/\\//i.test(trimmedPath)) {\n return url.toString();\n }\n\n return `${url.pathname}${url.search}${url.hash}`;\n}\n\nexport function preserveEmbeddedAppLaunchParams(\n path: string | undefined,\n currentHref: string | undefined\n) {\n if (!path || !currentHref) {\n return path;\n }\n\n try {\n const currentUrl = new URL(currentHref, NAVIGATION_BASE_URL);\n const nextUrl = new URL(path, currentUrl.href);\n\n if (nextUrl.origin !== currentUrl.origin) {\n return path;\n }\n\n let changed = false;\n for (const key of EMBEDDED_LAUNCH_PARAMS) {\n if (!nextUrl.searchParams.has(key) && currentUrl.searchParams.has(key)) {\n const value = currentUrl.searchParams.get(key);\n if (value != null) {\n nextUrl.searchParams.set(key, value);\n changed = true;\n }\n }\n }\n\n if (!changed) {\n return path;\n }\n\n if (/^https?:\\/\\//i.test(path)) {\n return nextUrl.toString();\n }\n\n return `${nextUrl.pathname}${nextUrl.search}${nextUrl.hash}`;\n } catch {\n return path;\n }\n}\n\nexport function resolveLocalNavigationPath(\n href: string,\n currentOrigin: string\n): string | null {\n if (!href || href.startsWith(\"#\")) {\n return null;\n }\n\n let destination: URL;\n try {\n destination = new URL(href, currentOrigin);\n } catch {\n return null;\n }\n\n if (destination.origin !== currentOrigin) {\n return null;\n }\n\n return sanitizeEmbeddedAppPath(\n `${destination.pathname}${destination.search}${destination.hash}`\n ) ?? null;\n}\n\nexport function resolveNavigationDestination(payload: unknown): string | null {\n if (typeof payload === \"string\") {\n return sanitizeEmbeddedAppPath(payload) ?? null;\n }\n\n if (!payload || typeof payload !== \"object\") {\n return null;\n }\n\n const value = payload as BridgeNavigationGoPayload;\n\n if (typeof value.path === \"string\" && value.path) {\n return sanitizeEmbeddedAppPath(value.path) ?? null;\n }\n\n if (typeof value.href === \"string\" && value.href) {\n return sanitizeEmbeddedAppPath(value.href) ?? null;\n }\n\n if (typeof value.pathname !== \"string\" || !value.pathname) {\n return null;\n }\n\n return (\n sanitizeEmbeddedAppPath(\n `${value.pathname}${normalizeSearch(value.search ?? \"\")}${normalizeHash(value.hash ?? \"\")}`\n ) ?? null\n );\n}\n\n\nfunction normalizeNavigationItemPath(path: string | undefined) {\n if (!path) {\n return null;\n }\n\n const trimmedPath = path.trim();\n if (!trimmedPath || /^https?:\\/\\//i.test(trimmedPath)) {\n return null;\n }\n\n const normalizedPath = trimmedPath.startsWith(\"/\") ? trimmedPath : \"/\" + trimmedPath;\n return sanitizeEmbeddedAppPath(normalizedPath) ?? normalizedPath;\n}\n\nexport function normalizeBridgeNavigationItem(\n item: BridgeNavigationItem\n): BridgeNavigationItem | null {\n const label = item.label?.trim();\n const path = normalizeNavigationItemPath(item.path);\n\n if (!label || !path) {\n return null;\n }\n\n const matchPattern = normalizeNavigationItemPath(item.matchPattern ?? item.path);\n\n return {\n label,\n path,\n ...(matchPattern ? {matchPattern} : {}),\n ...(item.exactMatch !== undefined ? {exactMatch: item.exactMatch} : {}),\n };\n}\n\nexport function normalizeBridgeNavigationItems(\n items: BridgeNavigationItem[] | undefined\n) {\n if (!items?.length) {\n return [];\n }\n\n return items.flatMap((item) => {\n const normalizedItem = normalizeBridgeNavigationItem(item);\n return normalizedItem ? [normalizedItem] : [];\n });\n}\n","import {\n preserveEmbeddedAppLaunchParams,\n resolveNavigationDestination,\n type BridgeNavigationGoPayload,\n type BridgeNavigationRedirectPayload\n} from \"./navigation\";\n\nexport type BridgeParticipant = \"embedded-app\" | \"dashboard\" | \"unknown\";\n\nexport type BridgeMessageKind = \"event\" | \"request\" | \"response\";\n\nexport interface BridgeErrorPayload {\n code: string;\n message: string;\n}\n\nexport interface BridgeMessage<TPayload = unknown> {\n namespace: string;\n version: \"1.0\";\n kind: BridgeMessageKind;\n id: string;\n type: string;\n source: BridgeParticipant;\n target?: BridgeParticipant;\n payload?: TPayload;\n replyTo?: string;\n error?: BridgeErrorPayload;\n}\n\nexport interface AppBridgeOptions {\n clientId?: string;\n source?: BridgeParticipant;\n target?: BridgeParticipant;\n namespace?: string;\n targetOrigin?: string;\n allowedOrigins?: string[];\n requestTimeoutMs?: number;\n selfWindow?: Window;\n targetWindow?: Window | null;\n}\n\nexport interface RequestOptions {\n timeoutMs?: number;\n}\n\nexport interface SessionTokenRequest {\n clientId?: string;\n}\n\nexport interface SessionTokenResponse {\n sessionToken?: string;\n idToken: string;\n exp?: number;\n project?: string;\n}\n\nexport interface ReceivedBridgeMessage<TPayload = unknown> extends BridgeMessage<TPayload> {\n origin: string;\n rawEvent: MessageEvent<unknown>;\n}\n\nexport type BridgeEventHandler<TPayload = unknown> = (\n message: ReceivedBridgeMessage<TPayload>\n) => void;\n\nexport type BridgeRequestHandler<TRequest = unknown, TResponse = unknown> = (\n payload: TRequest,\n message: ReceivedBridgeMessage<TRequest>\n) => TResponse | Promise<TResponse>;\n\nexport type Unsubscribe = () => void;\n\nconst DEFAULT_NAMESPACE = \"thorcommerce:app-bridge\";\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_REDIRECT_EVENT_TYPE = \"navigation:redirect\";\n\nfunction createMessageId() {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n\n return `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction resolveSelfWindow(explicitWindow?: Window) {\n if (explicitWindow) {\n return explicitWindow;\n }\n\n if (typeof window !== \"undefined\") {\n return window;\n }\n\n return undefined;\n}\n\nfunction resolveTargetWindow(selfWindow: Window | undefined, targetWindow?: Window | null) {\n if (targetWindow) {\n return targetWindow;\n }\n\n if (!selfWindow) {\n return undefined;\n }\n\n if (selfWindow.parent && selfWindow.parent !== selfWindow) {\n return selfWindow.parent;\n }\n\n return undefined;\n}\n\nfunction isDevelopmentEnvironment() {\n const nodeEnv =\n typeof globalThis !== \"undefined\" && \"process\" in globalThis\n ? (\n globalThis as typeof globalThis & {\n process?: { env?: { NODE_ENV?: string } };\n }\n ).process?.env?.NODE_ENV\n : undefined;\n\n if (nodeEnv) {\n return nodeEnv !== \"production\";\n }\n\n return true;\n}\n\nfunction hasAllowedOrigin(origin: string, allowedOrigins?: string[]) {\n if (!allowedOrigins || allowedOrigins.length === 0) {\n return true;\n }\n\n return allowedOrigins.includes(origin);\n}\n\nfunction isMessageTarget(value: unknown): value is Window {\n return !!value && typeof (value as Window).postMessage === \"function\";\n}\n\nfunction omitUndefinedFields<T extends object>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, fieldValue]) => fieldValue !== undefined)\n ) as T;\n}\n\nexport function isBridgeMessage<TPayload = unknown>(\n value: unknown,\n namespace = DEFAULT_NAMESPACE\n): value is BridgeMessage<TPayload> {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const message = value as Partial<BridgeMessage<TPayload>>;\n\n return (\n message.namespace === namespace &&\n message.version === \"1.0\" &&\n typeof message.kind === \"string\" &&\n typeof message.id === \"string\" &&\n typeof message.type === \"string\" &&\n typeof message.source === \"string\"\n );\n}\n\nexport class AppBridge {\n private readonly namespace: string;\n private readonly clientId?: string;\n private readonly source: BridgeParticipant;\n private readonly target: BridgeParticipant | undefined;\n private readonly targetOrigin: string;\n private readonly allowedOrigins?: string[];\n private readonly selfWindow?: Window;\n private readonly defaultTimeoutMs: number;\n private targetWindow?: Window;\n private readonly eventHandlers = new Map<string, Set<BridgeEventHandler>>();\n private readonly requestHandlers = new Map<string, BridgeRequestHandler>();\n private readonly pendingRequests = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n }\n >();\n private readonly messageListener: (event: MessageEvent<unknown>) => void;\n\n constructor(options: AppBridgeOptions = {}) {\n this.namespace = options.namespace ?? DEFAULT_NAMESPACE;\n this.clientId = options.clientId;\n this.source = options.source ?? \"embedded-app\";\n this.target = options.target;\n this.targetOrigin = options.targetOrigin ?? \"*\";\n this.allowedOrigins = options.allowedOrigins;\n this.defaultTimeoutMs = options.requestTimeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.selfWindow = resolveSelfWindow(options.selfWindow);\n this.targetWindow = resolveTargetWindow(this.selfWindow, options.targetWindow);\n this.messageListener = (event) => {\n this.handleMessage(event);\n };\n\n if (!this.selfWindow) {\n throw new Error(\n \"AppBridge requires a browser window. Pass selfWindow explicitly when constructing it outside global window scope.\"\n );\n }\n\n if (this.targetOrigin === \"*\" && isDevelopmentEnvironment()) {\n console.warn(\n 'AppBridge is using \"*\" as targetOrigin. Set targetOrigin explicitly for both the dashboard and embedded app in production.'\n );\n }\n\n this.selfWindow.addEventListener(\"message\", this.messageListener);\n }\n\n setTargetWindow(targetWindow: Window | null) {\n this.targetWindow = targetWindow ?? undefined;\n }\n\n hasTargetWindow() {\n return this.targetWindow !== undefined;\n }\n\n redirect(payload: string | BridgeNavigationRedirectPayload) {\n const destination = resolveNavigationDestination(payload);\n if (!destination) {\n throw new Error(\"AppBridge redirect requires a valid destination.\");\n }\n\n if (!this.targetWindow) {\n this.navigateSelf(destination);\n return;\n }\n\n this.postMessage<BridgeNavigationRedirectPayload>({\n kind: \"event\",\n type: DEFAULT_REDIRECT_EVENT_TYPE,\n payload: typeof payload === \"string\" ? { href: payload } : payload\n });\n }\n\n redirectToRemote(href: string) {\n this.redirect({ href });\n }\n\n redirectToApp(path: string | BridgeNavigationGoPayload) {\n this.redirect(typeof path === \"string\" ? { path } : path);\n }\n\n send<TPayload = unknown>(type: string, payload?: TPayload) {\n this.postMessage({\n kind: \"event\",\n type,\n payload\n });\n }\n\n request<TRequest = unknown, TResponse = unknown>(\n type: string,\n payload?: TRequest,\n options: RequestOptions = {}\n ) {\n const messageId = createMessageId();\n const timeoutMs = options.timeoutMs ?? this.defaultTimeoutMs;\n\n return new Promise<TResponse>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n this.pendingRequests.delete(messageId);\n reject(new Error(`Bridge request timed out for \"${type}\" after ${timeoutMs}ms.`));\n }, timeoutMs);\n\n this.pendingRequests.set(messageId, {\n resolve: (value) => resolve(value as TResponse),\n reject,\n timeoutId\n });\n\n try {\n this.postMessage({\n id: messageId,\n kind: \"request\",\n type,\n payload\n });\n } catch (error) {\n clearTimeout(timeoutId);\n this.pendingRequests.delete(messageId);\n reject(error instanceof Error ? error : new Error(\"Failed to send bridge request.\"));\n }\n });\n }\n\n getSessionToken(\n request: SessionTokenRequest = {},\n options: RequestOptions = {}\n ) {\n const resolvedRequest =\n request.clientId || this.clientId\n ? {\n ...request,\n clientId: request.clientId ?? this.clientId\n }\n : request;\n\n return this.request<SessionTokenRequest, SessionTokenResponse>(\n \"thor:session-token:get\",\n resolvedRequest,\n options\n );\n }\n\n on<TPayload = unknown>(type: string, handler: BridgeEventHandler<TPayload>): Unsubscribe {\n const handlers = this.eventHandlers.get(type) ?? new Set<BridgeEventHandler>();\n handlers.add(handler as BridgeEventHandler);\n this.eventHandlers.set(type, handlers);\n\n return () => {\n handlers.delete(handler as BridgeEventHandler);\n if (handlers.size === 0) {\n this.eventHandlers.delete(type);\n }\n };\n }\n\n onRequest<TRequest = unknown, TResponse = unknown>(\n type: string,\n handler: BridgeRequestHandler<TRequest, TResponse>\n ): Unsubscribe {\n this.requestHandlers.set(type, handler as BridgeRequestHandler);\n\n return () => {\n const registeredHandler = this.requestHandlers.get(type);\n if (registeredHandler === handler) {\n this.requestHandlers.delete(type);\n }\n };\n }\n\n destroy() {\n if (this.selfWindow) {\n this.selfWindow.removeEventListener(\"message\", this.messageListener);\n }\n\n for (const pendingRequest of this.pendingRequests.values()) {\n clearTimeout(pendingRequest.timeoutId);\n pendingRequest.reject(new Error(\"AppBridge destroyed before a response was received.\"));\n }\n\n this.pendingRequests.clear();\n this.eventHandlers.clear();\n this.requestHandlers.clear();\n }\n\n private handleMessage(event: MessageEvent<unknown>) {\n if (!hasAllowedOrigin(event.origin, this.allowedOrigins)) {\n return;\n }\n\n if (!isBridgeMessage(event.data, this.namespace)) {\n return;\n }\n\n const message = event.data;\n\n if (this.target && message.target && message.target !== this.source) {\n return;\n }\n\n const receivedMessage: ReceivedBridgeMessage = {\n ...message,\n origin: event.origin,\n rawEvent: event\n };\n\n if (\n message.kind === \"event\" &&\n message.type === DEFAULT_REDIRECT_EVENT_TYPE &&\n this.handleRedirectMessage(receivedMessage)\n ) {\n return;\n }\n\n if (message.kind === \"response\" && message.replyTo) {\n this.resolvePendingRequest(message.replyTo, message);\n return;\n }\n\n this.emitHandlers(message.type, receivedMessage);\n\n if (message.kind === \"request\") {\n void this.handleRequest(receivedMessage);\n }\n }\n\n private emitHandlers(type: string, message: ReceivedBridgeMessage) {\n const typeHandlers = this.eventHandlers.get(type);\n if (typeHandlers) {\n for (const handler of typeHandlers) {\n handler(message);\n }\n }\n\n if (type === \"*\") {\n return;\n }\n\n const wildcardHandlers = this.eventHandlers.get(\"*\");\n if (wildcardHandlers) {\n for (const handler of wildcardHandlers) {\n handler(message);\n }\n }\n }\n\n private async handleRequest(message: ReceivedBridgeMessage) {\n const handler = this.requestHandlers.get(message.type);\n if (!handler) {\n return;\n }\n\n const replyTarget = isMessageTarget(message.rawEvent.source)\n ? message.rawEvent.source\n : this.targetWindow;\n\n try {\n const payload = await handler(message.payload, message);\n this.postMessage(\n {\n kind: \"response\",\n type: message.type,\n payload,\n replyTo: message.id\n },\n replyTarget\n );\n } catch (error) {\n const bridgeError =\n error instanceof Error\n ? { code: \"request_handler_error\", message: error.message }\n : { code: \"request_handler_error\", message: \"Unknown request handler error.\" };\n\n this.postMessage(\n {\n kind: \"response\",\n type: message.type,\n error: bridgeError,\n replyTo: message.id\n },\n replyTarget\n );\n }\n }\n\n private resolvePendingRequest(messageId: string, message: BridgeMessage) {\n const pendingRequest = this.pendingRequests.get(messageId);\n if (!pendingRequest) {\n return;\n }\n\n clearTimeout(pendingRequest.timeoutId);\n this.pendingRequests.delete(messageId);\n\n if (message.error) {\n pendingRequest.reject(new Error(`${message.error.code}: ${message.error.message}`));\n return;\n }\n\n pendingRequest.resolve(message.payload);\n }\n\n private postMessage<TPayload = unknown>(\n partialMessage: Pick<BridgeMessage<TPayload>, \"kind\" | \"type\"> &\n Partial<Omit<BridgeMessage<TPayload>, \"namespace\" | \"version\" | \"source\">>,\n targetWindowOverride?: Window\n ) {\n const targetWindow = targetWindowOverride ?? this.targetWindow;\n if (!targetWindow) {\n throw new Error(\n \"AppBridge could not resolve a target window. Pass targetWindow explicitly or call setTargetWindow().\"\n );\n }\n\n const message = omitUndefinedFields({\n namespace: this.namespace,\n version: \"1.0\",\n id: partialMessage.id ?? createMessageId(),\n kind: partialMessage.kind,\n type: partialMessage.type,\n source: this.source,\n target: partialMessage.target ?? this.target,\n payload: partialMessage.payload,\n replyTo: partialMessage.replyTo,\n error: partialMessage.error\n }) as BridgeMessage<TPayload>;\n\n targetWindow.postMessage(message, this.targetOrigin);\n }\n\n private handleRedirectMessage(message: ReceivedBridgeMessage): boolean {\n const destination = resolveNavigationDestination(message.payload);\n if (!destination) {\n return false;\n }\n\n this.navigateSelf(destination);\n return true;\n }\n\n private navigateSelf(destination: string) {\n if (!this.selfWindow) {\n throw new Error(\"AppBridge could not resolve a browser window for redirect.\");\n }\n\n this.selfWindow.location.assign(\n preserveEmbeddedAppLaunchParams(destination, this.selfWindow.location.href) ?? destination\n );\n }\n}\n\nexport function createAppBridge(options: AppBridgeOptions = {}) {\n return new AppBridge(options);\n}\n","import {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode\n} from \"react\";\n\nimport {\n type AppBridge,\n type ReceivedBridgeMessage\n} from \"./core\";\nimport {\n type BridgeNavigationGoPayload,\n type BridgeNavigationItem\n} from \"./navigation\";\nimport {\n getOrCreateEmbeddedAppRuntime,\n type EmbeddedAppRuntimeConfig,\n} from \"./runtime\";\n\nconst AppBridgeContext = createContext<AppBridge | null>(null);\n\nexport interface AppBridgeProviderProps\n extends Omit<EmbeddedAppRuntimeConfig, \"source\" | \"target\" | \"allowedOrigins\"> {\n children: ReactNode;\n}\n\nexport function AppBridgeProvider({\n children,\n clientId,\n currentPath,\n navigationItems,\n navigationEventType = \"navigation:go\",\n navigationUpdateEventType = \"navigation:update\",\n namespace,\n onNavigate,\n readyEventType = \"app:ready\",\n readyPayload,\n requestTimeoutMs,\n selfWindow,\n targetOrigin,\n targetWindow\n}: AppBridgeProviderProps) {\n const [bridge, setBridge] = useState<AppBridge | null>(null);\n\n useEffect(() => {\n if (typeof window === \"undefined\" && !selfWindow) {\n return;\n }\n\n const runtime = getOrCreateEmbeddedAppRuntime({\n clientId,\n currentPath,\n navigationEventType,\n navigationItems,\n navigationUpdateEventType,\n namespace,\n onNavigate,\n readyEventType,\n readyPayload,\n requestTimeoutMs,\n selfWindow,\n targetOrigin,\n targetWindow\n });\n\n setBridge(runtime.bridge);\n\n return () => {\n runtime.clearNavigationHandler();\n setBridge((currentBridge) =>\n currentBridge === runtime.bridge ? null : currentBridge,\n );\n };\n }, [\n clientId,\n currentPath,\n navigationEventType,\n navigationItems,\n navigationUpdateEventType,\n namespace,\n onNavigate,\n readyEventType,\n readyPayload,\n requestTimeoutMs,\n selfWindow,\n targetOrigin,\n targetWindow\n ]);\n\n return <AppBridgeContext.Provider value={bridge}>{children}</AppBridgeContext.Provider>;\n}\n\nexport function useAppBridge() {\n return useContext(AppBridgeContext);\n}\n","import {\n createAppBridge,\n type AppBridge,\n type AppBridgeOptions,\n type ReceivedBridgeMessage,\n} from \"./core\";\nimport {\n buildNavigationUpdatePayload,\n normalizeBridgeNavigationItems,\n preserveEmbeddedAppLaunchParams,\n resolveLocalNavigationPath,\n resolveNavigationDestination,\n sanitizeEmbeddedAppPath,\n type BridgeNavigationGoPayload,\n type BridgeNavigationItem,\n} from \"./navigation\";\n\nconst GLOBAL_RUNTIME_KEY = \"__thorEmbeddedAppRuntime__\";\nexport const THOR_NAVIGATE_EVENT = \"thor:navigate\";\n\nexport interface EmbeddedAppRuntimeConfig\n extends Omit<AppBridgeOptions, \"source\" | \"target\" | \"allowedOrigins\"> {\n clientId: string;\n currentPath?: string | null;\n navigationItems?: BridgeNavigationItem[];\n navigationEventType?: string;\n navigationUpdateEventType?: string;\n onNavigate?: (\n path: string,\n message?: ReceivedBridgeMessage<BridgeNavigationGoPayload>,\n ) => void;\n readyEventType?: string;\n readyPayload?: unknown;\n}\n\ntype GlobalWithRuntime = typeof globalThis & {\n [GLOBAL_RUNTIME_KEY]?: EmbeddedAppRuntime;\n};\n\nexport class EmbeddedAppRuntime {\n readonly bridge: AppBridge;\n\n private clientId: string;\n private currentPath: string | null = null;\n private navigationItems: BridgeNavigationItem[] = [];\n private navigationEventType = \"navigation:go\";\n private navigationUpdateEventType = \"navigation:update\";\n private readyEventType = \"app:ready\";\n private readyPayload: unknown;\n private onNavigate?:\n | ((\n path: string,\n message?: ReceivedBridgeMessage<BridgeNavigationGoPayload>,\n ) => void)\n | undefined;\n private sessionTokenCache: {\n token: string;\n expiresAt?: number;\n } | null = null;\n private project: string | null;\n private pendingSessionToken: Promise<string> | null = null;\n private readonly selfWindow: Window;\n private readonly targetOrigin?: string;\n private readonly removeNavigationInterceptors: () => void;\n private readonly restoreFetch: () => void;\n private removeNavigationRequestHandler?: () => void;\n\n constructor(config: EmbeddedAppRuntimeConfig) {\n const resolvedWindow =\n config.selfWindow ?? (typeof window !== \"undefined\" ? window : undefined);\n if (!resolvedWindow) {\n throw new Error(\"EmbeddedAppRuntime requires a browser window.\");\n }\n\n this.selfWindow = resolvedWindow;\n this.targetOrigin = config.targetOrigin ?? getReferrerOrigin(resolvedWindow);\n this.clientId = config.clientId;\n this.project = readInitialProject(resolvedWindow);\n this.readyPayload = config.readyPayload ?? { clientId: config.clientId };\n\n this.bridge = createAppBridge({\n allowedOrigins: this.targetOrigin ? [this.targetOrigin] : undefined,\n namespace: config.namespace,\n requestTimeoutMs: config.requestTimeoutMs,\n selfWindow: resolvedWindow,\n source: \"embedded-app\",\n target: \"dashboard\",\n targetOrigin: this.targetOrigin,\n targetWindow: config.targetWindow,\n });\n\n this.removeNavigationRequestHandler = this.bridge.on<\n BridgeNavigationGoPayload\n >(this.navigationEventType, (message) => {\n const destination = resolveNavigationDestination(message.payload);\n if (!destination) {\n return;\n }\n\n const nextPath = preserveEmbeddedAppLaunchParams(\n destination,\n this.selfWindow.location.href,\n );\n this.navigate(nextPath ?? destination, message);\n });\n\n this.removeNavigationInterceptors = installNavigationInterceptors({\n bridge: this.bridge,\n selfWindow: this.selfWindow,\n navigate: (path) => this.navigate(path),\n });\n\n this.restoreFetch = installFetchInterceptor({\n bridge: this.bridge,\n getClientId: () => this.clientId,\n getProject: () => this.project,\n setProject: (project) => {\n this.project = project;\n },\n readCachedToken: () => this.sessionTokenCache,\n writeCachedToken: (token) => {\n this.sessionTokenCache = token;\n },\n readPendingToken: () => this.pendingSessionToken,\n writePendingToken: (token) => {\n this.pendingSessionToken = token;\n },\n });\n\n this.update(config);\n }\n\n update(config: Partial<EmbeddedAppRuntimeConfig>) {\n if (config.clientId) {\n this.clientId = config.clientId;\n if (\n !this.readyPayload ||\n (typeof this.readyPayload === \"object\" &&\n this.readyPayload !== null &&\n \"clientId\" in this.readyPayload)\n ) {\n this.readyPayload = config.readyPayload ?? { clientId: config.clientId };\n }\n }\n\n if (config.currentPath !== undefined) {\n this.currentPath = config.currentPath;\n }\n\n if (config.navigationItems !== undefined) {\n this.navigationItems = normalizeBridgeNavigationItems(config.navigationItems);\n }\n\n if (config.onNavigate !== undefined) {\n this.onNavigate = config.onNavigate;\n }\n\n if (config.readyEventType) {\n this.readyEventType = config.readyEventType;\n }\n\n if (config.readyPayload !== undefined) {\n this.readyPayload = config.readyPayload;\n }\n\n if (config.targetWindow !== undefined) {\n this.bridge.setTargetWindow(config.targetWindow ?? null);\n }\n\n this.syncBridgeState();\n }\n\n clearNavigationHandler() {\n this.onNavigate = undefined;\n }\n\n destroy() {\n this.removeNavigationRequestHandler?.();\n this.removeNavigationInterceptors();\n this.restoreFetch();\n this.bridge.destroy();\n }\n\n private syncBridgeState() {\n if (!this.bridge.hasTargetWindow()) {\n return;\n }\n\n this.bridge.send(this.readyEventType, this.readyPayload);\n this.bridge.send(\"navigation:items:update\", {\n items: this.navigationItems,\n });\n\n if (this.currentPath) {\n this.bridge.send(\n this.navigationUpdateEventType,\n buildNavigationUpdatePayload(this.currentPath),\n );\n }\n }\n\n private navigate(\n path: string,\n message?: ReceivedBridgeMessage<BridgeNavigationGoPayload>,\n ) {\n if (this.onNavigate) {\n this.onNavigate(path, message);\n return;\n }\n\n if (dispatchNavigateEvent(this.selfWindow.document, path)) {\n return;\n }\n\n this.selfWindow.location.assign(path);\n }\n}\n\nexport function getOrCreateEmbeddedAppRuntime(\n config: EmbeddedAppRuntimeConfig,\n) {\n const globalScope = globalThis as GlobalWithRuntime;\n const existingRuntime = globalScope[GLOBAL_RUNTIME_KEY];\n\n if (existingRuntime) {\n existingRuntime.update(config);\n return existingRuntime;\n }\n\n const runtime = new EmbeddedAppRuntime(config);\n globalScope[GLOBAL_RUNTIME_KEY] = runtime;\n return runtime;\n}\n\nexport function getEmbeddedAppRuntime() {\n return (globalThis as GlobalWithRuntime)[GLOBAL_RUNTIME_KEY] ?? null;\n}\n\nfunction dispatchNavigateEvent(document: Document, path: string) {\n const event = new CustomEvent<{path: string}>(THOR_NAVIGATE_EVENT, {\n cancelable: true,\n detail: {path},\n });\n\n document.dispatchEvent(event);\n return event.defaultPrevented;\n}\n\nfunction getReferrerOrigin(explicitWindow?: Window) {\n const resolvedWindow =\n explicitWindow ?? (typeof window !== \"undefined\" ? window : undefined);\n const referrer = resolvedWindow?.document?.referrer;\n\n if (!referrer) {\n return undefined;\n }\n\n try {\n return new URL(referrer).origin;\n } catch {\n return undefined;\n }\n}\n\nfunction installNavigationInterceptors({\n bridge,\n selfWindow,\n navigate,\n}: {\n bridge: AppBridge;\n selfWindow: Window;\n navigate: (path: string) => void;\n}) {\n const document = selfWindow.document;\n const handleLocalNavigation = (path: string) => {\n const sanitizedPath = sanitizeEmbeddedAppPath(path);\n if (!sanitizedPath) {\n return;\n }\n\n const nextPath = preserveEmbeddedAppLaunchParams(\n sanitizedPath,\n selfWindow.location.href,\n );\n\n navigate(nextPath ?? sanitizedPath);\n };\n\n const handleDocumentClick = (event: MouseEvent) => {\n if (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof Element)) {\n return;\n }\n\n const anchor = target.closest(\"a[href]\");\n if (!(anchor instanceof HTMLAnchorElement)) {\n return;\n }\n\n if (anchor.hasAttribute(\"download\")) {\n return;\n }\n\n const targetWindow = anchor.target.toLowerCase();\n const href = anchor.getAttribute(\"href\");\n if (!href) {\n return;\n }\n\n if (targetWindow === \"_top\" || targetWindow === \"_parent\") {\n event.preventDefault();\n bridge.redirectToRemote(anchor.href);\n return;\n }\n\n if (targetWindow && targetWindow !== \"_self\") {\n return;\n }\n\n const nextPath = resolveLocalNavigationPath(href, selfWindow.location.origin);\n if (!nextPath) {\n return;\n }\n\n event.preventDefault();\n handleLocalNavigation(nextPath);\n };\n\n const originalOpen = selfWindow.open.bind(selfWindow);\n selfWindow.open = (url?: string | URL, target?: string, features?: string) => {\n if (url == null) {\n return originalOpen(url, target, features);\n }\n\n const href = typeof url === \"string\" ? url : url.toString();\n const targetName = (target ?? \"\").toLowerCase();\n\n if (targetName === \"_top\" || targetName === \"_parent\") {\n bridge.redirectToRemote(new URL(href, selfWindow.location.href).toString());\n return null;\n }\n\n if (!targetName || targetName === \"_self\") {\n const nextPath = resolveLocalNavigationPath(\n href,\n selfWindow.location.origin,\n );\n if (nextPath) {\n handleLocalNavigation(nextPath);\n return selfWindow;\n }\n }\n\n return originalOpen(url, target, features);\n };\n\n document.addEventListener(\"click\", handleDocumentClick, true);\n\n return () => {\n document.removeEventListener(\"click\", handleDocumentClick, true);\n selfWindow.open = originalOpen;\n };\n}\n\nfunction installFetchInterceptor({\n bridge,\n getClientId,\n getProject,\n setProject,\n readCachedToken,\n writeCachedToken,\n readPendingToken,\n writePendingToken,\n}: {\n bridge: AppBridge;\n getClientId: () => string;\n getProject: () => string | null;\n setProject: (project: string | null) => void;\n readCachedToken: () => { token: string; expiresAt?: number } | null;\n writeCachedToken: (\n token: { token: string; expiresAt?: number } | null,\n ) => void;\n readPendingToken: () => Promise<string> | null;\n writePendingToken: (token: Promise<string> | null) => void;\n}) {\n if (typeof window === \"undefined\") {\n return () => {};\n }\n\n const originalFetch = globalThis.fetch.bind(globalThis);\n\n const interceptedFetch = async (input: RequestInfo | URL, init?: RequestInit) => {\n if (!shouldAttachSessionToken(input)) {\n return originalFetch(input, init);\n }\n\n const existingAuthorization = getExistingAuthorization(input, init);\n if (existingAuthorization) {\n return originalFetch(input, init);\n }\n\n const nextHeaders = new Headers(\n input instanceof Request ? input.headers : init?.headers,\n );\n\n try {\n const sessionToken = await getSessionToken({\n bridge,\n clientId: getClientId(),\n project: getProject,\n setProject,\n readCachedToken,\n writeCachedToken,\n readPendingToken,\n writePendingToken,\n });\n\n nextHeaders.set(\"Authorization\", `Bearer ${sessionToken}`);\n } catch {\n if (!getProject()) {\n throw new Error(\"Missing Thor embedded session token\");\n }\n }\n\n if (!nextHeaders.has(\"X-Requested-With\")) {\n nextHeaders.set(\"X-Requested-With\", \"XMLHttpRequest\");\n }\n\n if (input instanceof Request) {\n return originalFetch(\n new Request(input, {\n headers: nextHeaders,\n }),\n );\n }\n\n return originalFetch(input, {\n ...init,\n headers: nextHeaders,\n });\n };\n\n globalThis.fetch = interceptedFetch;\n window.fetch = interceptedFetch;\n\n return () => {\n globalThis.fetch = originalFetch;\n window.fetch = originalFetch;\n };\n}\n\nasync function getSessionToken({\n bridge,\n clientId,\n project,\n setProject,\n readCachedToken,\n writeCachedToken,\n readPendingToken,\n writePendingToken,\n}: {\n bridge: AppBridge;\n clientId: string;\n project: () => string | null;\n setProject: (project: string | null) => void;\n readCachedToken: () => { token: string; expiresAt?: number } | null;\n writeCachedToken: (\n token: { token: string; expiresAt?: number } | null,\n ) => void;\n readPendingToken: () => Promise<string> | null;\n writePendingToken: (token: Promise<string> | null) => void;\n}) {\n const cachedToken = readCachedToken();\n if (cachedToken && !isExpired(cachedToken.expiresAt)) {\n return cachedToken.token;\n }\n\n const pendingToken = readPendingToken();\n if (pendingToken) {\n return pendingToken;\n }\n\n const nextPendingToken = bridge\n .getSessionToken({ clientId })\n .then((response) => {\n const token = response.sessionToken ?? response.idToken;\n if (!token) {\n throw new Error(\"Missing Thor embedded session token\");\n }\n\n if (response.project) {\n setProject(response.project);\n }\n\n writeCachedToken({\n token,\n expiresAt: normalizeTokenExpiry(token, response.exp),\n });\n writePendingToken(null);\n\n return token;\n })\n .catch((error) => {\n writePendingToken(null);\n throw error;\n });\n\n writePendingToken(nextPendingToken);\n return nextPendingToken;\n}\n\nfunction shouldAttachSessionToken(input: RequestInfo | URL) {\n if (typeof window === \"undefined\") {\n return false;\n }\n\n const requestUrl = resolveRequestUrl(input);\n return requestUrl.origin === window.location.origin;\n}\n\nfunction resolveRequestUrl(input: RequestInfo | URL) {\n if (input instanceof Request) {\n return new URL(input.url);\n }\n\n if (input instanceof URL) {\n return input;\n }\n\n return new URL(input, window.location.href);\n}\n\nfunction getExistingAuthorization(input: RequestInfo | URL, init?: RequestInit) {\n if (input instanceof Request && input.headers.has(\"Authorization\")) {\n return input.headers.get(\"Authorization\");\n }\n\n if (!init?.headers) {\n return null;\n }\n\n return new Headers(init.headers).get(\"Authorization\");\n}\n\nfunction normalizeTokenExpiry(token: string, explicitExp?: number) {\n const tokenExp = explicitExp ?? decodeJwtExpiry(token);\n return tokenExp ? tokenExp * 1000 : undefined;\n}\n\nfunction decodeJwtExpiry(token: string) {\n const [, payload] = token.split(\".\");\n if (!payload || typeof window === \"undefined\") {\n return undefined;\n }\n\n try {\n const normalized = payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized.padEnd(\n normalized.length + ((4 - (normalized.length % 4)) % 4),\n \"=\",\n );\n const json = JSON.parse(window.atob(padded)) as { exp?: unknown };\n\n return typeof json.exp === \"number\" ? json.exp : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isExpired(expiresAt?: number) {\n if (!expiresAt) {\n return false;\n }\n\n return Date.now() >= expiresAt - 5_000;\n}\n\nfunction readInitialProject(explicitWindow?: Window) {\n const resolvedWindow =\n explicitWindow ?? (typeof window !== \"undefined\" ? window : undefined);\n if (!resolvedWindow) {\n return null;\n }\n\n try {\n const url = new URL(resolvedWindow.location.href);\n return url.searchParams.get(\"project\");\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/navigation.ts","../src/core.ts","../src/react.tsx","../src/runtime.ts"],"sourcesContent":["export * from \"./core\";\nexport * from \"./navigation\";\nexport * from \"./react\";\nexport * from \"./runtime\";\n","export interface BridgeNavigationGoPayload {\n path?: string;\n href?: string;\n pathname?: string;\n search?: string;\n hash?: string;\n}\n\nexport interface BridgeNavigationRedirectPayload extends BridgeNavigationGoPayload {}\n\nexport interface BridgeNavigationUpdatePayload {\n path: string;\n pathname: string;\n search: string;\n hash: string;\n}\n\nexport interface BridgeNavigationItem {\n path: string;\n label: string;\n matchPattern?: string;\n exactMatch?: boolean;\n}\n\nexport interface BridgeNavigationItemsPayload {\n items: BridgeNavigationItem[];\n}\n\nexport const EMBEDDED_LAUNCH_PARAMS = [\n \"appLoadId\",\n \"embedded\",\n \"hmac\",\n \"host\",\n \"id_token\",\n \"link_source\",\n \"locale\",\n \"project\",\n \"protocol\",\n \"session\",\n \"shop\",\n \"tenant\",\n \"timestamp\"\n] as const;\n\nconst NAVIGATION_BASE_URL = \"https://embedded-app.local\";\n\nfunction normalizeSearch(search: string) {\n if (!search) {\n return \"\";\n }\n\n return search.startsWith(\"?\") ? search : `?${search}`;\n}\n\nfunction normalizeHash(hash: string) {\n if (!hash) {\n return \"\";\n }\n\n return hash.startsWith(\"#\") ? hash : `#${hash}`;\n}\n\nexport function buildNavigationUpdatePayload(path: string): BridgeNavigationUpdatePayload {\n const sanitizedPath = sanitizeEmbeddedAppPath(path) ?? path;\n let pathname = sanitizedPath;\n let search = \"\";\n let hash = \"\";\n\n const hashIndex = pathname.indexOf(\"#\");\n if (hashIndex >= 0) {\n hash = pathname.slice(hashIndex);\n pathname = pathname.slice(0, hashIndex);\n }\n\n const searchIndex = pathname.indexOf(\"?\");\n if (searchIndex >= 0) {\n search = pathname.slice(searchIndex);\n pathname = pathname.slice(0, searchIndex);\n }\n\n return {\n path: `${pathname || \"/\"}${search}${hash}`,\n pathname: pathname || \"/\",\n search,\n hash\n };\n}\n\nexport function sanitizeEmbeddedAppPath(path: string | undefined) {\n if (!path) {\n return path;\n }\n\n const trimmedPath = path.trim();\n if (!trimmedPath) {\n return trimmedPath;\n }\n\n const url = new URL(trimmedPath, NAVIGATION_BASE_URL);\n let changed = false;\n\n for (const key of EMBEDDED_LAUNCH_PARAMS) {\n if (url.searchParams.has(key)) {\n url.searchParams.delete(key);\n changed = true;\n }\n }\n\n if (!changed) {\n return trimmedPath;\n }\n\n if (/^https?:\\/\\//i.test(trimmedPath)) {\n return url.toString();\n }\n\n return `${url.pathname}${url.search}${url.hash}`;\n}\n\nexport function preserveEmbeddedAppLaunchParams(\n path: string | undefined,\n currentHref: string | undefined\n) {\n if (!path || !currentHref) {\n return path;\n }\n\n try {\n const currentUrl = new URL(currentHref, NAVIGATION_BASE_URL);\n const nextUrl = new URL(path, currentUrl.href);\n\n if (nextUrl.origin !== currentUrl.origin) {\n return path;\n }\n\n let changed = false;\n for (const key of EMBEDDED_LAUNCH_PARAMS) {\n if (!nextUrl.searchParams.has(key) && currentUrl.searchParams.has(key)) {\n const value = currentUrl.searchParams.get(key);\n if (value != null) {\n nextUrl.searchParams.set(key, value);\n changed = true;\n }\n }\n }\n\n if (!changed) {\n return path;\n }\n\n if (/^https?:\\/\\//i.test(path)) {\n return nextUrl.toString();\n }\n\n return `${nextUrl.pathname}${nextUrl.search}${nextUrl.hash}`;\n } catch {\n return path;\n }\n}\n\nexport function resolveLocalNavigationPath(\n href: string,\n currentOrigin: string\n): string | null {\n if (!href || href.startsWith(\"#\")) {\n return null;\n }\n\n let destination: URL;\n try {\n destination = new URL(href, currentOrigin);\n } catch {\n return null;\n }\n\n if (destination.origin !== currentOrigin) {\n return null;\n }\n\n return sanitizeEmbeddedAppPath(\n `${destination.pathname}${destination.search}${destination.hash}`\n ) ?? null;\n}\n\nexport function resolveNavigationDestination(payload: unknown): string | null {\n if (typeof payload === \"string\") {\n return sanitizeEmbeddedAppPath(payload) ?? null;\n }\n\n if (!payload || typeof payload !== \"object\") {\n return null;\n }\n\n const value = payload as BridgeNavigationGoPayload;\n\n if (typeof value.path === \"string\" && value.path) {\n return sanitizeEmbeddedAppPath(value.path) ?? null;\n }\n\n if (typeof value.href === \"string\" && value.href) {\n return sanitizeEmbeddedAppPath(value.href) ?? null;\n }\n\n if (typeof value.pathname !== \"string\" || !value.pathname) {\n return null;\n }\n\n return (\n sanitizeEmbeddedAppPath(\n `${value.pathname}${normalizeSearch(value.search ?? \"\")}${normalizeHash(value.hash ?? \"\")}`\n ) ?? null\n );\n}\n\n\nfunction normalizeNavigationItemPath(path: string | undefined) {\n if (!path) {\n return null;\n }\n\n const trimmedPath = path.trim();\n if (!trimmedPath || /^https?:\\/\\//i.test(trimmedPath)) {\n return null;\n }\n\n const normalizedPath = trimmedPath.startsWith(\"/\") ? trimmedPath : \"/\" + trimmedPath;\n return sanitizeEmbeddedAppPath(normalizedPath) ?? normalizedPath;\n}\n\nexport function normalizeBridgeNavigationItem(\n item: BridgeNavigationItem\n): BridgeNavigationItem | null {\n const label = item.label?.trim();\n const path = normalizeNavigationItemPath(item.path);\n\n if (!label || !path) {\n return null;\n }\n\n const matchPattern = normalizeNavigationItemPath(item.matchPattern ?? item.path);\n\n return {\n label,\n path,\n ...(matchPattern ? {matchPattern} : {}),\n ...(item.exactMatch !== undefined ? {exactMatch: item.exactMatch} : {}),\n };\n}\n\nexport function normalizeBridgeNavigationItems(\n items: BridgeNavigationItem[] | undefined\n) {\n if (!items?.length) {\n return [];\n }\n\n return items.flatMap((item) => {\n const normalizedItem = normalizeBridgeNavigationItem(item);\n return normalizedItem ? [normalizedItem] : [];\n });\n}\n","import {\n preserveEmbeddedAppLaunchParams,\n resolveNavigationDestination,\n type BridgeNavigationGoPayload,\n type BridgeNavigationRedirectPayload\n} from \"./navigation\";\n\nexport type BridgeParticipant = \"embedded-app\" | \"dashboard\" | \"unknown\";\n\nexport type BridgeMessageKind = \"event\" | \"request\" | \"response\";\n\nexport interface BridgeErrorPayload {\n code: string;\n message: string;\n}\n\nexport interface BridgeMessage<TPayload = unknown> {\n namespace: string;\n version: \"1.0\";\n kind: BridgeMessageKind;\n id: string;\n type: string;\n source: BridgeParticipant;\n target?: BridgeParticipant;\n payload?: TPayload;\n replyTo?: string;\n error?: BridgeErrorPayload;\n}\n\nexport interface AppBridgeOptions {\n clientId?: string;\n source?: BridgeParticipant;\n target?: BridgeParticipant;\n namespace?: string;\n targetOrigin?: string;\n allowedOrigins?: string[];\n requestTimeoutMs?: number;\n selfWindow?: Window;\n targetWindow?: Window | null;\n}\n\nexport interface RequestOptions {\n timeoutMs?: number;\n}\n\nexport interface SessionTokenRequest {\n clientId?: string;\n}\n\nexport interface SessionTokenResponse {\n sessionToken?: string;\n idToken: string;\n exp?: number;\n project?: string;\n}\n\nexport interface ReceivedBridgeMessage<TPayload = unknown> extends BridgeMessage<TPayload> {\n origin: string;\n rawEvent: MessageEvent<unknown>;\n}\n\nexport type BridgeEventHandler<TPayload = unknown> = (\n message: ReceivedBridgeMessage<TPayload>\n) => void;\n\nexport type BridgeRequestHandler<TRequest = unknown, TResponse = unknown> = (\n payload: TRequest,\n message: ReceivedBridgeMessage<TRequest>\n) => TResponse | Promise<TResponse>;\n\nexport type Unsubscribe = () => void;\n\nconst DEFAULT_NAMESPACE = \"thorcommerce:app-bridge\";\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_REDIRECT_EVENT_TYPE = \"navigation:redirect\";\n\nfunction createMessageId() {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n\n return `msg_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction resolveSelfWindow(explicitWindow?: Window) {\n if (explicitWindow) {\n return explicitWindow;\n }\n\n if (typeof window !== \"undefined\") {\n return window;\n }\n\n return undefined;\n}\n\nfunction resolveTargetWindow(selfWindow: Window | undefined, targetWindow?: Window | null) {\n if (targetWindow) {\n return targetWindow;\n }\n\n if (!selfWindow) {\n return undefined;\n }\n\n if (selfWindow.parent && selfWindow.parent !== selfWindow) {\n return selfWindow.parent;\n }\n\n return undefined;\n}\n\nfunction isDevelopmentEnvironment() {\n const nodeEnv =\n typeof globalThis !== \"undefined\" && \"process\" in globalThis\n ? (\n globalThis as typeof globalThis & {\n process?: { env?: { NODE_ENV?: string } };\n }\n ).process?.env?.NODE_ENV\n : undefined;\n\n if (nodeEnv) {\n return nodeEnv !== \"production\";\n }\n\n return true;\n}\n\nfunction hasAllowedOrigin(origin: string, allowedOrigins?: string[]) {\n if (!allowedOrigins || allowedOrigins.length === 0) {\n return true;\n }\n\n return allowedOrigins.includes(origin);\n}\n\nfunction isMessageTarget(value: unknown): value is Window {\n return !!value && typeof (value as Window).postMessage === \"function\";\n}\n\nfunction omitUndefinedFields<T extends object>(value: T): T {\n return Object.fromEntries(\n Object.entries(value).filter(([, fieldValue]) => fieldValue !== undefined)\n ) as T;\n}\n\nexport function isBridgeMessage<TPayload = unknown>(\n value: unknown,\n namespace = DEFAULT_NAMESPACE\n): value is BridgeMessage<TPayload> {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const message = value as Partial<BridgeMessage<TPayload>>;\n\n return (\n message.namespace === namespace &&\n message.version === \"1.0\" &&\n typeof message.kind === \"string\" &&\n typeof message.id === \"string\" &&\n typeof message.type === \"string\" &&\n typeof message.source === \"string\"\n );\n}\n\nexport class AppBridge {\n private readonly namespace: string;\n private readonly clientId?: string;\n private readonly source: BridgeParticipant;\n private readonly target: BridgeParticipant | undefined;\n private readonly targetOrigin: string;\n private readonly allowedOrigins?: string[];\n private readonly selfWindow?: Window;\n private readonly defaultTimeoutMs: number;\n private targetWindow?: Window;\n private readonly eventHandlers = new Map<string, Set<BridgeEventHandler>>();\n private readonly requestHandlers = new Map<string, BridgeRequestHandler>();\n private readonly pendingRequests = new Map<\n string,\n {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n }\n >();\n private readonly messageListener: (event: MessageEvent<unknown>) => void;\n\n constructor(options: AppBridgeOptions = {}) {\n this.namespace = options.namespace ?? DEFAULT_NAMESPACE;\n this.clientId = options.clientId;\n this.source = options.source ?? \"embedded-app\";\n this.target = options.target;\n this.targetOrigin = options.targetOrigin ?? \"*\";\n this.allowedOrigins = options.allowedOrigins;\n this.defaultTimeoutMs = options.requestTimeoutMs ?? DEFAULT_TIMEOUT_MS;\n this.selfWindow = resolveSelfWindow(options.selfWindow);\n this.targetWindow = resolveTargetWindow(this.selfWindow, options.targetWindow);\n this.messageListener = (event) => {\n this.handleMessage(event);\n };\n\n if (!this.selfWindow) {\n throw new Error(\n \"AppBridge requires a browser window. Pass selfWindow explicitly when constructing it outside global window scope.\"\n );\n }\n\n if (this.targetOrigin === \"*\" && isDevelopmentEnvironment()) {\n console.warn(\n 'AppBridge is using \"*\" as targetOrigin. Set targetOrigin explicitly for both the dashboard and embedded app in production.'\n );\n }\n\n this.selfWindow.addEventListener(\"message\", this.messageListener);\n }\n\n setTargetWindow(targetWindow: Window | null) {\n this.targetWindow = targetWindow ?? undefined;\n }\n\n hasTargetWindow() {\n return this.targetWindow !== undefined;\n }\n\n redirect(payload: string | BridgeNavigationRedirectPayload) {\n const destination = resolveNavigationDestination(payload);\n if (!destination) {\n throw new Error(\"AppBridge redirect requires a valid destination.\");\n }\n\n if (!this.targetWindow) {\n this.navigateSelf(destination);\n return;\n }\n\n this.postMessage<BridgeNavigationRedirectPayload>({\n kind: \"event\",\n type: DEFAULT_REDIRECT_EVENT_TYPE,\n payload: typeof payload === \"string\" ? { href: payload } : payload\n });\n }\n\n redirectToRemote(href: string) {\n this.redirect({ href });\n }\n\n redirectToApp(path: string | BridgeNavigationGoPayload) {\n this.redirect(typeof path === \"string\" ? { path } : path);\n }\n\n send<TPayload = unknown>(type: string, payload?: TPayload) {\n this.postMessage({\n kind: \"event\",\n type,\n payload\n });\n }\n\n request<TRequest = unknown, TResponse = unknown>(\n type: string,\n payload?: TRequest,\n options: RequestOptions = {}\n ) {\n const messageId = createMessageId();\n const timeoutMs = options.timeoutMs ?? this.defaultTimeoutMs;\n\n return new Promise<TResponse>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n this.pendingRequests.delete(messageId);\n reject(new Error(`Bridge request timed out for \"${type}\" after ${timeoutMs}ms.`));\n }, timeoutMs);\n\n this.pendingRequests.set(messageId, {\n resolve: (value) => resolve(value as TResponse),\n reject,\n timeoutId\n });\n\n try {\n this.postMessage({\n id: messageId,\n kind: \"request\",\n type,\n payload\n });\n } catch (error) {\n clearTimeout(timeoutId);\n this.pendingRequests.delete(messageId);\n reject(error instanceof Error ? error : new Error(\"Failed to send bridge request.\"));\n }\n });\n }\n\n getSessionToken(\n request: SessionTokenRequest = {},\n options: RequestOptions = {}\n ) {\n const resolvedRequest =\n request.clientId || this.clientId\n ? {\n ...request,\n clientId: request.clientId ?? this.clientId\n }\n : request;\n\n return this.request<SessionTokenRequest, SessionTokenResponse>(\n \"thor:session-token:get\",\n resolvedRequest,\n options\n );\n }\n\n on<TPayload = unknown>(type: string, handler: BridgeEventHandler<TPayload>): Unsubscribe {\n const handlers = this.eventHandlers.get(type) ?? new Set<BridgeEventHandler>();\n handlers.add(handler as BridgeEventHandler);\n this.eventHandlers.set(type, handlers);\n\n return () => {\n handlers.delete(handler as BridgeEventHandler);\n if (handlers.size === 0) {\n this.eventHandlers.delete(type);\n }\n };\n }\n\n onRequest<TRequest = unknown, TResponse = unknown>(\n type: string,\n handler: BridgeRequestHandler<TRequest, TResponse>\n ): Unsubscribe {\n this.requestHandlers.set(type, handler as BridgeRequestHandler);\n\n return () => {\n const registeredHandler = this.requestHandlers.get(type);\n if (registeredHandler === handler) {\n this.requestHandlers.delete(type);\n }\n };\n }\n\n destroy() {\n if (this.selfWindow) {\n this.selfWindow.removeEventListener(\"message\", this.messageListener);\n }\n\n for (const pendingRequest of this.pendingRequests.values()) {\n clearTimeout(pendingRequest.timeoutId);\n pendingRequest.reject(new Error(\"AppBridge destroyed before a response was received.\"));\n }\n\n this.pendingRequests.clear();\n this.eventHandlers.clear();\n this.requestHandlers.clear();\n }\n\n private handleMessage(event: MessageEvent<unknown>) {\n if (!hasAllowedOrigin(event.origin, this.allowedOrigins)) {\n return;\n }\n\n if (!isBridgeMessage(event.data, this.namespace)) {\n return;\n }\n\n const message = event.data;\n\n if (this.target && message.target && message.target !== this.source) {\n return;\n }\n\n const receivedMessage: ReceivedBridgeMessage = {\n ...message,\n origin: event.origin,\n rawEvent: event\n };\n\n if (\n message.kind === \"event\" &&\n message.type === DEFAULT_REDIRECT_EVENT_TYPE &&\n this.handleRedirectMessage(receivedMessage)\n ) {\n return;\n }\n\n if (message.kind === \"response\" && message.replyTo) {\n this.resolvePendingRequest(message.replyTo, message);\n return;\n }\n\n this.emitHandlers(message.type, receivedMessage);\n\n if (message.kind === \"request\") {\n void this.handleRequest(receivedMessage);\n }\n }\n\n private emitHandlers(type: string, message: ReceivedBridgeMessage) {\n const typeHandlers = this.eventHandlers.get(type);\n if (typeHandlers) {\n for (const handler of typeHandlers) {\n handler(message);\n }\n }\n\n if (type === \"*\") {\n return;\n }\n\n const wildcardHandlers = this.eventHandlers.get(\"*\");\n if (wildcardHandlers) {\n for (const handler of wildcardHandlers) {\n handler(message);\n }\n }\n }\n\n private async handleRequest(message: ReceivedBridgeMessage) {\n const handler = this.requestHandlers.get(message.type);\n if (!handler) {\n return;\n }\n\n const replyTarget = isMessageTarget(message.rawEvent.source)\n ? message.rawEvent.source\n : this.targetWindow;\n\n try {\n const payload = await handler(message.payload, message);\n this.postMessage(\n {\n kind: \"response\",\n type: message.type,\n payload,\n replyTo: message.id\n },\n replyTarget\n );\n } catch (error) {\n const bridgeError =\n error instanceof Error\n ? { code: \"request_handler_error\", message: error.message }\n : { code: \"request_handler_error\", message: \"Unknown request handler error.\" };\n\n this.postMessage(\n {\n kind: \"response\",\n type: message.type,\n error: bridgeError,\n replyTo: message.id\n },\n replyTarget\n );\n }\n }\n\n private resolvePendingRequest(messageId: string, message: BridgeMessage) {\n const pendingRequest = this.pendingRequests.get(messageId);\n if (!pendingRequest) {\n return;\n }\n\n clearTimeout(pendingRequest.timeoutId);\n this.pendingRequests.delete(messageId);\n\n if (message.error) {\n pendingRequest.reject(new Error(`${message.error.code}: ${message.error.message}`));\n return;\n }\n\n pendingRequest.resolve(message.payload);\n }\n\n private postMessage<TPayload = unknown>(\n partialMessage: Pick<BridgeMessage<TPayload>, \"kind\" | \"type\"> &\n Partial<Omit<BridgeMessage<TPayload>, \"namespace\" | \"version\" | \"source\">>,\n targetWindowOverride?: Window\n ) {\n const targetWindow = targetWindowOverride ?? this.targetWindow;\n if (!targetWindow) {\n throw new Error(\n \"AppBridge could not resolve a target window. Pass targetWindow explicitly or call setTargetWindow().\"\n );\n }\n\n const message = omitUndefinedFields({\n namespace: this.namespace,\n version: \"1.0\",\n id: partialMessage.id ?? createMessageId(),\n kind: partialMessage.kind,\n type: partialMessage.type,\n source: this.source,\n target: partialMessage.target ?? this.target,\n payload: partialMessage.payload,\n replyTo: partialMessage.replyTo,\n error: partialMessage.error\n }) as BridgeMessage<TPayload>;\n\n targetWindow.postMessage(message, this.targetOrigin);\n }\n\n private handleRedirectMessage(message: ReceivedBridgeMessage): boolean {\n const destination = resolveNavigationDestination(message.payload);\n if (!destination) {\n return false;\n }\n\n this.navigateSelf(destination);\n return true;\n }\n\n private navigateSelf(destination: string) {\n if (!this.selfWindow) {\n throw new Error(\"AppBridge could not resolve a browser window for redirect.\");\n }\n\n this.selfWindow.location.assign(\n preserveEmbeddedAppLaunchParams(destination, this.selfWindow.location.href) ?? destination\n );\n }\n}\n\nexport function createAppBridge(options: AppBridgeOptions = {}) {\n return new AppBridge(options);\n}\n","import {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode\n} from \"react\";\n\nimport {\n type AppBridge,\n type ReceivedBridgeMessage\n} from \"./core\";\nimport {\n type BridgeNavigationGoPayload,\n type BridgeNavigationItem\n} from \"./navigation\";\nimport {\n getOrCreateEmbeddedAppRuntime,\n type EmbeddedAppRuntimeConfig,\n} from \"./runtime\";\n\nconst AppBridgeContext = createContext<AppBridge | null>(null);\n\nexport interface AppBridgeProviderProps\n extends Omit<EmbeddedAppRuntimeConfig, \"source\" | \"target\" | \"allowedOrigins\"> {\n children: ReactNode;\n}\n\nexport function AppBridgeProvider({\n children,\n clientId,\n currentPath,\n navigationItems,\n navigationEventType = \"navigation:go\",\n navigationUpdateEventType = \"navigation:update\",\n namespace,\n onNavigate,\n readyEventType = \"app:ready\",\n readyPayload,\n requestTimeoutMs,\n selfWindow,\n targetOrigin,\n targetWindow\n}: AppBridgeProviderProps) {\n const [bridge, setBridge] = useState<AppBridge | null>(null);\n\n useEffect(() => {\n if (typeof window === \"undefined\" && !selfWindow) {\n return;\n }\n\n const runtime = getOrCreateEmbeddedAppRuntime({\n clientId,\n currentPath,\n navigationEventType,\n navigationItems,\n navigationUpdateEventType,\n namespace,\n onNavigate,\n readyEventType,\n readyPayload,\n requestTimeoutMs,\n selfWindow,\n targetOrigin,\n targetWindow\n });\n\n setBridge(runtime.bridge);\n\n return () => {\n runtime.clearNavigationHandler();\n setBridge((currentBridge) =>\n currentBridge === runtime.bridge ? null : currentBridge,\n );\n };\n }, [\n clientId,\n currentPath,\n navigationEventType,\n navigationItems,\n navigationUpdateEventType,\n namespace,\n onNavigate,\n readyEventType,\n readyPayload,\n requestTimeoutMs,\n selfWindow,\n targetOrigin,\n targetWindow\n ]);\n\n return <AppBridgeContext.Provider value={bridge}>{children}</AppBridgeContext.Provider>;\n}\n\nexport function useAppBridge() {\n return useContext(AppBridgeContext);\n}\n","import {\n createAppBridge,\n type AppBridge,\n type AppBridgeOptions,\n type ReceivedBridgeMessage,\n} from \"./core\";\nimport {\n buildNavigationUpdatePayload,\n normalizeBridgeNavigationItems,\n preserveEmbeddedAppLaunchParams,\n resolveLocalNavigationPath,\n resolveNavigationDestination,\n sanitizeEmbeddedAppPath,\n type BridgeNavigationGoPayload,\n type BridgeNavigationItem,\n} from \"./navigation\";\n\nconst GLOBAL_RUNTIME_KEY = \"__thorEmbeddedAppRuntime__\";\nexport const THOR_NAVIGATE_EVENT = \"thor:navigate\";\n\nexport interface EmbeddedAppRuntimeConfig\n extends Omit<AppBridgeOptions, \"source\" | \"target\" | \"allowedOrigins\"> {\n clientId: string;\n currentPath?: string | null;\n navigationItems?: BridgeNavigationItem[];\n navigationEventType?: string;\n navigationUpdateEventType?: string;\n onNavigate?: (\n path: string,\n message?: ReceivedBridgeMessage<BridgeNavigationGoPayload>,\n ) => void;\n readyEventType?: string;\n readyPayload?: unknown;\n}\n\ntype GlobalWithRuntime = typeof globalThis & {\n [GLOBAL_RUNTIME_KEY]?: EmbeddedAppRuntime;\n};\n\nexport class EmbeddedAppRuntime {\n readonly bridge: AppBridge;\n\n private clientId: string;\n private currentPath: string | null = null;\n private navigationItems: BridgeNavigationItem[] = [];\n private navigationEventType = \"navigation:go\";\n private navigationUpdateEventType = \"navigation:update\";\n private readyEventType = \"app:ready\";\n private readyPayload: unknown;\n private hasSentReady = false;\n private lastSentNavigationItemsKey: string | null = null;\n private lastReportedPath: string | null = null;\n private pendingHostNavigationPath: string | null = null;\n private onNavigate?:\n | ((\n path: string,\n message?: ReceivedBridgeMessage<BridgeNavigationGoPayload>,\n ) => void)\n | undefined;\n private sessionTokenCache: {\n token: string;\n expiresAt?: number;\n } | null = null;\n private project: string | null;\n private pendingSessionToken: Promise<string> | null = null;\n private readonly selfWindow: Window;\n private readonly targetOrigin?: string;\n private readonly removeNavigationInterceptors: () => void;\n private readonly removeHistoryObserver: () => void;\n private readonly restoreFetch: () => void;\n private removeNavigationRequestHandler?: () => void;\n\n constructor(config: EmbeddedAppRuntimeConfig) {\n const resolvedWindow =\n config.selfWindow ?? (typeof window !== \"undefined\" ? window : undefined);\n if (!resolvedWindow) {\n throw new Error(\"EmbeddedAppRuntime requires a browser window.\");\n }\n\n this.selfWindow = resolvedWindow;\n this.targetOrigin = config.targetOrigin ?? getReferrerOrigin(resolvedWindow);\n this.clientId = config.clientId;\n this.currentPath = readCurrentPath(resolvedWindow);\n this.project = readInitialProject(resolvedWindow);\n this.readyPayload = config.readyPayload ?? { clientId: config.clientId };\n\n this.bridge = createAppBridge({\n allowedOrigins: this.targetOrigin ? [this.targetOrigin] : undefined,\n namespace: config.namespace,\n requestTimeoutMs: config.requestTimeoutMs,\n selfWindow: resolvedWindow,\n source: \"embedded-app\",\n target: \"dashboard\",\n targetOrigin: this.targetOrigin,\n targetWindow: config.targetWindow,\n });\n\n this.removeNavigationRequestHandler = this.bridge.on<\n BridgeNavigationGoPayload\n >(this.navigationEventType, (message) => {\n const destination = resolveNavigationDestination(message.payload);\n if (!destination) {\n return;\n }\n\n this.pendingHostNavigationPath =\n sanitizeEmbeddedAppPath(destination) ?? destination;\n\n const nextPath = preserveEmbeddedAppLaunchParams(\n destination,\n this.selfWindow.location.href,\n );\n this.navigate(nextPath ?? destination, message);\n });\n\n this.removeNavigationInterceptors = installNavigationInterceptors({\n bridge: this.bridge,\n selfWindow: this.selfWindow,\n navigate: (path) => this.navigate(path),\n });\n\n this.removeHistoryObserver = installHistoryObserver({\n selfWindow: this.selfWindow,\n onChange: (path) => {\n this.currentPath = path;\n this.syncBridgeState();\n },\n });\n\n this.restoreFetch = installFetchInterceptor({\n bridge: this.bridge,\n getClientId: () => this.clientId,\n getProject: () => this.project,\n setProject: (project) => {\n this.project = project;\n },\n readCachedToken: () => this.sessionTokenCache,\n writeCachedToken: (token) => {\n this.sessionTokenCache = token;\n },\n readPendingToken: () => this.pendingSessionToken,\n writePendingToken: (token) => {\n this.pendingSessionToken = token;\n },\n });\n\n this.update(config);\n }\n\n update(config: Partial<EmbeddedAppRuntimeConfig>) {\n if (config.clientId) {\n this.clientId = config.clientId;\n if (\n !this.readyPayload ||\n (typeof this.readyPayload === \"object\" &&\n this.readyPayload !== null &&\n \"clientId\" in this.readyPayload)\n ) {\n this.readyPayload = config.readyPayload ?? { clientId: config.clientId };\n }\n }\n\n if (config.currentPath !== undefined) {\n this.currentPath = config.currentPath;\n }\n\n if (config.navigationItems !== undefined) {\n this.navigationItems = normalizeBridgeNavigationItems(config.navigationItems);\n }\n\n if (config.onNavigate !== undefined) {\n this.onNavigate = config.onNavigate;\n }\n\n if (config.readyEventType) {\n this.readyEventType = config.readyEventType;\n }\n\n if (config.readyPayload !== undefined) {\n this.readyPayload = config.readyPayload;\n }\n\n if (config.targetWindow !== undefined) {\n this.bridge.setTargetWindow(config.targetWindow ?? null);\n }\n\n this.syncBridgeState();\n }\n\n clearNavigationHandler() {\n this.onNavigate = undefined;\n }\n\n destroy() {\n this.removeNavigationRequestHandler?.();\n this.removeNavigationInterceptors();\n this.removeHistoryObserver();\n this.restoreFetch();\n this.bridge.destroy();\n }\n\n private syncBridgeState() {\n if (!this.bridge.hasTargetWindow()) {\n return;\n }\n\n if (!this.hasSentReady) {\n this.bridge.send(this.readyEventType, this.readyPayload);\n this.hasSentReady = true;\n }\n\n const navigationItemsKey = JSON.stringify(this.navigationItems);\n if (navigationItemsKey !== this.lastSentNavigationItemsKey) {\n this.bridge.send(\"navigation:items:update\", {\n items: this.navigationItems,\n });\n this.lastSentNavigationItemsKey = navigationItemsKey;\n }\n\n if (this.currentPath) {\n if (this.currentPath === this.pendingHostNavigationPath) {\n this.pendingHostNavigationPath = null;\n this.lastReportedPath = this.currentPath;\n return;\n }\n\n if (this.currentPath === this.lastReportedPath) {\n return;\n }\n\n this.bridge.send(\n this.navigationUpdateEventType,\n buildNavigationUpdatePayload(this.currentPath),\n );\n this.lastReportedPath = this.currentPath;\n }\n }\n\n private navigate(\n path: string,\n message?: ReceivedBridgeMessage<BridgeNavigationGoPayload>,\n ) {\n if (this.onNavigate) {\n this.onNavigate(path, message);\n return;\n }\n\n if (dispatchNavigateEvent(this.selfWindow.document, path)) {\n return;\n }\n\n this.selfWindow.location.assign(path);\n }\n}\n\nexport function getOrCreateEmbeddedAppRuntime(\n config: EmbeddedAppRuntimeConfig,\n) {\n const globalScope = globalThis as GlobalWithRuntime;\n const existingRuntime = globalScope[GLOBAL_RUNTIME_KEY];\n\n if (existingRuntime) {\n existingRuntime.update(config);\n return existingRuntime;\n }\n\n const runtime = new EmbeddedAppRuntime(config);\n globalScope[GLOBAL_RUNTIME_KEY] = runtime;\n return runtime;\n}\n\nexport function getEmbeddedAppRuntime() {\n return (globalThis as GlobalWithRuntime)[GLOBAL_RUNTIME_KEY] ?? null;\n}\n\nfunction dispatchNavigateEvent(document: Document, path: string) {\n const event = new CustomEvent<{path: string}>(THOR_NAVIGATE_EVENT, {\n cancelable: true,\n detail: {path},\n });\n\n document.dispatchEvent(event);\n return event.defaultPrevented;\n}\n\nfunction readCurrentPath(selfWindow: Window) {\n return (\n sanitizeEmbeddedAppPath(\n `${selfWindow.location.pathname}${selfWindow.location.search}${selfWindow.location.hash}`,\n ) ?? null\n );\n}\n\nfunction installHistoryObserver({\n selfWindow,\n onChange,\n}: {\n selfWindow: Window;\n onChange: (path: string | null) => void;\n}) {\n const history = selfWindow.history;\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n\n const notify = () => {\n onChange(readCurrentPath(selfWindow));\n };\n\n history.pushState = function (...args) {\n originalPushState.apply(history, args);\n notify();\n };\n\n history.replaceState = function (...args) {\n originalReplaceState.apply(history, args);\n notify();\n };\n\n selfWindow.addEventListener(\"popstate\", notify);\n selfWindow.addEventListener(\"hashchange\", notify);\n\n notify();\n\n return () => {\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n selfWindow.removeEventListener(\"popstate\", notify);\n selfWindow.removeEventListener(\"hashchange\", notify);\n };\n}\n\nfunction getReferrerOrigin(explicitWindow?: Window) {\n const resolvedWindow =\n explicitWindow ?? (typeof window !== \"undefined\" ? window : undefined);\n const referrer = resolvedWindow?.document?.referrer;\n\n if (!referrer) {\n return undefined;\n }\n\n try {\n return new URL(referrer).origin;\n } catch {\n return undefined;\n }\n}\n\nfunction installNavigationInterceptors({\n bridge,\n selfWindow,\n navigate,\n}: {\n bridge: AppBridge;\n selfWindow: Window;\n navigate: (path: string) => void;\n}) {\n const document = selfWindow.document;\n const handleLocalNavigation = (path: string) => {\n const sanitizedPath = sanitizeEmbeddedAppPath(path);\n if (!sanitizedPath) {\n return;\n }\n\n const nextPath = preserveEmbeddedAppLaunchParams(\n sanitizedPath,\n selfWindow.location.href,\n );\n\n navigate(nextPath ?? sanitizedPath);\n };\n\n const handleDocumentClick = (event: MouseEvent) => {\n if (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.altKey ||\n event.ctrlKey ||\n event.shiftKey\n ) {\n return;\n }\n\n const target = event.target;\n if (!(target instanceof Element)) {\n return;\n }\n\n const anchor = target.closest(\"a[href]\");\n if (!(anchor instanceof HTMLAnchorElement)) {\n return;\n }\n\n if (anchor.hasAttribute(\"download\")) {\n return;\n }\n\n const targetWindow = anchor.target.toLowerCase();\n const href = anchor.getAttribute(\"href\");\n if (!href) {\n return;\n }\n\n if (targetWindow === \"_top\" || targetWindow === \"_parent\") {\n event.preventDefault();\n bridge.redirectToRemote(anchor.href);\n return;\n }\n\n if (targetWindow && targetWindow !== \"_self\") {\n return;\n }\n\n const nextPath = resolveLocalNavigationPath(href, selfWindow.location.origin);\n if (!nextPath) {\n return;\n }\n\n event.preventDefault();\n handleLocalNavigation(nextPath);\n };\n\n const originalOpen = selfWindow.open.bind(selfWindow);\n selfWindow.open = (url?: string | URL, target?: string, features?: string) => {\n if (url == null) {\n return originalOpen(url, target, features);\n }\n\n const href = typeof url === \"string\" ? url : url.toString();\n const targetName = (target ?? \"\").toLowerCase();\n\n if (targetName === \"_top\" || targetName === \"_parent\") {\n bridge.redirectToRemote(new URL(href, selfWindow.location.href).toString());\n return null;\n }\n\n if (!targetName || targetName === \"_self\") {\n const nextPath = resolveLocalNavigationPath(\n href,\n selfWindow.location.origin,\n );\n if (nextPath) {\n handleLocalNavigation(nextPath);\n return selfWindow;\n }\n }\n\n return originalOpen(url, target, features);\n };\n\n document.addEventListener(\"click\", handleDocumentClick, true);\n\n return () => {\n document.removeEventListener(\"click\", handleDocumentClick, true);\n selfWindow.open = originalOpen;\n };\n}\n\nfunction installFetchInterceptor({\n bridge,\n getClientId,\n getProject,\n setProject,\n readCachedToken,\n writeCachedToken,\n readPendingToken,\n writePendingToken,\n}: {\n bridge: AppBridge;\n getClientId: () => string;\n getProject: () => string | null;\n setProject: (project: string | null) => void;\n readCachedToken: () => { token: string; expiresAt?: number } | null;\n writeCachedToken: (\n token: { token: string; expiresAt?: number } | null,\n ) => void;\n readPendingToken: () => Promise<string> | null;\n writePendingToken: (token: Promise<string> | null) => void;\n}) {\n if (typeof window === \"undefined\") {\n return () => {};\n }\n\n const originalFetch = globalThis.fetch.bind(globalThis);\n\n const interceptedFetch = async (input: RequestInfo | URL, init?: RequestInit) => {\n if (!shouldAttachSessionToken(input)) {\n return originalFetch(input, init);\n }\n\n const existingAuthorization = getExistingAuthorization(input, init);\n if (existingAuthorization) {\n return originalFetch(input, init);\n }\n\n const nextHeaders = new Headers(\n input instanceof Request ? input.headers : init?.headers,\n );\n\n try {\n const sessionToken = await getSessionToken({\n bridge,\n clientId: getClientId(),\n project: getProject,\n setProject,\n readCachedToken,\n writeCachedToken,\n readPendingToken,\n writePendingToken,\n });\n\n nextHeaders.set(\"Authorization\", `Bearer ${sessionToken}`);\n } catch {\n if (!getProject()) {\n throw new Error(\"Missing Thor embedded session token\");\n }\n }\n\n if (!nextHeaders.has(\"X-Requested-With\")) {\n nextHeaders.set(\"X-Requested-With\", \"XMLHttpRequest\");\n }\n\n if (input instanceof Request) {\n return originalFetch(\n new Request(input, {\n headers: nextHeaders,\n }),\n );\n }\n\n return originalFetch(input, {\n ...init,\n headers: nextHeaders,\n });\n };\n\n globalThis.fetch = interceptedFetch;\n window.fetch = interceptedFetch;\n\n return () => {\n globalThis.fetch = originalFetch;\n window.fetch = originalFetch;\n };\n}\n\nasync function getSessionToken({\n bridge,\n clientId,\n project,\n setProject,\n readCachedToken,\n writeCachedToken,\n readPendingToken,\n writePendingToken,\n}: {\n bridge: AppBridge;\n clientId: string;\n project: () => string | null;\n setProject: (project: string | null) => void;\n readCachedToken: () => { token: string; expiresAt?: number } | null;\n writeCachedToken: (\n token: { token: string; expiresAt?: number } | null,\n ) => void;\n readPendingToken: () => Promise<string> | null;\n writePendingToken: (token: Promise<string> | null) => void;\n}) {\n const cachedToken = readCachedToken();\n if (cachedToken && !isExpired(cachedToken.expiresAt)) {\n return cachedToken.token;\n }\n\n const pendingToken = readPendingToken();\n if (pendingToken) {\n return pendingToken;\n }\n\n const nextPendingToken = bridge\n .getSessionToken({ clientId })\n .then((response) => {\n const token = response.sessionToken ?? response.idToken;\n if (!token) {\n throw new Error(\"Missing Thor embedded session token\");\n }\n\n if (response.project) {\n setProject(response.project);\n }\n\n writeCachedToken({\n token,\n expiresAt: normalizeTokenExpiry(token, response.exp),\n });\n writePendingToken(null);\n\n return token;\n })\n .catch((error) => {\n writePendingToken(null);\n throw error;\n });\n\n writePendingToken(nextPendingToken);\n return nextPendingToken;\n}\n\nfunction shouldAttachSessionToken(input: RequestInfo | URL) {\n if (typeof window === \"undefined\") {\n return false;\n }\n\n const requestUrl = resolveRequestUrl(input);\n return requestUrl.origin === window.location.origin;\n}\n\nfunction resolveRequestUrl(input: RequestInfo | URL) {\n if (input instanceof Request) {\n return new URL(input.url);\n }\n\n if (input instanceof URL) {\n return input;\n }\n\n return new URL(input, window.location.href);\n}\n\nfunction getExistingAuthorization(input: RequestInfo | URL, init?: RequestInit) {\n if (input instanceof Request && input.headers.has(\"Authorization\")) {\n return input.headers.get(\"Authorization\");\n }\n\n if (!init?.headers) {\n return null;\n }\n\n return new Headers(init.headers).get(\"Authorization\");\n}\n\nfunction normalizeTokenExpiry(token: string, explicitExp?: number) {\n const tokenExp = explicitExp ?? decodeJwtExpiry(token);\n return tokenExp ? tokenExp * 1000 : undefined;\n}\n\nfunction decodeJwtExpiry(token: string) {\n const [, payload] = token.split(\".\");\n if (!payload || typeof window === \"undefined\") {\n return undefined;\n }\n\n try {\n const normalized = payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = normalized.padEnd(\n normalized.length + ((4 - (normalized.length % 4)) % 4),\n \"=\",\n );\n const json = JSON.parse(window.atob(padded)) as { exp?: unknown };\n\n return typeof json.exp === \"number\" ? json.exp : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isExpired(expiresAt?: number) {\n if (!expiresAt) {\n return false;\n }\n\n return Date.now() >= expiresAt - 5_000;\n}\n\nfunction readInitialProject(explicitWindow?: Window) {\n const resolvedWindow =\n explicitWindow ?? (typeof window !== \"undefined\" ? window : undefined);\n if (!resolvedWindow) {\n return null;\n }\n\n try {\n const url = new URL(resolvedWindow.location.href);\n return url.searchParams.get(\"project\");\n } catch {\n return null;\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { E as EmbeddedAppRuntimeConfig, A as AppBridge } from './runtime-mEVvh6Rv.cjs';
2
- export { c as AppBridgeOptions, B as BridgeErrorPayload, d as BridgeEventHandler, e as BridgeMessage, f as BridgeMessageKind, h as BridgeNavigationGoPayload, i as BridgeNavigationItem, j as BridgeNavigationItemsPayload, k as BridgeNavigationRedirectPayload, l as BridgeNavigationUpdatePayload, m as BridgeParticipant, n as BridgeRequestHandler, o as EMBEDDED_LAUNCH_PARAMS, b as EmbeddedAppRuntime, R as ReceivedBridgeMessage, p as RequestOptions, S as SessionTokenRequest, q as SessionTokenResponse, T as THOR_NAVIGATE_EVENT, U as Unsubscribe, r as buildNavigationUpdatePayload, s as createAppBridge, a as getEmbeddedAppRuntime, g as getOrCreateEmbeddedAppRuntime, t as isBridgeMessage, u as normalizeBridgeNavigationItem, v as normalizeBridgeNavigationItems, w as preserveEmbeddedAppLaunchParams, x as resolveLocalNavigationPath, y as resolveNavigationDestination, z as sanitizeEmbeddedAppPath } from './runtime-mEVvh6Rv.cjs';
1
+ import { E as EmbeddedAppRuntimeConfig, A as AppBridge } from './runtime-BsE3hxuZ.cjs';
2
+ export { c as AppBridgeOptions, B as BridgeErrorPayload, d as BridgeEventHandler, e as BridgeMessage, f as BridgeMessageKind, h as BridgeNavigationGoPayload, i as BridgeNavigationItem, j as BridgeNavigationItemsPayload, k as BridgeNavigationRedirectPayload, l as BridgeNavigationUpdatePayload, m as BridgeParticipant, n as BridgeRequestHandler, o as EMBEDDED_LAUNCH_PARAMS, b as EmbeddedAppRuntime, R as ReceivedBridgeMessage, p as RequestOptions, S as SessionTokenRequest, q as SessionTokenResponse, T as THOR_NAVIGATE_EVENT, U as Unsubscribe, r as buildNavigationUpdatePayload, s as createAppBridge, a as getEmbeddedAppRuntime, g as getOrCreateEmbeddedAppRuntime, t as isBridgeMessage, u as normalizeBridgeNavigationItem, v as normalizeBridgeNavigationItems, w as preserveEmbeddedAppLaunchParams, x as resolveLocalNavigationPath, y as resolveNavigationDestination, z as sanitizeEmbeddedAppPath } from './runtime-BsE3hxuZ.cjs';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { ReactNode } from 'react';
5
5
 
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { E as EmbeddedAppRuntimeConfig, A as AppBridge } from './runtime-mEVvh6Rv.js';
2
- export { c as AppBridgeOptions, B as BridgeErrorPayload, d as BridgeEventHandler, e as BridgeMessage, f as BridgeMessageKind, h as BridgeNavigationGoPayload, i as BridgeNavigationItem, j as BridgeNavigationItemsPayload, k as BridgeNavigationRedirectPayload, l as BridgeNavigationUpdatePayload, m as BridgeParticipant, n as BridgeRequestHandler, o as EMBEDDED_LAUNCH_PARAMS, b as EmbeddedAppRuntime, R as ReceivedBridgeMessage, p as RequestOptions, S as SessionTokenRequest, q as SessionTokenResponse, T as THOR_NAVIGATE_EVENT, U as Unsubscribe, r as buildNavigationUpdatePayload, s as createAppBridge, a as getEmbeddedAppRuntime, g as getOrCreateEmbeddedAppRuntime, t as isBridgeMessage, u as normalizeBridgeNavigationItem, v as normalizeBridgeNavigationItems, w as preserveEmbeddedAppLaunchParams, x as resolveLocalNavigationPath, y as resolveNavigationDestination, z as sanitizeEmbeddedAppPath } from './runtime-mEVvh6Rv.js';
1
+ import { E as EmbeddedAppRuntimeConfig, A as AppBridge } from './runtime-BsE3hxuZ.js';
2
+ export { c as AppBridgeOptions, B as BridgeErrorPayload, d as BridgeEventHandler, e as BridgeMessage, f as BridgeMessageKind, h as BridgeNavigationGoPayload, i as BridgeNavigationItem, j as BridgeNavigationItemsPayload, k as BridgeNavigationRedirectPayload, l as BridgeNavigationUpdatePayload, m as BridgeParticipant, n as BridgeRequestHandler, o as EMBEDDED_LAUNCH_PARAMS, b as EmbeddedAppRuntime, R as ReceivedBridgeMessage, p as RequestOptions, S as SessionTokenRequest, q as SessionTokenResponse, T as THOR_NAVIGATE_EVENT, U as Unsubscribe, r as buildNavigationUpdatePayload, s as createAppBridge, a as getEmbeddedAppRuntime, g as getOrCreateEmbeddedAppRuntime, t as isBridgeMessage, u as normalizeBridgeNavigationItem, v as normalizeBridgeNavigationItems, w as preserveEmbeddedAppLaunchParams, x as resolveLocalNavigationPath, y as resolveNavigationDestination, z as sanitizeEmbeddedAppPath } from './runtime-BsE3hxuZ.js';
3
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
4
  import { ReactNode } from 'react';
5
5