@blux.ai/web-sdk 2.2.11 → 2.2.12

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