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