@blux.ai/web-sdk 1.0.0-rc1 → 1.0.0-rc3

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 (120) hide show
  1. package/README.md +1 -1
  2. package/dist/package.json +4 -4
  3. package/dist/src/BluxClient.d.ts +41 -0
  4. package/dist/src/BluxClient.js +208 -0
  5. package/dist/src/BluxClient.js.map +1 -0
  6. package/dist/src/apis/APIs.d.ts +348 -0
  7. package/dist/src/apis/APIs.js +145 -0
  8. package/dist/src/apis/APIs.js.map +1 -0
  9. package/dist/src/apis/createEvent.d.ts +4 -0
  10. package/dist/src/apis/createEvent.js +7 -0
  11. package/dist/src/apis/createEvent.js.map +1 -0
  12. package/dist/src/apis/getItemRecommendation.d.ts +4 -0
  13. package/dist/src/apis/getItemRecommendation.js +7 -0
  14. package/dist/src/apis/getItemRecommendation.js.map +1 -0
  15. package/dist/src/apis/initialize.d.ts +4 -0
  16. package/dist/src/apis/initialize.js +7 -0
  17. package/dist/src/apis/initialize.js.map +1 -0
  18. package/dist/src/apis/signIn.d.ts +4 -0
  19. package/dist/src/apis/signIn.js +7 -0
  20. package/dist/src/apis/signIn.js.map +1 -0
  21. package/dist/src/apis/signOut.d.ts +4 -0
  22. package/dist/src/apis/signOut.js +7 -0
  23. package/dist/src/apis/signOut.js.map +1 -0
  24. package/dist/src/apis/updateCustomUserProperties.d.ts +4 -0
  25. package/dist/src/apis/updateCustomUserProperties.js +7 -0
  26. package/dist/src/apis/updateCustomUserProperties.js.map +1 -0
  27. package/dist/src/apis/updateUserProperties.d.ts +4 -0
  28. package/dist/src/apis/updateUserProperties.js +7 -0
  29. package/dist/src/apis/updateUserProperties.js.map +1 -0
  30. package/dist/src/constants/COUNTRIES.d.ts +928 -0
  31. package/dist/src/constants/COUNTRIES.js +1159 -0
  32. package/dist/src/constants/COUNTRIES.js.map +1 -0
  33. package/dist/src/constants/ISO8601_REGEX.d.ts +1 -0
  34. package/dist/src/constants/ISO8601_REGEX.js +4 -0
  35. package/dist/src/constants/ISO8601_REGEX.js.map +1 -0
  36. package/dist/src/events/AddCartaddEvent.d.ts +5 -0
  37. package/dist/src/events/AddCartaddEvent.js +13 -0
  38. package/dist/src/events/AddCartaddEvent.js.map +1 -0
  39. package/dist/src/events/AddCustomEvent.d.ts +5 -0
  40. package/dist/src/events/AddCustomEvent.js +11 -0
  41. package/dist/src/events/AddCustomEvent.js.map +1 -0
  42. package/dist/src/events/AddInstantImpression.d.ts +5 -0
  43. package/dist/src/events/AddInstantImpression.js +17 -0
  44. package/dist/src/events/AddInstantImpression.js.map +1 -0
  45. package/dist/src/events/AddLikeEvent.d.ts +5 -0
  46. package/dist/src/events/AddLikeEvent.js +13 -0
  47. package/dist/src/events/AddLikeEvent.js.map +1 -0
  48. package/dist/src/events/AddPageViewEvent.d.ts +5 -0
  49. package/dist/src/events/AddPageViewEvent.js +11 -0
  50. package/dist/src/events/AddPageViewEvent.js.map +1 -0
  51. package/dist/src/events/AddPageVisitEvent.d.ts +5 -0
  52. package/dist/src/events/AddPageVisitEvent.js +10 -0
  53. package/dist/src/events/AddPageVisitEvent.js.map +1 -0
  54. package/dist/src/events/AddPersistentImpression.d.ts +5 -0
  55. package/dist/src/events/AddPersistentImpression.js +17 -0
  56. package/dist/src/events/AddPersistentImpression.js.map +1 -0
  57. package/dist/src/events/AddProductDetailViewEvent.d.ts +5 -0
  58. package/dist/src/events/AddProductDetailViewEvent.js +16 -0
  59. package/dist/src/events/AddProductDetailViewEvent.js.map +1 -0
  60. package/dist/src/events/AddPurchaseEvent.d.ts +5 -0
  61. package/dist/src/events/AddPurchaseEvent.js +15 -0
  62. package/dist/src/events/AddPurchaseEvent.js.map +1 -0
  63. package/dist/src/events/AddRateEvent.d.ts +5 -0
  64. package/dist/src/events/AddRateEvent.js +11 -0
  65. package/dist/src/events/AddRateEvent.js.map +1 -0
  66. package/dist/src/events/AddSectionViewEvent.d.ts +5 -0
  67. package/dist/src/events/AddSectionViewEvent.js +14 -0
  68. package/dist/src/events/AddSectionViewEvent.js.map +1 -0
  69. package/dist/src/events/Event.d.ts +24 -0
  70. package/dist/src/events/Event.js +33 -0
  71. package/dist/src/events/Event.js.map +1 -0
  72. package/dist/src/events/VisitEvent.d.ts +5 -0
  73. package/dist/src/events/VisitEvent.js +10 -0
  74. package/dist/src/events/VisitEvent.js.map +1 -0
  75. package/dist/src/events/index.d.ts +10 -0
  76. package/dist/src/events/index.js +11 -0
  77. package/dist/src/events/index.js.map +1 -0
  78. package/dist/src/events/types.d.ts +75 -0
  79. package/dist/src/events/types.js +3 -0
  80. package/dist/src/events/types.js.map +1 -0
  81. package/dist/src/index.d.ts +4 -0
  82. package/dist/src/index.js +5 -0
  83. package/dist/src/index.js.map +1 -0
  84. package/dist/src/recommendations/ItemRecommendation.d.ts +5 -0
  85. package/dist/src/recommendations/ItemRecommendation.js +12 -0
  86. package/dist/src/recommendations/ItemRecommendation.js.map +1 -0
  87. package/dist/src/recommendations/Recommendation.d.ts +5 -0
  88. package/dist/src/recommendations/Recommendation.js +9 -0
  89. package/dist/src/recommendations/Recommendation.js.map +1 -0
  90. package/dist/src/recommendations/index.d.ts +1 -0
  91. package/dist/src/recommendations/index.js +2 -0
  92. package/dist/src/recommendations/index.js.map +1 -0
  93. package/dist/src/recommendations/types.d.ts +11 -0
  94. package/dist/src/recommendations/types.js +2 -0
  95. package/dist/src/recommendations/types.js.map +1 -0
  96. package/dist/src/utils/Base.d.ts +13 -0
  97. package/dist/src/utils/Base.js +2 -0
  98. package/dist/src/utils/Base.js.map +1 -0
  99. package/dist/src/utils/LocalStorage.d.ts +8 -0
  100. package/dist/src/utils/LocalStorage.js +30 -0
  101. package/dist/src/utils/LocalStorage.js.map +1 -0
  102. package/dist/src/utils/Logger.d.ts +13 -0
  103. package/dist/src/utils/Logger.js +49 -0
  104. package/dist/src/utils/Logger.js.map +1 -0
  105. package/dist/src/utils/assertEqualTypes.d.ts +3 -0
  106. package/dist/src/utils/assertEqualTypes.js +5 -0
  107. package/dist/src/utils/assertEqualTypes.js.map +1 -0
  108. package/dist/src/utils/getPath.d.ts +1 -0
  109. package/dist/src/utils/getPath.js +9 -0
  110. package/dist/src/utils/getPath.js.map +1 -0
  111. package/dist/src/utils/helper.d.ts +1 -0
  112. package/dist/src/utils/helper.js +4 -0
  113. package/dist/src/utils/helper.js.map +1 -0
  114. package/dist/src/utils/operators.d.ts +2 -0
  115. package/dist/src/utils/operators.js +6 -0
  116. package/dist/src/utils/operators.js.map +1 -0
  117. package/dist/src/utils/zodSchemas.d.ts +19 -0
  118. package/dist/src/utils/zodSchemas.js +105 -0
  119. package/dist/src/utils/zodSchemas.js.map +1 -0
  120. package/package.json +4 -4
package/README.md CHANGED
@@ -24,7 +24,7 @@ const bluxClient = await BluxClient.init({
24
24
  applicationId: "{blux_client_id}",
25
25
  bluxApiKey: "{blux_api_key}",
26
26
  });
27
- bluxClient.setLogLevel("debug");
27
+ bluxClient.setLogLevel("warning");
28
28
  ```
29
29
 
30
30
  - **setLogLevel** : 연동 관련하여 디버깅을 하기 위해서 로깅을 활성화할 수 있습니다. 해당 설정은 정적이므로 BluxClient를 초기화하기 전에 호출하실 수 있습니다.
package/dist/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@blux.ai/web-sdk",
3
- "version": "1.0.0-rc1",
3
+ "version": "1.0.0-rc3",
4
4
  "description": "The official Blux JavaScript browser client library",
5
- "main": "dist/index.js",
6
- "module": "dist/index.js",
7
- "types": "dist/index.d.ts",
5
+ "main": "dist/src/index.js",
6
+ "module": "dist/src/index.js",
7
+ "types": "dist//src/index.d.ts",
8
8
  "license": "UNLICENSED",
9
9
  "scripts": {
10
10
  "test": "jest",
@@ -0,0 +1,41 @@
1
+ import { BehaviorSubject } from "rxjs";
2
+ import type { LogLevel } from "./utils/Logger";
3
+ import type { EventRequest } from "./events/types";
4
+ import type { Event } from "./events/Event";
5
+ import type { Recommendation } from "./recommendations/Recommendation";
6
+ import { type APIs } from "./apis/APIs";
7
+ export type SdkInfo = {
8
+ type: string;
9
+ version: string;
10
+ };
11
+ type BluxUser = {
12
+ id: string;
13
+ bluxApiKey: string;
14
+ applicationId: string;
15
+ deviceId: string;
16
+ userId?: string;
17
+ };
18
+ export declare class BluxClient {
19
+ private readonly api;
20
+ private readonly sdkInfo;
21
+ readonly bluxUser$: BehaviorSubject<BluxUser | undefined>;
22
+ readonly requestQueue$: BehaviorSubject<EventRequest[]>;
23
+ constructor();
24
+ private generateApiHeader;
25
+ static init({ applicationId, bluxApiKey, }: {
26
+ applicationId: string;
27
+ bluxApiKey: string;
28
+ }): Promise<BluxClient | null>;
29
+ setLogLevel(logLevel: LogLevel): void;
30
+ private getBluxUserWithTimeout;
31
+ signIn(userId: string): Promise<void>;
32
+ signOut(): Promise<void>;
33
+ setUserProperties(userProperties: {
34
+ phone_number?: string;
35
+ email_address?: string;
36
+ }): Promise<void>;
37
+ setCustomUserProperties(customUserProperties: Record<string, string | boolean | number | null>): Promise<void>;
38
+ sendEvent(event: Event | Event[]): void;
39
+ getItemRecommendation(recommendation: Recommendation): Promise<APIs.bluxUsersGetItemRecommendations.ResponseData>;
40
+ }
41
+ export {};
@@ -0,0 +1,208 @@
1
+ import packageJson from "../package.json";
2
+ import { asyncScheduler, BehaviorSubject, catchError, exhaustMap, filter, firstValueFrom, map, observeOn, throwError, timeout, withLatestFrom, } from "rxjs";
3
+ import { LocalStorage } from "./utils/LocalStorage";
4
+ import { Logger } from "./utils/Logger";
5
+ import axios from "axios";
6
+ import { filterNullable } from "./utils/operators";
7
+ import { initialize } from "./apis/initialize";
8
+ import { signIn } from "./apis/signIn";
9
+ import { signOut } from "./apis/signOut";
10
+ import { updateUserProperties } from "./apis/updateUserProperties";
11
+ import { updateCustomUserProperties } from "./apis/updateCustomUserProperties";
12
+ import { collectEvent } from "./apis/createEvent";
13
+ import { VisitEvent } from "./events/VisitEvent";
14
+ import { getItemRecommendation } from "./apis/getItemRecommendation";
15
+ import { DevicePlatform } from "./apis/APIs";
16
+ import { AddPageVisitEvent } from "./events/AddPageVisitEvent";
17
+ export class BluxClient {
18
+ api;
19
+ sdkInfo = {
20
+ type: "browser",
21
+ version: packageJson.version,
22
+ };
23
+ bluxUser$ = new BehaviorSubject(undefined);
24
+ requestQueue$ = new BehaviorSubject([]);
25
+ constructor() {
26
+ this.api = axios.create({
27
+ baseURL: "https://api.blux.ai/prod",
28
+ });
29
+ this.requestQueue$
30
+ .pipe(filter((queue) => queue.length > 0), withLatestFrom(this.bluxUser$.pipe(filterNullable())), exhaustMap(async ([requests, bluxUser]) => {
31
+ try {
32
+ await collectEvent(this.api, {
33
+ blux_user_id: bluxUser.id,
34
+ application_id: bluxUser.applicationId,
35
+ }, {
36
+ events: requests.map((request) => ({
37
+ ...request,
38
+ user_id: bluxUser.userId,
39
+ blux_id: bluxUser.id,
40
+ device_id: bluxUser.deviceId,
41
+ })),
42
+ }, this.generateApiHeader(bluxUser));
43
+ }
44
+ catch (error) {
45
+ // todo : retry
46
+ Logger.error(error, { tags: { from: "request-events-api" } });
47
+ }
48
+ return requests.map((r) => r.id); // todo: return successed requests only
49
+ }), map((requestIdsSucceeded) => this.requestQueue$.value.filter((request) => !requestIdsSucceeded.includes(request.id))), observeOn(asyncScheduler))
50
+ .subscribe(this.requestQueue$);
51
+ }
52
+ generateApiHeader({ bluxApiKey }) {
53
+ return {
54
+ Authorization: bluxApiKey,
55
+ };
56
+ }
57
+ static async init({ applicationId, bluxApiKey, }) {
58
+ const client = new BluxClient();
59
+ client.sendEvent(new VisitEvent({}));
60
+ try {
61
+ Logger.debug(`Init with application id: ${applicationId}`);
62
+ const deviceId = LocalStorage.getDeviceId();
63
+ if (!deviceId) {
64
+ Logger.debug("No saved Device ID, register a new one.");
65
+ }
66
+ const { data: { blux_user_id, device_id }, } = await initialize(client.api, { application_id: applicationId }, {
67
+ isVisitHandlingInSdk: true,
68
+ device_id: deviceId ?? undefined,
69
+ country_code: navigator.language.split("-")[1],
70
+ device_model: navigator.userAgent,
71
+ language_code: navigator.language.split("-")[0],
72
+ platform: DevicePlatform.browser,
73
+ os_version: navigator.userAgent,
74
+ sdk_version: client.sdkInfo.version,
75
+ sdk_type: client.sdkInfo.type,
76
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
77
+ }, client.generateApiHeader({
78
+ bluxApiKey,
79
+ }));
80
+ LocalStorage.setDeviceId(device_id);
81
+ client.bluxUser$.next({
82
+ id: blux_user_id,
83
+ bluxApiKey,
84
+ applicationId,
85
+ deviceId: device_id,
86
+ });
87
+ const mutationObserver = new MutationObserver(() => {
88
+ const url = LocalStorage.getUrl();
89
+ if (window.location.href !== url) {
90
+ // 페이지 이동 시 url, ref 업데이트
91
+ LocalStorage.setRef(`${url}`);
92
+ LocalStorage.setUrl(window.location.href);
93
+ // 페이지 이동 시 page_visit event 자동 수집
94
+ client.sendEvent(new AddPageVisitEvent({}));
95
+ }
96
+ });
97
+ const mutationObserverConfig = { subtree: true, childList: true };
98
+ mutationObserver.observe(document.body, mutationObserverConfig);
99
+ return client;
100
+ }
101
+ catch (error) {
102
+ Logger.error(error, { tags: { from: "init" } });
103
+ return null;
104
+ }
105
+ }
106
+ setLogLevel(logLevel) {
107
+ Logger.setLevel(logLevel);
108
+ }
109
+ async getBluxUserWithTimeout() {
110
+ const bluxUser = await firstValueFrom(this.bluxUser$.pipe(filterNullable(), timeout(5000), catchError((error) => {
111
+ return throwError(() => error.name === "TimeoutError"
112
+ ? new Error("Application ID is not initialized. Please initialize BluxClient.")
113
+ : error);
114
+ })));
115
+ return bluxUser;
116
+ }
117
+ async signIn(userId) {
118
+ try {
119
+ const bluxUser = await this.getBluxUserWithTimeout();
120
+ const { data: { blux_user_id: bluxIdInResponse }, } = await signIn(this.api, { application_id: bluxUser.applicationId, blux_user_id: bluxUser.id }, { user_id: userId, device_id: bluxUser.deviceId }, this.generateApiHeader(bluxUser));
121
+ if (bluxIdInResponse !== bluxUser.id) {
122
+ Logger.debug("Blux id is changed in signIn.");
123
+ this.bluxUser$.next({
124
+ ...bluxUser,
125
+ id: bluxIdInResponse,
126
+ });
127
+ }
128
+ }
129
+ catch (error) {
130
+ Logger.error(error, { tags: { from: "signIn" } });
131
+ }
132
+ }
133
+ async signOut() {
134
+ try {
135
+ const bluxUser = await this.getBluxUserWithTimeout();
136
+ const { data: { blux_user_id: bluxIdInResponse }, } = await signOut(this.api, { application_id: bluxUser.applicationId, blux_user_id: bluxUser.id }, { device_id: bluxUser.deviceId }, this.generateApiHeader(bluxUser));
137
+ Logger.debug("Blux id is changed in signOut.");
138
+ this.bluxUser$.next({
139
+ ...bluxUser,
140
+ id: bluxIdInResponse,
141
+ });
142
+ }
143
+ catch (error) {
144
+ Logger.error(error, { tags: { from: "signOut" } });
145
+ }
146
+ }
147
+ async setUserProperties(userProperties) {
148
+ try {
149
+ const bluxUser = await this.getBluxUserWithTimeout();
150
+ await updateUserProperties(this.api, { application_id: bluxUser.applicationId, blux_user_id: bluxUser.id }, { properties: userProperties }, this.generateApiHeader(bluxUser));
151
+ }
152
+ catch (error) {
153
+ Logger.error(error, { tags: { from: "setUserProperties" } });
154
+ }
155
+ }
156
+ async setCustomUserProperties(customUserProperties) {
157
+ try {
158
+ const bluxUser = await this.getBluxUserWithTimeout();
159
+ await updateCustomUserProperties(this.api, { application_id: bluxUser.applicationId, blux_user_id: bluxUser.id }, { properties: customUserProperties }, this.generateApiHeader(bluxUser));
160
+ }
161
+ catch (error) {
162
+ Logger.error(error, { tags: { from: "setCustomUserProperties" } });
163
+ }
164
+ }
165
+ sendEvent(event) {
166
+ const requests = (Array.isArray(event) ? event : [event]).map((event) => {
167
+ // 모든 행동 데이터에 url, ref 추가
168
+ event.request.internal_event_properties = {
169
+ url: `${LocalStorage.getUrl()}`,
170
+ ref: `${LocalStorage.getRef()}`,
171
+ };
172
+ return event.request;
173
+ });
174
+ this.requestQueue$.next([
175
+ ...this.requestQueue$.value,
176
+ ...requests.filter((request) => !this.requestQueue$.value.map((r) => r.id).includes(request.id)),
177
+ ]);
178
+ }
179
+ async getItemRecommendation(recommendation) {
180
+ try {
181
+ const bluxUser = await this.getBluxUserWithTimeout();
182
+ const recommendationRequest = recommendation.request;
183
+ const recommendationResponse = await getItemRecommendation(this.api, {
184
+ application_id: bluxUser.applicationId,
185
+ blux_user_id: bluxUser.id,
186
+ }, {
187
+ call_type: recommendationRequest.call_type,
188
+ limit: recommendationRequest.limit,
189
+ offset: recommendationRequest.offset,
190
+ item_ids: recommendationRequest.item_ids,
191
+ }, this.generateApiHeader(bluxUser));
192
+ return recommendationResponse.data;
193
+ }
194
+ catch (error) {
195
+ Logger.error(error, { tags: { from: "getItemRecommendation" } });
196
+ return {
197
+ items: [],
198
+ metadata: {},
199
+ status: {
200
+ is_success: false,
201
+ code: 400,
202
+ message: error.message,
203
+ },
204
+ };
205
+ }
206
+ }
207
+ }
208
+ //# sourceMappingURL=BluxClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BluxClient.js","sourceRoot":"/","sources":["src/BluxClient.ts"],"names":[],"mappings":"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","sourcesContent":["import packageJson from \"../package.json\";\nimport {\n asyncScheduler,\n BehaviorSubject,\n catchError,\n exhaustMap,\n filter,\n firstValueFrom,\n map,\n observeOn,\n throwError,\n timeout,\n withLatestFrom,\n} from \"rxjs\";\nimport { LocalStorage } from \"./utils/LocalStorage\";\nimport type { LogLevel } from \"./utils/Logger\";\nimport { Logger } from \"./utils/Logger\";\nimport type { AxiosInstance } from \"axios\";\nimport axios from \"axios\";\nimport { filterNullable } from \"./utils/operators\";\nimport type { EventRequest } from \"./events/types\";\nimport type { Event } from \"./events/Event\";\nimport { initialize } from \"./apis/initialize\";\nimport { signIn } from \"./apis/signIn\";\nimport { signOut } from \"./apis/signOut\";\nimport { updateUserProperties } from \"./apis/updateUserProperties\";\nimport { updateCustomUserProperties } from \"./apis/updateCustomUserProperties\";\nimport { collectEvent } from \"./apis/createEvent\";\nimport { VisitEvent } from \"./events/VisitEvent\";\nimport type { Recommendation } from \"./recommendations/Recommendation\";\nimport { getItemRecommendation } from \"./apis/getItemRecommendation\";\nimport { DevicePlatform, type APIs } from \"./apis/APIs\";\nimport { AddPageVisitEvent } from \"./events/AddPageVisitEvent\";\n\nexport type SdkInfo = {\n type: string;\n version: string;\n};\n\ntype BluxUser = {\n id: string;\n bluxApiKey: string;\n applicationId: string;\n deviceId: string;\n userId?: string;\n};\n\nexport class BluxClient {\n private readonly api: AxiosInstance;\n\n private readonly sdkInfo: SdkInfo = {\n type: \"browser\",\n version: packageJson.version,\n };\n\n public readonly bluxUser$ = new BehaviorSubject<BluxUser | undefined>(\n undefined,\n );\n\n public readonly requestQueue$ = new BehaviorSubject<EventRequest[]>([]);\n\n constructor() {\n this.api = axios.create({\n baseURL: \"https://api.blux.ai/prod\",\n });\n this.requestQueue$\n .pipe(\n filter((queue) => queue.length > 0),\n withLatestFrom(this.bluxUser$.pipe(filterNullable())),\n exhaustMap(async ([requests, bluxUser]) => {\n try {\n await collectEvent(\n this.api,\n {\n blux_user_id: bluxUser.id,\n application_id: bluxUser.applicationId,\n },\n {\n events: requests.map((request) => ({\n ...request,\n user_id: bluxUser.userId,\n blux_id: bluxUser.id,\n device_id: bluxUser.deviceId,\n })),\n },\n this.generateApiHeader(bluxUser),\n );\n } catch (error) {\n // todo : retry\n Logger.error(error, { tags: { from: \"request-events-api\" } });\n }\n\n return requests.map((r) => r.id); // todo: return successed requests only\n }),\n map((requestIdsSucceeded) =>\n this.requestQueue$.value.filter(\n (request) => !requestIdsSucceeded.includes(request.id),\n ),\n ),\n observeOn(asyncScheduler),\n )\n .subscribe(this.requestQueue$);\n }\n\n private generateApiHeader({ bluxApiKey }: { bluxApiKey: string }) {\n return {\n Authorization: bluxApiKey,\n };\n }\n\n public static async init({\n applicationId,\n bluxApiKey,\n }: {\n applicationId: string;\n bluxApiKey: string;\n }): Promise<BluxClient | null> {\n const client = new BluxClient();\n client.sendEvent(new VisitEvent({}));\n try {\n Logger.debug(`Init with application id: ${applicationId}`);\n\n const deviceId = LocalStorage.getDeviceId();\n\n if (!deviceId) {\n Logger.debug(\"No saved Device ID, register a new one.\");\n }\n\n const {\n data: { blux_user_id, device_id },\n } = await initialize(\n client.api,\n { application_id: applicationId },\n {\n isVisitHandlingInSdk: true,\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: client.sdkInfo.version,\n sdk_type: client.sdkInfo.type,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n },\n client.generateApiHeader({\n bluxApiKey,\n }),\n );\n\n LocalStorage.setDeviceId(device_id);\n\n client.bluxUser$.next({\n id: blux_user_id,\n bluxApiKey,\n applicationId,\n deviceId: device_id,\n });\n\n const mutationObserver = new MutationObserver(() => {\n const url = LocalStorage.getUrl();\n\n if (window.location.href !== url) {\n // 페이지 이동 시 url, ref 업데이트\n LocalStorage.setRef(`${url}`);\n LocalStorage.setUrl(window.location.href);\n\n // 페이지 이동 시 page_visit event 자동 수집\n client.sendEvent(new AddPageVisitEvent({}));\n }\n });\n const mutationObserverConfig = { subtree: true, childList: true };\n mutationObserver.observe(document.body, mutationObserverConfig);\n\n return client;\n } catch (error) {\n Logger.error(error, { tags: { from: \"init\" } });\n return null;\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: string) {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n\n const {\n data: { blux_user_id: bluxIdInResponse },\n } = await 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 if (bluxIdInResponse !== bluxUser.id) {\n Logger.debug(\"Blux id is changed in signIn.\");\n this.bluxUser$.next({\n ...bluxUser,\n id: bluxIdInResponse,\n });\n }\n } catch (error) {\n Logger.error(error, { tags: { from: \"signIn\" } });\n }\n }\n\n public async signOut() {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n\n const {\n data: { blux_user_id: bluxIdInResponse },\n } = await 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 Logger.debug(\"Blux id is changed in signOut.\");\n this.bluxUser$.next({\n ...bluxUser,\n id: bluxIdInResponse,\n });\n } catch (error) {\n Logger.error(error, { tags: { from: \"signOut\" } });\n }\n }\n\n public async setUserProperties(userProperties: {\n phone_number?: string;\n email_address?: string;\n }) {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n\n await updateUserProperties(\n this.api,\n { application_id: bluxUser.applicationId, blux_user_id: bluxUser.id },\n { properties: userProperties },\n this.generateApiHeader(bluxUser),\n );\n } catch (error) {\n Logger.error(error, { tags: { from: \"setUserProperties\" } });\n }\n }\n\n public async setCustomUserProperties(\n customUserProperties: Record<string, string | boolean | number | null>,\n ) {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n\n await updateCustomUserProperties(\n this.api,\n { application_id: bluxUser.applicationId, blux_user_id: bluxUser.id },\n { properties: customUserProperties },\n this.generateApiHeader(bluxUser),\n );\n } catch (error) {\n Logger.error(error, { tags: { from: \"setCustomUserProperties\" } });\n }\n }\n\n public sendEvent(event: Event | Event[]) {\n const requests = (Array.isArray(event) ? event : [event]).map((event) => {\n // 모든 행동 데이터에 url, ref 추가\n event.request.internal_event_properties = {\n url: `${LocalStorage.getUrl()}`,\n ref: `${LocalStorage.getRef()}`,\n };\n\n return event.request;\n });\n\n this.requestQueue$.next([\n ...this.requestQueue$.value,\n ...requests.filter(\n (request) =>\n !this.requestQueue$.value.map((r) => r.id).includes(request.id),\n ),\n ]);\n }\n\n public async getItemRecommendation(\n recommendation: Recommendation,\n ): Promise<APIs.bluxUsersGetItemRecommendations.ResponseData> {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n const recommendationRequest = recommendation.request;\n\n const recommendationResponse = await getItemRecommendation(\n this.api,\n {\n application_id: bluxUser.applicationId,\n blux_user_id: bluxUser.id,\n },\n {\n call_type: recommendationRequest.call_type,\n limit: recommendationRequest.limit,\n offset: recommendationRequest.offset,\n item_ids: recommendationRequest.item_ids,\n },\n this.generateApiHeader(bluxUser),\n );\n\n return recommendationResponse.data;\n } catch (error) {\n Logger.error(error, { tags: { from: \"getItemRecommendation\" } });\n return {\n items: [],\n metadata: {},\n status: {\n is_success: false,\n code: 400,\n message: error.message,\n },\n };\n }\n }\n}\n"]}