@blux.ai/web-sdk 2.2.11 → 2.2.13

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.
Files changed (272) hide show
  1. package/.tsbuildinfo.noEmit +1 -0
  2. package/CLAUDE.md +1 -1
  3. package/dist/BluxClient.d.ts +164 -0
  4. package/dist/BluxClient.js +732 -0
  5. package/dist/BluxClient.js.map +1 -0
  6. package/dist/apis/APIs.d.ts +620 -0
  7. package/dist/apis/APIs.js +163 -0
  8. package/dist/apis/APIs.js.map +1 -0
  9. package/dist/apis/createCrmEvent.js +12 -0
  10. package/dist/apis/createCrmEvent.js.map +1 -0
  11. package/dist/apis/createEvent.js +12 -0
  12. package/dist/apis/createEvent.js.map +1 -0
  13. package/dist/apis/getItemRecommendations.js +12 -0
  14. package/dist/apis/getItemRecommendations.js.map +1 -0
  15. package/dist/apis/initialize.js +12 -0
  16. package/dist/apis/initialize.js.map +1 -0
  17. package/dist/apis/notificationsUpdate.js +10 -0
  18. package/dist/apis/notificationsUpdate.js.map +1 -0
  19. package/dist/apis/signIn.js +12 -0
  20. package/dist/apis/signIn.js.map +1 -0
  21. package/dist/apis/signOut.js +12 -0
  22. package/dist/apis/signOut.js.map +1 -0
  23. package/dist/apis/updateProperties.js +12 -0
  24. package/dist/apis/updateProperties.js.map +1 -0
  25. package/dist/bridges/AndroidBridge.js +43 -0
  26. package/dist/bridges/AndroidBridge.js.map +1 -0
  27. package/dist/bridges/Bridge.d.ts +9 -0
  28. package/dist/bridges/Bridge.js +13 -0
  29. package/dist/bridges/Bridge.js.map +1 -0
  30. package/dist/bridges/FlutterBridge.js +50 -0
  31. package/dist/bridges/FlutterBridge.js.map +1 -0
  32. package/dist/bridges/IosBridge.js +44 -0
  33. package/dist/bridges/IosBridge.js.map +1 -0
  34. package/dist/bridges/RNBridge.js +44 -0
  35. package/dist/bridges/RNBridge.js.map +1 -0
  36. package/dist/constants/BLUX_ATTRIBUTES.js +9 -0
  37. package/dist/constants/BLUX_ATTRIBUTES.js.map +1 -0
  38. package/dist/constants/COUNTRIES.js +1163 -0
  39. package/dist/constants/COUNTRIES.js.map +1 -0
  40. package/dist/constants/ISO8601_REGEX.js +6 -0
  41. package/dist/constants/ISO8601_REGEX.js.map +1 -0
  42. package/dist/events/AddCartaddEvent.d.ts +14 -0
  43. package/dist/events/AddCartaddEvent.js +19 -0
  44. package/dist/events/AddCartaddEvent.js.map +1 -0
  45. package/dist/events/AddClickEvent.d.ts +14 -0
  46. package/dist/events/AddClickEvent.js +19 -0
  47. package/dist/events/AddClickEvent.js.map +1 -0
  48. package/dist/events/AddCustomEvent.d.ts +14 -0
  49. package/dist/events/AddCustomEvent.js +16 -0
  50. package/dist/events/AddCustomEvent.js.map +1 -0
  51. package/dist/events/AddInstantImpressionEvent.d.ts +17 -0
  52. package/dist/events/AddInstantImpressionEvent.js +22 -0
  53. package/dist/events/AddInstantImpressionEvent.js.map +1 -0
  54. package/dist/events/AddLikeEvent.d.ts +14 -0
  55. package/dist/events/AddLikeEvent.js +19 -0
  56. package/dist/events/AddLikeEvent.js.map +1 -0
  57. package/dist/events/AddOrderEvent.d.ts +16 -0
  58. package/dist/events/AddOrderEvent.js +21 -0
  59. package/dist/events/AddOrderEvent.js.map +1 -0
  60. package/dist/events/AddPageViewEvent.d.ts +14 -0
  61. package/dist/events/AddPageViewEvent.js +19 -0
  62. package/dist/events/AddPageViewEvent.js.map +1 -0
  63. package/dist/events/AddPageVisitEvent.d.ts +13 -0
  64. package/dist/events/AddPageVisitEvent.js +16 -0
  65. package/dist/events/AddPageVisitEvent.js.map +1 -0
  66. package/dist/events/AddPersistentImpressionEvent.d.ts +17 -0
  67. package/dist/events/AddPersistentImpressionEvent.js +22 -0
  68. package/dist/events/AddPersistentImpressionEvent.js.map +1 -0
  69. package/dist/events/AddProductDetailViewEvent.d.ts +14 -0
  70. package/dist/events/AddProductDetailViewEvent.js +19 -0
  71. package/dist/events/AddProductDetailViewEvent.js.map +1 -0
  72. package/dist/events/AddRateEvent.d.ts +15 -0
  73. package/dist/events/AddRateEvent.js +20 -0
  74. package/dist/events/AddRateEvent.js.map +1 -0
  75. package/dist/events/AddSearchEvent.d.ts +14 -0
  76. package/dist/events/AddSearchEvent.js +19 -0
  77. package/dist/events/AddSearchEvent.js.map +1 -0
  78. package/dist/events/AddSectionViewEvent.d.ts +14 -0
  79. package/dist/events/AddSectionViewEvent.js +19 -0
  80. package/dist/events/AddSectionViewEvent.js.map +1 -0
  81. package/dist/events/Event.d.ts +10 -0
  82. package/dist/events/Event.js +40 -0
  83. package/dist/events/Event.js.map +1 -0
  84. package/dist/events/VisitEvent.d.ts +13 -0
  85. package/dist/events/VisitEvent.js +16 -0
  86. package/dist/events/VisitEvent.js.map +1 -0
  87. package/dist/events/index.d.ts +14 -0
  88. package/dist/events/index.js +14 -0
  89. package/dist/events/types.d.ts +72 -0
  90. package/dist/index.d.ts +19 -0
  91. package/dist/index.js +20 -0
  92. package/dist/package.js +6 -0
  93. package/dist/package.js.map +1 -0
  94. package/dist/recs/ItemRec.d.ts +38 -0
  95. package/dist/recs/ItemRec.js +46 -0
  96. package/dist/recs/ItemRec.js.map +1 -0
  97. package/dist/recs/Rec.d.ts +10 -0
  98. package/dist/recs/Rec.js +11 -0
  99. package/dist/recs/Rec.js.map +1 -0
  100. package/dist/recs/types.d.ts +26 -0
  101. package/dist/utils/Base.d.ts +8 -0
  102. package/dist/utils/LocalStorage.js +39 -0
  103. package/dist/utils/LocalStorage.js.map +1 -0
  104. package/dist/utils/Logger.d.ts +5 -0
  105. package/dist/utils/Logger.js +48 -0
  106. package/dist/utils/Logger.js.map +1 -0
  107. package/dist/utils/SessionStorage.js +22 -0
  108. package/dist/utils/SessionStorage.js.map +1 -0
  109. package/dist/utils/assertEqualTypes.js +0 -0
  110. package/dist/utils/getPath.js +12 -0
  111. package/dist/utils/getPath.js.map +1 -0
  112. package/dist/utils/observables.js +23 -0
  113. package/dist/utils/observables.js.map +1 -0
  114. package/dist/utils/operators.js +10 -0
  115. package/dist/utils/operators.js.map +1 -0
  116. package/dist/utils/zodSchemas.d.ts +121 -0
  117. package/dist/utils/zodSchemas.js +103 -0
  118. package/dist/utils/zodSchemas.js.map +1 -0
  119. package/package.json +16 -6
  120. package/tsdown.config.mts +19 -0
  121. package/dist/package.json +0 -32
  122. package/dist/src/BluxClient.d.ts +0 -153
  123. package/dist/src/BluxClient.js +0 -827
  124. package/dist/src/BluxClient.js.map +0 -1
  125. package/dist/src/apis/APIs.d.ts +0 -621
  126. package/dist/src/apis/APIs.js +0 -169
  127. package/dist/src/apis/APIs.js.map +0 -1
  128. package/dist/src/apis/createCrmEvent.d.ts +0 -4
  129. package/dist/src/apis/createCrmEvent.js +0 -7
  130. package/dist/src/apis/createCrmEvent.js.map +0 -1
  131. package/dist/src/apis/createEvent.d.ts +0 -4
  132. package/dist/src/apis/createEvent.js +0 -7
  133. package/dist/src/apis/createEvent.js.map +0 -1
  134. package/dist/src/apis/getItemRecommendations.d.ts +0 -4
  135. package/dist/src/apis/getItemRecommendations.js +0 -7
  136. package/dist/src/apis/getItemRecommendations.js.map +0 -1
  137. package/dist/src/apis/initialize.d.ts +0 -4
  138. package/dist/src/apis/initialize.js +0 -7
  139. package/dist/src/apis/initialize.js.map +0 -1
  140. package/dist/src/apis/notificationsUpdate.d.ts +0 -4
  141. package/dist/src/apis/notificationsUpdate.js +0 -7
  142. package/dist/src/apis/notificationsUpdate.js.map +0 -1
  143. package/dist/src/apis/signIn.d.ts +0 -4
  144. package/dist/src/apis/signIn.js +0 -7
  145. package/dist/src/apis/signIn.js.map +0 -1
  146. package/dist/src/apis/signOut.d.ts +0 -4
  147. package/dist/src/apis/signOut.js +0 -7
  148. package/dist/src/apis/signOut.js.map +0 -1
  149. package/dist/src/apis/updateProperties.d.ts +0 -4
  150. package/dist/src/apis/updateProperties.js +0 -7
  151. package/dist/src/apis/updateProperties.js.map +0 -1
  152. package/dist/src/bridges/AndroidBridge.d.ts +0 -11
  153. package/dist/src/bridges/AndroidBridge.js +0 -39
  154. package/dist/src/bridges/AndroidBridge.js.map +0 -1
  155. package/dist/src/bridges/Bridge.d.ts +0 -32
  156. package/dist/src/bridges/Bridge.js +0 -23
  157. package/dist/src/bridges/Bridge.js.map +0 -1
  158. package/dist/src/bridges/FlutterBridge.d.ts +0 -11
  159. package/dist/src/bridges/FlutterBridge.js +0 -45
  160. package/dist/src/bridges/FlutterBridge.js.map +0 -1
  161. package/dist/src/bridges/IosBridge.d.ts +0 -11
  162. package/dist/src/bridges/IosBridge.js +0 -40
  163. package/dist/src/bridges/IosBridge.js.map +0 -1
  164. package/dist/src/bridges/RNBridge.d.ts +0 -11
  165. package/dist/src/bridges/RNBridge.js +0 -39
  166. package/dist/src/bridges/RNBridge.js.map +0 -1
  167. package/dist/src/constants/BLUX_ATTRIBUTES.d.ts +0 -4
  168. package/dist/src/constants/BLUX_ATTRIBUTES.js +0 -5
  169. package/dist/src/constants/BLUX_ATTRIBUTES.js.map +0 -1
  170. package/dist/src/constants/COUNTRIES.d.ts +0 -928
  171. package/dist/src/constants/COUNTRIES.js +0 -1159
  172. package/dist/src/constants/COUNTRIES.js.map +0 -1
  173. package/dist/src/constants/ISO8601_REGEX.d.ts +0 -1
  174. package/dist/src/constants/ISO8601_REGEX.js +0 -4
  175. package/dist/src/constants/ISO8601_REGEX.js.map +0 -1
  176. package/dist/src/events/AddCartaddEvent.d.ts +0 -5
  177. package/dist/src/events/AddCartaddEvent.js +0 -14
  178. package/dist/src/events/AddCartaddEvent.js.map +0 -1
  179. package/dist/src/events/AddClickEvent.d.ts +0 -5
  180. package/dist/src/events/AddClickEvent.js +0 -14
  181. package/dist/src/events/AddClickEvent.js.map +0 -1
  182. package/dist/src/events/AddCustomEvent.d.ts +0 -5
  183. package/dist/src/events/AddCustomEvent.js +0 -11
  184. package/dist/src/events/AddCustomEvent.js.map +0 -1
  185. package/dist/src/events/AddInstantImpressionEvent.d.ts +0 -5
  186. package/dist/src/events/AddInstantImpressionEvent.js +0 -17
  187. package/dist/src/events/AddInstantImpressionEvent.js.map +0 -1
  188. package/dist/src/events/AddLikeEvent.d.ts +0 -5
  189. package/dist/src/events/AddLikeEvent.js +0 -14
  190. package/dist/src/events/AddLikeEvent.js.map +0 -1
  191. package/dist/src/events/AddOrderEvent.d.ts +0 -5
  192. package/dist/src/events/AddOrderEvent.js +0 -16
  193. package/dist/src/events/AddOrderEvent.js.map +0 -1
  194. package/dist/src/events/AddPageViewEvent.d.ts +0 -5
  195. package/dist/src/events/AddPageViewEvent.js +0 -11
  196. package/dist/src/events/AddPageViewEvent.js.map +0 -1
  197. package/dist/src/events/AddPageVisitEvent.d.ts +0 -5
  198. package/dist/src/events/AddPageVisitEvent.js +0 -13
  199. package/dist/src/events/AddPageVisitEvent.js.map +0 -1
  200. package/dist/src/events/AddPersistentImpressionEvent.d.ts +0 -5
  201. package/dist/src/events/AddPersistentImpressionEvent.js +0 -17
  202. package/dist/src/events/AddPersistentImpressionEvent.js.map +0 -1
  203. package/dist/src/events/AddProductDetailViewEvent.d.ts +0 -5
  204. package/dist/src/events/AddProductDetailViewEvent.js +0 -14
  205. package/dist/src/events/AddProductDetailViewEvent.js.map +0 -1
  206. package/dist/src/events/AddRateEvent.d.ts +0 -5
  207. package/dist/src/events/AddRateEvent.js +0 -11
  208. package/dist/src/events/AddRateEvent.js.map +0 -1
  209. package/dist/src/events/AddSearchEvent.d.ts +0 -5
  210. package/dist/src/events/AddSearchEvent.js +0 -11
  211. package/dist/src/events/AddSearchEvent.js.map +0 -1
  212. package/dist/src/events/AddSectionViewEvent.d.ts +0 -5
  213. package/dist/src/events/AddSectionViewEvent.js +0 -14
  214. package/dist/src/events/AddSectionViewEvent.js.map +0 -1
  215. package/dist/src/events/Event.d.ts +0 -27
  216. package/dist/src/events/Event.js +0 -36
  217. package/dist/src/events/Event.js.map +0 -1
  218. package/dist/src/events/VisitEvent.d.ts +0 -5
  219. package/dist/src/events/VisitEvent.js +0 -13
  220. package/dist/src/events/VisitEvent.js.map +0 -1
  221. package/dist/src/events/index.d.ts +0 -14
  222. package/dist/src/events/index.js +0 -15
  223. package/dist/src/events/index.js.map +0 -1
  224. package/dist/src/events/types.d.ts +0 -68
  225. package/dist/src/events/types.js +0 -3
  226. package/dist/src/events/types.js.map +0 -1
  227. package/dist/src/index.d.ts +0 -6
  228. package/dist/src/index.js +0 -6
  229. package/dist/src/index.js.map +0 -1
  230. package/dist/src/recs/ItemRec.d.ts +0 -14
  231. package/dist/src/recs/ItemRec.js +0 -42
  232. package/dist/src/recs/ItemRec.js.map +0 -1
  233. package/dist/src/recs/Rec.d.ts +0 -5
  234. package/dist/src/recs/Rec.js +0 -9
  235. package/dist/src/recs/Rec.js.map +0 -1
  236. package/dist/src/recs/index.d.ts +0 -1
  237. package/dist/src/recs/index.js +0 -2
  238. package/dist/src/recs/index.js.map +0 -1
  239. package/dist/src/recs/types.d.ts +0 -23
  240. package/dist/src/recs/types.js +0 -2
  241. package/dist/src/recs/types.js.map +0 -1
  242. package/dist/src/utils/Base.d.ts +0 -13
  243. package/dist/src/utils/Base.js +0 -2
  244. package/dist/src/utils/Base.js.map +0 -1
  245. package/dist/src/utils/LocalStorage.d.ts +0 -10
  246. package/dist/src/utils/LocalStorage.js +0 -37
  247. package/dist/src/utils/LocalStorage.js.map +0 -1
  248. package/dist/src/utils/Logger.d.ts +0 -13
  249. package/dist/src/utils/Logger.js +0 -48
  250. package/dist/src/utils/Logger.js.map +0 -1
  251. package/dist/src/utils/SessionStorage.d.ts +0 -6
  252. package/dist/src/utils/SessionStorage.js +0 -18
  253. package/dist/src/utils/SessionStorage.js.map +0 -1
  254. package/dist/src/utils/assertEqualTypes.d.ts +0 -3
  255. package/dist/src/utils/assertEqualTypes.js +0 -5
  256. package/dist/src/utils/assertEqualTypes.js.map +0 -1
  257. package/dist/src/utils/getPath.d.ts +0 -1
  258. package/dist/src/utils/getPath.js +0 -9
  259. package/dist/src/utils/getPath.js.map +0 -1
  260. package/dist/src/utils/helper.d.ts +0 -1
  261. package/dist/src/utils/helper.js +0 -4
  262. package/dist/src/utils/helper.js.map +0 -1
  263. package/dist/src/utils/observables.d.ts +0 -1
  264. package/dist/src/utils/observables.js +0 -5
  265. package/dist/src/utils/observables.js.map +0 -1
  266. package/dist/src/utils/operators.d.ts +0 -2
  267. package/dist/src/utils/operators.js +0 -5
  268. package/dist/src/utils/operators.js.map +0 -1
  269. package/dist/src/utils/zodSchemas.d.ts +0 -159
  270. package/dist/src/utils/zodSchemas.js +0 -157
  271. package/dist/src/utils/zodSchemas.js.map +0 -1
  272. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,732 @@
1
+ import { version } from "./package.js";
2
+ import { DevicePlatform } from "./apis/APIs.js";
3
+ import { createCrmEvent } from "./apis/createCrmEvent.js";
4
+ import { collectEvent } from "./apis/createEvent.js";
5
+ import { getItemRecommendations } from "./apis/getItemRecommendations.js";
6
+ import { initialize } from "./apis/initialize.js";
7
+ import { notificationsUpdate } from "./apis/notificationsUpdate.js";
8
+ import { signIn } from "./apis/signIn.js";
9
+ import { signOut } from "./apis/signOut.js";
10
+ import { updateProperties } from "./apis/updateProperties.js";
11
+ import { Logger } from "./utils/Logger.js";
12
+ import { AndroidBridge } from "./bridges/AndroidBridge.js";
13
+ import { FlutterBridge } from "./bridges/FlutterBridge.js";
14
+ import { IosBridge } from "./bridges/IosBridge.js";
15
+ import { RNBridge } from "./bridges/RNBridge.js";
16
+ import { BLUX_ATTRIBUTES } from "./constants/BLUX_ATTRIBUTES.js";
17
+ import { AddSectionViewEvent } from "./events/AddSectionViewEvent.js";
18
+ import { AddPageVisitEvent } from "./events/AddPageVisitEvent.js";
19
+ import { AddClickEvent } from "./events/AddClickEvent.js";
20
+ import { VisitEvent } from "./events/VisitEvent.js";
21
+ import "./events/index.js";
22
+ import { LocalStorage } from "./utils/LocalStorage.js";
23
+ import { getOnlineAndVisible$ } from "./utils/observables.js";
24
+ import { filterNullable } from "./utils/operators.js";
25
+ import { SessionStorage } from "./utils/SessionStorage.js";
26
+ import axios from "axios";
27
+ import ObjectId from "bson-objectid";
28
+ import dayjs from "dayjs";
29
+ import { BehaviorSubject, NEVER, Subject, bufferTime, catchError, combineLatest, concatMap, debounceTime, filter, first, firstValueFrom, from, groupBy, map, merge, mergeMap, skip, switchMap, throwError, timeout, timer } from "rxjs";
30
+
31
+ //#region src/BluxClient.ts
32
+ var BluxClient = class BluxClient {
33
+ isBrowser = typeof window !== "undefined";
34
+ static EMPTY_REC_RESPONSE = {
35
+ item_ids: [],
36
+ metadata: {},
37
+ recommendation_id: null
38
+ };
39
+ api = axios.create();
40
+ sdkInfo = {
41
+ type: DevicePlatform.browser,
42
+ version
43
+ };
44
+ bluxUser$ = new BehaviorSubject(void 0);
45
+ /**
46
+ * 내부 async 작업을 1개씩 직렬로 처리하는 큐입니다.
47
+ * `enqueueRequest()`로 넣으면, 호출자는 완료 시점까지 `await` 할 수 있습니다.
48
+ */
49
+ apiRequestQueue$ = new Subject();
50
+ inappQueue$ = new BehaviorSubject(void 0);
51
+ eventQueue$ = new Subject();
52
+ userPropertiesQueue$ = new Subject();
53
+ INITIAL_NEXT_POLL_DELAY_MS = 10 * 1e3;
54
+ nextPollDelayMs$ = new BehaviorSubject(this.INITIAL_NEXT_POLL_DELAY_MS);
55
+ cachedNextPollDelayMs = this.INITIAL_NEXT_POLL_DELAY_MS;
56
+ lastPollTimestamp = Date.now();
57
+ bluxApplicationId;
58
+ bluxAPIKey;
59
+ customDeviceId;
60
+ bridge = null;
61
+ impressedElements = [];
62
+ intersectionObservingElements = [];
63
+ intersectionObserver = this.isBrowser ? new IntersectionObserver((entries) => {
64
+ entries.forEach((entry) => {
65
+ this.intersectionEntry$.next(entry);
66
+ });
67
+ }) : null;
68
+ intersectionEntry$ = new Subject();
69
+ hitElements = [];
70
+ currentInappCleanup = null;
71
+ inAppCustomActionHandlers = /* @__PURE__ */ new Set();
72
+ resolveBridge(bridgeOptions) {
73
+ if ("useRNBridge" in bridgeOptions && bridgeOptions.useRNBridge) return new RNBridge();
74
+ if ("bridgePlatform" in bridgeOptions && bridgeOptions.bridgePlatform) switch (bridgeOptions.bridgePlatform) {
75
+ case "none": return null;
76
+ case "android": return new AndroidBridge();
77
+ case "ios": return new IosBridge();
78
+ case "react-native": return new RNBridge();
79
+ case "flutter": return new FlutterBridge();
80
+ default: {
81
+ const exhaustiveCheck = bridgeOptions.bridgePlatform;
82
+ Logger.error(`Unknown bridge platform: ${exhaustiveCheck}`, { tags: { from: "resolveBridge" } });
83
+ }
84
+ }
85
+ return null;
86
+ }
87
+ constructor({ bluxApplicationId, bluxAPIKey, customDeviceId, ...bridgeOptions }, completionCallback) {
88
+ this.bluxApplicationId = bluxApplicationId;
89
+ this.bluxAPIKey = bluxAPIKey;
90
+ this.customDeviceId = customDeviceId;
91
+ if (!this.isBrowser) {
92
+ completionCallback?.({ success: true });
93
+ return;
94
+ }
95
+ const baseUrl = window?._BLUX_SDK_?.baseUrl ?? "https://api.blux.ai/prod";
96
+ this.api.defaults.baseURL = baseUrl;
97
+ this.bridge = this.resolveBridge(bridgeOptions);
98
+ this.apiRequestQueue$.pipe(concatMap(async (job) => {
99
+ try {
100
+ const result = await job.action();
101
+ job.resolve(result);
102
+ } catch (error) {
103
+ job.reject(error);
104
+ }
105
+ })).subscribe();
106
+ /**
107
+ * (1) 보내야할 이벤트를 100ms씩 뭉쳐서 보내고, 1개 이상 쌓여있을 때 api 요청
108
+ * (2) collectEvent의 응답에서 온 nextPollDelayMs 값 만큼 이후에 빈 배열로 api 요청 (1)로 보내면 초기화됨
109
+ */
110
+ if (!this.bridge) merge(this.eventQueue$.pipe(bufferTime(100), filter((requests) => requests.length > 0)), combineLatest([this.nextPollDelayMs$, getOnlineAndVisible$()]).pipe(switchMap(([delay, isOnlineAndVisible]) => {
111
+ if (!isOnlineAndVisible || delay == null) return NEVER;
112
+ const targetTime = this.lastPollTimestamp + delay;
113
+ return timer(Math.max(0, targetTime - Date.now()));
114
+ }), map(() => []))).pipe(concatMap(async (requests) => {
115
+ this.nextPollDelayMs$.next(null);
116
+ try {
117
+ const bluxUser = await this.getBluxUserWithTimeout();
118
+ const events = requests.map((request) => ({
119
+ ...request,
120
+ blux_id: bluxUser.id,
121
+ device_id: bluxUser.deviceId
122
+ }));
123
+ const { data: { nextPollDelayMs, inapp } } = await this.enqueueRequest(() => collectEvent(this.api, {
124
+ blux_user_id: bluxUser.id,
125
+ application_id: bluxUser.applicationId
126
+ }, {
127
+ device_id: bluxUser.deviceId,
128
+ events
129
+ }, this.generateApiHeader(bluxUser)));
130
+ this.lastPollTimestamp = Date.now();
131
+ this.cachedNextPollDelayMs = nextPollDelayMs;
132
+ this.nextPollDelayMs$.next(Math.max(nextPollDelayMs, 3e3));
133
+ if (inapp) this.inappQueue$.next(inapp);
134
+ } catch (error) {
135
+ Logger.error(error, { tags: { from: "eventQueue" } });
136
+ this.lastPollTimestamp = Date.now();
137
+ if (this.cachedNextPollDelayMs !== null) {
138
+ const nextPollDelay = this.cachedNextPollDelayMs > 1e3 * 60 * 60 * 24 ? this.cachedNextPollDelayMs : this.cachedNextPollDelayMs * 2;
139
+ this.cachedNextPollDelayMs = nextPollDelay;
140
+ this.nextPollDelayMs$.next(nextPollDelay);
141
+ }
142
+ }
143
+ })).subscribe();
144
+ this.userPropertiesQueue$.pipe(bufferTime(100), filter((items) => items.length > 0), concatMap(async (items) => {
145
+ try {
146
+ const bluxUser = await this.getBluxUserWithTimeout();
147
+ const mergedUserProperties = items.reduce((acc, item) => ({
148
+ ...acc,
149
+ ...item.userProperties ?? {}
150
+ }), {});
151
+ const mergedCustomUserProperties = items.reduce((acc, item) => ({
152
+ ...acc,
153
+ ...item.customUserProperties ?? {}
154
+ }), {});
155
+ const payload = {};
156
+ if (Object.keys(mergedUserProperties).length > 0) payload.user_properties = mergedUserProperties;
157
+ if (Object.keys(mergedCustomUserProperties).length > 0) payload.custom_user_properties = mergedCustomUserProperties;
158
+ if (Object.keys(payload).length === 0) {
159
+ items.forEach((item) => item.resolve());
160
+ return;
161
+ }
162
+ await this.enqueueRequest(() => updateProperties(this.api, {
163
+ application_id: bluxUser.applicationId,
164
+ blux_user_id: bluxUser.id
165
+ }, payload, this.generateApiHeader(bluxUser)));
166
+ items.forEach((item) => item.resolve());
167
+ } catch (error) {
168
+ items.forEach((item) => item.reject(error));
169
+ Logger.error(error, { tags: { from: "userPropertiesQueue" } });
170
+ }
171
+ })).subscribe();
172
+ this.bluxUser$.subscribe((bluxUser) => {
173
+ if (bluxUser) SessionStorage.setBluxUserId(bluxUser.id);
174
+ });
175
+ if (!this.bridge) this.inappQueue$.pipe(filterNullable()).pipe(concatMap((inapp) => getOnlineAndVisible$().pipe(first(Boolean), concatMap(() => from(this.displayInapp(inapp)))))).subscribe();
176
+ this.init().then(() => {
177
+ completionCallback?.({ success: true });
178
+ }).catch((error) => {
179
+ completionCallback?.({
180
+ success: false,
181
+ errorMessage: error.message
182
+ });
183
+ });
184
+ }
185
+ async enqueueRequest(action) {
186
+ return new Promise((resolve, reject) => {
187
+ const item = {
188
+ action,
189
+ resolve,
190
+ reject
191
+ };
192
+ this.apiRequestQueue$.next(item);
193
+ });
194
+ }
195
+ generateApiHeader({ bluxAPIKey }) {
196
+ return { Authorization: bluxAPIKey };
197
+ }
198
+ async displayInapp(inapp) {
199
+ return new Promise((resolve) => {
200
+ const bluxUser = this.bluxUser$.getValue();
201
+ const hideTimestamp = LocalStorage.getInappHideTimestamp(inapp.inappId);
202
+ if (hideTimestamp !== null && dayjs().isBefore(dayjs(hideTimestamp))) return resolve(true);
203
+ const iframeElement = document.createElement("iframe");
204
+ const headInjection = `<script>
205
+ (function() {
206
+ var origReplaceState = history.replaceState;
207
+ var origPushState = history.pushState;
208
+ history.replaceState = function() {
209
+ try { return origReplaceState.apply(this, arguments); }
210
+ catch(e) { console.debug('[Blux] history.replaceState blocked in blob context'); }
211
+ };
212
+ history.pushState = function() {
213
+ try { return origPushState.apply(this, arguments); }
214
+ catch(e) { console.debug('[Blux] history.pushState blocked in blob context'); }
215
+ };
216
+ })();
217
+ <\/script><base href="${inapp.baseUrl}/">`;
218
+ const htmlWithBase = inapp.htmlString.includes("<head>") ? inapp.htmlString.replace("<head>", `<head>${headInjection}`) : inapp.htmlString;
219
+ const blob = new Blob([htmlWithBase], { type: "text/html" });
220
+ const blobUrl = URL.createObjectURL(blob);
221
+ iframeElement.sandbox.add("allow-scripts", "allow-same-origin", "allow-forms");
222
+ iframeElement.src = blobUrl;
223
+ iframeElement.style.position = "fixed";
224
+ iframeElement.style.width = `${window.innerWidth}px`;
225
+ iframeElement.style.height = `${window.innerHeight}px`;
226
+ iframeElement.style.top = "0";
227
+ iframeElement.style.left = "0";
228
+ iframeElement.style.zIndex = "9999";
229
+ iframeElement.id = `blux-inapp-${inapp.inappId}`;
230
+ document.body.appendChild(iframeElement);
231
+ let urlChangeSubscription = null;
232
+ const cleanup = () => {
233
+ URL.revokeObjectURL(blobUrl);
234
+ iframeElement.remove();
235
+ window.removeEventListener("message", handleMessage);
236
+ window.visualViewport?.removeEventListener("resize", handleViewportChange);
237
+ window.visualViewport?.removeEventListener("scroll", handleViewportChange);
238
+ urlChangeSubscription?.unsubscribe();
239
+ this.currentInappCleanup = null;
240
+ resolve(inapp.inappId);
241
+ };
242
+ this.currentInappCleanup = cleanup;
243
+ const handleViewportChange = () => {
244
+ const width = window.visualViewport?.width ?? window.innerWidth;
245
+ const height = window.visualViewport?.height ?? window.innerHeight;
246
+ const left = window.visualViewport?.offsetLeft ?? 0;
247
+ const top = window.visualViewport?.offsetTop ?? 0;
248
+ iframeElement.style.width = `${width}px`;
249
+ iframeElement.style.height = `${height}px`;
250
+ iframeElement.style.left = `${left}px`;
251
+ iframeElement.style.top = `${top}px`;
252
+ };
253
+ const handleMessage = (event) => {
254
+ if (event.source !== iframeElement.contentWindow) return;
255
+ const message = event.data;
256
+ if (message.action === "resize") {
257
+ const { height, location } = message.data;
258
+ iframeElement.style.width = "90vw";
259
+ iframeElement.style.maxWidth = "448px";
260
+ iframeElement.style.height = `${height}px`;
261
+ iframeElement.style.left = "50%";
262
+ iframeElement.style.transform = "translateX(-50%)";
263
+ if (location === "top") {
264
+ iframeElement.style.top = "0";
265
+ iframeElement.style.bottom = "auto";
266
+ } else {
267
+ iframeElement.style.top = "auto";
268
+ iframeElement.style.bottom = "0";
269
+ }
270
+ window.visualViewport?.removeEventListener("resize", handleViewportChange);
271
+ window.visualViewport?.removeEventListener("scroll", handleViewportChange);
272
+ return;
273
+ }
274
+ if (message.action === "hide") {
275
+ const { days_to_hide } = message.data;
276
+ if (days_to_hide !== 0) {
277
+ const expiresAt = dayjs().add(days_to_hide, "days").valueOf();
278
+ LocalStorage.setInappHideTimestamp(inapp.inappId, expiresAt);
279
+ }
280
+ } else if (message.action === "link") {
281
+ const crmEventPromise = bluxUser ? this.enqueueRequest(() => createCrmEvent(this.api, { application_id: this.bluxApplicationId }, {
282
+ notification_id: inapp.notificationId,
283
+ crm_event_type: "inapp_opened",
284
+ captured_at: (/* @__PURE__ */ new Date()).toISOString()
285
+ }, this.generateApiHeader(bluxUser))) : Promise.resolve();
286
+ if (message.data.is_blux_landing) {} else {
287
+ const { url, open_in_new_tab, opened_by_iframe } = message.data;
288
+ const needsLocationChange = opened_by_iframe && !open_in_new_tab;
289
+ if (this.bluxApplicationId === "6878af275ead5a75abbdacd7") crmEventPromise.finally(() => {
290
+ window.top?.postMessage({
291
+ type: "blux_inapp_message",
292
+ url
293
+ }, window.location.origin);
294
+ });
295
+ else if (needsLocationChange) crmEventPromise.finally(() => {
296
+ window.location.href = url;
297
+ });
298
+ else if (!opened_by_iframe) if (open_in_new_tab) window.open(url, "_blank");
299
+ else window.location.href = url;
300
+ }
301
+ } else if (message.action === "custom_action") {
302
+ const { action_id, data, should_dismiss } = message.data;
303
+ for (const handler of this.inAppCustomActionHandlers) try {
304
+ handler({
305
+ actionId: action_id,
306
+ data
307
+ });
308
+ } catch (error) {
309
+ Logger.error(error, { tags: { from: "inAppCustomActionHandler" } });
310
+ }
311
+ if (!should_dismiss) return;
312
+ } else if (message.action === "inapp_opened") {
313
+ if (bluxUser) this.enqueueRequest(() => createCrmEvent(this.api, { application_id: this.bluxApplicationId }, {
314
+ notification_id: inapp.notificationId,
315
+ crm_event_type: "inapp_opened",
316
+ captured_at: (/* @__PURE__ */ new Date()).toISOString()
317
+ }, this.generateApiHeader(bluxUser)));
318
+ return;
319
+ }
320
+ cleanup();
321
+ };
322
+ urlChangeSubscription = this.urlAndRef$.pipe(filterNullable(), skip(1), first()).subscribe(() => {
323
+ cleanup();
324
+ });
325
+ window.visualViewport?.addEventListener("resize", handleViewportChange);
326
+ window.visualViewport?.addEventListener("scroll", handleViewportChange);
327
+ window.addEventListener("message", handleMessage);
328
+ if (bluxUser) this.enqueueRequest(() => notificationsUpdate(this.api, {
329
+ application_id: this.bluxApplicationId,
330
+ notification_id: inapp.notificationId
331
+ }, { status: "received" }, this.generateApiHeader(bluxUser)));
332
+ });
333
+ }
334
+ async init() {
335
+ this.handleUrlAndRef();
336
+ this.urlAndRef$.pipe(filterNullable()).subscribe(() => {
337
+ this.sendEvent(new AddPageVisitEvent({}));
338
+ });
339
+ if (this.bridge) {
340
+ this.bridge.initialize({
341
+ bluxApplicationId: this.bluxApplicationId,
342
+ bluxAPIKey: this.bluxAPIKey,
343
+ customDeviceId: this.customDeviceId
344
+ });
345
+ return;
346
+ }
347
+ const blux_user_id = new URLSearchParams(window.location.search).get("blux_user_id");
348
+ const sessionId = SessionStorage.getSessionId() ?? new ObjectId().toHexString();
349
+ SessionStorage.setSessionId(sessionId);
350
+ if (!SessionStorage.getBluxUserId()) this.sendEvent(new VisitEvent({}));
351
+ Logger.debug(`Init with application id: ${this.bluxApplicationId}`);
352
+ const deviceId = LocalStorage.getDeviceId();
353
+ if (!deviceId) Logger.debug("No saved Device ID, register a new one.");
354
+ this.registerHitTracker();
355
+ this.urlAndRef$.pipe(filterNullable()).subscribe(() => {
356
+ this.impressedElements = [];
357
+ });
358
+ this.registerImpressionTracker();
359
+ new MutationObserver(() => {
360
+ this.registerImpressionTracker();
361
+ }).observe(document, {
362
+ subtree: true,
363
+ childList: true
364
+ });
365
+ const MIN_IMPRESSION_TIME = 500;
366
+ this.intersectionEntry$.pipe(groupBy((entry) => entry.target), mergeMap((group$) => group$.pipe(debounceTime(MIN_IMPRESSION_TIME), filter((entry) => entry.isIntersecting)))).subscribe((entry) => {
367
+ const trackingId = entry.target.getAttribute(BLUX_ATTRIBUTES.tracking_id);
368
+ if (!trackingId) {
369
+ Logger.warning(`Tracking ID is not found in the parent elements. Please check the tracking ID(${BLUX_ATTRIBUTES.tracking_id}) is set correctly.`);
370
+ return;
371
+ }
372
+ if (this.impressedElements.includes(entry.target)) return;
373
+ this.sendEvent(new AddSectionViewEvent({
374
+ section: trackingId,
375
+ tracking: {
376
+ id: trackingId,
377
+ type: "impression"
378
+ }
379
+ }));
380
+ this.impressedElements.push(entry.target);
381
+ });
382
+ const { data } = await initialize(this.api, { application_id: this.bluxApplicationId }, {
383
+ session_id: sessionId ?? void 0,
384
+ device_id: deviceId ?? void 0,
385
+ country_code: navigator.language.split("-")[1],
386
+ device_model: navigator.userAgent,
387
+ language_code: navigator.language.split("-")[0],
388
+ platform: DevicePlatform.browser,
389
+ os_version: navigator.userAgent,
390
+ sdk_version: this.sdkInfo.version,
391
+ sdk_type: this.sdkInfo.type,
392
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
393
+ blux_user_id: blux_user_id ?? void 0,
394
+ custom_device_id: this.customDeviceId
395
+ }, this.generateApiHeader({ bluxAPIKey: this.bluxAPIKey }));
396
+ if (data.device_id) LocalStorage.setDeviceId(data.device_id);
397
+ this.bluxUser$.next({
398
+ id: data.blux_user_id,
399
+ bluxAPIKey: this.bluxAPIKey,
400
+ applicationId: this.bluxApplicationId,
401
+ deviceId: data.device_id
402
+ });
403
+ }
404
+ setLogLevel(logLevel) {
405
+ Logger.setLevel(logLevel);
406
+ }
407
+ async getBluxUserWithTimeout() {
408
+ return await firstValueFrom(this.bluxUser$.pipe(filterNullable(), timeout(5e3), catchError((error) => {
409
+ return throwError(() => error.name === "TimeoutError" ? /* @__PURE__ */ new Error("Application ID is not initialized. Please initialize BluxClient.") : error);
410
+ })));
411
+ }
412
+ async signIn({ userId }) {
413
+ if (!this.isBrowser) return;
414
+ try {
415
+ if (this.bridge) {
416
+ this.bridge.signIn({ userId });
417
+ return;
418
+ }
419
+ const bluxUser = await this.getBluxUserWithTimeout();
420
+ const { data: { blux_user_id: bluxIdInResponse } } = await this.enqueueRequest(() => signIn(this.api, {
421
+ application_id: bluxUser.applicationId,
422
+ blux_user_id: bluxUser.id
423
+ }, {
424
+ user_id: userId,
425
+ device_id: bluxUser.deviceId
426
+ }, this.generateApiHeader(bluxUser)));
427
+ if (bluxIdInResponse !== bluxUser.id) {
428
+ Logger.debug("Blux id is changed in signIn.");
429
+ this.bluxUser$.next({
430
+ ...bluxUser,
431
+ id: bluxIdInResponse,
432
+ userId
433
+ });
434
+ }
435
+ } catch (error) {
436
+ Logger.error(error, { tags: { from: "signIn" } });
437
+ }
438
+ }
439
+ async signOut() {
440
+ if (!this.isBrowser) return;
441
+ try {
442
+ if (this.bridge) {
443
+ this.bridge.signOut();
444
+ return;
445
+ }
446
+ const bluxUser = await this.getBluxUserWithTimeout();
447
+ const { data: { blux_user_id: bluxIdInResponse } } = await this.enqueueRequest(() => signOut(this.api, {
448
+ application_id: bluxUser.applicationId,
449
+ blux_user_id: bluxUser.id
450
+ }, { device_id: bluxUser.deviceId }, this.generateApiHeader(bluxUser)));
451
+ Logger.debug("Blux id is changed in signOut.");
452
+ this.bluxUser$.next({
453
+ ...bluxUser,
454
+ id: bluxIdInResponse,
455
+ userId: void 0
456
+ });
457
+ } catch (error) {
458
+ Logger.error(error, { tags: { from: "signOut" } });
459
+ }
460
+ }
461
+ async setUserProperties({ userProperties }) {
462
+ if (!this.isBrowser) return;
463
+ try {
464
+ if (this.bridge) {
465
+ this.bridge.setUserProperties(userProperties);
466
+ return;
467
+ }
468
+ await new Promise((resolve, reject) => {
469
+ this.userPropertiesQueue$.next({
470
+ userProperties,
471
+ resolve,
472
+ reject
473
+ });
474
+ });
475
+ } catch (error) {
476
+ Logger.error(error, { tags: { from: "setUserProperties" } });
477
+ }
478
+ }
479
+ async setCustomUserProperties({ customUserProperties }) {
480
+ if (!this.isBrowser) return;
481
+ try {
482
+ if (this.bridge) {
483
+ this.bridge.setCustomUserProperties(customUserProperties);
484
+ return;
485
+ }
486
+ await new Promise((resolve, reject) => {
487
+ this.userPropertiesQueue$.next({
488
+ customUserProperties,
489
+ resolve,
490
+ reject
491
+ });
492
+ });
493
+ } catch (error) {
494
+ Logger.error(error, { tags: { from: "setCustomUserProperties" } });
495
+ }
496
+ }
497
+ sendEvent(event) {
498
+ if (!this.isBrowser) return;
499
+ try {
500
+ const requests = (Array.isArray(event) ? event : [event]).map((e) => ({
501
+ ...e.request,
502
+ internal_event_properties: {
503
+ url: this.urlAndRef$.value?.url,
504
+ ref: this.urlAndRef$.value?.ref
505
+ }
506
+ }));
507
+ if (this.bridge) {
508
+ this.bridge.sendEvent({ requests });
509
+ return;
510
+ }
511
+ requests.forEach((request) => {
512
+ this.eventQueue$.next(request);
513
+ });
514
+ } catch (error) {
515
+ Logger.error(error, { tags: { from: "sendEvent" } });
516
+ }
517
+ }
518
+ /**
519
+ * 현재 표시 중인 인앱 메시지를 프로그래밍 방식으로 닫습니다.
520
+ *
521
+ * Custom HTML 인앱에서 async 핸들러 완료 후 수동으로 닫을 때 사용합니다.
522
+ *
523
+ * @example
524
+ * ```typescript
525
+ * // BluxBridge.triggerAction('share', { url: '...' }, false); // shouldDismiss: false
526
+ * // 핸들러에서 async 작업 완료 후:
527
+ * bluxClient.dismissInApp();
528
+ * ```
529
+ */
530
+ dismissInApp() {
531
+ if (!this.isBrowser) return;
532
+ this.currentInappCleanup?.();
533
+ }
534
+ /**
535
+ * Custom HTML 인앱에서 BluxBridge.triggerAction() 호출 시 실행될 핸들러를 등록합니다.
536
+ * 여러 핸들러를 등록할 수 있으며, 등록 순서대로 실행됩니다.
537
+ *
538
+ * @param handler - 커스텀 액션 핸들러 함수
539
+ * @returns 핸들러를 제거하는 unsubscribe 함수
540
+ *
541
+ * @example
542
+ * ```typescript
543
+ * const unsubscribe = bluxClient.addInAppCustomActionHandler(async (event) => {
544
+ * if (event.actionId === 'share') {
545
+ * await navigator.share({ url: event.data.url as string });
546
+ * // async 작업 완료 후 수동으로 닫기 (shouldDismiss: false로 호출한 경우)
547
+ * bluxClient.dismissInApp();
548
+ * }
549
+ * });
550
+ *
551
+ * // 핸들러 제거
552
+ * unsubscribe();
553
+ * ```
554
+ */
555
+ addInAppCustomActionHandler(handler) {
556
+ if (!this.isBrowser) return () => {};
557
+ this.inAppCustomActionHandlers.add(handler);
558
+ return () => {
559
+ this.inAppCustomActionHandlers.delete(handler);
560
+ };
561
+ }
562
+ urlAndRef$ = new BehaviorSubject(void 0);
563
+ handleUrlAndRef() {
564
+ this.urlAndRef$.pipe(filterNullable()).subscribe(({ url, ref }) => {
565
+ if (ref) LocalStorage.setRef(ref);
566
+ LocalStorage.setUrl(url);
567
+ });
568
+ this.urlAndRef$.next({
569
+ url: window.location.href,
570
+ ref: LocalStorage.getUrl() ?? void 0
571
+ });
572
+ const handleUrlChange = () => {
573
+ const prevUrl = this.urlAndRef$.value?.url;
574
+ const currentUrl = window.location.href;
575
+ if (prevUrl !== currentUrl) this.urlAndRef$.next({
576
+ url: currentUrl,
577
+ ref: prevUrl ?? void 0
578
+ });
579
+ };
580
+ window.addEventListener("popstate", handleUrlChange);
581
+ history.pushState = new Proxy(history.pushState, { apply: (target, thisArg, [state, unused, url]) => {
582
+ target.apply(thisArg, [
583
+ state,
584
+ unused,
585
+ url
586
+ ]);
587
+ handleUrlChange();
588
+ } });
589
+ history.replaceState = new Proxy(history.replaceState, { apply: (target, thisArg, [state, unused, url]) => {
590
+ target.apply(thisArg, [
591
+ state,
592
+ unused,
593
+ url
594
+ ]);
595
+ handleUrlChange();
596
+ } });
597
+ }
598
+ registerImpressionTracker() {
599
+ const targetElements = Array.from(document.querySelectorAll(`[${BLUX_ATTRIBUTES.tracking_id}]`));
600
+ this.intersectionObservingElements.filter((e) => !targetElements.includes(e)).forEach((e) => {
601
+ this.intersectionObserver?.unobserve(e);
602
+ });
603
+ targetElements.filter((element) => !this.intersectionObservingElements.includes(element)).forEach((element) => {
604
+ this.intersectionObserver?.observe(element);
605
+ });
606
+ this.intersectionObservingElements = targetElements;
607
+ }
608
+ registerHitTracker() {
609
+ const handleDelegatedClick = (event) => {
610
+ if (!(event.target instanceof Element)) return;
611
+ const eventTarget = event.target;
612
+ const targetItemElement = eventTarget.closest(`[${BLUX_ATTRIBUTES.item_id}]`);
613
+ if (!targetItemElement) return;
614
+ const itemId = targetItemElement.getAttribute(BLUX_ATTRIBUTES.item_id);
615
+ if (!itemId) return;
616
+ const trackingId = eventTarget.closest(`[${BLUX_ATTRIBUTES.tracking_id}]`)?.getAttribute(BLUX_ATTRIBUTES.tracking_id);
617
+ if (!trackingId) {
618
+ Logger.warning(`Tracking ID is not found in the parent elements. Please check the tracking ID(${BLUX_ATTRIBUTES.tracking_id}) is set correctly.`);
619
+ return;
620
+ }
621
+ if (!this.hitElements.includes(targetItemElement)) {
622
+ this.sendEvent(new AddClickEvent({
623
+ itemId,
624
+ tracking: {
625
+ id: trackingId,
626
+ type: "hit"
627
+ }
628
+ }));
629
+ this.hitElements.push(targetItemElement);
630
+ }
631
+ };
632
+ document.addEventListener("click", handleDelegatedClick);
633
+ this.urlAndRef$.pipe(filterNullable()).subscribe(() => {
634
+ this.hitElements = [];
635
+ });
636
+ }
637
+ async getUserRec(rec) {
638
+ if (!this.isBrowser) return BluxClient.EMPTY_REC_RESPONSE;
639
+ try {
640
+ const bluxUser = await this.getBluxUserWithTimeout();
641
+ const recRequest = rec.request;
642
+ return (await getItemRecommendations(this.api, {
643
+ application_id: bluxUser.applicationId,
644
+ blux_user_id: bluxUser.id
645
+ }, {
646
+ call_type: recRequest.call_type,
647
+ limit: recRequest.limit,
648
+ offset: recRequest.offset
649
+ }, this.generateApiHeader(bluxUser))).data;
650
+ } catch (error) {
651
+ Logger.error(error, { tags: { from: "getItemRecommendations" } });
652
+ return {
653
+ item_ids: [],
654
+ metadata: {},
655
+ recommendation_id: null
656
+ };
657
+ }
658
+ }
659
+ async getItemRec(rec) {
660
+ if (!this.isBrowser) return BluxClient.EMPTY_REC_RESPONSE;
661
+ try {
662
+ const bluxUser = await this.getBluxUserWithTimeout();
663
+ const recRequest = rec.request;
664
+ return (await getItemRecommendations(this.api, {
665
+ application_id: bluxUser.applicationId,
666
+ blux_user_id: bluxUser.id
667
+ }, {
668
+ call_type: recRequest.call_type,
669
+ limit: recRequest.limit,
670
+ offset: recRequest.offset,
671
+ item_id: recRequest.item_id
672
+ }, this.generateApiHeader(bluxUser))).data;
673
+ } catch (error) {
674
+ Logger.error(error, { tags: { from: "getItemRecommendations" } });
675
+ return {
676
+ item_ids: [],
677
+ metadata: {},
678
+ recommendation_id: null
679
+ };
680
+ }
681
+ }
682
+ async getItemsRec(rec) {
683
+ if (!this.isBrowser) return BluxClient.EMPTY_REC_RESPONSE;
684
+ try {
685
+ const bluxUser = await this.getBluxUserWithTimeout();
686
+ const recRequest = rec.request;
687
+ return (await getItemRecommendations(this.api, {
688
+ application_id: bluxUser.applicationId,
689
+ blux_user_id: bluxUser.id
690
+ }, {
691
+ call_type: recRequest.call_type,
692
+ limit: recRequest.limit,
693
+ offset: recRequest.offset,
694
+ item_ids: recRequest.item_ids
695
+ }, this.generateApiHeader(bluxUser))).data;
696
+ } catch (error) {
697
+ Logger.error(error, { tags: { from: "getItemRecommendations" } });
698
+ return {
699
+ item_ids: [],
700
+ metadata: {},
701
+ recommendation_id: null
702
+ };
703
+ }
704
+ }
705
+ async getCategoryRec(rec) {
706
+ if (!this.isBrowser) return BluxClient.EMPTY_REC_RESPONSE;
707
+ try {
708
+ const bluxUser = await this.getBluxUserWithTimeout();
709
+ const recRequest = rec.request;
710
+ return (await getItemRecommendations(this.api, {
711
+ application_id: bluxUser.applicationId,
712
+ blux_user_id: bluxUser.id
713
+ }, {
714
+ call_type: recRequest.call_type,
715
+ limit: recRequest.limit,
716
+ offset: recRequest.offset,
717
+ category_id: recRequest.category_id
718
+ }, this.generateApiHeader(bluxUser))).data;
719
+ } catch (error) {
720
+ Logger.error(error, { tags: { from: "getItemRecommendations" } });
721
+ return {
722
+ item_ids: [],
723
+ metadata: {},
724
+ recommendation_id: null
725
+ };
726
+ }
727
+ }
728
+ };
729
+
730
+ //#endregion
731
+ export { BluxClient };
732
+ //# sourceMappingURL=BluxClient.js.map