@blux.ai/web-sdk 2.2.5 → 2.2.7

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blux.ai/web-sdk",
3
- "version": "2.2.5",
3
+ "version": "2.2.7",
4
4
  "description": "The official Blux JavaScript browser client library",
5
5
  "main": "dist/src/index.js",
6
6
  "module": "dist/src/index.js",
@@ -1,7 +1,7 @@
1
1
  import axios from "axios";
2
2
  import ObjectId from "bson-objectid";
3
3
  import dayjs from "dayjs";
4
- import { BehaviorSubject, bufferTime, catchError, combineLatest, concatMap, debounceTime, filter, first, firstValueFrom, from, groupBy, merge, mergeMap, NEVER, Subject, switchMap, throwError, timer, timeout, map, } from "rxjs";
4
+ import { BehaviorSubject, bufferTime, catchError, combineLatest, concatMap, debounceTime, filter, first, firstValueFrom, from, groupBy, merge, mergeMap, NEVER, skip, Subject, switchMap, throwError, timer, timeout, map, } from "rxjs";
5
5
  import packageJson from "../package.json";
6
6
  import { DevicePlatform } from "./apis/APIs";
7
7
  import { createCrmEvent } from "./apis/createCrmEvent";
@@ -219,6 +219,7 @@ export class BluxClient {
219
219
  stage: this.api.defaults.baseURL === "https://api.blux.ai/prod"
220
220
  ? "prod"
221
221
  : "stg",
222
+ sdk_version: this.sdkInfo.version,
222
223
  });
223
224
  iframeElement.src = `${inapp.baseUrl}?${params.toString()}`;
224
225
  iframeElement.style.position = "fixed";
@@ -229,6 +230,15 @@ export class BluxClient {
229
230
  iframeElement.style.zIndex = "9999";
230
231
  iframeElement.id = `blux-inapp-${inapp.inappId}`;
231
232
  document.body.appendChild(iframeElement);
233
+ let urlChangeSubscription = null;
234
+ const cleanup = () => {
235
+ iframeElement.remove();
236
+ window.removeEventListener("message", handleMessage);
237
+ window.visualViewport?.removeEventListener("resize", handleViewportChange);
238
+ window.visualViewport?.removeEventListener("scroll", handleViewportChange);
239
+ urlChangeSubscription?.unsubscribe();
240
+ resolve(inapp.inappId);
241
+ };
232
242
  const handleViewportChange = () => {
233
243
  const width = window.visualViewport?.width ?? window.innerWidth;
234
244
  const height = window.visualViewport?.height ?? window.innerHeight;
@@ -240,8 +250,6 @@ export class BluxClient {
240
250
  iframeElement.style.top = `${top}px`;
241
251
  };
242
252
  const handleMessage = (event) => {
243
- if (event.origin !== new URL(inapp.baseUrl).origin)
244
- return;
245
253
  const message = event.data;
246
254
  if (message.action === "hide") {
247
255
  const { days_to_hide } = message.data;
@@ -251,33 +259,48 @@ export class BluxClient {
251
259
  }
252
260
  }
253
261
  else if (message.action === "link") {
254
- if (bluxUser) {
255
- this.enqueueRequest(() => createCrmEvent(this.api, {
262
+ // createCrmEvent 호출
263
+ const crmEventPromise = bluxUser
264
+ ? this.enqueueRequest(() => createCrmEvent(this.api, {
256
265
  application_id: this.bluxApplicationId,
257
266
  }, {
258
267
  notification_id: inapp.notificationId,
259
268
  crm_event_type: "inapp_opened",
260
269
  captured_at: new Date().toISOString(),
261
- }, this.generateApiHeader(bluxUser)));
262
- }
270
+ }, this.generateApiHeader(bluxUser)))
271
+ : Promise.resolve();
263
272
  if (message.data.is_blux_landing) {
264
273
  // TODO: @all 스키마상에는 개인화 랜딩이 존재하나, 콘솔에는 필드가 없음 -> 추후 이에 따른 핸들링이 필요함
265
274
  }
266
275
  else {
267
- if (message.data.open_in_new_tab) {
268
- window.open(message.data.url, "_blank");
276
+ const { url, open_in_new_tab, opened_by_iframe } = message.data;
277
+ const needsLocationChange = opened_by_iframe && !open_in_new_tab;
278
+ if (needsLocationChange) {
279
+ // opened_by_iframe이고 현재 탭 이동인 경우: createCrmEvent 완료 후 이동
280
+ crmEventPromise.finally(() => {
281
+ window.location.href = url;
282
+ });
269
283
  }
270
- else {
271
- window.location.href = message.data.url;
284
+ else if (!opened_by_iframe) {
285
+ // 기존 방식 (iframe에서 열지 않은 경우)
286
+ if (open_in_new_tab) {
287
+ window.open(url, "_blank");
288
+ }
289
+ else {
290
+ window.location.href = url;
291
+ }
272
292
  }
293
+ // opened_by_iframe && open_in_new_tab인 경우: iframe에서 이미 새 탭 열었으므로 스킵
273
294
  }
274
295
  }
275
- iframeElement.remove();
276
- window.removeEventListener("message", handleMessage);
277
- window.visualViewport?.removeEventListener("resize", handleViewportChange);
278
- window.visualViewport?.removeEventListener("scroll", handleViewportChange);
279
- resolve(inapp.inappId);
296
+ cleanup();
280
297
  };
298
+ // URL 변경 시 인앱메시지 닫기 (SPA 뒤로가기/앞으로가기 대응)
299
+ urlChangeSubscription = this.urlAndRef$
300
+ .pipe(filterNullable(), skip(1), first())
301
+ .subscribe(() => {
302
+ cleanup();
303
+ });
281
304
  window.visualViewport?.addEventListener("resize", handleViewportChange);
282
305
  window.visualViewport?.addEventListener("scroll", handleViewportChange);
283
306
  window.addEventListener("message", handleMessage);
@@ -1 +1 @@
1
- {"version":3,"file":"BluxClient.js","sourceRoot":"/","sources":["src/BluxClient.ts"],"names":[],"mappings":"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","sourcesContent":["import axios from \"axios\";\nimport ObjectId from \"bson-objectid\";\nimport dayjs from \"dayjs\";\nimport {\n BehaviorSubject,\n bufferTime,\n catchError,\n combineLatest,\n concatMap,\n debounceTime,\n filter,\n first,\n firstValueFrom,\n from,\n groupBy,\n merge,\n mergeMap,\n NEVER,\n Subject,\n switchMap,\n throwError,\n timer,\n timeout,\n map,\n} from \"rxjs\";\n\nimport packageJson from \"../package.json\";\nimport { DevicePlatform, type APIs } from \"./apis/APIs\";\nimport { createCrmEvent } from \"./apis/createCrmEvent\";\nimport { collectEvent } from \"./apis/createEvent\";\nimport { getItemRecommendations } from \"./apis/getItemRecommendations\";\nimport { initialize } from \"./apis/initialize\";\nimport { notificationsUpdate } from \"./apis/notificationsUpdate\";\nimport { signIn } from \"./apis/signIn\";\nimport { signOut } from \"./apis/signOut\";\nimport { updateProperties } from \"./apis/updateProperties\";\nimport { Bridge, BridgePlatform } from \"./bridges/Bridge\";\nimport { FlutterBridge } from \"./bridges/FlutterBridge\";\nimport { RNBridge } from \"./bridges/RNBridge\";\nimport { BLUX_ATTRIBUTES } from \"./constants/BLUX_ATTRIBUTES\";\nimport {\n AddClickEvent,\n AddPageVisitEvent,\n AddSectionViewEvent,\n VisitEvent,\n} from \"./events\";\nimport { LocalStorage } from \"./utils/LocalStorage\";\nimport { Logger } from \"./utils/Logger\";\nimport { onlineAndVisible$ } from \"./utils/observables\";\nimport { filterNullable } from \"./utils/operators\";\nimport { SessionStorage } from \"./utils/SessionStorage\";\n\nimport type { Event as BluxEvent } from \"./events/Event\";\nimport type { EventRequest } from \"./events/types\";\nimport type { CategoryRec, ItemRec, ItemsRec, UserRec } from \"./recs\";\nimport type { LogLevel } from \"./utils/Logger\";\nimport type { AxiosInstance } from \"axios\";\n\nexport type SdkInfo = {\n type: DevicePlatform;\n version: string;\n};\n\ntype BluxUser = {\n id: string;\n bluxAPIKey: string;\n applicationId: string;\n deviceId: string;\n userId?: string;\n};\n\ntype BridgeOptions =\n | {\n /**\n * @deprecated `bridgePlatform`을 사용하세요.\n */\n useRNBridge?: boolean;\n }\n | { bridgePlatform?: BridgePlatform };\n\ntype InappMessageResponse = NonNullable<\n APIs.bluxUsersCollectEventsV2.ResponseData[\"inapp\"]\n>;\n\ntype ApiRequestQueueJob<T> = {\n action: () => Promise<T>;\n resolve: (value: T) => void;\n reject: (error: unknown) => void;\n};\n\ntype UserPropertiesQueueItem = {\n userProperties?: APIs.bluxUsersUpdateProperties.Body[\"user_properties\"];\n customUserProperties?: APIs.bluxUsersUpdateProperties.Body[\"custom_user_properties\"];\n resolve: () => void;\n reject: (error: unknown) => void;\n};\n\nexport class BluxClient {\n private readonly api: AxiosInstance = axios.create();\n\n private readonly sdkInfo: SdkInfo = {\n type: DevicePlatform.browser,\n version: packageJson.version,\n };\n\n public readonly bluxUser$ = new BehaviorSubject<BluxUser | undefined>(\n undefined,\n );\n\n /**\n * 내부 async 작업을 1개씩 직렬로 처리하는 큐입니다.\n * `enqueueRequest()`로 넣으면, 호출자는 완료 시점까지 `await` 할 수 있습니다.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public readonly apiRequestQueue$ = new Subject<ApiRequestQueueJob<any>>();\n public readonly inappQueue$ = new BehaviorSubject<\n InappMessageResponse | undefined\n >(undefined);\n public readonly eventQueue$ = new Subject<EventRequest>();\n public readonly userPropertiesQueue$ = new Subject<UserPropertiesQueueItem>();\n\n private readonly INITIAL_NEXT_POLL_DELAY_MS = 10 * 1000;\n private readonly nextPollDelayMs$ = new BehaviorSubject<number | null>(\n this.INITIAL_NEXT_POLL_DELAY_MS,\n );\n private cachedNextPollDelayMs: number | null =\n this.INITIAL_NEXT_POLL_DELAY_MS;\n private lastPollTimestamp: number = Date.now();\n\n private readonly bluxApplicationId: string;\n private readonly bluxAPIKey: string;\n\n private readonly bridge: Bridge | null;\n\n // Impression 관련 변수\n private impressedElements: Element[] = [];\n private intersectionObservingElements: Element[] = [];\n private readonly intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n this.intersectionEntry$.next(entry);\n });\n },\n );\n\n private readonly intersectionEntry$ =\n new Subject<IntersectionObserverEntry>();\n\n // Hit 관련 변수\n private hitElements: Element[] = [];\n\n private resolveBridge(bridgeOptions: BridgeOptions): Bridge | null {\n if (\"useRNBridge\" in bridgeOptions && bridgeOptions.useRNBridge) {\n return new RNBridge();\n }\n\n if (\"bridgePlatform\" in bridgeOptions && bridgeOptions.bridgePlatform) {\n switch (bridgeOptions.bridgePlatform) {\n case \"none\":\n return null;\n case \"react-native\":\n return new RNBridge();\n case \"flutter\":\n return new FlutterBridge();\n default: {\n const exhaustiveCheck: never = bridgeOptions.bridgePlatform;\n Logger.error(`Unknown bridge platform: ${exhaustiveCheck}`, {\n tags: { from: \"resolveBridge\" },\n });\n }\n }\n }\n\n return null;\n }\n\n constructor(\n {\n bluxApplicationId,\n bluxAPIKey,\n ...bridgeOptions\n }: {\n bluxApplicationId: string;\n bluxAPIKey: string;\n } & BridgeOptions,\n completionCallback?: (args: {\n errorMessage?: string;\n success: boolean;\n }) => void,\n ) {\n this.bluxApplicationId = bluxApplicationId;\n this.bluxAPIKey = bluxAPIKey;\n\n const baseUrl = window?._BLUX_SDK_?.baseUrl ?? \"https://api.blux.ai/prod\";\n this.api.defaults.baseURL = baseUrl;\n\n this.bridge = this.resolveBridge(bridgeOptions);\n\n // api 요청 항상 하나씩 처리\n this.apiRequestQueue$\n .pipe(\n concatMap(async (job) => {\n try {\n const result = await job.action();\n job.resolve(result);\n } catch (error) {\n job.reject(error);\n }\n }),\n )\n .subscribe();\n\n /**\n * (1) 보내야할 이벤트를 100ms씩 뭉쳐서 보내고, 1개 이상 쌓여있을 때 api 요청\n * (2) collectEvent의 응답에서 온 nextPollDelayMs 값 만큼 이후에 빈 배열로 api 요청 (1)로 보내면 초기화됨\n */\n\n if (!this.bridge) {\n merge(\n this.eventQueue$.pipe(\n bufferTime(100),\n filter((requests) => requests.length > 0),\n ),\n // onlineAndVisible일 때만 polling, 남은 시간 계산하여 타이머 시작\n combineLatest([this.nextPollDelayMs$, onlineAndVisible$]).pipe(\n switchMap(([delay, isOnlineAndVisible]) => {\n if (!isOnlineAndVisible || delay == null) return NEVER;\n\n const targetTime = this.lastPollTimestamp + delay;\n const remainingDelay = Math.max(0, targetTime - Date.now());\n\n return timer(remainingDelay);\n }),\n map(() => [] as EventRequest[]),\n ),\n )\n .pipe(\n concatMap(async (requests) => {\n this.nextPollDelayMs$.next(null);\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n\n const events = requests.map((request) => ({\n ...request,\n blux_id: bluxUser.id,\n device_id: bluxUser.deviceId,\n }));\n\n const {\n data: { nextPollDelayMs, inapp },\n } = await this.enqueueRequest(() =>\n collectEvent(\n this.api,\n {\n blux_user_id: bluxUser.id,\n application_id: bluxUser.applicationId,\n },\n {\n device_id: bluxUser.deviceId,\n events,\n },\n this.generateApiHeader(bluxUser),\n ),\n );\n\n this.lastPollTimestamp = Date.now();\n this.cachedNextPollDelayMs = nextPollDelayMs;\n this.nextPollDelayMs$.next(Math.max(nextPollDelayMs, 3000));\n\n if (inapp) {\n this.inappQueue$.next(inapp);\n }\n } catch (error) {\n Logger.error(error, { tags: { from: \"eventQueue\" } });\n this.lastPollTimestamp = Date.now();\n if (this.cachedNextPollDelayMs !== null) {\n const nextPollDelay =\n this.cachedNextPollDelayMs > 1000 * 60 * 60 * 24\n ? this.cachedNextPollDelayMs\n : this.cachedNextPollDelayMs * 2;\n this.cachedNextPollDelayMs = nextPollDelay;\n this.nextPollDelayMs$.next(nextPollDelay);\n }\n }\n }),\n )\n .subscribe();\n }\n\n // api 호출 수 절감을 위해 100ms씩 뭉쳐서 보내고, custom_user_properties와 user_properties를 합쳐서 보냄\n this.userPropertiesQueue$\n .pipe(\n bufferTime(100),\n filter((items) => items.length > 0),\n concatMap(async (items) => {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n\n const mergedUserProperties = items.reduce(\n (acc, item) => ({ ...acc, ...(item.userProperties ?? {}) }),\n {} as NonNullable<\n APIs.bluxUsersUpdateProperties.Body[\"user_properties\"]\n >,\n );\n\n const mergedCustomUserProperties = items.reduce(\n (acc, item) => ({ ...acc, ...(item.customUserProperties ?? {}) }),\n {} as NonNullable<\n APIs.bluxUsersUpdateProperties.Body[\"custom_user_properties\"]\n >,\n );\n\n const payload: APIs.bluxUsersUpdateProperties.Body = {};\n if (Object.keys(mergedUserProperties).length > 0) {\n payload.user_properties = mergedUserProperties;\n }\n if (Object.keys(mergedCustomUserProperties).length > 0) {\n payload.custom_user_properties = mergedCustomUserProperties;\n }\n\n if (Object.keys(payload).length === 0) {\n items.forEach((item) => item.resolve());\n return;\n }\n\n await this.enqueueRequest(() =>\n updateProperties(\n this.api,\n {\n application_id: bluxUser.applicationId,\n blux_user_id: bluxUser.id,\n },\n payload,\n this.generateApiHeader(bluxUser),\n ),\n );\n\n items.forEach((item) => item.resolve());\n } catch (error) {\n items.forEach((item) => item.reject(error));\n Logger.error(error, { tags: { from: \"userPropertiesQueue\" } });\n }\n }),\n )\n .subscribe();\n\n this.bluxUser$.subscribe((bluxUser) => {\n if (bluxUser) SessionStorage.setBluxUserId(bluxUser.id);\n });\n\n if (!this.bridge) {\n this.inappQueue$\n .pipe(filterNullable())\n .pipe(\n concatMap((inapp) =>\n onlineAndVisible$.pipe(\n first(Boolean),\n concatMap(() => from(this.displayInapp(inapp))),\n ),\n ),\n )\n .subscribe();\n }\n\n this.init()\n .then(() => {\n completionCallback?.({ success: true });\n })\n .catch((error) => {\n completionCallback?.({ success: false, errorMessage: error.message });\n });\n }\n\n private async enqueueRequest<T>(action: () => Promise<T>) {\n return new Promise<T>((resolve, reject) => {\n const item: ApiRequestQueueJob<T> = { action, resolve, reject };\n this.apiRequestQueue$.next(item);\n });\n }\n\n private generateApiHeader({ bluxAPIKey }: { bluxAPIKey: string }) {\n return {\n Authorization: bluxAPIKey,\n };\n }\n\n private async displayInapp(inapp: InappMessageResponse) {\n return new Promise((resolve) => {\n const bluxUser = this.bluxUser$.getValue();\n\n const hideTimestamp = LocalStorage.getInappHideTimestamp(inapp.inappId);\n const isShouldSkip =\n hideTimestamp !== null && dayjs().isBefore(dayjs(hideTimestamp));\n\n if (isShouldSkip) return resolve(true);\n\n const iframeElement = document.createElement(\"iframe\");\n\n const params = new URLSearchParams({\n inapp_id: inapp.inappId,\n application_id: this.bluxApplicationId,\n stage:\n this.api.defaults.baseURL === \"https://api.blux.ai/prod\"\n ? \"prod\"\n : \"stg\",\n });\n\n iframeElement.src = `${inapp.baseUrl}?${params.toString()}`;\n iframeElement.style.position = \"fixed\";\n iframeElement.style.width = `${window.innerWidth}px`;\n iframeElement.style.height = `${window.innerHeight}px`;\n iframeElement.style.top = \"0\";\n iframeElement.style.left = \"0\";\n\n iframeElement.style.zIndex = \"9999\";\n iframeElement.id = `blux-inapp-${inapp.inappId}`;\n\n document.body.appendChild(iframeElement);\n\n const handleViewportChange = () => {\n const width = window.visualViewport?.width ?? window.innerWidth;\n const height = window.visualViewport?.height ?? window.innerHeight;\n const left = window.visualViewport?.offsetLeft ?? 0;\n const top = window.visualViewport?.offsetTop ?? 0;\n\n iframeElement.style.width = `${width}px`;\n iframeElement.style.height = `${height}px`;\n iframeElement.style.left = `${left}px`;\n iframeElement.style.top = `${top}px`;\n };\n\n const handleMessage = (\n event: MessageEvent<\n | {\n action: \"hide\";\n data: {\n days_to_hide: number;\n };\n }\n | {\n action: \"link\";\n data:\n | {\n is_blux_landing: false;\n url: string;\n open_in_new_tab: boolean;\n }\n | {\n is_blux_landing: true;\n landing_id: string;\n };\n }\n >,\n ) => {\n if (event.origin !== new URL(inapp.baseUrl).origin) return;\n const message = event.data;\n\n if (message.action === \"hide\") {\n const { days_to_hide } = message.data;\n if (days_to_hide !== 0) {\n const expiresAt = dayjs().add(days_to_hide, \"days\").valueOf();\n LocalStorage.setInappHideTimestamp(inapp.inappId, expiresAt);\n }\n } else if (message.action === \"link\") {\n if (bluxUser) {\n this.enqueueRequest(() =>\n createCrmEvent(\n this.api,\n {\n application_id: this.bluxApplicationId,\n },\n {\n notification_id: inapp.notificationId,\n crm_event_type: \"inapp_opened\",\n captured_at: new Date().toISOString(),\n },\n this.generateApiHeader(bluxUser),\n ),\n );\n }\n\n if (message.data.is_blux_landing) {\n // TODO: @all 스키마상에는 개인화 랜딩이 존재하나, 콘솔에는 필드가 없음 -> 추후 이에 따른 핸들링이 필요함\n } else {\n if (message.data.open_in_new_tab) {\n window.open(message.data.url, \"_blank\");\n } else {\n window.location.href = message.data.url;\n }\n }\n }\n\n iframeElement.remove();\n window.removeEventListener(\"message\", handleMessage);\n window.visualViewport?.removeEventListener(\n \"resize\",\n handleViewportChange,\n );\n window.visualViewport?.removeEventListener(\n \"scroll\",\n handleViewportChange,\n );\n resolve(inapp.inappId);\n };\n\n window.visualViewport?.addEventListener(\"resize\", handleViewportChange);\n window.visualViewport?.addEventListener(\"scroll\", handleViewportChange);\n window.addEventListener(\"message\", handleMessage);\n\n if (bluxUser) {\n this.enqueueRequest(() =>\n notificationsUpdate(\n this.api,\n {\n application_id: this.bluxApplicationId,\n notification_id: inapp.notificationId,\n },\n {\n status: \"received\",\n },\n this.generateApiHeader(bluxUser),\n ),\n );\n }\n });\n }\n\n private async init() {\n this.handleUrlAndRef();\n // handle page visit event\n this.urlAndRef$.pipe(filterNullable()).subscribe(() => {\n this.sendEvent(new AddPageVisitEvent({}));\n });\n\n if (this.bridge) {\n this.bridge.initialize({\n bluxApplicationId: this.bluxApplicationId,\n bluxAPIKey: this.bluxAPIKey,\n });\n return;\n }\n\n const blux_user_id = new URLSearchParams(window.location.search).get(\n \"blux_user_id\",\n );\n const sessionId =\n SessionStorage.getSessionId() ?? new ObjectId().toHexString();\n SessionStorage.setSessionId(sessionId);\n\n const isBluxUserIdExistInSessionStorage = SessionStorage.getBluxUserId();\n if (!isBluxUserIdExistInSessionStorage) this.sendEvent(new VisitEvent({}));\n\n Logger.debug(`Init with application id: ${this.bluxApplicationId}`);\n\n const deviceId = LocalStorage.getDeviceId();\n\n if (!deviceId) {\n Logger.debug(\"No saved Device ID, register a new one.\");\n }\n\n this.registerHitTracker();\n\n // 페이지 이동 시 추천 지표 수집 관련 변수 초기화\n this.urlAndRef$.pipe(filterNullable()).subscribe(() => {\n this.impressedElements = [];\n });\n\n this.registerImpressionTracker();\n new MutationObserver(() => {\n this.registerImpressionTracker();\n }).observe(document, { subtree: true, childList: true });\n\n // 500ms 연속으로 엘리먼트 들어있으면 추천 지표 수집\n const MIN_IMPRESSION_TIME = 500;\n this.intersectionEntry$\n .pipe(\n groupBy((entry) => entry.target),\n mergeMap((group$) =>\n group$.pipe(\n debounceTime(MIN_IMPRESSION_TIME),\n filter((entry) => entry.isIntersecting),\n ),\n ),\n )\n .subscribe((entry) => {\n const trackingId = entry.target.getAttribute(\n BLUX_ATTRIBUTES.tracking_id,\n );\n if (!trackingId) {\n Logger.warning(\n `Tracking ID is not found in the parent elements. Please check the tracking ID(${BLUX_ATTRIBUTES.tracking_id}) is set correctly.`,\n );\n return;\n }\n if (this.impressedElements.includes(entry.target)) return;\n\n this.sendEvent(\n new AddSectionViewEvent({\n section: trackingId,\n tracking: {\n id: trackingId,\n type: \"impression\",\n },\n }),\n );\n this.impressedElements.push(entry.target);\n });\n\n const { data } = await initialize(\n this.api,\n { application_id: this.bluxApplicationId },\n {\n session_id: sessionId ?? undefined,\n device_id: deviceId ?? undefined,\n country_code: navigator.language.split(\"-\")[1],\n device_model: navigator.userAgent,\n language_code: navigator.language.split(\"-\")[0],\n platform: DevicePlatform.browser,\n os_version: navigator.userAgent,\n sdk_version: this.sdkInfo.version,\n sdk_type: this.sdkInfo.type,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n blux_user_id: blux_user_id ?? undefined,\n },\n this.generateApiHeader({\n bluxAPIKey: this.bluxAPIKey,\n }),\n );\n\n if (data.device_id) LocalStorage.setDeviceId(data.device_id);\n\n this.bluxUser$.next({\n id: data.blux_user_id,\n bluxAPIKey: this.bluxAPIKey,\n applicationId: this.bluxApplicationId,\n deviceId: data.device_id,\n });\n }\n\n public setLogLevel(logLevel: LogLevel) {\n Logger.setLevel(logLevel);\n }\n\n private async getBluxUserWithTimeout() {\n const bluxUser = await firstValueFrom(\n this.bluxUser$.pipe(\n filterNullable(),\n timeout(5000),\n catchError((error) => {\n return throwError(() =>\n error.name === \"TimeoutError\"\n ? new Error(\n \"Application ID is not initialized. Please initialize BluxClient.\",\n )\n : error,\n );\n }),\n ),\n );\n\n return bluxUser;\n }\n\n public async signIn({ userId }: { userId: string }) {\n try {\n if (this.bridge) {\n this.bridge.signIn({ userId });\n return;\n }\n\n const bluxUser = await this.getBluxUserWithTimeout();\n\n const {\n data: { blux_user_id: bluxIdInResponse },\n } = await this.enqueueRequest(() =>\n signIn(\n this.api,\n { application_id: bluxUser.applicationId, blux_user_id: bluxUser.id },\n { user_id: userId, device_id: bluxUser.deviceId },\n this.generateApiHeader(bluxUser),\n ),\n );\n\n if (bluxIdInResponse !== bluxUser.id) {\n Logger.debug(\"Blux id is changed in signIn.\");\n this.bluxUser$.next({\n ...bluxUser,\n id: bluxIdInResponse,\n userId,\n });\n }\n } catch (error) {\n Logger.error(error, { tags: { from: \"signIn\" } });\n }\n }\n\n public async signOut() {\n try {\n if (this.bridge) {\n this.bridge.signOut();\n return;\n }\n\n const bluxUser = await this.getBluxUserWithTimeout();\n\n const {\n data: { blux_user_id: bluxIdInResponse },\n } = await this.enqueueRequest(() =>\n signOut(\n this.api,\n { application_id: bluxUser.applicationId, blux_user_id: bluxUser.id },\n { device_id: bluxUser.deviceId },\n this.generateApiHeader(bluxUser),\n ),\n );\n\n Logger.debug(\"Blux id is changed in signOut.\");\n this.bluxUser$.next({\n ...bluxUser,\n id: bluxIdInResponse,\n userId: undefined,\n });\n } catch (error) {\n Logger.error(error, { tags: { from: \"signOut\" } });\n }\n }\n\n public async setUserProperties({\n userProperties,\n }: {\n userProperties: NonNullable<\n APIs.bluxUsersUpdateProperties.Body[\"user_properties\"]\n >;\n }) {\n try {\n if (this.bridge) {\n this.bridge.setUserProperties(userProperties);\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n this.userPropertiesQueue$.next({\n userProperties,\n resolve,\n reject,\n });\n });\n } catch (error) {\n Logger.error(error, { tags: { from: \"setUserProperties\" } });\n }\n }\n\n public async setCustomUserProperties({\n customUserProperties,\n }: {\n customUserProperties: NonNullable<\n APIs.bluxUsersUpdateProperties.Body[\"custom_user_properties\"]\n >;\n }) {\n try {\n if (this.bridge) {\n this.bridge.setCustomUserProperties(customUserProperties);\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n this.userPropertiesQueue$.next({\n customUserProperties,\n resolve,\n reject,\n });\n });\n } catch (error) {\n Logger.error(error, { tags: { from: \"setCustomUserProperties\" } });\n }\n }\n\n public sendEvent(event: BluxEvent | BluxEvent[]) {\n try {\n const requests = (Array.isArray(event) ? event : [event]).map((e) => ({\n ...e.request,\n internal_event_properties: {\n url: this.urlAndRef$.value?.url,\n ref: this.urlAndRef$.value?.ref,\n },\n }));\n\n if (this.bridge) {\n this.bridge.sendEvent({ requests });\n return;\n }\n\n requests.forEach((request) => {\n this.eventQueue$.next(request);\n });\n } catch (error) {\n Logger.error(error, { tags: { from: \"sendEvent\" } });\n }\n }\n\n private urlAndRef$ = new BehaviorSubject<\n { url: string; ref: string | undefined } | undefined\n >(undefined);\n\n private handleUrlAndRef() {\n // set url and ref to local storage\n this.urlAndRef$.pipe(filterNullable()).subscribe(({ url, ref }) => {\n if (ref) {\n LocalStorage.setRef(ref);\n }\n LocalStorage.setUrl(url);\n });\n // init url and ref from local storage\n this.urlAndRef$.next({\n url: window.location.href,\n ref: LocalStorage.getUrl() ?? undefined,\n });\n\n // observe url change\n const handleUrlChange = () => {\n const prevUrl = this.urlAndRef$.value?.url;\n const currentUrl = window.location.href;\n if (prevUrl !== currentUrl) {\n this.urlAndRef$.next({\n url: currentUrl,\n ref: prevUrl ?? undefined,\n });\n }\n };\n\n // SPA: popstate (뒤로가기/앞으로가기)\n window.addEventListener(\"popstate\", handleUrlChange);\n // 현재 브라우저에는 URL상태를 추적하기 위한 리스너가 존재하지 않습니다.\n // 그래서 pushState와 replaceState를 직접 수정하여 추적합니다.\n // @reference https://stackoverflow.com/a/64927639\n // @reference https://github.com/amplitude/Amplitude-TypeScript/blob/main/packages/plugin-page-view-tracking-browser/src/page-view-tracking.ts\n // SPA: pushState/replaceState proxy\n history.pushState = new Proxy(history.pushState, {\n apply: (target, thisArg, [state, unused, url]) => {\n target.apply(thisArg, [state, unused, url]);\n handleUrlChange();\n },\n });\n history.replaceState = new Proxy(history.replaceState, {\n apply: (target, thisArg, [state, unused, url]) => {\n target.apply(thisArg, [state, unused, url]);\n handleUrlChange();\n },\n });\n }\n\n private registerImpressionTracker() {\n const targetElements = Array.from(\n document.querySelectorAll(`[${BLUX_ATTRIBUTES.tracking_id}]`),\n );\n\n const removed = this.intersectionObservingElements.filter(\n (e) => !targetElements.includes(e),\n );\n\n removed.forEach((e) => {\n this.intersectionObserver.unobserve(e);\n });\n\n const added = targetElements.filter(\n (element) => !this.intersectionObservingElements.includes(element),\n );\n\n added.forEach((element) => {\n this.intersectionObserver.observe(element);\n });\n\n this.intersectionObservingElements = targetElements;\n }\n\n private registerHitTracker() {\n const handleDelegatedClick = (event: Event) => {\n if (!(event.target instanceof Element)) return;\n\n const eventTarget = event.target;\n\n const targetItemElement = eventTarget.closest(\n `[${BLUX_ATTRIBUTES.item_id}]`,\n );\n if (!targetItemElement) return;\n\n const itemId = targetItemElement.getAttribute(BLUX_ATTRIBUTES.item_id);\n if (!itemId) return;\n\n const targetSectionElement = eventTarget.closest(\n `[${BLUX_ATTRIBUTES.tracking_id}]`,\n );\n const trackingId = targetSectionElement?.getAttribute(\n BLUX_ATTRIBUTES.tracking_id,\n );\n if (!trackingId) {\n Logger.warning(\n `Tracking ID is not found in the parent elements. Please check the tracking ID(${BLUX_ATTRIBUTES.tracking_id}) is set correctly.`,\n );\n return;\n }\n\n if (!this.hitElements.includes(targetItemElement)) {\n this.sendEvent(\n new AddClickEvent({\n itemId,\n tracking: {\n id: trackingId,\n type: \"hit\",\n },\n }),\n );\n this.hitElements.push(targetItemElement);\n }\n };\n document.addEventListener(\"click\", handleDelegatedClick);\n this.urlAndRef$.pipe(filterNullable()).subscribe(() => {\n this.hitElements = [];\n });\n }\n\n public async getUserRec(\n rec: UserRec,\n ): Promise<APIs.bluxUsersGetItemRecommendationsV2.ResponseData> {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n const recRequest = rec.request;\n\n const recommendationResponse = await getItemRecommendations(\n this.api,\n {\n application_id: bluxUser.applicationId,\n blux_user_id: bluxUser.id,\n },\n {\n call_type: recRequest.call_type,\n limit: recRequest.limit,\n offset: recRequest.offset,\n },\n this.generateApiHeader(bluxUser),\n );\n\n return recommendationResponse.data;\n } catch (error) {\n Logger.error(error, { tags: { from: \"getItemRecommendations\" } });\n return {\n item_ids: [],\n metadata: {},\n recommendation_id: null,\n };\n }\n }\n\n public async getItemRec(\n rec: ItemRec,\n ): Promise<APIs.bluxUsersGetItemRecommendationsV2.ResponseData> {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n const recRequest = rec.request;\n\n const recommendationResponse = await getItemRecommendations(\n this.api,\n {\n application_id: bluxUser.applicationId,\n blux_user_id: bluxUser.id,\n },\n {\n call_type: recRequest.call_type,\n limit: recRequest.limit,\n offset: recRequest.offset,\n item_id: recRequest.item_id,\n },\n this.generateApiHeader(bluxUser),\n );\n\n return recommendationResponse.data;\n } catch (error) {\n Logger.error(error, { tags: { from: \"getItemRecommendations\" } });\n return {\n item_ids: [],\n metadata: {},\n recommendation_id: null,\n };\n }\n }\n\n public async getItemsRec(\n rec: ItemsRec,\n ): Promise<APIs.bluxUsersGetItemRecommendationsV2.ResponseData> {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n const recRequest = rec.request;\n\n const recommendationResponse = await getItemRecommendations(\n this.api,\n {\n application_id: bluxUser.applicationId,\n blux_user_id: bluxUser.id,\n },\n {\n call_type: recRequest.call_type,\n limit: recRequest.limit,\n offset: recRequest.offset,\n item_ids: recRequest.item_ids,\n },\n this.generateApiHeader(bluxUser),\n );\n\n return recommendationResponse.data;\n } catch (error) {\n Logger.error(error, { tags: { from: \"getItemRecommendations\" } });\n return {\n item_ids: [],\n metadata: {},\n recommendation_id: null,\n };\n }\n }\n\n public async getCategoryRec(\n rec: CategoryRec,\n ): Promise<APIs.bluxUsersGetItemRecommendationsV2.ResponseData> {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n const recRequest = rec.request;\n\n const recommendationResponse = await getItemRecommendations(\n this.api,\n {\n application_id: bluxUser.applicationId,\n blux_user_id: bluxUser.id,\n },\n {\n call_type: recRequest.call_type,\n limit: recRequest.limit,\n offset: recRequest.offset,\n category_id: recRequest.category_id,\n },\n this.generateApiHeader(bluxUser),\n );\n\n return recommendationResponse.data;\n } catch (error) {\n Logger.error(error, { tags: { from: \"getItemRecommendations\" } });\n return {\n item_ids: [],\n metadata: {},\n recommendation_id: null,\n };\n }\n }\n}\n"]}
1
+ {"version":3,"file":"BluxClient.js","sourceRoot":"/","sources":["src/BluxClient.ts"],"names":[],"mappings":"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","sourcesContent":["import axios from \"axios\";\nimport ObjectId from \"bson-objectid\";\nimport dayjs from \"dayjs\";\nimport {\n BehaviorSubject,\n bufferTime,\n catchError,\n combineLatest,\n concatMap,\n debounceTime,\n filter,\n first,\n firstValueFrom,\n from,\n groupBy,\n merge,\n mergeMap,\n NEVER,\n skip,\n Subject,\n Subscription,\n switchMap,\n throwError,\n timer,\n timeout,\n map,\n} from \"rxjs\";\n\nimport packageJson from \"../package.json\";\nimport { DevicePlatform, type APIs } from \"./apis/APIs\";\nimport { createCrmEvent } from \"./apis/createCrmEvent\";\nimport { collectEvent } from \"./apis/createEvent\";\nimport { getItemRecommendations } from \"./apis/getItemRecommendations\";\nimport { initialize } from \"./apis/initialize\";\nimport { notificationsUpdate } from \"./apis/notificationsUpdate\";\nimport { signIn } from \"./apis/signIn\";\nimport { signOut } from \"./apis/signOut\";\nimport { updateProperties } from \"./apis/updateProperties\";\nimport { Bridge, BridgePlatform } from \"./bridges/Bridge\";\nimport { FlutterBridge } from \"./bridges/FlutterBridge\";\nimport { RNBridge } from \"./bridges/RNBridge\";\nimport { BLUX_ATTRIBUTES } from \"./constants/BLUX_ATTRIBUTES\";\nimport {\n AddClickEvent,\n AddPageVisitEvent,\n AddSectionViewEvent,\n VisitEvent,\n} from \"./events\";\nimport { LocalStorage } from \"./utils/LocalStorage\";\nimport { Logger } from \"./utils/Logger\";\nimport { onlineAndVisible$ } from \"./utils/observables\";\nimport { filterNullable } from \"./utils/operators\";\nimport { SessionStorage } from \"./utils/SessionStorage\";\n\nimport type { Event as BluxEvent } from \"./events/Event\";\nimport type { EventRequest } from \"./events/types\";\nimport type { CategoryRec, ItemRec, ItemsRec, UserRec } from \"./recs\";\nimport type { LogLevel } from \"./utils/Logger\";\nimport type { AxiosInstance } from \"axios\";\n\nexport type SdkInfo = {\n type: DevicePlatform;\n version: string;\n};\n\ntype BluxUser = {\n id: string;\n bluxAPIKey: string;\n applicationId: string;\n deviceId: string;\n userId?: string;\n};\n\ntype BridgeOptions =\n | {\n /**\n * @deprecated `bridgePlatform`을 사용하세요.\n */\n useRNBridge?: boolean;\n }\n | { bridgePlatform?: BridgePlatform };\n\ntype InappMessageResponse = NonNullable<\n APIs.bluxUsersCollectEventsV2.ResponseData[\"inapp\"]\n>;\n\ntype ApiRequestQueueJob<T> = {\n action: () => Promise<T>;\n resolve: (value: T) => void;\n reject: (error: unknown) => void;\n};\n\ntype UserPropertiesQueueItem = {\n userProperties?: APIs.bluxUsersUpdateProperties.Body[\"user_properties\"];\n customUserProperties?: APIs.bluxUsersUpdateProperties.Body[\"custom_user_properties\"];\n resolve: () => void;\n reject: (error: unknown) => void;\n};\n\nexport class BluxClient {\n private readonly api: AxiosInstance = axios.create();\n\n private readonly sdkInfo: SdkInfo = {\n type: DevicePlatform.browser,\n version: packageJson.version,\n };\n\n public readonly bluxUser$ = new BehaviorSubject<BluxUser | undefined>(\n undefined,\n );\n\n /**\n * 내부 async 작업을 1개씩 직렬로 처리하는 큐입니다.\n * `enqueueRequest()`로 넣으면, 호출자는 완료 시점까지 `await` 할 수 있습니다.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public readonly apiRequestQueue$ = new Subject<ApiRequestQueueJob<any>>();\n public readonly inappQueue$ = new BehaviorSubject<\n InappMessageResponse | undefined\n >(undefined);\n public readonly eventQueue$ = new Subject<EventRequest>();\n public readonly userPropertiesQueue$ = new Subject<UserPropertiesQueueItem>();\n\n private readonly INITIAL_NEXT_POLL_DELAY_MS = 10 * 1000;\n private readonly nextPollDelayMs$ = new BehaviorSubject<number | null>(\n this.INITIAL_NEXT_POLL_DELAY_MS,\n );\n private cachedNextPollDelayMs: number | null =\n this.INITIAL_NEXT_POLL_DELAY_MS;\n private lastPollTimestamp: number = Date.now();\n\n private readonly bluxApplicationId: string;\n private readonly bluxAPIKey: string;\n\n private readonly bridge: Bridge | null;\n\n // Impression 관련 변수\n private impressedElements: Element[] = [];\n private intersectionObservingElements: Element[] = [];\n private readonly intersectionObserver = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n this.intersectionEntry$.next(entry);\n });\n },\n );\n\n private readonly intersectionEntry$ =\n new Subject<IntersectionObserverEntry>();\n\n // Hit 관련 변수\n private hitElements: Element[] = [];\n\n private resolveBridge(bridgeOptions: BridgeOptions): Bridge | null {\n if (\"useRNBridge\" in bridgeOptions && bridgeOptions.useRNBridge) {\n return new RNBridge();\n }\n\n if (\"bridgePlatform\" in bridgeOptions && bridgeOptions.bridgePlatform) {\n switch (bridgeOptions.bridgePlatform) {\n case \"none\":\n return null;\n case \"react-native\":\n return new RNBridge();\n case \"flutter\":\n return new FlutterBridge();\n default: {\n const exhaustiveCheck: never = bridgeOptions.bridgePlatform;\n Logger.error(`Unknown bridge platform: ${exhaustiveCheck}`, {\n tags: { from: \"resolveBridge\" },\n });\n }\n }\n }\n\n return null;\n }\n\n constructor(\n {\n bluxApplicationId,\n bluxAPIKey,\n ...bridgeOptions\n }: {\n bluxApplicationId: string;\n bluxAPIKey: string;\n } & BridgeOptions,\n completionCallback?: (args: {\n errorMessage?: string;\n success: boolean;\n }) => void,\n ) {\n this.bluxApplicationId = bluxApplicationId;\n this.bluxAPIKey = bluxAPIKey;\n\n const baseUrl = window?._BLUX_SDK_?.baseUrl ?? \"https://api.blux.ai/prod\";\n this.api.defaults.baseURL = baseUrl;\n\n this.bridge = this.resolveBridge(bridgeOptions);\n\n // api 요청 항상 하나씩 처리\n this.apiRequestQueue$\n .pipe(\n concatMap(async (job) => {\n try {\n const result = await job.action();\n job.resolve(result);\n } catch (error) {\n job.reject(error);\n }\n }),\n )\n .subscribe();\n\n /**\n * (1) 보내야할 이벤트를 100ms씩 뭉쳐서 보내고, 1개 이상 쌓여있을 때 api 요청\n * (2) collectEvent의 응답에서 온 nextPollDelayMs 값 만큼 이후에 빈 배열로 api 요청 (1)로 보내면 초기화됨\n */\n\n if (!this.bridge) {\n merge(\n this.eventQueue$.pipe(\n bufferTime(100),\n filter((requests) => requests.length > 0),\n ),\n // onlineAndVisible일 때만 polling, 남은 시간 계산하여 타이머 시작\n combineLatest([this.nextPollDelayMs$, onlineAndVisible$]).pipe(\n switchMap(([delay, isOnlineAndVisible]) => {\n if (!isOnlineAndVisible || delay == null) return NEVER;\n\n const targetTime = this.lastPollTimestamp + delay;\n const remainingDelay = Math.max(0, targetTime - Date.now());\n\n return timer(remainingDelay);\n }),\n map(() => [] as EventRequest[]),\n ),\n )\n .pipe(\n concatMap(async (requests) => {\n this.nextPollDelayMs$.next(null);\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n\n const events = requests.map((request) => ({\n ...request,\n blux_id: bluxUser.id,\n device_id: bluxUser.deviceId,\n }));\n\n const {\n data: { nextPollDelayMs, inapp },\n } = await this.enqueueRequest(() =>\n collectEvent(\n this.api,\n {\n blux_user_id: bluxUser.id,\n application_id: bluxUser.applicationId,\n },\n {\n device_id: bluxUser.deviceId,\n events,\n },\n this.generateApiHeader(bluxUser),\n ),\n );\n\n this.lastPollTimestamp = Date.now();\n this.cachedNextPollDelayMs = nextPollDelayMs;\n this.nextPollDelayMs$.next(Math.max(nextPollDelayMs, 3000));\n\n if (inapp) {\n this.inappQueue$.next(inapp);\n }\n } catch (error) {\n Logger.error(error, { tags: { from: \"eventQueue\" } });\n this.lastPollTimestamp = Date.now();\n if (this.cachedNextPollDelayMs !== null) {\n const nextPollDelay =\n this.cachedNextPollDelayMs > 1000 * 60 * 60 * 24\n ? this.cachedNextPollDelayMs\n : this.cachedNextPollDelayMs * 2;\n this.cachedNextPollDelayMs = nextPollDelay;\n this.nextPollDelayMs$.next(nextPollDelay);\n }\n }\n }),\n )\n .subscribe();\n }\n\n // api 호출 수 절감을 위해 100ms씩 뭉쳐서 보내고, custom_user_properties와 user_properties를 합쳐서 보냄\n this.userPropertiesQueue$\n .pipe(\n bufferTime(100),\n filter((items) => items.length > 0),\n concatMap(async (items) => {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n\n const mergedUserProperties = items.reduce(\n (acc, item) => ({ ...acc, ...(item.userProperties ?? {}) }),\n {} as NonNullable<\n APIs.bluxUsersUpdateProperties.Body[\"user_properties\"]\n >,\n );\n\n const mergedCustomUserProperties = items.reduce(\n (acc, item) => ({ ...acc, ...(item.customUserProperties ?? {}) }),\n {} as NonNullable<\n APIs.bluxUsersUpdateProperties.Body[\"custom_user_properties\"]\n >,\n );\n\n const payload: APIs.bluxUsersUpdateProperties.Body = {};\n if (Object.keys(mergedUserProperties).length > 0) {\n payload.user_properties = mergedUserProperties;\n }\n if (Object.keys(mergedCustomUserProperties).length > 0) {\n payload.custom_user_properties = mergedCustomUserProperties;\n }\n\n if (Object.keys(payload).length === 0) {\n items.forEach((item) => item.resolve());\n return;\n }\n\n await this.enqueueRequest(() =>\n updateProperties(\n this.api,\n {\n application_id: bluxUser.applicationId,\n blux_user_id: bluxUser.id,\n },\n payload,\n this.generateApiHeader(bluxUser),\n ),\n );\n\n items.forEach((item) => item.resolve());\n } catch (error) {\n items.forEach((item) => item.reject(error));\n Logger.error(error, { tags: { from: \"userPropertiesQueue\" } });\n }\n }),\n )\n .subscribe();\n\n this.bluxUser$.subscribe((bluxUser) => {\n if (bluxUser) SessionStorage.setBluxUserId(bluxUser.id);\n });\n\n if (!this.bridge) {\n this.inappQueue$\n .pipe(filterNullable())\n .pipe(\n concatMap((inapp) =>\n onlineAndVisible$.pipe(\n first(Boolean),\n concatMap(() => from(this.displayInapp(inapp))),\n ),\n ),\n )\n .subscribe();\n }\n\n this.init()\n .then(() => {\n completionCallback?.({ success: true });\n })\n .catch((error) => {\n completionCallback?.({ success: false, errorMessage: error.message });\n });\n }\n\n private async enqueueRequest<T>(action: () => Promise<T>) {\n return new Promise<T>((resolve, reject) => {\n const item: ApiRequestQueueJob<T> = { action, resolve, reject };\n this.apiRequestQueue$.next(item);\n });\n }\n\n private generateApiHeader({ bluxAPIKey }: { bluxAPIKey: string }) {\n return {\n Authorization: bluxAPIKey,\n };\n }\n\n private async displayInapp(inapp: InappMessageResponse) {\n return new Promise((resolve) => {\n const bluxUser = this.bluxUser$.getValue();\n\n const hideTimestamp = LocalStorage.getInappHideTimestamp(inapp.inappId);\n const isShouldSkip =\n hideTimestamp !== null && dayjs().isBefore(dayjs(hideTimestamp));\n\n if (isShouldSkip) return resolve(true);\n\n const iframeElement = document.createElement(\"iframe\");\n\n const params = new URLSearchParams({\n inapp_id: inapp.inappId,\n application_id: this.bluxApplicationId,\n stage:\n this.api.defaults.baseURL === \"https://api.blux.ai/prod\"\n ? \"prod\"\n : \"stg\",\n sdk_version: this.sdkInfo.version,\n });\n\n iframeElement.src = `${inapp.baseUrl}?${params.toString()}`;\n iframeElement.style.position = \"fixed\";\n iframeElement.style.width = `${window.innerWidth}px`;\n iframeElement.style.height = `${window.innerHeight}px`;\n iframeElement.style.top = \"0\";\n iframeElement.style.left = \"0\";\n\n iframeElement.style.zIndex = \"9999\";\n iframeElement.id = `blux-inapp-${inapp.inappId}`;\n\n document.body.appendChild(iframeElement);\n\n let urlChangeSubscription: Subscription | null = null;\n\n const cleanup = () => {\n iframeElement.remove();\n window.removeEventListener(\"message\", handleMessage);\n window.visualViewport?.removeEventListener(\n \"resize\",\n handleViewportChange,\n );\n window.visualViewport?.removeEventListener(\n \"scroll\",\n handleViewportChange,\n );\n urlChangeSubscription?.unsubscribe();\n resolve(inapp.inappId);\n };\n\n const handleViewportChange = () => {\n const width = window.visualViewport?.width ?? window.innerWidth;\n const height = window.visualViewport?.height ?? window.innerHeight;\n const left = window.visualViewport?.offsetLeft ?? 0;\n const top = window.visualViewport?.offsetTop ?? 0;\n\n iframeElement.style.width = `${width}px`;\n iframeElement.style.height = `${height}px`;\n iframeElement.style.left = `${left}px`;\n iframeElement.style.top = `${top}px`;\n };\n\n const handleMessage = (\n event: MessageEvent<\n | {\n action: \"hide\";\n data: {\n days_to_hide: number;\n };\n }\n | {\n action: \"link\";\n data:\n | {\n is_blux_landing: false;\n url: string;\n open_in_new_tab: boolean;\n /**\n * Safari 팝업 차단 우회를 위해 iframe에서 직접 링크를 연 경우 true\n * 이 플래그가 true면 window.open을 스킵하고 이벤트만 찍음\n */\n opened_by_iframe?: boolean;\n }\n | {\n is_blux_landing: true;\n landing_id: string;\n };\n }\n >,\n ) => {\n const message = event.data;\n\n if (message.action === \"hide\") {\n const { days_to_hide } = message.data;\n if (days_to_hide !== 0) {\n const expiresAt = dayjs().add(days_to_hide, \"days\").valueOf();\n LocalStorage.setInappHideTimestamp(inapp.inappId, expiresAt);\n }\n } else if (message.action === \"link\") {\n // createCrmEvent 호출\n const crmEventPromise = bluxUser\n ? this.enqueueRequest(() =>\n createCrmEvent(\n this.api,\n {\n application_id: this.bluxApplicationId,\n },\n {\n notification_id: inapp.notificationId,\n crm_event_type: \"inapp_opened\",\n captured_at: new Date().toISOString(),\n },\n this.generateApiHeader(bluxUser),\n ),\n )\n : Promise.resolve();\n\n if (message.data.is_blux_landing) {\n // TODO: @all 스키마상에는 개인화 랜딩이 존재하나, 콘솔에는 필드가 없음 -> 추후 이에 따른 핸들링이 필요함\n } else {\n const { url, open_in_new_tab, opened_by_iframe } = message.data;\n const needsLocationChange = opened_by_iframe && !open_in_new_tab;\n\n if (needsLocationChange) {\n // opened_by_iframe이고 현재 탭 이동인 경우: createCrmEvent 완료 후 이동\n crmEventPromise.finally(() => {\n window.location.href = url;\n });\n } else if (!opened_by_iframe) {\n // 기존 방식 (iframe에서 열지 않은 경우)\n if (open_in_new_tab) {\n window.open(url, \"_blank\");\n } else {\n window.location.href = url;\n }\n }\n // opened_by_iframe && open_in_new_tab인 경우: iframe에서 이미 새 탭 열었으므로 스킵\n }\n }\n\n cleanup();\n };\n\n // URL 변경 시 인앱메시지 닫기 (SPA 뒤로가기/앞으로가기 대응)\n urlChangeSubscription = this.urlAndRef$\n .pipe(filterNullable(), skip(1), first())\n .subscribe(() => {\n cleanup();\n });\n\n window.visualViewport?.addEventListener(\"resize\", handleViewportChange);\n window.visualViewport?.addEventListener(\"scroll\", handleViewportChange);\n window.addEventListener(\"message\", handleMessage);\n\n if (bluxUser) {\n this.enqueueRequest(() =>\n notificationsUpdate(\n this.api,\n {\n application_id: this.bluxApplicationId,\n notification_id: inapp.notificationId,\n },\n {\n status: \"received\",\n },\n this.generateApiHeader(bluxUser),\n ),\n );\n }\n });\n }\n\n private async init() {\n this.handleUrlAndRef();\n // handle page visit event\n this.urlAndRef$.pipe(filterNullable()).subscribe(() => {\n this.sendEvent(new AddPageVisitEvent({}));\n });\n\n if (this.bridge) {\n this.bridge.initialize({\n bluxApplicationId: this.bluxApplicationId,\n bluxAPIKey: this.bluxAPIKey,\n });\n return;\n }\n\n const blux_user_id = new URLSearchParams(window.location.search).get(\n \"blux_user_id\",\n );\n const sessionId =\n SessionStorage.getSessionId() ?? new ObjectId().toHexString();\n SessionStorage.setSessionId(sessionId);\n\n const isBluxUserIdExistInSessionStorage = SessionStorage.getBluxUserId();\n if (!isBluxUserIdExistInSessionStorage) this.sendEvent(new VisitEvent({}));\n\n Logger.debug(`Init with application id: ${this.bluxApplicationId}`);\n\n const deviceId = LocalStorage.getDeviceId();\n\n if (!deviceId) {\n Logger.debug(\"No saved Device ID, register a new one.\");\n }\n\n this.registerHitTracker();\n\n // 페이지 이동 시 추천 지표 수집 관련 변수 초기화\n this.urlAndRef$.pipe(filterNullable()).subscribe(() => {\n this.impressedElements = [];\n });\n\n this.registerImpressionTracker();\n new MutationObserver(() => {\n this.registerImpressionTracker();\n }).observe(document, { subtree: true, childList: true });\n\n // 500ms 연속으로 엘리먼트 들어있으면 추천 지표 수집\n const MIN_IMPRESSION_TIME = 500;\n this.intersectionEntry$\n .pipe(\n groupBy((entry) => entry.target),\n mergeMap((group$) =>\n group$.pipe(\n debounceTime(MIN_IMPRESSION_TIME),\n filter((entry) => entry.isIntersecting),\n ),\n ),\n )\n .subscribe((entry) => {\n const trackingId = entry.target.getAttribute(\n BLUX_ATTRIBUTES.tracking_id,\n );\n if (!trackingId) {\n Logger.warning(\n `Tracking ID is not found in the parent elements. Please check the tracking ID(${BLUX_ATTRIBUTES.tracking_id}) is set correctly.`,\n );\n return;\n }\n if (this.impressedElements.includes(entry.target)) return;\n\n this.sendEvent(\n new AddSectionViewEvent({\n section: trackingId,\n tracking: {\n id: trackingId,\n type: \"impression\",\n },\n }),\n );\n this.impressedElements.push(entry.target);\n });\n\n const { data } = await initialize(\n this.api,\n { application_id: this.bluxApplicationId },\n {\n session_id: sessionId ?? undefined,\n device_id: deviceId ?? undefined,\n country_code: navigator.language.split(\"-\")[1],\n device_model: navigator.userAgent,\n language_code: navigator.language.split(\"-\")[0],\n platform: DevicePlatform.browser,\n os_version: navigator.userAgent,\n sdk_version: this.sdkInfo.version,\n sdk_type: this.sdkInfo.type,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n blux_user_id: blux_user_id ?? undefined,\n },\n this.generateApiHeader({\n bluxAPIKey: this.bluxAPIKey,\n }),\n );\n\n if (data.device_id) LocalStorage.setDeviceId(data.device_id);\n\n this.bluxUser$.next({\n id: data.blux_user_id,\n bluxAPIKey: this.bluxAPIKey,\n applicationId: this.bluxApplicationId,\n deviceId: data.device_id,\n });\n }\n\n public setLogLevel(logLevel: LogLevel) {\n Logger.setLevel(logLevel);\n }\n\n private async getBluxUserWithTimeout() {\n const bluxUser = await firstValueFrom(\n this.bluxUser$.pipe(\n filterNullable(),\n timeout(5000),\n catchError((error) => {\n return throwError(() =>\n error.name === \"TimeoutError\"\n ? new Error(\n \"Application ID is not initialized. Please initialize BluxClient.\",\n )\n : error,\n );\n }),\n ),\n );\n\n return bluxUser;\n }\n\n public async signIn({ userId }: { userId: string }) {\n try {\n if (this.bridge) {\n this.bridge.signIn({ userId });\n return;\n }\n\n const bluxUser = await this.getBluxUserWithTimeout();\n\n const {\n data: { blux_user_id: bluxIdInResponse },\n } = await this.enqueueRequest(() =>\n signIn(\n this.api,\n { application_id: bluxUser.applicationId, blux_user_id: bluxUser.id },\n { user_id: userId, device_id: bluxUser.deviceId },\n this.generateApiHeader(bluxUser),\n ),\n );\n\n if (bluxIdInResponse !== bluxUser.id) {\n Logger.debug(\"Blux id is changed in signIn.\");\n this.bluxUser$.next({\n ...bluxUser,\n id: bluxIdInResponse,\n userId,\n });\n }\n } catch (error) {\n Logger.error(error, { tags: { from: \"signIn\" } });\n }\n }\n\n public async signOut() {\n try {\n if (this.bridge) {\n this.bridge.signOut();\n return;\n }\n\n const bluxUser = await this.getBluxUserWithTimeout();\n\n const {\n data: { blux_user_id: bluxIdInResponse },\n } = await this.enqueueRequest(() =>\n signOut(\n this.api,\n { application_id: bluxUser.applicationId, blux_user_id: bluxUser.id },\n { device_id: bluxUser.deviceId },\n this.generateApiHeader(bluxUser),\n ),\n );\n\n Logger.debug(\"Blux id is changed in signOut.\");\n this.bluxUser$.next({\n ...bluxUser,\n id: bluxIdInResponse,\n userId: undefined,\n });\n } catch (error) {\n Logger.error(error, { tags: { from: \"signOut\" } });\n }\n }\n\n public async setUserProperties({\n userProperties,\n }: {\n userProperties: NonNullable<\n APIs.bluxUsersUpdateProperties.Body[\"user_properties\"]\n >;\n }) {\n try {\n if (this.bridge) {\n this.bridge.setUserProperties(userProperties);\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n this.userPropertiesQueue$.next({\n userProperties,\n resolve,\n reject,\n });\n });\n } catch (error) {\n Logger.error(error, { tags: { from: \"setUserProperties\" } });\n }\n }\n\n public async setCustomUserProperties({\n customUserProperties,\n }: {\n customUserProperties: NonNullable<\n APIs.bluxUsersUpdateProperties.Body[\"custom_user_properties\"]\n >;\n }) {\n try {\n if (this.bridge) {\n this.bridge.setCustomUserProperties(customUserProperties);\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n this.userPropertiesQueue$.next({\n customUserProperties,\n resolve,\n reject,\n });\n });\n } catch (error) {\n Logger.error(error, { tags: { from: \"setCustomUserProperties\" } });\n }\n }\n\n public sendEvent(event: BluxEvent | BluxEvent[]) {\n try {\n const requests = (Array.isArray(event) ? event : [event]).map((e) => ({\n ...e.request,\n internal_event_properties: {\n url: this.urlAndRef$.value?.url,\n ref: this.urlAndRef$.value?.ref,\n },\n }));\n\n if (this.bridge) {\n this.bridge.sendEvent({ requests });\n return;\n }\n\n requests.forEach((request) => {\n this.eventQueue$.next(request);\n });\n } catch (error) {\n Logger.error(error, { tags: { from: \"sendEvent\" } });\n }\n }\n\n private urlAndRef$ = new BehaviorSubject<\n { url: string; ref: string | undefined } | undefined\n >(undefined);\n\n private handleUrlAndRef() {\n // set url and ref to local storage\n this.urlAndRef$.pipe(filterNullable()).subscribe(({ url, ref }) => {\n if (ref) {\n LocalStorage.setRef(ref);\n }\n LocalStorage.setUrl(url);\n });\n // init url and ref from local storage\n this.urlAndRef$.next({\n url: window.location.href,\n ref: LocalStorage.getUrl() ?? undefined,\n });\n\n // observe url change\n const handleUrlChange = () => {\n const prevUrl = this.urlAndRef$.value?.url;\n const currentUrl = window.location.href;\n if (prevUrl !== currentUrl) {\n this.urlAndRef$.next({\n url: currentUrl,\n ref: prevUrl ?? undefined,\n });\n }\n };\n\n // SPA: popstate (뒤로가기/앞으로가기)\n window.addEventListener(\"popstate\", handleUrlChange);\n // 현재 브라우저에는 URL상태를 추적하기 위한 리스너가 존재하지 않습니다.\n // 그래서 pushState와 replaceState를 직접 수정하여 추적합니다.\n // @reference https://stackoverflow.com/a/64927639\n // @reference https://github.com/amplitude/Amplitude-TypeScript/blob/main/packages/plugin-page-view-tracking-browser/src/page-view-tracking.ts\n // SPA: pushState/replaceState proxy\n history.pushState = new Proxy(history.pushState, {\n apply: (target, thisArg, [state, unused, url]) => {\n target.apply(thisArg, [state, unused, url]);\n handleUrlChange();\n },\n });\n history.replaceState = new Proxy(history.replaceState, {\n apply: (target, thisArg, [state, unused, url]) => {\n target.apply(thisArg, [state, unused, url]);\n handleUrlChange();\n },\n });\n }\n\n private registerImpressionTracker() {\n const targetElements = Array.from(\n document.querySelectorAll(`[${BLUX_ATTRIBUTES.tracking_id}]`),\n );\n\n const removed = this.intersectionObservingElements.filter(\n (e) => !targetElements.includes(e),\n );\n\n removed.forEach((e) => {\n this.intersectionObserver.unobserve(e);\n });\n\n const added = targetElements.filter(\n (element) => !this.intersectionObservingElements.includes(element),\n );\n\n added.forEach((element) => {\n this.intersectionObserver.observe(element);\n });\n\n this.intersectionObservingElements = targetElements;\n }\n\n private registerHitTracker() {\n const handleDelegatedClick = (event: Event) => {\n if (!(event.target instanceof Element)) return;\n\n const eventTarget = event.target;\n\n const targetItemElement = eventTarget.closest(\n `[${BLUX_ATTRIBUTES.item_id}]`,\n );\n if (!targetItemElement) return;\n\n const itemId = targetItemElement.getAttribute(BLUX_ATTRIBUTES.item_id);\n if (!itemId) return;\n\n const targetSectionElement = eventTarget.closest(\n `[${BLUX_ATTRIBUTES.tracking_id}]`,\n );\n const trackingId = targetSectionElement?.getAttribute(\n BLUX_ATTRIBUTES.tracking_id,\n );\n if (!trackingId) {\n Logger.warning(\n `Tracking ID is not found in the parent elements. Please check the tracking ID(${BLUX_ATTRIBUTES.tracking_id}) is set correctly.`,\n );\n return;\n }\n\n if (!this.hitElements.includes(targetItemElement)) {\n this.sendEvent(\n new AddClickEvent({\n itemId,\n tracking: {\n id: trackingId,\n type: \"hit\",\n },\n }),\n );\n this.hitElements.push(targetItemElement);\n }\n };\n document.addEventListener(\"click\", handleDelegatedClick);\n this.urlAndRef$.pipe(filterNullable()).subscribe(() => {\n this.hitElements = [];\n });\n }\n\n public async getUserRec(\n rec: UserRec,\n ): Promise<APIs.bluxUsersGetItemRecommendationsV2.ResponseData> {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n const recRequest = rec.request;\n\n const recommendationResponse = await getItemRecommendations(\n this.api,\n {\n application_id: bluxUser.applicationId,\n blux_user_id: bluxUser.id,\n },\n {\n call_type: recRequest.call_type,\n limit: recRequest.limit,\n offset: recRequest.offset,\n },\n this.generateApiHeader(bluxUser),\n );\n\n return recommendationResponse.data;\n } catch (error) {\n Logger.error(error, { tags: { from: \"getItemRecommendations\" } });\n return {\n item_ids: [],\n metadata: {},\n recommendation_id: null,\n };\n }\n }\n\n public async getItemRec(\n rec: ItemRec,\n ): Promise<APIs.bluxUsersGetItemRecommendationsV2.ResponseData> {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n const recRequest = rec.request;\n\n const recommendationResponse = await getItemRecommendations(\n this.api,\n {\n application_id: bluxUser.applicationId,\n blux_user_id: bluxUser.id,\n },\n {\n call_type: recRequest.call_type,\n limit: recRequest.limit,\n offset: recRequest.offset,\n item_id: recRequest.item_id,\n },\n this.generateApiHeader(bluxUser),\n );\n\n return recommendationResponse.data;\n } catch (error) {\n Logger.error(error, { tags: { from: \"getItemRecommendations\" } });\n return {\n item_ids: [],\n metadata: {},\n recommendation_id: null,\n };\n }\n }\n\n public async getItemsRec(\n rec: ItemsRec,\n ): Promise<APIs.bluxUsersGetItemRecommendationsV2.ResponseData> {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n const recRequest = rec.request;\n\n const recommendationResponse = await getItemRecommendations(\n this.api,\n {\n application_id: bluxUser.applicationId,\n blux_user_id: bluxUser.id,\n },\n {\n call_type: recRequest.call_type,\n limit: recRequest.limit,\n offset: recRequest.offset,\n item_ids: recRequest.item_ids,\n },\n this.generateApiHeader(bluxUser),\n );\n\n return recommendationResponse.data;\n } catch (error) {\n Logger.error(error, { tags: { from: \"getItemRecommendations\" } });\n return {\n item_ids: [],\n metadata: {},\n recommendation_id: null,\n };\n }\n }\n\n public async getCategoryRec(\n rec: CategoryRec,\n ): Promise<APIs.bluxUsersGetItemRecommendationsV2.ResponseData> {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n const recRequest = rec.request;\n\n const recommendationResponse = await getItemRecommendations(\n this.api,\n {\n application_id: bluxUser.applicationId,\n blux_user_id: bluxUser.id,\n },\n {\n call_type: recRequest.call_type,\n limit: recRequest.limit,\n offset: recRequest.offset,\n category_id: recRequest.category_id,\n },\n this.generateApiHeader(bluxUser),\n );\n\n return recommendationResponse.data;\n } catch (error) {\n Logger.error(error, { tags: { from: \"getItemRecommendations\" } });\n return {\n item_ids: [],\n metadata: {},\n recommendation_id: null,\n };\n }\n }\n}\n"]}