@emplorium/sdk 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-EAE3KSGX.mjs → chunk-74N3XWC2.mjs} +5 -2
- package/dist/chunk-74N3XWC2.mjs.map +1 -0
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/react/index.js +4 -1
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-EAE3KSGX.mjs.map +0 -1
|
@@ -95,6 +95,9 @@ var ensureLoaderScript = (options) => {
|
|
|
95
95
|
if (typeof window === "undefined" || typeof document === "undefined") {
|
|
96
96
|
return Promise.reject(new Error("Emplorium SDK is browser-only for v1"));
|
|
97
97
|
}
|
|
98
|
+
if (options.user) {
|
|
99
|
+
window.__emplorium_visitor_identity__ = options.user;
|
|
100
|
+
}
|
|
98
101
|
const logger = createLogger(options.logger);
|
|
99
102
|
const targetUrl = buildScriptUrl(options.accountId, options.scriptUrl);
|
|
100
103
|
if (loadPromise && loadedScriptUrl === targetUrl) {
|
|
@@ -143,7 +146,7 @@ var ensureLoaderScript = (options) => {
|
|
|
143
146
|
};
|
|
144
147
|
|
|
145
148
|
// src/postMessageBridge.ts
|
|
146
|
-
var CHAT_IFRAME_ID = "emplorium-
|
|
149
|
+
var CHAT_IFRAME_ID = "emplorium-widget-chat-iframe";
|
|
147
150
|
var PostMessageBridge = class {
|
|
148
151
|
constructor(options) {
|
|
149
152
|
this.options = options;
|
|
@@ -451,4 +454,4 @@ var EmploriumClient = class {
|
|
|
451
454
|
export {
|
|
452
455
|
EmploriumClient
|
|
453
456
|
};
|
|
454
|
-
//# sourceMappingURL=chunk-
|
|
457
|
+
//# sourceMappingURL=chunk-74N3XWC2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/eventBus.ts","../src/logger.ts","../src/iframeLoader.ts","../src/postMessageBridge.ts","../src/client.ts"],"sourcesContent":["type Listener<T> = (payload: T) => void;\n\nexport class EventBus<Events extends Record<string, unknown>> {\n private listeners: Map<keyof Events, Set<Listener<Events[keyof Events]>>> = new Map();\n\n on<K extends keyof Events>(event: K, listener: Listener<Events[K]>): () => void {\n const existing = this.listeners.get(event) ?? new Set();\n existing.add(listener as Listener<Events[keyof Events]>);\n this.listeners.set(event, existing);\n\n return () => this.off(event, listener);\n }\n\n off<K extends keyof Events>(event: K, listener: Listener<Events[K]>): void {\n const existing = this.listeners.get(event);\n if (!existing) return;\n existing.delete(listener as Listener<Events[keyof Events]>);\n if (existing.size === 0) {\n this.listeners.delete(event);\n }\n }\n\n emit<K extends keyof Events>(event: K, payload: Events[K]): void {\n const existing = this.listeners.get(event);\n if (!existing) return;\n existing.forEach((listener) => {\n try {\n (listener as Listener<Events[keyof Events]>)(payload);\n } catch (error) {\n // Avoid breaking other listeners\n console.error(\"[Emplorium SDK] Event listener failed:\", error);\n }\n });\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import { Logger } from \"./types\";\n\nexport const createLogger = (logger?: Logger): Required<Logger> => {\n const fallback: Required<Logger> = {\n debug: () => undefined,\n info: () => undefined,\n warn: () => undefined,\n error: () => undefined,\n };\n\n if (!logger) {\n return fallback;\n }\n\n return {\n debug: logger.debug || fallback.debug,\n info: logger.info || fallback.info,\n warn: logger.warn || fallback.warn,\n error: logger.error || fallback.error,\n };\n};\n","import { createLogger } from \"./logger\";\nimport { EmploriumConfig, EmploriumVisitorIdentity } from \"./types\";\n\ntype LoaderOptions = Pick<\n EmploriumConfig,\n \"accountId\" | \"scriptUrl\" | \"scriptAttributes\" | \"logger\"\n> & {\n user?: EmploriumVisitorIdentity;\n};\n\nconst LOADER_SCRIPT_ID = \"emplorium-sdk-loader-script\";\nlet loadPromise: Promise<void> | null = null;\nlet loadedScriptUrl: string | null = null;\n\nconst getEnvWidgetScriptUrl = (accountId: string): string | null => {\n const env = typeof process !== \"undefined\" && (process.env as Record<string, string | undefined>);\n if (!env) {\n return null;\n }\n\n const direct =\n env.EMPLORIUM_WIDGET_SCRIPT_URL ||\n env.NEXT_PUBLIC_EMPLORIUM_WIDGET_SCRIPT_URL ||\n env.VITE_EMPLORIUM_WIDGET_SCRIPT_URL;\n if (direct) return direct;\n\n const iframeBase =\n env.IFRAME_WIDGET_URL || env.NEXT_PUBLIC_IFRAME_WIDGET_URL || env.VITE_IFRAME_WIDGET_URL;\n if (iframeBase) {\n const base = iframeBase.replace(/\\/+$/, \"\");\n return `${base}/acc-${accountId}/init.js`;\n }\n\n return null;\n};\n\nexport const buildScriptUrl = (accountId: string, override?: string): string => {\n if (override) return override;\n\n const fromEnv = getEnvWidgetScriptUrl(accountId);\n if (fromEnv) return fromEnv;\n\n const defaultBase = \"https://widget-service.emplorium.io\";\n return `${defaultBase.replace(/\\/+$/, \"\")}/acc-${accountId}/init.js`;\n};\n\nexport const resetLoaderState = (): void => {\n loadPromise = null;\n loadedScriptUrl = null;\n if (typeof document !== \"undefined\") {\n document.getElementById(LOADER_SCRIPT_ID)?.remove();\n }\n};\n\nexport const ensureLoaderScript = (options: LoaderOptions): Promise<void> => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return Promise.reject(new Error(\"Emplorium SDK is browser-only for v1\"));\n }\n\n // Store visitor identity on window so the launcher can include it in boot config.\n // The launcher reads this before sending EMPLORIUM_WIDGET_INIT to the iframe.\n if (options.user) {\n (window as any).__emplorium_visitor_identity__ = options.user;\n }\n\n const logger = createLogger(options.logger);\n const targetUrl = buildScriptUrl(options.accountId, options.scriptUrl);\n\n // If a loader already exists with the same URL, reuse it\n if (loadPromise && loadedScriptUrl === targetUrl) {\n return loadPromise;\n }\n\n // If the host page already injected the loader (e.g., via snippet), reuse it\n const existing =\n document.querySelector<HTMLScriptElement>(`script#${LOADER_SCRIPT_ID}`) ||\n document.querySelector<HTMLScriptElement>('script[data-emplorium-loader=\"true\"]');\n\n if (existing) {\n loadedScriptUrl = existing.src || targetUrl;\n const alreadyLoaded =\n existing.dataset.loaded === \"true\" ||\n existing.getAttribute(\"data-loaded\") === \"true\" ||\n (existing as unknown as { readyState?: string }).readyState === \"complete\";\n\n loadPromise = alreadyLoaded\n ? Promise.resolve()\n : new Promise<void>((resolve, reject) => {\n existing.addEventListener(\"load\", () => resolve(), { once: true });\n existing.addEventListener(\n \"error\",\n () => reject(new Error(\"Emplorium loader script failed to load\")),\n { once: true },\n );\n });\n\n existing.dataset.loaded = alreadyLoaded ? \"true\" : existing.dataset.loaded || \"false\";\n return loadPromise;\n }\n\n loadPromise = new Promise<void>((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.id = LOADER_SCRIPT_ID;\n script.src = targetUrl;\n script.async = true;\n script.dataset.emploriumLoader = \"true\";\n script.dataset.loaded = \"false\";\n\n if (options.scriptAttributes) {\n Object.entries(options.scriptAttributes).forEach(([key, value]) => {\n script.setAttribute(key, value);\n });\n }\n\n script.onload = () => {\n script.dataset.loaded = \"true\";\n loadedScriptUrl = targetUrl;\n logger.info(\"[Emplorium SDK] Loader script ready\");\n resolve();\n };\n script.onerror = () => {\n logger.error(\"[Emplorium SDK] Failed to load loader script\", targetUrl);\n reject(new Error(\"Failed to load Emplorium loader script\"));\n };\n\n document.head.appendChild(script);\n });\n\n return loadPromise;\n};\n","import { EventBus } from \"./eventBus\";\nimport { createLogger } from \"./logger\";\nimport { EmploriumConfig, EmploriumEventMap, EmploriumUser } from \"./types\";\n\ntype BridgeOptions = {\n config: EmploriumConfig;\n emitter: EventBus<EmploriumEventMap>;\n};\n\nconst CHAT_IFRAME_ID = \"emplorium-widget-chat-iframe\";\n\nexport class PostMessageBridge {\n private readonly allowedOrigins: Set<string>;\n private readonly widgetOrigin: string;\n private readonly emitter: EventBus<EmploriumEventMap>;\n private readonly logger;\n private started = false;\n private pendingIdentify: EmploriumUser[] = [];\n\n constructor(private readonly options: BridgeOptions) {\n this.logger = createLogger(options.config.logger);\n const hostOrigin =\n typeof window !== \"undefined\" && window.location.origin ? window.location.origin : \"*\";\n const derivedWidgetOrigin = this.deriveWidgetOrigin(options.config);\n this.widgetOrigin = derivedWidgetOrigin || hostOrigin;\n this.emitter = options.emitter;\n this.allowedOrigins = new Set([\n hostOrigin,\n this.widgetOrigin,\n ...(options.config.allowedOrigins || []),\n ]);\n }\n\n start(): void {\n if (this.started || typeof window === \"undefined\") return;\n window.addEventListener(\"message\", this.handleMessage);\n this.started = true;\n }\n\n stop(): void {\n if (!this.started || typeof window === \"undefined\") return;\n window.removeEventListener(\"message\", this.handleMessage);\n this.started = false;\n }\n\n sendToggle(open: boolean): void {\n if (typeof window === \"undefined\") return;\n const targetOrigin = window.location.origin || \"*\";\n window.postMessage({ type: \"toggle\", show: open }, targetOrigin);\n this.emitter.emit(\"toggle\", { open });\n this.emitter.emit(open ? \"open\" : \"close\", undefined as never);\n }\n\n sendIdentify(user: EmploriumUser): void {\n if (!user || typeof user !== \"object\") return;\n const chatWindow = this.getChatWindow();\n if (!chatWindow) {\n this.pendingIdentify.push(user);\n return;\n }\n chatWindow.postMessage({ type: \"emplorium:identify\", payload: user }, this.widgetOrigin);\n }\n\n sendVisibility(enabled: boolean): void {\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n chatWindow.postMessage(\n { type: \"emplorium:visibility\", payload: { enabled } },\n this.widgetOrigin,\n );\n }\n\n sendDisconnect(): void {\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n chatWindow.postMessage({ type: \"EMPLORIUM_WIDGET_DISCONNECT\" }, this.widgetOrigin);\n }\n\n flushPendingIdentify(): void {\n if (this.pendingIdentify.length === 0) return;\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n while (this.pendingIdentify.length > 0) {\n const user = this.pendingIdentify.shift();\n if (user) {\n chatWindow.postMessage({ type: \"emplorium:identify\", payload: user }, this.widgetOrigin);\n }\n }\n }\n\n private deriveWidgetOrigin(config: EmploriumConfig): string {\n if (config.widgetOrigin) return config.widgetOrigin;\n if (config.scriptUrl) {\n try {\n return new URL(config.scriptUrl).origin;\n } catch {\n this.logger.warn(\"[Emplorium SDK] Unable to parse widget origin from scriptUrl\");\n }\n }\n return \"https://widget.emplorium.io\";\n }\n\n private validateOrigin(origin: string): boolean {\n return !!origin && origin !== \"null\" && this.allowedOrigins.has(origin);\n }\n\n private handleMessage = (event: MessageEvent) => {\n if (!event || !this.validateOrigin(event.origin)) {\n return;\n }\n\n const data = event.data;\n if (!data || typeof data !== \"object\" || typeof data.type !== \"string\") {\n return;\n }\n\n switch (data.type) {\n case \"widgetSettingsLoaded\":\n this.emitter.emit(\"widgetSettingsLoaded\", Boolean(data.value));\n this.flushPendingIdentify();\n break;\n case \"wsInitiated\":\n this.emitter.emit(\"wsInitiated\", Boolean(data.value));\n this.flushPendingIdentify();\n break;\n case \"missedMessages\":\n if (typeof data.value === \"number\") {\n this.emitter.emit(\"missedMessages\", data.value);\n }\n break;\n case \"launcherProperties\":\n this.emitter.emit(\"launcherProperties\", data.value || {});\n break;\n case \"openPreviewIframe\":\n this.emitter.emit(\"previewOpen\", {\n url: data.url,\n fileType: data.fileType,\n });\n break;\n default:\n // Intentionally ignore unknown messages; they may be internal or from extensions\n break;\n }\n };\n\n private getChatWindow(): Window | null {\n if (typeof document === \"undefined\") return null;\n const iframe = document.getElementById(CHAT_IFRAME_ID) as HTMLIFrameElement | null;\n if (iframe && iframe.contentWindow) {\n return iframe.contentWindow;\n }\n return null;\n }\n}\n","import { EventBus } from \"./eventBus\";\nimport { ensureLoaderScript, resetLoaderState } from \"./iframeLoader\";\nimport { createLogger } from \"./logger\";\nimport { PostMessageBridge } from \"./postMessageBridge\";\nimport {\n EmploriumConfig,\n EmploriumEventMap,\n EmploriumState,\n EmploriumUser,\n WidgetVisibilityState,\n} from \"./types\";\n\nconst DEFAULT_STATE: EmploriumState = {\n initialized: false,\n loaderLoaded: false,\n widgetReady: false,\n visibility: \"unknown\",\n};\n\nexport class EmploriumClient {\n private readonly emitter = new EventBus<EmploriumEventMap>();\n private readonly logger;\n private readonly bridge: PostMessageBridge;\n private state: EmploriumState = { ...DEFAULT_STATE };\n private initPromise: Promise<void> | null = null;\n private readyPromise: Promise<void> | null = null;\n private resolveReady: (() => void) | null = null;\n private isEnabled: boolean;\n\n constructor(private readonly config: EmploriumConfig) {\n this.logger = createLogger(config.logger);\n this.bridge = new PostMessageBridge({ config, emitter: this.emitter });\n this.isEnabled = config.enabled !== false; // Default to true if not specified\n this.bindApiMethods();\n }\n\n init = (): Promise<void> => {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n // If widget is disabled, resolve immediately without loading\n if (!this.isEnabled) {\n this.logger.debug(\"[Emplorium SDK] Widget disabled via config\");\n this.initPromise = Promise.resolve();\n return this.initPromise;\n }\n\n this.state.initialized = true;\n this.bridge.start();\n\n this.readyPromise = new Promise<void>((resolve) => {\n this.resolveReady = resolve;\n });\n\n this.bindBridgeEvents();\n\n this.initPromise = (async () => {\n if (this.config.autoLoad !== false) {\n await ensureLoaderScript({\n accountId: this.config.accountId,\n scriptUrl: this.config.scriptUrl,\n scriptAttributes: this.config.scriptAttributes,\n logger: this.config.logger,\n user: this.config.user, // Pass user identity to loader\n });\n this.state.loaderLoaded = true;\n this.logger.debug(\"[Emplorium SDK] Loader script injected\");\n\n // If user identity was provided in config, send it immediately\n if (this.config.user) {\n const { firstName, lastName, email } = this.config.user;\n if (firstName || lastName || email) {\n this.setUser({ firstName, lastName, email });\n }\n }\n }\n\n if (this.config.autoOpen) {\n this.open();\n }\n })().catch((error) => {\n this.emitter.emit(\"error\", error);\n throw error;\n });\n\n return this.initPromise;\n };\n\n on = <K extends keyof EmploriumEventMap>(\n event: K,\n listener: (payload: EmploriumEventMap[K]) => void,\n ) => {\n return this.emitter.on(event, listener);\n };\n\n off = <K extends keyof EmploriumEventMap>(\n event: K,\n listener: (payload: EmploriumEventMap[K]) => void,\n ) => {\n return this.emitter.off(event, listener);\n };\n\n ready = async (): Promise<void> => {\n await this.init();\n return this.readyPromise || Promise.resolve();\n };\n\n open = (): void => {\n this.bridge.sendToggle(true);\n this.state.visibility = \"open\";\n };\n\n close = (): void => {\n this.bridge.sendToggle(false);\n this.state.visibility = \"closed\";\n };\n\n toggle = (): void => {\n const nextOpen = this.state.visibility !== \"open\";\n this.bridge.sendToggle(nextOpen);\n this.state.visibility = nextOpen ? \"open\" : \"closed\";\n };\n\n setUser = (user: EmploriumUser): void => {\n if (!this.isEnabled) return;\n this.bridge.sendIdentify(user);\n };\n\n /**\n * Enable the widget (show it). Only has effect if widget was previously disabled.\n */\n enable = (): void => {\n if (this.isEnabled) return;\n this.isEnabled = true;\n this.bridge.sendVisibility(true);\n };\n\n /**\n * Disable the widget (hide it completely).\n */\n disable = (): void => {\n if (!this.isEnabled) return;\n this.isEnabled = false;\n this.bridge.sendVisibility(false);\n this.state.visibility = \"closed\";\n };\n\n /**\n * Check if the widget is currently enabled.\n */\n isWidgetEnabled = (): boolean => {\n return this.isEnabled;\n };\n\n getState = (): EmploriumState => {\n return { ...this.state };\n };\n\n destroy = (): void => {\n // 1. Tell the iframe to disconnect (WebSocket close + React unmount)\n this.bridge.sendDisconnect();\n\n // 2. Remove launcher iframes from the DOM\n if (typeof window !== \"undefined\" && (window as any).EmploriumLauncher?.destroy) {\n (window as any).EmploriumLauncher.destroy();\n }\n\n // 3. Reset module-level loader state so re-init works cleanly\n resetLoaderState();\n\n // 4. Stop bridge, clear emitter, reset internal state\n this.bridge.stop();\n this.emitter.clear();\n this.state = { ...DEFAULT_STATE };\n this.initPromise = null;\n this.readyPromise = null;\n this.resolveReady = null;\n };\n\n private bindApiMethods(): void {\n this.init = this.init.bind(this);\n this.on = this.on.bind(this);\n this.off = this.off.bind(this);\n this.ready = this.ready.bind(this);\n this.open = this.open.bind(this);\n this.close = this.close.bind(this);\n this.toggle = this.toggle.bind(this);\n this.setUser = this.setUser.bind(this);\n this.enable = this.enable.bind(this);\n this.disable = this.disable.bind(this);\n this.isWidgetEnabled = this.isWidgetEnabled.bind(this);\n this.getState = this.getState.bind(this);\n this.destroy = this.destroy.bind(this);\n }\n\n private setVisibility(state: WidgetVisibilityState): void {\n this.state.visibility = state;\n }\n\n private bindBridgeEvents(): void {\n this.emitter.on(\"toggle\", ({ open }) => this.setVisibility(open ? \"open\" : \"closed\"));\n this.emitter.on(\"open\", () => this.setVisibility(\"open\"));\n this.emitter.on(\"close\", () => this.setVisibility(\"closed\"));\n\n const markReady = () => {\n if (this.state.widgetReady) return;\n this.state.widgetReady = true;\n this.resolveReady?.();\n this.resolveReady = null;\n this.emitter.emit(\"ready\", undefined as never);\n };\n\n this.emitter.on(\"wsInitiated\", markReady);\n this.emitter.on(\"widgetSettingsLoaded\", markReady);\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.js
CHANGED
|
@@ -121,6 +121,9 @@ var ensureLoaderScript = (options) => {
|
|
|
121
121
|
if (typeof window === "undefined" || typeof document === "undefined") {
|
|
122
122
|
return Promise.reject(new Error("Emplorium SDK is browser-only for v1"));
|
|
123
123
|
}
|
|
124
|
+
if (options.user) {
|
|
125
|
+
window.__emplorium_visitor_identity__ = options.user;
|
|
126
|
+
}
|
|
124
127
|
const logger = createLogger(options.logger);
|
|
125
128
|
const targetUrl = buildScriptUrl(options.accountId, options.scriptUrl);
|
|
126
129
|
if (loadPromise && loadedScriptUrl === targetUrl) {
|
|
@@ -169,7 +172,7 @@ var ensureLoaderScript = (options) => {
|
|
|
169
172
|
};
|
|
170
173
|
|
|
171
174
|
// src/postMessageBridge.ts
|
|
172
|
-
var CHAT_IFRAME_ID = "emplorium-
|
|
175
|
+
var CHAT_IFRAME_ID = "emplorium-widget-chat-iframe";
|
|
173
176
|
var PostMessageBridge = class {
|
|
174
177
|
constructor(options) {
|
|
175
178
|
this.options = options;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/eventBus.ts","../src/logger.ts","../src/iframeLoader.ts","../src/postMessageBridge.ts","../src/client.ts"],"sourcesContent":["export { EmploriumClient } from \"./client\";\nexport type {\n EmploriumConfig,\n EmploriumEventMap,\n EmploriumState,\n EmploriumUser,\n EmploriumVisitorIdentity,\n WidgetVisibilityState,\n} from \"./types\";\n","type Listener<T> = (payload: T) => void;\n\nexport class EventBus<Events extends Record<string, unknown>> {\n private listeners: Map<keyof Events, Set<Listener<Events[keyof Events]>>> = new Map();\n\n on<K extends keyof Events>(event: K, listener: Listener<Events[K]>): () => void {\n const existing = this.listeners.get(event) ?? new Set();\n existing.add(listener as Listener<Events[keyof Events]>);\n this.listeners.set(event, existing);\n\n return () => this.off(event, listener);\n }\n\n off<K extends keyof Events>(event: K, listener: Listener<Events[K]>): void {\n const existing = this.listeners.get(event);\n if (!existing) return;\n existing.delete(listener as Listener<Events[keyof Events]>);\n if (existing.size === 0) {\n this.listeners.delete(event);\n }\n }\n\n emit<K extends keyof Events>(event: K, payload: Events[K]): void {\n const existing = this.listeners.get(event);\n if (!existing) return;\n existing.forEach((listener) => {\n try {\n (listener as Listener<Events[keyof Events]>)(payload);\n } catch (error) {\n // Avoid breaking other listeners\n console.error(\"[Emplorium SDK] Event listener failed:\", error);\n }\n });\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import { Logger } from \"./types\";\n\nexport const createLogger = (logger?: Logger): Required<Logger> => {\n const fallback: Required<Logger> = {\n debug: () => undefined,\n info: () => undefined,\n warn: () => undefined,\n error: () => undefined,\n };\n\n if (!logger) {\n return fallback;\n }\n\n return {\n debug: logger.debug || fallback.debug,\n info: logger.info || fallback.info,\n warn: logger.warn || fallback.warn,\n error: logger.error || fallback.error,\n };\n};\n","import { createLogger } from \"./logger\";\nimport { EmploriumConfig, EmploriumVisitorIdentity } from \"./types\";\n\ntype LoaderOptions = Pick<\n EmploriumConfig,\n \"accountId\" | \"scriptUrl\" | \"scriptAttributes\" | \"logger\"\n> & {\n user?: EmploriumVisitorIdentity;\n};\n\nconst LOADER_SCRIPT_ID = \"emplorium-sdk-loader-script\";\nlet loadPromise: Promise<void> | null = null;\nlet loadedScriptUrl: string | null = null;\n\nconst getEnvWidgetScriptUrl = (accountId: string): string | null => {\n const env = typeof process !== \"undefined\" && (process.env as Record<string, string | undefined>);\n if (!env) {\n return null;\n }\n\n const direct =\n env.EMPLORIUM_WIDGET_SCRIPT_URL ||\n env.NEXT_PUBLIC_EMPLORIUM_WIDGET_SCRIPT_URL ||\n env.VITE_EMPLORIUM_WIDGET_SCRIPT_URL;\n if (direct) return direct;\n\n const iframeBase =\n env.IFRAME_WIDGET_URL || env.NEXT_PUBLIC_IFRAME_WIDGET_URL || env.VITE_IFRAME_WIDGET_URL;\n if (iframeBase) {\n const base = iframeBase.replace(/\\/+$/, \"\");\n return `${base}/acc-${accountId}/init.js`;\n }\n\n return null;\n};\n\nexport const buildScriptUrl = (accountId: string, override?: string): string => {\n if (override) return override;\n\n const fromEnv = getEnvWidgetScriptUrl(accountId);\n if (fromEnv) return fromEnv;\n\n const defaultBase = \"https://widget-service.emplorium.io\";\n return `${defaultBase.replace(/\\/+$/, \"\")}/acc-${accountId}/init.js`;\n};\n\nexport const resetLoaderState = (): void => {\n loadPromise = null;\n loadedScriptUrl = null;\n if (typeof document !== \"undefined\") {\n document.getElementById(LOADER_SCRIPT_ID)?.remove();\n }\n};\n\nexport const ensureLoaderScript = (options: LoaderOptions): Promise<void> => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return Promise.reject(new Error(\"Emplorium SDK is browser-only for v1\"));\n }\n\n const logger = createLogger(options.logger);\n const targetUrl = buildScriptUrl(options.accountId, options.scriptUrl);\n\n // If a loader already exists with the same URL, reuse it\n if (loadPromise && loadedScriptUrl === targetUrl) {\n return loadPromise;\n }\n\n // If the host page already injected the loader (e.g., via snippet), reuse it\n const existing =\n document.querySelector<HTMLScriptElement>(`script#${LOADER_SCRIPT_ID}`) ||\n document.querySelector<HTMLScriptElement>('script[data-emplorium-loader=\"true\"]');\n\n if (existing) {\n loadedScriptUrl = existing.src || targetUrl;\n const alreadyLoaded =\n existing.dataset.loaded === \"true\" ||\n existing.getAttribute(\"data-loaded\") === \"true\" ||\n (existing as unknown as { readyState?: string }).readyState === \"complete\";\n\n loadPromise = alreadyLoaded\n ? Promise.resolve()\n : new Promise<void>((resolve, reject) => {\n existing.addEventListener(\"load\", () => resolve(), { once: true });\n existing.addEventListener(\n \"error\",\n () => reject(new Error(\"Emplorium loader script failed to load\")),\n { once: true }\n );\n });\n\n existing.dataset.loaded = alreadyLoaded ? \"true\" : existing.dataset.loaded || \"false\";\n return loadPromise;\n }\n\n loadPromise = new Promise<void>((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.id = LOADER_SCRIPT_ID;\n script.src = targetUrl;\n script.async = true;\n script.dataset.emploriumLoader = \"true\";\n script.dataset.loaded = \"false\";\n\n if (options.scriptAttributes) {\n Object.entries(options.scriptAttributes).forEach(([key, value]) => {\n script.setAttribute(key, value);\n });\n }\n\n script.onload = () => {\n script.dataset.loaded = \"true\";\n loadedScriptUrl = targetUrl;\n logger.info(\"[Emplorium SDK] Loader script ready\");\n resolve();\n };\n script.onerror = () => {\n logger.error(\"[Emplorium SDK] Failed to load loader script\", targetUrl);\n reject(new Error(\"Failed to load Emplorium loader script\"));\n };\n\n document.head.appendChild(script);\n });\n\n return loadPromise;\n};\n","import { EventBus } from \"./eventBus\";\nimport { createLogger } from \"./logger\";\nimport { EmploriumConfig, EmploriumEventMap, EmploriumUser } from \"./types\";\n\ntype BridgeOptions = {\n config: EmploriumConfig;\n emitter: EventBus<EmploriumEventMap>;\n};\n\nconst CHAT_IFRAME_ID = \"emplorium-iframe-chat\";\n\nexport class PostMessageBridge {\n private readonly allowedOrigins: Set<string>;\n private readonly widgetOrigin: string;\n private readonly emitter: EventBus<EmploriumEventMap>;\n private readonly logger;\n private started = false;\n private pendingIdentify: EmploriumUser[] = [];\n\n constructor(private readonly options: BridgeOptions) {\n this.logger = createLogger(options.config.logger);\n const hostOrigin =\n typeof window !== \"undefined\" && window.location.origin ? window.location.origin : \"*\";\n const derivedWidgetOrigin = this.deriveWidgetOrigin(options.config);\n this.widgetOrigin = derivedWidgetOrigin || hostOrigin;\n this.emitter = options.emitter;\n this.allowedOrigins = new Set([\n hostOrigin,\n this.widgetOrigin,\n ...(options.config.allowedOrigins || []),\n ]);\n }\n\n start(): void {\n if (this.started || typeof window === \"undefined\") return;\n window.addEventListener(\"message\", this.handleMessage);\n this.started = true;\n }\n\n stop(): void {\n if (!this.started || typeof window === \"undefined\") return;\n window.removeEventListener(\"message\", this.handleMessage);\n this.started = false;\n }\n\n sendToggle(open: boolean): void {\n if (typeof window === \"undefined\") return;\n const targetOrigin = window.location.origin || \"*\";\n window.postMessage({ type: \"toggle\", show: open }, targetOrigin);\n this.emitter.emit(\"toggle\", { open });\n this.emitter.emit(open ? \"open\" : \"close\", undefined as never);\n }\n\n sendIdentify(user: EmploriumUser): void {\n if (!user || typeof user !== \"object\") return;\n const chatWindow = this.getChatWindow();\n if (!chatWindow) {\n this.pendingIdentify.push(user);\n return;\n }\n chatWindow.postMessage({ type: \"emplorium:identify\", payload: user }, this.widgetOrigin);\n }\n\n sendVisibility(enabled: boolean): void {\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n chatWindow.postMessage(\n { type: \"emplorium:visibility\", payload: { enabled } },\n this.widgetOrigin\n );\n }\n\n sendDisconnect(): void {\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n chatWindow.postMessage({ type: \"EMPLORIUM_WIDGET_DISCONNECT\" }, this.widgetOrigin);\n }\n\n flushPendingIdentify(): void {\n if (this.pendingIdentify.length === 0) return;\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n while (this.pendingIdentify.length > 0) {\n const user = this.pendingIdentify.shift();\n if (user) {\n chatWindow.postMessage({ type: \"emplorium:identify\", payload: user }, this.widgetOrigin);\n }\n }\n }\n\n private deriveWidgetOrigin(config: EmploriumConfig): string {\n if (config.widgetOrigin) return config.widgetOrigin;\n if (config.scriptUrl) {\n try {\n return new URL(config.scriptUrl).origin;\n } catch {\n this.logger.warn(\"[Emplorium SDK] Unable to parse widget origin from scriptUrl\");\n }\n }\n return \"https://widget.emplorium.io\";\n }\n\n private validateOrigin(origin: string): boolean {\n return !!origin && origin !== \"null\" && this.allowedOrigins.has(origin);\n }\n\n private handleMessage = (event: MessageEvent) => {\n if (!event || !this.validateOrigin(event.origin)) {\n return;\n }\n\n const data = event.data;\n if (!data || typeof data !== \"object\" || typeof data.type !== \"string\") {\n return;\n }\n\n switch (data.type) {\n case \"widgetSettingsLoaded\":\n this.emitter.emit(\"widgetSettingsLoaded\", Boolean(data.value));\n this.flushPendingIdentify();\n break;\n case \"wsInitiated\":\n this.emitter.emit(\"wsInitiated\", Boolean(data.value));\n this.flushPendingIdentify();\n break;\n case \"missedMessages\":\n if (typeof data.value === \"number\") {\n this.emitter.emit(\"missedMessages\", data.value);\n }\n break;\n case \"launcherProperties\":\n this.emitter.emit(\"launcherProperties\", data.value || {});\n break;\n case \"openPreviewIframe\":\n this.emitter.emit(\"previewOpen\", {\n url: data.url,\n fileType: data.fileType,\n });\n break;\n default:\n // Intentionally ignore unknown messages; they may be internal or from extensions\n break;\n }\n };\n\n private getChatWindow(): Window | null {\n if (typeof document === \"undefined\") return null;\n const iframe = document.getElementById(CHAT_IFRAME_ID) as HTMLIFrameElement | null;\n if (iframe && iframe.contentWindow) {\n return iframe.contentWindow;\n }\n return null;\n }\n}\n","import { EventBus } from \"./eventBus\";\nimport { ensureLoaderScript, resetLoaderState } from \"./iframeLoader\";\nimport { createLogger } from \"./logger\";\nimport { PostMessageBridge } from \"./postMessageBridge\";\nimport {\n EmploriumConfig,\n EmploriumEventMap,\n EmploriumState,\n EmploriumUser,\n WidgetVisibilityState,\n} from \"./types\";\n\nconst DEFAULT_STATE: EmploriumState = {\n initialized: false,\n loaderLoaded: false,\n widgetReady: false,\n visibility: \"unknown\",\n};\n\nexport class EmploriumClient {\n private readonly emitter = new EventBus<EmploriumEventMap>();\n private readonly logger;\n private readonly bridge: PostMessageBridge;\n private state: EmploriumState = { ...DEFAULT_STATE };\n private initPromise: Promise<void> | null = null;\n private readyPromise: Promise<void> | null = null;\n private resolveReady: (() => void) | null = null;\n private isEnabled: boolean;\n\n constructor(private readonly config: EmploriumConfig) {\n this.logger = createLogger(config.logger);\n this.bridge = new PostMessageBridge({ config, emitter: this.emitter });\n this.isEnabled = config.enabled !== false; // Default to true if not specified\n this.bindApiMethods();\n }\n\n init = (): Promise<void> => {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n // If widget is disabled, resolve immediately without loading\n if (!this.isEnabled) {\n this.logger.debug(\"[Emplorium SDK] Widget disabled via config\");\n this.initPromise = Promise.resolve();\n return this.initPromise;\n }\n\n this.state.initialized = true;\n this.bridge.start();\n\n this.readyPromise = new Promise<void>((resolve) => {\n this.resolveReady = resolve;\n });\n\n this.bindBridgeEvents();\n\n this.initPromise = (async () => {\n if (this.config.autoLoad !== false) {\n await ensureLoaderScript({\n accountId: this.config.accountId,\n scriptUrl: this.config.scriptUrl,\n scriptAttributes: this.config.scriptAttributes,\n logger: this.config.logger,\n user: this.config.user, // Pass user identity to loader\n });\n this.state.loaderLoaded = true;\n this.logger.debug(\"[Emplorium SDK] Loader script injected\");\n\n // If user identity was provided in config, send it immediately\n if (this.config.user) {\n const { firstName, lastName, email } = this.config.user;\n if (firstName || lastName || email) {\n this.setUser({ firstName, lastName, email });\n }\n }\n }\n\n if (this.config.autoOpen) {\n this.open();\n }\n })().catch((error) => {\n this.emitter.emit(\"error\", error);\n throw error;\n });\n\n return this.initPromise;\n };\n\n on = <K extends keyof EmploriumEventMap>(\n event: K,\n listener: (payload: EmploriumEventMap[K]) => void\n ) => {\n return this.emitter.on(event, listener);\n };\n\n off = <K extends keyof EmploriumEventMap>(\n event: K,\n listener: (payload: EmploriumEventMap[K]) => void\n ) => {\n return this.emitter.off(event, listener);\n };\n\n ready = async (): Promise<void> => {\n await this.init();\n return this.readyPromise || Promise.resolve();\n };\n\n open = (): void => {\n this.bridge.sendToggle(true);\n this.state.visibility = \"open\";\n };\n\n close = (): void => {\n this.bridge.sendToggle(false);\n this.state.visibility = \"closed\";\n };\n\n toggle = (): void => {\n const nextOpen = this.state.visibility !== \"open\";\n this.bridge.sendToggle(nextOpen);\n this.state.visibility = nextOpen ? \"open\" : \"closed\";\n };\n\n setUser = (user: EmploriumUser): void => {\n if (!this.isEnabled) return;\n this.bridge.sendIdentify(user);\n };\n\n /**\n * Enable the widget (show it). Only has effect if widget was previously disabled.\n */\n enable = (): void => {\n if (this.isEnabled) return;\n this.isEnabled = true;\n this.bridge.sendVisibility(true);\n };\n\n /**\n * Disable the widget (hide it completely).\n */\n disable = (): void => {\n if (!this.isEnabled) return;\n this.isEnabled = false;\n this.bridge.sendVisibility(false);\n this.state.visibility = \"closed\";\n };\n\n /**\n * Check if the widget is currently enabled.\n */\n isWidgetEnabled = (): boolean => {\n return this.isEnabled;\n };\n\n getState = (): EmploriumState => {\n return { ...this.state };\n };\n\n destroy = (): void => {\n // 1. Tell the iframe to disconnect (WebSocket close + React unmount)\n this.bridge.sendDisconnect();\n\n // 2. Remove launcher iframes from the DOM\n if (typeof window !== \"undefined\" && (window as any).EmploriumLauncher?.destroy) {\n (window as any).EmploriumLauncher.destroy();\n }\n\n // 3. Reset module-level loader state so re-init works cleanly\n resetLoaderState();\n\n // 4. Stop bridge, clear emitter, reset internal state\n this.bridge.stop();\n this.emitter.clear();\n this.state = { ...DEFAULT_STATE };\n this.initPromise = null;\n this.readyPromise = null;\n this.resolveReady = null;\n };\n\n private bindApiMethods(): void {\n this.init = this.init.bind(this);\n this.on = this.on.bind(this);\n this.off = this.off.bind(this);\n this.ready = this.ready.bind(this);\n this.open = this.open.bind(this);\n this.close = this.close.bind(this);\n this.toggle = this.toggle.bind(this);\n this.setUser = this.setUser.bind(this);\n this.enable = this.enable.bind(this);\n this.disable = this.disable.bind(this);\n this.isWidgetEnabled = this.isWidgetEnabled.bind(this);\n this.getState = this.getState.bind(this);\n this.destroy = this.destroy.bind(this);\n }\n\n private setVisibility(state: WidgetVisibilityState): void {\n this.state.visibility = state;\n }\n\n private bindBridgeEvents(): void {\n this.emitter.on(\"toggle\", ({ open }) => this.setVisibility(open ? \"open\" : \"closed\"));\n this.emitter.on(\"open\", () => this.setVisibility(\"open\"));\n this.emitter.on(\"close\", () => this.setVisibility(\"closed\"));\n\n const markReady = () => {\n if (this.state.widgetReady) return;\n this.state.widgetReady = true;\n this.resolveReady?.();\n this.resolveReady = null;\n this.emitter.emit(\"ready\", undefined as never);\n };\n\n this.emitter.on(\"wsInitiated\", markReady);\n this.emitter.on(\"widgetSettingsLoaded\", markReady);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/eventBus.ts","../src/logger.ts","../src/iframeLoader.ts","../src/postMessageBridge.ts","../src/client.ts"],"sourcesContent":["export { EmploriumClient } from \"./client\";\nexport type {\n EmploriumConfig,\n EmploriumEventMap,\n EmploriumState,\n EmploriumUser,\n EmploriumVisitorIdentity,\n WidgetVisibilityState,\n} from \"./types\";\n","type Listener<T> = (payload: T) => void;\n\nexport class EventBus<Events extends Record<string, unknown>> {\n private listeners: Map<keyof Events, Set<Listener<Events[keyof Events]>>> = new Map();\n\n on<K extends keyof Events>(event: K, listener: Listener<Events[K]>): () => void {\n const existing = this.listeners.get(event) ?? new Set();\n existing.add(listener as Listener<Events[keyof Events]>);\n this.listeners.set(event, existing);\n\n return () => this.off(event, listener);\n }\n\n off<K extends keyof Events>(event: K, listener: Listener<Events[K]>): void {\n const existing = this.listeners.get(event);\n if (!existing) return;\n existing.delete(listener as Listener<Events[keyof Events]>);\n if (existing.size === 0) {\n this.listeners.delete(event);\n }\n }\n\n emit<K extends keyof Events>(event: K, payload: Events[K]): void {\n const existing = this.listeners.get(event);\n if (!existing) return;\n existing.forEach((listener) => {\n try {\n (listener as Listener<Events[keyof Events]>)(payload);\n } catch (error) {\n // Avoid breaking other listeners\n console.error(\"[Emplorium SDK] Event listener failed:\", error);\n }\n });\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import { Logger } from \"./types\";\n\nexport const createLogger = (logger?: Logger): Required<Logger> => {\n const fallback: Required<Logger> = {\n debug: () => undefined,\n info: () => undefined,\n warn: () => undefined,\n error: () => undefined,\n };\n\n if (!logger) {\n return fallback;\n }\n\n return {\n debug: logger.debug || fallback.debug,\n info: logger.info || fallback.info,\n warn: logger.warn || fallback.warn,\n error: logger.error || fallback.error,\n };\n};\n","import { createLogger } from \"./logger\";\nimport { EmploriumConfig, EmploriumVisitorIdentity } from \"./types\";\n\ntype LoaderOptions = Pick<\n EmploriumConfig,\n \"accountId\" | \"scriptUrl\" | \"scriptAttributes\" | \"logger\"\n> & {\n user?: EmploriumVisitorIdentity;\n};\n\nconst LOADER_SCRIPT_ID = \"emplorium-sdk-loader-script\";\nlet loadPromise: Promise<void> | null = null;\nlet loadedScriptUrl: string | null = null;\n\nconst getEnvWidgetScriptUrl = (accountId: string): string | null => {\n const env = typeof process !== \"undefined\" && (process.env as Record<string, string | undefined>);\n if (!env) {\n return null;\n }\n\n const direct =\n env.EMPLORIUM_WIDGET_SCRIPT_URL ||\n env.NEXT_PUBLIC_EMPLORIUM_WIDGET_SCRIPT_URL ||\n env.VITE_EMPLORIUM_WIDGET_SCRIPT_URL;\n if (direct) return direct;\n\n const iframeBase =\n env.IFRAME_WIDGET_URL || env.NEXT_PUBLIC_IFRAME_WIDGET_URL || env.VITE_IFRAME_WIDGET_URL;\n if (iframeBase) {\n const base = iframeBase.replace(/\\/+$/, \"\");\n return `${base}/acc-${accountId}/init.js`;\n }\n\n return null;\n};\n\nexport const buildScriptUrl = (accountId: string, override?: string): string => {\n if (override) return override;\n\n const fromEnv = getEnvWidgetScriptUrl(accountId);\n if (fromEnv) return fromEnv;\n\n const defaultBase = \"https://widget-service.emplorium.io\";\n return `${defaultBase.replace(/\\/+$/, \"\")}/acc-${accountId}/init.js`;\n};\n\nexport const resetLoaderState = (): void => {\n loadPromise = null;\n loadedScriptUrl = null;\n if (typeof document !== \"undefined\") {\n document.getElementById(LOADER_SCRIPT_ID)?.remove();\n }\n};\n\nexport const ensureLoaderScript = (options: LoaderOptions): Promise<void> => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return Promise.reject(new Error(\"Emplorium SDK is browser-only for v1\"));\n }\n\n // Store visitor identity on window so the launcher can include it in boot config.\n // The launcher reads this before sending EMPLORIUM_WIDGET_INIT to the iframe.\n if (options.user) {\n (window as any).__emplorium_visitor_identity__ = options.user;\n }\n\n const logger = createLogger(options.logger);\n const targetUrl = buildScriptUrl(options.accountId, options.scriptUrl);\n\n // If a loader already exists with the same URL, reuse it\n if (loadPromise && loadedScriptUrl === targetUrl) {\n return loadPromise;\n }\n\n // If the host page already injected the loader (e.g., via snippet), reuse it\n const existing =\n document.querySelector<HTMLScriptElement>(`script#${LOADER_SCRIPT_ID}`) ||\n document.querySelector<HTMLScriptElement>('script[data-emplorium-loader=\"true\"]');\n\n if (existing) {\n loadedScriptUrl = existing.src || targetUrl;\n const alreadyLoaded =\n existing.dataset.loaded === \"true\" ||\n existing.getAttribute(\"data-loaded\") === \"true\" ||\n (existing as unknown as { readyState?: string }).readyState === \"complete\";\n\n loadPromise = alreadyLoaded\n ? Promise.resolve()\n : new Promise<void>((resolve, reject) => {\n existing.addEventListener(\"load\", () => resolve(), { once: true });\n existing.addEventListener(\n \"error\",\n () => reject(new Error(\"Emplorium loader script failed to load\")),\n { once: true },\n );\n });\n\n existing.dataset.loaded = alreadyLoaded ? \"true\" : existing.dataset.loaded || \"false\";\n return loadPromise;\n }\n\n loadPromise = new Promise<void>((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.id = LOADER_SCRIPT_ID;\n script.src = targetUrl;\n script.async = true;\n script.dataset.emploriumLoader = \"true\";\n script.dataset.loaded = \"false\";\n\n if (options.scriptAttributes) {\n Object.entries(options.scriptAttributes).forEach(([key, value]) => {\n script.setAttribute(key, value);\n });\n }\n\n script.onload = () => {\n script.dataset.loaded = \"true\";\n loadedScriptUrl = targetUrl;\n logger.info(\"[Emplorium SDK] Loader script ready\");\n resolve();\n };\n script.onerror = () => {\n logger.error(\"[Emplorium SDK] Failed to load loader script\", targetUrl);\n reject(new Error(\"Failed to load Emplorium loader script\"));\n };\n\n document.head.appendChild(script);\n });\n\n return loadPromise;\n};\n","import { EventBus } from \"./eventBus\";\nimport { createLogger } from \"./logger\";\nimport { EmploriumConfig, EmploriumEventMap, EmploriumUser } from \"./types\";\n\ntype BridgeOptions = {\n config: EmploriumConfig;\n emitter: EventBus<EmploriumEventMap>;\n};\n\nconst CHAT_IFRAME_ID = \"emplorium-widget-chat-iframe\";\n\nexport class PostMessageBridge {\n private readonly allowedOrigins: Set<string>;\n private readonly widgetOrigin: string;\n private readonly emitter: EventBus<EmploriumEventMap>;\n private readonly logger;\n private started = false;\n private pendingIdentify: EmploriumUser[] = [];\n\n constructor(private readonly options: BridgeOptions) {\n this.logger = createLogger(options.config.logger);\n const hostOrigin =\n typeof window !== \"undefined\" && window.location.origin ? window.location.origin : \"*\";\n const derivedWidgetOrigin = this.deriveWidgetOrigin(options.config);\n this.widgetOrigin = derivedWidgetOrigin || hostOrigin;\n this.emitter = options.emitter;\n this.allowedOrigins = new Set([\n hostOrigin,\n this.widgetOrigin,\n ...(options.config.allowedOrigins || []),\n ]);\n }\n\n start(): void {\n if (this.started || typeof window === \"undefined\") return;\n window.addEventListener(\"message\", this.handleMessage);\n this.started = true;\n }\n\n stop(): void {\n if (!this.started || typeof window === \"undefined\") return;\n window.removeEventListener(\"message\", this.handleMessage);\n this.started = false;\n }\n\n sendToggle(open: boolean): void {\n if (typeof window === \"undefined\") return;\n const targetOrigin = window.location.origin || \"*\";\n window.postMessage({ type: \"toggle\", show: open }, targetOrigin);\n this.emitter.emit(\"toggle\", { open });\n this.emitter.emit(open ? \"open\" : \"close\", undefined as never);\n }\n\n sendIdentify(user: EmploriumUser): void {\n if (!user || typeof user !== \"object\") return;\n const chatWindow = this.getChatWindow();\n if (!chatWindow) {\n this.pendingIdentify.push(user);\n return;\n }\n chatWindow.postMessage({ type: \"emplorium:identify\", payload: user }, this.widgetOrigin);\n }\n\n sendVisibility(enabled: boolean): void {\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n chatWindow.postMessage(\n { type: \"emplorium:visibility\", payload: { enabled } },\n this.widgetOrigin,\n );\n }\n\n sendDisconnect(): void {\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n chatWindow.postMessage({ type: \"EMPLORIUM_WIDGET_DISCONNECT\" }, this.widgetOrigin);\n }\n\n flushPendingIdentify(): void {\n if (this.pendingIdentify.length === 0) return;\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n while (this.pendingIdentify.length > 0) {\n const user = this.pendingIdentify.shift();\n if (user) {\n chatWindow.postMessage({ type: \"emplorium:identify\", payload: user }, this.widgetOrigin);\n }\n }\n }\n\n private deriveWidgetOrigin(config: EmploriumConfig): string {\n if (config.widgetOrigin) return config.widgetOrigin;\n if (config.scriptUrl) {\n try {\n return new URL(config.scriptUrl).origin;\n } catch {\n this.logger.warn(\"[Emplorium SDK] Unable to parse widget origin from scriptUrl\");\n }\n }\n return \"https://widget.emplorium.io\";\n }\n\n private validateOrigin(origin: string): boolean {\n return !!origin && origin !== \"null\" && this.allowedOrigins.has(origin);\n }\n\n private handleMessage = (event: MessageEvent) => {\n if (!event || !this.validateOrigin(event.origin)) {\n return;\n }\n\n const data = event.data;\n if (!data || typeof data !== \"object\" || typeof data.type !== \"string\") {\n return;\n }\n\n switch (data.type) {\n case \"widgetSettingsLoaded\":\n this.emitter.emit(\"widgetSettingsLoaded\", Boolean(data.value));\n this.flushPendingIdentify();\n break;\n case \"wsInitiated\":\n this.emitter.emit(\"wsInitiated\", Boolean(data.value));\n this.flushPendingIdentify();\n break;\n case \"missedMessages\":\n if (typeof data.value === \"number\") {\n this.emitter.emit(\"missedMessages\", data.value);\n }\n break;\n case \"launcherProperties\":\n this.emitter.emit(\"launcherProperties\", data.value || {});\n break;\n case \"openPreviewIframe\":\n this.emitter.emit(\"previewOpen\", {\n url: data.url,\n fileType: data.fileType,\n });\n break;\n default:\n // Intentionally ignore unknown messages; they may be internal or from extensions\n break;\n }\n };\n\n private getChatWindow(): Window | null {\n if (typeof document === \"undefined\") return null;\n const iframe = document.getElementById(CHAT_IFRAME_ID) as HTMLIFrameElement | null;\n if (iframe && iframe.contentWindow) {\n return iframe.contentWindow;\n }\n return null;\n }\n}\n","import { EventBus } from \"./eventBus\";\nimport { ensureLoaderScript, resetLoaderState } from \"./iframeLoader\";\nimport { createLogger } from \"./logger\";\nimport { PostMessageBridge } from \"./postMessageBridge\";\nimport {\n EmploriumConfig,\n EmploriumEventMap,\n EmploriumState,\n EmploriumUser,\n WidgetVisibilityState,\n} from \"./types\";\n\nconst DEFAULT_STATE: EmploriumState = {\n initialized: false,\n loaderLoaded: false,\n widgetReady: false,\n visibility: \"unknown\",\n};\n\nexport class EmploriumClient {\n private readonly emitter = new EventBus<EmploriumEventMap>();\n private readonly logger;\n private readonly bridge: PostMessageBridge;\n private state: EmploriumState = { ...DEFAULT_STATE };\n private initPromise: Promise<void> | null = null;\n private readyPromise: Promise<void> | null = null;\n private resolveReady: (() => void) | null = null;\n private isEnabled: boolean;\n\n constructor(private readonly config: EmploriumConfig) {\n this.logger = createLogger(config.logger);\n this.bridge = new PostMessageBridge({ config, emitter: this.emitter });\n this.isEnabled = config.enabled !== false; // Default to true if not specified\n this.bindApiMethods();\n }\n\n init = (): Promise<void> => {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n // If widget is disabled, resolve immediately without loading\n if (!this.isEnabled) {\n this.logger.debug(\"[Emplorium SDK] Widget disabled via config\");\n this.initPromise = Promise.resolve();\n return this.initPromise;\n }\n\n this.state.initialized = true;\n this.bridge.start();\n\n this.readyPromise = new Promise<void>((resolve) => {\n this.resolveReady = resolve;\n });\n\n this.bindBridgeEvents();\n\n this.initPromise = (async () => {\n if (this.config.autoLoad !== false) {\n await ensureLoaderScript({\n accountId: this.config.accountId,\n scriptUrl: this.config.scriptUrl,\n scriptAttributes: this.config.scriptAttributes,\n logger: this.config.logger,\n user: this.config.user, // Pass user identity to loader\n });\n this.state.loaderLoaded = true;\n this.logger.debug(\"[Emplorium SDK] Loader script injected\");\n\n // If user identity was provided in config, send it immediately\n if (this.config.user) {\n const { firstName, lastName, email } = this.config.user;\n if (firstName || lastName || email) {\n this.setUser({ firstName, lastName, email });\n }\n }\n }\n\n if (this.config.autoOpen) {\n this.open();\n }\n })().catch((error) => {\n this.emitter.emit(\"error\", error);\n throw error;\n });\n\n return this.initPromise;\n };\n\n on = <K extends keyof EmploriumEventMap>(\n event: K,\n listener: (payload: EmploriumEventMap[K]) => void,\n ) => {\n return this.emitter.on(event, listener);\n };\n\n off = <K extends keyof EmploriumEventMap>(\n event: K,\n listener: (payload: EmploriumEventMap[K]) => void,\n ) => {\n return this.emitter.off(event, listener);\n };\n\n ready = async (): Promise<void> => {\n await this.init();\n return this.readyPromise || Promise.resolve();\n };\n\n open = (): void => {\n this.bridge.sendToggle(true);\n this.state.visibility = \"open\";\n };\n\n close = (): void => {\n this.bridge.sendToggle(false);\n this.state.visibility = \"closed\";\n };\n\n toggle = (): void => {\n const nextOpen = this.state.visibility !== \"open\";\n this.bridge.sendToggle(nextOpen);\n this.state.visibility = nextOpen ? \"open\" : \"closed\";\n };\n\n setUser = (user: EmploriumUser): void => {\n if (!this.isEnabled) return;\n this.bridge.sendIdentify(user);\n };\n\n /**\n * Enable the widget (show it). Only has effect if widget was previously disabled.\n */\n enable = (): void => {\n if (this.isEnabled) return;\n this.isEnabled = true;\n this.bridge.sendVisibility(true);\n };\n\n /**\n * Disable the widget (hide it completely).\n */\n disable = (): void => {\n if (!this.isEnabled) return;\n this.isEnabled = false;\n this.bridge.sendVisibility(false);\n this.state.visibility = \"closed\";\n };\n\n /**\n * Check if the widget is currently enabled.\n */\n isWidgetEnabled = (): boolean => {\n return this.isEnabled;\n };\n\n getState = (): EmploriumState => {\n return { ...this.state };\n };\n\n destroy = (): void => {\n // 1. Tell the iframe to disconnect (WebSocket close + React unmount)\n this.bridge.sendDisconnect();\n\n // 2. Remove launcher iframes from the DOM\n if (typeof window !== \"undefined\" && (window as any).EmploriumLauncher?.destroy) {\n (window as any).EmploriumLauncher.destroy();\n }\n\n // 3. Reset module-level loader state so re-init works cleanly\n resetLoaderState();\n\n // 4. Stop bridge, clear emitter, reset internal state\n this.bridge.stop();\n this.emitter.clear();\n this.state = { ...DEFAULT_STATE };\n this.initPromise = null;\n this.readyPromise = null;\n this.resolveReady = null;\n };\n\n private bindApiMethods(): void {\n this.init = this.init.bind(this);\n this.on = this.on.bind(this);\n this.off = this.off.bind(this);\n this.ready = this.ready.bind(this);\n this.open = this.open.bind(this);\n this.close = this.close.bind(this);\n this.toggle = this.toggle.bind(this);\n this.setUser = this.setUser.bind(this);\n this.enable = this.enable.bind(this);\n this.disable = this.disable.bind(this);\n this.isWidgetEnabled = this.isWidgetEnabled.bind(this);\n this.getState = this.getState.bind(this);\n this.destroy = this.destroy.bind(this);\n }\n\n private setVisibility(state: WidgetVisibilityState): void {\n this.state.visibility = state;\n }\n\n private bindBridgeEvents(): void {\n this.emitter.on(\"toggle\", ({ open }) => this.setVisibility(open ? \"open\" : \"closed\"));\n this.emitter.on(\"open\", () => this.setVisibility(\"open\"));\n this.emitter.on(\"close\", () => this.setVisibility(\"closed\"));\n\n const markReady = () => {\n if (this.state.widgetReady) return;\n this.state.widgetReady = true;\n this.resolveReady?.();\n this.resolveReady = null;\n this.emitter.emit(\"ready\", undefined as never);\n };\n\n this.emitter.on(\"wsInitiated\", markReady);\n this.emitter.on(\"widgetSettingsLoaded\", markReady);\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
CHANGED
package/dist/react/index.js
CHANGED
|
@@ -136,6 +136,9 @@ var ensureLoaderScript = (options) => {
|
|
|
136
136
|
if (typeof window === "undefined" || typeof document === "undefined") {
|
|
137
137
|
return Promise.reject(new Error("Emplorium SDK is browser-only for v1"));
|
|
138
138
|
}
|
|
139
|
+
if (options.user) {
|
|
140
|
+
window.__emplorium_visitor_identity__ = options.user;
|
|
141
|
+
}
|
|
139
142
|
const logger = createLogger(options.logger);
|
|
140
143
|
const targetUrl = buildScriptUrl(options.accountId, options.scriptUrl);
|
|
141
144
|
if (loadPromise && loadedScriptUrl === targetUrl) {
|
|
@@ -184,7 +187,7 @@ var ensureLoaderScript = (options) => {
|
|
|
184
187
|
};
|
|
185
188
|
|
|
186
189
|
// src/postMessageBridge.ts
|
|
187
|
-
var CHAT_IFRAME_ID = "emplorium-
|
|
190
|
+
var CHAT_IFRAME_ID = "emplorium-widget-chat-iframe";
|
|
188
191
|
var PostMessageBridge = class {
|
|
189
192
|
constructor(options) {
|
|
190
193
|
this.options = options;
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/react/index.ts","../../src/react/EmploriumProvider.tsx","../../src/eventBus.ts","../../src/logger.ts","../../src/iframeLoader.ts","../../src/postMessageBridge.ts","../../src/client.ts","../../src/react/context.ts","../../src/react/EmploriumWidget.tsx","../../src/react/useEmplorium.ts"],"sourcesContent":["export { EmploriumProvider } from \"./EmploriumProvider\";\nexport { EmploriumWidget } from \"./EmploriumWidget\";\nexport { useEmplorium } from \"./useEmplorium\";\n","import React, { ReactNode, useEffect, useMemo, useRef } from \"react\";\n\nimport { EmploriumClient } from \"../client\";\nimport { EmploriumConfig } from \"../types\";\nimport { EmploriumContext } from \"./context\";\n\ntype ProviderProps = {\n config: EmploriumConfig;\n children?: ReactNode;\n /**\n * If true, the widget will open once ready.\n */\n autoOpen?: boolean;\n};\n\nexport const EmploriumProvider: React.FC<ProviderProps> = ({ config, children, autoOpen }) => {\n const clientRef = useRef<EmploriumClient | null>(null);\n const accountIdRef = useRef<string | null>(null);\n\n const mergedConfig = useMemo(\n () => ({\n ...config,\n autoOpen: config.autoOpen ?? autoOpen,\n }),\n [config, autoOpen]\n );\n\n if (!clientRef.current || accountIdRef.current !== mergedConfig.accountId) {\n clientRef.current?.destroy();\n clientRef.current = new EmploriumClient(mergedConfig);\n accountIdRef.current = mergedConfig.accountId;\n }\n\n useEffect(() => {\n const client = clientRef.current;\n if (!client) return;\n client.init().then(() => {\n if (mergedConfig.autoOpen) {\n client.open();\n }\n });\n\n return () => client.destroy();\n }, [mergedConfig]);\n\n return (\n <EmploriumContext.Provider value={clientRef.current}>{children}</EmploriumContext.Provider>\n );\n};\n","type Listener<T> = (payload: T) => void;\n\nexport class EventBus<Events extends Record<string, unknown>> {\n private listeners: Map<keyof Events, Set<Listener<Events[keyof Events]>>> = new Map();\n\n on<K extends keyof Events>(event: K, listener: Listener<Events[K]>): () => void {\n const existing = this.listeners.get(event) ?? new Set();\n existing.add(listener as Listener<Events[keyof Events]>);\n this.listeners.set(event, existing);\n\n return () => this.off(event, listener);\n }\n\n off<K extends keyof Events>(event: K, listener: Listener<Events[K]>): void {\n const existing = this.listeners.get(event);\n if (!existing) return;\n existing.delete(listener as Listener<Events[keyof Events]>);\n if (existing.size === 0) {\n this.listeners.delete(event);\n }\n }\n\n emit<K extends keyof Events>(event: K, payload: Events[K]): void {\n const existing = this.listeners.get(event);\n if (!existing) return;\n existing.forEach((listener) => {\n try {\n (listener as Listener<Events[keyof Events]>)(payload);\n } catch (error) {\n // Avoid breaking other listeners\n console.error(\"[Emplorium SDK] Event listener failed:\", error);\n }\n });\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import { Logger } from \"./types\";\n\nexport const createLogger = (logger?: Logger): Required<Logger> => {\n const fallback: Required<Logger> = {\n debug: () => undefined,\n info: () => undefined,\n warn: () => undefined,\n error: () => undefined,\n };\n\n if (!logger) {\n return fallback;\n }\n\n return {\n debug: logger.debug || fallback.debug,\n info: logger.info || fallback.info,\n warn: logger.warn || fallback.warn,\n error: logger.error || fallback.error,\n };\n};\n","import { createLogger } from \"./logger\";\nimport { EmploriumConfig, EmploriumVisitorIdentity } from \"./types\";\n\ntype LoaderOptions = Pick<\n EmploriumConfig,\n \"accountId\" | \"scriptUrl\" | \"scriptAttributes\" | \"logger\"\n> & {\n user?: EmploriumVisitorIdentity;\n};\n\nconst LOADER_SCRIPT_ID = \"emplorium-sdk-loader-script\";\nlet loadPromise: Promise<void> | null = null;\nlet loadedScriptUrl: string | null = null;\n\nconst getEnvWidgetScriptUrl = (accountId: string): string | null => {\n const env = typeof process !== \"undefined\" && (process.env as Record<string, string | undefined>);\n if (!env) {\n return null;\n }\n\n const direct =\n env.EMPLORIUM_WIDGET_SCRIPT_URL ||\n env.NEXT_PUBLIC_EMPLORIUM_WIDGET_SCRIPT_URL ||\n env.VITE_EMPLORIUM_WIDGET_SCRIPT_URL;\n if (direct) return direct;\n\n const iframeBase =\n env.IFRAME_WIDGET_URL || env.NEXT_PUBLIC_IFRAME_WIDGET_URL || env.VITE_IFRAME_WIDGET_URL;\n if (iframeBase) {\n const base = iframeBase.replace(/\\/+$/, \"\");\n return `${base}/acc-${accountId}/init.js`;\n }\n\n return null;\n};\n\nexport const buildScriptUrl = (accountId: string, override?: string): string => {\n if (override) return override;\n\n const fromEnv = getEnvWidgetScriptUrl(accountId);\n if (fromEnv) return fromEnv;\n\n const defaultBase = \"https://widget-service.emplorium.io\";\n return `${defaultBase.replace(/\\/+$/, \"\")}/acc-${accountId}/init.js`;\n};\n\nexport const resetLoaderState = (): void => {\n loadPromise = null;\n loadedScriptUrl = null;\n if (typeof document !== \"undefined\") {\n document.getElementById(LOADER_SCRIPT_ID)?.remove();\n }\n};\n\nexport const ensureLoaderScript = (options: LoaderOptions): Promise<void> => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return Promise.reject(new Error(\"Emplorium SDK is browser-only for v1\"));\n }\n\n const logger = createLogger(options.logger);\n const targetUrl = buildScriptUrl(options.accountId, options.scriptUrl);\n\n // If a loader already exists with the same URL, reuse it\n if (loadPromise && loadedScriptUrl === targetUrl) {\n return loadPromise;\n }\n\n // If the host page already injected the loader (e.g., via snippet), reuse it\n const existing =\n document.querySelector<HTMLScriptElement>(`script#${LOADER_SCRIPT_ID}`) ||\n document.querySelector<HTMLScriptElement>('script[data-emplorium-loader=\"true\"]');\n\n if (existing) {\n loadedScriptUrl = existing.src || targetUrl;\n const alreadyLoaded =\n existing.dataset.loaded === \"true\" ||\n existing.getAttribute(\"data-loaded\") === \"true\" ||\n (existing as unknown as { readyState?: string }).readyState === \"complete\";\n\n loadPromise = alreadyLoaded\n ? Promise.resolve()\n : new Promise<void>((resolve, reject) => {\n existing.addEventListener(\"load\", () => resolve(), { once: true });\n existing.addEventListener(\n \"error\",\n () => reject(new Error(\"Emplorium loader script failed to load\")),\n { once: true }\n );\n });\n\n existing.dataset.loaded = alreadyLoaded ? \"true\" : existing.dataset.loaded || \"false\";\n return loadPromise;\n }\n\n loadPromise = new Promise<void>((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.id = LOADER_SCRIPT_ID;\n script.src = targetUrl;\n script.async = true;\n script.dataset.emploriumLoader = \"true\";\n script.dataset.loaded = \"false\";\n\n if (options.scriptAttributes) {\n Object.entries(options.scriptAttributes).forEach(([key, value]) => {\n script.setAttribute(key, value);\n });\n }\n\n script.onload = () => {\n script.dataset.loaded = \"true\";\n loadedScriptUrl = targetUrl;\n logger.info(\"[Emplorium SDK] Loader script ready\");\n resolve();\n };\n script.onerror = () => {\n logger.error(\"[Emplorium SDK] Failed to load loader script\", targetUrl);\n reject(new Error(\"Failed to load Emplorium loader script\"));\n };\n\n document.head.appendChild(script);\n });\n\n return loadPromise;\n};\n","import { EventBus } from \"./eventBus\";\nimport { createLogger } from \"./logger\";\nimport { EmploriumConfig, EmploriumEventMap, EmploriumUser } from \"./types\";\n\ntype BridgeOptions = {\n config: EmploriumConfig;\n emitter: EventBus<EmploriumEventMap>;\n};\n\nconst CHAT_IFRAME_ID = \"emplorium-iframe-chat\";\n\nexport class PostMessageBridge {\n private readonly allowedOrigins: Set<string>;\n private readonly widgetOrigin: string;\n private readonly emitter: EventBus<EmploriumEventMap>;\n private readonly logger;\n private started = false;\n private pendingIdentify: EmploriumUser[] = [];\n\n constructor(private readonly options: BridgeOptions) {\n this.logger = createLogger(options.config.logger);\n const hostOrigin =\n typeof window !== \"undefined\" && window.location.origin ? window.location.origin : \"*\";\n const derivedWidgetOrigin = this.deriveWidgetOrigin(options.config);\n this.widgetOrigin = derivedWidgetOrigin || hostOrigin;\n this.emitter = options.emitter;\n this.allowedOrigins = new Set([\n hostOrigin,\n this.widgetOrigin,\n ...(options.config.allowedOrigins || []),\n ]);\n }\n\n start(): void {\n if (this.started || typeof window === \"undefined\") return;\n window.addEventListener(\"message\", this.handleMessage);\n this.started = true;\n }\n\n stop(): void {\n if (!this.started || typeof window === \"undefined\") return;\n window.removeEventListener(\"message\", this.handleMessage);\n this.started = false;\n }\n\n sendToggle(open: boolean): void {\n if (typeof window === \"undefined\") return;\n const targetOrigin = window.location.origin || \"*\";\n window.postMessage({ type: \"toggle\", show: open }, targetOrigin);\n this.emitter.emit(\"toggle\", { open });\n this.emitter.emit(open ? \"open\" : \"close\", undefined as never);\n }\n\n sendIdentify(user: EmploriumUser): void {\n if (!user || typeof user !== \"object\") return;\n const chatWindow = this.getChatWindow();\n if (!chatWindow) {\n this.pendingIdentify.push(user);\n return;\n }\n chatWindow.postMessage({ type: \"emplorium:identify\", payload: user }, this.widgetOrigin);\n }\n\n sendVisibility(enabled: boolean): void {\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n chatWindow.postMessage(\n { type: \"emplorium:visibility\", payload: { enabled } },\n this.widgetOrigin\n );\n }\n\n sendDisconnect(): void {\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n chatWindow.postMessage({ type: \"EMPLORIUM_WIDGET_DISCONNECT\" }, this.widgetOrigin);\n }\n\n flushPendingIdentify(): void {\n if (this.pendingIdentify.length === 0) return;\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n while (this.pendingIdentify.length > 0) {\n const user = this.pendingIdentify.shift();\n if (user) {\n chatWindow.postMessage({ type: \"emplorium:identify\", payload: user }, this.widgetOrigin);\n }\n }\n }\n\n private deriveWidgetOrigin(config: EmploriumConfig): string {\n if (config.widgetOrigin) return config.widgetOrigin;\n if (config.scriptUrl) {\n try {\n return new URL(config.scriptUrl).origin;\n } catch {\n this.logger.warn(\"[Emplorium SDK] Unable to parse widget origin from scriptUrl\");\n }\n }\n return \"https://widget.emplorium.io\";\n }\n\n private validateOrigin(origin: string): boolean {\n return !!origin && origin !== \"null\" && this.allowedOrigins.has(origin);\n }\n\n private handleMessage = (event: MessageEvent) => {\n if (!event || !this.validateOrigin(event.origin)) {\n return;\n }\n\n const data = event.data;\n if (!data || typeof data !== \"object\" || typeof data.type !== \"string\") {\n return;\n }\n\n switch (data.type) {\n case \"widgetSettingsLoaded\":\n this.emitter.emit(\"widgetSettingsLoaded\", Boolean(data.value));\n this.flushPendingIdentify();\n break;\n case \"wsInitiated\":\n this.emitter.emit(\"wsInitiated\", Boolean(data.value));\n this.flushPendingIdentify();\n break;\n case \"missedMessages\":\n if (typeof data.value === \"number\") {\n this.emitter.emit(\"missedMessages\", data.value);\n }\n break;\n case \"launcherProperties\":\n this.emitter.emit(\"launcherProperties\", data.value || {});\n break;\n case \"openPreviewIframe\":\n this.emitter.emit(\"previewOpen\", {\n url: data.url,\n fileType: data.fileType,\n });\n break;\n default:\n // Intentionally ignore unknown messages; they may be internal or from extensions\n break;\n }\n };\n\n private getChatWindow(): Window | null {\n if (typeof document === \"undefined\") return null;\n const iframe = document.getElementById(CHAT_IFRAME_ID) as HTMLIFrameElement | null;\n if (iframe && iframe.contentWindow) {\n return iframe.contentWindow;\n }\n return null;\n }\n}\n","import { EventBus } from \"./eventBus\";\nimport { ensureLoaderScript, resetLoaderState } from \"./iframeLoader\";\nimport { createLogger } from \"./logger\";\nimport { PostMessageBridge } from \"./postMessageBridge\";\nimport {\n EmploriumConfig,\n EmploriumEventMap,\n EmploriumState,\n EmploriumUser,\n WidgetVisibilityState,\n} from \"./types\";\n\nconst DEFAULT_STATE: EmploriumState = {\n initialized: false,\n loaderLoaded: false,\n widgetReady: false,\n visibility: \"unknown\",\n};\n\nexport class EmploriumClient {\n private readonly emitter = new EventBus<EmploriumEventMap>();\n private readonly logger;\n private readonly bridge: PostMessageBridge;\n private state: EmploriumState = { ...DEFAULT_STATE };\n private initPromise: Promise<void> | null = null;\n private readyPromise: Promise<void> | null = null;\n private resolveReady: (() => void) | null = null;\n private isEnabled: boolean;\n\n constructor(private readonly config: EmploriumConfig) {\n this.logger = createLogger(config.logger);\n this.bridge = new PostMessageBridge({ config, emitter: this.emitter });\n this.isEnabled = config.enabled !== false; // Default to true if not specified\n this.bindApiMethods();\n }\n\n init = (): Promise<void> => {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n // If widget is disabled, resolve immediately without loading\n if (!this.isEnabled) {\n this.logger.debug(\"[Emplorium SDK] Widget disabled via config\");\n this.initPromise = Promise.resolve();\n return this.initPromise;\n }\n\n this.state.initialized = true;\n this.bridge.start();\n\n this.readyPromise = new Promise<void>((resolve) => {\n this.resolveReady = resolve;\n });\n\n this.bindBridgeEvents();\n\n this.initPromise = (async () => {\n if (this.config.autoLoad !== false) {\n await ensureLoaderScript({\n accountId: this.config.accountId,\n scriptUrl: this.config.scriptUrl,\n scriptAttributes: this.config.scriptAttributes,\n logger: this.config.logger,\n user: this.config.user, // Pass user identity to loader\n });\n this.state.loaderLoaded = true;\n this.logger.debug(\"[Emplorium SDK] Loader script injected\");\n\n // If user identity was provided in config, send it immediately\n if (this.config.user) {\n const { firstName, lastName, email } = this.config.user;\n if (firstName || lastName || email) {\n this.setUser({ firstName, lastName, email });\n }\n }\n }\n\n if (this.config.autoOpen) {\n this.open();\n }\n })().catch((error) => {\n this.emitter.emit(\"error\", error);\n throw error;\n });\n\n return this.initPromise;\n };\n\n on = <K extends keyof EmploriumEventMap>(\n event: K,\n listener: (payload: EmploriumEventMap[K]) => void\n ) => {\n return this.emitter.on(event, listener);\n };\n\n off = <K extends keyof EmploriumEventMap>(\n event: K,\n listener: (payload: EmploriumEventMap[K]) => void\n ) => {\n return this.emitter.off(event, listener);\n };\n\n ready = async (): Promise<void> => {\n await this.init();\n return this.readyPromise || Promise.resolve();\n };\n\n open = (): void => {\n this.bridge.sendToggle(true);\n this.state.visibility = \"open\";\n };\n\n close = (): void => {\n this.bridge.sendToggle(false);\n this.state.visibility = \"closed\";\n };\n\n toggle = (): void => {\n const nextOpen = this.state.visibility !== \"open\";\n this.bridge.sendToggle(nextOpen);\n this.state.visibility = nextOpen ? \"open\" : \"closed\";\n };\n\n setUser = (user: EmploriumUser): void => {\n if (!this.isEnabled) return;\n this.bridge.sendIdentify(user);\n };\n\n /**\n * Enable the widget (show it). Only has effect if widget was previously disabled.\n */\n enable = (): void => {\n if (this.isEnabled) return;\n this.isEnabled = true;\n this.bridge.sendVisibility(true);\n };\n\n /**\n * Disable the widget (hide it completely).\n */\n disable = (): void => {\n if (!this.isEnabled) return;\n this.isEnabled = false;\n this.bridge.sendVisibility(false);\n this.state.visibility = \"closed\";\n };\n\n /**\n * Check if the widget is currently enabled.\n */\n isWidgetEnabled = (): boolean => {\n return this.isEnabled;\n };\n\n getState = (): EmploriumState => {\n return { ...this.state };\n };\n\n destroy = (): void => {\n // 1. Tell the iframe to disconnect (WebSocket close + React unmount)\n this.bridge.sendDisconnect();\n\n // 2. Remove launcher iframes from the DOM\n if (typeof window !== \"undefined\" && (window as any).EmploriumLauncher?.destroy) {\n (window as any).EmploriumLauncher.destroy();\n }\n\n // 3. Reset module-level loader state so re-init works cleanly\n resetLoaderState();\n\n // 4. Stop bridge, clear emitter, reset internal state\n this.bridge.stop();\n this.emitter.clear();\n this.state = { ...DEFAULT_STATE };\n this.initPromise = null;\n this.readyPromise = null;\n this.resolveReady = null;\n };\n\n private bindApiMethods(): void {\n this.init = this.init.bind(this);\n this.on = this.on.bind(this);\n this.off = this.off.bind(this);\n this.ready = this.ready.bind(this);\n this.open = this.open.bind(this);\n this.close = this.close.bind(this);\n this.toggle = this.toggle.bind(this);\n this.setUser = this.setUser.bind(this);\n this.enable = this.enable.bind(this);\n this.disable = this.disable.bind(this);\n this.isWidgetEnabled = this.isWidgetEnabled.bind(this);\n this.getState = this.getState.bind(this);\n this.destroy = this.destroy.bind(this);\n }\n\n private setVisibility(state: WidgetVisibilityState): void {\n this.state.visibility = state;\n }\n\n private bindBridgeEvents(): void {\n this.emitter.on(\"toggle\", ({ open }) => this.setVisibility(open ? \"open\" : \"closed\"));\n this.emitter.on(\"open\", () => this.setVisibility(\"open\"));\n this.emitter.on(\"close\", () => this.setVisibility(\"closed\"));\n\n const markReady = () => {\n if (this.state.widgetReady) return;\n this.state.widgetReady = true;\n this.resolveReady?.();\n this.resolveReady = null;\n this.emitter.emit(\"ready\", undefined as never);\n };\n\n this.emitter.on(\"wsInitiated\", markReady);\n this.emitter.on(\"widgetSettingsLoaded\", markReady);\n }\n}\n","import React from \"react\";\nimport { EmploriumClient } from \"../client\";\n\nexport const EmploriumContext = React.createContext<EmploriumClient | null>(null);\n","import { useEffect } from \"react\";\n\nimport { useEmplorium } from \"./useEmplorium\";\n\ntype WidgetProps = {\n /**\n * Open the widget when ready.\n */\n autoOpen?: boolean;\n /**\n * Callback when the widget signals readiness.\n */\n onReady?: () => void;\n};\n\nexport const EmploriumWidget: React.FC<WidgetProps> = ({ autoOpen, onReady }) => {\n const client = useEmplorium();\n\n useEffect(() => {\n let active = true;\n client\n .ready()\n .then(() => {\n if (!active) return;\n if (autoOpen) {\n client.open();\n }\n onReady?.();\n })\n .catch(() => {\n /* errors are surfaced through the client's event bus */\n });\n\n return () => {\n active = false;\n };\n }, [autoOpen, client, onReady]);\n\n return null;\n};\n","import { useContext } from \"react\";\n\nimport { EmploriumContext } from \"./context\";\n\nexport const useEmplorium = () => {\n const client = useContext(EmploriumContext);\n if (!client) {\n throw new Error(\"useEmplorium must be used within an EmploriumProvider\");\n }\n return client;\n};\n"],"mappings":"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","names":["import_react","React","_a","import_react","import_react"]}
|
|
1
|
+
{"version":3,"sources":["../../src/react/index.ts","../../src/react/EmploriumProvider.tsx","../../src/eventBus.ts","../../src/logger.ts","../../src/iframeLoader.ts","../../src/postMessageBridge.ts","../../src/client.ts","../../src/react/context.ts","../../src/react/EmploriumWidget.tsx","../../src/react/useEmplorium.ts"],"sourcesContent":["export { EmploriumProvider } from \"./EmploriumProvider\";\nexport { EmploriumWidget } from \"./EmploriumWidget\";\nexport { useEmplorium } from \"./useEmplorium\";\n","import React, { ReactNode, useEffect, useMemo, useRef } from \"react\";\n\nimport { EmploriumClient } from \"../client\";\nimport { EmploriumConfig } from \"../types\";\nimport { EmploriumContext } from \"./context\";\n\ntype ProviderProps = {\n config: EmploriumConfig;\n children?: ReactNode;\n /**\n * If true, the widget will open once ready.\n */\n autoOpen?: boolean;\n};\n\nexport const EmploriumProvider: React.FC<ProviderProps> = ({ config, children, autoOpen }) => {\n const clientRef = useRef<EmploriumClient | null>(null);\n const accountIdRef = useRef<string | null>(null);\n\n const mergedConfig = useMemo(\n () => ({\n ...config,\n autoOpen: config.autoOpen ?? autoOpen,\n }),\n [config, autoOpen]\n );\n\n if (!clientRef.current || accountIdRef.current !== mergedConfig.accountId) {\n clientRef.current?.destroy();\n clientRef.current = new EmploriumClient(mergedConfig);\n accountIdRef.current = mergedConfig.accountId;\n }\n\n useEffect(() => {\n const client = clientRef.current;\n if (!client) return;\n client.init().then(() => {\n if (mergedConfig.autoOpen) {\n client.open();\n }\n });\n\n return () => client.destroy();\n }, [mergedConfig]);\n\n return (\n <EmploriumContext.Provider value={clientRef.current}>{children}</EmploriumContext.Provider>\n );\n};\n","type Listener<T> = (payload: T) => void;\n\nexport class EventBus<Events extends Record<string, unknown>> {\n private listeners: Map<keyof Events, Set<Listener<Events[keyof Events]>>> = new Map();\n\n on<K extends keyof Events>(event: K, listener: Listener<Events[K]>): () => void {\n const existing = this.listeners.get(event) ?? new Set();\n existing.add(listener as Listener<Events[keyof Events]>);\n this.listeners.set(event, existing);\n\n return () => this.off(event, listener);\n }\n\n off<K extends keyof Events>(event: K, listener: Listener<Events[K]>): void {\n const existing = this.listeners.get(event);\n if (!existing) return;\n existing.delete(listener as Listener<Events[keyof Events]>);\n if (existing.size === 0) {\n this.listeners.delete(event);\n }\n }\n\n emit<K extends keyof Events>(event: K, payload: Events[K]): void {\n const existing = this.listeners.get(event);\n if (!existing) return;\n existing.forEach((listener) => {\n try {\n (listener as Listener<Events[keyof Events]>)(payload);\n } catch (error) {\n // Avoid breaking other listeners\n console.error(\"[Emplorium SDK] Event listener failed:\", error);\n }\n });\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import { Logger } from \"./types\";\n\nexport const createLogger = (logger?: Logger): Required<Logger> => {\n const fallback: Required<Logger> = {\n debug: () => undefined,\n info: () => undefined,\n warn: () => undefined,\n error: () => undefined,\n };\n\n if (!logger) {\n return fallback;\n }\n\n return {\n debug: logger.debug || fallback.debug,\n info: logger.info || fallback.info,\n warn: logger.warn || fallback.warn,\n error: logger.error || fallback.error,\n };\n};\n","import { createLogger } from \"./logger\";\nimport { EmploriumConfig, EmploriumVisitorIdentity } from \"./types\";\n\ntype LoaderOptions = Pick<\n EmploriumConfig,\n \"accountId\" | \"scriptUrl\" | \"scriptAttributes\" | \"logger\"\n> & {\n user?: EmploriumVisitorIdentity;\n};\n\nconst LOADER_SCRIPT_ID = \"emplorium-sdk-loader-script\";\nlet loadPromise: Promise<void> | null = null;\nlet loadedScriptUrl: string | null = null;\n\nconst getEnvWidgetScriptUrl = (accountId: string): string | null => {\n const env = typeof process !== \"undefined\" && (process.env as Record<string, string | undefined>);\n if (!env) {\n return null;\n }\n\n const direct =\n env.EMPLORIUM_WIDGET_SCRIPT_URL ||\n env.NEXT_PUBLIC_EMPLORIUM_WIDGET_SCRIPT_URL ||\n env.VITE_EMPLORIUM_WIDGET_SCRIPT_URL;\n if (direct) return direct;\n\n const iframeBase =\n env.IFRAME_WIDGET_URL || env.NEXT_PUBLIC_IFRAME_WIDGET_URL || env.VITE_IFRAME_WIDGET_URL;\n if (iframeBase) {\n const base = iframeBase.replace(/\\/+$/, \"\");\n return `${base}/acc-${accountId}/init.js`;\n }\n\n return null;\n};\n\nexport const buildScriptUrl = (accountId: string, override?: string): string => {\n if (override) return override;\n\n const fromEnv = getEnvWidgetScriptUrl(accountId);\n if (fromEnv) return fromEnv;\n\n const defaultBase = \"https://widget-service.emplorium.io\";\n return `${defaultBase.replace(/\\/+$/, \"\")}/acc-${accountId}/init.js`;\n};\n\nexport const resetLoaderState = (): void => {\n loadPromise = null;\n loadedScriptUrl = null;\n if (typeof document !== \"undefined\") {\n document.getElementById(LOADER_SCRIPT_ID)?.remove();\n }\n};\n\nexport const ensureLoaderScript = (options: LoaderOptions): Promise<void> => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return Promise.reject(new Error(\"Emplorium SDK is browser-only for v1\"));\n }\n\n // Store visitor identity on window so the launcher can include it in boot config.\n // The launcher reads this before sending EMPLORIUM_WIDGET_INIT to the iframe.\n if (options.user) {\n (window as any).__emplorium_visitor_identity__ = options.user;\n }\n\n const logger = createLogger(options.logger);\n const targetUrl = buildScriptUrl(options.accountId, options.scriptUrl);\n\n // If a loader already exists with the same URL, reuse it\n if (loadPromise && loadedScriptUrl === targetUrl) {\n return loadPromise;\n }\n\n // If the host page already injected the loader (e.g., via snippet), reuse it\n const existing =\n document.querySelector<HTMLScriptElement>(`script#${LOADER_SCRIPT_ID}`) ||\n document.querySelector<HTMLScriptElement>('script[data-emplorium-loader=\"true\"]');\n\n if (existing) {\n loadedScriptUrl = existing.src || targetUrl;\n const alreadyLoaded =\n existing.dataset.loaded === \"true\" ||\n existing.getAttribute(\"data-loaded\") === \"true\" ||\n (existing as unknown as { readyState?: string }).readyState === \"complete\";\n\n loadPromise = alreadyLoaded\n ? Promise.resolve()\n : new Promise<void>((resolve, reject) => {\n existing.addEventListener(\"load\", () => resolve(), { once: true });\n existing.addEventListener(\n \"error\",\n () => reject(new Error(\"Emplorium loader script failed to load\")),\n { once: true },\n );\n });\n\n existing.dataset.loaded = alreadyLoaded ? \"true\" : existing.dataset.loaded || \"false\";\n return loadPromise;\n }\n\n loadPromise = new Promise<void>((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.id = LOADER_SCRIPT_ID;\n script.src = targetUrl;\n script.async = true;\n script.dataset.emploriumLoader = \"true\";\n script.dataset.loaded = \"false\";\n\n if (options.scriptAttributes) {\n Object.entries(options.scriptAttributes).forEach(([key, value]) => {\n script.setAttribute(key, value);\n });\n }\n\n script.onload = () => {\n script.dataset.loaded = \"true\";\n loadedScriptUrl = targetUrl;\n logger.info(\"[Emplorium SDK] Loader script ready\");\n resolve();\n };\n script.onerror = () => {\n logger.error(\"[Emplorium SDK] Failed to load loader script\", targetUrl);\n reject(new Error(\"Failed to load Emplorium loader script\"));\n };\n\n document.head.appendChild(script);\n });\n\n return loadPromise;\n};\n","import { EventBus } from \"./eventBus\";\nimport { createLogger } from \"./logger\";\nimport { EmploriumConfig, EmploriumEventMap, EmploriumUser } from \"./types\";\n\ntype BridgeOptions = {\n config: EmploriumConfig;\n emitter: EventBus<EmploriumEventMap>;\n};\n\nconst CHAT_IFRAME_ID = \"emplorium-widget-chat-iframe\";\n\nexport class PostMessageBridge {\n private readonly allowedOrigins: Set<string>;\n private readonly widgetOrigin: string;\n private readonly emitter: EventBus<EmploriumEventMap>;\n private readonly logger;\n private started = false;\n private pendingIdentify: EmploriumUser[] = [];\n\n constructor(private readonly options: BridgeOptions) {\n this.logger = createLogger(options.config.logger);\n const hostOrigin =\n typeof window !== \"undefined\" && window.location.origin ? window.location.origin : \"*\";\n const derivedWidgetOrigin = this.deriveWidgetOrigin(options.config);\n this.widgetOrigin = derivedWidgetOrigin || hostOrigin;\n this.emitter = options.emitter;\n this.allowedOrigins = new Set([\n hostOrigin,\n this.widgetOrigin,\n ...(options.config.allowedOrigins || []),\n ]);\n }\n\n start(): void {\n if (this.started || typeof window === \"undefined\") return;\n window.addEventListener(\"message\", this.handleMessage);\n this.started = true;\n }\n\n stop(): void {\n if (!this.started || typeof window === \"undefined\") return;\n window.removeEventListener(\"message\", this.handleMessage);\n this.started = false;\n }\n\n sendToggle(open: boolean): void {\n if (typeof window === \"undefined\") return;\n const targetOrigin = window.location.origin || \"*\";\n window.postMessage({ type: \"toggle\", show: open }, targetOrigin);\n this.emitter.emit(\"toggle\", { open });\n this.emitter.emit(open ? \"open\" : \"close\", undefined as never);\n }\n\n sendIdentify(user: EmploriumUser): void {\n if (!user || typeof user !== \"object\") return;\n const chatWindow = this.getChatWindow();\n if (!chatWindow) {\n this.pendingIdentify.push(user);\n return;\n }\n chatWindow.postMessage({ type: \"emplorium:identify\", payload: user }, this.widgetOrigin);\n }\n\n sendVisibility(enabled: boolean): void {\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n chatWindow.postMessage(\n { type: \"emplorium:visibility\", payload: { enabled } },\n this.widgetOrigin,\n );\n }\n\n sendDisconnect(): void {\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n chatWindow.postMessage({ type: \"EMPLORIUM_WIDGET_DISCONNECT\" }, this.widgetOrigin);\n }\n\n flushPendingIdentify(): void {\n if (this.pendingIdentify.length === 0) return;\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n while (this.pendingIdentify.length > 0) {\n const user = this.pendingIdentify.shift();\n if (user) {\n chatWindow.postMessage({ type: \"emplorium:identify\", payload: user }, this.widgetOrigin);\n }\n }\n }\n\n private deriveWidgetOrigin(config: EmploriumConfig): string {\n if (config.widgetOrigin) return config.widgetOrigin;\n if (config.scriptUrl) {\n try {\n return new URL(config.scriptUrl).origin;\n } catch {\n this.logger.warn(\"[Emplorium SDK] Unable to parse widget origin from scriptUrl\");\n }\n }\n return \"https://widget.emplorium.io\";\n }\n\n private validateOrigin(origin: string): boolean {\n return !!origin && origin !== \"null\" && this.allowedOrigins.has(origin);\n }\n\n private handleMessage = (event: MessageEvent) => {\n if (!event || !this.validateOrigin(event.origin)) {\n return;\n }\n\n const data = event.data;\n if (!data || typeof data !== \"object\" || typeof data.type !== \"string\") {\n return;\n }\n\n switch (data.type) {\n case \"widgetSettingsLoaded\":\n this.emitter.emit(\"widgetSettingsLoaded\", Boolean(data.value));\n this.flushPendingIdentify();\n break;\n case \"wsInitiated\":\n this.emitter.emit(\"wsInitiated\", Boolean(data.value));\n this.flushPendingIdentify();\n break;\n case \"missedMessages\":\n if (typeof data.value === \"number\") {\n this.emitter.emit(\"missedMessages\", data.value);\n }\n break;\n case \"launcherProperties\":\n this.emitter.emit(\"launcherProperties\", data.value || {});\n break;\n case \"openPreviewIframe\":\n this.emitter.emit(\"previewOpen\", {\n url: data.url,\n fileType: data.fileType,\n });\n break;\n default:\n // Intentionally ignore unknown messages; they may be internal or from extensions\n break;\n }\n };\n\n private getChatWindow(): Window | null {\n if (typeof document === \"undefined\") return null;\n const iframe = document.getElementById(CHAT_IFRAME_ID) as HTMLIFrameElement | null;\n if (iframe && iframe.contentWindow) {\n return iframe.contentWindow;\n }\n return null;\n }\n}\n","import { EventBus } from \"./eventBus\";\nimport { ensureLoaderScript, resetLoaderState } from \"./iframeLoader\";\nimport { createLogger } from \"./logger\";\nimport { PostMessageBridge } from \"./postMessageBridge\";\nimport {\n EmploriumConfig,\n EmploriumEventMap,\n EmploriumState,\n EmploriumUser,\n WidgetVisibilityState,\n} from \"./types\";\n\nconst DEFAULT_STATE: EmploriumState = {\n initialized: false,\n loaderLoaded: false,\n widgetReady: false,\n visibility: \"unknown\",\n};\n\nexport class EmploriumClient {\n private readonly emitter = new EventBus<EmploriumEventMap>();\n private readonly logger;\n private readonly bridge: PostMessageBridge;\n private state: EmploriumState = { ...DEFAULT_STATE };\n private initPromise: Promise<void> | null = null;\n private readyPromise: Promise<void> | null = null;\n private resolveReady: (() => void) | null = null;\n private isEnabled: boolean;\n\n constructor(private readonly config: EmploriumConfig) {\n this.logger = createLogger(config.logger);\n this.bridge = new PostMessageBridge({ config, emitter: this.emitter });\n this.isEnabled = config.enabled !== false; // Default to true if not specified\n this.bindApiMethods();\n }\n\n init = (): Promise<void> => {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n // If widget is disabled, resolve immediately without loading\n if (!this.isEnabled) {\n this.logger.debug(\"[Emplorium SDK] Widget disabled via config\");\n this.initPromise = Promise.resolve();\n return this.initPromise;\n }\n\n this.state.initialized = true;\n this.bridge.start();\n\n this.readyPromise = new Promise<void>((resolve) => {\n this.resolveReady = resolve;\n });\n\n this.bindBridgeEvents();\n\n this.initPromise = (async () => {\n if (this.config.autoLoad !== false) {\n await ensureLoaderScript({\n accountId: this.config.accountId,\n scriptUrl: this.config.scriptUrl,\n scriptAttributes: this.config.scriptAttributes,\n logger: this.config.logger,\n user: this.config.user, // Pass user identity to loader\n });\n this.state.loaderLoaded = true;\n this.logger.debug(\"[Emplorium SDK] Loader script injected\");\n\n // If user identity was provided in config, send it immediately\n if (this.config.user) {\n const { firstName, lastName, email } = this.config.user;\n if (firstName || lastName || email) {\n this.setUser({ firstName, lastName, email });\n }\n }\n }\n\n if (this.config.autoOpen) {\n this.open();\n }\n })().catch((error) => {\n this.emitter.emit(\"error\", error);\n throw error;\n });\n\n return this.initPromise;\n };\n\n on = <K extends keyof EmploriumEventMap>(\n event: K,\n listener: (payload: EmploriumEventMap[K]) => void,\n ) => {\n return this.emitter.on(event, listener);\n };\n\n off = <K extends keyof EmploriumEventMap>(\n event: K,\n listener: (payload: EmploriumEventMap[K]) => void,\n ) => {\n return this.emitter.off(event, listener);\n };\n\n ready = async (): Promise<void> => {\n await this.init();\n return this.readyPromise || Promise.resolve();\n };\n\n open = (): void => {\n this.bridge.sendToggle(true);\n this.state.visibility = \"open\";\n };\n\n close = (): void => {\n this.bridge.sendToggle(false);\n this.state.visibility = \"closed\";\n };\n\n toggle = (): void => {\n const nextOpen = this.state.visibility !== \"open\";\n this.bridge.sendToggle(nextOpen);\n this.state.visibility = nextOpen ? \"open\" : \"closed\";\n };\n\n setUser = (user: EmploriumUser): void => {\n if (!this.isEnabled) return;\n this.bridge.sendIdentify(user);\n };\n\n /**\n * Enable the widget (show it). Only has effect if widget was previously disabled.\n */\n enable = (): void => {\n if (this.isEnabled) return;\n this.isEnabled = true;\n this.bridge.sendVisibility(true);\n };\n\n /**\n * Disable the widget (hide it completely).\n */\n disable = (): void => {\n if (!this.isEnabled) return;\n this.isEnabled = false;\n this.bridge.sendVisibility(false);\n this.state.visibility = \"closed\";\n };\n\n /**\n * Check if the widget is currently enabled.\n */\n isWidgetEnabled = (): boolean => {\n return this.isEnabled;\n };\n\n getState = (): EmploriumState => {\n return { ...this.state };\n };\n\n destroy = (): void => {\n // 1. Tell the iframe to disconnect (WebSocket close + React unmount)\n this.bridge.sendDisconnect();\n\n // 2. Remove launcher iframes from the DOM\n if (typeof window !== \"undefined\" && (window as any).EmploriumLauncher?.destroy) {\n (window as any).EmploriumLauncher.destroy();\n }\n\n // 3. Reset module-level loader state so re-init works cleanly\n resetLoaderState();\n\n // 4. Stop bridge, clear emitter, reset internal state\n this.bridge.stop();\n this.emitter.clear();\n this.state = { ...DEFAULT_STATE };\n this.initPromise = null;\n this.readyPromise = null;\n this.resolveReady = null;\n };\n\n private bindApiMethods(): void {\n this.init = this.init.bind(this);\n this.on = this.on.bind(this);\n this.off = this.off.bind(this);\n this.ready = this.ready.bind(this);\n this.open = this.open.bind(this);\n this.close = this.close.bind(this);\n this.toggle = this.toggle.bind(this);\n this.setUser = this.setUser.bind(this);\n this.enable = this.enable.bind(this);\n this.disable = this.disable.bind(this);\n this.isWidgetEnabled = this.isWidgetEnabled.bind(this);\n this.getState = this.getState.bind(this);\n this.destroy = this.destroy.bind(this);\n }\n\n private setVisibility(state: WidgetVisibilityState): void {\n this.state.visibility = state;\n }\n\n private bindBridgeEvents(): void {\n this.emitter.on(\"toggle\", ({ open }) => this.setVisibility(open ? \"open\" : \"closed\"));\n this.emitter.on(\"open\", () => this.setVisibility(\"open\"));\n this.emitter.on(\"close\", () => this.setVisibility(\"closed\"));\n\n const markReady = () => {\n if (this.state.widgetReady) return;\n this.state.widgetReady = true;\n this.resolveReady?.();\n this.resolveReady = null;\n this.emitter.emit(\"ready\", undefined as never);\n };\n\n this.emitter.on(\"wsInitiated\", markReady);\n this.emitter.on(\"widgetSettingsLoaded\", markReady);\n }\n}\n","import React from \"react\";\nimport { EmploriumClient } from \"../client\";\n\nexport const EmploriumContext = React.createContext<EmploriumClient | null>(null);\n","import { useEffect } from \"react\";\n\nimport { useEmplorium } from \"./useEmplorium\";\n\ntype WidgetProps = {\n /**\n * Open the widget when ready.\n */\n autoOpen?: boolean;\n /**\n * Callback when the widget signals readiness.\n */\n onReady?: () => void;\n};\n\nexport const EmploriumWidget: React.FC<WidgetProps> = ({ autoOpen, onReady }) => {\n const client = useEmplorium();\n\n useEffect(() => {\n let active = true;\n client\n .ready()\n .then(() => {\n if (!active) return;\n if (autoOpen) {\n client.open();\n }\n onReady?.();\n })\n .catch(() => {\n /* errors are surfaced through the client's event bus */\n });\n\n return () => {\n active = false;\n };\n }, [autoOpen, client, onReady]);\n\n return null;\n};\n","import { useContext } from \"react\";\n\nimport { EmploriumContext } from \"./context\";\n\nexport const useEmplorium = () => {\n const client = useContext(EmploriumContext);\n if (!client) {\n throw new Error(\"useEmplorium must be used within an EmploriumProvider\");\n }\n return client;\n};\n"],"mappings":"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","names":["import_react","React","_a","import_react","import_react"]}
|
package/dist/react/index.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/eventBus.ts","../src/logger.ts","../src/iframeLoader.ts","../src/postMessageBridge.ts","../src/client.ts"],"sourcesContent":["type Listener<T> = (payload: T) => void;\n\nexport class EventBus<Events extends Record<string, unknown>> {\n private listeners: Map<keyof Events, Set<Listener<Events[keyof Events]>>> = new Map();\n\n on<K extends keyof Events>(event: K, listener: Listener<Events[K]>): () => void {\n const existing = this.listeners.get(event) ?? new Set();\n existing.add(listener as Listener<Events[keyof Events]>);\n this.listeners.set(event, existing);\n\n return () => this.off(event, listener);\n }\n\n off<K extends keyof Events>(event: K, listener: Listener<Events[K]>): void {\n const existing = this.listeners.get(event);\n if (!existing) return;\n existing.delete(listener as Listener<Events[keyof Events]>);\n if (existing.size === 0) {\n this.listeners.delete(event);\n }\n }\n\n emit<K extends keyof Events>(event: K, payload: Events[K]): void {\n const existing = this.listeners.get(event);\n if (!existing) return;\n existing.forEach((listener) => {\n try {\n (listener as Listener<Events[keyof Events]>)(payload);\n } catch (error) {\n // Avoid breaking other listeners\n console.error(\"[Emplorium SDK] Event listener failed:\", error);\n }\n });\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import { Logger } from \"./types\";\n\nexport const createLogger = (logger?: Logger): Required<Logger> => {\n const fallback: Required<Logger> = {\n debug: () => undefined,\n info: () => undefined,\n warn: () => undefined,\n error: () => undefined,\n };\n\n if (!logger) {\n return fallback;\n }\n\n return {\n debug: logger.debug || fallback.debug,\n info: logger.info || fallback.info,\n warn: logger.warn || fallback.warn,\n error: logger.error || fallback.error,\n };\n};\n","import { createLogger } from \"./logger\";\nimport { EmploriumConfig, EmploriumVisitorIdentity } from \"./types\";\n\ntype LoaderOptions = Pick<\n EmploriumConfig,\n \"accountId\" | \"scriptUrl\" | \"scriptAttributes\" | \"logger\"\n> & {\n user?: EmploriumVisitorIdentity;\n};\n\nconst LOADER_SCRIPT_ID = \"emplorium-sdk-loader-script\";\nlet loadPromise: Promise<void> | null = null;\nlet loadedScriptUrl: string | null = null;\n\nconst getEnvWidgetScriptUrl = (accountId: string): string | null => {\n const env = typeof process !== \"undefined\" && (process.env as Record<string, string | undefined>);\n if (!env) {\n return null;\n }\n\n const direct =\n env.EMPLORIUM_WIDGET_SCRIPT_URL ||\n env.NEXT_PUBLIC_EMPLORIUM_WIDGET_SCRIPT_URL ||\n env.VITE_EMPLORIUM_WIDGET_SCRIPT_URL;\n if (direct) return direct;\n\n const iframeBase =\n env.IFRAME_WIDGET_URL || env.NEXT_PUBLIC_IFRAME_WIDGET_URL || env.VITE_IFRAME_WIDGET_URL;\n if (iframeBase) {\n const base = iframeBase.replace(/\\/+$/, \"\");\n return `${base}/acc-${accountId}/init.js`;\n }\n\n return null;\n};\n\nexport const buildScriptUrl = (accountId: string, override?: string): string => {\n if (override) return override;\n\n const fromEnv = getEnvWidgetScriptUrl(accountId);\n if (fromEnv) return fromEnv;\n\n const defaultBase = \"https://widget-service.emplorium.io\";\n return `${defaultBase.replace(/\\/+$/, \"\")}/acc-${accountId}/init.js`;\n};\n\nexport const resetLoaderState = (): void => {\n loadPromise = null;\n loadedScriptUrl = null;\n if (typeof document !== \"undefined\") {\n document.getElementById(LOADER_SCRIPT_ID)?.remove();\n }\n};\n\nexport const ensureLoaderScript = (options: LoaderOptions): Promise<void> => {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return Promise.reject(new Error(\"Emplorium SDK is browser-only for v1\"));\n }\n\n const logger = createLogger(options.logger);\n const targetUrl = buildScriptUrl(options.accountId, options.scriptUrl);\n\n // If a loader already exists with the same URL, reuse it\n if (loadPromise && loadedScriptUrl === targetUrl) {\n return loadPromise;\n }\n\n // If the host page already injected the loader (e.g., via snippet), reuse it\n const existing =\n document.querySelector<HTMLScriptElement>(`script#${LOADER_SCRIPT_ID}`) ||\n document.querySelector<HTMLScriptElement>('script[data-emplorium-loader=\"true\"]');\n\n if (existing) {\n loadedScriptUrl = existing.src || targetUrl;\n const alreadyLoaded =\n existing.dataset.loaded === \"true\" ||\n existing.getAttribute(\"data-loaded\") === \"true\" ||\n (existing as unknown as { readyState?: string }).readyState === \"complete\";\n\n loadPromise = alreadyLoaded\n ? Promise.resolve()\n : new Promise<void>((resolve, reject) => {\n existing.addEventListener(\"load\", () => resolve(), { once: true });\n existing.addEventListener(\n \"error\",\n () => reject(new Error(\"Emplorium loader script failed to load\")),\n { once: true }\n );\n });\n\n existing.dataset.loaded = alreadyLoaded ? \"true\" : existing.dataset.loaded || \"false\";\n return loadPromise;\n }\n\n loadPromise = new Promise<void>((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.id = LOADER_SCRIPT_ID;\n script.src = targetUrl;\n script.async = true;\n script.dataset.emploriumLoader = \"true\";\n script.dataset.loaded = \"false\";\n\n if (options.scriptAttributes) {\n Object.entries(options.scriptAttributes).forEach(([key, value]) => {\n script.setAttribute(key, value);\n });\n }\n\n script.onload = () => {\n script.dataset.loaded = \"true\";\n loadedScriptUrl = targetUrl;\n logger.info(\"[Emplorium SDK] Loader script ready\");\n resolve();\n };\n script.onerror = () => {\n logger.error(\"[Emplorium SDK] Failed to load loader script\", targetUrl);\n reject(new Error(\"Failed to load Emplorium loader script\"));\n };\n\n document.head.appendChild(script);\n });\n\n return loadPromise;\n};\n","import { EventBus } from \"./eventBus\";\nimport { createLogger } from \"./logger\";\nimport { EmploriumConfig, EmploriumEventMap, EmploriumUser } from \"./types\";\n\ntype BridgeOptions = {\n config: EmploriumConfig;\n emitter: EventBus<EmploriumEventMap>;\n};\n\nconst CHAT_IFRAME_ID = \"emplorium-iframe-chat\";\n\nexport class PostMessageBridge {\n private readonly allowedOrigins: Set<string>;\n private readonly widgetOrigin: string;\n private readonly emitter: EventBus<EmploriumEventMap>;\n private readonly logger;\n private started = false;\n private pendingIdentify: EmploriumUser[] = [];\n\n constructor(private readonly options: BridgeOptions) {\n this.logger = createLogger(options.config.logger);\n const hostOrigin =\n typeof window !== \"undefined\" && window.location.origin ? window.location.origin : \"*\";\n const derivedWidgetOrigin = this.deriveWidgetOrigin(options.config);\n this.widgetOrigin = derivedWidgetOrigin || hostOrigin;\n this.emitter = options.emitter;\n this.allowedOrigins = new Set([\n hostOrigin,\n this.widgetOrigin,\n ...(options.config.allowedOrigins || []),\n ]);\n }\n\n start(): void {\n if (this.started || typeof window === \"undefined\") return;\n window.addEventListener(\"message\", this.handleMessage);\n this.started = true;\n }\n\n stop(): void {\n if (!this.started || typeof window === \"undefined\") return;\n window.removeEventListener(\"message\", this.handleMessage);\n this.started = false;\n }\n\n sendToggle(open: boolean): void {\n if (typeof window === \"undefined\") return;\n const targetOrigin = window.location.origin || \"*\";\n window.postMessage({ type: \"toggle\", show: open }, targetOrigin);\n this.emitter.emit(\"toggle\", { open });\n this.emitter.emit(open ? \"open\" : \"close\", undefined as never);\n }\n\n sendIdentify(user: EmploriumUser): void {\n if (!user || typeof user !== \"object\") return;\n const chatWindow = this.getChatWindow();\n if (!chatWindow) {\n this.pendingIdentify.push(user);\n return;\n }\n chatWindow.postMessage({ type: \"emplorium:identify\", payload: user }, this.widgetOrigin);\n }\n\n sendVisibility(enabled: boolean): void {\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n chatWindow.postMessage(\n { type: \"emplorium:visibility\", payload: { enabled } },\n this.widgetOrigin\n );\n }\n\n sendDisconnect(): void {\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n chatWindow.postMessage({ type: \"EMPLORIUM_WIDGET_DISCONNECT\" }, this.widgetOrigin);\n }\n\n flushPendingIdentify(): void {\n if (this.pendingIdentify.length === 0) return;\n const chatWindow = this.getChatWindow();\n if (!chatWindow) return;\n while (this.pendingIdentify.length > 0) {\n const user = this.pendingIdentify.shift();\n if (user) {\n chatWindow.postMessage({ type: \"emplorium:identify\", payload: user }, this.widgetOrigin);\n }\n }\n }\n\n private deriveWidgetOrigin(config: EmploriumConfig): string {\n if (config.widgetOrigin) return config.widgetOrigin;\n if (config.scriptUrl) {\n try {\n return new URL(config.scriptUrl).origin;\n } catch {\n this.logger.warn(\"[Emplorium SDK] Unable to parse widget origin from scriptUrl\");\n }\n }\n return \"https://widget.emplorium.io\";\n }\n\n private validateOrigin(origin: string): boolean {\n return !!origin && origin !== \"null\" && this.allowedOrigins.has(origin);\n }\n\n private handleMessage = (event: MessageEvent) => {\n if (!event || !this.validateOrigin(event.origin)) {\n return;\n }\n\n const data = event.data;\n if (!data || typeof data !== \"object\" || typeof data.type !== \"string\") {\n return;\n }\n\n switch (data.type) {\n case \"widgetSettingsLoaded\":\n this.emitter.emit(\"widgetSettingsLoaded\", Boolean(data.value));\n this.flushPendingIdentify();\n break;\n case \"wsInitiated\":\n this.emitter.emit(\"wsInitiated\", Boolean(data.value));\n this.flushPendingIdentify();\n break;\n case \"missedMessages\":\n if (typeof data.value === \"number\") {\n this.emitter.emit(\"missedMessages\", data.value);\n }\n break;\n case \"launcherProperties\":\n this.emitter.emit(\"launcherProperties\", data.value || {});\n break;\n case \"openPreviewIframe\":\n this.emitter.emit(\"previewOpen\", {\n url: data.url,\n fileType: data.fileType,\n });\n break;\n default:\n // Intentionally ignore unknown messages; they may be internal or from extensions\n break;\n }\n };\n\n private getChatWindow(): Window | null {\n if (typeof document === \"undefined\") return null;\n const iframe = document.getElementById(CHAT_IFRAME_ID) as HTMLIFrameElement | null;\n if (iframe && iframe.contentWindow) {\n return iframe.contentWindow;\n }\n return null;\n }\n}\n","import { EventBus } from \"./eventBus\";\nimport { ensureLoaderScript, resetLoaderState } from \"./iframeLoader\";\nimport { createLogger } from \"./logger\";\nimport { PostMessageBridge } from \"./postMessageBridge\";\nimport {\n EmploriumConfig,\n EmploriumEventMap,\n EmploriumState,\n EmploriumUser,\n WidgetVisibilityState,\n} from \"./types\";\n\nconst DEFAULT_STATE: EmploriumState = {\n initialized: false,\n loaderLoaded: false,\n widgetReady: false,\n visibility: \"unknown\",\n};\n\nexport class EmploriumClient {\n private readonly emitter = new EventBus<EmploriumEventMap>();\n private readonly logger;\n private readonly bridge: PostMessageBridge;\n private state: EmploriumState = { ...DEFAULT_STATE };\n private initPromise: Promise<void> | null = null;\n private readyPromise: Promise<void> | null = null;\n private resolveReady: (() => void) | null = null;\n private isEnabled: boolean;\n\n constructor(private readonly config: EmploriumConfig) {\n this.logger = createLogger(config.logger);\n this.bridge = new PostMessageBridge({ config, emitter: this.emitter });\n this.isEnabled = config.enabled !== false; // Default to true if not specified\n this.bindApiMethods();\n }\n\n init = (): Promise<void> => {\n if (this.initPromise) {\n return this.initPromise;\n }\n\n // If widget is disabled, resolve immediately without loading\n if (!this.isEnabled) {\n this.logger.debug(\"[Emplorium SDK] Widget disabled via config\");\n this.initPromise = Promise.resolve();\n return this.initPromise;\n }\n\n this.state.initialized = true;\n this.bridge.start();\n\n this.readyPromise = new Promise<void>((resolve) => {\n this.resolveReady = resolve;\n });\n\n this.bindBridgeEvents();\n\n this.initPromise = (async () => {\n if (this.config.autoLoad !== false) {\n await ensureLoaderScript({\n accountId: this.config.accountId,\n scriptUrl: this.config.scriptUrl,\n scriptAttributes: this.config.scriptAttributes,\n logger: this.config.logger,\n user: this.config.user, // Pass user identity to loader\n });\n this.state.loaderLoaded = true;\n this.logger.debug(\"[Emplorium SDK] Loader script injected\");\n\n // If user identity was provided in config, send it immediately\n if (this.config.user) {\n const { firstName, lastName, email } = this.config.user;\n if (firstName || lastName || email) {\n this.setUser({ firstName, lastName, email });\n }\n }\n }\n\n if (this.config.autoOpen) {\n this.open();\n }\n })().catch((error) => {\n this.emitter.emit(\"error\", error);\n throw error;\n });\n\n return this.initPromise;\n };\n\n on = <K extends keyof EmploriumEventMap>(\n event: K,\n listener: (payload: EmploriumEventMap[K]) => void\n ) => {\n return this.emitter.on(event, listener);\n };\n\n off = <K extends keyof EmploriumEventMap>(\n event: K,\n listener: (payload: EmploriumEventMap[K]) => void\n ) => {\n return this.emitter.off(event, listener);\n };\n\n ready = async (): Promise<void> => {\n await this.init();\n return this.readyPromise || Promise.resolve();\n };\n\n open = (): void => {\n this.bridge.sendToggle(true);\n this.state.visibility = \"open\";\n };\n\n close = (): void => {\n this.bridge.sendToggle(false);\n this.state.visibility = \"closed\";\n };\n\n toggle = (): void => {\n const nextOpen = this.state.visibility !== \"open\";\n this.bridge.sendToggle(nextOpen);\n this.state.visibility = nextOpen ? \"open\" : \"closed\";\n };\n\n setUser = (user: EmploriumUser): void => {\n if (!this.isEnabled) return;\n this.bridge.sendIdentify(user);\n };\n\n /**\n * Enable the widget (show it). Only has effect if widget was previously disabled.\n */\n enable = (): void => {\n if (this.isEnabled) return;\n this.isEnabled = true;\n this.bridge.sendVisibility(true);\n };\n\n /**\n * Disable the widget (hide it completely).\n */\n disable = (): void => {\n if (!this.isEnabled) return;\n this.isEnabled = false;\n this.bridge.sendVisibility(false);\n this.state.visibility = \"closed\";\n };\n\n /**\n * Check if the widget is currently enabled.\n */\n isWidgetEnabled = (): boolean => {\n return this.isEnabled;\n };\n\n getState = (): EmploriumState => {\n return { ...this.state };\n };\n\n destroy = (): void => {\n // 1. Tell the iframe to disconnect (WebSocket close + React unmount)\n this.bridge.sendDisconnect();\n\n // 2. Remove launcher iframes from the DOM\n if (typeof window !== \"undefined\" && (window as any).EmploriumLauncher?.destroy) {\n (window as any).EmploriumLauncher.destroy();\n }\n\n // 3. Reset module-level loader state so re-init works cleanly\n resetLoaderState();\n\n // 4. Stop bridge, clear emitter, reset internal state\n this.bridge.stop();\n this.emitter.clear();\n this.state = { ...DEFAULT_STATE };\n this.initPromise = null;\n this.readyPromise = null;\n this.resolveReady = null;\n };\n\n private bindApiMethods(): void {\n this.init = this.init.bind(this);\n this.on = this.on.bind(this);\n this.off = this.off.bind(this);\n this.ready = this.ready.bind(this);\n this.open = this.open.bind(this);\n this.close = this.close.bind(this);\n this.toggle = this.toggle.bind(this);\n this.setUser = this.setUser.bind(this);\n this.enable = this.enable.bind(this);\n this.disable = this.disable.bind(this);\n this.isWidgetEnabled = this.isWidgetEnabled.bind(this);\n this.getState = this.getState.bind(this);\n this.destroy = this.destroy.bind(this);\n }\n\n private setVisibility(state: WidgetVisibilityState): void {\n this.state.visibility = state;\n }\n\n private bindBridgeEvents(): void {\n this.emitter.on(\"toggle\", ({ open }) => this.setVisibility(open ? \"open\" : \"closed\"));\n this.emitter.on(\"open\", () => this.setVisibility(\"open\"));\n this.emitter.on(\"close\", () => this.setVisibility(\"closed\"));\n\n const markReady = () => {\n if (this.state.widgetReady) return;\n this.state.widgetReady = true;\n this.resolveReady?.();\n this.resolveReady = null;\n this.emitter.emit(\"ready\", undefined as never);\n };\n\n this.emitter.on(\"wsInitiated\", markReady);\n this.emitter.on(\"widgetSettingsLoaded\", markReady);\n }\n}\n"],"mappings":";AAEO,IAAM,WAAN,MAAuD;AAAA,EAAvD;AACL,SAAQ,YAAoE,oBAAI,IAAI;AAAA;AAAA,EAEpF,GAA2B,OAAU,UAA2C;AALlF;AAMI,UAAM,YAAW,UAAK,UAAU,IAAI,KAAK,MAAxB,YAA6B,oBAAI,IAAI;AACtD,aAAS,IAAI,QAA0C;AACvD,SAAK,UAAU,IAAI,OAAO,QAAQ;AAElC,WAAO,MAAM,KAAK,IAAI,OAAO,QAAQ;AAAA,EACvC;AAAA,EAEA,IAA4B,OAAU,UAAqC;AACzE,UAAM,WAAW,KAAK,UAAU,IAAI,KAAK;AACzC,QAAI,CAAC;AAAU;AACf,aAAS,OAAO,QAA0C;AAC1D,QAAI,SAAS,SAAS,GAAG;AACvB,WAAK,UAAU,OAAO,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,KAA6B,OAAU,SAA0B;AAC/D,UAAM,WAAW,KAAK,UAAU,IAAI,KAAK;AACzC,QAAI,CAAC;AAAU;AACf,aAAS,QAAQ,CAAC,aAAa;AAC7B,UAAI;AACF,QAAC,SAA4C,OAAO;AAAA,MACtD,SAAS,OAAO;AAEd,gBAAQ,MAAM,0CAA0C,KAAK;AAAA,MAC/D;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,QAAc;AACZ,SAAK,UAAU,MAAM;AAAA,EACvB;AACF;;;ACpCO,IAAM,eAAe,CAAC,WAAsC;AACjE,QAAM,WAA6B;AAAA,IACjC,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ,OAAO,MAAM;AAAA,EACf;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,SAAS,SAAS;AAAA,IAChC,MAAM,OAAO,QAAQ,SAAS;AAAA,IAC9B,MAAM,OAAO,QAAQ,SAAS;AAAA,IAC9B,OAAO,OAAO,SAAS,SAAS;AAAA,EAClC;AACF;;;ACVA,IAAM,mBAAmB;AACzB,IAAI,cAAoC;AACxC,IAAI,kBAAiC;AAErC,IAAM,wBAAwB,CAAC,cAAqC;AAClE,QAAM,MAAM,OAAO,YAAY,eAAgB,QAAQ;AACvD,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,QAAM,SACJ,IAAI,+BACJ,IAAI,2CACJ,IAAI;AACN,MAAI;AAAQ,WAAO;AAEnB,QAAM,aACJ,IAAI,qBAAqB,IAAI,iCAAiC,IAAI;AACpE,MAAI,YAAY;AACd,UAAM,OAAO,WAAW,QAAQ,QAAQ,EAAE;AAC1C,WAAO,GAAG,IAAI,QAAQ,SAAS;AAAA,EACjC;AAEA,SAAO;AACT;AAEO,IAAM,iBAAiB,CAAC,WAAmB,aAA8B;AAC9E,MAAI;AAAU,WAAO;AAErB,QAAM,UAAU,sBAAsB,SAAS;AAC/C,MAAI;AAAS,WAAO;AAEpB,QAAM,cAAc;AACpB,SAAO,GAAG,YAAY,QAAQ,QAAQ,EAAE,CAAC,QAAQ,SAAS;AAC5D;AAEO,IAAM,mBAAmB,MAAY;AA9C5C;AA+CE,gBAAc;AACd,oBAAkB;AAClB,MAAI,OAAO,aAAa,aAAa;AACnC,mBAAS,eAAe,gBAAgB,MAAxC,mBAA2C;AAAA,EAC7C;AACF;AAEO,IAAM,qBAAqB,CAAC,YAA0C;AAC3E,MAAI,OAAO,WAAW,eAAe,OAAO,aAAa,aAAa;AACpE,WAAO,QAAQ,OAAO,IAAI,MAAM,sCAAsC,CAAC;AAAA,EACzE;AAEA,QAAM,SAAS,aAAa,QAAQ,MAAM;AAC1C,QAAM,YAAY,eAAe,QAAQ,WAAW,QAAQ,SAAS;AAGrE,MAAI,eAAe,oBAAoB,WAAW;AAChD,WAAO;AAAA,EACT;AAGA,QAAM,WACJ,SAAS,cAAiC,UAAU,gBAAgB,EAAE,KACtE,SAAS,cAAiC,sCAAsC;AAElF,MAAI,UAAU;AACZ,sBAAkB,SAAS,OAAO;AAClC,UAAM,gBACJ,SAAS,QAAQ,WAAW,UAC5B,SAAS,aAAa,aAAa,MAAM,UACxC,SAAgD,eAAe;AAElE,kBAAc,gBACV,QAAQ,QAAQ,IAChB,IAAI,QAAc,CAAC,SAAS,WAAW;AACrC,eAAS,iBAAiB,QAAQ,MAAM,QAAQ,GAAG,EAAE,MAAM,KAAK,CAAC;AACjE,eAAS;AAAA,QACP;AAAA,QACA,MAAM,OAAO,IAAI,MAAM,wCAAwC,CAAC;AAAA,QAChE,EAAE,MAAM,KAAK;AAAA,MACf;AAAA,IACF,CAAC;AAEL,aAAS,QAAQ,SAAS,gBAAgB,SAAS,SAAS,QAAQ,UAAU;AAC9E,WAAO;AAAA,EACT;AAEA,gBAAc,IAAI,QAAc,CAAC,SAAS,WAAW;AACnD,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,KAAK;AACZ,WAAO,MAAM;AACb,WAAO,QAAQ;AACf,WAAO,QAAQ,kBAAkB;AACjC,WAAO,QAAQ,SAAS;AAExB,QAAI,QAAQ,kBAAkB;AAC5B,aAAO,QAAQ,QAAQ,gBAAgB,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACjE,eAAO,aAAa,KAAK,KAAK;AAAA,MAChC,CAAC;AAAA,IACH;AAEA,WAAO,SAAS,MAAM;AACpB,aAAO,QAAQ,SAAS;AACxB,wBAAkB;AAClB,aAAO,KAAK,qCAAqC;AACjD,cAAQ;AAAA,IACV;AACA,WAAO,UAAU,MAAM;AACrB,aAAO,MAAM,gDAAgD,SAAS;AACtE,aAAO,IAAI,MAAM,wCAAwC,CAAC;AAAA,IAC5D;AAEA,aAAS,KAAK,YAAY,MAAM;AAAA,EAClC,CAAC;AAED,SAAO;AACT;;;AClHA,IAAM,iBAAiB;AAEhB,IAAM,oBAAN,MAAwB;AAAA,EAQ7B,YAA6B,SAAwB;AAAxB;AAH7B,SAAQ,UAAU;AAClB,SAAQ,kBAAmC,CAAC;AAyF5C,SAAQ,gBAAgB,CAAC,UAAwB;AAC/C,UAAI,CAAC,SAAS,CAAC,KAAK,eAAe,MAAM,MAAM,GAAG;AAChD;AAAA,MACF;AAEA,YAAM,OAAO,MAAM;AACnB,UAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,OAAO,KAAK,SAAS,UAAU;AACtE;AAAA,MACF;AAEA,cAAQ,KAAK,MAAM;AAAA,QACjB,KAAK;AACH,eAAK,QAAQ,KAAK,wBAAwB,QAAQ,KAAK,KAAK,CAAC;AAC7D,eAAK,qBAAqB;AAC1B;AAAA,QACF,KAAK;AACH,eAAK,QAAQ,KAAK,eAAe,QAAQ,KAAK,KAAK,CAAC;AACpD,eAAK,qBAAqB;AAC1B;AAAA,QACF,KAAK;AACH,cAAI,OAAO,KAAK,UAAU,UAAU;AAClC,iBAAK,QAAQ,KAAK,kBAAkB,KAAK,KAAK;AAAA,UAChD;AACA;AAAA,QACF,KAAK;AACH,eAAK,QAAQ,KAAK,sBAAsB,KAAK,SAAS,CAAC,CAAC;AACxD;AAAA,QACF,KAAK;AACH,eAAK,QAAQ,KAAK,eAAe;AAAA,YAC/B,KAAK,KAAK;AAAA,YACV,UAAU,KAAK;AAAA,UACjB,CAAC;AACD;AAAA,QACF;AAEE;AAAA,MACJ;AAAA,IACF;AA3HE,SAAK,SAAS,aAAa,QAAQ,OAAO,MAAM;AAChD,UAAM,aACJ,OAAO,WAAW,eAAe,OAAO,SAAS,SAAS,OAAO,SAAS,SAAS;AACrF,UAAM,sBAAsB,KAAK,mBAAmB,QAAQ,MAAM;AAClE,SAAK,eAAe,uBAAuB;AAC3C,SAAK,UAAU,QAAQ;AACvB,SAAK,iBAAiB,oBAAI,IAAI;AAAA,MAC5B;AAAA,MACA,KAAK;AAAA,MACL,GAAI,QAAQ,OAAO,kBAAkB,CAAC;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,QAAc;AACZ,QAAI,KAAK,WAAW,OAAO,WAAW;AAAa;AACnD,WAAO,iBAAiB,WAAW,KAAK,aAAa;AACrD,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,OAAa;AACX,QAAI,CAAC,KAAK,WAAW,OAAO,WAAW;AAAa;AACpD,WAAO,oBAAoB,WAAW,KAAK,aAAa;AACxD,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,WAAW,MAAqB;AAC9B,QAAI,OAAO,WAAW;AAAa;AACnC,UAAM,eAAe,OAAO,SAAS,UAAU;AAC/C,WAAO,YAAY,EAAE,MAAM,UAAU,MAAM,KAAK,GAAG,YAAY;AAC/D,SAAK,QAAQ,KAAK,UAAU,EAAE,KAAK,CAAC;AACpC,SAAK,QAAQ,KAAK,OAAO,SAAS,SAAS,MAAkB;AAAA,EAC/D;AAAA,EAEA,aAAa,MAA2B;AACtC,QAAI,CAAC,QAAQ,OAAO,SAAS;AAAU;AACvC,UAAM,aAAa,KAAK,cAAc;AACtC,QAAI,CAAC,YAAY;AACf,WAAK,gBAAgB,KAAK,IAAI;AAC9B;AAAA,IACF;AACA,eAAW,YAAY,EAAE,MAAM,sBAAsB,SAAS,KAAK,GAAG,KAAK,YAAY;AAAA,EACzF;AAAA,EAEA,eAAe,SAAwB;AACrC,UAAM,aAAa,KAAK,cAAc;AACtC,QAAI,CAAC;AAAY;AACjB,eAAW;AAAA,MACT,EAAE,MAAM,wBAAwB,SAAS,EAAE,QAAQ,EAAE;AAAA,MACrD,KAAK;AAAA,IACP;AAAA,EACF;AAAA,EAEA,iBAAuB;AACrB,UAAM,aAAa,KAAK,cAAc;AACtC,QAAI,CAAC;AAAY;AACjB,eAAW,YAAY,EAAE,MAAM,8BAA8B,GAAG,KAAK,YAAY;AAAA,EACnF;AAAA,EAEA,uBAA6B;AAC3B,QAAI,KAAK,gBAAgB,WAAW;AAAG;AACvC,UAAM,aAAa,KAAK,cAAc;AACtC,QAAI,CAAC;AAAY;AACjB,WAAO,KAAK,gBAAgB,SAAS,GAAG;AACtC,YAAM,OAAO,KAAK,gBAAgB,MAAM;AACxC,UAAI,MAAM;AACR,mBAAW,YAAY,EAAE,MAAM,sBAAsB,SAAS,KAAK,GAAG,KAAK,YAAY;AAAA,MACzF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAmB,QAAiC;AAC1D,QAAI,OAAO;AAAc,aAAO,OAAO;AACvC,QAAI,OAAO,WAAW;AACpB,UAAI;AACF,eAAO,IAAI,IAAI,OAAO,SAAS,EAAE;AAAA,MACnC,QAAQ;AACN,aAAK,OAAO,KAAK,8DAA8D;AAAA,MACjF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,QAAyB;AAC9C,WAAO,CAAC,CAAC,UAAU,WAAW,UAAU,KAAK,eAAe,IAAI,MAAM;AAAA,EACxE;AAAA,EAyCQ,gBAA+B;AACrC,QAAI,OAAO,aAAa;AAAa,aAAO;AAC5C,UAAM,SAAS,SAAS,eAAe,cAAc;AACrD,QAAI,UAAU,OAAO,eAAe;AAClC,aAAO,OAAO;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AACF;;;AC7IA,IAAM,gBAAgC;AAAA,EACpC,aAAa;AAAA,EACb,cAAc;AAAA,EACd,aAAa;AAAA,EACb,YAAY;AACd;AAEO,IAAM,kBAAN,MAAsB;AAAA,EAU3B,YAA6B,QAAyB;AAAzB;AAT7B,SAAiB,UAAU,IAAI,SAA4B;AAG3D,SAAQ,QAAwB,EAAE,GAAG,cAAc;AACnD,SAAQ,cAAoC;AAC5C,SAAQ,eAAqC;AAC7C,SAAQ,eAAoC;AAU5C,gBAAO,MAAqB;AAC1B,UAAI,KAAK,aAAa;AACpB,eAAO,KAAK;AAAA,MACd;AAGA,UAAI,CAAC,KAAK,WAAW;AACnB,aAAK,OAAO,MAAM,4CAA4C;AAC9D,aAAK,cAAc,QAAQ,QAAQ;AACnC,eAAO,KAAK;AAAA,MACd;AAEA,WAAK,MAAM,cAAc;AACzB,WAAK,OAAO,MAAM;AAElB,WAAK,eAAe,IAAI,QAAc,CAAC,YAAY;AACjD,aAAK,eAAe;AAAA,MACtB,CAAC;AAED,WAAK,iBAAiB;AAEtB,WAAK,eAAe,YAAY;AAC9B,YAAI,KAAK,OAAO,aAAa,OAAO;AAClC,gBAAM,mBAAmB;AAAA,YACvB,WAAW,KAAK,OAAO;AAAA,YACvB,WAAW,KAAK,OAAO;AAAA,YACvB,kBAAkB,KAAK,OAAO;AAAA,YAC9B,QAAQ,KAAK,OAAO;AAAA,YACpB,MAAM,KAAK,OAAO;AAAA;AAAA,UACpB,CAAC;AACD,eAAK,MAAM,eAAe;AAC1B,eAAK,OAAO,MAAM,wCAAwC;AAG1D,cAAI,KAAK,OAAO,MAAM;AACpB,kBAAM,EAAE,WAAW,UAAU,MAAM,IAAI,KAAK,OAAO;AACnD,gBAAI,aAAa,YAAY,OAAO;AAClC,mBAAK,QAAQ,EAAE,WAAW,UAAU,MAAM,CAAC;AAAA,YAC7C;AAAA,UACF;AAAA,QACF;AAEA,YAAI,KAAK,OAAO,UAAU;AACxB,eAAK,KAAK;AAAA,QACZ;AAAA,MACF,GAAG,EAAE,MAAM,CAAC,UAAU;AACpB,aAAK,QAAQ,KAAK,SAAS,KAAK;AAChC,cAAM;AAAA,MACR,CAAC;AAED,aAAO,KAAK;AAAA,IACd;AAEA,cAAK,CACH,OACA,aACG;AACH,aAAO,KAAK,QAAQ,GAAG,OAAO,QAAQ;AAAA,IACxC;AAEA,eAAM,CACJ,OACA,aACG;AACH,aAAO,KAAK,QAAQ,IAAI,OAAO,QAAQ;AAAA,IACzC;AAEA,iBAAQ,YAA2B;AACjC,YAAM,KAAK,KAAK;AAChB,aAAO,KAAK,gBAAgB,QAAQ,QAAQ;AAAA,IAC9C;AAEA,gBAAO,MAAY;AACjB,WAAK,OAAO,WAAW,IAAI;AAC3B,WAAK,MAAM,aAAa;AAAA,IAC1B;AAEA,iBAAQ,MAAY;AAClB,WAAK,OAAO,WAAW,KAAK;AAC5B,WAAK,MAAM,aAAa;AAAA,IAC1B;AAEA,kBAAS,MAAY;AACnB,YAAM,WAAW,KAAK,MAAM,eAAe;AAC3C,WAAK,OAAO,WAAW,QAAQ;AAC/B,WAAK,MAAM,aAAa,WAAW,SAAS;AAAA,IAC9C;AAEA,mBAAU,CAAC,SAA8B;AACvC,UAAI,CAAC,KAAK;AAAW;AACrB,WAAK,OAAO,aAAa,IAAI;AAAA,IAC/B;AAKA;AAAA;AAAA;AAAA,kBAAS,MAAY;AACnB,UAAI,KAAK;AAAW;AACpB,WAAK,YAAY;AACjB,WAAK,OAAO,eAAe,IAAI;AAAA,IACjC;AAKA;AAAA;AAAA;AAAA,mBAAU,MAAY;AACpB,UAAI,CAAC,KAAK;AAAW;AACrB,WAAK,YAAY;AACjB,WAAK,OAAO,eAAe,KAAK;AAChC,WAAK,MAAM,aAAa;AAAA,IAC1B;AAKA;AAAA;AAAA;AAAA,2BAAkB,MAAe;AAC/B,aAAO,KAAK;AAAA,IACd;AAEA,oBAAW,MAAsB;AAC/B,aAAO,EAAE,GAAG,KAAK,MAAM;AAAA,IACzB;AAEA,mBAAU,MAAY;AA/JxB;AAiKI,WAAK,OAAO,eAAe;AAG3B,UAAI,OAAO,WAAW,iBAAgB,YAAe,sBAAf,mBAAkC,UAAS;AAC/E,QAAC,OAAe,kBAAkB,QAAQ;AAAA,MAC5C;AAGA,uBAAiB;AAGjB,WAAK,OAAO,KAAK;AACjB,WAAK,QAAQ,MAAM;AACnB,WAAK,QAAQ,EAAE,GAAG,cAAc;AAChC,WAAK,cAAc;AACnB,WAAK,eAAe;AACpB,WAAK,eAAe;AAAA,IACtB;AApJE,SAAK,SAAS,aAAa,OAAO,MAAM;AACxC,SAAK,SAAS,IAAI,kBAAkB,EAAE,QAAQ,SAAS,KAAK,QAAQ,CAAC;AACrE,SAAK,YAAY,OAAO,YAAY;AACpC,SAAK,eAAe;AAAA,EACtB;AAAA,EAkJQ,iBAAuB;AAC7B,SAAK,OAAO,KAAK,KAAK,KAAK,IAAI;AAC/B,SAAK,KAAK,KAAK,GAAG,KAAK,IAAI;AAC3B,SAAK,MAAM,KAAK,IAAI,KAAK,IAAI;AAC7B,SAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;AACjC,SAAK,OAAO,KAAK,KAAK,KAAK,IAAI;AAC/B,SAAK,QAAQ,KAAK,MAAM,KAAK,IAAI;AACjC,SAAK,SAAS,KAAK,OAAO,KAAK,IAAI;AACnC,SAAK,UAAU,KAAK,QAAQ,KAAK,IAAI;AACrC,SAAK,SAAS,KAAK,OAAO,KAAK,IAAI;AACnC,SAAK,UAAU,KAAK,QAAQ,KAAK,IAAI;AACrC,SAAK,kBAAkB,KAAK,gBAAgB,KAAK,IAAI;AACrD,SAAK,WAAW,KAAK,SAAS,KAAK,IAAI;AACvC,SAAK,UAAU,KAAK,QAAQ,KAAK,IAAI;AAAA,EACvC;AAAA,EAEQ,cAAc,OAAoC;AACxD,SAAK,MAAM,aAAa;AAAA,EAC1B;AAAA,EAEQ,mBAAyB;AAC/B,SAAK,QAAQ,GAAG,UAAU,CAAC,EAAE,KAAK,MAAM,KAAK,cAAc,OAAO,SAAS,QAAQ,CAAC;AACpF,SAAK,QAAQ,GAAG,QAAQ,MAAM,KAAK,cAAc,MAAM,CAAC;AACxD,SAAK,QAAQ,GAAG,SAAS,MAAM,KAAK,cAAc,QAAQ,CAAC;AAE3D,UAAM,YAAY,MAAM;AA7M5B;AA8MM,UAAI,KAAK,MAAM;AAAa;AAC5B,WAAK,MAAM,cAAc;AACzB,iBAAK,iBAAL;AACA,WAAK,eAAe;AACpB,WAAK,QAAQ,KAAK,SAAS,MAAkB;AAAA,IAC/C;AAEA,SAAK,QAAQ,GAAG,eAAe,SAAS;AACxC,SAAK,QAAQ,GAAG,wBAAwB,SAAS;AAAA,EACnD;AACF;","names":[]}
|