@benji-money/connect-sdk 1.1.0-beta.4 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -102,7 +102,7 @@ The SDK accepts the following configuration options:
102
102
  | ---- | ---------- | ----- |
103
103
  | **CONNECT** (default) | Centered or anchored modal iframe | No `authType`; standard connect / verify flow |
104
104
  | **LOGIN + DUMMY / no `authType`** | Same visible modal iframe | Partner auth runs in a nested iframe inside Benji Connect |
105
- | **LOGIN + non-DUMMY** | Partner popup only | Pass `authType`; Benji Connect iframe is headless — see [LOGIN popup example](#login-popup-example) below |
105
+ | **LOGIN + non-DUMMY** | Partner popup only | Pass `authType`; Benji Connect iframe is headless — popup shows a loading spinner until partner auth navigates — see [LOGIN popup example](#login-popup-example) below |
106
106
 
107
107
  ### Placement
108
108
 
@@ -172,7 +172,7 @@ const sdk = new ConnectSDK({
172
172
  await sdk.open();
173
173
  ```
174
174
 
175
- > **`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).
175
+ > **`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). The pre-opened popup shows generic loading UI (`Loading sign-in…`) until Benji Connect sends the partner auth URL.
176
176
 
177
177
  ### Environments
178
178
 
@@ -0,0 +1,14 @@
1
+ // These are compile-time constants replaced by tsup's `define` option.
2
+ // Declaring them globally prevents TypeScript errors.
3
+
4
+
5
+ declare global {
6
+ const __VERSION__: string;
7
+ const __NAMESPACE__: string;
8
+
9
+ // Global browser exposure for UMD builds
10
+ interface Window {
11
+ // SDK main class (UMD builds attach this)
12
+ ConnectSDK?: any;
13
+ }
14
+ }
@@ -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.0-beta.4" ? String("1.1.0-beta.4") : "0.0.0"
113
+ version: "1.1.0" ? String("1.1.0") : "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 */;
@@ -130,6 +130,92 @@ var ConnectSDK = (() => {
130
130
  return defaultEnvironment;
131
131
  }
132
132
 
133
+ // src/utils/loginPopupLoading.ts
134
+ var LOGIN_POPUP_TITLE = "User sign-in";
135
+ var LOGIN_POPUP_MESSAGE = "Loading sign-in\u2026";
136
+ function buildLoginPopupLoadingHtml() {
137
+ return `<!DOCTYPE html>
138
+ <html lang="en">
139
+ <head>
140
+ <meta charset="utf-8">
141
+ <meta name="viewport" content="width=device-width, initial-scale=1">
142
+ <title>${LOGIN_POPUP_TITLE}</title>
143
+ <style>
144
+ * { box-sizing: border-box; }
145
+ html, body {
146
+ margin: 0;
147
+ height: 100%;
148
+ background: #fff;
149
+ }
150
+ body {
151
+ width: 100%;
152
+ height: 100%;
153
+ display: flex;
154
+ justify-content: center;
155
+ align-items: center;
156
+ font-family: Inter, system-ui, -apple-system, sans-serif;
157
+ }
158
+ .loading-content {
159
+ display: flex;
160
+ flex-direction: column;
161
+ align-items: center;
162
+ gap: 14px;
163
+ padding: 24px;
164
+ max-width: 320px;
165
+ transform: translateY(-28px);
166
+ }
167
+ .loader {
168
+ width: 48px;
169
+ height: 48px;
170
+ border: 3px solid #e5e7eb;
171
+ border-top-color: #9ca3af;
172
+ border-radius: 50%;
173
+ animation: spin 0.75s linear infinite;
174
+ }
175
+ @keyframes spin {
176
+ to { transform: rotate(360deg); }
177
+ }
178
+ .loading-text {
179
+ font-size: 16px;
180
+ text-align: center;
181
+ font-family: Inter, sans-serif;
182
+ margin: 0;
183
+ background: linear-gradient(
184
+ 90deg,
185
+ #374151 0%,
186
+ #9ca3af 50%,
187
+ #374151 100%
188
+ );
189
+ background-size: 200% 100%;
190
+ -webkit-background-clip: text;
191
+ background-clip: text;
192
+ -webkit-text-fill-color: transparent;
193
+ animation: shimmer 1.8s ease-in-out infinite;
194
+ }
195
+ @keyframes shimmer {
196
+ 0% { background-position: 100% 0; }
197
+ 100% { background-position: -100% 0; }
198
+ }
199
+ </style>
200
+ </head>
201
+ <body>
202
+ <div class="loading-content">
203
+ <div class="loader" aria-hidden="true"></div>
204
+ <p class="loading-text">${LOGIN_POPUP_MESSAGE}</p>
205
+ </div>
206
+ </body>
207
+ </html>`;
208
+ }
209
+ function writeLoginPopupLoadingDocument(popup) {
210
+ try {
211
+ popup.document.open();
212
+ popup.document.write(buildLoginPopupLoadingHtml());
213
+ popup.document.close();
214
+ } catch (error) {
215
+ console.warn("[Connect SDK] Failed to write LOGIN popup loading document", error);
216
+ }
217
+ }
218
+
133
219
  // src/utils/placement.ts
134
220
  var IFRAME_WIDTH = 400;
135
221
  var IFRAME_HEIGHT = 645;
@@ -986,6 +1072,7 @@ var ConnectSDK = (() => {
986
1072
  );
987
1073
  return false;
988
1074
  }
1075
+ writeLoginPopupLoadingDocument(this.loginPopup);
989
1076
  this.startPopupClosedPoll();
990
1077
  return true;
991
1078
  }
@@ -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/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}","/**\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\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 }\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 }\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 (!iframeWindow) {\n console.warn('[Benji Connect SDK] Skipping login auth relay, iframe not ready');\n return;\n }\n\n iframeWindow.postMessage(event.data, this.connectOrigin);\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 {\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 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 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 isLoginPopupOnly(): boolean {\n const mode = this.sdkConfig.mode ?? BenjiConnectMode.CONNECT;\n return (\n mode === BenjiConnectMode.LOGIN &&\n this.sdkConfig.authType != null &&\n this.sdkConfig.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 this.loginPopup = window.open(\n 'about:blank',\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 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 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.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.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 } 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 }\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 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"]}
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/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","/**\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\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 }\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 }\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 (!iframeWindow) {\n console.warn('[Benji Connect SDK] Skipping login auth relay, iframe not ready');\n return;\n }\n\n iframeWindow.postMessage(event.data, this.connectOrigin);\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';\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 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 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 isLoginPopupOnly(): boolean {\n const mode = this.sdkConfig.mode ?? BenjiConnectMode.CONNECT;\n return (\n mode === BenjiConnectMode.LOGIN &&\n this.sdkConfig.authType != null &&\n this.sdkConfig.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 this.loginPopup = window.open(\n 'about:blank',\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 writeLoginPopupLoadingDocument(this.loginPopup);\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 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.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.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 } 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 }\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 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"]}