@benji-money/connect-sdk 1.1.4-beta.2 → 1.1.4-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -177,7 +177,7 @@ const sdk = new ConnectSDK({
177
177
  await sdk.open();
178
178
  ```
179
179
 
180
- > **`bottom-end`** positions the **partner popup** below the anchor with its right edge aligned to the anchor's right edge. The Benji Connect iframe stays headless (not visible). When `tokenData.partnerAuthLink` is set, the popup opens that URL on `open()` (with `state` from `configToken` when provided). The SDK skips `PARTNER_LOGIN_OPEN` navigation when the popup already has a partner URL. Popup→iframe auth messages are queued until the Connect iframe `load` event. Otherwise the pre-opened popup shows generic loading UI (`Loading sign-in…`) until Benji Connect sends the partner auth URL.
180
+ > **`bottom-end`** positions the **partner popup** below the anchor with its right edge aligned to the anchor's right edge. The Benji Connect iframe stays headless (not visible). When `tokenData.partnerAuthLink` is set, the popup opens that URL on `open()` (with `state` from `configToken` when provided) after LOGIN listeners and popup context are registered. The SDK skips `PARTNER_LOGIN_OPEN` navigation when the popup already has a partner URL. Popup→iframe auth messages are queued until the Connect iframe `load` event. Otherwise the pre-opened popup shows generic loading UI (`Loading sign-in…`) until Benji Connect sends the partner auth URL.
181
181
 
182
182
  ### Environments
183
183
 
@@ -110,7 +110,7 @@ var ConnectSDK = (() => {
110
110
  // src/utils/config.ts
111
111
  var buildContext = () => ({
112
112
  namespace: "benji-connect-sdk" ? "benji-connect-sdk" : "benji-connect-sdk",
113
- version: "1.1.4-beta.2" ? String("1.1.4-beta.2") : "0.0.0"
113
+ version: "1.1.4-beta.3" ? String("1.1.4-beta.3") : "0.0.0"
114
114
  });
115
115
  function isBenjiConnectEnvironment(environment) {
116
116
  return environment === "local" /* LOCAL */ || environment === "development" /* DEVELOPMENT */ || environment === "sandbox" /* SANDBOX */ || environment === "production" /* PRODUCTION */;
@@ -939,13 +939,17 @@ var ConnectSDK = (() => {
939
939
  }
940
940
  static handleMessage(event) {
941
941
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
942
- if (shouldRelayMessage(this.mode, event.data) && this.loginPopup) {
942
+ if (shouldRelayMessage(this.mode, event.data)) {
943
943
  const expectedOrigin2 = this.connectOrigin || new URL(Endpoints.benji_connect_auth_url).origin;
944
944
  const iframeWindow = (_a = this.iframe) == null ? void 0 : _a.contentWindow;
945
- if (event.source === this.loginPopup) {
945
+ if (this.loginPopup && event.source === this.loginPopup) {
946
946
  this.relayToIframe(event);
947
947
  return;
948
948
  }
949
+ if (!this.loginPopup && event.source instanceof Window && event.source !== iframeWindow) {
950
+ this.pendingPopupAuth.push(event);
951
+ return;
952
+ }
949
953
  if (iframeWindow && event.source === iframeWindow) {
950
954
  if (event.origin !== expectedOrigin2) {
951
955
  console.warn(
@@ -1068,9 +1072,9 @@ var ConnectSDK = (() => {
1068
1072
  this.isClosing = false;
1069
1073
  /**
1070
1074
  * Aborts a pending open() when close() runs before the iframe mounts.
1071
- * Non-DUMMY LOGIN opens the partner popup synchronously, then awaits initialize()
1072
- * before mounting a headless iframe. Without this, close() can tear down the popup
1073
- * while the in-flight open() still registers listeners and mounts the iframe.
1075
+ * Non-DUMMY LOGIN arms listeners, then opens the partner popup synchronously,
1076
+ * then mounts a headless iframe. Without this, close() can tear down the popup
1077
+ * while the in-flight open() still mounts the iframe.
1074
1078
  */
1075
1079
  this.openAbortController = null;
1076
1080
  this.onIframeLoad = () => {
@@ -1103,7 +1107,7 @@ var ConnectSDK = (() => {
1103
1107
  (_a = this.openAbortController) == null ? void 0 : _a.abort();
1104
1108
  this.openAbortController = null;
1105
1109
  }
1106
- async initialize() {
1110
+ initialize() {
1107
1111
  MessageRouter.configureMessageRouter({
1108
1112
  onSuccess: this.sdkConfig.onSuccess,
1109
1113
  onError: this.sdkConfig.onError,
@@ -1191,17 +1195,19 @@ var ConnectSDK = (() => {
1191
1195
  const abortController = new AbortController();
1192
1196
  this.openAbortController = abortController;
1193
1197
  const { signal } = abortController;
1198
+ this.initialize();
1199
+ if (signal.aborted) return;
1200
+ MessageRouter.setMode(mode);
1201
+ MessageRouter.addEventListeners();
1194
1202
  if (this.isLoginPopupOnly()) {
1195
1203
  const opened = this.openLoginPopup();
1196
1204
  if (!opened) {
1197
1205
  this.abortInflightOpen();
1206
+ MessageRouter.removeEventListeners();
1198
1207
  return;
1199
1208
  }
1209
+ this.syncLoginContext(mode);
1200
1210
  }
1201
- await this.initialize();
1202
- if (signal.aborted) return;
1203
- MessageRouter.setMode(mode);
1204
- MessageRouter.addEventListeners();
1205
1211
  if (signal.aborted) {
1206
1212
  MessageRouter.removeEventListeners();
1207
1213
  return;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config/production.ts","../src/config/sandbox.ts","../src/config/development.ts","../src/config/local.defaults.ts","../src/utils/environment.ts","../src/config/index.ts","../src/utils/config.ts","../src/utils/loginPopupLoading.ts","../src/utils/partnerAuthLink.ts","../src/utils/placement.ts","../src/types/event.ts","../src/utils/auth.ts","../src/utils/user.ts","../src/utils/transaction.ts","../src/types/router.ts","../src/router/message.ts","../src/connect-sdk.ts","../src/global.ts"],"sourcesContent":["export const project_environment: string = 'production';\n\nexport const endpoints: Record<string, string> = {\n 'benji_connect_auth_url':'https://verifyapp.withbenji.com',\n 'benji_connect_auth_service_url' : 'https://authservice.withbenji.com'\n}","export const project_environment: string = 'sandbox';\n\nexport const endpoints: Record<string, string> = {\n 'benji_connect_auth_url':'https://verifyapp-staging.withbenji.com',\n 'benji_connect_auth_service_url' : 'https://authservice-staging.withbenji.com'\n}","export const project_environment: string = 'development';\n\nexport const endpoints: Record<string, string> = {\n 'benji_connect_auth_url': 'https://verifyapp-dev.withbenji.com',\n 'benji_connect_auth_service_url': 'https://authservice-dev.withbenji.com',\n};","/**\n * Build-time fallback when gitignored `local.ts` is absent (CI, fresh clones).\n * Same endpoints as development — not machine-specific localhost overrides.\n * Copy to `local.ts` locally for localhost URLs; see RELEASE.md.\n */\nexport const project_environment: string = 'local';\n\nexport const endpoints: Record<string, string> = {\n benji_connect_auth_url: 'https://verifyapp-dev.withbenji.com',\n benji_connect_auth_service_url: 'https://authservice-dev.withbenji.com',\n};\n","/** Hostnames that browsers use for loopback when typed literally in the URL bar. */\nexport const LOCAL_HOSTNAMES = ['localhost', '127.0.0.1', '::1', '[::1]'] as const;\n\nconst LOCAL_HOSTNAME_SET: ReadonlySet<string> = new Set(LOCAL_HOSTNAMES);\n\nexport function isLocalHost(\n hostname: string = typeof window !== 'undefined' ? window.location.hostname : ''\n): boolean {\n if (LOCAL_HOSTNAME_SET.has(hostname)) {\n return true;\n }\n // IPv4 loopback block 127.0.0.0/8 — covers 127.0.0.1 without listing every address\n if (hostname.startsWith('127.')) {\n return true;\n }\n return false;\n}\n","import * as productionConfig from './production';\nimport * as sandboxConfig from './sandbox';\nimport * as developmentConfig from './development';\nimport * as localConfig from './local';\nimport { BenjiConnectEnvironment } from '../types/config';\nimport { isLocalHost } from '../utils/environment';\n\nexport type EnvironmentConfigModule = {\n project_environment: string;\n endpoints: Record<string, string>;\n};\n\nconst env = typeof process !== 'undefined' ? process.env : {};\nlet data: EnvironmentConfigModule = developmentConfig;\ntype EndpointConfig = typeof developmentConfig.endpoints;\nexport let Endpoints: EndpointConfig = getEndpoints();\nexport let Environment = BenjiConnectEnvironment.DEVELOPMENT;\n\nexport function configureConfig(environment: BenjiConnectEnvironment) {\n if (environment == 'production') {\n console.log('[Connect SDK] configuring with environment production');\n data = productionConfig;\n } else if (environment == 'sandbox') {\n console.log('[Connect SDK] configuring with environment sandbox');\n data = sandboxConfig;\n } else if (environment == 'development') {\n console.log('[Connect SDK] configuring with environment development');\n data = developmentConfig;\n } else if (environment == 'local') {\n if (isLocalHost()) {\n console.log('[Connect SDK] configuring with environment local');\n data = localConfig;\n } else {\n console.log(\n '[Connect SDK] local environment requested on non-local host; using development'\n );\n data = developmentConfig;\n }\n }\n Endpoints = getEndpoints();\n Environment = getEnvironment();\n}\n\nfunction getEndpoints(): EndpointConfig {\n const entries = Object.entries(data.endpoints).map(([key, value]) => {\n const override = env?.[key] || value;\n return [key, override] as const;\n });\n return Object.fromEntries(entries) as EndpointConfig;\n}\n\nfunction getEnvironment(): BenjiConnectEnvironment {\n return data['project_environment'] as BenjiConnectEnvironment;\n}\n\nexport const Namespace = __NAMESPACE__;\nexport const Version = __VERSION__;\n","import { BenjiConnectEnvironment } from \"../types/config\";\nimport { isLocalHost } from \"./environment\";\n\nexport const buildContext = () => ({\n namespace: typeof __NAMESPACE__ !== 'undefined' && __NAMESPACE__ ? __NAMESPACE__ : 'benji-connect-sdk',\n version: typeof __VERSION__ !== 'undefined' && __VERSION__ ? String(__VERSION__) : '0.0.0',\n});\n\nexport function isBenjiConnectEnvironment(\n environment: unknown\n): environment is BenjiConnectEnvironment {\n return (\n environment === BenjiConnectEnvironment.LOCAL ||\n environment === BenjiConnectEnvironment.DEVELOPMENT ||\n environment === BenjiConnectEnvironment.SANDBOX ||\n environment === BenjiConnectEnvironment.PRODUCTION\n );\n}\n\nexport function mapToConnectEnvironment(\n environment: BenjiConnectEnvironment | string\n): BenjiConnectEnvironment {\n\n if (isBenjiConnectEnvironment(environment)) return environment;\n\n const environments: Record<string, BenjiConnectEnvironment> = {\n local: BenjiConnectEnvironment.LOCAL,\n development: BenjiConnectEnvironment.DEVELOPMENT,\n sandbox: BenjiConnectEnvironment.SANDBOX,\n production: BenjiConnectEnvironment.PRODUCTION,\n };\n const mapped = environments[environment];\n if (mapped) return mapped;\n\n const defaultEnvironment = isLocalHost()\n ? BenjiConnectEnvironment.LOCAL\n : BenjiConnectEnvironment.DEVELOPMENT;\n console.warn(`[Benji Connect SDK] ${environment} not valid environment defaulting to ${defaultEnvironment}`);\n\n return defaultEnvironment;\n}","const LOGIN_POPUP_TITLE = 'User sign-in';\nconst LOGIN_POPUP_MESSAGE = 'Loading sign-in\\u2026';\n\nexport function buildLoginPopupLoadingHtml(): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>${LOGIN_POPUP_TITLE}</title>\n <style>\n * { box-sizing: border-box; }\n html, body {\n margin: 0;\n height: 100%;\n background: #fff;\n }\n body {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n font-family: Inter, system-ui, -apple-system, sans-serif;\n }\n .loading-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 14px;\n padding: 24px;\n max-width: 320px;\n transform: translateY(-28px);\n }\n .loader {\n width: 48px;\n height: 48px;\n border: 3px solid #e5e7eb;\n border-top-color: #9ca3af;\n border-radius: 50%;\n animation: spin 0.75s linear infinite;\n }\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n .loading-text {\n font-size: 16px;\n text-align: center;\n font-family: Inter, sans-serif;\n margin: 0;\n background: linear-gradient(\n 90deg,\n #374151 0%,\n #9ca3af 50%,\n #374151 100%\n );\n background-size: 200% 100%;\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n animation: shimmer 1.8s ease-in-out infinite;\n }\n @keyframes shimmer {\n 0% { background-position: 100% 0; }\n 100% { background-position: -100% 0; }\n }\n </style>\n</head>\n<body>\n <div class=\"loading-content\">\n <div class=\"loader\" aria-hidden=\"true\"></div>\n <p class=\"loading-text\">${LOGIN_POPUP_MESSAGE}</p>\n </div>\n</body>\n</html>`;\n}\n\nexport function writeLoginPopupLoadingDocument(popup: Window): void {\n try {\n popup.document.open();\n popup.document.write(buildLoginPopupLoadingHtml());\n popup.document.close();\n } catch (error) {\n console.warn('[Connect SDK] Failed to write LOGIN popup loading document', error);\n }\n}\n","export const LOGIN_POPUP_QUERY_FLAG = 'benji_login_popup';\n\nexport function ensureAuthLinkStateNonce(url: string, nonce: string): string {\n try {\n const parsed = new URL(url);\n if (!parsed.searchParams.get('state')) {\n parsed.searchParams.set('state', nonce);\n }\n return parsed.toString();\n } catch {\n if (url.includes('state=')) {\n return url;\n }\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}state=${encodeURIComponent(nonce)}`;\n }\n}\n\n/** Appends `benji_login_popup=1` without altering other query params (e.g. PKCE `state`). */\nexport function appendLoginPopupFlag(url: string): string {\n try {\n const parsed = new URL(url);\n parsed.searchParams.set(LOGIN_POPUP_QUERY_FLAG, '1');\n return parsed.toString();\n } catch {\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}${LOGIN_POPUP_QUERY_FLAG}=1`;\n }\n}\n\nexport function preparePartnerAuthUrl(url: string, nonce: string): string {\n return ensureAuthLinkStateNonce(url, nonce);\n}\n","/**\n * Anchor-based iframe placement and host DOM application. Naming follows Floating UI /\n * Popper conventions (`bottom-end`, `bottom-start`). Computes layout rects, applies styles\n * to overlay/iframe elements, and manages reposition listeners.\n * @see https://floating-ui.com/docs/computePosition#placement\n */\n\nimport {\n BenjiConnectPlacement,\n type BenjiConnectAnchor,\n type BenjiConnectConfig,\n type BenjiConnectPlacementOffset,\n} from '../types/config';\n\nexport const IFRAME_WIDTH = 400;\nexport const IFRAME_HEIGHT = 645;\n\n/** LOGIN partner-auth popup dimensions (SDK-managed window). */\nexport const POPUP_WIDTH = 420;\nexport const POPUP_HEIGHT = 640;\n\nconst IFRAME_STATIC_STYLE: CSSStyleDeclaration = {\n border: 'none',\n borderRadius: '20px',\n overflow: 'hidden',\n} as CSSStyleDeclaration;\n\nconst CONTAINER_BASE_STYLE: CSSStyleDeclaration = {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n backgroundColor: 'rgba(0,0,0,0.5)',\n zIndex: '9999',\n} as CSSStyleDeclaration;\n\nconst VIEWPORT_PADDING = 8;\n\nexport interface IframeRect {\n top: number;\n left: number;\n width: number;\n height: number;\n placement: BenjiConnectPlacement;\n}\n\nexport interface ViewportSize {\n width: number;\n height: number;\n}\n\nexport interface ResolveIframeLayoutOptions {\n warnOnInvalidAnchor?: boolean;\n preserveAnchoredLayout?: IframeRect | null;\n}\n\nfunction isPreservableAnchoredLayout(\n layout: IframeRect | null | undefined,\n): layout is IframeRect {\n return (\n layout != null && layout.placement !== BenjiConnectPlacement.CENTER\n );\n}\n\nfunction clampPreservedAnchoredLayout(\n layout: IframeRect,\n viewport: ViewportSize,\n): IframeRect {\n const maxLeft = viewport.width - layout.width - VIEWPORT_PADDING;\n const maxTop = viewport.height - layout.height - VIEWPORT_PADDING;\n const minLeft = VIEWPORT_PADDING;\n const minTop = VIEWPORT_PADDING;\n\n return {\n ...layout,\n left:\n maxLeft < minLeft\n ? minLeft\n : Math.min(Math.max(layout.left, minLeft), maxLeft),\n top:\n maxTop < minTop\n ? minTop\n : Math.min(Math.max(layout.top, minTop), maxTop),\n };\n}\n\nfunction preservedAnchoredLayoutOrCenter(\n viewport: ViewportSize,\n options: ResolveIframeLayoutOptions,\n): IframeRect {\n const { preserveAnchoredLayout } = options;\n if (isPreservableAnchoredLayout(preserveAnchoredLayout)) {\n return clampPreservedAnchoredLayout(preserveAnchoredLayout, viewport);\n }\n return centerLayout(viewport);\n}\n\nfunction isRefLikeAnchor(\n anchor: BenjiConnectAnchor,\n): anchor is { value: HTMLElement | null | undefined } {\n return (\n typeof anchor === 'object' &&\n anchor !== null &&\n !(anchor instanceof HTMLElement) &&\n 'value' in anchor\n );\n}\n\nexport function resolveAnchor(\n anchor: BenjiConnectAnchor | undefined,\n): HTMLElement | null {\n if (!anchor) {\n return null;\n }\n if (typeof anchor === 'string') {\n return document.querySelector<HTMLElement>(anchor);\n }\n if (typeof anchor === 'function') {\n const resolved = anchor();\n return resolved instanceof HTMLElement ? resolved : null;\n }\n if (isRefLikeAnchor(anchor)) {\n const el = anchor.value;\n return el instanceof HTMLElement ? el : null;\n }\n return anchor instanceof HTMLElement ? anchor : null;\n}\n\nexport function isAnchorVisible(el: HTMLElement): boolean {\n if (!el.isConnected) {\n return false;\n }\n const style = window.getComputedStyle(el);\n if (style.display === 'none' || style.visibility === 'hidden') {\n return false;\n }\n const rect = el.getBoundingClientRect();\n return rect.width > 0 || rect.height > 0;\n}\n\nexport function resolveEffectivePlacement(\n config: Pick<BenjiConnectConfig, 'anchor' | 'placement'>,\n): BenjiConnectPlacement {\n if (!config.anchor) {\n return BenjiConnectPlacement.CENTER;\n }\n return config.placement ?? BenjiConnectPlacement.BOTTOM_END;\n}\n\nexport function defaultOffset(\n offset?: BenjiConnectPlacementOffset,\n): Required<BenjiConnectPlacementOffset> {\n return {\n top: offset?.top ?? 0,\n left: offset?.left ?? 0,\n };\n}\n\nexport function resolveIframeDimensions(viewport: ViewportSize): {\n width: number;\n height: number;\n} {\n const maxW = viewport.width - 2 * VIEWPORT_PADDING;\n const maxH = viewport.height - 2 * VIEWPORT_PADDING;\n const scale = Math.min(1, maxW / IFRAME_WIDTH, maxH / IFRAME_HEIGHT);\n return {\n width: Math.floor(IFRAME_WIDTH * scale),\n height: Math.floor(IFRAME_HEIGHT * scale),\n };\n}\n\nexport function iframeFitsHorizontally(\n viewportWidth: number,\n iframeWidth: number = IFRAME_WIDTH,\n): boolean {\n return viewportWidth >= iframeWidth + 2 * VIEWPORT_PADDING;\n}\n\nfunction centerLayout(viewport: ViewportSize): IframeRect {\n const { width, height } = resolveIframeDimensions(viewport);\n return {\n top: 0,\n left: 0,\n width,\n height,\n placement: BenjiConnectPlacement.CENTER,\n };\n}\n\nexport function fitsBelow(\n anchorBottom: number,\n offsetTop: number,\n viewportHeight: number,\n iframeHeight: number = IFRAME_HEIGHT,\n): boolean {\n const top = anchorBottom + offsetTop;\n const bottom = top + iframeHeight;\n return (\n top >= VIEWPORT_PADDING && bottom <= viewportHeight - VIEWPORT_PADDING\n );\n}\n\nfunction clampHorizontal(left: number, viewportWidth: number): number {\n const min = VIEWPORT_PADDING;\n const max = viewportWidth - IFRAME_WIDTH - VIEWPORT_PADDING;\n if (max < min) {\n return min;\n }\n return Math.min(Math.max(left, min), max);\n}\n\nfunction warnInvalidAnchor(message: string): void {\n console.warn(`[Benji Connect SDK] ${message}`);\n}\n\nexport function computeIframeRect(\n anchorElement: HTMLElement,\n placement: BenjiConnectPlacement,\n offset: BenjiConnectPlacementOffset,\n viewport: ViewportSize,\n options: ResolveIframeLayoutOptions = {},\n): IframeRect {\n const { warnOnInvalidAnchor = false } = options;\n const resolvedOffset = defaultOffset(offset);\n\n if (placement === BenjiConnectPlacement.CENTER) {\n return centerLayout(viewport);\n }\n\n if (!isAnchorVisible(anchorElement)) {\n if (isPreservableAnchoredLayout(options.preserveAnchoredLayout)) {\n return clampPreservedAnchoredLayout(\n options.preserveAnchoredLayout,\n viewport,\n );\n }\n if (warnOnInvalidAnchor) {\n warnInvalidAnchor(\n 'anchor is hidden or detached; falling back to centered modal',\n );\n }\n return centerLayout(viewport);\n }\n\n const rect = anchorElement.getBoundingClientRect();\n\n if (!fitsBelow(rect.bottom, resolvedOffset.top, viewport.height)) {\n return centerLayout(viewport);\n }\n\n if (!iframeFitsHorizontally(viewport.width)) {\n return centerLayout(viewport);\n }\n\n const top = rect.bottom + resolvedOffset.top;\n const idealLeft =\n placement === BenjiConnectPlacement.BOTTOM_END\n ? rect.right - IFRAME_WIDTH + resolvedOffset.left\n : rect.left + resolvedOffset.left;\n\n if (idealLeft < VIEWPORT_PADDING) {\n if (warnOnInvalidAnchor) {\n warnInvalidAnchor(\n 'anchor rect is unusable for placement; falling back to centered modal',\n );\n }\n return centerLayout(viewport);\n }\n\n const left = clampHorizontal(idealLeft, viewport.width);\n\n return {\n top,\n left,\n width: IFRAME_WIDTH,\n height: IFRAME_HEIGHT,\n placement,\n };\n}\n\nexport function resolveIframeLayout(\n config: BenjiConnectConfig,\n viewport: ViewportSize = {\n width: window.innerWidth,\n height: window.innerHeight,\n },\n options: ResolveIframeLayoutOptions = {},\n): IframeRect {\n const { warnOnInvalidAnchor = true } = options;\n const placement = resolveEffectivePlacement(config);\n const anchorElement = resolveAnchor(config.anchor);\n\n if (\n warnOnInvalidAnchor &&\n placement !== BenjiConnectPlacement.CENTER &&\n !anchorElement\n ) {\n warnInvalidAnchor('anchor not found; falling back to centered modal');\n return preservedAnchoredLayoutOrCenter(viewport, options);\n }\n\n if (placement === BenjiConnectPlacement.CENTER) {\n return centerLayout(viewport);\n }\n\n if (!anchorElement) {\n return preservedAnchoredLayoutOrCenter(viewport, options);\n }\n\n return computeIframeRect(\n anchorElement,\n placement,\n config.offset,\n viewport,\n options,\n );\n}\n\n// --- DOM application ---\n\nexport interface IframeLayoutState {\n layout: IframeRect;\n lastValidAnchoredLayout: IframeRect | null;\n}\n\nexport interface RepositionListenerHandle {\n remove(): void;\n}\n\nexport function applyOverlayBaseStyle(container: HTMLDivElement): void {\n Object.assign(container.style, CONTAINER_BASE_STYLE);\n}\n\nfunction getVisualViewportOffset(): { top: number; left: number } {\n const vv = window.visualViewport;\n if (!vv) {\n return { top: 0, left: 0 };\n }\n return { top: vv.offsetTop, left: vv.offsetLeft };\n}\n\nfunction getRepositionScrollTargets(\n anchor: BenjiConnectAnchor | undefined,\n): Array<Window | HTMLElement> {\n const targets = new Set<Window | HTMLElement>([window]);\n const anchorElement = resolveAnchor(anchor);\n\n if (!anchorElement) {\n return [...targets];\n }\n\n targets.add(anchorElement);\n\n let parent: HTMLElement | null = anchorElement.parentElement;\n while (parent) {\n const { overflow, overflowX, overflowY } = window.getComputedStyle(parent);\n const overflowValue = `${overflow} ${overflowX} ${overflowY}`;\n\n if (/(auto|scroll|overlay)/.test(overflowValue)) {\n targets.add(parent);\n }\n\n parent = parent.parentElement;\n }\n\n return [...targets];\n}\n\nexport function applyIframeLayoutToElements(\n config: BenjiConnectConfig,\n container: HTMLDivElement,\n iframe: HTMLIFrameElement,\n state: IframeLayoutState,\n options: ResolveIframeLayoutOptions = { warnOnInvalidAnchor: false },\n): void {\n state.layout = resolveIframeLayout(config, undefined, {\n ...options,\n preserveAnchoredLayout: state.lastValidAnchoredLayout,\n });\n\n if (state.layout.placement !== BenjiConnectPlacement.CENTER) {\n state.lastValidAnchoredLayout = state.layout;\n }\n\n const iframeStyle = {\n ...IFRAME_STATIC_STYLE,\n width: `${state.layout.width}px`,\n height: `${state.layout.height}px`,\n };\n\n if (state.layout.placement === BenjiConnectPlacement.CENTER) {\n Object.assign(container.style, {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'auto',\n });\n Object.assign(iframe.style, iframeStyle, {\n position: 'relative',\n top: '',\n left: '',\n });\n return;\n }\n\n Object.assign(container.style, {\n display: 'block',\n overflow: 'auto',\n });\n\n const viewportOffset = getVisualViewportOffset();\n Object.assign(iframe.style, iframeStyle, {\n position: 'fixed',\n top: `${state.layout.top + viewportOffset.top}px`,\n left: `${state.layout.left + viewportOffset.left}px`,\n });\n}\n\nexport interface PopupScreenPosition {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nexport interface PopupLayoutState {\n lastValidAnchoredLayout: IframeRect | null;\n}\n\nfunction popupFitsBelow(\n anchorBottom: number,\n offsetTop: number,\n viewportHeight: number,\n): boolean {\n const top = anchorBottom + offsetTop;\n const bottom = top + POPUP_HEIGHT;\n return (\n top >= VIEWPORT_PADDING && bottom <= viewportHeight - VIEWPORT_PADDING\n );\n}\n\nfunction popupFitsHorizontally(viewportWidth: number): boolean {\n return viewportWidth >= POPUP_WIDTH + 2 * VIEWPORT_PADDING;\n}\n\nfunction clampPopupHorizontal(left: number, viewportWidth: number): number {\n const min = VIEWPORT_PADDING;\n const max = viewportWidth - POPUP_WIDTH - VIEWPORT_PADDING;\n if (max < min) {\n return min;\n }\n return Math.min(Math.max(left, min), max);\n}\n\nfunction centerPopupViewportRect(viewport: ViewportSize): IframeRect {\n const left = Math.max(\n VIEWPORT_PADDING,\n (viewport.width - POPUP_WIDTH) / 2,\n );\n const top = Math.max(\n VIEWPORT_PADDING,\n (viewport.height - POPUP_HEIGHT) / 2,\n );\n return {\n top,\n left,\n width: POPUP_WIDTH,\n height: POPUP_HEIGHT,\n placement: BenjiConnectPlacement.CENTER,\n };\n}\n\nfunction computePopupViewportRect(\n anchorElement: HTMLElement,\n placement: BenjiConnectPlacement,\n offset: BenjiConnectPlacementOffset,\n viewport: ViewportSize,\n options: ResolveIframeLayoutOptions = {},\n): IframeRect {\n const { warnOnInvalidAnchor = false } = options;\n const resolvedOffset = defaultOffset(offset);\n\n if (placement === BenjiConnectPlacement.CENTER) {\n return centerPopupViewportRect(viewport);\n }\n\n if (!isAnchorVisible(anchorElement)) {\n if (isPreservableAnchoredLayout(options.preserveAnchoredLayout)) {\n return clampPreservedAnchoredLayout(\n options.preserveAnchoredLayout,\n viewport,\n );\n }\n if (warnOnInvalidAnchor) {\n warnInvalidAnchor(\n 'anchor is hidden or detached; falling back to centered popup',\n );\n }\n return centerPopupViewportRect(viewport);\n }\n\n const rect = anchorElement.getBoundingClientRect();\n\n if (!popupFitsBelow(rect.bottom, resolvedOffset.top, viewport.height)) {\n return centerPopupViewportRect(viewport);\n }\n\n if (!popupFitsHorizontally(viewport.width)) {\n return centerPopupViewportRect(viewport);\n }\n\n const top = rect.bottom + resolvedOffset.top;\n const idealLeft =\n placement === BenjiConnectPlacement.BOTTOM_END\n ? rect.right - POPUP_WIDTH + resolvedOffset.left\n : rect.left + resolvedOffset.left;\n\n if (idealLeft < VIEWPORT_PADDING) {\n if (warnOnInvalidAnchor) {\n warnInvalidAnchor(\n 'anchor rect is unusable for popup placement; falling back to centered popup',\n );\n }\n return centerPopupViewportRect(viewport);\n }\n\n const left = clampPopupHorizontal(idealLeft, viewport.width);\n\n return {\n top,\n left,\n width: POPUP_WIDTH,\n height: POPUP_HEIGHT,\n placement,\n };\n}\n\nexport function resolvePopupViewportLayout(\n config: BenjiConnectConfig,\n viewport: ViewportSize = {\n width: window.innerWidth,\n height: window.innerHeight,\n },\n options: ResolveIframeLayoutOptions = {},\n): IframeRect {\n const { warnOnInvalidAnchor = true } = options;\n const placement = resolveEffectivePlacement(config);\n const anchorElement = resolveAnchor(config.anchor);\n\n if (\n warnOnInvalidAnchor &&\n placement !== BenjiConnectPlacement.CENTER &&\n !anchorElement\n ) {\n warnInvalidAnchor('anchor not found; falling back to centered popup');\n if (isPreservableAnchoredLayout(options.preserveAnchoredLayout)) {\n return clampPreservedAnchoredLayout(\n options.preserveAnchoredLayout,\n viewport,\n );\n }\n return centerPopupViewportRect(viewport);\n }\n\n if (placement === BenjiConnectPlacement.CENTER || !anchorElement) {\n return centerPopupViewportRect(viewport);\n }\n\n return computePopupViewportRect(\n anchorElement,\n placement,\n config.offset,\n viewport,\n options,\n );\n}\n\nexport function computePopupScreenPosition(\n config: BenjiConnectConfig,\n state: PopupLayoutState = { lastValidAnchoredLayout: null },\n options: ResolveIframeLayoutOptions = {},\n): PopupScreenPosition {\n const layout = resolvePopupViewportLayout(config, undefined, {\n ...options,\n preserveAnchoredLayout: state.lastValidAnchoredLayout,\n });\n\n if (layout.placement !== BenjiConnectPlacement.CENTER) {\n state.lastValidAnchoredLayout = layout;\n }\n\n const viewportOffset = getVisualViewportOffset();\n\n return {\n left: window.screenX + layout.left + viewportOffset.left,\n top: window.screenY + layout.top + viewportOffset.top,\n width: layout.width,\n height: layout.height,\n };\n}\n\nexport function buildLoginPopupFeatures(position: PopupScreenPosition): string {\n return [\n `width=${position.width}`,\n `height=${position.height}`,\n `left=${Math.round(position.left)}`,\n `top=${Math.round(position.top)}`,\n 'scrollbars=yes',\n 'resizable=yes',\n ].join(',');\n}\n\nexport function applyHeadlessContainerStyle(container: HTMLDivElement): void {\n Object.assign(container.style, {\n position: 'fixed',\n top: '0',\n left: '-9999px',\n width: '1px',\n height: '1px',\n overflow: 'hidden',\n pointerEvents: 'none',\n backgroundColor: 'transparent',\n opacity: '0',\n zIndex: '-1',\n });\n}\n\nexport function applyHeadlessIframeStyle(iframe: HTMLIFrameElement): void {\n Object.assign(iframe.style, {\n position: 'absolute',\n top: '0',\n left: '0',\n width: '1px',\n height: '1px',\n border: 'none',\n opacity: '0',\n pointerEvents: 'none',\n });\n}\n\nexport function attachRepositionListeners(\n config: Pick<BenjiConnectConfig, 'anchor'>,\n onReposition: () => void,\n): RepositionListenerHandle {\n const repositionHandler = onReposition;\n const repositionScrollTargets = getRepositionScrollTargets(config.anchor);\n repositionScrollTargets.forEach((target) => {\n target.addEventListener('scroll', repositionHandler, { passive: true });\n });\n window.addEventListener('resize', repositionHandler);\n\n const visualViewport = window.visualViewport;\n visualViewport?.addEventListener('resize', repositionHandler);\n visualViewport?.addEventListener('scroll', repositionHandler);\n\n return {\n remove() {\n repositionScrollTargets.forEach((target) => {\n target.removeEventListener('scroll', repositionHandler);\n });\n window.removeEventListener('resize', repositionHandler);\n visualViewport?.removeEventListener('resize', repositionHandler);\n visualViewport?.removeEventListener('scroll', repositionHandler);\n },\n };\n}\n","import { BenjiConnectAuthAction } from \"./auth\";\n\n// Known event names coming from the SDK transport (postMessage)\nexport enum BenjiConnectEventType {\n AUTH_SUCCESS = 'AUTH_SUCCESS',\n FLOW_EXIT = 'FLOW_EXIT',\n FLOW_SUCCESS = 'FLOW_SUCCESS',\n EVENT = 'EVENT',\n ERROR = 'ERROR',\n PARTNER_LOGIN_OPEN = 'PARTNER_LOGIN_OPEN',\n}\n\nexport interface BenjiConnectPartnerLoginOpenEventData {\n url: string | null;\n title?: string;\n}\n\n// Known exit trigger types coming from the SDK transport (postMessage)\nexport enum BenjiConnectExitTrigger {\n ACTION_BUTTON_CLICKED = 'ACTION_BUTTON_CLICKED',\n BACK_TO_MERCHANT_CLICKED = 'BACK_TO_MERCHANT_CLICKED', // deprecated\n CLOSE_BUTTON_CLICKED = 'CLOSE_BUTTON_CLICKED',\n TAPPED_OUT_OF_BOUNDS = 'TAPPED_OUT_OF_BOUNDS',\n /** User closed the LOGIN partner-auth popup window. */\n POPUP_CLOSED = 'POPUP_CLOSED',\n}\n\nexport enum BenjiConnectErrorName {\n UNEXPECTED_ERROR = 'unexpected_error',\n PARTNER_CONNECT_ERROR = 'partner_connect_error'\n}\n\nexport type BenjiConnectErrorID = '400' | '500'; // Placeholders for now\n\n// Transport-layer token (raw, unprocessed from postMessage)\nexport interface BenjiConnectEventToken {\n access_token?: string;\n refresh_token?: string;\n expires_at?: string | number;\n exchange_token?: string;\n}\n\nexport interface BenjiConnectEventUserData {\n user: {\n id: number\n first_name: string\n last_name: string\n uuid?: string\n }\n status: BenjiConnectEventUserStatusData\n extra_data?: {\n total_rewards_earned?: number\n total_rewards_redeemed?: number\n created_date?: string\n }\n}\n\nexport interface BenjiConnectEventTransactionData {\n action: string;\n amount: number;\n trigger_event_id: string;\n trigger_name: string;\n}\n\nexport interface BenjiConnectEventUserStatusData {\n status_id: string\n num_of_rewards: number\n reward_status: string\n partner_status_tier_id?: number\n}\n\n// Basic structure for Benji Connect SDK typed events\nexport interface BenjiConnectEvent {\n type: BenjiConnectEventType;\n data?: BenjiConnectEventData;\n}\n\nexport interface BenjiConnectEventData {\n [k: string]: unknown;\n}\n\nexport interface BenjiConnectEventMessage<K extends BenjiConnectEventType = BenjiConnectEventType> {\n type: K; // discriminant\n data: BenjiConnectEventDataMap[K];\n}\n\nexport interface BenjiConnectAuthSuccessEventData {\n action: BenjiConnectAuthAction;\n metadata?: BenjiConnectEventUserData;\n token?: BenjiConnectEventToken,\n transaction?: BenjiConnectEventTransactionData;\n}\n\nexport interface BenjiConnectFlowExitEventData {\n step: string;\n trigger: BenjiConnectExitTrigger;\n}\n\nexport interface BenjiConnectErrorEventData {\n error: Error;\n}\n\n// Canonical event map \nexport type BenjiConnectEventDataMap = {\n [BenjiConnectEventType.AUTH_SUCCESS]: BenjiConnectAuthSuccessEventData;\n [BenjiConnectEventType.FLOW_EXIT]: BenjiConnectFlowExitEventData;\n [BenjiConnectEventType.FLOW_SUCCESS]: BenjiConnectAuthSuccessEventData;\n [BenjiConnectEventType.EVENT]: BenjiConnectEventData;\n [BenjiConnectEventType.ERROR]: BenjiConnectErrorEventData;\n [BenjiConnectEventType.PARTNER_LOGIN_OPEN]: BenjiConnectPartnerLoginOpenEventData;\n\n // Optional catch-all fan-out\n '*': { type: BenjiConnectEventType; data: BenjiConnectEventDataMap[BenjiConnectEventType] };\n};","import { BenjiConnectAuthToken } from '../types/auth';\nimport { BenjiConnectMode } from '../types/config';\nimport { BenjiConnectEventToken, BenjiConnectEventType } from '../types/event';\n\n/**\n * Mirrored from Benji Connect AuthMessageType — transport routing only.\n * Keep aligned with Benji Connect/src/types/messege.ts\n */\nconst AUTH_MESSAGE_TYPES = new Set([\n 'auth_config',\n 'code_received',\n 'code_verification_error',\n 'loyalty_verification',\n 'phone_verification',\n 'request_auth_config',\n 'request_code_exchange',\n 'request_code_with_login',\n 'request_code_with_phone',\n 'request_loyalty_verification',\n 'request_phone_verification',\n]);\n\nconst CONNECT_MESSAGE_TYPES = new Set<string>(Object.values(BenjiConnectEventType));\n\nexport function isAuthMessageType(data: unknown): boolean {\n if (!data || typeof data !== 'object') return false;\n const type = (data as { type?: string }).type;\n return typeof type === 'string' && AUTH_MESSAGE_TYPES.has(type);\n}\n\nexport function shouldRelayMessage(mode: BenjiConnectMode | undefined, data: unknown): boolean {\n return mode === BenjiConnectMode.LOGIN && isAuthMessageType(data);\n}\n\nexport function isConnectMessageType(data: unknown): boolean {\n if (!data || typeof data !== 'object') return false;\n const type = (data as { type?: string }).type;\n return typeof type === 'string' && CONNECT_MESSAGE_TYPES.has(type);\n}\n\nexport const extractAccessToken = (token?: BenjiConnectEventToken | string): string =>\n typeof token === 'string' ? token : (token?.access_token ?? '');\n\nexport const extractExchangeToken = (token?: BenjiConnectEventToken | string): string =>\n typeof token === 'string' ? token : (token?.exchange_token ?? '');\n\nexport const mapEventToConnectToken = (data?: BenjiConnectEventToken): BenjiConnectAuthToken => ({\n access_token: data?.access_token ?? '',\n refresh_token: data?.refresh_token ?? '',\n expires_at: data?.expires_at ?? ''\n});\n","import { BenjiConnectEventUserData } from \"../types/event\";\nimport { BenjiConnectUserData } from \"../types/user\";\n\nexport function isConnectUserData (\n input: BenjiConnectUserData | Record<string, any>\n): boolean {\n if (!input) return false;\n const data = mapEventToConnectUserData(input);\n if (data.user.id != 0) return true;\n return false;\n}\n\nexport const mapEventToConnectUserData = (\n data?: BenjiConnectEventUserData | Record<string, any>\n): BenjiConnectUserData => ({\n user: {\n id: data?.user?.id ?? 0,\n first_name: data?.user?.first_name ?? '',\n last_name: data?.user?.last_name ?? '',\n uuid: data?.user?.uuid \n },\n status: {\n status_id: data?.status?.status_id ?? '',\n num_of_rewards: data?.status?.num_of_rewards ?? 0,\n reward_status: data?.status?.reward_status ?? '',\n partner_status_tier_id: data?.status?.partner_status_tier_id\n },\n extra_data: {\n total_rewards_earned: data?.extra_data?.total_rewards_earned,\n total_rewards_redeemed: data?.extra_data?.total_rewards_redeemed,\n created_date: data?.extra_data?.created_date\n }\n});\n","import { BenjiConnectEventTransactionData } from \"../types/event\";\nimport { BenjiConnectTransactionData } from \"../types/transaction\";\n\nexport const mapEventToConnectTransactionData = (data?: BenjiConnectEventTransactionData): BenjiConnectTransactionData | null => {\n if (!data) return null;\n return {\n action: data.action,\n amount: data.amount,\n trigger_event_id: data.trigger_event_id,\n trigger_name: data.trigger_name\n };\n}","import {\n BenjiConnectMetadata,\n BenjiConnectMode,\n BenjiConnectOnErrorData,\n BenjiConnectOnEventData,\n BenjiConnectOnExitData,\n BenjiConnectOnExitMetadata,\n BenjiConnectOnSuccessData,\n BenjiConnectOnSuccessMetadata,\n} from './config';\n\nimport { \n extractAccessToken,\n extractExchangeToken,\n mapEventToConnectToken \n} from '../utils/auth';\n\nimport { BenjiConnectAuthAction } from './auth';\n\nimport { buildContext } from '../utils/config';\nimport { mapEventToConnectUserData } from '../utils/user';\n\nimport { \n BenjiConnectAuthSuccessEventData,\n BenjiConnectErrorEventData, \n BenjiConnectEventDataMap, \n BenjiConnectEventMessage, \n BenjiConnectEventType, \n BenjiConnectFlowExitEventData\n} from './event';\nimport { mapEventToConnectTransactionData } from '../utils/transaction';\n\nexport type MessageRouterLoginContext = {\n iframe: HTMLIFrameElement | null;\n loginPopup: Window | null;\n mode: BenjiConnectMode;\n};\n\nexport type MessageRouterConfig = {\n onSuccess?: (\n token: string, \n metadata: BenjiConnectOnSuccessMetadata\n ) => void;\n onError?: (\n error: Error,\n error_id: string,\n metadata: BenjiConnectMetadata\n ) => void;\n onExit?: (\n metadata: BenjiConnectOnExitMetadata\n ) => void;\n onEvent?: (\n type: BenjiConnectEventType, \n metadata: BenjiConnectMetadata\n ) => void;\n close?: () => void;\n closeLoginPopup?: () => void;\n navigateLoginPopup?: (url: string) => void;\n};\n\nexport const mapToAuthSuccessData = (\n message: BenjiConnectEventMessage<BenjiConnectEventType.AUTH_SUCCESS>,\n data: BenjiConnectAuthSuccessEventData\n): BenjiConnectOnEventData => {\n return {\n type: message.type,\n metadata: {\n context: buildContext(),\n action: data.action,\n token: mapEventToConnectToken(data.token),\n transactionData: mapEventToConnectTransactionData(data.transaction),\n userData: mapEventToConnectUserData(data.metadata)\n }\n };\n};\n\nexport const mapToOnExitData = (data: BenjiConnectFlowExitEventData): BenjiConnectOnExitData => {\n return {\n metadata: {\n context: buildContext(),\n step: data.step,\n trigger: data.trigger\n }\n };\n};\n\nexport const mapToOnSuccessData = (data: BenjiConnectAuthSuccessEventData): BenjiConnectOnSuccessData => {\n \n const token = data.action === BenjiConnectAuthAction.Login\n ? extractExchangeToken(data.token)\n : extractAccessToken(data.token);\n\n let metadata: BenjiConnectOnSuccessMetadata = {\n context: buildContext(),\n action: data.action,\n user_data: data.metadata\n };\n\n if (data.transaction) {\n metadata.transaction_data = data.transaction;\n }\n \n return { token, metadata };\n};\n\nexport const mapToOnErrorData = (data: BenjiConnectErrorEventData): BenjiConnectOnErrorData => {\n return {\n error: data.error,\n error_id: '500', // Placeholder\n metadata: {\n context: buildContext()\n }\n };\n};\n\nexport const mapToOnEventData = <K extends BenjiConnectEventType>(\n message: BenjiConnectEventMessage<K>,\n data: BenjiConnectEventDataMap[K]\n): BenjiConnectOnEventData => {\n return {\n type: message.type,\n metadata: {\n context: buildContext(),\n ...data\n }\n };\n};\n\nexport type BenjiConnectCallbackDataMap = {\n [BenjiConnectEventType.AUTH_SUCCESS]: BenjiConnectOnEventData;\n [BenjiConnectEventType.FLOW_EXIT]: BenjiConnectOnExitData;\n [BenjiConnectEventType.FLOW_SUCCESS]: BenjiConnectOnSuccessData;\n [BenjiConnectEventType.ERROR]: BenjiConnectOnErrorData;\n [BenjiConnectEventType.EVENT]: BenjiConnectOnEventData;\n '*': BenjiConnectOnEventData;\n};\n\nexport const BenjiConnectCallbackMapperMap = {\n [BenjiConnectEventType.AUTH_SUCCESS]: mapToAuthSuccessData,\n [BenjiConnectEventType.FLOW_EXIT]: mapToOnExitData,\n [BenjiConnectEventType.FLOW_SUCCESS]: mapToOnSuccessData,\n [BenjiConnectEventType.ERROR]: mapToOnErrorData,\n [BenjiConnectEventType.EVENT]: mapToOnEventData,\n} as const;\n\n","import { \n Endpoints\n} from '../config';\n\nimport { BenjiConnectMode } from '../types/config';\nimport {\n BenjiConnectEventType,\n type BenjiConnectEventMessage,\n} from '../types/event';\n\nimport type {\n BenjiConnectOnSuccessData,\n BenjiConnectOnExitData,\n BenjiConnectMetadata,\n BenjiConnectOnSuccessMetadata,\n BenjiConnectOnExitMetadata\n} from '../types/config';\n\nimport {\n BenjiConnectCallbackMapperMap,\n MessageRouterConfig,\n mapToOnEventData,\n type MessageRouterLoginContext,\n} from '../types/router';\nimport { isConnectMessageType, shouldRelayMessage } from '../utils/auth';\n\nexport class MessageRouter {\n\n static configuredListeners = false;\n static onSuccess?: (\n token: string, \n metadata: BenjiConnectOnSuccessMetadata\n ) => void;\n static onError?: (\n error: Error,\n error_id: string,\n metadata: BenjiConnectMetadata\n ) => void;\n static onExit?: (\n metadata: BenjiConnectOnExitMetadata\n ) => void;\n static onEvent?: (\n type: BenjiConnectEventType, \n metadata: BenjiConnectMetadata\n ) => void;\n static close?: () => void;\n static closeLoginPopup?: () => void;\n static navigateLoginPopup?: (url: string) => void;\n\n static iframe: HTMLIFrameElement | null = null;\n static loginPopup: Window | null = null;\n static mode: BenjiConnectMode = BenjiConnectMode.CONNECT;\n static connectOrigin = '';\n static isIframeReady = false;\n static pendingPopupAuth: MessageEvent<unknown>[] = [];\n\n static configureMessageRouter(config: MessageRouterConfig) {\n this.onSuccess = config.onSuccess;\n this.onError = config.onError;\n this.onExit = config.onExit;\n this.onEvent = config.onEvent;\n this.close = config.close;\n this.closeLoginPopup = config.closeLoginPopup;\n this.navigateLoginPopup = config.navigateLoginPopup;\n }\n\n static setLoginContext(context: MessageRouterLoginContext) {\n this.iframe = context.iframe;\n this.loginPopup = context.loginPopup;\n this.mode = context.mode;\n this.connectOrigin = new URL(Endpoints.benji_connect_auth_url).origin;\n if (this.isIframeReady) {\n this.flushPendingPopupAuth();\n }\n }\n\n static resetIframeReady() {\n this.isIframeReady = false;\n }\n\n static setMode(mode: BenjiConnectMode) {\n this.mode = mode;\n }\n\n static errorEventHandler = (event: Event) => { \n return MessageRouter.handleErrorMessage(event) \n };\n\n static messageEventHandler = (event: MessageEvent<unknown>) => { \n return MessageRouter.handleMessage(event) \n };\n\n static addEventListeners() {\n if (this.configuredListeners) return;\n window.addEventListener('error', this.errorEventHandler);\n window.addEventListener('unhandledrejection', this.errorEventHandler);\n window.addEventListener('message', this.messageEventHandler);\n this.configuredListeners = true;\n }\n\n static removeEventListeners() {\n window.removeEventListener('error', this.errorEventHandler);\n window.removeEventListener('unhandledrejection', this.errorEventHandler);\n window.removeEventListener('message', this.messageEventHandler);\n this.configuredListeners = false;\n this.iframe = null;\n this.loginPopup = null;\n this.mode = BenjiConnectMode.CONNECT;\n this.connectOrigin = '';\n this.isIframeReady = false;\n this.pendingPopupAuth = [];\n }\n\n static handleErrorMessage(event: Event) { \n switch(event.type) {\n case 'error': {\n const errorEvent = event as ErrorEvent;\n const error = errorEvent.error || new Error(errorEvent.message);\n break;\n }\n case 'unhandledrejection': {\n const rejectionEvent = event as PromiseRejectionEvent;\n const reason = rejectionEvent.reason instanceof Error\n ? rejectionEvent.reason\n : new Error(String(rejectionEvent.reason));\n break;\n }\n default: {\n console.error('[Benji Connect SDK] Received Unknown error message', event);\n break;\n }\n }\n }\n\n static relayToIframe(event: MessageEvent<unknown>) {\n const iframeWindow = this.iframe?.contentWindow;\n if (!this.isIframeReady || !iframeWindow) {\n this.pendingPopupAuth.push(event);\n return;\n }\n\n iframeWindow.postMessage(event.data, this.connectOrigin);\n }\n\n static markIframeReady(iframe: HTMLIFrameElement) {\n if (this.iframe !== iframe) return;\n this.isIframeReady = true;\n this.flushPendingPopupAuth();\n }\n\n static flushPendingPopupAuth() {\n if (!this.isIframeReady || !this.pendingPopupAuth.length) return;\n const queued = this.pendingPopupAuth;\n this.pendingPopupAuth = [];\n for (const event of queued) {\n this.relayToIframe(event);\n }\n }\n\n static relayToPopup(payload: unknown) {\n if (!this.loginPopup) {\n console.warn('[Benji Connect SDK] Skipping login auth relay, no login popup');\n return;\n }\n\n try {\n this.loginPopup.postMessage(payload, '*');\n } catch (error) {\n console.error('[Benji Connect SDK] Failed to forward login auth message to popup', error);\n }\n }\n\n static handleMessage(event: MessageEvent<unknown>) {\n if (shouldRelayMessage(this.mode, event.data) && this.loginPopup) {\n const expectedOrigin = this.connectOrigin || new URL(Endpoints.benji_connect_auth_url).origin;\n const iframeWindow = this.iframe?.contentWindow;\n\n if (event.source === this.loginPopup) {\n this.relayToIframe(event);\n return;\n }\n\n if (iframeWindow && event.source === iframeWindow) {\n if (event.origin !== expectedOrigin) {\n console.warn(\n '[Benji Connect SDK] Skipped auth relay, unexpected origin',\n event.origin,\n expectedOrigin,\n );\n return;\n }\n this.relayToPopup(event.data);\n return;\n }\n\n return;\n }\n\n if (!isConnectMessageType(event.data)) return;\n\n const expectedOrigin: string = new URL(Endpoints.benji_connect_auth_url).origin;\n if (!event || event.origin !== expectedOrigin) {\n console.warn('[Benji Connect SDK] Skipped message, received event from unexpected origin', event.origin, expectedOrigin);\n return;\n }\n\n const raw = event.data;\n if (!raw || typeof raw !== 'object') return;\n\n const partial = raw as Partial<BenjiConnectEventMessage>;\n if (typeof partial.type !== 'string') return;\n \n const message = partial as BenjiConnectEventMessage;\n\n try {\n switch (message.type) {\n\n case BenjiConnectEventType.PARTNER_LOGIN_OPEN: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.PARTNER_LOGIN_OPEN>;\n const url = connectMessage.data?.url;\n if (url) {\n this.navigateLoginPopup?.(url);\n } else {\n this.closeLoginPopup?.();\n }\n break;\n }\n\n case BenjiConnectEventType.AUTH_SUCCESS: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.AUTH_SUCCESS>;\n const callbackData = BenjiConnectCallbackMapperMap.AUTH_SUCCESS(connectMessage, connectMessage.data);\n this.onEvent?.(callbackData.type, callbackData.metadata); \n break;\n }\n\n case BenjiConnectEventType.FLOW_EXIT: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.FLOW_EXIT>;\n const callbackData = BenjiConnectCallbackMapperMap.FLOW_EXIT(connectMessage.data) as BenjiConnectOnExitData;\n this.onExit?.(callbackData.metadata);\n this.close?.();\n break;\n }\n\n case BenjiConnectEventType.FLOW_SUCCESS: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.FLOW_SUCCESS>;\n const callbackData = BenjiConnectCallbackMapperMap.FLOW_SUCCESS(connectMessage.data) as BenjiConnectOnSuccessData;\n this.onSuccess?.(callbackData.token, callbackData.metadata);\n if (this.mode === BenjiConnectMode.LOGIN) {\n this.close?.();\n }\n break;\n }\n\n case BenjiConnectEventType.ERROR: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.ERROR>;\n const callbackData = BenjiConnectCallbackMapperMap.ERROR(connectMessage.data);\n this.onError?.(callbackData.error, callbackData.error_id, callbackData.metadata);\n break;\n }\n\n case BenjiConnectEventType.EVENT: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.EVENT>;\n const callbackData = mapToOnEventData(connectMessage, connectMessage.data);\n this.onEvent?.(callbackData.type, callbackData.metadata);\n break;\n }\n\n default: {\n const _exhaustive: never = message.type;\n console.warn('[Benji Connect SDK] Unhandled connect message type', _exhaustive);\n break;\n }\n\n }\n } finally {\n // TODO: Any cleanup logic \n }\n }\n\n}\n","/// <reference path=\"./global.d.ts\" />\n\nimport { \n configureConfig, \n Endpoints\n} from './config';\n\nimport { \n type BenjiConnectConfig,\n BenjiConnectEnvironment,\n BenjiConnectMode,\n BenjiConnectPlacement,\n PartnerIntegrationType,\n} from './types/config';\n\nimport { \n buildContext, \n mapToConnectEnvironment \n} from './utils/config';\n\nimport { writeLoginPopupLoadingDocument } from './utils/loginPopupLoading';\nimport {\n appendLoginPopupFlag,\n preparePartnerAuthUrl,\n} from './utils/partnerAuthLink';\n\nimport {\n IFRAME_HEIGHT,\n IFRAME_WIDTH,\n applyHeadlessContainerStyle,\n applyHeadlessIframeStyle,\n applyIframeLayoutToElements,\n applyOverlayBaseStyle,\n attachRepositionListeners,\n buildLoginPopupFeatures,\n computePopupScreenPosition,\n type IframeLayoutState,\n type PopupLayoutState,\n type RepositionListenerHandle,\n} from './utils/placement';\n\nimport { MessageRouter } from './router/message';\nimport { BenjiConnectExitTrigger } from './types/event';\n\nconst POPUP_CLOSED_POLL_MS = 500;\n\nclass ConnectSDK {\n\n private sdkConfig: BenjiConnectConfig;\n private iframe: HTMLIFrameElement | null = null;\n private container: HTMLDivElement | null = null;\n private layoutState: IframeLayoutState = {\n layout: {\n top: 0,\n left: 0,\n width: IFRAME_WIDTH,\n height: IFRAME_HEIGHT,\n placement: BenjiConnectPlacement.CENTER,\n },\n lastValidAnchoredLayout: null,\n };\n private popupLayoutState: PopupLayoutState = {\n lastValidAnchoredLayout: null,\n };\n private repositionListeners: RepositionListenerHandle | null = null;\n private loginPopup: Window | null = null;\n private hasLoginPopupUrl = false;\n private popupClosedPollId: ReturnType<typeof setInterval> | null = null;\n private isClosing = false;\n /**\n * Aborts a pending open() when close() runs before the iframe mounts.\n * Non-DUMMY LOGIN opens the partner popup synchronously, then awaits initialize()\n * before mounting a headless iframe. Without this, close() can tear down the popup\n * while the in-flight open() still registers listeners and mounts the iframe.\n */\n private openAbortController: AbortController | null = null;\n\n private onIframeLoad = (): void => {\n if (this.isClosing || !this.iframe) return;\n MessageRouter.markIframeReady(this.iframe);\n };\n\n constructor(config: BenjiConnectConfig) {\n\n this.sdkConfig = config;\n\n // Validations\n if (!this.sdkConfig.environment) throw new Error('Environment is required');\n if (!this.sdkConfig.token) throw new Error('Connect token is required');\n\n // Set internal config for environment based on consumer input at runtime\n const environment: BenjiConnectEnvironment = mapToConnectEnvironment(this.sdkConfig.environment);\n this.sdkConfig.environment = environment;\n configureConfig(environment);\n }\n\n private resolveAuthType(): PartnerIntegrationType | undefined {\n return this.sdkConfig.tokenData?.authType ?? this.sdkConfig.authType;\n }\n\n private isLoginPopupOnly(): boolean {\n const mode = this.sdkConfig.mode ?? BenjiConnectMode.CONNECT;\n const authType = this.resolveAuthType();\n return (\n mode === BenjiConnectMode.LOGIN &&\n authType != null &&\n authType !== PartnerIntegrationType.DUMMY\n );\n }\n\n private isSessionActive(): boolean {\n return this.iframe != null || this.loginPopup != null;\n }\n\n /** Cancels any open() still running between popup pre-open and iframe mount. */\n private abortInflightOpen(): void {\n this.openAbortController?.abort();\n this.openAbortController = null;\n }\n\n async initialize() {\n \n // Configure message router for all postMessage from connect modal and error messages\n MessageRouter.configureMessageRouter({\n onSuccess: this.sdkConfig.onSuccess,\n onError: this.sdkConfig.onError,\n onExit: this.sdkConfig.onExit,\n onEvent: this.sdkConfig.onEvent,\n close: () => this.close(),\n closeLoginPopup: () => this.closeLoginPopup(),\n navigateLoginPopup: (url: string) => this.navigateLoginPopup(url),\n });\n\n // TODO: Tracker.configureWithOptions(sdkOptions);\n // TODO: Tracker.trackSDKInitialized();\n }\n\n private openLoginPopup(): boolean {\n const position = computePopupScreenPosition(\n this.sdkConfig,\n this.popupLayoutState,\n { warnOnInvalidAnchor: true },\n );\n\n const partnerAuthLink = this.sdkConfig.tokenData?.partnerAuthLink;\n const configToken = this.sdkConfig.tokenData?.configToken;\n const preparedLink =\n partnerAuthLink && configToken\n ? preparePartnerAuthUrl(partnerAuthLink, configToken)\n : partnerAuthLink;\n const popupUrl = preparedLink\n ? appendLoginPopupFlag(preparedLink)\n : 'about:blank';\n\n this.loginPopup = window.open(\n popupUrl,\n 'benji_partner_auth',\n buildLoginPopupFeatures(position),\n );\n\n if (!this.loginPopup) {\n console.warn('[Connect SDK] Failed to pre-open LOGIN partner auth popup');\n this.sdkConfig.onError?.(\n new Error('Popup blocked. Allow popups for this site and try again.'),\n '400',\n { context: buildContext() },\n );\n return false;\n }\n\n if (preparedLink) {\n this.hasLoginPopupUrl = true;\n } else {\n writeLoginPopupLoadingDocument(this.loginPopup);\n }\n this.startPopupClosedPoll();\n return true;\n }\n\n private startPopupClosedPoll(): void {\n this.stopPopupClosedPoll();\n this.popupClosedPollId = setInterval(() => {\n if (this.isClosing) return;\n if (this.loginPopup?.closed) {\n this.sdkConfig.onExit?.({\n context: buildContext(),\n trigger: BenjiConnectExitTrigger.POPUP_CLOSED,\n });\n this.close();\n }\n }, POPUP_CLOSED_POLL_MS);\n }\n\n private stopPopupClosedPoll(): void {\n if (this.popupClosedPollId != null) {\n clearInterval(this.popupClosedPollId);\n this.popupClosedPollId = null;\n }\n }\n\n private repositionLoginPopup(): void {\n if (!this.loginPopup || this.loginPopup.closed) return;\n\n const position = computePopupScreenPosition(\n this.sdkConfig,\n this.popupLayoutState,\n );\n\n try {\n this.loginPopup.moveTo(\n Math.round(position.left),\n Math.round(position.top),\n );\n this.loginPopup.resizeTo(position.width, position.height);\n } catch (error) {\n console.warn('[Connect SDK] Failed to reposition LOGIN popup', error);\n }\n }\n\n async open() {\n if (this.isSessionActive()) return;\n\n const mode = this.sdkConfig.mode ?? BenjiConnectMode.CONNECT;\n const abortController = new AbortController();\n this.openAbortController = abortController;\n const { signal } = abortController;\n\n if (this.isLoginPopupOnly()) {\n const opened = this.openLoginPopup();\n if (!opened) {\n this.abortInflightOpen();\n return;\n }\n }\n\n await this.initialize();\n\n // close() may have run during initialize — do not register listeners or mount UI.\n if (signal.aborted) return;\n\n MessageRouter.setMode(mode);\n MessageRouter.addEventListeners();\n\n if (signal.aborted) {\n MessageRouter.removeEventListeners();\n return;\n }\n\n this.openUI();\n this.syncLoginContext(mode);\n // TODO: Track SDK Opened Tracker.trackSDKOpened();\n }\n\n private syncLoginContext(mode: BenjiConnectMode): void {\n MessageRouter.setLoginContext({\n iframe: this.iframe,\n loginPopup: this.loginPopup,\n mode,\n });\n }\n\n openUI() {\n // loginPopup may already be set for non-DUMMY LOGIN before the iframe mounts.\n if (this.iframe) return;\n\n MessageRouter.resetIframeReady();\n\n const headless = this.isLoginPopupOnly();\n\n this.container = document.createElement('div');\n if (headless) {\n applyHeadlessContainerStyle(this.container);\n } else {\n applyOverlayBaseStyle(this.container);\n }\n\n console.debug('[Connect SDK] endpoints', Endpoints);\n console.log('[Connect SDK] opeining URL', Endpoints.benji_connect_auth_url);\n const url = new URL(Endpoints.benji_connect_auth_url);\n const connectToken = this.sdkConfig.token;\n url.searchParams.set('connect_token', connectToken);\n url.searchParams.set('t', String(Date.now()));\n if (this.sdkConfig.mode != null) {\n url.searchParams.set('mode', String(this.sdkConfig.mode));\n }\n\n this.iframe = document.createElement('iframe');\n this.syncLoginContext(this.sdkConfig.mode ?? BenjiConnectMode.CONNECT);\n this.iframe.addEventListener('load', this.onIframeLoad);\n this.iframe.src = url.toString();\n\n this.container.appendChild(this.iframe);\n document.body.appendChild(this.container);\n\n if (headless) {\n applyHeadlessIframeStyle(this.iframe);\n this.repositionListeners = attachRepositionListeners(\n this.sdkConfig,\n () => this.repositionLoginPopup(),\n );\n } else {\n applyIframeLayoutToElements(\n this.sdkConfig,\n this.container,\n this.iframe,\n this.layoutState,\n { warnOnInvalidAnchor: true },\n );\n this.repositionListeners = attachRepositionListeners(\n this.sdkConfig,\n () => {\n if (!this.iframe || !this.container) return;\n applyIframeLayoutToElements(\n this.sdkConfig,\n this.container,\n this.iframe,\n this.layoutState,\n );\n },\n );\n\n this.container.addEventListener('click', (e) => {\n if (e.target === this.container) {\n // Trigger exit when user taps outside modal bounds\n this.sdkConfig.onExit?.({\n context: buildContext(),\n trigger: BenjiConnectExitTrigger.TAPPED_OUT_OF_BOUNDS\n });\n this.close();\n }\n });\n }\n\n this.syncLoginContext(this.sdkConfig.mode ?? BenjiConnectMode.CONNECT);\n }\n\n private navigateLoginPopup(url: string): void {\n if (this.hasLoginPopupUrl) return;\n if (!this.loginPopup || this.loginPopup.closed) {\n console.warn('[Connect SDK] Cannot navigate LOGIN popup — window unavailable');\n return;\n }\n try {\n this.loginPopup.location.href = url;\n this.hasLoginPopupUrl = true;\n } catch (error) {\n console.warn('[Connect SDK] Failed to navigate LOGIN popup', error);\n }\n }\n\n private closeLoginPopup(): void {\n if (!this.loginPopup) return;\n\n try {\n if (!this.loginPopup.closed) {\n this.loginPopup.close();\n }\n } catch (error) {\n console.warn('[Connect SDK] Error closing LOGIN popup', error);\n } finally {\n this.loginPopup = null;\n this.hasLoginPopupUrl = false;\n }\n }\n\n close() {\n // Abort in-flight open() even when the iframe has not mounted yet.\n this.abortInflightOpen();\n\n this.isClosing = true;\n this.stopPopupClosedPoll();\n this.closeLoginPopup();\n MessageRouter.removeEventListeners();\n\n if (!this.iframe) {\n this.isClosing = false;\n return;\n }\n\n this.repositionListeners?.remove();\n this.repositionListeners = null;\n this.layoutState.lastValidAnchoredLayout = null;\n this.popupLayoutState.lastValidAnchoredLayout = null;\n\n this.iframe.removeEventListener('load', this.onIframeLoad);\n\n if (this.container?.parentNode) {\n this.container.parentNode.removeChild(this.container);\n }\n this.iframe = null;\n this.container = null;\n this.isClosing = false;\n }\n\n cleanup() {\n if (this.iframe) this.close();\n }\n\n ping() { return 'pong'; }\n}\n\nexport default ConnectSDK;\n","/// <reference path=\"./global.d.ts\" />\nimport ConnectSDK from './connect-sdk';\n(globalThis as any).ConnectSDK = ConnectSDK;"],"mappings":"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","names":["endpoints","project_environment","endpoints","project_environment","endpoints","project_environment","BenjiConnectEventType","data","data","data","data","expectedOrigin","_a","_b"]}
1
+ {"version":3,"sources":["../src/config/production.ts","../src/config/sandbox.ts","../src/config/development.ts","../src/config/local.defaults.ts","../src/utils/environment.ts","../src/config/index.ts","../src/utils/config.ts","../src/utils/loginPopupLoading.ts","../src/utils/partnerAuthLink.ts","../src/utils/placement.ts","../src/types/event.ts","../src/utils/auth.ts","../src/utils/user.ts","../src/utils/transaction.ts","../src/types/router.ts","../src/router/message.ts","../src/connect-sdk.ts","../src/global.ts"],"sourcesContent":["export const project_environment: string = 'production';\n\nexport const endpoints: Record<string, string> = {\n 'benji_connect_auth_url':'https://verifyapp.withbenji.com',\n 'benji_connect_auth_service_url' : 'https://authservice.withbenji.com'\n}","export const project_environment: string = 'sandbox';\n\nexport const endpoints: Record<string, string> = {\n 'benji_connect_auth_url':'https://verifyapp-staging.withbenji.com',\n 'benji_connect_auth_service_url' : 'https://authservice-staging.withbenji.com'\n}","export const project_environment: string = 'development';\n\nexport const endpoints: Record<string, string> = {\n 'benji_connect_auth_url': 'https://verifyapp-dev.withbenji.com',\n 'benji_connect_auth_service_url': 'https://authservice-dev.withbenji.com',\n};","/**\n * Build-time fallback when gitignored `local.ts` is absent (CI, fresh clones).\n * Same endpoints as development — not machine-specific localhost overrides.\n * Copy to `local.ts` locally for localhost URLs; see RELEASE.md.\n */\nexport const project_environment: string = 'local';\n\nexport const endpoints: Record<string, string> = {\n benji_connect_auth_url: 'https://verifyapp-dev.withbenji.com',\n benji_connect_auth_service_url: 'https://authservice-dev.withbenji.com',\n};\n","/** Hostnames that browsers use for loopback when typed literally in the URL bar. */\nexport const LOCAL_HOSTNAMES = ['localhost', '127.0.0.1', '::1', '[::1]'] as const;\n\nconst LOCAL_HOSTNAME_SET: ReadonlySet<string> = new Set(LOCAL_HOSTNAMES);\n\nexport function isLocalHost(\n hostname: string = typeof window !== 'undefined' ? window.location.hostname : ''\n): boolean {\n if (LOCAL_HOSTNAME_SET.has(hostname)) {\n return true;\n }\n // IPv4 loopback block 127.0.0.0/8 — covers 127.0.0.1 without listing every address\n if (hostname.startsWith('127.')) {\n return true;\n }\n return false;\n}\n","import * as productionConfig from './production';\nimport * as sandboxConfig from './sandbox';\nimport * as developmentConfig from './development';\nimport * as localConfig from './local';\nimport { BenjiConnectEnvironment } from '../types/config';\nimport { isLocalHost } from '../utils/environment';\n\nexport type EnvironmentConfigModule = {\n project_environment: string;\n endpoints: Record<string, string>;\n};\n\nconst env = typeof process !== 'undefined' ? process.env : {};\nlet data: EnvironmentConfigModule = developmentConfig;\ntype EndpointConfig = typeof developmentConfig.endpoints;\nexport let Endpoints: EndpointConfig = getEndpoints();\nexport let Environment = BenjiConnectEnvironment.DEVELOPMENT;\n\nexport function configureConfig(environment: BenjiConnectEnvironment) {\n if (environment == 'production') {\n console.log('[Connect SDK] configuring with environment production');\n data = productionConfig;\n } else if (environment == 'sandbox') {\n console.log('[Connect SDK] configuring with environment sandbox');\n data = sandboxConfig;\n } else if (environment == 'development') {\n console.log('[Connect SDK] configuring with environment development');\n data = developmentConfig;\n } else if (environment == 'local') {\n if (isLocalHost()) {\n console.log('[Connect SDK] configuring with environment local');\n data = localConfig;\n } else {\n console.log(\n '[Connect SDK] local environment requested on non-local host; using development'\n );\n data = developmentConfig;\n }\n }\n Endpoints = getEndpoints();\n Environment = getEnvironment();\n}\n\nfunction getEndpoints(): EndpointConfig {\n const entries = Object.entries(data.endpoints).map(([key, value]) => {\n const override = env?.[key] || value;\n return [key, override] as const;\n });\n return Object.fromEntries(entries) as EndpointConfig;\n}\n\nfunction getEnvironment(): BenjiConnectEnvironment {\n return data['project_environment'] as BenjiConnectEnvironment;\n}\n\nexport const Namespace = __NAMESPACE__;\nexport const Version = __VERSION__;\n","import { BenjiConnectEnvironment } from \"../types/config\";\nimport { isLocalHost } from \"./environment\";\n\nexport const buildContext = () => ({\n namespace: typeof __NAMESPACE__ !== 'undefined' && __NAMESPACE__ ? __NAMESPACE__ : 'benji-connect-sdk',\n version: typeof __VERSION__ !== 'undefined' && __VERSION__ ? String(__VERSION__) : '0.0.0',\n});\n\nexport function isBenjiConnectEnvironment(\n environment: unknown\n): environment is BenjiConnectEnvironment {\n return (\n environment === BenjiConnectEnvironment.LOCAL ||\n environment === BenjiConnectEnvironment.DEVELOPMENT ||\n environment === BenjiConnectEnvironment.SANDBOX ||\n environment === BenjiConnectEnvironment.PRODUCTION\n );\n}\n\nexport function mapToConnectEnvironment(\n environment: BenjiConnectEnvironment | string\n): BenjiConnectEnvironment {\n\n if (isBenjiConnectEnvironment(environment)) return environment;\n\n const environments: Record<string, BenjiConnectEnvironment> = {\n local: BenjiConnectEnvironment.LOCAL,\n development: BenjiConnectEnvironment.DEVELOPMENT,\n sandbox: BenjiConnectEnvironment.SANDBOX,\n production: BenjiConnectEnvironment.PRODUCTION,\n };\n const mapped = environments[environment];\n if (mapped) return mapped;\n\n const defaultEnvironment = isLocalHost()\n ? BenjiConnectEnvironment.LOCAL\n : BenjiConnectEnvironment.DEVELOPMENT;\n console.warn(`[Benji Connect SDK] ${environment} not valid environment defaulting to ${defaultEnvironment}`);\n\n return defaultEnvironment;\n}","const LOGIN_POPUP_TITLE = 'User sign-in';\nconst LOGIN_POPUP_MESSAGE = 'Loading sign-in\\u2026';\n\nexport function buildLoginPopupLoadingHtml(): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>${LOGIN_POPUP_TITLE}</title>\n <style>\n * { box-sizing: border-box; }\n html, body {\n margin: 0;\n height: 100%;\n background: #fff;\n }\n body {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n font-family: Inter, system-ui, -apple-system, sans-serif;\n }\n .loading-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 14px;\n padding: 24px;\n max-width: 320px;\n transform: translateY(-28px);\n }\n .loader {\n width: 48px;\n height: 48px;\n border: 3px solid #e5e7eb;\n border-top-color: #9ca3af;\n border-radius: 50%;\n animation: spin 0.75s linear infinite;\n }\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n .loading-text {\n font-size: 16px;\n text-align: center;\n font-family: Inter, sans-serif;\n margin: 0;\n background: linear-gradient(\n 90deg,\n #374151 0%,\n #9ca3af 50%,\n #374151 100%\n );\n background-size: 200% 100%;\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n animation: shimmer 1.8s ease-in-out infinite;\n }\n @keyframes shimmer {\n 0% { background-position: 100% 0; }\n 100% { background-position: -100% 0; }\n }\n </style>\n</head>\n<body>\n <div class=\"loading-content\">\n <div class=\"loader\" aria-hidden=\"true\"></div>\n <p class=\"loading-text\">${LOGIN_POPUP_MESSAGE}</p>\n </div>\n</body>\n</html>`;\n}\n\nexport function writeLoginPopupLoadingDocument(popup: Window): void {\n try {\n popup.document.open();\n popup.document.write(buildLoginPopupLoadingHtml());\n popup.document.close();\n } catch (error) {\n console.warn('[Connect SDK] Failed to write LOGIN popup loading document', error);\n }\n}\n","export const LOGIN_POPUP_QUERY_FLAG = 'benji_login_popup';\n\nexport function ensureAuthLinkStateNonce(url: string, nonce: string): string {\n try {\n const parsed = new URL(url);\n if (!parsed.searchParams.get('state')) {\n parsed.searchParams.set('state', nonce);\n }\n return parsed.toString();\n } catch {\n if (url.includes('state=')) {\n return url;\n }\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}state=${encodeURIComponent(nonce)}`;\n }\n}\n\n/** Appends `benji_login_popup=1` without altering other query params (e.g. PKCE `state`). */\nexport function appendLoginPopupFlag(url: string): string {\n try {\n const parsed = new URL(url);\n parsed.searchParams.set(LOGIN_POPUP_QUERY_FLAG, '1');\n return parsed.toString();\n } catch {\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}${LOGIN_POPUP_QUERY_FLAG}=1`;\n }\n}\n\nexport function preparePartnerAuthUrl(url: string, nonce: string): string {\n return ensureAuthLinkStateNonce(url, nonce);\n}\n","/**\n * Anchor-based iframe placement and host DOM application. Naming follows Floating UI /\n * Popper conventions (`bottom-end`, `bottom-start`). Computes layout rects, applies styles\n * to overlay/iframe elements, and manages reposition listeners.\n * @see https://floating-ui.com/docs/computePosition#placement\n */\n\nimport {\n BenjiConnectPlacement,\n type BenjiConnectAnchor,\n type BenjiConnectConfig,\n type BenjiConnectPlacementOffset,\n} from '../types/config';\n\nexport const IFRAME_WIDTH = 400;\nexport const IFRAME_HEIGHT = 645;\n\n/** LOGIN partner-auth popup dimensions (SDK-managed window). */\nexport const POPUP_WIDTH = 420;\nexport const POPUP_HEIGHT = 640;\n\nconst IFRAME_STATIC_STYLE: CSSStyleDeclaration = {\n border: 'none',\n borderRadius: '20px',\n overflow: 'hidden',\n} as CSSStyleDeclaration;\n\nconst CONTAINER_BASE_STYLE: CSSStyleDeclaration = {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n backgroundColor: 'rgba(0,0,0,0.5)',\n zIndex: '9999',\n} as CSSStyleDeclaration;\n\nconst VIEWPORT_PADDING = 8;\n\nexport interface IframeRect {\n top: number;\n left: number;\n width: number;\n height: number;\n placement: BenjiConnectPlacement;\n}\n\nexport interface ViewportSize {\n width: number;\n height: number;\n}\n\nexport interface ResolveIframeLayoutOptions {\n warnOnInvalidAnchor?: boolean;\n preserveAnchoredLayout?: IframeRect | null;\n}\n\nfunction isPreservableAnchoredLayout(\n layout: IframeRect | null | undefined,\n): layout is IframeRect {\n return (\n layout != null && layout.placement !== BenjiConnectPlacement.CENTER\n );\n}\n\nfunction clampPreservedAnchoredLayout(\n layout: IframeRect,\n viewport: ViewportSize,\n): IframeRect {\n const maxLeft = viewport.width - layout.width - VIEWPORT_PADDING;\n const maxTop = viewport.height - layout.height - VIEWPORT_PADDING;\n const minLeft = VIEWPORT_PADDING;\n const minTop = VIEWPORT_PADDING;\n\n return {\n ...layout,\n left:\n maxLeft < minLeft\n ? minLeft\n : Math.min(Math.max(layout.left, minLeft), maxLeft),\n top:\n maxTop < minTop\n ? minTop\n : Math.min(Math.max(layout.top, minTop), maxTop),\n };\n}\n\nfunction preservedAnchoredLayoutOrCenter(\n viewport: ViewportSize,\n options: ResolveIframeLayoutOptions,\n): IframeRect {\n const { preserveAnchoredLayout } = options;\n if (isPreservableAnchoredLayout(preserveAnchoredLayout)) {\n return clampPreservedAnchoredLayout(preserveAnchoredLayout, viewport);\n }\n return centerLayout(viewport);\n}\n\nfunction isRefLikeAnchor(\n anchor: BenjiConnectAnchor,\n): anchor is { value: HTMLElement | null | undefined } {\n return (\n typeof anchor === 'object' &&\n anchor !== null &&\n !(anchor instanceof HTMLElement) &&\n 'value' in anchor\n );\n}\n\nexport function resolveAnchor(\n anchor: BenjiConnectAnchor | undefined,\n): HTMLElement | null {\n if (!anchor) {\n return null;\n }\n if (typeof anchor === 'string') {\n return document.querySelector<HTMLElement>(anchor);\n }\n if (typeof anchor === 'function') {\n const resolved = anchor();\n return resolved instanceof HTMLElement ? resolved : null;\n }\n if (isRefLikeAnchor(anchor)) {\n const el = anchor.value;\n return el instanceof HTMLElement ? el : null;\n }\n return anchor instanceof HTMLElement ? anchor : null;\n}\n\nexport function isAnchorVisible(el: HTMLElement): boolean {\n if (!el.isConnected) {\n return false;\n }\n const style = window.getComputedStyle(el);\n if (style.display === 'none' || style.visibility === 'hidden') {\n return false;\n }\n const rect = el.getBoundingClientRect();\n return rect.width > 0 || rect.height > 0;\n}\n\nexport function resolveEffectivePlacement(\n config: Pick<BenjiConnectConfig, 'anchor' | 'placement'>,\n): BenjiConnectPlacement {\n if (!config.anchor) {\n return BenjiConnectPlacement.CENTER;\n }\n return config.placement ?? BenjiConnectPlacement.BOTTOM_END;\n}\n\nexport function defaultOffset(\n offset?: BenjiConnectPlacementOffset,\n): Required<BenjiConnectPlacementOffset> {\n return {\n top: offset?.top ?? 0,\n left: offset?.left ?? 0,\n };\n}\n\nexport function resolveIframeDimensions(viewport: ViewportSize): {\n width: number;\n height: number;\n} {\n const maxW = viewport.width - 2 * VIEWPORT_PADDING;\n const maxH = viewport.height - 2 * VIEWPORT_PADDING;\n const scale = Math.min(1, maxW / IFRAME_WIDTH, maxH / IFRAME_HEIGHT);\n return {\n width: Math.floor(IFRAME_WIDTH * scale),\n height: Math.floor(IFRAME_HEIGHT * scale),\n };\n}\n\nexport function iframeFitsHorizontally(\n viewportWidth: number,\n iframeWidth: number = IFRAME_WIDTH,\n): boolean {\n return viewportWidth >= iframeWidth + 2 * VIEWPORT_PADDING;\n}\n\nfunction centerLayout(viewport: ViewportSize): IframeRect {\n const { width, height } = resolveIframeDimensions(viewport);\n return {\n top: 0,\n left: 0,\n width,\n height,\n placement: BenjiConnectPlacement.CENTER,\n };\n}\n\nexport function fitsBelow(\n anchorBottom: number,\n offsetTop: number,\n viewportHeight: number,\n iframeHeight: number = IFRAME_HEIGHT,\n): boolean {\n const top = anchorBottom + offsetTop;\n const bottom = top + iframeHeight;\n return (\n top >= VIEWPORT_PADDING && bottom <= viewportHeight - VIEWPORT_PADDING\n );\n}\n\nfunction clampHorizontal(left: number, viewportWidth: number): number {\n const min = VIEWPORT_PADDING;\n const max = viewportWidth - IFRAME_WIDTH - VIEWPORT_PADDING;\n if (max < min) {\n return min;\n }\n return Math.min(Math.max(left, min), max);\n}\n\nfunction warnInvalidAnchor(message: string): void {\n console.warn(`[Benji Connect SDK] ${message}`);\n}\n\nexport function computeIframeRect(\n anchorElement: HTMLElement,\n placement: BenjiConnectPlacement,\n offset: BenjiConnectPlacementOffset,\n viewport: ViewportSize,\n options: ResolveIframeLayoutOptions = {},\n): IframeRect {\n const { warnOnInvalidAnchor = false } = options;\n const resolvedOffset = defaultOffset(offset);\n\n if (placement === BenjiConnectPlacement.CENTER) {\n return centerLayout(viewport);\n }\n\n if (!isAnchorVisible(anchorElement)) {\n if (isPreservableAnchoredLayout(options.preserveAnchoredLayout)) {\n return clampPreservedAnchoredLayout(\n options.preserveAnchoredLayout,\n viewport,\n );\n }\n if (warnOnInvalidAnchor) {\n warnInvalidAnchor(\n 'anchor is hidden or detached; falling back to centered modal',\n );\n }\n return centerLayout(viewport);\n }\n\n const rect = anchorElement.getBoundingClientRect();\n\n if (!fitsBelow(rect.bottom, resolvedOffset.top, viewport.height)) {\n return centerLayout(viewport);\n }\n\n if (!iframeFitsHorizontally(viewport.width)) {\n return centerLayout(viewport);\n }\n\n const top = rect.bottom + resolvedOffset.top;\n const idealLeft =\n placement === BenjiConnectPlacement.BOTTOM_END\n ? rect.right - IFRAME_WIDTH + resolvedOffset.left\n : rect.left + resolvedOffset.left;\n\n if (idealLeft < VIEWPORT_PADDING) {\n if (warnOnInvalidAnchor) {\n warnInvalidAnchor(\n 'anchor rect is unusable for placement; falling back to centered modal',\n );\n }\n return centerLayout(viewport);\n }\n\n const left = clampHorizontal(idealLeft, viewport.width);\n\n return {\n top,\n left,\n width: IFRAME_WIDTH,\n height: IFRAME_HEIGHT,\n placement,\n };\n}\n\nexport function resolveIframeLayout(\n config: BenjiConnectConfig,\n viewport: ViewportSize = {\n width: window.innerWidth,\n height: window.innerHeight,\n },\n options: ResolveIframeLayoutOptions = {},\n): IframeRect {\n const { warnOnInvalidAnchor = true } = options;\n const placement = resolveEffectivePlacement(config);\n const anchorElement = resolveAnchor(config.anchor);\n\n if (\n warnOnInvalidAnchor &&\n placement !== BenjiConnectPlacement.CENTER &&\n !anchorElement\n ) {\n warnInvalidAnchor('anchor not found; falling back to centered modal');\n return preservedAnchoredLayoutOrCenter(viewport, options);\n }\n\n if (placement === BenjiConnectPlacement.CENTER) {\n return centerLayout(viewport);\n }\n\n if (!anchorElement) {\n return preservedAnchoredLayoutOrCenter(viewport, options);\n }\n\n return computeIframeRect(\n anchorElement,\n placement,\n config.offset,\n viewport,\n options,\n );\n}\n\n// --- DOM application ---\n\nexport interface IframeLayoutState {\n layout: IframeRect;\n lastValidAnchoredLayout: IframeRect | null;\n}\n\nexport interface RepositionListenerHandle {\n remove(): void;\n}\n\nexport function applyOverlayBaseStyle(container: HTMLDivElement): void {\n Object.assign(container.style, CONTAINER_BASE_STYLE);\n}\n\nfunction getVisualViewportOffset(): { top: number; left: number } {\n const vv = window.visualViewport;\n if (!vv) {\n return { top: 0, left: 0 };\n }\n return { top: vv.offsetTop, left: vv.offsetLeft };\n}\n\nfunction getRepositionScrollTargets(\n anchor: BenjiConnectAnchor | undefined,\n): Array<Window | HTMLElement> {\n const targets = new Set<Window | HTMLElement>([window]);\n const anchorElement = resolveAnchor(anchor);\n\n if (!anchorElement) {\n return [...targets];\n }\n\n targets.add(anchorElement);\n\n let parent: HTMLElement | null = anchorElement.parentElement;\n while (parent) {\n const { overflow, overflowX, overflowY } = window.getComputedStyle(parent);\n const overflowValue = `${overflow} ${overflowX} ${overflowY}`;\n\n if (/(auto|scroll|overlay)/.test(overflowValue)) {\n targets.add(parent);\n }\n\n parent = parent.parentElement;\n }\n\n return [...targets];\n}\n\nexport function applyIframeLayoutToElements(\n config: BenjiConnectConfig,\n container: HTMLDivElement,\n iframe: HTMLIFrameElement,\n state: IframeLayoutState,\n options: ResolveIframeLayoutOptions = { warnOnInvalidAnchor: false },\n): void {\n state.layout = resolveIframeLayout(config, undefined, {\n ...options,\n preserveAnchoredLayout: state.lastValidAnchoredLayout,\n });\n\n if (state.layout.placement !== BenjiConnectPlacement.CENTER) {\n state.lastValidAnchoredLayout = state.layout;\n }\n\n const iframeStyle = {\n ...IFRAME_STATIC_STYLE,\n width: `${state.layout.width}px`,\n height: `${state.layout.height}px`,\n };\n\n if (state.layout.placement === BenjiConnectPlacement.CENTER) {\n Object.assign(container.style, {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'auto',\n });\n Object.assign(iframe.style, iframeStyle, {\n position: 'relative',\n top: '',\n left: '',\n });\n return;\n }\n\n Object.assign(container.style, {\n display: 'block',\n overflow: 'auto',\n });\n\n const viewportOffset = getVisualViewportOffset();\n Object.assign(iframe.style, iframeStyle, {\n position: 'fixed',\n top: `${state.layout.top + viewportOffset.top}px`,\n left: `${state.layout.left + viewportOffset.left}px`,\n });\n}\n\nexport interface PopupScreenPosition {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nexport interface PopupLayoutState {\n lastValidAnchoredLayout: IframeRect | null;\n}\n\nfunction popupFitsBelow(\n anchorBottom: number,\n offsetTop: number,\n viewportHeight: number,\n): boolean {\n const top = anchorBottom + offsetTop;\n const bottom = top + POPUP_HEIGHT;\n return (\n top >= VIEWPORT_PADDING && bottom <= viewportHeight - VIEWPORT_PADDING\n );\n}\n\nfunction popupFitsHorizontally(viewportWidth: number): boolean {\n return viewportWidth >= POPUP_WIDTH + 2 * VIEWPORT_PADDING;\n}\n\nfunction clampPopupHorizontal(left: number, viewportWidth: number): number {\n const min = VIEWPORT_PADDING;\n const max = viewportWidth - POPUP_WIDTH - VIEWPORT_PADDING;\n if (max < min) {\n return min;\n }\n return Math.min(Math.max(left, min), max);\n}\n\nfunction centerPopupViewportRect(viewport: ViewportSize): IframeRect {\n const left = Math.max(\n VIEWPORT_PADDING,\n (viewport.width - POPUP_WIDTH) / 2,\n );\n const top = Math.max(\n VIEWPORT_PADDING,\n (viewport.height - POPUP_HEIGHT) / 2,\n );\n return {\n top,\n left,\n width: POPUP_WIDTH,\n height: POPUP_HEIGHT,\n placement: BenjiConnectPlacement.CENTER,\n };\n}\n\nfunction computePopupViewportRect(\n anchorElement: HTMLElement,\n placement: BenjiConnectPlacement,\n offset: BenjiConnectPlacementOffset,\n viewport: ViewportSize,\n options: ResolveIframeLayoutOptions = {},\n): IframeRect {\n const { warnOnInvalidAnchor = false } = options;\n const resolvedOffset = defaultOffset(offset);\n\n if (placement === BenjiConnectPlacement.CENTER) {\n return centerPopupViewportRect(viewport);\n }\n\n if (!isAnchorVisible(anchorElement)) {\n if (isPreservableAnchoredLayout(options.preserveAnchoredLayout)) {\n return clampPreservedAnchoredLayout(\n options.preserveAnchoredLayout,\n viewport,\n );\n }\n if (warnOnInvalidAnchor) {\n warnInvalidAnchor(\n 'anchor is hidden or detached; falling back to centered popup',\n );\n }\n return centerPopupViewportRect(viewport);\n }\n\n const rect = anchorElement.getBoundingClientRect();\n\n if (!popupFitsBelow(rect.bottom, resolvedOffset.top, viewport.height)) {\n return centerPopupViewportRect(viewport);\n }\n\n if (!popupFitsHorizontally(viewport.width)) {\n return centerPopupViewportRect(viewport);\n }\n\n const top = rect.bottom + resolvedOffset.top;\n const idealLeft =\n placement === BenjiConnectPlacement.BOTTOM_END\n ? rect.right - POPUP_WIDTH + resolvedOffset.left\n : rect.left + resolvedOffset.left;\n\n if (idealLeft < VIEWPORT_PADDING) {\n if (warnOnInvalidAnchor) {\n warnInvalidAnchor(\n 'anchor rect is unusable for popup placement; falling back to centered popup',\n );\n }\n return centerPopupViewportRect(viewport);\n }\n\n const left = clampPopupHorizontal(idealLeft, viewport.width);\n\n return {\n top,\n left,\n width: POPUP_WIDTH,\n height: POPUP_HEIGHT,\n placement,\n };\n}\n\nexport function resolvePopupViewportLayout(\n config: BenjiConnectConfig,\n viewport: ViewportSize = {\n width: window.innerWidth,\n height: window.innerHeight,\n },\n options: ResolveIframeLayoutOptions = {},\n): IframeRect {\n const { warnOnInvalidAnchor = true } = options;\n const placement = resolveEffectivePlacement(config);\n const anchorElement = resolveAnchor(config.anchor);\n\n if (\n warnOnInvalidAnchor &&\n placement !== BenjiConnectPlacement.CENTER &&\n !anchorElement\n ) {\n warnInvalidAnchor('anchor not found; falling back to centered popup');\n if (isPreservableAnchoredLayout(options.preserveAnchoredLayout)) {\n return clampPreservedAnchoredLayout(\n options.preserveAnchoredLayout,\n viewport,\n );\n }\n return centerPopupViewportRect(viewport);\n }\n\n if (placement === BenjiConnectPlacement.CENTER || !anchorElement) {\n return centerPopupViewportRect(viewport);\n }\n\n return computePopupViewportRect(\n anchorElement,\n placement,\n config.offset,\n viewport,\n options,\n );\n}\n\nexport function computePopupScreenPosition(\n config: BenjiConnectConfig,\n state: PopupLayoutState = { lastValidAnchoredLayout: null },\n options: ResolveIframeLayoutOptions = {},\n): PopupScreenPosition {\n const layout = resolvePopupViewportLayout(config, undefined, {\n ...options,\n preserveAnchoredLayout: state.lastValidAnchoredLayout,\n });\n\n if (layout.placement !== BenjiConnectPlacement.CENTER) {\n state.lastValidAnchoredLayout = layout;\n }\n\n const viewportOffset = getVisualViewportOffset();\n\n return {\n left: window.screenX + layout.left + viewportOffset.left,\n top: window.screenY + layout.top + viewportOffset.top,\n width: layout.width,\n height: layout.height,\n };\n}\n\nexport function buildLoginPopupFeatures(position: PopupScreenPosition): string {\n return [\n `width=${position.width}`,\n `height=${position.height}`,\n `left=${Math.round(position.left)}`,\n `top=${Math.round(position.top)}`,\n 'scrollbars=yes',\n 'resizable=yes',\n ].join(',');\n}\n\nexport function applyHeadlessContainerStyle(container: HTMLDivElement): void {\n Object.assign(container.style, {\n position: 'fixed',\n top: '0',\n left: '-9999px',\n width: '1px',\n height: '1px',\n overflow: 'hidden',\n pointerEvents: 'none',\n backgroundColor: 'transparent',\n opacity: '0',\n zIndex: '-1',\n });\n}\n\nexport function applyHeadlessIframeStyle(iframe: HTMLIFrameElement): void {\n Object.assign(iframe.style, {\n position: 'absolute',\n top: '0',\n left: '0',\n width: '1px',\n height: '1px',\n border: 'none',\n opacity: '0',\n pointerEvents: 'none',\n });\n}\n\nexport function attachRepositionListeners(\n config: Pick<BenjiConnectConfig, 'anchor'>,\n onReposition: () => void,\n): RepositionListenerHandle {\n const repositionHandler = onReposition;\n const repositionScrollTargets = getRepositionScrollTargets(config.anchor);\n repositionScrollTargets.forEach((target) => {\n target.addEventListener('scroll', repositionHandler, { passive: true });\n });\n window.addEventListener('resize', repositionHandler);\n\n const visualViewport = window.visualViewport;\n visualViewport?.addEventListener('resize', repositionHandler);\n visualViewport?.addEventListener('scroll', repositionHandler);\n\n return {\n remove() {\n repositionScrollTargets.forEach((target) => {\n target.removeEventListener('scroll', repositionHandler);\n });\n window.removeEventListener('resize', repositionHandler);\n visualViewport?.removeEventListener('resize', repositionHandler);\n visualViewport?.removeEventListener('scroll', repositionHandler);\n },\n };\n}\n","import { BenjiConnectAuthAction } from \"./auth\";\n\n// Known event names coming from the SDK transport (postMessage)\nexport enum BenjiConnectEventType {\n AUTH_SUCCESS = 'AUTH_SUCCESS',\n FLOW_EXIT = 'FLOW_EXIT',\n FLOW_SUCCESS = 'FLOW_SUCCESS',\n EVENT = 'EVENT',\n ERROR = 'ERROR',\n PARTNER_LOGIN_OPEN = 'PARTNER_LOGIN_OPEN',\n}\n\nexport interface BenjiConnectPartnerLoginOpenEventData {\n url: string | null;\n title?: string;\n}\n\n// Known exit trigger types coming from the SDK transport (postMessage)\nexport enum BenjiConnectExitTrigger {\n ACTION_BUTTON_CLICKED = 'ACTION_BUTTON_CLICKED',\n BACK_TO_MERCHANT_CLICKED = 'BACK_TO_MERCHANT_CLICKED', // deprecated\n CLOSE_BUTTON_CLICKED = 'CLOSE_BUTTON_CLICKED',\n TAPPED_OUT_OF_BOUNDS = 'TAPPED_OUT_OF_BOUNDS',\n /** User closed the LOGIN partner-auth popup window. */\n POPUP_CLOSED = 'POPUP_CLOSED',\n}\n\nexport enum BenjiConnectErrorName {\n UNEXPECTED_ERROR = 'unexpected_error',\n PARTNER_CONNECT_ERROR = 'partner_connect_error'\n}\n\nexport type BenjiConnectErrorID = '400' | '500'; // Placeholders for now\n\n// Transport-layer token (raw, unprocessed from postMessage)\nexport interface BenjiConnectEventToken {\n access_token?: string;\n refresh_token?: string;\n expires_at?: string | number;\n exchange_token?: string;\n}\n\nexport interface BenjiConnectEventUserData {\n user: {\n id: number\n first_name: string\n last_name: string\n uuid?: string\n }\n status: BenjiConnectEventUserStatusData\n extra_data?: {\n total_rewards_earned?: number\n total_rewards_redeemed?: number\n created_date?: string\n }\n}\n\nexport interface BenjiConnectEventTransactionData {\n action: string;\n amount: number;\n trigger_event_id: string;\n trigger_name: string;\n}\n\nexport interface BenjiConnectEventUserStatusData {\n status_id: string\n num_of_rewards: number\n reward_status: string\n partner_status_tier_id?: number\n}\n\n// Basic structure for Benji Connect SDK typed events\nexport interface BenjiConnectEvent {\n type: BenjiConnectEventType;\n data?: BenjiConnectEventData;\n}\n\nexport interface BenjiConnectEventData {\n [k: string]: unknown;\n}\n\nexport interface BenjiConnectEventMessage<K extends BenjiConnectEventType = BenjiConnectEventType> {\n type: K; // discriminant\n data: BenjiConnectEventDataMap[K];\n}\n\nexport interface BenjiConnectAuthSuccessEventData {\n action: BenjiConnectAuthAction;\n metadata?: BenjiConnectEventUserData;\n token?: BenjiConnectEventToken,\n transaction?: BenjiConnectEventTransactionData;\n}\n\nexport interface BenjiConnectFlowExitEventData {\n step: string;\n trigger: BenjiConnectExitTrigger;\n}\n\nexport interface BenjiConnectErrorEventData {\n error: Error;\n}\n\n// Canonical event map \nexport type BenjiConnectEventDataMap = {\n [BenjiConnectEventType.AUTH_SUCCESS]: BenjiConnectAuthSuccessEventData;\n [BenjiConnectEventType.FLOW_EXIT]: BenjiConnectFlowExitEventData;\n [BenjiConnectEventType.FLOW_SUCCESS]: BenjiConnectAuthSuccessEventData;\n [BenjiConnectEventType.EVENT]: BenjiConnectEventData;\n [BenjiConnectEventType.ERROR]: BenjiConnectErrorEventData;\n [BenjiConnectEventType.PARTNER_LOGIN_OPEN]: BenjiConnectPartnerLoginOpenEventData;\n\n // Optional catch-all fan-out\n '*': { type: BenjiConnectEventType; data: BenjiConnectEventDataMap[BenjiConnectEventType] };\n};","import { BenjiConnectAuthToken } from '../types/auth';\nimport { BenjiConnectMode } from '../types/config';\nimport { BenjiConnectEventToken, BenjiConnectEventType } from '../types/event';\n\n/**\n * Mirrored from Benji Connect AuthMessageType — transport routing only.\n * Keep aligned with Benji Connect/src/types/messege.ts\n */\nconst AUTH_MESSAGE_TYPES = new Set([\n 'auth_config',\n 'code_received',\n 'code_verification_error',\n 'loyalty_verification',\n 'phone_verification',\n 'request_auth_config',\n 'request_code_exchange',\n 'request_code_with_login',\n 'request_code_with_phone',\n 'request_loyalty_verification',\n 'request_phone_verification',\n]);\n\nconst CONNECT_MESSAGE_TYPES = new Set<string>(Object.values(BenjiConnectEventType));\n\nexport function isAuthMessageType(data: unknown): boolean {\n if (!data || typeof data !== 'object') return false;\n const type = (data as { type?: string }).type;\n return typeof type === 'string' && AUTH_MESSAGE_TYPES.has(type);\n}\n\nexport function shouldRelayMessage(mode: BenjiConnectMode | undefined, data: unknown): boolean {\n return mode === BenjiConnectMode.LOGIN && isAuthMessageType(data);\n}\n\nexport function isConnectMessageType(data: unknown): boolean {\n if (!data || typeof data !== 'object') return false;\n const type = (data as { type?: string }).type;\n return typeof type === 'string' && CONNECT_MESSAGE_TYPES.has(type);\n}\n\nexport const extractAccessToken = (token?: BenjiConnectEventToken | string): string =>\n typeof token === 'string' ? token : (token?.access_token ?? '');\n\nexport const extractExchangeToken = (token?: BenjiConnectEventToken | string): string =>\n typeof token === 'string' ? token : (token?.exchange_token ?? '');\n\nexport const mapEventToConnectToken = (data?: BenjiConnectEventToken): BenjiConnectAuthToken => ({\n access_token: data?.access_token ?? '',\n refresh_token: data?.refresh_token ?? '',\n expires_at: data?.expires_at ?? ''\n});\n","import { BenjiConnectEventUserData } from \"../types/event\";\nimport { BenjiConnectUserData } from \"../types/user\";\n\nexport function isConnectUserData (\n input: BenjiConnectUserData | Record<string, any>\n): boolean {\n if (!input) return false;\n const data = mapEventToConnectUserData(input);\n if (data.user.id != 0) return true;\n return false;\n}\n\nexport const mapEventToConnectUserData = (\n data?: BenjiConnectEventUserData | Record<string, any>\n): BenjiConnectUserData => ({\n user: {\n id: data?.user?.id ?? 0,\n first_name: data?.user?.first_name ?? '',\n last_name: data?.user?.last_name ?? '',\n uuid: data?.user?.uuid \n },\n status: {\n status_id: data?.status?.status_id ?? '',\n num_of_rewards: data?.status?.num_of_rewards ?? 0,\n reward_status: data?.status?.reward_status ?? '',\n partner_status_tier_id: data?.status?.partner_status_tier_id\n },\n extra_data: {\n total_rewards_earned: data?.extra_data?.total_rewards_earned,\n total_rewards_redeemed: data?.extra_data?.total_rewards_redeemed,\n created_date: data?.extra_data?.created_date\n }\n});\n","import { BenjiConnectEventTransactionData } from \"../types/event\";\nimport { BenjiConnectTransactionData } from \"../types/transaction\";\n\nexport const mapEventToConnectTransactionData = (data?: BenjiConnectEventTransactionData): BenjiConnectTransactionData | null => {\n if (!data) return null;\n return {\n action: data.action,\n amount: data.amount,\n trigger_event_id: data.trigger_event_id,\n trigger_name: data.trigger_name\n };\n}","import {\n BenjiConnectMetadata,\n BenjiConnectMode,\n BenjiConnectOnErrorData,\n BenjiConnectOnEventData,\n BenjiConnectOnExitData,\n BenjiConnectOnExitMetadata,\n BenjiConnectOnSuccessData,\n BenjiConnectOnSuccessMetadata,\n} from './config';\n\nimport { \n extractAccessToken,\n extractExchangeToken,\n mapEventToConnectToken \n} from '../utils/auth';\n\nimport { BenjiConnectAuthAction } from './auth';\n\nimport { buildContext } from '../utils/config';\nimport { mapEventToConnectUserData } from '../utils/user';\n\nimport { \n BenjiConnectAuthSuccessEventData,\n BenjiConnectErrorEventData, \n BenjiConnectEventDataMap, \n BenjiConnectEventMessage, \n BenjiConnectEventType, \n BenjiConnectFlowExitEventData\n} from './event';\nimport { mapEventToConnectTransactionData } from '../utils/transaction';\n\nexport type MessageRouterLoginContext = {\n iframe: HTMLIFrameElement | null;\n loginPopup: Window | null;\n mode: BenjiConnectMode;\n};\n\nexport type MessageRouterConfig = {\n onSuccess?: (\n token: string, \n metadata: BenjiConnectOnSuccessMetadata\n ) => void;\n onError?: (\n error: Error,\n error_id: string,\n metadata: BenjiConnectMetadata\n ) => void;\n onExit?: (\n metadata: BenjiConnectOnExitMetadata\n ) => void;\n onEvent?: (\n type: BenjiConnectEventType, \n metadata: BenjiConnectMetadata\n ) => void;\n close?: () => void;\n closeLoginPopup?: () => void;\n navigateLoginPopup?: (url: string) => void;\n};\n\nexport const mapToAuthSuccessData = (\n message: BenjiConnectEventMessage<BenjiConnectEventType.AUTH_SUCCESS>,\n data: BenjiConnectAuthSuccessEventData\n): BenjiConnectOnEventData => {\n return {\n type: message.type,\n metadata: {\n context: buildContext(),\n action: data.action,\n token: mapEventToConnectToken(data.token),\n transactionData: mapEventToConnectTransactionData(data.transaction),\n userData: mapEventToConnectUserData(data.metadata)\n }\n };\n};\n\nexport const mapToOnExitData = (data: BenjiConnectFlowExitEventData): BenjiConnectOnExitData => {\n return {\n metadata: {\n context: buildContext(),\n step: data.step,\n trigger: data.trigger\n }\n };\n};\n\nexport const mapToOnSuccessData = (data: BenjiConnectAuthSuccessEventData): BenjiConnectOnSuccessData => {\n \n const token = data.action === BenjiConnectAuthAction.Login\n ? extractExchangeToken(data.token)\n : extractAccessToken(data.token);\n\n let metadata: BenjiConnectOnSuccessMetadata = {\n context: buildContext(),\n action: data.action,\n user_data: data.metadata\n };\n\n if (data.transaction) {\n metadata.transaction_data = data.transaction;\n }\n \n return { token, metadata };\n};\n\nexport const mapToOnErrorData = (data: BenjiConnectErrorEventData): BenjiConnectOnErrorData => {\n return {\n error: data.error,\n error_id: '500', // Placeholder\n metadata: {\n context: buildContext()\n }\n };\n};\n\nexport const mapToOnEventData = <K extends BenjiConnectEventType>(\n message: BenjiConnectEventMessage<K>,\n data: BenjiConnectEventDataMap[K]\n): BenjiConnectOnEventData => {\n return {\n type: message.type,\n metadata: {\n context: buildContext(),\n ...data\n }\n };\n};\n\nexport type BenjiConnectCallbackDataMap = {\n [BenjiConnectEventType.AUTH_SUCCESS]: BenjiConnectOnEventData;\n [BenjiConnectEventType.FLOW_EXIT]: BenjiConnectOnExitData;\n [BenjiConnectEventType.FLOW_SUCCESS]: BenjiConnectOnSuccessData;\n [BenjiConnectEventType.ERROR]: BenjiConnectOnErrorData;\n [BenjiConnectEventType.EVENT]: BenjiConnectOnEventData;\n '*': BenjiConnectOnEventData;\n};\n\nexport const BenjiConnectCallbackMapperMap = {\n [BenjiConnectEventType.AUTH_SUCCESS]: mapToAuthSuccessData,\n [BenjiConnectEventType.FLOW_EXIT]: mapToOnExitData,\n [BenjiConnectEventType.FLOW_SUCCESS]: mapToOnSuccessData,\n [BenjiConnectEventType.ERROR]: mapToOnErrorData,\n [BenjiConnectEventType.EVENT]: mapToOnEventData,\n} as const;\n\n","import { \n Endpoints\n} from '../config';\n\nimport { BenjiConnectMode } from '../types/config';\nimport {\n BenjiConnectEventType,\n type BenjiConnectEventMessage,\n} from '../types/event';\n\nimport type {\n BenjiConnectOnSuccessData,\n BenjiConnectOnExitData,\n BenjiConnectMetadata,\n BenjiConnectOnSuccessMetadata,\n BenjiConnectOnExitMetadata\n} from '../types/config';\n\nimport {\n BenjiConnectCallbackMapperMap,\n MessageRouterConfig,\n mapToOnEventData,\n type MessageRouterLoginContext,\n} from '../types/router';\nimport { isConnectMessageType, shouldRelayMessage } from '../utils/auth';\n\nexport class MessageRouter {\n\n static configuredListeners = false;\n static onSuccess?: (\n token: string, \n metadata: BenjiConnectOnSuccessMetadata\n ) => void;\n static onError?: (\n error: Error,\n error_id: string,\n metadata: BenjiConnectMetadata\n ) => void;\n static onExit?: (\n metadata: BenjiConnectOnExitMetadata\n ) => void;\n static onEvent?: (\n type: BenjiConnectEventType, \n metadata: BenjiConnectMetadata\n ) => void;\n static close?: () => void;\n static closeLoginPopup?: () => void;\n static navigateLoginPopup?: (url: string) => void;\n\n static iframe: HTMLIFrameElement | null = null;\n static loginPopup: Window | null = null;\n static mode: BenjiConnectMode = BenjiConnectMode.CONNECT;\n static connectOrigin = '';\n static isIframeReady = false;\n static pendingPopupAuth: MessageEvent<unknown>[] = [];\n\n static configureMessageRouter(config: MessageRouterConfig) {\n this.onSuccess = config.onSuccess;\n this.onError = config.onError;\n this.onExit = config.onExit;\n this.onEvent = config.onEvent;\n this.close = config.close;\n this.closeLoginPopup = config.closeLoginPopup;\n this.navigateLoginPopup = config.navigateLoginPopup;\n }\n\n static setLoginContext(context: MessageRouterLoginContext) {\n this.iframe = context.iframe;\n this.loginPopup = context.loginPopup;\n this.mode = context.mode;\n this.connectOrigin = new URL(Endpoints.benji_connect_auth_url).origin;\n if (this.isIframeReady) {\n this.flushPendingPopupAuth();\n }\n }\n\n static resetIframeReady() {\n this.isIframeReady = false;\n }\n\n static setMode(mode: BenjiConnectMode) {\n this.mode = mode;\n }\n\n static errorEventHandler = (event: Event) => { \n return MessageRouter.handleErrorMessage(event) \n };\n\n static messageEventHandler = (event: MessageEvent<unknown>) => { \n return MessageRouter.handleMessage(event) \n };\n\n static addEventListeners() {\n if (this.configuredListeners) return;\n window.addEventListener('error', this.errorEventHandler);\n window.addEventListener('unhandledrejection', this.errorEventHandler);\n window.addEventListener('message', this.messageEventHandler);\n this.configuredListeners = true;\n }\n\n static removeEventListeners() {\n window.removeEventListener('error', this.errorEventHandler);\n window.removeEventListener('unhandledrejection', this.errorEventHandler);\n window.removeEventListener('message', this.messageEventHandler);\n this.configuredListeners = false;\n this.iframe = null;\n this.loginPopup = null;\n this.mode = BenjiConnectMode.CONNECT;\n this.connectOrigin = '';\n this.isIframeReady = false;\n this.pendingPopupAuth = [];\n }\n\n static handleErrorMessage(event: Event) { \n switch(event.type) {\n case 'error': {\n const errorEvent = event as ErrorEvent;\n const error = errorEvent.error || new Error(errorEvent.message);\n break;\n }\n case 'unhandledrejection': {\n const rejectionEvent = event as PromiseRejectionEvent;\n const reason = rejectionEvent.reason instanceof Error\n ? rejectionEvent.reason\n : new Error(String(rejectionEvent.reason));\n break;\n }\n default: {\n console.error('[Benji Connect SDK] Received Unknown error message', event);\n break;\n }\n }\n }\n\n static relayToIframe(event: MessageEvent<unknown>) {\n const iframeWindow = this.iframe?.contentWindow;\n if (!this.isIframeReady || !iframeWindow) {\n this.pendingPopupAuth.push(event);\n return;\n }\n\n iframeWindow.postMessage(event.data, this.connectOrigin);\n }\n\n static markIframeReady(iframe: HTMLIFrameElement) {\n if (this.iframe !== iframe) return;\n this.isIframeReady = true;\n this.flushPendingPopupAuth();\n }\n\n static flushPendingPopupAuth() {\n if (!this.isIframeReady || !this.pendingPopupAuth.length) return;\n const queued = this.pendingPopupAuth;\n this.pendingPopupAuth = [];\n for (const event of queued) {\n this.relayToIframe(event);\n }\n }\n\n static relayToPopup(payload: unknown) {\n if (!this.loginPopup) {\n console.warn('[Benji Connect SDK] Skipping login auth relay, no login popup');\n return;\n }\n\n try {\n this.loginPopup.postMessage(payload, '*');\n } catch (error) {\n console.error('[Benji Connect SDK] Failed to forward login auth message to popup', error);\n }\n }\n\n static handleMessage(event: MessageEvent<unknown>) {\n if (shouldRelayMessage(this.mode, event.data)) {\n const expectedOrigin = this.connectOrigin || new URL(Endpoints.benji_connect_auth_url).origin;\n const iframeWindow = this.iframe?.contentWindow;\n\n if (this.loginPopup && event.source === this.loginPopup) {\n this.relayToIframe(event);\n return;\n }\n\n if (\n !this.loginPopup &&\n event.source instanceof Window &&\n event.source !== iframeWindow\n ) {\n this.pendingPopupAuth.push(event);\n return;\n }\n\n if (iframeWindow && event.source === iframeWindow) {\n if (event.origin !== expectedOrigin) {\n console.warn(\n '[Benji Connect SDK] Skipped auth relay, unexpected origin',\n event.origin,\n expectedOrigin,\n );\n return;\n }\n this.relayToPopup(event.data);\n return;\n }\n\n return;\n }\n\n if (!isConnectMessageType(event.data)) return;\n\n const expectedOrigin: string = new URL(Endpoints.benji_connect_auth_url).origin;\n if (!event || event.origin !== expectedOrigin) {\n console.warn('[Benji Connect SDK] Skipped message, received event from unexpected origin', event.origin, expectedOrigin);\n return;\n }\n\n const raw = event.data;\n if (!raw || typeof raw !== 'object') return;\n\n const partial = raw as Partial<BenjiConnectEventMessage>;\n if (typeof partial.type !== 'string') return;\n \n const message = partial as BenjiConnectEventMessage;\n\n try {\n switch (message.type) {\n\n case BenjiConnectEventType.PARTNER_LOGIN_OPEN: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.PARTNER_LOGIN_OPEN>;\n const url = connectMessage.data?.url;\n if (url) {\n this.navigateLoginPopup?.(url);\n } else {\n this.closeLoginPopup?.();\n }\n break;\n }\n\n case BenjiConnectEventType.AUTH_SUCCESS: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.AUTH_SUCCESS>;\n const callbackData = BenjiConnectCallbackMapperMap.AUTH_SUCCESS(connectMessage, connectMessage.data);\n this.onEvent?.(callbackData.type, callbackData.metadata); \n break;\n }\n\n case BenjiConnectEventType.FLOW_EXIT: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.FLOW_EXIT>;\n const callbackData = BenjiConnectCallbackMapperMap.FLOW_EXIT(connectMessage.data) as BenjiConnectOnExitData;\n this.onExit?.(callbackData.metadata);\n this.close?.();\n break;\n }\n\n case BenjiConnectEventType.FLOW_SUCCESS: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.FLOW_SUCCESS>;\n const callbackData = BenjiConnectCallbackMapperMap.FLOW_SUCCESS(connectMessage.data) as BenjiConnectOnSuccessData;\n this.onSuccess?.(callbackData.token, callbackData.metadata);\n if (this.mode === BenjiConnectMode.LOGIN) {\n this.close?.();\n }\n break;\n }\n\n case BenjiConnectEventType.ERROR: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.ERROR>;\n const callbackData = BenjiConnectCallbackMapperMap.ERROR(connectMessage.data);\n this.onError?.(callbackData.error, callbackData.error_id, callbackData.metadata);\n break;\n }\n\n case BenjiConnectEventType.EVENT: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.EVENT>;\n const callbackData = mapToOnEventData(connectMessage, connectMessage.data);\n this.onEvent?.(callbackData.type, callbackData.metadata);\n break;\n }\n\n default: {\n const _exhaustive: never = message.type;\n console.warn('[Benji Connect SDK] Unhandled connect message type', _exhaustive);\n break;\n }\n\n }\n } finally {\n // TODO: Any cleanup logic \n }\n }\n\n}\n","/// <reference path=\"./global.d.ts\" />\n\nimport { \n configureConfig, \n Endpoints\n} from './config';\n\nimport { \n type BenjiConnectConfig,\n BenjiConnectEnvironment,\n BenjiConnectMode,\n BenjiConnectPlacement,\n PartnerIntegrationType,\n} from './types/config';\n\nimport { \n buildContext, \n mapToConnectEnvironment \n} from './utils/config';\n\nimport { writeLoginPopupLoadingDocument } from './utils/loginPopupLoading';\nimport {\n appendLoginPopupFlag,\n preparePartnerAuthUrl,\n} from './utils/partnerAuthLink';\n\nimport {\n IFRAME_HEIGHT,\n IFRAME_WIDTH,\n applyHeadlessContainerStyle,\n applyHeadlessIframeStyle,\n applyIframeLayoutToElements,\n applyOverlayBaseStyle,\n attachRepositionListeners,\n buildLoginPopupFeatures,\n computePopupScreenPosition,\n type IframeLayoutState,\n type PopupLayoutState,\n type RepositionListenerHandle,\n} from './utils/placement';\n\nimport { MessageRouter } from './router/message';\nimport { BenjiConnectExitTrigger } from './types/event';\n\nconst POPUP_CLOSED_POLL_MS = 500;\n\nclass ConnectSDK {\n\n private sdkConfig: BenjiConnectConfig;\n private iframe: HTMLIFrameElement | null = null;\n private container: HTMLDivElement | null = null;\n private layoutState: IframeLayoutState = {\n layout: {\n top: 0,\n left: 0,\n width: IFRAME_WIDTH,\n height: IFRAME_HEIGHT,\n placement: BenjiConnectPlacement.CENTER,\n },\n lastValidAnchoredLayout: null,\n };\n private popupLayoutState: PopupLayoutState = {\n lastValidAnchoredLayout: null,\n };\n private repositionListeners: RepositionListenerHandle | null = null;\n private loginPopup: Window | null = null;\n private hasLoginPopupUrl = false;\n private popupClosedPollId: ReturnType<typeof setInterval> | null = null;\n private isClosing = false;\n /**\n * Aborts a pending open() when close() runs before the iframe mounts.\n * Non-DUMMY LOGIN arms listeners, then opens the partner popup synchronously,\n * then mounts a headless iframe. Without this, close() can tear down the popup\n * while the in-flight open() still mounts the iframe.\n */\n private openAbortController: AbortController | null = null;\n\n private onIframeLoad = (): void => {\n if (this.isClosing || !this.iframe) return;\n MessageRouter.markIframeReady(this.iframe);\n };\n\n constructor(config: BenjiConnectConfig) {\n\n this.sdkConfig = config;\n\n // Validations\n if (!this.sdkConfig.environment) throw new Error('Environment is required');\n if (!this.sdkConfig.token) throw new Error('Connect token is required');\n\n // Set internal config for environment based on consumer input at runtime\n const environment: BenjiConnectEnvironment = mapToConnectEnvironment(this.sdkConfig.environment);\n this.sdkConfig.environment = environment;\n configureConfig(environment);\n }\n\n private resolveAuthType(): PartnerIntegrationType | undefined {\n return this.sdkConfig.tokenData?.authType ?? this.sdkConfig.authType;\n }\n\n private isLoginPopupOnly(): boolean {\n const mode = this.sdkConfig.mode ?? BenjiConnectMode.CONNECT;\n const authType = this.resolveAuthType();\n return (\n mode === BenjiConnectMode.LOGIN &&\n authType != null &&\n authType !== PartnerIntegrationType.DUMMY\n );\n }\n\n private isSessionActive(): boolean {\n return this.iframe != null || this.loginPopup != null;\n }\n\n /** Cancels any open() still running between popup pre-open and iframe mount. */\n private abortInflightOpen(): void {\n this.openAbortController?.abort();\n this.openAbortController = null;\n }\n\n initialize() {\n MessageRouter.configureMessageRouter({\n onSuccess: this.sdkConfig.onSuccess,\n onError: this.sdkConfig.onError,\n onExit: this.sdkConfig.onExit,\n onEvent: this.sdkConfig.onEvent,\n close: () => this.close(),\n closeLoginPopup: () => this.closeLoginPopup(),\n navigateLoginPopup: (url: string) => this.navigateLoginPopup(url),\n });\n\n // TODO: Tracker.configureWithOptions(sdkOptions);\n // TODO: Tracker.trackSDKInitialized();\n }\n\n private openLoginPopup(): boolean {\n const position = computePopupScreenPosition(\n this.sdkConfig,\n this.popupLayoutState,\n { warnOnInvalidAnchor: true },\n );\n\n const partnerAuthLink = this.sdkConfig.tokenData?.partnerAuthLink;\n const configToken = this.sdkConfig.tokenData?.configToken;\n const preparedLink =\n partnerAuthLink && configToken\n ? preparePartnerAuthUrl(partnerAuthLink, configToken)\n : partnerAuthLink;\n const popupUrl = preparedLink\n ? appendLoginPopupFlag(preparedLink)\n : 'about:blank';\n\n this.loginPopup = window.open(\n popupUrl,\n 'benji_partner_auth',\n buildLoginPopupFeatures(position),\n );\n\n if (!this.loginPopup) {\n console.warn('[Connect SDK] Failed to pre-open LOGIN partner auth popup');\n this.sdkConfig.onError?.(\n new Error('Popup blocked. Allow popups for this site and try again.'),\n '400',\n { context: buildContext() },\n );\n return false;\n }\n\n if (preparedLink) {\n this.hasLoginPopupUrl = true;\n } else {\n writeLoginPopupLoadingDocument(this.loginPopup);\n }\n this.startPopupClosedPoll();\n return true;\n }\n\n private startPopupClosedPoll(): void {\n this.stopPopupClosedPoll();\n this.popupClosedPollId = setInterval(() => {\n if (this.isClosing) return;\n if (this.loginPopup?.closed) {\n this.sdkConfig.onExit?.({\n context: buildContext(),\n trigger: BenjiConnectExitTrigger.POPUP_CLOSED,\n });\n this.close();\n }\n }, POPUP_CLOSED_POLL_MS);\n }\n\n private stopPopupClosedPoll(): void {\n if (this.popupClosedPollId != null) {\n clearInterval(this.popupClosedPollId);\n this.popupClosedPollId = null;\n }\n }\n\n private repositionLoginPopup(): void {\n if (!this.loginPopup || this.loginPopup.closed) return;\n\n const position = computePopupScreenPosition(\n this.sdkConfig,\n this.popupLayoutState,\n );\n\n try {\n this.loginPopup.moveTo(\n Math.round(position.left),\n Math.round(position.top),\n );\n this.loginPopup.resizeTo(position.width, position.height);\n } catch (error) {\n console.warn('[Connect SDK] Failed to reposition LOGIN popup', error);\n }\n }\n\n async open() {\n if (this.isSessionActive()) return;\n\n const mode = this.sdkConfig.mode ?? BenjiConnectMode.CONNECT;\n const abortController = new AbortController();\n this.openAbortController = abortController;\n const { signal } = abortController;\n\n this.initialize();\n if (signal.aborted) return;\n\n MessageRouter.setMode(mode);\n MessageRouter.addEventListeners();\n\n if (this.isLoginPopupOnly()) {\n const opened = this.openLoginPopup();\n if (!opened) {\n this.abortInflightOpen();\n MessageRouter.removeEventListeners();\n return;\n }\n this.syncLoginContext(mode);\n }\n\n if (signal.aborted) {\n MessageRouter.removeEventListeners();\n return;\n }\n\n this.openUI();\n this.syncLoginContext(mode);\n // TODO: Track SDK Opened Tracker.trackSDKOpened();\n }\n\n private syncLoginContext(mode: BenjiConnectMode): void {\n MessageRouter.setLoginContext({\n iframe: this.iframe,\n loginPopup: this.loginPopup,\n mode,\n });\n }\n\n openUI() {\n // loginPopup may already be set for non-DUMMY LOGIN before the iframe mounts.\n if (this.iframe) return;\n\n MessageRouter.resetIframeReady();\n\n const headless = this.isLoginPopupOnly();\n\n this.container = document.createElement('div');\n if (headless) {\n applyHeadlessContainerStyle(this.container);\n } else {\n applyOverlayBaseStyle(this.container);\n }\n\n console.debug('[Connect SDK] endpoints', Endpoints);\n console.log('[Connect SDK] opeining URL', Endpoints.benji_connect_auth_url);\n const url = new URL(Endpoints.benji_connect_auth_url);\n const connectToken = this.sdkConfig.token;\n url.searchParams.set('connect_token', connectToken);\n url.searchParams.set('t', String(Date.now()));\n if (this.sdkConfig.mode != null) {\n url.searchParams.set('mode', String(this.sdkConfig.mode));\n }\n\n this.iframe = document.createElement('iframe');\n this.syncLoginContext(this.sdkConfig.mode ?? BenjiConnectMode.CONNECT);\n this.iframe.addEventListener('load', this.onIframeLoad);\n this.iframe.src = url.toString();\n\n this.container.appendChild(this.iframe);\n document.body.appendChild(this.container);\n\n if (headless) {\n applyHeadlessIframeStyle(this.iframe);\n this.repositionListeners = attachRepositionListeners(\n this.sdkConfig,\n () => this.repositionLoginPopup(),\n );\n } else {\n applyIframeLayoutToElements(\n this.sdkConfig,\n this.container,\n this.iframe,\n this.layoutState,\n { warnOnInvalidAnchor: true },\n );\n this.repositionListeners = attachRepositionListeners(\n this.sdkConfig,\n () => {\n if (!this.iframe || !this.container) return;\n applyIframeLayoutToElements(\n this.sdkConfig,\n this.container,\n this.iframe,\n this.layoutState,\n );\n },\n );\n\n this.container.addEventListener('click', (e) => {\n if (e.target === this.container) {\n // Trigger exit when user taps outside modal bounds\n this.sdkConfig.onExit?.({\n context: buildContext(),\n trigger: BenjiConnectExitTrigger.TAPPED_OUT_OF_BOUNDS\n });\n this.close();\n }\n });\n }\n\n this.syncLoginContext(this.sdkConfig.mode ?? BenjiConnectMode.CONNECT);\n }\n\n private navigateLoginPopup(url: string): void {\n if (this.hasLoginPopupUrl) return;\n if (!this.loginPopup || this.loginPopup.closed) {\n console.warn('[Connect SDK] Cannot navigate LOGIN popup — window unavailable');\n return;\n }\n try {\n this.loginPopup.location.href = url;\n this.hasLoginPopupUrl = true;\n } catch (error) {\n console.warn('[Connect SDK] Failed to navigate LOGIN popup', error);\n }\n }\n\n private closeLoginPopup(): void {\n if (!this.loginPopup) return;\n\n try {\n if (!this.loginPopup.closed) {\n this.loginPopup.close();\n }\n } catch (error) {\n console.warn('[Connect SDK] Error closing LOGIN popup', error);\n } finally {\n this.loginPopup = null;\n this.hasLoginPopupUrl = false;\n }\n }\n\n close() {\n // Abort in-flight open() even when the iframe has not mounted yet.\n this.abortInflightOpen();\n\n this.isClosing = true;\n this.stopPopupClosedPoll();\n this.closeLoginPopup();\n MessageRouter.removeEventListeners();\n\n if (!this.iframe) {\n this.isClosing = false;\n return;\n }\n\n this.repositionListeners?.remove();\n this.repositionListeners = null;\n this.layoutState.lastValidAnchoredLayout = null;\n this.popupLayoutState.lastValidAnchoredLayout = null;\n\n this.iframe.removeEventListener('load', this.onIframeLoad);\n\n if (this.container?.parentNode) {\n this.container.parentNode.removeChild(this.container);\n }\n this.iframe = null;\n this.container = null;\n this.isClosing = false;\n }\n\n cleanup() {\n if (this.iframe) this.close();\n }\n\n ping() { return 'pong'; }\n}\n\nexport default ConnectSDK;\n","/// <reference path=\"./global.d.ts\" />\nimport ConnectSDK from './connect-sdk';\n(globalThis as any).ConnectSDK = ConnectSDK;"],"mappings":"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","names":["endpoints","project_environment","endpoints","project_environment","endpoints","project_environment","BenjiConnectEventType","data","data","data","data","expectedOrigin","_a","_b"]}
package/dist/index.cjs CHANGED
@@ -169,7 +169,7 @@ function getEnvironment() {
169
169
  // src/utils/config.ts
170
170
  var buildContext = () => ({
171
171
  namespace: "benji-connect-sdk" ? "benji-connect-sdk" : "benji-connect-sdk",
172
- version: "1.1.4-beta.2" ? String("1.1.4-beta.2") : "0.0.0"
172
+ version: "1.1.4-beta.3" ? String("1.1.4-beta.3") : "0.0.0"
173
173
  });
174
174
  function isBenjiConnectEnvironment(environment) {
175
175
  return environment === "local" /* LOCAL */ || environment === "development" /* DEVELOPMENT */ || environment === "sandbox" /* SANDBOX */ || environment === "production" /* PRODUCTION */;
@@ -1020,13 +1020,17 @@ var _MessageRouter = class _MessageRouter {
1020
1020
  }
1021
1021
  static handleMessage(event) {
1022
1022
  var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
1023
- if (shouldRelayMessage(this.mode, event.data) && this.loginPopup) {
1023
+ if (shouldRelayMessage(this.mode, event.data)) {
1024
1024
  const expectedOrigin2 = this.connectOrigin || new URL(Endpoints.benji_connect_auth_url).origin;
1025
1025
  const iframeWindow = (_a = this.iframe) == null ? void 0 : _a.contentWindow;
1026
- if (event.source === this.loginPopup) {
1026
+ if (this.loginPopup && event.source === this.loginPopup) {
1027
1027
  this.relayToIframe(event);
1028
1028
  return;
1029
1029
  }
1030
+ if (!this.loginPopup && event.source instanceof Window && event.source !== iframeWindow) {
1031
+ this.pendingPopupAuth.push(event);
1032
+ return;
1033
+ }
1030
1034
  if (iframeWindow && event.source === iframeWindow) {
1031
1035
  if (event.origin !== expectedOrigin2) {
1032
1036
  console.warn(
@@ -1149,9 +1153,9 @@ var ConnectSDK = class {
1149
1153
  this.isClosing = false;
1150
1154
  /**
1151
1155
  * Aborts a pending open() when close() runs before the iframe mounts.
1152
- * Non-DUMMY LOGIN opens the partner popup synchronously, then awaits initialize()
1153
- * before mounting a headless iframe. Without this, close() can tear down the popup
1154
- * while the in-flight open() still registers listeners and mounts the iframe.
1156
+ * Non-DUMMY LOGIN arms listeners, then opens the partner popup synchronously,
1157
+ * then mounts a headless iframe. Without this, close() can tear down the popup
1158
+ * while the in-flight open() still mounts the iframe.
1155
1159
  */
1156
1160
  this.openAbortController = null;
1157
1161
  this.onIframeLoad = () => {
@@ -1184,7 +1188,7 @@ var ConnectSDK = class {
1184
1188
  (_a = this.openAbortController) == null ? void 0 : _a.abort();
1185
1189
  this.openAbortController = null;
1186
1190
  }
1187
- async initialize() {
1191
+ initialize() {
1188
1192
  MessageRouter.configureMessageRouter({
1189
1193
  onSuccess: this.sdkConfig.onSuccess,
1190
1194
  onError: this.sdkConfig.onError,
@@ -1272,17 +1276,19 @@ var ConnectSDK = class {
1272
1276
  const abortController = new AbortController();
1273
1277
  this.openAbortController = abortController;
1274
1278
  const { signal } = abortController;
1279
+ this.initialize();
1280
+ if (signal.aborted) return;
1281
+ MessageRouter.setMode(mode);
1282
+ MessageRouter.addEventListeners();
1275
1283
  if (this.isLoginPopupOnly()) {
1276
1284
  const opened = this.openLoginPopup();
1277
1285
  if (!opened) {
1278
1286
  this.abortInflightOpen();
1287
+ MessageRouter.removeEventListeners();
1279
1288
  return;
1280
1289
  }
1290
+ this.syncLoginContext(mode);
1281
1291
  }
1282
- await this.initialize();
1283
- if (signal.aborted) return;
1284
- MessageRouter.setMode(mode);
1285
- MessageRouter.addEventListeners();
1286
1292
  if (signal.aborted) {
1287
1293
  MessageRouter.removeEventListeners();
1288
1294
  return;