@emplorium/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,460 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ EmploriumClient: () => EmploriumClient
24
+ });
25
+ module.exports = __toCommonJS(src_exports);
26
+
27
+ // src/eventBus.ts
28
+ var EventBus = class {
29
+ constructor() {
30
+ this.listeners = /* @__PURE__ */ new Map();
31
+ }
32
+ on(event, listener) {
33
+ var _a;
34
+ const existing = (_a = this.listeners.get(event)) != null ? _a : /* @__PURE__ */ new Set();
35
+ existing.add(listener);
36
+ this.listeners.set(event, existing);
37
+ return () => this.off(event, listener);
38
+ }
39
+ off(event, listener) {
40
+ const existing = this.listeners.get(event);
41
+ if (!existing)
42
+ return;
43
+ existing.delete(listener);
44
+ if (existing.size === 0) {
45
+ this.listeners.delete(event);
46
+ }
47
+ }
48
+ emit(event, payload) {
49
+ const existing = this.listeners.get(event);
50
+ if (!existing)
51
+ return;
52
+ existing.forEach((listener) => {
53
+ try {
54
+ listener(payload);
55
+ } catch (error) {
56
+ console.error("[Emplorium SDK] Event listener failed:", error);
57
+ }
58
+ });
59
+ }
60
+ clear() {
61
+ this.listeners.clear();
62
+ }
63
+ };
64
+
65
+ // src/logger.ts
66
+ var createLogger = (logger) => {
67
+ const fallback = {
68
+ debug: () => void 0,
69
+ info: () => void 0,
70
+ warn: () => void 0,
71
+ error: () => void 0
72
+ };
73
+ if (!logger) {
74
+ return fallback;
75
+ }
76
+ return {
77
+ debug: logger.debug || fallback.debug,
78
+ info: logger.info || fallback.info,
79
+ warn: logger.warn || fallback.warn,
80
+ error: logger.error || fallback.error
81
+ };
82
+ };
83
+
84
+ // src/iframeLoader.ts
85
+ var LOADER_SCRIPT_ID = "emplorium-sdk-loader-script";
86
+ var loadPromise = null;
87
+ var loadedScriptUrl = null;
88
+ var getEnvWidgetScriptUrl = (accountId) => {
89
+ const env = typeof process !== "undefined" && process.env;
90
+ if (!env) {
91
+ return null;
92
+ }
93
+ const direct = env.EMPLORIUM_WIDGET_SCRIPT_URL || env.NEXT_PUBLIC_EMPLORIUM_WIDGET_SCRIPT_URL || env.VITE_EMPLORIUM_WIDGET_SCRIPT_URL;
94
+ if (direct)
95
+ return direct;
96
+ const iframeBase = env.IFRAME_WIDGET_URL || env.NEXT_PUBLIC_IFRAME_WIDGET_URL || env.VITE_IFRAME_WIDGET_URL;
97
+ if (iframeBase) {
98
+ const base = iframeBase.replace(/\/+$/, "");
99
+ return `${base}/acc-${accountId}/init.js`;
100
+ }
101
+ return null;
102
+ };
103
+ var buildScriptUrl = (accountId, override) => {
104
+ if (override)
105
+ return override;
106
+ const fromEnv = getEnvWidgetScriptUrl(accountId);
107
+ if (fromEnv)
108
+ return fromEnv;
109
+ const defaultBase = "https://widget-service.emplorium.io";
110
+ return `${defaultBase.replace(/\/+$/, "")}/acc-${accountId}/init.js`;
111
+ };
112
+ var ensureLoaderScript = (options) => {
113
+ if (typeof window === "undefined" || typeof document === "undefined") {
114
+ return Promise.reject(new Error("Emplorium SDK is browser-only for v1"));
115
+ }
116
+ const logger = createLogger(options.logger);
117
+ const targetUrl = buildScriptUrl(options.accountId, options.scriptUrl);
118
+ if (loadPromise && loadedScriptUrl === targetUrl) {
119
+ return loadPromise;
120
+ }
121
+ const existing = document.querySelector(`script#${LOADER_SCRIPT_ID}`) || document.querySelector('script[data-emplorium-loader="true"]');
122
+ if (existing) {
123
+ loadedScriptUrl = existing.src || targetUrl;
124
+ const alreadyLoaded = existing.dataset.loaded === "true" || existing.getAttribute("data-loaded") === "true" || existing.readyState === "complete";
125
+ loadPromise = alreadyLoaded ? Promise.resolve() : new Promise((resolve, reject) => {
126
+ existing.addEventListener("load", () => resolve(), { once: true });
127
+ existing.addEventListener(
128
+ "error",
129
+ () => reject(new Error("Emplorium loader script failed to load")),
130
+ { once: true }
131
+ );
132
+ });
133
+ existing.dataset.loaded = alreadyLoaded ? "true" : existing.dataset.loaded || "false";
134
+ return loadPromise;
135
+ }
136
+ loadPromise = new Promise((resolve, reject) => {
137
+ const script = document.createElement("script");
138
+ script.id = LOADER_SCRIPT_ID;
139
+ script.src = targetUrl;
140
+ script.async = true;
141
+ script.dataset.emploriumLoader = "true";
142
+ script.dataset.loaded = "false";
143
+ if (options.scriptAttributes) {
144
+ Object.entries(options.scriptAttributes).forEach(([key, value]) => {
145
+ script.setAttribute(key, value);
146
+ });
147
+ }
148
+ script.onload = () => {
149
+ script.dataset.loaded = "true";
150
+ loadedScriptUrl = targetUrl;
151
+ logger.info("[Emplorium SDK] Loader script ready");
152
+ resolve();
153
+ };
154
+ script.onerror = () => {
155
+ logger.error("[Emplorium SDK] Failed to load loader script", targetUrl);
156
+ reject(new Error("Failed to load Emplorium loader script"));
157
+ };
158
+ document.head.appendChild(script);
159
+ });
160
+ return loadPromise;
161
+ };
162
+
163
+ // src/postMessageBridge.ts
164
+ var CHAT_IFRAME_ID = "emplorium-iframe-chat";
165
+ var PostMessageBridge = class {
166
+ constructor(options) {
167
+ this.options = options;
168
+ this.started = false;
169
+ this.pendingIdentify = [];
170
+ this.handleMessage = (event) => {
171
+ if (!event || !this.validateOrigin(event.origin)) {
172
+ return;
173
+ }
174
+ const data = event.data;
175
+ if (!data || typeof data !== "object" || typeof data.type !== "string") {
176
+ return;
177
+ }
178
+ switch (data.type) {
179
+ case "widgetSettingsLoaded":
180
+ this.emitter.emit("widgetSettingsLoaded", Boolean(data.value));
181
+ this.flushPendingIdentify();
182
+ break;
183
+ case "wsInitiated":
184
+ this.emitter.emit("wsInitiated", Boolean(data.value));
185
+ this.flushPendingIdentify();
186
+ break;
187
+ case "missedMessages":
188
+ if (typeof data.value === "number") {
189
+ this.emitter.emit("missedMessages", data.value);
190
+ }
191
+ break;
192
+ case "launcherProperties":
193
+ this.emitter.emit("launcherProperties", data.value || {});
194
+ break;
195
+ case "openPreviewIframe":
196
+ this.emitter.emit("previewOpen", {
197
+ url: data.url,
198
+ fileType: data.fileType
199
+ });
200
+ break;
201
+ default:
202
+ break;
203
+ }
204
+ };
205
+ this.logger = createLogger(options.config.logger);
206
+ const hostOrigin = typeof window !== "undefined" && window.location.origin ? window.location.origin : "*";
207
+ const derivedWidgetOrigin = this.deriveWidgetOrigin(options.config);
208
+ this.widgetOrigin = derivedWidgetOrigin || hostOrigin;
209
+ this.emitter = options.emitter;
210
+ this.allowedOrigins = /* @__PURE__ */ new Set([
211
+ hostOrigin,
212
+ this.widgetOrigin,
213
+ ...options.config.allowedOrigins || []
214
+ ]);
215
+ }
216
+ start() {
217
+ if (this.started || typeof window === "undefined")
218
+ return;
219
+ window.addEventListener("message", this.handleMessage);
220
+ this.started = true;
221
+ }
222
+ stop() {
223
+ if (!this.started || typeof window === "undefined")
224
+ return;
225
+ window.removeEventListener("message", this.handleMessage);
226
+ this.started = false;
227
+ }
228
+ sendToggle(open) {
229
+ if (typeof window === "undefined")
230
+ return;
231
+ const targetOrigin = window.location.origin || "*";
232
+ window.postMessage({ type: "toggle", show: open }, targetOrigin);
233
+ this.emitter.emit("toggle", { open });
234
+ this.emitter.emit(open ? "open" : "close", void 0);
235
+ }
236
+ sendIdentify(user) {
237
+ if (!user || typeof user !== "object")
238
+ return;
239
+ const chatWindow = this.getChatWindow();
240
+ if (!chatWindow) {
241
+ this.pendingIdentify.push(user);
242
+ return;
243
+ }
244
+ chatWindow.postMessage({ type: "emplorium:identify", payload: user }, this.widgetOrigin);
245
+ }
246
+ sendVisibility(enabled) {
247
+ const chatWindow = this.getChatWindow();
248
+ if (!chatWindow)
249
+ return;
250
+ chatWindow.postMessage(
251
+ { type: "emplorium:visibility", payload: { enabled } },
252
+ this.widgetOrigin
253
+ );
254
+ }
255
+ flushPendingIdentify() {
256
+ if (this.pendingIdentify.length === 0)
257
+ return;
258
+ const chatWindow = this.getChatWindow();
259
+ if (!chatWindow)
260
+ return;
261
+ while (this.pendingIdentify.length > 0) {
262
+ const user = this.pendingIdentify.shift();
263
+ if (user) {
264
+ chatWindow.postMessage({ type: "emplorium:identify", payload: user }, this.widgetOrigin);
265
+ }
266
+ }
267
+ }
268
+ deriveWidgetOrigin(config) {
269
+ if (config.widgetOrigin)
270
+ return config.widgetOrigin;
271
+ if (config.scriptUrl) {
272
+ try {
273
+ return new URL(config.scriptUrl).origin;
274
+ } catch {
275
+ this.logger.warn("[Emplorium SDK] Unable to parse widget origin from scriptUrl");
276
+ }
277
+ }
278
+ return "https://widget.emplorium.io";
279
+ }
280
+ validateOrigin(origin) {
281
+ return !!origin && origin !== "null" && this.allowedOrigins.has(origin);
282
+ }
283
+ getChatWindow() {
284
+ if (typeof document === "undefined")
285
+ return null;
286
+ const iframe = document.getElementById(CHAT_IFRAME_ID);
287
+ if (iframe && iframe.contentWindow) {
288
+ return iframe.contentWindow;
289
+ }
290
+ return null;
291
+ }
292
+ };
293
+
294
+ // src/client.ts
295
+ var DEFAULT_STATE = {
296
+ initialized: false,
297
+ loaderLoaded: false,
298
+ widgetReady: false,
299
+ visibility: "unknown"
300
+ };
301
+ var EmploriumClient = class {
302
+ constructor(config) {
303
+ this.config = config;
304
+ this.emitter = new EventBus();
305
+ this.state = { ...DEFAULT_STATE };
306
+ this.initPromise = null;
307
+ this.readyPromise = null;
308
+ this.resolveReady = null;
309
+ this.init = () => {
310
+ if (this.initPromise) {
311
+ return this.initPromise;
312
+ }
313
+ if (!this.isEnabled) {
314
+ this.logger.debug("[Emplorium SDK] Widget disabled via config");
315
+ this.initPromise = Promise.resolve();
316
+ return this.initPromise;
317
+ }
318
+ this.state.initialized = true;
319
+ this.bridge.start();
320
+ this.readyPromise = new Promise((resolve) => {
321
+ this.resolveReady = resolve;
322
+ });
323
+ this.bindBridgeEvents();
324
+ this.initPromise = (async () => {
325
+ if (this.config.autoLoad !== false) {
326
+ await ensureLoaderScript({
327
+ accountId: this.config.accountId,
328
+ scriptUrl: this.config.scriptUrl,
329
+ scriptAttributes: this.config.scriptAttributes,
330
+ logger: this.config.logger,
331
+ user: this.config.user
332
+ // Pass user identity to loader
333
+ });
334
+ this.state.loaderLoaded = true;
335
+ this.logger.debug("[Emplorium SDK] Loader script injected");
336
+ if (this.config.user) {
337
+ const { firstName, lastName, email } = this.config.user;
338
+ if (firstName || lastName || email) {
339
+ this.setUser({ firstName, lastName, email });
340
+ }
341
+ }
342
+ }
343
+ if (this.config.autoOpen) {
344
+ this.open();
345
+ }
346
+ })().catch((error) => {
347
+ this.emitter.emit("error", error);
348
+ throw error;
349
+ });
350
+ return this.initPromise;
351
+ };
352
+ this.on = (event, listener) => {
353
+ return this.emitter.on(event, listener);
354
+ };
355
+ this.off = (event, listener) => {
356
+ return this.emitter.off(event, listener);
357
+ };
358
+ this.ready = async () => {
359
+ await this.init();
360
+ return this.readyPromise || Promise.resolve();
361
+ };
362
+ this.open = () => {
363
+ this.bridge.sendToggle(true);
364
+ this.state.visibility = "open";
365
+ };
366
+ this.close = () => {
367
+ this.bridge.sendToggle(false);
368
+ this.state.visibility = "closed";
369
+ };
370
+ this.toggle = () => {
371
+ const nextOpen = this.state.visibility !== "open";
372
+ this.bridge.sendToggle(nextOpen);
373
+ this.state.visibility = nextOpen ? "open" : "closed";
374
+ };
375
+ this.setUser = (user) => {
376
+ if (!this.isEnabled)
377
+ return;
378
+ this.bridge.sendIdentify(user);
379
+ };
380
+ /**
381
+ * Enable the widget (show it). Only has effect if widget was previously disabled.
382
+ */
383
+ this.enable = () => {
384
+ if (this.isEnabled)
385
+ return;
386
+ this.isEnabled = true;
387
+ this.bridge.sendVisibility(true);
388
+ };
389
+ /**
390
+ * Disable the widget (hide it completely).
391
+ */
392
+ this.disable = () => {
393
+ if (!this.isEnabled)
394
+ return;
395
+ this.isEnabled = false;
396
+ this.bridge.sendVisibility(false);
397
+ this.state.visibility = "closed";
398
+ };
399
+ /**
400
+ * Check if the widget is currently enabled.
401
+ */
402
+ this.isWidgetEnabled = () => {
403
+ return this.isEnabled;
404
+ };
405
+ this.getState = () => {
406
+ return { ...this.state };
407
+ };
408
+ this.destroy = () => {
409
+ this.bridge.stop();
410
+ this.emitter.clear();
411
+ this.state = { ...DEFAULT_STATE };
412
+ this.initPromise = null;
413
+ this.readyPromise = null;
414
+ this.resolveReady = null;
415
+ };
416
+ this.logger = createLogger(config.logger);
417
+ this.bridge = new PostMessageBridge({ config, emitter: this.emitter });
418
+ this.isEnabled = config.enabled !== false;
419
+ this.bindApiMethods();
420
+ }
421
+ bindApiMethods() {
422
+ this.init = this.init.bind(this);
423
+ this.on = this.on.bind(this);
424
+ this.off = this.off.bind(this);
425
+ this.ready = this.ready.bind(this);
426
+ this.open = this.open.bind(this);
427
+ this.close = this.close.bind(this);
428
+ this.toggle = this.toggle.bind(this);
429
+ this.setUser = this.setUser.bind(this);
430
+ this.enable = this.enable.bind(this);
431
+ this.disable = this.disable.bind(this);
432
+ this.isWidgetEnabled = this.isWidgetEnabled.bind(this);
433
+ this.getState = this.getState.bind(this);
434
+ this.destroy = this.destroy.bind(this);
435
+ }
436
+ setVisibility(state) {
437
+ this.state.visibility = state;
438
+ }
439
+ bindBridgeEvents() {
440
+ this.emitter.on("toggle", ({ open }) => this.setVisibility(open ? "open" : "closed"));
441
+ this.emitter.on("open", () => this.setVisibility("open"));
442
+ this.emitter.on("close", () => this.setVisibility("closed"));
443
+ const markReady = () => {
444
+ var _a;
445
+ if (this.state.widgetReady)
446
+ return;
447
+ this.state.widgetReady = true;
448
+ (_a = this.resolveReady) == null ? void 0 : _a.call(this);
449
+ this.resolveReady = null;
450
+ this.emitter.emit("ready", void 0);
451
+ };
452
+ this.emitter.on("wsInitiated", markReady);
453
+ this.emitter.on("widgetSettingsLoaded", markReady);
454
+ }
455
+ };
456
+ // Annotate the CommonJS export names for ESM import in node:
457
+ 0 && (module.exports = {
458
+ EmploriumClient
459
+ });
460
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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":[]}
package/dist/index.mjs ADDED
@@ -0,0 +1,7 @@
1
+ import {
2
+ EmploriumClient
3
+ } from "./chunk-DYG422DG.mjs";
4
+ export {
5
+ EmploriumClient
6
+ };
7
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,28 @@
1
+ import React$1, { ReactNode } from 'react';
2
+ import { EmploriumConfig, EmploriumClient } from '../index.mjs';
3
+
4
+ type ProviderProps = {
5
+ config: EmploriumConfig;
6
+ children?: ReactNode;
7
+ /**
8
+ * If true, the widget will open once ready.
9
+ */
10
+ autoOpen?: boolean;
11
+ };
12
+ declare const EmploriumProvider: React$1.FC<ProviderProps>;
13
+
14
+ type WidgetProps = {
15
+ /**
16
+ * Open the widget when ready.
17
+ */
18
+ autoOpen?: boolean;
19
+ /**
20
+ * Callback when the widget signals readiness.
21
+ */
22
+ onReady?: () => void;
23
+ };
24
+ declare const EmploriumWidget: React.FC<WidgetProps>;
25
+
26
+ declare const useEmplorium: () => EmploriumClient;
27
+
28
+ export { EmploriumProvider, EmploriumWidget, useEmplorium };
@@ -0,0 +1,28 @@
1
+ import React$1, { ReactNode } from 'react';
2
+ import { EmploriumConfig, EmploriumClient } from '../index.js';
3
+
4
+ type ProviderProps = {
5
+ config: EmploriumConfig;
6
+ children?: ReactNode;
7
+ /**
8
+ * If true, the widget will open once ready.
9
+ */
10
+ autoOpen?: boolean;
11
+ };
12
+ declare const EmploriumProvider: React$1.FC<ProviderProps>;
13
+
14
+ type WidgetProps = {
15
+ /**
16
+ * Open the widget when ready.
17
+ */
18
+ autoOpen?: boolean;
19
+ /**
20
+ * Callback when the widget signals readiness.
21
+ */
22
+ onReady?: () => void;
23
+ };
24
+ declare const EmploriumWidget: React.FC<WidgetProps>;
25
+
26
+ declare const useEmplorium: () => EmploriumClient;
27
+
28
+ export { EmploriumProvider, EmploriumWidget, useEmplorium };