@emplorium/sdk 0.3.0 → 0.4.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-74N3XWC2.mjs → chunk-LZE2HSUA.mjs} +8 -8
- package/dist/chunk-LZE2HSUA.mjs.map +1 -0
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/react/index.js +7 -7
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-74N3XWC2.mjs.map +0 -1
|
@@ -75,13 +75,13 @@ var getEnvWidgetScriptUrl = (accountId) => {
|
|
|
75
75
|
return null;
|
|
76
76
|
};
|
|
77
77
|
var buildScriptUrl = (accountId, override) => {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
const
|
|
81
|
-
if (
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return
|
|
78
|
+
var _a;
|
|
79
|
+
const raw = override || getEnvWidgetScriptUrl(accountId) || `https://widget-service.emplorium.io/acc-${accountId}/init.js`;
|
|
80
|
+
const url = new URL(raw);
|
|
81
|
+
if (typeof window !== "undefined" && ((_a = window.location) == null ? void 0 : _a.hostname)) {
|
|
82
|
+
url.searchParams.set("d", window.location.hostname);
|
|
83
|
+
}
|
|
84
|
+
return url.toString();
|
|
85
85
|
};
|
|
86
86
|
var resetLoaderState = () => {
|
|
87
87
|
var _a;
|
|
@@ -454,4 +454,4 @@ var EmploriumClient = class {
|
|
|
454
454
|
export {
|
|
455
455
|
EmploriumClient
|
|
456
456
|
};
|
|
457
|
-
//# sourceMappingURL=chunk-
|
|
457
|
+
//# sourceMappingURL=chunk-LZE2HSUA.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 const raw = override || getEnvWidgetScriptUrl(accountId) || `https://widget-service.emplorium.io/acc-${accountId}/init.js`;\n const url = new URL(raw);\n if (typeof window !== \"undefined\" && window.location?.hostname) {\n url.searchParams.set(\"d\", window.location.hostname);\n }\n return url.toString();\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
|
@@ -101,13 +101,13 @@ var getEnvWidgetScriptUrl = (accountId) => {
|
|
|
101
101
|
return null;
|
|
102
102
|
};
|
|
103
103
|
var buildScriptUrl = (accountId, override) => {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
const
|
|
107
|
-
if (
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
return
|
|
104
|
+
var _a;
|
|
105
|
+
const raw = override || getEnvWidgetScriptUrl(accountId) || `https://widget-service.emplorium.io/acc-${accountId}/init.js`;
|
|
106
|
+
const url = new URL(raw);
|
|
107
|
+
if (typeof window !== "undefined" && ((_a = window.location) == null ? void 0 : _a.hostname)) {
|
|
108
|
+
url.searchParams.set("d", window.location.hostname);
|
|
109
|
+
}
|
|
110
|
+
return url.toString();
|
|
111
111
|
};
|
|
112
112
|
var resetLoaderState = () => {
|
|
113
113
|
var _a;
|
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 // 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":[]}
|
|
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 const raw = override || getEnvWidgetScriptUrl(accountId) || `https://widget-service.emplorium.io/acc-${accountId}/init.js`;\n const url = new URL(raw);\n if (typeof window !== \"undefined\" && window.location?.hostname) {\n url.searchParams.set(\"d\", window.location.hostname);\n }\n return url.toString();\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
|
@@ -116,13 +116,13 @@ var getEnvWidgetScriptUrl = (accountId) => {
|
|
|
116
116
|
return null;
|
|
117
117
|
};
|
|
118
118
|
var buildScriptUrl = (accountId, override) => {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
const
|
|
122
|
-
if (
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return
|
|
119
|
+
var _a;
|
|
120
|
+
const raw = override || getEnvWidgetScriptUrl(accountId) || `https://widget-service.emplorium.io/acc-${accountId}/init.js`;
|
|
121
|
+
const url = new URL(raw);
|
|
122
|
+
if (typeof window !== "undefined" && ((_a = window.location) == null ? void 0 : _a.hostname)) {
|
|
123
|
+
url.searchParams.set("d", window.location.hostname);
|
|
124
|
+
}
|
|
125
|
+
return url.toString();
|
|
126
126
|
};
|
|
127
127
|
var resetLoaderState = () => {
|
|
128
128
|
var _a;
|
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 // 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"]}
|
|
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 const raw = override || getEnvWidgetScriptUrl(accountId) || `https://widget-service.emplorium.io/acc-${accountId}/init.js`;\n const url = new URL(raw);\n if (typeof window !== \"undefined\" && window.location?.hostname) {\n url.searchParams.set(\"d\", window.location.hostname);\n }\n return url.toString();\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 // 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":[]}
|