@benji-money/connect-sdk 1.1.4-beta.2 → 1.1.4-beta.4
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 +1 -1
- package/dist/connect-sdk.umd.global.js +48 -14
- package/dist/connect-sdk.umd.global.js.map +1 -1
- package/dist/index.cjs +48 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +48 -14
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -177,7 +177,7 @@ const sdk = new ConnectSDK({
|
|
|
177
177
|
await sdk.open();
|
|
178
178
|
```
|
|
179
179
|
|
|
180
|
-
> **`bottom-end`** positions the **partner popup** below the anchor with its right edge aligned to the anchor's right edge. The Benji Connect iframe stays headless (not visible). When `tokenData.partnerAuthLink` is set, the popup opens that URL on `open()` (with `state` from `configToken` when provided). The SDK skips `PARTNER_LOGIN_OPEN` navigation when the popup already has a partner URL. Popup→iframe auth messages are queued until the Connect iframe `load` event. Otherwise the pre-opened popup shows generic loading UI (`Loading sign-in…`) until Benji Connect sends the partner auth URL.
|
|
180
|
+
> **`bottom-end`** positions the **partner popup** below the anchor with its right edge aligned to the anchor's right edge. The Benji Connect iframe stays headless (not visible). When `tokenData.partnerAuthLink` is set, the popup opens that URL on `open()` (with `state` from `configToken` when provided) after LOGIN listeners and popup context are registered. The SDK skips `PARTNER_LOGIN_OPEN` navigation when the popup already has a partner URL. Popup→iframe auth messages are queued until the Connect iframe `load` event. Otherwise the pre-opened popup shows generic loading UI (`Loading sign-in…`) until Benji Connect sends the partner auth URL.
|
|
181
181
|
|
|
182
182
|
### Environments
|
|
183
183
|
|
|
@@ -110,7 +110,7 @@ var ConnectSDK = (() => {
|
|
|
110
110
|
// src/utils/config.ts
|
|
111
111
|
var buildContext = () => ({
|
|
112
112
|
namespace: "benji-connect-sdk" ? "benji-connect-sdk" : "benji-connect-sdk",
|
|
113
|
-
version: "1.1.4-beta.
|
|
113
|
+
version: "1.1.4-beta.4" ? String("1.1.4-beta.4") : "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 */;
|
|
@@ -723,6 +723,25 @@ var ConnectSDK = (() => {
|
|
|
723
723
|
function shouldRelayMessage(mode, data2) {
|
|
724
724
|
return mode === 5 /* LOGIN */ && isAuthMessageType(data2);
|
|
725
725
|
}
|
|
726
|
+
function sourceOpenerIsHost(source) {
|
|
727
|
+
try {
|
|
728
|
+
return source instanceof Window && source.opener === window;
|
|
729
|
+
} catch {
|
|
730
|
+
return false;
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
function isPopupOriginatedAuth(event, loginPopup, iframeWindow, connectOrigin) {
|
|
734
|
+
if (iframeWindow && event.source === iframeWindow) {
|
|
735
|
+
return false;
|
|
736
|
+
}
|
|
737
|
+
if (loginPopup && event.source === loginPopup) {
|
|
738
|
+
return true;
|
|
739
|
+
}
|
|
740
|
+
if (sourceOpenerIsHost(event.source)) {
|
|
741
|
+
return true;
|
|
742
|
+
}
|
|
743
|
+
return event.source instanceof Window && event.origin === connectOrigin && event.source !== iframeWindow;
|
|
744
|
+
}
|
|
726
745
|
function isConnectMessageType(data2) {
|
|
727
746
|
if (!data2 || typeof data2 !== "object") return false;
|
|
728
747
|
const type = data2.type;
|
|
@@ -904,6 +923,8 @@ var ConnectSDK = (() => {
|
|
|
904
923
|
}
|
|
905
924
|
}
|
|
906
925
|
}
|
|
926
|
+
// Forward popup/tab auth payloads into Connect. Queue until the iframe has loaded;
|
|
927
|
+
// otherwise fast SSO (Safari or already-authenticated) can arrive before contentWindow is usable.
|
|
907
928
|
static relayToIframe(event) {
|
|
908
929
|
var _a;
|
|
909
930
|
const iframeWindow = (_a = this.iframe) == null ? void 0 : _a.contentWindow;
|
|
@@ -919,10 +940,21 @@ var ConnectSDK = (() => {
|
|
|
919
940
|
this.flushPendingPopupAuth();
|
|
920
941
|
}
|
|
921
942
|
static flushPendingPopupAuth() {
|
|
943
|
+
var _a, _b;
|
|
922
944
|
if (!this.isIframeReady || !this.pendingPopupAuth.length) return;
|
|
945
|
+
const expectedOrigin = this.connectOrigin || new URL(Endpoints.benji_connect_auth_url).origin;
|
|
946
|
+
const iframeWindow = (_b = (_a = this.iframe) == null ? void 0 : _a.contentWindow) != null ? _b : null;
|
|
923
947
|
const queued = this.pendingPopupAuth;
|
|
924
948
|
this.pendingPopupAuth = [];
|
|
925
949
|
for (const event of queued) {
|
|
950
|
+
if (!isPopupOriginatedAuth(
|
|
951
|
+
event,
|
|
952
|
+
this.loginPopup,
|
|
953
|
+
iframeWindow,
|
|
954
|
+
expectedOrigin
|
|
955
|
+
)) {
|
|
956
|
+
continue;
|
|
957
|
+
}
|
|
926
958
|
this.relayToIframe(event);
|
|
927
959
|
}
|
|
928
960
|
}
|
|
@@ -939,13 +971,9 @@ var ConnectSDK = (() => {
|
|
|
939
971
|
}
|
|
940
972
|
static handleMessage(event) {
|
|
941
973
|
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
|
942
|
-
if (shouldRelayMessage(this.mode, event.data)
|
|
974
|
+
if (shouldRelayMessage(this.mode, event.data)) {
|
|
943
975
|
const expectedOrigin2 = this.connectOrigin || new URL(Endpoints.benji_connect_auth_url).origin;
|
|
944
976
|
const iframeWindow = (_a = this.iframe) == null ? void 0 : _a.contentWindow;
|
|
945
|
-
if (event.source === this.loginPopup) {
|
|
946
|
-
this.relayToIframe(event);
|
|
947
|
-
return;
|
|
948
|
-
}
|
|
949
977
|
if (iframeWindow && event.source === iframeWindow) {
|
|
950
978
|
if (event.origin !== expectedOrigin2) {
|
|
951
979
|
console.warn(
|
|
@@ -958,6 +986,10 @@ var ConnectSDK = (() => {
|
|
|
958
986
|
this.relayToPopup(event.data);
|
|
959
987
|
return;
|
|
960
988
|
}
|
|
989
|
+
if (isPopupOriginatedAuth(event, this.loginPopup, iframeWindow != null ? iframeWindow : null, expectedOrigin2)) {
|
|
990
|
+
this.relayToIframe(event);
|
|
991
|
+
return;
|
|
992
|
+
}
|
|
961
993
|
return;
|
|
962
994
|
}
|
|
963
995
|
if (!isConnectMessageType(event.data)) return;
|
|
@@ -1068,9 +1100,9 @@ var ConnectSDK = (() => {
|
|
|
1068
1100
|
this.isClosing = false;
|
|
1069
1101
|
/**
|
|
1070
1102
|
* Aborts a pending open() when close() runs before the iframe mounts.
|
|
1071
|
-
* Non-DUMMY LOGIN opens the partner popup synchronously,
|
|
1072
|
-
*
|
|
1073
|
-
* while the in-flight open() still
|
|
1103
|
+
* Non-DUMMY LOGIN arms listeners, then opens the partner popup synchronously,
|
|
1104
|
+
* then mounts a headless iframe. Without this, close() can tear down the popup
|
|
1105
|
+
* while the in-flight open() still mounts the iframe.
|
|
1074
1106
|
*/
|
|
1075
1107
|
this.openAbortController = null;
|
|
1076
1108
|
this.onIframeLoad = () => {
|
|
@@ -1103,7 +1135,7 @@ var ConnectSDK = (() => {
|
|
|
1103
1135
|
(_a = this.openAbortController) == null ? void 0 : _a.abort();
|
|
1104
1136
|
this.openAbortController = null;
|
|
1105
1137
|
}
|
|
1106
|
-
|
|
1138
|
+
initialize() {
|
|
1107
1139
|
MessageRouter.configureMessageRouter({
|
|
1108
1140
|
onSuccess: this.sdkConfig.onSuccess,
|
|
1109
1141
|
onError: this.sdkConfig.onError,
|
|
@@ -1191,17 +1223,19 @@ var ConnectSDK = (() => {
|
|
|
1191
1223
|
const abortController = new AbortController();
|
|
1192
1224
|
this.openAbortController = abortController;
|
|
1193
1225
|
const { signal } = abortController;
|
|
1226
|
+
this.initialize();
|
|
1227
|
+
if (signal.aborted) return;
|
|
1228
|
+
MessageRouter.setMode(mode);
|
|
1229
|
+
MessageRouter.addEventListeners();
|
|
1194
1230
|
if (this.isLoginPopupOnly()) {
|
|
1195
1231
|
const opened = this.openLoginPopup();
|
|
1196
1232
|
if (!opened) {
|
|
1197
1233
|
this.abortInflightOpen();
|
|
1234
|
+
MessageRouter.removeEventListeners();
|
|
1198
1235
|
return;
|
|
1199
1236
|
}
|
|
1237
|
+
this.syncLoginContext(mode);
|
|
1200
1238
|
}
|
|
1201
|
-
await this.initialize();
|
|
1202
|
-
if (signal.aborted) return;
|
|
1203
|
-
MessageRouter.setMode(mode);
|
|
1204
|
-
MessageRouter.addEventListeners();
|
|
1205
1239
|
if (signal.aborted) {
|
|
1206
1240
|
MessageRouter.removeEventListeners();
|
|
1207
1241
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config/production.ts","../src/config/sandbox.ts","../src/config/development.ts","../src/config/local.defaults.ts","../src/utils/environment.ts","../src/config/index.ts","../src/utils/config.ts","../src/utils/loginPopupLoading.ts","../src/utils/partnerAuthLink.ts","../src/utils/placement.ts","../src/types/event.ts","../src/utils/auth.ts","../src/utils/user.ts","../src/utils/transaction.ts","../src/types/router.ts","../src/router/message.ts","../src/connect-sdk.ts","../src/global.ts"],"sourcesContent":["export const project_environment: string = 'production';\n\nexport const endpoints: Record<string, string> = {\n 'benji_connect_auth_url':'https://verifyapp.withbenji.com',\n 'benji_connect_auth_service_url' : 'https://authservice.withbenji.com'\n}","export const project_environment: string = 'sandbox';\n\nexport const endpoints: Record<string, string> = {\n 'benji_connect_auth_url':'https://verifyapp-staging.withbenji.com',\n 'benji_connect_auth_service_url' : 'https://authservice-staging.withbenji.com'\n}","export const project_environment: string = 'development';\n\nexport const endpoints: Record<string, string> = {\n 'benji_connect_auth_url': 'https://verifyapp-dev.withbenji.com',\n 'benji_connect_auth_service_url': 'https://authservice-dev.withbenji.com',\n};","/**\n * Build-time fallback when gitignored `local.ts` is absent (CI, fresh clones).\n * Same endpoints as development — not machine-specific localhost overrides.\n * Copy to `local.ts` locally for localhost URLs; see RELEASE.md.\n */\nexport const project_environment: string = 'local';\n\nexport const endpoints: Record<string, string> = {\n benji_connect_auth_url: 'https://verifyapp-dev.withbenji.com',\n benji_connect_auth_service_url: 'https://authservice-dev.withbenji.com',\n};\n","/** Hostnames that browsers use for loopback when typed literally in the URL bar. */\nexport const LOCAL_HOSTNAMES = ['localhost', '127.0.0.1', '::1', '[::1]'] as const;\n\nconst LOCAL_HOSTNAME_SET: ReadonlySet<string> = new Set(LOCAL_HOSTNAMES);\n\nexport function isLocalHost(\n hostname: string = typeof window !== 'undefined' ? window.location.hostname : ''\n): boolean {\n if (LOCAL_HOSTNAME_SET.has(hostname)) {\n return true;\n }\n // IPv4 loopback block 127.0.0.0/8 — covers 127.0.0.1 without listing every address\n if (hostname.startsWith('127.')) {\n return true;\n }\n return false;\n}\n","import * as productionConfig from './production';\nimport * as sandboxConfig from './sandbox';\nimport * as developmentConfig from './development';\nimport * as localConfig from './local';\nimport { BenjiConnectEnvironment } from '../types/config';\nimport { isLocalHost } from '../utils/environment';\n\nexport type EnvironmentConfigModule = {\n project_environment: string;\n endpoints: Record<string, string>;\n};\n\nconst env = typeof process !== 'undefined' ? process.env : {};\nlet data: EnvironmentConfigModule = developmentConfig;\ntype EndpointConfig = typeof developmentConfig.endpoints;\nexport let Endpoints: EndpointConfig = getEndpoints();\nexport let Environment = BenjiConnectEnvironment.DEVELOPMENT;\n\nexport function configureConfig(environment: BenjiConnectEnvironment) {\n if (environment == 'production') {\n console.log('[Connect SDK] configuring with environment production');\n data = productionConfig;\n } else if (environment == 'sandbox') {\n console.log('[Connect SDK] configuring with environment sandbox');\n data = sandboxConfig;\n } else if (environment == 'development') {\n console.log('[Connect SDK] configuring with environment development');\n data = developmentConfig;\n } else if (environment == 'local') {\n if (isLocalHost()) {\n console.log('[Connect SDK] configuring with environment local');\n data = localConfig;\n } else {\n console.log(\n '[Connect SDK] local environment requested on non-local host; using development'\n );\n data = developmentConfig;\n }\n }\n Endpoints = getEndpoints();\n Environment = getEnvironment();\n}\n\nfunction getEndpoints(): EndpointConfig {\n const entries = Object.entries(data.endpoints).map(([key, value]) => {\n const override = env?.[key] || value;\n return [key, override] as const;\n });\n return Object.fromEntries(entries) as EndpointConfig;\n}\n\nfunction getEnvironment(): BenjiConnectEnvironment {\n return data['project_environment'] as BenjiConnectEnvironment;\n}\n\nexport const Namespace = __NAMESPACE__;\nexport const Version = __VERSION__;\n","import { BenjiConnectEnvironment } from \"../types/config\";\nimport { isLocalHost } from \"./environment\";\n\nexport const buildContext = () => ({\n namespace: typeof __NAMESPACE__ !== 'undefined' && __NAMESPACE__ ? __NAMESPACE__ : 'benji-connect-sdk',\n version: typeof __VERSION__ !== 'undefined' && __VERSION__ ? String(__VERSION__) : '0.0.0',\n});\n\nexport function isBenjiConnectEnvironment(\n environment: unknown\n): environment is BenjiConnectEnvironment {\n return (\n environment === BenjiConnectEnvironment.LOCAL ||\n environment === BenjiConnectEnvironment.DEVELOPMENT ||\n environment === BenjiConnectEnvironment.SANDBOX ||\n environment === BenjiConnectEnvironment.PRODUCTION\n );\n}\n\nexport function mapToConnectEnvironment(\n environment: BenjiConnectEnvironment | string\n): BenjiConnectEnvironment {\n\n if (isBenjiConnectEnvironment(environment)) return environment;\n\n const environments: Record<string, BenjiConnectEnvironment> = {\n local: BenjiConnectEnvironment.LOCAL,\n development: BenjiConnectEnvironment.DEVELOPMENT,\n sandbox: BenjiConnectEnvironment.SANDBOX,\n production: BenjiConnectEnvironment.PRODUCTION,\n };\n const mapped = environments[environment];\n if (mapped) return mapped;\n\n const defaultEnvironment = isLocalHost()\n ? BenjiConnectEnvironment.LOCAL\n : BenjiConnectEnvironment.DEVELOPMENT;\n console.warn(`[Benji Connect SDK] ${environment} not valid environment defaulting to ${defaultEnvironment}`);\n\n return defaultEnvironment;\n}","const LOGIN_POPUP_TITLE = 'User sign-in';\nconst LOGIN_POPUP_MESSAGE = 'Loading sign-in\\u2026';\n\nexport function buildLoginPopupLoadingHtml(): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>${LOGIN_POPUP_TITLE}</title>\n <style>\n * { box-sizing: border-box; }\n html, body {\n margin: 0;\n height: 100%;\n background: #fff;\n }\n body {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n font-family: Inter, system-ui, -apple-system, sans-serif;\n }\n .loading-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 14px;\n padding: 24px;\n max-width: 320px;\n transform: translateY(-28px);\n }\n .loader {\n width: 48px;\n height: 48px;\n border: 3px solid #e5e7eb;\n border-top-color: #9ca3af;\n border-radius: 50%;\n animation: spin 0.75s linear infinite;\n }\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n .loading-text {\n font-size: 16px;\n text-align: center;\n font-family: Inter, sans-serif;\n margin: 0;\n background: linear-gradient(\n 90deg,\n #374151 0%,\n #9ca3af 50%,\n #374151 100%\n );\n background-size: 200% 100%;\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n animation: shimmer 1.8s ease-in-out infinite;\n }\n @keyframes shimmer {\n 0% { background-position: 100% 0; }\n 100% { background-position: -100% 0; }\n }\n </style>\n</head>\n<body>\n <div class=\"loading-content\">\n <div class=\"loader\" aria-hidden=\"true\"></div>\n <p class=\"loading-text\">${LOGIN_POPUP_MESSAGE}</p>\n </div>\n</body>\n</html>`;\n}\n\nexport function writeLoginPopupLoadingDocument(popup: Window): void {\n try {\n popup.document.open();\n popup.document.write(buildLoginPopupLoadingHtml());\n popup.document.close();\n } catch (error) {\n console.warn('[Connect SDK] Failed to write LOGIN popup loading document', error);\n }\n}\n","export const LOGIN_POPUP_QUERY_FLAG = 'benji_login_popup';\n\nexport function ensureAuthLinkStateNonce(url: string, nonce: string): string {\n try {\n const parsed = new URL(url);\n if (!parsed.searchParams.get('state')) {\n parsed.searchParams.set('state', nonce);\n }\n return parsed.toString();\n } catch {\n if (url.includes('state=')) {\n return url;\n }\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}state=${encodeURIComponent(nonce)}`;\n }\n}\n\n/** Appends `benji_login_popup=1` without altering other query params (e.g. PKCE `state`). */\nexport function appendLoginPopupFlag(url: string): string {\n try {\n const parsed = new URL(url);\n parsed.searchParams.set(LOGIN_POPUP_QUERY_FLAG, '1');\n return parsed.toString();\n } catch {\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}${LOGIN_POPUP_QUERY_FLAG}=1`;\n }\n}\n\nexport function preparePartnerAuthUrl(url: string, nonce: string): string {\n return ensureAuthLinkStateNonce(url, nonce);\n}\n","/**\n * Anchor-based iframe placement and host DOM application. Naming follows Floating UI /\n * Popper conventions (`bottom-end`, `bottom-start`). Computes layout rects, applies styles\n * to overlay/iframe elements, and manages reposition listeners.\n * @see https://floating-ui.com/docs/computePosition#placement\n */\n\nimport {\n BenjiConnectPlacement,\n type BenjiConnectAnchor,\n type BenjiConnectConfig,\n type BenjiConnectPlacementOffset,\n} from '../types/config';\n\nexport const IFRAME_WIDTH = 400;\nexport const IFRAME_HEIGHT = 645;\n\n/** LOGIN partner-auth popup dimensions (SDK-managed window). */\nexport const POPUP_WIDTH = 420;\nexport const POPUP_HEIGHT = 640;\n\nconst IFRAME_STATIC_STYLE: CSSStyleDeclaration = {\n border: 'none',\n borderRadius: '20px',\n overflow: 'hidden',\n} as CSSStyleDeclaration;\n\nconst CONTAINER_BASE_STYLE: CSSStyleDeclaration = {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n backgroundColor: 'rgba(0,0,0,0.5)',\n zIndex: '9999',\n} as CSSStyleDeclaration;\n\nconst VIEWPORT_PADDING = 8;\n\nexport interface IframeRect {\n top: number;\n left: number;\n width: number;\n height: number;\n placement: BenjiConnectPlacement;\n}\n\nexport interface ViewportSize {\n width: number;\n height: number;\n}\n\nexport interface ResolveIframeLayoutOptions {\n warnOnInvalidAnchor?: boolean;\n preserveAnchoredLayout?: IframeRect | null;\n}\n\nfunction isPreservableAnchoredLayout(\n layout: IframeRect | null | undefined,\n): layout is IframeRect {\n return (\n layout != null && layout.placement !== BenjiConnectPlacement.CENTER\n );\n}\n\nfunction clampPreservedAnchoredLayout(\n layout: IframeRect,\n viewport: ViewportSize,\n): IframeRect {\n const maxLeft = viewport.width - layout.width - VIEWPORT_PADDING;\n const maxTop = viewport.height - layout.height - VIEWPORT_PADDING;\n const minLeft = VIEWPORT_PADDING;\n const minTop = VIEWPORT_PADDING;\n\n return {\n ...layout,\n left:\n maxLeft < minLeft\n ? minLeft\n : Math.min(Math.max(layout.left, minLeft), maxLeft),\n top:\n maxTop < minTop\n ? minTop\n : Math.min(Math.max(layout.top, minTop), maxTop),\n };\n}\n\nfunction preservedAnchoredLayoutOrCenter(\n viewport: ViewportSize,\n options: ResolveIframeLayoutOptions,\n): IframeRect {\n const { preserveAnchoredLayout } = options;\n if (isPreservableAnchoredLayout(preserveAnchoredLayout)) {\n return clampPreservedAnchoredLayout(preserveAnchoredLayout, viewport);\n }\n return centerLayout(viewport);\n}\n\nfunction isRefLikeAnchor(\n anchor: BenjiConnectAnchor,\n): anchor is { value: HTMLElement | null | undefined } {\n return (\n typeof anchor === 'object' &&\n anchor !== null &&\n !(anchor instanceof HTMLElement) &&\n 'value' in anchor\n );\n}\n\nexport function resolveAnchor(\n anchor: BenjiConnectAnchor | undefined,\n): HTMLElement | null {\n if (!anchor) {\n return null;\n }\n if (typeof anchor === 'string') {\n return document.querySelector<HTMLElement>(anchor);\n }\n if (typeof anchor === 'function') {\n const resolved = anchor();\n return resolved instanceof HTMLElement ? resolved : null;\n }\n if (isRefLikeAnchor(anchor)) {\n const el = anchor.value;\n return el instanceof HTMLElement ? el : null;\n }\n return anchor instanceof HTMLElement ? anchor : null;\n}\n\nexport function isAnchorVisible(el: HTMLElement): boolean {\n if (!el.isConnected) {\n return false;\n }\n const style = window.getComputedStyle(el);\n if (style.display === 'none' || style.visibility === 'hidden') {\n return false;\n }\n const rect = el.getBoundingClientRect();\n return rect.width > 0 || rect.height > 0;\n}\n\nexport function resolveEffectivePlacement(\n config: Pick<BenjiConnectConfig, 'anchor' | 'placement'>,\n): BenjiConnectPlacement {\n if (!config.anchor) {\n return BenjiConnectPlacement.CENTER;\n }\n return config.placement ?? BenjiConnectPlacement.BOTTOM_END;\n}\n\nexport function defaultOffset(\n offset?: BenjiConnectPlacementOffset,\n): Required<BenjiConnectPlacementOffset> {\n return {\n top: offset?.top ?? 0,\n left: offset?.left ?? 0,\n };\n}\n\nexport function resolveIframeDimensions(viewport: ViewportSize): {\n width: number;\n height: number;\n} {\n const maxW = viewport.width - 2 * VIEWPORT_PADDING;\n const maxH = viewport.height - 2 * VIEWPORT_PADDING;\n const scale = Math.min(1, maxW / IFRAME_WIDTH, maxH / IFRAME_HEIGHT);\n return {\n width: Math.floor(IFRAME_WIDTH * scale),\n height: Math.floor(IFRAME_HEIGHT * scale),\n };\n}\n\nexport function iframeFitsHorizontally(\n viewportWidth: number,\n iframeWidth: number = IFRAME_WIDTH,\n): boolean {\n return viewportWidth >= iframeWidth + 2 * VIEWPORT_PADDING;\n}\n\nfunction centerLayout(viewport: ViewportSize): IframeRect {\n const { width, height } = resolveIframeDimensions(viewport);\n return {\n top: 0,\n left: 0,\n width,\n height,\n placement: BenjiConnectPlacement.CENTER,\n };\n}\n\nexport function fitsBelow(\n anchorBottom: number,\n offsetTop: number,\n viewportHeight: number,\n iframeHeight: number = IFRAME_HEIGHT,\n): boolean {\n const top = anchorBottom + offsetTop;\n const bottom = top + iframeHeight;\n return (\n top >= VIEWPORT_PADDING && bottom <= viewportHeight - VIEWPORT_PADDING\n );\n}\n\nfunction clampHorizontal(left: number, viewportWidth: number): number {\n const min = VIEWPORT_PADDING;\n const max = viewportWidth - IFRAME_WIDTH - VIEWPORT_PADDING;\n if (max < min) {\n return min;\n }\n return Math.min(Math.max(left, min), max);\n}\n\nfunction warnInvalidAnchor(message: string): void {\n console.warn(`[Benji Connect SDK] ${message}`);\n}\n\nexport function computeIframeRect(\n anchorElement: HTMLElement,\n placement: BenjiConnectPlacement,\n offset: BenjiConnectPlacementOffset,\n viewport: ViewportSize,\n options: ResolveIframeLayoutOptions = {},\n): IframeRect {\n const { warnOnInvalidAnchor = false } = options;\n const resolvedOffset = defaultOffset(offset);\n\n if (placement === BenjiConnectPlacement.CENTER) {\n return centerLayout(viewport);\n }\n\n if (!isAnchorVisible(anchorElement)) {\n if (isPreservableAnchoredLayout(options.preserveAnchoredLayout)) {\n return clampPreservedAnchoredLayout(\n options.preserveAnchoredLayout,\n viewport,\n );\n }\n if (warnOnInvalidAnchor) {\n warnInvalidAnchor(\n 'anchor is hidden or detached; falling back to centered modal',\n );\n }\n return centerLayout(viewport);\n }\n\n const rect = anchorElement.getBoundingClientRect();\n\n if (!fitsBelow(rect.bottom, resolvedOffset.top, viewport.height)) {\n return centerLayout(viewport);\n }\n\n if (!iframeFitsHorizontally(viewport.width)) {\n return centerLayout(viewport);\n }\n\n const top = rect.bottom + resolvedOffset.top;\n const idealLeft =\n placement === BenjiConnectPlacement.BOTTOM_END\n ? rect.right - IFRAME_WIDTH + resolvedOffset.left\n : rect.left + resolvedOffset.left;\n\n if (idealLeft < VIEWPORT_PADDING) {\n if (warnOnInvalidAnchor) {\n warnInvalidAnchor(\n 'anchor rect is unusable for placement; falling back to centered modal',\n );\n }\n return centerLayout(viewport);\n }\n\n const left = clampHorizontal(idealLeft, viewport.width);\n\n return {\n top,\n left,\n width: IFRAME_WIDTH,\n height: IFRAME_HEIGHT,\n placement,\n };\n}\n\nexport function resolveIframeLayout(\n config: BenjiConnectConfig,\n viewport: ViewportSize = {\n width: window.innerWidth,\n height: window.innerHeight,\n },\n options: ResolveIframeLayoutOptions = {},\n): IframeRect {\n const { warnOnInvalidAnchor = true } = options;\n const placement = resolveEffectivePlacement(config);\n const anchorElement = resolveAnchor(config.anchor);\n\n if (\n warnOnInvalidAnchor &&\n placement !== BenjiConnectPlacement.CENTER &&\n !anchorElement\n ) {\n warnInvalidAnchor('anchor not found; falling back to centered modal');\n return preservedAnchoredLayoutOrCenter(viewport, options);\n }\n\n if (placement === BenjiConnectPlacement.CENTER) {\n return centerLayout(viewport);\n }\n\n if (!anchorElement) {\n return preservedAnchoredLayoutOrCenter(viewport, options);\n }\n\n return computeIframeRect(\n anchorElement,\n placement,\n config.offset,\n viewport,\n options,\n );\n}\n\n// --- DOM application ---\n\nexport interface IframeLayoutState {\n layout: IframeRect;\n lastValidAnchoredLayout: IframeRect | null;\n}\n\nexport interface RepositionListenerHandle {\n remove(): void;\n}\n\nexport function applyOverlayBaseStyle(container: HTMLDivElement): void {\n Object.assign(container.style, CONTAINER_BASE_STYLE);\n}\n\nfunction getVisualViewportOffset(): { top: number; left: number } {\n const vv = window.visualViewport;\n if (!vv) {\n return { top: 0, left: 0 };\n }\n return { top: vv.offsetTop, left: vv.offsetLeft };\n}\n\nfunction getRepositionScrollTargets(\n anchor: BenjiConnectAnchor | undefined,\n): Array<Window | HTMLElement> {\n const targets = new Set<Window | HTMLElement>([window]);\n const anchorElement = resolveAnchor(anchor);\n\n if (!anchorElement) {\n return [...targets];\n }\n\n targets.add(anchorElement);\n\n let parent: HTMLElement | null = anchorElement.parentElement;\n while (parent) {\n const { overflow, overflowX, overflowY } = window.getComputedStyle(parent);\n const overflowValue = `${overflow} ${overflowX} ${overflowY}`;\n\n if (/(auto|scroll|overlay)/.test(overflowValue)) {\n targets.add(parent);\n }\n\n parent = parent.parentElement;\n }\n\n return [...targets];\n}\n\nexport function applyIframeLayoutToElements(\n config: BenjiConnectConfig,\n container: HTMLDivElement,\n iframe: HTMLIFrameElement,\n state: IframeLayoutState,\n options: ResolveIframeLayoutOptions = { warnOnInvalidAnchor: false },\n): void {\n state.layout = resolveIframeLayout(config, undefined, {\n ...options,\n preserveAnchoredLayout: state.lastValidAnchoredLayout,\n });\n\n if (state.layout.placement !== BenjiConnectPlacement.CENTER) {\n state.lastValidAnchoredLayout = state.layout;\n }\n\n const iframeStyle = {\n ...IFRAME_STATIC_STYLE,\n width: `${state.layout.width}px`,\n height: `${state.layout.height}px`,\n };\n\n if (state.layout.placement === BenjiConnectPlacement.CENTER) {\n Object.assign(container.style, {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'auto',\n });\n Object.assign(iframe.style, iframeStyle, {\n position: 'relative',\n top: '',\n left: '',\n });\n return;\n }\n\n Object.assign(container.style, {\n display: 'block',\n overflow: 'auto',\n });\n\n const viewportOffset = getVisualViewportOffset();\n Object.assign(iframe.style, iframeStyle, {\n position: 'fixed',\n top: `${state.layout.top + viewportOffset.top}px`,\n left: `${state.layout.left + viewportOffset.left}px`,\n });\n}\n\nexport interface PopupScreenPosition {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nexport interface PopupLayoutState {\n lastValidAnchoredLayout: IframeRect | null;\n}\n\nfunction popupFitsBelow(\n anchorBottom: number,\n offsetTop: number,\n viewportHeight: number,\n): boolean {\n const top = anchorBottom + offsetTop;\n const bottom = top + POPUP_HEIGHT;\n return (\n top >= VIEWPORT_PADDING && bottom <= viewportHeight - VIEWPORT_PADDING\n );\n}\n\nfunction popupFitsHorizontally(viewportWidth: number): boolean {\n return viewportWidth >= POPUP_WIDTH + 2 * VIEWPORT_PADDING;\n}\n\nfunction clampPopupHorizontal(left: number, viewportWidth: number): number {\n const min = VIEWPORT_PADDING;\n const max = viewportWidth - POPUP_WIDTH - VIEWPORT_PADDING;\n if (max < min) {\n return min;\n }\n return Math.min(Math.max(left, min), max);\n}\n\nfunction centerPopupViewportRect(viewport: ViewportSize): IframeRect {\n const left = Math.max(\n VIEWPORT_PADDING,\n (viewport.width - POPUP_WIDTH) / 2,\n );\n const top = Math.max(\n VIEWPORT_PADDING,\n (viewport.height - POPUP_HEIGHT) / 2,\n );\n return {\n top,\n left,\n width: POPUP_WIDTH,\n height: POPUP_HEIGHT,\n placement: BenjiConnectPlacement.CENTER,\n };\n}\n\nfunction computePopupViewportRect(\n anchorElement: HTMLElement,\n placement: BenjiConnectPlacement,\n offset: BenjiConnectPlacementOffset,\n viewport: ViewportSize,\n options: ResolveIframeLayoutOptions = {},\n): IframeRect {\n const { warnOnInvalidAnchor = false } = options;\n const resolvedOffset = defaultOffset(offset);\n\n if (placement === BenjiConnectPlacement.CENTER) {\n return centerPopupViewportRect(viewport);\n }\n\n if (!isAnchorVisible(anchorElement)) {\n if (isPreservableAnchoredLayout(options.preserveAnchoredLayout)) {\n return clampPreservedAnchoredLayout(\n options.preserveAnchoredLayout,\n viewport,\n );\n }\n if (warnOnInvalidAnchor) {\n warnInvalidAnchor(\n 'anchor is hidden or detached; falling back to centered popup',\n );\n }\n return centerPopupViewportRect(viewport);\n }\n\n const rect = anchorElement.getBoundingClientRect();\n\n if (!popupFitsBelow(rect.bottom, resolvedOffset.top, viewport.height)) {\n return centerPopupViewportRect(viewport);\n }\n\n if (!popupFitsHorizontally(viewport.width)) {\n return centerPopupViewportRect(viewport);\n }\n\n const top = rect.bottom + resolvedOffset.top;\n const idealLeft =\n placement === BenjiConnectPlacement.BOTTOM_END\n ? rect.right - POPUP_WIDTH + resolvedOffset.left\n : rect.left + resolvedOffset.left;\n\n if (idealLeft < VIEWPORT_PADDING) {\n if (warnOnInvalidAnchor) {\n warnInvalidAnchor(\n 'anchor rect is unusable for popup placement; falling back to centered popup',\n );\n }\n return centerPopupViewportRect(viewport);\n }\n\n const left = clampPopupHorizontal(idealLeft, viewport.width);\n\n return {\n top,\n left,\n width: POPUP_WIDTH,\n height: POPUP_HEIGHT,\n placement,\n };\n}\n\nexport function resolvePopupViewportLayout(\n config: BenjiConnectConfig,\n viewport: ViewportSize = {\n width: window.innerWidth,\n height: window.innerHeight,\n },\n options: ResolveIframeLayoutOptions = {},\n): IframeRect {\n const { warnOnInvalidAnchor = true } = options;\n const placement = resolveEffectivePlacement(config);\n const anchorElement = resolveAnchor(config.anchor);\n\n if (\n warnOnInvalidAnchor &&\n placement !== BenjiConnectPlacement.CENTER &&\n !anchorElement\n ) {\n warnInvalidAnchor('anchor not found; falling back to centered popup');\n if (isPreservableAnchoredLayout(options.preserveAnchoredLayout)) {\n return clampPreservedAnchoredLayout(\n options.preserveAnchoredLayout,\n viewport,\n );\n }\n return centerPopupViewportRect(viewport);\n }\n\n if (placement === BenjiConnectPlacement.CENTER || !anchorElement) {\n return centerPopupViewportRect(viewport);\n }\n\n return computePopupViewportRect(\n anchorElement,\n placement,\n config.offset,\n viewport,\n options,\n );\n}\n\nexport function computePopupScreenPosition(\n config: BenjiConnectConfig,\n state: PopupLayoutState = { lastValidAnchoredLayout: null },\n options: ResolveIframeLayoutOptions = {},\n): PopupScreenPosition {\n const layout = resolvePopupViewportLayout(config, undefined, {\n ...options,\n preserveAnchoredLayout: state.lastValidAnchoredLayout,\n });\n\n if (layout.placement !== BenjiConnectPlacement.CENTER) {\n state.lastValidAnchoredLayout = layout;\n }\n\n const viewportOffset = getVisualViewportOffset();\n\n return {\n left: window.screenX + layout.left + viewportOffset.left,\n top: window.screenY + layout.top + viewportOffset.top,\n width: layout.width,\n height: layout.height,\n };\n}\n\nexport function buildLoginPopupFeatures(position: PopupScreenPosition): string {\n return [\n `width=${position.width}`,\n `height=${position.height}`,\n `left=${Math.round(position.left)}`,\n `top=${Math.round(position.top)}`,\n 'scrollbars=yes',\n 'resizable=yes',\n ].join(',');\n}\n\nexport function applyHeadlessContainerStyle(container: HTMLDivElement): void {\n Object.assign(container.style, {\n position: 'fixed',\n top: '0',\n left: '-9999px',\n width: '1px',\n height: '1px',\n overflow: 'hidden',\n pointerEvents: 'none',\n backgroundColor: 'transparent',\n opacity: '0',\n zIndex: '-1',\n });\n}\n\nexport function applyHeadlessIframeStyle(iframe: HTMLIFrameElement): void {\n Object.assign(iframe.style, {\n position: 'absolute',\n top: '0',\n left: '0',\n width: '1px',\n height: '1px',\n border: 'none',\n opacity: '0',\n pointerEvents: 'none',\n });\n}\n\nexport function attachRepositionListeners(\n config: Pick<BenjiConnectConfig, 'anchor'>,\n onReposition: () => void,\n): RepositionListenerHandle {\n const repositionHandler = onReposition;\n const repositionScrollTargets = getRepositionScrollTargets(config.anchor);\n repositionScrollTargets.forEach((target) => {\n target.addEventListener('scroll', repositionHandler, { passive: true });\n });\n window.addEventListener('resize', repositionHandler);\n\n const visualViewport = window.visualViewport;\n visualViewport?.addEventListener('resize', repositionHandler);\n visualViewport?.addEventListener('scroll', repositionHandler);\n\n return {\n remove() {\n repositionScrollTargets.forEach((target) => {\n target.removeEventListener('scroll', repositionHandler);\n });\n window.removeEventListener('resize', repositionHandler);\n visualViewport?.removeEventListener('resize', repositionHandler);\n visualViewport?.removeEventListener('scroll', repositionHandler);\n },\n };\n}\n","import { BenjiConnectAuthAction } from \"./auth\";\n\n// Known event names coming from the SDK transport (postMessage)\nexport enum BenjiConnectEventType {\n AUTH_SUCCESS = 'AUTH_SUCCESS',\n FLOW_EXIT = 'FLOW_EXIT',\n FLOW_SUCCESS = 'FLOW_SUCCESS',\n EVENT = 'EVENT',\n ERROR = 'ERROR',\n PARTNER_LOGIN_OPEN = 'PARTNER_LOGIN_OPEN',\n}\n\nexport interface BenjiConnectPartnerLoginOpenEventData {\n url: string | null;\n title?: string;\n}\n\n// Known exit trigger types coming from the SDK transport (postMessage)\nexport enum BenjiConnectExitTrigger {\n ACTION_BUTTON_CLICKED = 'ACTION_BUTTON_CLICKED',\n BACK_TO_MERCHANT_CLICKED = 'BACK_TO_MERCHANT_CLICKED', // deprecated\n CLOSE_BUTTON_CLICKED = 'CLOSE_BUTTON_CLICKED',\n TAPPED_OUT_OF_BOUNDS = 'TAPPED_OUT_OF_BOUNDS',\n /** User closed the LOGIN partner-auth popup window. */\n POPUP_CLOSED = 'POPUP_CLOSED',\n}\n\nexport enum BenjiConnectErrorName {\n UNEXPECTED_ERROR = 'unexpected_error',\n PARTNER_CONNECT_ERROR = 'partner_connect_error'\n}\n\nexport type BenjiConnectErrorID = '400' | '500'; // Placeholders for now\n\n// Transport-layer token (raw, unprocessed from postMessage)\nexport interface BenjiConnectEventToken {\n access_token?: string;\n refresh_token?: string;\n expires_at?: string | number;\n exchange_token?: string;\n}\n\nexport interface BenjiConnectEventUserData {\n user: {\n id: number\n first_name: string\n last_name: string\n uuid?: string\n }\n status: BenjiConnectEventUserStatusData\n extra_data?: {\n total_rewards_earned?: number\n total_rewards_redeemed?: number\n created_date?: string\n }\n}\n\nexport interface BenjiConnectEventTransactionData {\n action: string;\n amount: number;\n trigger_event_id: string;\n trigger_name: string;\n}\n\nexport interface BenjiConnectEventUserStatusData {\n status_id: string\n num_of_rewards: number\n reward_status: string\n partner_status_tier_id?: number\n}\n\n// Basic structure for Benji Connect SDK typed events\nexport interface BenjiConnectEvent {\n type: BenjiConnectEventType;\n data?: BenjiConnectEventData;\n}\n\nexport interface BenjiConnectEventData {\n [k: string]: unknown;\n}\n\nexport interface BenjiConnectEventMessage<K extends BenjiConnectEventType = BenjiConnectEventType> {\n type: K; // discriminant\n data: BenjiConnectEventDataMap[K];\n}\n\nexport interface BenjiConnectAuthSuccessEventData {\n action: BenjiConnectAuthAction;\n metadata?: BenjiConnectEventUserData;\n token?: BenjiConnectEventToken,\n transaction?: BenjiConnectEventTransactionData;\n}\n\nexport interface BenjiConnectFlowExitEventData {\n step: string;\n trigger: BenjiConnectExitTrigger;\n}\n\nexport interface BenjiConnectErrorEventData {\n error: Error;\n}\n\n// Canonical event map \nexport type BenjiConnectEventDataMap = {\n [BenjiConnectEventType.AUTH_SUCCESS]: BenjiConnectAuthSuccessEventData;\n [BenjiConnectEventType.FLOW_EXIT]: BenjiConnectFlowExitEventData;\n [BenjiConnectEventType.FLOW_SUCCESS]: BenjiConnectAuthSuccessEventData;\n [BenjiConnectEventType.EVENT]: BenjiConnectEventData;\n [BenjiConnectEventType.ERROR]: BenjiConnectErrorEventData;\n [BenjiConnectEventType.PARTNER_LOGIN_OPEN]: BenjiConnectPartnerLoginOpenEventData;\n\n // Optional catch-all fan-out\n '*': { type: BenjiConnectEventType; data: BenjiConnectEventDataMap[BenjiConnectEventType] };\n};","import { BenjiConnectAuthToken } from '../types/auth';\nimport { BenjiConnectMode } from '../types/config';\nimport { BenjiConnectEventToken, BenjiConnectEventType } from '../types/event';\n\n/**\n * Mirrored from Benji Connect AuthMessageType — transport routing only.\n * Keep aligned with Benji Connect/src/types/messege.ts\n */\nconst AUTH_MESSAGE_TYPES = new Set([\n 'auth_config',\n 'code_received',\n 'code_verification_error',\n 'loyalty_verification',\n 'phone_verification',\n 'request_auth_config',\n 'request_code_exchange',\n 'request_code_with_login',\n 'request_code_with_phone',\n 'request_loyalty_verification',\n 'request_phone_verification',\n]);\n\nconst CONNECT_MESSAGE_TYPES = new Set<string>(Object.values(BenjiConnectEventType));\n\nexport function isAuthMessageType(data: unknown): boolean {\n if (!data || typeof data !== 'object') return false;\n const type = (data as { type?: string }).type;\n return typeof type === 'string' && AUTH_MESSAGE_TYPES.has(type);\n}\n\nexport function shouldRelayMessage(mode: BenjiConnectMode | undefined, data: unknown): boolean {\n return mode === BenjiConnectMode.LOGIN && isAuthMessageType(data);\n}\n\nexport function isConnectMessageType(data: unknown): boolean {\n if (!data || typeof data !== 'object') return false;\n const type = (data as { type?: string }).type;\n return typeof type === 'string' && CONNECT_MESSAGE_TYPES.has(type);\n}\n\nexport const extractAccessToken = (token?: BenjiConnectEventToken | string): string =>\n typeof token === 'string' ? token : (token?.access_token ?? '');\n\nexport const extractExchangeToken = (token?: BenjiConnectEventToken | string): string =>\n typeof token === 'string' ? token : (token?.exchange_token ?? '');\n\nexport const mapEventToConnectToken = (data?: BenjiConnectEventToken): BenjiConnectAuthToken => ({\n access_token: data?.access_token ?? '',\n refresh_token: data?.refresh_token ?? '',\n expires_at: data?.expires_at ?? ''\n});\n","import { BenjiConnectEventUserData } from \"../types/event\";\nimport { BenjiConnectUserData } from \"../types/user\";\n\nexport function isConnectUserData (\n input: BenjiConnectUserData | Record<string, any>\n): boolean {\n if (!input) return false;\n const data = mapEventToConnectUserData(input);\n if (data.user.id != 0) return true;\n return false;\n}\n\nexport const mapEventToConnectUserData = (\n data?: BenjiConnectEventUserData | Record<string, any>\n): BenjiConnectUserData => ({\n user: {\n id: data?.user?.id ?? 0,\n first_name: data?.user?.first_name ?? '',\n last_name: data?.user?.last_name ?? '',\n uuid: data?.user?.uuid \n },\n status: {\n status_id: data?.status?.status_id ?? '',\n num_of_rewards: data?.status?.num_of_rewards ?? 0,\n reward_status: data?.status?.reward_status ?? '',\n partner_status_tier_id: data?.status?.partner_status_tier_id\n },\n extra_data: {\n total_rewards_earned: data?.extra_data?.total_rewards_earned,\n total_rewards_redeemed: data?.extra_data?.total_rewards_redeemed,\n created_date: data?.extra_data?.created_date\n }\n});\n","import { BenjiConnectEventTransactionData } from \"../types/event\";\nimport { BenjiConnectTransactionData } from \"../types/transaction\";\n\nexport const mapEventToConnectTransactionData = (data?: BenjiConnectEventTransactionData): BenjiConnectTransactionData | null => {\n if (!data) return null;\n return {\n action: data.action,\n amount: data.amount,\n trigger_event_id: data.trigger_event_id,\n trigger_name: data.trigger_name\n };\n}","import {\n BenjiConnectMetadata,\n BenjiConnectMode,\n BenjiConnectOnErrorData,\n BenjiConnectOnEventData,\n BenjiConnectOnExitData,\n BenjiConnectOnExitMetadata,\n BenjiConnectOnSuccessData,\n BenjiConnectOnSuccessMetadata,\n} from './config';\n\nimport { \n extractAccessToken,\n extractExchangeToken,\n mapEventToConnectToken \n} from '../utils/auth';\n\nimport { BenjiConnectAuthAction } from './auth';\n\nimport { buildContext } from '../utils/config';\nimport { mapEventToConnectUserData } from '../utils/user';\n\nimport { \n BenjiConnectAuthSuccessEventData,\n BenjiConnectErrorEventData, \n BenjiConnectEventDataMap, \n BenjiConnectEventMessage, \n BenjiConnectEventType, \n BenjiConnectFlowExitEventData\n} from './event';\nimport { mapEventToConnectTransactionData } from '../utils/transaction';\n\nexport type MessageRouterLoginContext = {\n iframe: HTMLIFrameElement | null;\n loginPopup: Window | null;\n mode: BenjiConnectMode;\n};\n\nexport type MessageRouterConfig = {\n onSuccess?: (\n token: string, \n metadata: BenjiConnectOnSuccessMetadata\n ) => void;\n onError?: (\n error: Error,\n error_id: string,\n metadata: BenjiConnectMetadata\n ) => void;\n onExit?: (\n metadata: BenjiConnectOnExitMetadata\n ) => void;\n onEvent?: (\n type: BenjiConnectEventType, \n metadata: BenjiConnectMetadata\n ) => void;\n close?: () => void;\n closeLoginPopup?: () => void;\n navigateLoginPopup?: (url: string) => void;\n};\n\nexport const mapToAuthSuccessData = (\n message: BenjiConnectEventMessage<BenjiConnectEventType.AUTH_SUCCESS>,\n data: BenjiConnectAuthSuccessEventData\n): BenjiConnectOnEventData => {\n return {\n type: message.type,\n metadata: {\n context: buildContext(),\n action: data.action,\n token: mapEventToConnectToken(data.token),\n transactionData: mapEventToConnectTransactionData(data.transaction),\n userData: mapEventToConnectUserData(data.metadata)\n }\n };\n};\n\nexport const mapToOnExitData = (data: BenjiConnectFlowExitEventData): BenjiConnectOnExitData => {\n return {\n metadata: {\n context: buildContext(),\n step: data.step,\n trigger: data.trigger\n }\n };\n};\n\nexport const mapToOnSuccessData = (data: BenjiConnectAuthSuccessEventData): BenjiConnectOnSuccessData => {\n \n const token = data.action === BenjiConnectAuthAction.Login\n ? extractExchangeToken(data.token)\n : extractAccessToken(data.token);\n\n let metadata: BenjiConnectOnSuccessMetadata = {\n context: buildContext(),\n action: data.action,\n user_data: data.metadata\n };\n\n if (data.transaction) {\n metadata.transaction_data = data.transaction;\n }\n \n return { token, metadata };\n};\n\nexport const mapToOnErrorData = (data: BenjiConnectErrorEventData): BenjiConnectOnErrorData => {\n return {\n error: data.error,\n error_id: '500', // Placeholder\n metadata: {\n context: buildContext()\n }\n };\n};\n\nexport const mapToOnEventData = <K extends BenjiConnectEventType>(\n message: BenjiConnectEventMessage<K>,\n data: BenjiConnectEventDataMap[K]\n): BenjiConnectOnEventData => {\n return {\n type: message.type,\n metadata: {\n context: buildContext(),\n ...data\n }\n };\n};\n\nexport type BenjiConnectCallbackDataMap = {\n [BenjiConnectEventType.AUTH_SUCCESS]: BenjiConnectOnEventData;\n [BenjiConnectEventType.FLOW_EXIT]: BenjiConnectOnExitData;\n [BenjiConnectEventType.FLOW_SUCCESS]: BenjiConnectOnSuccessData;\n [BenjiConnectEventType.ERROR]: BenjiConnectOnErrorData;\n [BenjiConnectEventType.EVENT]: BenjiConnectOnEventData;\n '*': BenjiConnectOnEventData;\n};\n\nexport const BenjiConnectCallbackMapperMap = {\n [BenjiConnectEventType.AUTH_SUCCESS]: mapToAuthSuccessData,\n [BenjiConnectEventType.FLOW_EXIT]: mapToOnExitData,\n [BenjiConnectEventType.FLOW_SUCCESS]: mapToOnSuccessData,\n [BenjiConnectEventType.ERROR]: mapToOnErrorData,\n [BenjiConnectEventType.EVENT]: mapToOnEventData,\n} as const;\n\n","import { \n Endpoints\n} from '../config';\n\nimport { BenjiConnectMode } from '../types/config';\nimport {\n BenjiConnectEventType,\n type BenjiConnectEventMessage,\n} from '../types/event';\n\nimport type {\n BenjiConnectOnSuccessData,\n BenjiConnectOnExitData,\n BenjiConnectMetadata,\n BenjiConnectOnSuccessMetadata,\n BenjiConnectOnExitMetadata\n} from '../types/config';\n\nimport {\n BenjiConnectCallbackMapperMap,\n MessageRouterConfig,\n mapToOnEventData,\n type MessageRouterLoginContext,\n} from '../types/router';\nimport { isConnectMessageType, shouldRelayMessage } from '../utils/auth';\n\nexport class MessageRouter {\n\n static configuredListeners = false;\n static onSuccess?: (\n token: string, \n metadata: BenjiConnectOnSuccessMetadata\n ) => void;\n static onError?: (\n error: Error,\n error_id: string,\n metadata: BenjiConnectMetadata\n ) => void;\n static onExit?: (\n metadata: BenjiConnectOnExitMetadata\n ) => void;\n static onEvent?: (\n type: BenjiConnectEventType, \n metadata: BenjiConnectMetadata\n ) => void;\n static close?: () => void;\n static closeLoginPopup?: () => void;\n static navigateLoginPopup?: (url: string) => void;\n\n static iframe: HTMLIFrameElement | null = null;\n static loginPopup: Window | null = null;\n static mode: BenjiConnectMode = BenjiConnectMode.CONNECT;\n static connectOrigin = '';\n static isIframeReady = false;\n static pendingPopupAuth: MessageEvent<unknown>[] = [];\n\n static configureMessageRouter(config: MessageRouterConfig) {\n this.onSuccess = config.onSuccess;\n this.onError = config.onError;\n this.onExit = config.onExit;\n this.onEvent = config.onEvent;\n this.close = config.close;\n this.closeLoginPopup = config.closeLoginPopup;\n this.navigateLoginPopup = config.navigateLoginPopup;\n }\n\n static setLoginContext(context: MessageRouterLoginContext) {\n this.iframe = context.iframe;\n this.loginPopup = context.loginPopup;\n this.mode = context.mode;\n this.connectOrigin = new URL(Endpoints.benji_connect_auth_url).origin;\n if (this.isIframeReady) {\n this.flushPendingPopupAuth();\n }\n }\n\n static resetIframeReady() {\n this.isIframeReady = false;\n }\n\n static setMode(mode: BenjiConnectMode) {\n this.mode = mode;\n }\n\n static errorEventHandler = (event: Event) => { \n return MessageRouter.handleErrorMessage(event) \n };\n\n static messageEventHandler = (event: MessageEvent<unknown>) => { \n return MessageRouter.handleMessage(event) \n };\n\n static addEventListeners() {\n if (this.configuredListeners) return;\n window.addEventListener('error', this.errorEventHandler);\n window.addEventListener('unhandledrejection', this.errorEventHandler);\n window.addEventListener('message', this.messageEventHandler);\n this.configuredListeners = true;\n }\n\n static removeEventListeners() {\n window.removeEventListener('error', this.errorEventHandler);\n window.removeEventListener('unhandledrejection', this.errorEventHandler);\n window.removeEventListener('message', this.messageEventHandler);\n this.configuredListeners = false;\n this.iframe = null;\n this.loginPopup = null;\n this.mode = BenjiConnectMode.CONNECT;\n this.connectOrigin = '';\n this.isIframeReady = false;\n this.pendingPopupAuth = [];\n }\n\n static handleErrorMessage(event: Event) { \n switch(event.type) {\n case 'error': {\n const errorEvent = event as ErrorEvent;\n const error = errorEvent.error || new Error(errorEvent.message);\n break;\n }\n case 'unhandledrejection': {\n const rejectionEvent = event as PromiseRejectionEvent;\n const reason = rejectionEvent.reason instanceof Error\n ? rejectionEvent.reason\n : new Error(String(rejectionEvent.reason));\n break;\n }\n default: {\n console.error('[Benji Connect SDK] Received Unknown error message', event);\n break;\n }\n }\n }\n\n static relayToIframe(event: MessageEvent<unknown>) {\n const iframeWindow = this.iframe?.contentWindow;\n if (!this.isIframeReady || !iframeWindow) {\n this.pendingPopupAuth.push(event);\n return;\n }\n\n iframeWindow.postMessage(event.data, this.connectOrigin);\n }\n\n static markIframeReady(iframe: HTMLIFrameElement) {\n if (this.iframe !== iframe) return;\n this.isIframeReady = true;\n this.flushPendingPopupAuth();\n }\n\n static flushPendingPopupAuth() {\n if (!this.isIframeReady || !this.pendingPopupAuth.length) return;\n const queued = this.pendingPopupAuth;\n this.pendingPopupAuth = [];\n for (const event of queued) {\n this.relayToIframe(event);\n }\n }\n\n static relayToPopup(payload: unknown) {\n if (!this.loginPopup) {\n console.warn('[Benji Connect SDK] Skipping login auth relay, no login popup');\n return;\n }\n\n try {\n this.loginPopup.postMessage(payload, '*');\n } catch (error) {\n console.error('[Benji Connect SDK] Failed to forward login auth message to popup', error);\n }\n }\n\n static handleMessage(event: MessageEvent<unknown>) {\n if (shouldRelayMessage(this.mode, event.data) && this.loginPopup) {\n const expectedOrigin = this.connectOrigin || new URL(Endpoints.benji_connect_auth_url).origin;\n const iframeWindow = this.iframe?.contentWindow;\n\n if (event.source === this.loginPopup) {\n this.relayToIframe(event);\n return;\n }\n\n if (iframeWindow && event.source === iframeWindow) {\n if (event.origin !== expectedOrigin) {\n console.warn(\n '[Benji Connect SDK] Skipped auth relay, unexpected origin',\n event.origin,\n expectedOrigin,\n );\n return;\n }\n this.relayToPopup(event.data);\n return;\n }\n\n return;\n }\n\n if (!isConnectMessageType(event.data)) return;\n\n const expectedOrigin: string = new URL(Endpoints.benji_connect_auth_url).origin;\n if (!event || event.origin !== expectedOrigin) {\n console.warn('[Benji Connect SDK] Skipped message, received event from unexpected origin', event.origin, expectedOrigin);\n return;\n }\n\n const raw = event.data;\n if (!raw || typeof raw !== 'object') return;\n\n const partial = raw as Partial<BenjiConnectEventMessage>;\n if (typeof partial.type !== 'string') return;\n \n const message = partial as BenjiConnectEventMessage;\n\n try {\n switch (message.type) {\n\n case BenjiConnectEventType.PARTNER_LOGIN_OPEN: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.PARTNER_LOGIN_OPEN>;\n const url = connectMessage.data?.url;\n if (url) {\n this.navigateLoginPopup?.(url);\n } else {\n this.closeLoginPopup?.();\n }\n break;\n }\n\n case BenjiConnectEventType.AUTH_SUCCESS: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.AUTH_SUCCESS>;\n const callbackData = BenjiConnectCallbackMapperMap.AUTH_SUCCESS(connectMessage, connectMessage.data);\n this.onEvent?.(callbackData.type, callbackData.metadata); \n break;\n }\n\n case BenjiConnectEventType.FLOW_EXIT: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.FLOW_EXIT>;\n const callbackData = BenjiConnectCallbackMapperMap.FLOW_EXIT(connectMessage.data) as BenjiConnectOnExitData;\n this.onExit?.(callbackData.metadata);\n this.close?.();\n break;\n }\n\n case BenjiConnectEventType.FLOW_SUCCESS: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.FLOW_SUCCESS>;\n const callbackData = BenjiConnectCallbackMapperMap.FLOW_SUCCESS(connectMessage.data) as BenjiConnectOnSuccessData;\n this.onSuccess?.(callbackData.token, callbackData.metadata);\n if (this.mode === BenjiConnectMode.LOGIN) {\n this.close?.();\n }\n break;\n }\n\n case BenjiConnectEventType.ERROR: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.ERROR>;\n const callbackData = BenjiConnectCallbackMapperMap.ERROR(connectMessage.data);\n this.onError?.(callbackData.error, callbackData.error_id, callbackData.metadata);\n break;\n }\n\n case BenjiConnectEventType.EVENT: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.EVENT>;\n const callbackData = mapToOnEventData(connectMessage, connectMessage.data);\n this.onEvent?.(callbackData.type, callbackData.metadata);\n break;\n }\n\n default: {\n const _exhaustive: never = message.type;\n console.warn('[Benji Connect SDK] Unhandled connect message type', _exhaustive);\n break;\n }\n\n }\n } finally {\n // TODO: Any cleanup logic \n }\n }\n\n}\n","/// <reference path=\"./global.d.ts\" />\n\nimport { \n configureConfig, \n Endpoints\n} from './config';\n\nimport { \n type BenjiConnectConfig,\n BenjiConnectEnvironment,\n BenjiConnectMode,\n BenjiConnectPlacement,\n PartnerIntegrationType,\n} from './types/config';\n\nimport { \n buildContext, \n mapToConnectEnvironment \n} from './utils/config';\n\nimport { writeLoginPopupLoadingDocument } from './utils/loginPopupLoading';\nimport {\n appendLoginPopupFlag,\n preparePartnerAuthUrl,\n} from './utils/partnerAuthLink';\n\nimport {\n IFRAME_HEIGHT,\n IFRAME_WIDTH,\n applyHeadlessContainerStyle,\n applyHeadlessIframeStyle,\n applyIframeLayoutToElements,\n applyOverlayBaseStyle,\n attachRepositionListeners,\n buildLoginPopupFeatures,\n computePopupScreenPosition,\n type IframeLayoutState,\n type PopupLayoutState,\n type RepositionListenerHandle,\n} from './utils/placement';\n\nimport { MessageRouter } from './router/message';\nimport { BenjiConnectExitTrigger } from './types/event';\n\nconst POPUP_CLOSED_POLL_MS = 500;\n\nclass ConnectSDK {\n\n private sdkConfig: BenjiConnectConfig;\n private iframe: HTMLIFrameElement | null = null;\n private container: HTMLDivElement | null = null;\n private layoutState: IframeLayoutState = {\n layout: {\n top: 0,\n left: 0,\n width: IFRAME_WIDTH,\n height: IFRAME_HEIGHT,\n placement: BenjiConnectPlacement.CENTER,\n },\n lastValidAnchoredLayout: null,\n };\n private popupLayoutState: PopupLayoutState = {\n lastValidAnchoredLayout: null,\n };\n private repositionListeners: RepositionListenerHandle | null = null;\n private loginPopup: Window | null = null;\n private hasLoginPopupUrl = false;\n private popupClosedPollId: ReturnType<typeof setInterval> | null = null;\n private isClosing = false;\n /**\n * Aborts a pending open() when close() runs before the iframe mounts.\n * Non-DUMMY LOGIN opens the partner popup synchronously, then awaits initialize()\n * before mounting a headless iframe. Without this, close() can tear down the popup\n * while the in-flight open() still registers listeners and mounts the iframe.\n */\n private openAbortController: AbortController | null = null;\n\n private onIframeLoad = (): void => {\n if (this.isClosing || !this.iframe) return;\n MessageRouter.markIframeReady(this.iframe);\n };\n\n constructor(config: BenjiConnectConfig) {\n\n this.sdkConfig = config;\n\n // Validations\n if (!this.sdkConfig.environment) throw new Error('Environment is required');\n if (!this.sdkConfig.token) throw new Error('Connect token is required');\n\n // Set internal config for environment based on consumer input at runtime\n const environment: BenjiConnectEnvironment = mapToConnectEnvironment(this.sdkConfig.environment);\n this.sdkConfig.environment = environment;\n configureConfig(environment);\n }\n\n private resolveAuthType(): PartnerIntegrationType | undefined {\n return this.sdkConfig.tokenData?.authType ?? this.sdkConfig.authType;\n }\n\n private isLoginPopupOnly(): boolean {\n const mode = this.sdkConfig.mode ?? BenjiConnectMode.CONNECT;\n const authType = this.resolveAuthType();\n return (\n mode === BenjiConnectMode.LOGIN &&\n authType != null &&\n authType !== PartnerIntegrationType.DUMMY\n );\n }\n\n private isSessionActive(): boolean {\n return this.iframe != null || this.loginPopup != null;\n }\n\n /** Cancels any open() still running between popup pre-open and iframe mount. */\n private abortInflightOpen(): void {\n this.openAbortController?.abort();\n this.openAbortController = null;\n }\n\n async initialize() {\n \n // Configure message router for all postMessage from connect modal and error messages\n MessageRouter.configureMessageRouter({\n onSuccess: this.sdkConfig.onSuccess,\n onError: this.sdkConfig.onError,\n onExit: this.sdkConfig.onExit,\n onEvent: this.sdkConfig.onEvent,\n close: () => this.close(),\n closeLoginPopup: () => this.closeLoginPopup(),\n navigateLoginPopup: (url: string) => this.navigateLoginPopup(url),\n });\n\n // TODO: Tracker.configureWithOptions(sdkOptions);\n // TODO: Tracker.trackSDKInitialized();\n }\n\n private openLoginPopup(): boolean {\n const position = computePopupScreenPosition(\n this.sdkConfig,\n this.popupLayoutState,\n { warnOnInvalidAnchor: true },\n );\n\n const partnerAuthLink = this.sdkConfig.tokenData?.partnerAuthLink;\n const configToken = this.sdkConfig.tokenData?.configToken;\n const preparedLink =\n partnerAuthLink && configToken\n ? preparePartnerAuthUrl(partnerAuthLink, configToken)\n : partnerAuthLink;\n const popupUrl = preparedLink\n ? appendLoginPopupFlag(preparedLink)\n : 'about:blank';\n\n this.loginPopup = window.open(\n popupUrl,\n 'benji_partner_auth',\n buildLoginPopupFeatures(position),\n );\n\n if (!this.loginPopup) {\n console.warn('[Connect SDK] Failed to pre-open LOGIN partner auth popup');\n this.sdkConfig.onError?.(\n new Error('Popup blocked. Allow popups for this site and try again.'),\n '400',\n { context: buildContext() },\n );\n return false;\n }\n\n if (preparedLink) {\n this.hasLoginPopupUrl = true;\n } else {\n writeLoginPopupLoadingDocument(this.loginPopup);\n }\n this.startPopupClosedPoll();\n return true;\n }\n\n private startPopupClosedPoll(): void {\n this.stopPopupClosedPoll();\n this.popupClosedPollId = setInterval(() => {\n if (this.isClosing) return;\n if (this.loginPopup?.closed) {\n this.sdkConfig.onExit?.({\n context: buildContext(),\n trigger: BenjiConnectExitTrigger.POPUP_CLOSED,\n });\n this.close();\n }\n }, POPUP_CLOSED_POLL_MS);\n }\n\n private stopPopupClosedPoll(): void {\n if (this.popupClosedPollId != null) {\n clearInterval(this.popupClosedPollId);\n this.popupClosedPollId = null;\n }\n }\n\n private repositionLoginPopup(): void {\n if (!this.loginPopup || this.loginPopup.closed) return;\n\n const position = computePopupScreenPosition(\n this.sdkConfig,\n this.popupLayoutState,\n );\n\n try {\n this.loginPopup.moveTo(\n Math.round(position.left),\n Math.round(position.top),\n );\n this.loginPopup.resizeTo(position.width, position.height);\n } catch (error) {\n console.warn('[Connect SDK] Failed to reposition LOGIN popup', error);\n }\n }\n\n async open() {\n if (this.isSessionActive()) return;\n\n const mode = this.sdkConfig.mode ?? BenjiConnectMode.CONNECT;\n const abortController = new AbortController();\n this.openAbortController = abortController;\n const { signal } = abortController;\n\n if (this.isLoginPopupOnly()) {\n const opened = this.openLoginPopup();\n if (!opened) {\n this.abortInflightOpen();\n return;\n }\n }\n\n await this.initialize();\n\n // close() may have run during initialize — do not register listeners or mount UI.\n if (signal.aborted) return;\n\n MessageRouter.setMode(mode);\n MessageRouter.addEventListeners();\n\n if (signal.aborted) {\n MessageRouter.removeEventListeners();\n return;\n }\n\n this.openUI();\n this.syncLoginContext(mode);\n // TODO: Track SDK Opened Tracker.trackSDKOpened();\n }\n\n private syncLoginContext(mode: BenjiConnectMode): void {\n MessageRouter.setLoginContext({\n iframe: this.iframe,\n loginPopup: this.loginPopup,\n mode,\n });\n }\n\n openUI() {\n // loginPopup may already be set for non-DUMMY LOGIN before the iframe mounts.\n if (this.iframe) return;\n\n MessageRouter.resetIframeReady();\n\n const headless = this.isLoginPopupOnly();\n\n this.container = document.createElement('div');\n if (headless) {\n applyHeadlessContainerStyle(this.container);\n } else {\n applyOverlayBaseStyle(this.container);\n }\n\n console.debug('[Connect SDK] endpoints', Endpoints);\n console.log('[Connect SDK] opeining URL', Endpoints.benji_connect_auth_url);\n const url = new URL(Endpoints.benji_connect_auth_url);\n const connectToken = this.sdkConfig.token;\n url.searchParams.set('connect_token', connectToken);\n url.searchParams.set('t', String(Date.now()));\n if (this.sdkConfig.mode != null) {\n url.searchParams.set('mode', String(this.sdkConfig.mode));\n }\n\n this.iframe = document.createElement('iframe');\n this.syncLoginContext(this.sdkConfig.mode ?? BenjiConnectMode.CONNECT);\n this.iframe.addEventListener('load', this.onIframeLoad);\n this.iframe.src = url.toString();\n\n this.container.appendChild(this.iframe);\n document.body.appendChild(this.container);\n\n if (headless) {\n applyHeadlessIframeStyle(this.iframe);\n this.repositionListeners = attachRepositionListeners(\n this.sdkConfig,\n () => this.repositionLoginPopup(),\n );\n } else {\n applyIframeLayoutToElements(\n this.sdkConfig,\n this.container,\n this.iframe,\n this.layoutState,\n { warnOnInvalidAnchor: true },\n );\n this.repositionListeners = attachRepositionListeners(\n this.sdkConfig,\n () => {\n if (!this.iframe || !this.container) return;\n applyIframeLayoutToElements(\n this.sdkConfig,\n this.container,\n this.iframe,\n this.layoutState,\n );\n },\n );\n\n this.container.addEventListener('click', (e) => {\n if (e.target === this.container) {\n // Trigger exit when user taps outside modal bounds\n this.sdkConfig.onExit?.({\n context: buildContext(),\n trigger: BenjiConnectExitTrigger.TAPPED_OUT_OF_BOUNDS\n });\n this.close();\n }\n });\n }\n\n this.syncLoginContext(this.sdkConfig.mode ?? BenjiConnectMode.CONNECT);\n }\n\n private navigateLoginPopup(url: string): void {\n if (this.hasLoginPopupUrl) return;\n if (!this.loginPopup || this.loginPopup.closed) {\n console.warn('[Connect SDK] Cannot navigate LOGIN popup — window unavailable');\n return;\n }\n try {\n this.loginPopup.location.href = url;\n this.hasLoginPopupUrl = true;\n } catch (error) {\n console.warn('[Connect SDK] Failed to navigate LOGIN popup', error);\n }\n }\n\n private closeLoginPopup(): void {\n if (!this.loginPopup) return;\n\n try {\n if (!this.loginPopup.closed) {\n this.loginPopup.close();\n }\n } catch (error) {\n console.warn('[Connect SDK] Error closing LOGIN popup', error);\n } finally {\n this.loginPopup = null;\n this.hasLoginPopupUrl = false;\n }\n }\n\n close() {\n // Abort in-flight open() even when the iframe has not mounted yet.\n this.abortInflightOpen();\n\n this.isClosing = true;\n this.stopPopupClosedPoll();\n this.closeLoginPopup();\n MessageRouter.removeEventListeners();\n\n if (!this.iframe) {\n this.isClosing = false;\n return;\n }\n\n this.repositionListeners?.remove();\n this.repositionListeners = null;\n this.layoutState.lastValidAnchoredLayout = null;\n this.popupLayoutState.lastValidAnchoredLayout = null;\n\n this.iframe.removeEventListener('load', this.onIframeLoad);\n\n if (this.container?.parentNode) {\n this.container.parentNode.removeChild(this.container);\n }\n this.iframe = null;\n this.container = null;\n this.isClosing = false;\n }\n\n cleanup() {\n if (this.iframe) this.close();\n }\n\n ping() { return 'pong'; }\n}\n\nexport default ConnectSDK;\n","/// <reference path=\"./global.d.ts\" />\nimport ConnectSDK from './connect-sdk';\n(globalThis as any).ConnectSDK = ConnectSDK;"],"mappings":"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","names":["endpoints","project_environment","endpoints","project_environment","endpoints","project_environment","BenjiConnectEventType","data","data","data","data","expectedOrigin","_a","_b"]}
|
|
1
|
+
{"version":3,"sources":["../src/config/production.ts","../src/config/sandbox.ts","../src/config/development.ts","../src/config/local.defaults.ts","../src/utils/environment.ts","../src/config/index.ts","../src/utils/config.ts","../src/utils/loginPopupLoading.ts","../src/utils/partnerAuthLink.ts","../src/utils/placement.ts","../src/types/event.ts","../src/utils/auth.ts","../src/utils/user.ts","../src/utils/transaction.ts","../src/types/router.ts","../src/router/message.ts","../src/connect-sdk.ts","../src/global.ts"],"sourcesContent":["export const project_environment: string = 'production';\n\nexport const endpoints: Record<string, string> = {\n 'benji_connect_auth_url':'https://verifyapp.withbenji.com',\n 'benji_connect_auth_service_url' : 'https://authservice.withbenji.com'\n}","export const project_environment: string = 'sandbox';\n\nexport const endpoints: Record<string, string> = {\n 'benji_connect_auth_url':'https://verifyapp-staging.withbenji.com',\n 'benji_connect_auth_service_url' : 'https://authservice-staging.withbenji.com'\n}","export const project_environment: string = 'development';\n\nexport const endpoints: Record<string, string> = {\n 'benji_connect_auth_url': 'https://verifyapp-dev.withbenji.com',\n 'benji_connect_auth_service_url': 'https://authservice-dev.withbenji.com',\n};","/**\n * Build-time fallback when gitignored `local.ts` is absent (CI, fresh clones).\n * Same endpoints as development — not machine-specific localhost overrides.\n * Copy to `local.ts` locally for localhost URLs; see RELEASE.md.\n */\nexport const project_environment: string = 'local';\n\nexport const endpoints: Record<string, string> = {\n benji_connect_auth_url: 'https://verifyapp-dev.withbenji.com',\n benji_connect_auth_service_url: 'https://authservice-dev.withbenji.com',\n};\n","/** Hostnames that browsers use for loopback when typed literally in the URL bar. */\nexport const LOCAL_HOSTNAMES = ['localhost', '127.0.0.1', '::1', '[::1]'] as const;\n\nconst LOCAL_HOSTNAME_SET: ReadonlySet<string> = new Set(LOCAL_HOSTNAMES);\n\nexport function isLocalHost(\n hostname: string = typeof window !== 'undefined' ? window.location.hostname : ''\n): boolean {\n if (LOCAL_HOSTNAME_SET.has(hostname)) {\n return true;\n }\n // IPv4 loopback block 127.0.0.0/8 — covers 127.0.0.1 without listing every address\n if (hostname.startsWith('127.')) {\n return true;\n }\n return false;\n}\n","import * as productionConfig from './production';\nimport * as sandboxConfig from './sandbox';\nimport * as developmentConfig from './development';\nimport * as localConfig from './local';\nimport { BenjiConnectEnvironment } from '../types/config';\nimport { isLocalHost } from '../utils/environment';\n\nexport type EnvironmentConfigModule = {\n project_environment: string;\n endpoints: Record<string, string>;\n};\n\nconst env = typeof process !== 'undefined' ? process.env : {};\nlet data: EnvironmentConfigModule = developmentConfig;\ntype EndpointConfig = typeof developmentConfig.endpoints;\nexport let Endpoints: EndpointConfig = getEndpoints();\nexport let Environment = BenjiConnectEnvironment.DEVELOPMENT;\n\nexport function configureConfig(environment: BenjiConnectEnvironment) {\n if (environment == 'production') {\n console.log('[Connect SDK] configuring with environment production');\n data = productionConfig;\n } else if (environment == 'sandbox') {\n console.log('[Connect SDK] configuring with environment sandbox');\n data = sandboxConfig;\n } else if (environment == 'development') {\n console.log('[Connect SDK] configuring with environment development');\n data = developmentConfig;\n } else if (environment == 'local') {\n if (isLocalHost()) {\n console.log('[Connect SDK] configuring with environment local');\n data = localConfig;\n } else {\n console.log(\n '[Connect SDK] local environment requested on non-local host; using development'\n );\n data = developmentConfig;\n }\n }\n Endpoints = getEndpoints();\n Environment = getEnvironment();\n}\n\nfunction getEndpoints(): EndpointConfig {\n const entries = Object.entries(data.endpoints).map(([key, value]) => {\n const override = env?.[key] || value;\n return [key, override] as const;\n });\n return Object.fromEntries(entries) as EndpointConfig;\n}\n\nfunction getEnvironment(): BenjiConnectEnvironment {\n return data['project_environment'] as BenjiConnectEnvironment;\n}\n\nexport const Namespace = __NAMESPACE__;\nexport const Version = __VERSION__;\n","import { BenjiConnectEnvironment } from \"../types/config\";\nimport { isLocalHost } from \"./environment\";\n\nexport const buildContext = () => ({\n namespace: typeof __NAMESPACE__ !== 'undefined' && __NAMESPACE__ ? __NAMESPACE__ : 'benji-connect-sdk',\n version: typeof __VERSION__ !== 'undefined' && __VERSION__ ? String(__VERSION__) : '0.0.0',\n});\n\nexport function isBenjiConnectEnvironment(\n environment: unknown\n): environment is BenjiConnectEnvironment {\n return (\n environment === BenjiConnectEnvironment.LOCAL ||\n environment === BenjiConnectEnvironment.DEVELOPMENT ||\n environment === BenjiConnectEnvironment.SANDBOX ||\n environment === BenjiConnectEnvironment.PRODUCTION\n );\n}\n\nexport function mapToConnectEnvironment(\n environment: BenjiConnectEnvironment | string\n): BenjiConnectEnvironment {\n\n if (isBenjiConnectEnvironment(environment)) return environment;\n\n const environments: Record<string, BenjiConnectEnvironment> = {\n local: BenjiConnectEnvironment.LOCAL,\n development: BenjiConnectEnvironment.DEVELOPMENT,\n sandbox: BenjiConnectEnvironment.SANDBOX,\n production: BenjiConnectEnvironment.PRODUCTION,\n };\n const mapped = environments[environment];\n if (mapped) return mapped;\n\n const defaultEnvironment = isLocalHost()\n ? BenjiConnectEnvironment.LOCAL\n : BenjiConnectEnvironment.DEVELOPMENT;\n console.warn(`[Benji Connect SDK] ${environment} not valid environment defaulting to ${defaultEnvironment}`);\n\n return defaultEnvironment;\n}","const LOGIN_POPUP_TITLE = 'User sign-in';\nconst LOGIN_POPUP_MESSAGE = 'Loading sign-in\\u2026';\n\nexport function buildLoginPopupLoadingHtml(): string {\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>${LOGIN_POPUP_TITLE}</title>\n <style>\n * { box-sizing: border-box; }\n html, body {\n margin: 0;\n height: 100%;\n background: #fff;\n }\n body {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n font-family: Inter, system-ui, -apple-system, sans-serif;\n }\n .loading-content {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 14px;\n padding: 24px;\n max-width: 320px;\n transform: translateY(-28px);\n }\n .loader {\n width: 48px;\n height: 48px;\n border: 3px solid #e5e7eb;\n border-top-color: #9ca3af;\n border-radius: 50%;\n animation: spin 0.75s linear infinite;\n }\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n .loading-text {\n font-size: 16px;\n text-align: center;\n font-family: Inter, sans-serif;\n margin: 0;\n background: linear-gradient(\n 90deg,\n #374151 0%,\n #9ca3af 50%,\n #374151 100%\n );\n background-size: 200% 100%;\n -webkit-background-clip: text;\n background-clip: text;\n -webkit-text-fill-color: transparent;\n animation: shimmer 1.8s ease-in-out infinite;\n }\n @keyframes shimmer {\n 0% { background-position: 100% 0; }\n 100% { background-position: -100% 0; }\n }\n </style>\n</head>\n<body>\n <div class=\"loading-content\">\n <div class=\"loader\" aria-hidden=\"true\"></div>\n <p class=\"loading-text\">${LOGIN_POPUP_MESSAGE}</p>\n </div>\n</body>\n</html>`;\n}\n\nexport function writeLoginPopupLoadingDocument(popup: Window): void {\n try {\n popup.document.open();\n popup.document.write(buildLoginPopupLoadingHtml());\n popup.document.close();\n } catch (error) {\n console.warn('[Connect SDK] Failed to write LOGIN popup loading document', error);\n }\n}\n","export const LOGIN_POPUP_QUERY_FLAG = 'benji_login_popup';\n\nexport function ensureAuthLinkStateNonce(url: string, nonce: string): string {\n try {\n const parsed = new URL(url);\n if (!parsed.searchParams.get('state')) {\n parsed.searchParams.set('state', nonce);\n }\n return parsed.toString();\n } catch {\n if (url.includes('state=')) {\n return url;\n }\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}state=${encodeURIComponent(nonce)}`;\n }\n}\n\n/** Appends `benji_login_popup=1` without altering other query params (e.g. PKCE `state`). */\nexport function appendLoginPopupFlag(url: string): string {\n try {\n const parsed = new URL(url);\n parsed.searchParams.set(LOGIN_POPUP_QUERY_FLAG, '1');\n return parsed.toString();\n } catch {\n const separator = url.includes('?') ? '&' : '?';\n return `${url}${separator}${LOGIN_POPUP_QUERY_FLAG}=1`;\n }\n}\n\nexport function preparePartnerAuthUrl(url: string, nonce: string): string {\n return ensureAuthLinkStateNonce(url, nonce);\n}\n","/**\n * Anchor-based iframe placement and host DOM application. Naming follows Floating UI /\n * Popper conventions (`bottom-end`, `bottom-start`). Computes layout rects, applies styles\n * to overlay/iframe elements, and manages reposition listeners.\n * @see https://floating-ui.com/docs/computePosition#placement\n */\n\nimport {\n BenjiConnectPlacement,\n type BenjiConnectAnchor,\n type BenjiConnectConfig,\n type BenjiConnectPlacementOffset,\n} from '../types/config';\n\nexport const IFRAME_WIDTH = 400;\nexport const IFRAME_HEIGHT = 645;\n\n/** LOGIN partner-auth popup dimensions (SDK-managed window). */\nexport const POPUP_WIDTH = 420;\nexport const POPUP_HEIGHT = 640;\n\nconst IFRAME_STATIC_STYLE: CSSStyleDeclaration = {\n border: 'none',\n borderRadius: '20px',\n overflow: 'hidden',\n} as CSSStyleDeclaration;\n\nconst CONTAINER_BASE_STYLE: CSSStyleDeclaration = {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n backgroundColor: 'rgba(0,0,0,0.5)',\n zIndex: '9999',\n} as CSSStyleDeclaration;\n\nconst VIEWPORT_PADDING = 8;\n\nexport interface IframeRect {\n top: number;\n left: number;\n width: number;\n height: number;\n placement: BenjiConnectPlacement;\n}\n\nexport interface ViewportSize {\n width: number;\n height: number;\n}\n\nexport interface ResolveIframeLayoutOptions {\n warnOnInvalidAnchor?: boolean;\n preserveAnchoredLayout?: IframeRect | null;\n}\n\nfunction isPreservableAnchoredLayout(\n layout: IframeRect | null | undefined,\n): layout is IframeRect {\n return (\n layout != null && layout.placement !== BenjiConnectPlacement.CENTER\n );\n}\n\nfunction clampPreservedAnchoredLayout(\n layout: IframeRect,\n viewport: ViewportSize,\n): IframeRect {\n const maxLeft = viewport.width - layout.width - VIEWPORT_PADDING;\n const maxTop = viewport.height - layout.height - VIEWPORT_PADDING;\n const minLeft = VIEWPORT_PADDING;\n const minTop = VIEWPORT_PADDING;\n\n return {\n ...layout,\n left:\n maxLeft < minLeft\n ? minLeft\n : Math.min(Math.max(layout.left, minLeft), maxLeft),\n top:\n maxTop < minTop\n ? minTop\n : Math.min(Math.max(layout.top, minTop), maxTop),\n };\n}\n\nfunction preservedAnchoredLayoutOrCenter(\n viewport: ViewportSize,\n options: ResolveIframeLayoutOptions,\n): IframeRect {\n const { preserveAnchoredLayout } = options;\n if (isPreservableAnchoredLayout(preserveAnchoredLayout)) {\n return clampPreservedAnchoredLayout(preserveAnchoredLayout, viewport);\n }\n return centerLayout(viewport);\n}\n\nfunction isRefLikeAnchor(\n anchor: BenjiConnectAnchor,\n): anchor is { value: HTMLElement | null | undefined } {\n return (\n typeof anchor === 'object' &&\n anchor !== null &&\n !(anchor instanceof HTMLElement) &&\n 'value' in anchor\n );\n}\n\nexport function resolveAnchor(\n anchor: BenjiConnectAnchor | undefined,\n): HTMLElement | null {\n if (!anchor) {\n return null;\n }\n if (typeof anchor === 'string') {\n return document.querySelector<HTMLElement>(anchor);\n }\n if (typeof anchor === 'function') {\n const resolved = anchor();\n return resolved instanceof HTMLElement ? resolved : null;\n }\n if (isRefLikeAnchor(anchor)) {\n const el = anchor.value;\n return el instanceof HTMLElement ? el : null;\n }\n return anchor instanceof HTMLElement ? anchor : null;\n}\n\nexport function isAnchorVisible(el: HTMLElement): boolean {\n if (!el.isConnected) {\n return false;\n }\n const style = window.getComputedStyle(el);\n if (style.display === 'none' || style.visibility === 'hidden') {\n return false;\n }\n const rect = el.getBoundingClientRect();\n return rect.width > 0 || rect.height > 0;\n}\n\nexport function resolveEffectivePlacement(\n config: Pick<BenjiConnectConfig, 'anchor' | 'placement'>,\n): BenjiConnectPlacement {\n if (!config.anchor) {\n return BenjiConnectPlacement.CENTER;\n }\n return config.placement ?? BenjiConnectPlacement.BOTTOM_END;\n}\n\nexport function defaultOffset(\n offset?: BenjiConnectPlacementOffset,\n): Required<BenjiConnectPlacementOffset> {\n return {\n top: offset?.top ?? 0,\n left: offset?.left ?? 0,\n };\n}\n\nexport function resolveIframeDimensions(viewport: ViewportSize): {\n width: number;\n height: number;\n} {\n const maxW = viewport.width - 2 * VIEWPORT_PADDING;\n const maxH = viewport.height - 2 * VIEWPORT_PADDING;\n const scale = Math.min(1, maxW / IFRAME_WIDTH, maxH / IFRAME_HEIGHT);\n return {\n width: Math.floor(IFRAME_WIDTH * scale),\n height: Math.floor(IFRAME_HEIGHT * scale),\n };\n}\n\nexport function iframeFitsHorizontally(\n viewportWidth: number,\n iframeWidth: number = IFRAME_WIDTH,\n): boolean {\n return viewportWidth >= iframeWidth + 2 * VIEWPORT_PADDING;\n}\n\nfunction centerLayout(viewport: ViewportSize): IframeRect {\n const { width, height } = resolveIframeDimensions(viewport);\n return {\n top: 0,\n left: 0,\n width,\n height,\n placement: BenjiConnectPlacement.CENTER,\n };\n}\n\nexport function fitsBelow(\n anchorBottom: number,\n offsetTop: number,\n viewportHeight: number,\n iframeHeight: number = IFRAME_HEIGHT,\n): boolean {\n const top = anchorBottom + offsetTop;\n const bottom = top + iframeHeight;\n return (\n top >= VIEWPORT_PADDING && bottom <= viewportHeight - VIEWPORT_PADDING\n );\n}\n\nfunction clampHorizontal(left: number, viewportWidth: number): number {\n const min = VIEWPORT_PADDING;\n const max = viewportWidth - IFRAME_WIDTH - VIEWPORT_PADDING;\n if (max < min) {\n return min;\n }\n return Math.min(Math.max(left, min), max);\n}\n\nfunction warnInvalidAnchor(message: string): void {\n console.warn(`[Benji Connect SDK] ${message}`);\n}\n\nexport function computeIframeRect(\n anchorElement: HTMLElement,\n placement: BenjiConnectPlacement,\n offset: BenjiConnectPlacementOffset,\n viewport: ViewportSize,\n options: ResolveIframeLayoutOptions = {},\n): IframeRect {\n const { warnOnInvalidAnchor = false } = options;\n const resolvedOffset = defaultOffset(offset);\n\n if (placement === BenjiConnectPlacement.CENTER) {\n return centerLayout(viewport);\n }\n\n if (!isAnchorVisible(anchorElement)) {\n if (isPreservableAnchoredLayout(options.preserveAnchoredLayout)) {\n return clampPreservedAnchoredLayout(\n options.preserveAnchoredLayout,\n viewport,\n );\n }\n if (warnOnInvalidAnchor) {\n warnInvalidAnchor(\n 'anchor is hidden or detached; falling back to centered modal',\n );\n }\n return centerLayout(viewport);\n }\n\n const rect = anchorElement.getBoundingClientRect();\n\n if (!fitsBelow(rect.bottom, resolvedOffset.top, viewport.height)) {\n return centerLayout(viewport);\n }\n\n if (!iframeFitsHorizontally(viewport.width)) {\n return centerLayout(viewport);\n }\n\n const top = rect.bottom + resolvedOffset.top;\n const idealLeft =\n placement === BenjiConnectPlacement.BOTTOM_END\n ? rect.right - IFRAME_WIDTH + resolvedOffset.left\n : rect.left + resolvedOffset.left;\n\n if (idealLeft < VIEWPORT_PADDING) {\n if (warnOnInvalidAnchor) {\n warnInvalidAnchor(\n 'anchor rect is unusable for placement; falling back to centered modal',\n );\n }\n return centerLayout(viewport);\n }\n\n const left = clampHorizontal(idealLeft, viewport.width);\n\n return {\n top,\n left,\n width: IFRAME_WIDTH,\n height: IFRAME_HEIGHT,\n placement,\n };\n}\n\nexport function resolveIframeLayout(\n config: BenjiConnectConfig,\n viewport: ViewportSize = {\n width: window.innerWidth,\n height: window.innerHeight,\n },\n options: ResolveIframeLayoutOptions = {},\n): IframeRect {\n const { warnOnInvalidAnchor = true } = options;\n const placement = resolveEffectivePlacement(config);\n const anchorElement = resolveAnchor(config.anchor);\n\n if (\n warnOnInvalidAnchor &&\n placement !== BenjiConnectPlacement.CENTER &&\n !anchorElement\n ) {\n warnInvalidAnchor('anchor not found; falling back to centered modal');\n return preservedAnchoredLayoutOrCenter(viewport, options);\n }\n\n if (placement === BenjiConnectPlacement.CENTER) {\n return centerLayout(viewport);\n }\n\n if (!anchorElement) {\n return preservedAnchoredLayoutOrCenter(viewport, options);\n }\n\n return computeIframeRect(\n anchorElement,\n placement,\n config.offset,\n viewport,\n options,\n );\n}\n\n// --- DOM application ---\n\nexport interface IframeLayoutState {\n layout: IframeRect;\n lastValidAnchoredLayout: IframeRect | null;\n}\n\nexport interface RepositionListenerHandle {\n remove(): void;\n}\n\nexport function applyOverlayBaseStyle(container: HTMLDivElement): void {\n Object.assign(container.style, CONTAINER_BASE_STYLE);\n}\n\nfunction getVisualViewportOffset(): { top: number; left: number } {\n const vv = window.visualViewport;\n if (!vv) {\n return { top: 0, left: 0 };\n }\n return { top: vv.offsetTop, left: vv.offsetLeft };\n}\n\nfunction getRepositionScrollTargets(\n anchor: BenjiConnectAnchor | undefined,\n): Array<Window | HTMLElement> {\n const targets = new Set<Window | HTMLElement>([window]);\n const anchorElement = resolveAnchor(anchor);\n\n if (!anchorElement) {\n return [...targets];\n }\n\n targets.add(anchorElement);\n\n let parent: HTMLElement | null = anchorElement.parentElement;\n while (parent) {\n const { overflow, overflowX, overflowY } = window.getComputedStyle(parent);\n const overflowValue = `${overflow} ${overflowX} ${overflowY}`;\n\n if (/(auto|scroll|overlay)/.test(overflowValue)) {\n targets.add(parent);\n }\n\n parent = parent.parentElement;\n }\n\n return [...targets];\n}\n\nexport function applyIframeLayoutToElements(\n config: BenjiConnectConfig,\n container: HTMLDivElement,\n iframe: HTMLIFrameElement,\n state: IframeLayoutState,\n options: ResolveIframeLayoutOptions = { warnOnInvalidAnchor: false },\n): void {\n state.layout = resolveIframeLayout(config, undefined, {\n ...options,\n preserveAnchoredLayout: state.lastValidAnchoredLayout,\n });\n\n if (state.layout.placement !== BenjiConnectPlacement.CENTER) {\n state.lastValidAnchoredLayout = state.layout;\n }\n\n const iframeStyle = {\n ...IFRAME_STATIC_STYLE,\n width: `${state.layout.width}px`,\n height: `${state.layout.height}px`,\n };\n\n if (state.layout.placement === BenjiConnectPlacement.CENTER) {\n Object.assign(container.style, {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'auto',\n });\n Object.assign(iframe.style, iframeStyle, {\n position: 'relative',\n top: '',\n left: '',\n });\n return;\n }\n\n Object.assign(container.style, {\n display: 'block',\n overflow: 'auto',\n });\n\n const viewportOffset = getVisualViewportOffset();\n Object.assign(iframe.style, iframeStyle, {\n position: 'fixed',\n top: `${state.layout.top + viewportOffset.top}px`,\n left: `${state.layout.left + viewportOffset.left}px`,\n });\n}\n\nexport interface PopupScreenPosition {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\nexport interface PopupLayoutState {\n lastValidAnchoredLayout: IframeRect | null;\n}\n\nfunction popupFitsBelow(\n anchorBottom: number,\n offsetTop: number,\n viewportHeight: number,\n): boolean {\n const top = anchorBottom + offsetTop;\n const bottom = top + POPUP_HEIGHT;\n return (\n top >= VIEWPORT_PADDING && bottom <= viewportHeight - VIEWPORT_PADDING\n );\n}\n\nfunction popupFitsHorizontally(viewportWidth: number): boolean {\n return viewportWidth >= POPUP_WIDTH + 2 * VIEWPORT_PADDING;\n}\n\nfunction clampPopupHorizontal(left: number, viewportWidth: number): number {\n const min = VIEWPORT_PADDING;\n const max = viewportWidth - POPUP_WIDTH - VIEWPORT_PADDING;\n if (max < min) {\n return min;\n }\n return Math.min(Math.max(left, min), max);\n}\n\nfunction centerPopupViewportRect(viewport: ViewportSize): IframeRect {\n const left = Math.max(\n VIEWPORT_PADDING,\n (viewport.width - POPUP_WIDTH) / 2,\n );\n const top = Math.max(\n VIEWPORT_PADDING,\n (viewport.height - POPUP_HEIGHT) / 2,\n );\n return {\n top,\n left,\n width: POPUP_WIDTH,\n height: POPUP_HEIGHT,\n placement: BenjiConnectPlacement.CENTER,\n };\n}\n\nfunction computePopupViewportRect(\n anchorElement: HTMLElement,\n placement: BenjiConnectPlacement,\n offset: BenjiConnectPlacementOffset,\n viewport: ViewportSize,\n options: ResolveIframeLayoutOptions = {},\n): IframeRect {\n const { warnOnInvalidAnchor = false } = options;\n const resolvedOffset = defaultOffset(offset);\n\n if (placement === BenjiConnectPlacement.CENTER) {\n return centerPopupViewportRect(viewport);\n }\n\n if (!isAnchorVisible(anchorElement)) {\n if (isPreservableAnchoredLayout(options.preserveAnchoredLayout)) {\n return clampPreservedAnchoredLayout(\n options.preserveAnchoredLayout,\n viewport,\n );\n }\n if (warnOnInvalidAnchor) {\n warnInvalidAnchor(\n 'anchor is hidden or detached; falling back to centered popup',\n );\n }\n return centerPopupViewportRect(viewport);\n }\n\n const rect = anchorElement.getBoundingClientRect();\n\n if (!popupFitsBelow(rect.bottom, resolvedOffset.top, viewport.height)) {\n return centerPopupViewportRect(viewport);\n }\n\n if (!popupFitsHorizontally(viewport.width)) {\n return centerPopupViewportRect(viewport);\n }\n\n const top = rect.bottom + resolvedOffset.top;\n const idealLeft =\n placement === BenjiConnectPlacement.BOTTOM_END\n ? rect.right - POPUP_WIDTH + resolvedOffset.left\n : rect.left + resolvedOffset.left;\n\n if (idealLeft < VIEWPORT_PADDING) {\n if (warnOnInvalidAnchor) {\n warnInvalidAnchor(\n 'anchor rect is unusable for popup placement; falling back to centered popup',\n );\n }\n return centerPopupViewportRect(viewport);\n }\n\n const left = clampPopupHorizontal(idealLeft, viewport.width);\n\n return {\n top,\n left,\n width: POPUP_WIDTH,\n height: POPUP_HEIGHT,\n placement,\n };\n}\n\nexport function resolvePopupViewportLayout(\n config: BenjiConnectConfig,\n viewport: ViewportSize = {\n width: window.innerWidth,\n height: window.innerHeight,\n },\n options: ResolveIframeLayoutOptions = {},\n): IframeRect {\n const { warnOnInvalidAnchor = true } = options;\n const placement = resolveEffectivePlacement(config);\n const anchorElement = resolveAnchor(config.anchor);\n\n if (\n warnOnInvalidAnchor &&\n placement !== BenjiConnectPlacement.CENTER &&\n !anchorElement\n ) {\n warnInvalidAnchor('anchor not found; falling back to centered popup');\n if (isPreservableAnchoredLayout(options.preserveAnchoredLayout)) {\n return clampPreservedAnchoredLayout(\n options.preserveAnchoredLayout,\n viewport,\n );\n }\n return centerPopupViewportRect(viewport);\n }\n\n if (placement === BenjiConnectPlacement.CENTER || !anchorElement) {\n return centerPopupViewportRect(viewport);\n }\n\n return computePopupViewportRect(\n anchorElement,\n placement,\n config.offset,\n viewport,\n options,\n );\n}\n\nexport function computePopupScreenPosition(\n config: BenjiConnectConfig,\n state: PopupLayoutState = { lastValidAnchoredLayout: null },\n options: ResolveIframeLayoutOptions = {},\n): PopupScreenPosition {\n const layout = resolvePopupViewportLayout(config, undefined, {\n ...options,\n preserveAnchoredLayout: state.lastValidAnchoredLayout,\n });\n\n if (layout.placement !== BenjiConnectPlacement.CENTER) {\n state.lastValidAnchoredLayout = layout;\n }\n\n const viewportOffset = getVisualViewportOffset();\n\n return {\n left: window.screenX + layout.left + viewportOffset.left,\n top: window.screenY + layout.top + viewportOffset.top,\n width: layout.width,\n height: layout.height,\n };\n}\n\nexport function buildLoginPopupFeatures(position: PopupScreenPosition): string {\n return [\n `width=${position.width}`,\n `height=${position.height}`,\n `left=${Math.round(position.left)}`,\n `top=${Math.round(position.top)}`,\n 'scrollbars=yes',\n 'resizable=yes',\n ].join(',');\n}\n\nexport function applyHeadlessContainerStyle(container: HTMLDivElement): void {\n Object.assign(container.style, {\n position: 'fixed',\n top: '0',\n left: '-9999px',\n width: '1px',\n height: '1px',\n overflow: 'hidden',\n pointerEvents: 'none',\n backgroundColor: 'transparent',\n opacity: '0',\n zIndex: '-1',\n });\n}\n\nexport function applyHeadlessIframeStyle(iframe: HTMLIFrameElement): void {\n Object.assign(iframe.style, {\n position: 'absolute',\n top: '0',\n left: '0',\n width: '1px',\n height: '1px',\n border: 'none',\n opacity: '0',\n pointerEvents: 'none',\n });\n}\n\nexport function attachRepositionListeners(\n config: Pick<BenjiConnectConfig, 'anchor'>,\n onReposition: () => void,\n): RepositionListenerHandle {\n const repositionHandler = onReposition;\n const repositionScrollTargets = getRepositionScrollTargets(config.anchor);\n repositionScrollTargets.forEach((target) => {\n target.addEventListener('scroll', repositionHandler, { passive: true });\n });\n window.addEventListener('resize', repositionHandler);\n\n const visualViewport = window.visualViewport;\n visualViewport?.addEventListener('resize', repositionHandler);\n visualViewport?.addEventListener('scroll', repositionHandler);\n\n return {\n remove() {\n repositionScrollTargets.forEach((target) => {\n target.removeEventListener('scroll', repositionHandler);\n });\n window.removeEventListener('resize', repositionHandler);\n visualViewport?.removeEventListener('resize', repositionHandler);\n visualViewport?.removeEventListener('scroll', repositionHandler);\n },\n };\n}\n","import { BenjiConnectAuthAction } from \"./auth\";\n\n// Known event names coming from the SDK transport (postMessage)\nexport enum BenjiConnectEventType {\n AUTH_SUCCESS = 'AUTH_SUCCESS',\n FLOW_EXIT = 'FLOW_EXIT',\n FLOW_SUCCESS = 'FLOW_SUCCESS',\n EVENT = 'EVENT',\n ERROR = 'ERROR',\n PARTNER_LOGIN_OPEN = 'PARTNER_LOGIN_OPEN',\n}\n\nexport interface BenjiConnectPartnerLoginOpenEventData {\n url: string | null;\n title?: string;\n}\n\n// Known exit trigger types coming from the SDK transport (postMessage)\nexport enum BenjiConnectExitTrigger {\n ACTION_BUTTON_CLICKED = 'ACTION_BUTTON_CLICKED',\n BACK_TO_MERCHANT_CLICKED = 'BACK_TO_MERCHANT_CLICKED', // deprecated\n CLOSE_BUTTON_CLICKED = 'CLOSE_BUTTON_CLICKED',\n TAPPED_OUT_OF_BOUNDS = 'TAPPED_OUT_OF_BOUNDS',\n /** User closed the LOGIN partner-auth popup window. */\n POPUP_CLOSED = 'POPUP_CLOSED',\n}\n\nexport enum BenjiConnectErrorName {\n UNEXPECTED_ERROR = 'unexpected_error',\n PARTNER_CONNECT_ERROR = 'partner_connect_error'\n}\n\nexport type BenjiConnectErrorID = '400' | '500'; // Placeholders for now\n\n// Transport-layer token (raw, unprocessed from postMessage)\nexport interface BenjiConnectEventToken {\n access_token?: string;\n refresh_token?: string;\n expires_at?: string | number;\n exchange_token?: string;\n}\n\nexport interface BenjiConnectEventUserData {\n user: {\n id: number\n first_name: string\n last_name: string\n uuid?: string\n }\n status: BenjiConnectEventUserStatusData\n extra_data?: {\n total_rewards_earned?: number\n total_rewards_redeemed?: number\n created_date?: string\n }\n}\n\nexport interface BenjiConnectEventTransactionData {\n action: string;\n amount: number;\n trigger_event_id: string;\n trigger_name: string;\n}\n\nexport interface BenjiConnectEventUserStatusData {\n status_id: string\n num_of_rewards: number\n reward_status: string\n partner_status_tier_id?: number\n}\n\n// Basic structure for Benji Connect SDK typed events\nexport interface BenjiConnectEvent {\n type: BenjiConnectEventType;\n data?: BenjiConnectEventData;\n}\n\nexport interface BenjiConnectEventData {\n [k: string]: unknown;\n}\n\nexport interface BenjiConnectEventMessage<K extends BenjiConnectEventType = BenjiConnectEventType> {\n type: K; // discriminant\n data: BenjiConnectEventDataMap[K];\n}\n\nexport interface BenjiConnectAuthSuccessEventData {\n action: BenjiConnectAuthAction;\n metadata?: BenjiConnectEventUserData;\n token?: BenjiConnectEventToken,\n transaction?: BenjiConnectEventTransactionData;\n}\n\nexport interface BenjiConnectFlowExitEventData {\n step: string;\n trigger: BenjiConnectExitTrigger;\n}\n\nexport interface BenjiConnectErrorEventData {\n error: Error;\n}\n\n// Canonical event map \nexport type BenjiConnectEventDataMap = {\n [BenjiConnectEventType.AUTH_SUCCESS]: BenjiConnectAuthSuccessEventData;\n [BenjiConnectEventType.FLOW_EXIT]: BenjiConnectFlowExitEventData;\n [BenjiConnectEventType.FLOW_SUCCESS]: BenjiConnectAuthSuccessEventData;\n [BenjiConnectEventType.EVENT]: BenjiConnectEventData;\n [BenjiConnectEventType.ERROR]: BenjiConnectErrorEventData;\n [BenjiConnectEventType.PARTNER_LOGIN_OPEN]: BenjiConnectPartnerLoginOpenEventData;\n\n // Optional catch-all fan-out\n '*': { type: BenjiConnectEventType; data: BenjiConnectEventDataMap[BenjiConnectEventType] };\n};","import { BenjiConnectAuthToken } from '../types/auth';\nimport { BenjiConnectMode } from '../types/config';\nimport { BenjiConnectEventToken, BenjiConnectEventType } from '../types/event';\n\n/**\n * Mirrored from Benji Connect AuthMessageType — transport routing only.\n * Keep aligned with Benji Connect/src/types/messege.ts\n */\nconst AUTH_MESSAGE_TYPES = new Set([\n 'auth_config',\n 'code_received',\n 'code_verification_error',\n 'loyalty_verification',\n 'phone_verification',\n 'request_auth_config',\n 'request_code_exchange',\n 'request_code_with_login',\n 'request_code_with_phone',\n 'request_loyalty_verification',\n 'request_phone_verification',\n]);\n\nconst CONNECT_MESSAGE_TYPES = new Set<string>(Object.values(BenjiConnectEventType));\n\nexport function isAuthMessageType(data: unknown): boolean {\n if (!data || typeof data !== 'object') return false;\n const type = (data as { type?: string }).type;\n return typeof type === 'string' && AUTH_MESSAGE_TYPES.has(type);\n}\n\nexport function shouldRelayMessage(mode: BenjiConnectMode | undefined, data: unknown): boolean {\n return mode === BenjiConnectMode.LOGIN && isAuthMessageType(data);\n}\n\n/**\n * True when the message came from a window the host opened (popup or Safari tab).\n * iOS Safari often navigates OAuth in a new tab whose Window is not === loginPopup,\n * but that tab still has opener === the partner host page.\n */\nexport function sourceOpenerIsHost(source: MessageEventSource | null): boolean {\n try {\n return source instanceof Window && source.opener === window;\n } catch {\n // Cross-origin or non-Window sources can throw when reading opener.\n return false;\n }\n}\n\n/**\n * Popup → iframe traffic: partner auth / OAuth callback posting to the host\n * so we can forward it into the headless Connect iframe.\n *\n * Must not treat the iframe itself as popup-originated (iframe.opener can be\n * the host on some browsers). Check iframe source first in handleMessage.\n */\nexport function isPopupOriginatedAuth(\n event: MessageEvent<unknown>,\n loginPopup: Window | null,\n iframeWindow: Window | null,\n connectOrigin: string,\n): boolean {\n // Iframe → popup is handled separately; never classify it as popup-originated.\n if (iframeWindow && event.source === iframeWindow) {\n return false;\n }\n\n // Desktop / named popup: same Window object the SDK stored from window.open.\n if (loginPopup && event.source === loginPopup) {\n return true;\n }\n\n // Safari iOS / new-tab OAuth: callback tab opened by the host (opener is this page).\n if (sourceOpenerIsHost(event.source)) {\n return true;\n }\n\n // Callback document on the verify-app origin (e.g. verifyapp-*.withbenji.com)\n // posting auth messages when source identity is unreliable after redirects.\n return (\n event.source instanceof Window &&\n event.origin === connectOrigin &&\n event.source !== iframeWindow\n );\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 {\n isConnectMessageType,\n isPopupOriginatedAuth,\n shouldRelayMessage,\n} from '../utils/auth';\n\nexport class MessageRouter {\n\n static configuredListeners = false;\n static onSuccess?: (\n token: string, \n metadata: BenjiConnectOnSuccessMetadata\n ) => void;\n static onError?: (\n error: Error,\n error_id: string,\n metadata: BenjiConnectMetadata\n ) => void;\n static onExit?: (\n metadata: BenjiConnectOnExitMetadata\n ) => void;\n static onEvent?: (\n type: BenjiConnectEventType, \n metadata: BenjiConnectMetadata\n ) => void;\n static close?: () => void;\n static closeLoginPopup?: () => void;\n static navigateLoginPopup?: (url: string) => void;\n\n static iframe: HTMLIFrameElement | null = null;\n static loginPopup: Window | null = null;\n static mode: BenjiConnectMode = BenjiConnectMode.CONNECT;\n static connectOrigin = '';\n static isIframeReady = false;\n static pendingPopupAuth: MessageEvent<unknown>[] = [];\n\n static configureMessageRouter(config: MessageRouterConfig) {\n this.onSuccess = config.onSuccess;\n this.onError = config.onError;\n this.onExit = config.onExit;\n this.onEvent = config.onEvent;\n this.close = config.close;\n this.closeLoginPopup = config.closeLoginPopup;\n this.navigateLoginPopup = config.navigateLoginPopup;\n }\n\n static setLoginContext(context: MessageRouterLoginContext) {\n this.iframe = context.iframe;\n this.loginPopup = context.loginPopup;\n this.mode = context.mode;\n this.connectOrigin = new URL(Endpoints.benji_connect_auth_url).origin;\n if (this.isIframeReady) {\n this.flushPendingPopupAuth();\n }\n }\n\n static resetIframeReady() {\n this.isIframeReady = false;\n }\n\n static setMode(mode: BenjiConnectMode) {\n this.mode = mode;\n }\n\n static errorEventHandler = (event: Event) => { \n return MessageRouter.handleErrorMessage(event) \n };\n\n static messageEventHandler = (event: MessageEvent<unknown>) => { \n return MessageRouter.handleMessage(event) \n };\n\n static addEventListeners() {\n if (this.configuredListeners) return;\n window.addEventListener('error', this.errorEventHandler);\n window.addEventListener('unhandledrejection', this.errorEventHandler);\n window.addEventListener('message', this.messageEventHandler);\n this.configuredListeners = true;\n }\n\n static removeEventListeners() {\n window.removeEventListener('error', this.errorEventHandler);\n window.removeEventListener('unhandledrejection', this.errorEventHandler);\n window.removeEventListener('message', this.messageEventHandler);\n this.configuredListeners = false;\n this.iframe = null;\n this.loginPopup = null;\n this.mode = BenjiConnectMode.CONNECT;\n this.connectOrigin = '';\n this.isIframeReady = false;\n this.pendingPopupAuth = [];\n }\n\n static handleErrorMessage(event: Event) { \n switch(event.type) {\n case 'error': {\n const errorEvent = event as ErrorEvent;\n const error = errorEvent.error || new Error(errorEvent.message);\n break;\n }\n case 'unhandledrejection': {\n const rejectionEvent = event as PromiseRejectionEvent;\n const reason = rejectionEvent.reason instanceof Error\n ? rejectionEvent.reason\n : new Error(String(rejectionEvent.reason));\n break;\n }\n default: {\n console.error('[Benji Connect SDK] Received Unknown error message', event);\n break;\n }\n }\n }\n\n // Forward popup/tab auth payloads into Connect. Queue until the iframe has loaded;\n // otherwise fast SSO (Safari or already-authenticated) can arrive before contentWindow is usable.\n static relayToIframe(event: MessageEvent<unknown>) {\n const iframeWindow = this.iframe?.contentWindow;\n if (!this.isIframeReady || !iframeWindow) {\n this.pendingPopupAuth.push(event);\n return;\n }\n\n iframeWindow.postMessage(event.data, this.connectOrigin);\n }\n\n static markIframeReady(iframe: HTMLIFrameElement) {\n if (this.iframe !== iframe) return;\n this.isIframeReady = true;\n this.flushPendingPopupAuth();\n }\n\n static flushPendingPopupAuth() {\n if (!this.isIframeReady || !this.pendingPopupAuth.length) return;\n const expectedOrigin = this.connectOrigin || new URL(Endpoints.benji_connect_auth_url).origin;\n const iframeWindow = this.iframe?.contentWindow ?? null;\n const queued = this.pendingPopupAuth;\n this.pendingPopupAuth = [];\n for (const event of queued) {\n if (\n !isPopupOriginatedAuth(\n event,\n this.loginPopup,\n iframeWindow,\n expectedOrigin,\n )\n ) {\n continue;\n }\n this.relayToIframe(event);\n }\n }\n\n static relayToPopup(payload: unknown) {\n if (!this.loginPopup) {\n console.warn('[Benji Connect SDK] Skipping login auth relay, no login popup');\n return;\n }\n\n try {\n this.loginPopup.postMessage(payload, '*');\n } catch (error) {\n console.error('[Benji Connect SDK] Failed to forward login auth message to popup', error);\n }\n }\n\n static handleMessage(event: MessageEvent<unknown>) {\n // LOGIN auth relay: popup/tab and the headless iframe cannot talk directly.\n // The host forwards partner-auth postMessages so Connect can finish sign-in.\n if (shouldRelayMessage(this.mode, event.data)) {\n const expectedOrigin = this.connectOrigin || new URL(Endpoints.benji_connect_auth_url).origin;\n const iframeWindow = this.iframe?.contentWindow;\n\n // Scenario: iframe → popup (Connect sending auth_config, etc. to the partner window).\n // Check this first so iframe traffic is never treated as a callback tab\n // (iframe.contentWindow.opener can equal the host).\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 // Scenario: popup → iframe — desktop popup, host-opened callback tab, or\n // verify-app-origin callback traffic after OAuth redirect (Safari iOS).\n if (\n isPopupOriginatedAuth(event, this.loginPopup, iframeWindow ?? null, expectedOrigin)\n ) {\n this.relayToIframe(event);\n return;\n }\n\n return;\n }\n\n if (!isConnectMessageType(event.data)) return;\n\n const expectedOrigin: string = new URL(Endpoints.benji_connect_auth_url).origin;\n if (!event || event.origin !== expectedOrigin) {\n console.warn('[Benji Connect SDK] Skipped message, received event from unexpected origin', event.origin, expectedOrigin);\n return;\n }\n\n const raw = event.data;\n if (!raw || typeof raw !== 'object') return;\n\n const partial = raw as Partial<BenjiConnectEventMessage>;\n if (typeof partial.type !== 'string') return;\n \n const message = partial as BenjiConnectEventMessage;\n\n try {\n switch (message.type) {\n\n case BenjiConnectEventType.PARTNER_LOGIN_OPEN: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.PARTNER_LOGIN_OPEN>;\n const url = connectMessage.data?.url;\n if (url) {\n this.navigateLoginPopup?.(url);\n } else {\n this.closeLoginPopup?.();\n }\n break;\n }\n\n case BenjiConnectEventType.AUTH_SUCCESS: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.AUTH_SUCCESS>;\n const callbackData = BenjiConnectCallbackMapperMap.AUTH_SUCCESS(connectMessage, connectMessage.data);\n this.onEvent?.(callbackData.type, callbackData.metadata); \n break;\n }\n\n case BenjiConnectEventType.FLOW_EXIT: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.FLOW_EXIT>;\n const callbackData = BenjiConnectCallbackMapperMap.FLOW_EXIT(connectMessage.data) as BenjiConnectOnExitData;\n this.onExit?.(callbackData.metadata);\n this.close?.();\n break;\n }\n\n case BenjiConnectEventType.FLOW_SUCCESS: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.FLOW_SUCCESS>;\n const callbackData = BenjiConnectCallbackMapperMap.FLOW_SUCCESS(connectMessage.data) as BenjiConnectOnSuccessData;\n this.onSuccess?.(callbackData.token, callbackData.metadata);\n if (this.mode === BenjiConnectMode.LOGIN) {\n this.close?.();\n }\n break;\n }\n\n case BenjiConnectEventType.ERROR: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.ERROR>;\n const callbackData = BenjiConnectCallbackMapperMap.ERROR(connectMessage.data);\n this.onError?.(callbackData.error, callbackData.error_id, callbackData.metadata);\n break;\n }\n\n case BenjiConnectEventType.EVENT: {\n const connectMessage = message as BenjiConnectEventMessage<BenjiConnectEventType.EVENT>;\n const callbackData = mapToOnEventData(connectMessage, connectMessage.data);\n this.onEvent?.(callbackData.type, callbackData.metadata);\n break;\n }\n\n default: {\n const _exhaustive: never = message.type;\n console.warn('[Benji Connect SDK] Unhandled connect message type', _exhaustive);\n break;\n }\n\n }\n } finally {\n // TODO: Any cleanup logic \n }\n }\n\n}\n","/// <reference path=\"./global.d.ts\" />\n\nimport { \n configureConfig, \n Endpoints\n} from './config';\n\nimport { \n type BenjiConnectConfig,\n BenjiConnectEnvironment,\n BenjiConnectMode,\n BenjiConnectPlacement,\n PartnerIntegrationType,\n} from './types/config';\n\nimport { \n buildContext, \n mapToConnectEnvironment \n} from './utils/config';\n\nimport { writeLoginPopupLoadingDocument } from './utils/loginPopupLoading';\nimport {\n appendLoginPopupFlag,\n preparePartnerAuthUrl,\n} from './utils/partnerAuthLink';\n\nimport {\n IFRAME_HEIGHT,\n IFRAME_WIDTH,\n applyHeadlessContainerStyle,\n applyHeadlessIframeStyle,\n applyIframeLayoutToElements,\n applyOverlayBaseStyle,\n attachRepositionListeners,\n buildLoginPopupFeatures,\n computePopupScreenPosition,\n type IframeLayoutState,\n type PopupLayoutState,\n type RepositionListenerHandle,\n} from './utils/placement';\n\nimport { MessageRouter } from './router/message';\nimport { BenjiConnectExitTrigger } from './types/event';\n\nconst POPUP_CLOSED_POLL_MS = 500;\n\nclass ConnectSDK {\n\n private sdkConfig: BenjiConnectConfig;\n private iframe: HTMLIFrameElement | null = null;\n private container: HTMLDivElement | null = null;\n private layoutState: IframeLayoutState = {\n layout: {\n top: 0,\n left: 0,\n width: IFRAME_WIDTH,\n height: IFRAME_HEIGHT,\n placement: BenjiConnectPlacement.CENTER,\n },\n lastValidAnchoredLayout: null,\n };\n private popupLayoutState: PopupLayoutState = {\n lastValidAnchoredLayout: null,\n };\n private repositionListeners: RepositionListenerHandle | null = null;\n private loginPopup: Window | null = null;\n private hasLoginPopupUrl = false;\n private popupClosedPollId: ReturnType<typeof setInterval> | null = null;\n private isClosing = false;\n /**\n * Aborts a pending open() when close() runs before the iframe mounts.\n * Non-DUMMY LOGIN arms listeners, then opens the partner popup synchronously,\n * then mounts a headless iframe. Without this, close() can tear down the popup\n * while the in-flight open() still mounts the iframe.\n */\n private openAbortController: AbortController | null = null;\n\n private onIframeLoad = (): void => {\n if (this.isClosing || !this.iframe) return;\n MessageRouter.markIframeReady(this.iframe);\n };\n\n constructor(config: BenjiConnectConfig) {\n\n this.sdkConfig = config;\n\n // Validations\n if (!this.sdkConfig.environment) throw new Error('Environment is required');\n if (!this.sdkConfig.token) throw new Error('Connect token is required');\n\n // Set internal config for environment based on consumer input at runtime\n const environment: BenjiConnectEnvironment = mapToConnectEnvironment(this.sdkConfig.environment);\n this.sdkConfig.environment = environment;\n configureConfig(environment);\n }\n\n private resolveAuthType(): PartnerIntegrationType | undefined {\n return this.sdkConfig.tokenData?.authType ?? this.sdkConfig.authType;\n }\n\n private isLoginPopupOnly(): boolean {\n const mode = this.sdkConfig.mode ?? BenjiConnectMode.CONNECT;\n const authType = this.resolveAuthType();\n return (\n mode === BenjiConnectMode.LOGIN &&\n authType != null &&\n authType !== PartnerIntegrationType.DUMMY\n );\n }\n\n private isSessionActive(): boolean {\n return this.iframe != null || this.loginPopup != null;\n }\n\n /** Cancels any open() still running between popup pre-open and iframe mount. */\n private abortInflightOpen(): void {\n this.openAbortController?.abort();\n this.openAbortController = null;\n }\n\n initialize() {\n MessageRouter.configureMessageRouter({\n onSuccess: this.sdkConfig.onSuccess,\n onError: this.sdkConfig.onError,\n onExit: this.sdkConfig.onExit,\n onEvent: this.sdkConfig.onEvent,\n close: () => this.close(),\n closeLoginPopup: () => this.closeLoginPopup(),\n navigateLoginPopup: (url: string) => this.navigateLoginPopup(url),\n });\n\n // TODO: Tracker.configureWithOptions(sdkOptions);\n // TODO: Tracker.trackSDKInitialized();\n }\n\n private openLoginPopup(): boolean {\n const position = computePopupScreenPosition(\n this.sdkConfig,\n this.popupLayoutState,\n { warnOnInvalidAnchor: true },\n );\n\n const partnerAuthLink = this.sdkConfig.tokenData?.partnerAuthLink;\n const configToken = this.sdkConfig.tokenData?.configToken;\n const preparedLink =\n partnerAuthLink && configToken\n ? preparePartnerAuthUrl(partnerAuthLink, configToken)\n : partnerAuthLink;\n const popupUrl = preparedLink\n ? appendLoginPopupFlag(preparedLink)\n : 'about:blank';\n\n this.loginPopup = window.open(\n popupUrl,\n 'benji_partner_auth',\n buildLoginPopupFeatures(position),\n );\n\n if (!this.loginPopup) {\n console.warn('[Connect SDK] Failed to pre-open LOGIN partner auth popup');\n this.sdkConfig.onError?.(\n new Error('Popup blocked. Allow popups for this site and try again.'),\n '400',\n { context: buildContext() },\n );\n return false;\n }\n\n if (preparedLink) {\n this.hasLoginPopupUrl = true;\n } else {\n writeLoginPopupLoadingDocument(this.loginPopup);\n }\n this.startPopupClosedPoll();\n return true;\n }\n\n private startPopupClosedPoll(): void {\n this.stopPopupClosedPoll();\n this.popupClosedPollId = setInterval(() => {\n if (this.isClosing) return;\n if (this.loginPopup?.closed) {\n this.sdkConfig.onExit?.({\n context: buildContext(),\n trigger: BenjiConnectExitTrigger.POPUP_CLOSED,\n });\n this.close();\n }\n }, POPUP_CLOSED_POLL_MS);\n }\n\n private stopPopupClosedPoll(): void {\n if (this.popupClosedPollId != null) {\n clearInterval(this.popupClosedPollId);\n this.popupClosedPollId = null;\n }\n }\n\n private repositionLoginPopup(): void {\n if (!this.loginPopup || this.loginPopup.closed) return;\n\n const position = computePopupScreenPosition(\n this.sdkConfig,\n this.popupLayoutState,\n );\n\n try {\n this.loginPopup.moveTo(\n Math.round(position.left),\n Math.round(position.top),\n );\n this.loginPopup.resizeTo(position.width, position.height);\n } catch (error) {\n console.warn('[Connect SDK] Failed to reposition LOGIN popup', error);\n }\n }\n\n async open() {\n if (this.isSessionActive()) return;\n\n const mode = this.sdkConfig.mode ?? BenjiConnectMode.CONNECT;\n const abortController = new AbortController();\n this.openAbortController = abortController;\n const { signal } = abortController;\n\n this.initialize();\n if (signal.aborted) return;\n\n MessageRouter.setMode(mode);\n MessageRouter.addEventListeners();\n\n if (this.isLoginPopupOnly()) {\n const opened = this.openLoginPopup();\n if (!opened) {\n this.abortInflightOpen();\n MessageRouter.removeEventListeners();\n return;\n }\n this.syncLoginContext(mode);\n }\n\n if (signal.aborted) {\n MessageRouter.removeEventListeners();\n return;\n }\n\n this.openUI();\n this.syncLoginContext(mode);\n // TODO: Track SDK Opened Tracker.trackSDKOpened();\n }\n\n private syncLoginContext(mode: BenjiConnectMode): void {\n MessageRouter.setLoginContext({\n iframe: this.iframe,\n loginPopup: this.loginPopup,\n mode,\n });\n }\n\n openUI() {\n // loginPopup may already be set for non-DUMMY LOGIN before the iframe mounts.\n if (this.iframe) return;\n\n MessageRouter.resetIframeReady();\n\n const headless = this.isLoginPopupOnly();\n\n this.container = document.createElement('div');\n if (headless) {\n applyHeadlessContainerStyle(this.container);\n } else {\n applyOverlayBaseStyle(this.container);\n }\n\n console.debug('[Connect SDK] endpoints', Endpoints);\n console.log('[Connect SDK] opeining URL', Endpoints.benji_connect_auth_url);\n const url = new URL(Endpoints.benji_connect_auth_url);\n const connectToken = this.sdkConfig.token;\n url.searchParams.set('connect_token', connectToken);\n url.searchParams.set('t', String(Date.now()));\n if (this.sdkConfig.mode != null) {\n url.searchParams.set('mode', String(this.sdkConfig.mode));\n }\n\n this.iframe = document.createElement('iframe');\n this.syncLoginContext(this.sdkConfig.mode ?? BenjiConnectMode.CONNECT);\n this.iframe.addEventListener('load', this.onIframeLoad);\n this.iframe.src = url.toString();\n\n this.container.appendChild(this.iframe);\n document.body.appendChild(this.container);\n\n if (headless) {\n applyHeadlessIframeStyle(this.iframe);\n this.repositionListeners = attachRepositionListeners(\n this.sdkConfig,\n () => this.repositionLoginPopup(),\n );\n } else {\n applyIframeLayoutToElements(\n this.sdkConfig,\n this.container,\n this.iframe,\n this.layoutState,\n { warnOnInvalidAnchor: true },\n );\n this.repositionListeners = attachRepositionListeners(\n this.sdkConfig,\n () => {\n if (!this.iframe || !this.container) return;\n applyIframeLayoutToElements(\n this.sdkConfig,\n this.container,\n this.iframe,\n this.layoutState,\n );\n },\n );\n\n this.container.addEventListener('click', (e) => {\n if (e.target === this.container) {\n // Trigger exit when user taps outside modal bounds\n this.sdkConfig.onExit?.({\n context: buildContext(),\n trigger: BenjiConnectExitTrigger.TAPPED_OUT_OF_BOUNDS\n });\n this.close();\n }\n });\n }\n\n this.syncLoginContext(this.sdkConfig.mode ?? BenjiConnectMode.CONNECT);\n }\n\n private navigateLoginPopup(url: string): void {\n if (this.hasLoginPopupUrl) return;\n if (!this.loginPopup || this.loginPopup.closed) {\n console.warn('[Connect SDK] Cannot navigate LOGIN popup — window unavailable');\n return;\n }\n try {\n this.loginPopup.location.href = url;\n this.hasLoginPopupUrl = true;\n } catch (error) {\n console.warn('[Connect SDK] Failed to navigate LOGIN popup', error);\n }\n }\n\n private closeLoginPopup(): void {\n if (!this.loginPopup) return;\n\n try {\n if (!this.loginPopup.closed) {\n this.loginPopup.close();\n }\n } catch (error) {\n console.warn('[Connect SDK] Error closing LOGIN popup', error);\n } finally {\n this.loginPopup = null;\n this.hasLoginPopupUrl = false;\n }\n }\n\n close() {\n // Abort in-flight open() even when the iframe has not mounted yet.\n this.abortInflightOpen();\n\n this.isClosing = true;\n this.stopPopupClosedPoll();\n this.closeLoginPopup();\n MessageRouter.removeEventListeners();\n\n if (!this.iframe) {\n this.isClosing = false;\n return;\n }\n\n this.repositionListeners?.remove();\n this.repositionListeners = null;\n this.layoutState.lastValidAnchoredLayout = null;\n this.popupLayoutState.lastValidAnchoredLayout = null;\n\n this.iframe.removeEventListener('load', this.onIframeLoad);\n\n if (this.container?.parentNode) {\n this.container.parentNode.removeChild(this.container);\n }\n this.iframe = null;\n this.container = null;\n this.isClosing = false;\n }\n\n cleanup() {\n if (this.iframe) this.close();\n }\n\n ping() { return 'pong'; }\n}\n\nexport default ConnectSDK;\n","/// <reference path=\"./global.d.ts\" />\nimport ConnectSDK from './connect-sdk';\n(globalThis as any).ConnectSDK = ConnectSDK;"],"mappings":"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","names":["endpoints","project_environment","endpoints","project_environment","endpoints","project_environment","BenjiConnectEventType","data","data","data","data","expectedOrigin","_a","_b"]}
|