@blux.ai/web-sdk 1.1.5 → 1.1.7-hotfix0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +1 -1
- package/dist/src/BluxClient.d.ts +5 -2
- package/dist/src/BluxClient.js +115 -50
- package/dist/src/BluxClient.js.map +1 -1
- package/dist/src/apis/APIs.d.ts +59 -50
- package/dist/src/apis/APIs.js +13 -18
- package/dist/src/apis/APIs.js.map +1 -1
- package/dist/src/apis/getItemRecommendations.d.ts +4 -0
- package/dist/src/apis/getItemRecommendations.js +7 -0
- package/dist/src/apis/getItemRecommendations.js.map +1 -0
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/recs/ItemRec.d.ts +14 -0
- package/dist/src/recs/ItemRec.js +42 -0
- package/dist/src/recs/ItemRec.js.map +1 -0
- package/dist/src/recs/Rec.d.ts +5 -0
- package/dist/src/{recommendations/Recommendation.js → recs/Rec.js} +2 -2
- package/dist/src/recs/Rec.js.map +1 -0
- package/dist/src/recs/index.d.ts +1 -0
- package/dist/src/recs/index.js +2 -0
- package/dist/src/recs/index.js.map +1 -0
- package/dist/src/recs/types.d.ts +23 -0
- package/dist/src/recs/types.js.map +1 -0
- package/dist/src/utils/zodSchemas.d.ts +41 -0
- package/dist/src/utils/zodSchemas.js +29 -3
- package/dist/src/utils/zodSchemas.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/src/apis/getItemRecommendation.d.ts +0 -4
- package/dist/src/apis/getItemRecommendation.js +0 -7
- package/dist/src/apis/getItemRecommendation.js.map +0 -1
- package/dist/src/recommendations/ItemRecommendation.d.ts +0 -5
- package/dist/src/recommendations/ItemRecommendation.js +0 -12
- package/dist/src/recommendations/ItemRecommendation.js.map +0 -1
- package/dist/src/recommendations/Recommendation.d.ts +0 -5
- package/dist/src/recommendations/Recommendation.js.map +0 -1
- package/dist/src/recommendations/index.d.ts +0 -1
- package/dist/src/recommendations/index.js +0 -2
- package/dist/src/recommendations/index.js.map +0 -1
- package/dist/src/recommendations/types.d.ts +0 -12
- package/dist/src/recommendations/types.js.map +0 -1
- /package/dist/src/{recommendations → recs}/types.js +0 -0
package/dist/package.json
CHANGED
package/dist/src/BluxClient.d.ts
CHANGED
|
@@ -2,8 +2,8 @@ import { BehaviorSubject } from "rxjs";
|
|
|
2
2
|
import type { LogLevel } from "./utils/Logger";
|
|
3
3
|
import type { EventRequest } from "./events/types";
|
|
4
4
|
import type { Event } from "./events/Event";
|
|
5
|
-
import type { Recommendation } from "./recommendations/Recommendation";
|
|
6
5
|
import { type APIs } from "./apis/APIs";
|
|
6
|
+
import type { CategoryRec, ItemRec, ItemsRec, UserRec } from "./recs";
|
|
7
7
|
export type SdkInfo = {
|
|
8
8
|
type: string;
|
|
9
9
|
version: string;
|
|
@@ -44,9 +44,12 @@ export declare class BluxClient {
|
|
|
44
44
|
}): Promise<void>;
|
|
45
45
|
setCustomUserProperties(customUserProperties: Record<string, string | boolean | number | null>): Promise<void>;
|
|
46
46
|
sendEvent(event: Event | Event[]): void;
|
|
47
|
-
getItemRecommendation(recommendation: Recommendation): Promise<APIs.bluxUsersGetItemRecommendations.ResponseData>;
|
|
48
47
|
private handlePageTransition;
|
|
49
48
|
private registerSectionViewObserver;
|
|
50
49
|
private handleIntersection;
|
|
50
|
+
getUserRec(rec: UserRec): Promise<APIs.bluxUsersGetItemRecommendationsV2.ResponseData>;
|
|
51
|
+
getItemRec(rec: ItemRec): Promise<APIs.bluxUsersGetItemRecommendationsV2.ResponseData>;
|
|
52
|
+
getItemsRec(rec: ItemsRec): Promise<APIs.bluxUsersGetItemRecommendationsV2.ResponseData>;
|
|
53
|
+
getCategoryRec(rec: CategoryRec): Promise<APIs.bluxUsersGetItemRecommendationsV2.ResponseData>;
|
|
51
54
|
}
|
|
52
55
|
export {};
|
package/dist/src/BluxClient.js
CHANGED
|
@@ -11,12 +11,12 @@ import { updateUserProperties } from "./apis/updateUserProperties";
|
|
|
11
11
|
import { updateCustomUserProperties } from "./apis/updateCustomUserProperties";
|
|
12
12
|
import { collectEvent } from "./apis/createEvent";
|
|
13
13
|
import { VisitEvent } from "./events/VisitEvent";
|
|
14
|
-
import { getItemRecommendation } from "./apis/getItemRecommendation";
|
|
15
14
|
import { DevicePlatform } from "./apis/APIs";
|
|
16
15
|
import { AddPageVisitEvent } from "./events/AddPageVisitEvent";
|
|
17
16
|
import { SessionStorage } from "./utils/SessionStorage";
|
|
18
17
|
import { AddSectionViewEvent } from "./events";
|
|
19
18
|
import { BLUX_ATTRIBUTES } from "./constants/BLUX_ATTRIBUTES";
|
|
19
|
+
import { getItemRecommendations } from "./apis/getItemRecommendations";
|
|
20
20
|
export class BluxClient {
|
|
21
21
|
api = axios.create({
|
|
22
22
|
baseURL: "https://api.blux.ai/prod",
|
|
@@ -44,6 +44,11 @@ export class BluxClient {
|
|
|
44
44
|
}, {
|
|
45
45
|
events: requests.map((request) => ({
|
|
46
46
|
...request,
|
|
47
|
+
internal_event_properties: {
|
|
48
|
+
...request.internal_event_properties,
|
|
49
|
+
url: `${LocalStorage.getUrl()}`,
|
|
50
|
+
ref: `${LocalStorage.getRef()}`,
|
|
51
|
+
},
|
|
47
52
|
blux_id: bluxUser.id,
|
|
48
53
|
device_id: bluxUser.deviceId,
|
|
49
54
|
})),
|
|
@@ -83,6 +88,17 @@ export class BluxClient {
|
|
|
83
88
|
if (!deviceId) {
|
|
84
89
|
Logger.debug("No saved Device ID, register a new one.");
|
|
85
90
|
}
|
|
91
|
+
// [페이지 이동 처리]
|
|
92
|
+
this.handlePageTransition();
|
|
93
|
+
// [Section View 자동 수집 관련 처리]
|
|
94
|
+
this.registerSectionViewObserver(); // init 시마다 특정 section을 observe하는 intersection observer 등록
|
|
95
|
+
// 아직 Web SDK 사용 클라이언트 중 SPA 구현이 없으므로 주석 처리
|
|
96
|
+
// (SPA 처리) init이 최초 1회만 호출되더라도 페이지 이동 및 intersection observer를 처리할 수 있도록 MutationObserver 등록
|
|
97
|
+
// const mutationObserver = new MutationObserver(() => {
|
|
98
|
+
// this.registerSectionViewObserver();
|
|
99
|
+
// });
|
|
100
|
+
// const mutationObserverConfig = { subtree: true, childList: true };
|
|
101
|
+
// mutationObserver.observe(document.body, mutationObserverConfig);
|
|
86
102
|
const { data } = await initialize(this.api, { application_id: this.applicationId }, {
|
|
87
103
|
isVisitHandlingInSdk: true,
|
|
88
104
|
device_id: deviceId ?? undefined,
|
|
@@ -106,16 +122,6 @@ export class BluxClient {
|
|
|
106
122
|
applicationId: this.applicationId,
|
|
107
123
|
deviceId: data.device_id,
|
|
108
124
|
});
|
|
109
|
-
// [페이지 이동 처리]
|
|
110
|
-
this.handlePageTransition();
|
|
111
|
-
// [Section View 자동 수집 관련 처리]
|
|
112
|
-
this.registerSectionViewObserver(); // init 시마다 특정 section을 observe하는 intersection observer 등록
|
|
113
|
-
// (SPA 처리) init이 최초 1회만 호출되더라도 페이지 이동 및 intersection observer를 처리할 수 있도록 MutationObserver 등록
|
|
114
|
-
const mutationObserver = new MutationObserver(() => {
|
|
115
|
-
this.registerSectionViewObserver();
|
|
116
|
-
});
|
|
117
|
-
const mutationObserverConfig = { subtree: true, childList: true };
|
|
118
|
-
mutationObserver.observe(document.body, mutationObserverConfig);
|
|
119
125
|
}
|
|
120
126
|
setLogLevel(logLevel) {
|
|
121
127
|
Logger.setLevel(logLevel);
|
|
@@ -177,56 +183,18 @@ export class BluxClient {
|
|
|
177
183
|
}
|
|
178
184
|
}
|
|
179
185
|
sendEvent(event) {
|
|
180
|
-
const requests = (Array.isArray(event) ? event : [event]).map((event) =>
|
|
181
|
-
// 모든 행동 데이터에 url, ref 추가
|
|
182
|
-
event.request.internal_event_properties = {
|
|
183
|
-
url: `${LocalStorage.getUrl()}`,
|
|
184
|
-
ref: `${LocalStorage.getRef()}`,
|
|
185
|
-
};
|
|
186
|
-
return event.request;
|
|
187
|
-
});
|
|
186
|
+
const requests = (Array.isArray(event) ? event : [event]).map((event) => event.request);
|
|
188
187
|
this.requestQueue$.next([
|
|
189
188
|
...this.requestQueue$.value,
|
|
190
189
|
...requests.filter((request) => !this.requestQueue$.value.map((r) => r.id).includes(request.id)),
|
|
191
190
|
]);
|
|
192
191
|
}
|
|
193
|
-
async getItemRecommendation(recommendation) {
|
|
194
|
-
try {
|
|
195
|
-
const bluxUser = await this.getBluxUserWithTimeout();
|
|
196
|
-
const recommendationRequest = recommendation.request;
|
|
197
|
-
const recommendationResponse = await getItemRecommendation(this.api, {
|
|
198
|
-
application_id: bluxUser.applicationId,
|
|
199
|
-
blux_user_id: bluxUser.id,
|
|
200
|
-
}, {
|
|
201
|
-
call_type: recommendationRequest.call_type,
|
|
202
|
-
limit: recommendationRequest.limit,
|
|
203
|
-
offset: recommendationRequest.offset,
|
|
204
|
-
item_ids: recommendationRequest.item_ids,
|
|
205
|
-
options: recommendationRequest.options,
|
|
206
|
-
}, this.generateApiHeader(bluxUser));
|
|
207
|
-
return recommendationResponse.data;
|
|
208
|
-
}
|
|
209
|
-
catch (error) {
|
|
210
|
-
Logger.error(error, { tags: { from: "getItemRecommendation" } });
|
|
211
|
-
return {
|
|
212
|
-
items: [],
|
|
213
|
-
metadata: {},
|
|
214
|
-
status: {
|
|
215
|
-
is_success: false,
|
|
216
|
-
code: 400,
|
|
217
|
-
message: error.message,
|
|
218
|
-
},
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
192
|
handlePageTransition() {
|
|
223
193
|
const url = LocalStorage.getUrl();
|
|
224
194
|
if (window.location.href !== url) {
|
|
225
195
|
// 페이지 이동 시 url, ref 업데이트
|
|
226
196
|
LocalStorage.setRef(`${url}`);
|
|
227
197
|
LocalStorage.setUrl(window.location.href);
|
|
228
|
-
// 페이지 이동 시 page_visit event 자동 수집
|
|
229
|
-
this.sendEvent(new AddPageVisitEvent({}));
|
|
230
198
|
// 페이지 이동 시 section view 관련 변수 초기화
|
|
231
199
|
this.sectionViewCollectedSections = [];
|
|
232
200
|
this.observingTargetElements = {};
|
|
@@ -234,6 +202,8 @@ export class BluxClient {
|
|
|
234
202
|
observer.disconnect();
|
|
235
203
|
});
|
|
236
204
|
}
|
|
205
|
+
// 페이지 이동 시 page_visit event 자동 수집
|
|
206
|
+
this.sendEvent(new AddPageVisitEvent({}));
|
|
237
207
|
}
|
|
238
208
|
registerSectionViewObserver() {
|
|
239
209
|
const targetElements = Array.from(document.querySelectorAll(`[${BLUX_ATTRIBUTES.section}]`));
|
|
@@ -270,5 +240,100 @@ export class BluxClient {
|
|
|
270
240
|
}
|
|
271
241
|
});
|
|
272
242
|
}
|
|
243
|
+
async getUserRec(rec) {
|
|
244
|
+
try {
|
|
245
|
+
const bluxUser = await this.getBluxUserWithTimeout();
|
|
246
|
+
const recRequest = rec.request;
|
|
247
|
+
const recommendationResponse = await getItemRecommendations(this.api, {
|
|
248
|
+
application_id: bluxUser.applicationId,
|
|
249
|
+
blux_user_id: bluxUser.id,
|
|
250
|
+
}, {
|
|
251
|
+
call_type: recRequest.call_type,
|
|
252
|
+
limit: recRequest.limit,
|
|
253
|
+
offset: recRequest.offset,
|
|
254
|
+
}, this.generateApiHeader(bluxUser));
|
|
255
|
+
return recommendationResponse.data;
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
Logger.error(error, { tags: { from: "getItemRecommendations" } });
|
|
259
|
+
return {
|
|
260
|
+
item_ids: [],
|
|
261
|
+
metadata: {},
|
|
262
|
+
recommendation_id: null,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
async getItemRec(rec) {
|
|
267
|
+
try {
|
|
268
|
+
const bluxUser = await this.getBluxUserWithTimeout();
|
|
269
|
+
const recRequest = rec.request;
|
|
270
|
+
const recommendationResponse = await getItemRecommendations(this.api, {
|
|
271
|
+
application_id: bluxUser.applicationId,
|
|
272
|
+
blux_user_id: bluxUser.id,
|
|
273
|
+
}, {
|
|
274
|
+
call_type: recRequest.call_type,
|
|
275
|
+
limit: recRequest.limit,
|
|
276
|
+
offset: recRequest.offset,
|
|
277
|
+
item_id: recRequest.item_id,
|
|
278
|
+
}, this.generateApiHeader(bluxUser));
|
|
279
|
+
return recommendationResponse.data;
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
Logger.error(error, { tags: { from: "getItemRecommendations" } });
|
|
283
|
+
return {
|
|
284
|
+
item_ids: [],
|
|
285
|
+
metadata: {},
|
|
286
|
+
recommendation_id: null,
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
async getItemsRec(rec) {
|
|
291
|
+
try {
|
|
292
|
+
const bluxUser = await this.getBluxUserWithTimeout();
|
|
293
|
+
const recRequest = rec.request;
|
|
294
|
+
const recommendationResponse = await getItemRecommendations(this.api, {
|
|
295
|
+
application_id: bluxUser.applicationId,
|
|
296
|
+
blux_user_id: bluxUser.id,
|
|
297
|
+
}, {
|
|
298
|
+
call_type: recRequest.call_type,
|
|
299
|
+
limit: recRequest.limit,
|
|
300
|
+
offset: recRequest.offset,
|
|
301
|
+
item_ids: recRequest.item_ids,
|
|
302
|
+
}, this.generateApiHeader(bluxUser));
|
|
303
|
+
return recommendationResponse.data;
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
Logger.error(error, { tags: { from: "getItemRecommendations" } });
|
|
307
|
+
return {
|
|
308
|
+
item_ids: [],
|
|
309
|
+
metadata: {},
|
|
310
|
+
recommendation_id: null,
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
async getCategoryRec(rec) {
|
|
315
|
+
try {
|
|
316
|
+
const bluxUser = await this.getBluxUserWithTimeout();
|
|
317
|
+
const recRequest = rec.request;
|
|
318
|
+
const recommendationResponse = await getItemRecommendations(this.api, {
|
|
319
|
+
application_id: bluxUser.applicationId,
|
|
320
|
+
blux_user_id: bluxUser.id,
|
|
321
|
+
}, {
|
|
322
|
+
call_type: recRequest.call_type,
|
|
323
|
+
limit: recRequest.limit,
|
|
324
|
+
offset: recRequest.offset,
|
|
325
|
+
category_id: recRequest.category_id,
|
|
326
|
+
}, this.generateApiHeader(bluxUser));
|
|
327
|
+
return recommendationResponse.data;
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
Logger.error(error, { tags: { from: "getItemRecommendations" } });
|
|
331
|
+
return {
|
|
332
|
+
item_ids: [],
|
|
333
|
+
metadata: {},
|
|
334
|
+
recommendation_id: null,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
}
|
|
273
338
|
}
|
|
274
339
|
//# sourceMappingURL=BluxClient.js.map
|
|
@@ -1 +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 combineLatest,\n exhaustMap,\n filter,\n firstValueFrom,\n map,\n observeOn,\n throwError,\n timeout,\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\";\nimport { SessionStorage } from \"./utils/SessionStorage\";\nimport { AddSectionViewEvent } from \"./events\";\nimport { BLUX_ATTRIBUTES } from \"./constants/BLUX_ATTRIBUTES\";\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 = axios.create({\n baseURL: \"https://api.blux.ai/prod\",\n });\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 private readonly applicationId: string;\n private readonly bluxApiKey: string;\n\n private sectionViewCollectedSections: string[] = [];\n private observingTargetElements: { [call_type: string]: Element } = {};\n private sectionViewObservers: IntersectionObserver[] = [];\n\n constructor(\n {\n applicationId,\n bluxApiKey,\n }: {\n applicationId: string;\n bluxApiKey: string;\n },\n completionCallback?: (args: {\n errorMessage?: string;\n success: boolean;\n }) => void,\n ) {\n this.applicationId = applicationId;\n this.bluxApiKey = bluxApiKey;\n\n combineLatest([this.requestQueue$, this.bluxUser$.pipe(filterNullable())])\n .pipe(\n filter(([requests]) => requests.length > 0),\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 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 this.bluxUser$.subscribe((bluxUser) => {\n if (bluxUser) SessionStorage.setBluxUserId(bluxUser.id);\n });\n\n this.init()\n .then(() => {\n completionCallback?.({ success: true });\n })\n .catch((error) => {\n completionCallback?.({ success: false, errorMessage: error.message });\n });\n }\n\n private generateApiHeader({ bluxApiKey }: { bluxApiKey: string }) {\n return {\n Authorization: bluxApiKey,\n };\n }\n\n private async init() {\n const blux_user_id = new URLSearchParams(window.location.search).get(\n \"blux_user_id\",\n );\n\n const isBluxUserIdExistInSessionStorage = SessionStorage.getBluxUserId();\n if (!isBluxUserIdExistInSessionStorage) this.sendEvent(new VisitEvent({}));\n\n Logger.debug(`Init with application id: ${this.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 { data } = await initialize(\n this.api,\n { application_id: this.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: this.sdkInfo.version,\n sdk_type: this.sdkInfo.type,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n blux_user_id: blux_user_id ?? undefined,\n },\n this.generateApiHeader({\n bluxApiKey: this.bluxApiKey,\n }),\n );\n\n if (data.device_id) LocalStorage.setDeviceId(data.device_id);\n\n this.bluxUser$.next({\n id: data.blux_user_id,\n bluxApiKey: this.bluxApiKey,\n applicationId: this.applicationId,\n deviceId: data.device_id,\n });\n\n // [페이지 이동 처리]\n this.handlePageTransition();\n\n // [Section View 자동 수집 관련 처리]\n this.registerSectionViewObserver(); // init 시마다 특정 section을 observe하는 intersection observer 등록\n\n // (SPA 처리) init이 최초 1회만 호출되더라도 페이지 이동 및 intersection observer를 처리할 수 있도록 MutationObserver 등록\n const mutationObserver = new MutationObserver(() => {\n this.registerSectionViewObserver();\n });\n const mutationObserverConfig = { subtree: true, childList: true };\n mutationObserver.observe(document.body, mutationObserverConfig);\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 options: recommendationRequest.options,\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 private handlePageTransition() {\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 this.sendEvent(new AddPageVisitEvent({}));\n\n // 페이지 이동 시 section view 관련 변수 초기화\n this.sectionViewCollectedSections = [];\n this.observingTargetElements = {};\n this.sectionViewObservers.forEach((observer) => {\n observer.disconnect();\n });\n }\n }\n\n private registerSectionViewObserver() {\n const targetElements = Array.from(\n document.querySelectorAll(`[${BLUX_ATTRIBUTES.section}]`),\n );\n\n targetElements.forEach((targetElement) => {\n const section = targetElement.getAttribute(BLUX_ATTRIBUTES.section);\n if (!section) return;\n // 이미 observe 중인 section은 skip\n if (this.observingTargetElements[section]) {\n return;\n }\n\n this.observingTargetElements[section] = targetElement;\n const observer = new IntersectionObserver(\n this.handleIntersection.bind(this),\n { threshold: 0 },\n );\n observer.observe(targetElement);\n this.sectionViewObservers.push(observer);\n\n Logger.debug(\n `SectionView observer is registered for section: \"${section}\".`,\n );\n });\n }\n\n private handleIntersection(entries: IntersectionObserverEntry[]) {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n const section = entry.target.getAttribute(BLUX_ATTRIBUTES.section);\n const recommendationId = entry.target.getAttribute(\n BLUX_ATTRIBUTES.recommendation_id,\n );\n if (!section) {\n return;\n }\n\n if (!this.sectionViewCollectedSections.includes(section)) {\n this.sendEvent(\n new AddSectionViewEvent({\n section,\n recommendation_id: recommendationId ?? undefined,\n }),\n );\n this.sectionViewCollectedSections.push(section);\n }\n }\n });\n }\n}\n"]}
|
|
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 combineLatest,\n exhaustMap,\n filter,\n firstValueFrom,\n map,\n observeOn,\n throwError,\n timeout,\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 { DevicePlatform, type APIs } from \"./apis/APIs\";\nimport { AddPageVisitEvent } from \"./events/AddPageVisitEvent\";\nimport { SessionStorage } from \"./utils/SessionStorage\";\nimport { AddSectionViewEvent } from \"./events\";\nimport { BLUX_ATTRIBUTES } from \"./constants/BLUX_ATTRIBUTES\";\nimport type { CategoryRec, ItemRec, ItemsRec, UserRec } from \"./recs\";\nimport { getItemRecommendations } from \"./apis/getItemRecommendations\";\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 = axios.create({\n baseURL: \"https://api.blux.ai/prod\",\n });\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 private readonly applicationId: string;\n private readonly bluxApiKey: string;\n\n private sectionViewCollectedSections: string[] = [];\n private observingTargetElements: { [call_type: string]: Element } = {};\n private sectionViewObservers: IntersectionObserver[] = [];\n\n constructor(\n {\n applicationId,\n bluxApiKey,\n }: {\n applicationId: string;\n bluxApiKey: string;\n },\n completionCallback?: (args: {\n errorMessage?: string;\n success: boolean;\n }) => void,\n ) {\n this.applicationId = applicationId;\n this.bluxApiKey = bluxApiKey;\n\n combineLatest([this.requestQueue$, this.bluxUser$.pipe(filterNullable())])\n .pipe(\n filter(([requests]) => requests.length > 0),\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 internal_event_properties: {\n ...request.internal_event_properties,\n url: `${LocalStorage.getUrl()}`,\n ref: `${LocalStorage.getRef()}`,\n },\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 this.bluxUser$.subscribe((bluxUser) => {\n if (bluxUser) SessionStorage.setBluxUserId(bluxUser.id);\n });\n\n this.init()\n .then(() => {\n completionCallback?.({ success: true });\n })\n .catch((error) => {\n completionCallback?.({ success: false, errorMessage: error.message });\n });\n }\n\n private generateApiHeader({ bluxApiKey }: { bluxApiKey: string }) {\n return {\n Authorization: bluxApiKey,\n };\n }\n\n private async init() {\n const blux_user_id = new URLSearchParams(window.location.search).get(\n \"blux_user_id\",\n );\n\n const isBluxUserIdExistInSessionStorage = SessionStorage.getBluxUserId();\n if (!isBluxUserIdExistInSessionStorage) this.sendEvent(new VisitEvent({}));\n\n Logger.debug(`Init with application id: ${this.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 // [페이지 이동 처리]\n this.handlePageTransition();\n\n // [Section View 자동 수집 관련 처리]\n this.registerSectionViewObserver(); // init 시마다 특정 section을 observe하는 intersection observer 등록\n\n // 아직 Web SDK 사용 클라이언트 중 SPA 구현이 없으므로 주석 처리\n // (SPA 처리) init이 최초 1회만 호출되더라도 페이지 이동 및 intersection observer를 처리할 수 있도록 MutationObserver 등록\n // const mutationObserver = new MutationObserver(() => {\n // this.registerSectionViewObserver();\n // });\n // const mutationObserverConfig = { subtree: true, childList: true };\n // mutationObserver.observe(document.body, mutationObserverConfig);\n\n const { data } = await initialize(\n this.api,\n { application_id: this.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: this.sdkInfo.version,\n sdk_type: this.sdkInfo.type,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n blux_user_id: blux_user_id ?? undefined,\n },\n this.generateApiHeader({\n bluxApiKey: this.bluxApiKey,\n }),\n );\n\n if (data.device_id) LocalStorage.setDeviceId(data.device_id);\n\n this.bluxUser$.next({\n id: data.blux_user_id,\n bluxApiKey: this.bluxApiKey,\n applicationId: this.applicationId,\n deviceId: data.device_id,\n });\n }\n\n public setLogLevel(logLevel: LogLevel) {\n Logger.setLevel(logLevel);\n }\n\n private async getBluxUserWithTimeout() {\n const bluxUser = await firstValueFrom(\n this.bluxUser$.pipe(\n filterNullable(),\n timeout(5000),\n catchError((error) => {\n return throwError(() =>\n error.name === \"TimeoutError\"\n ? new Error(\n \"Application ID is not initialized. Please initialize BluxClient.\",\n )\n : error,\n );\n }),\n ),\n );\n\n return bluxUser;\n }\n\n public async signIn(userId: 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(\n (event) => 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 private handlePageTransition() {\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 // 페이지 이동 시 section view 관련 변수 초기화\n this.sectionViewCollectedSections = [];\n this.observingTargetElements = {};\n this.sectionViewObservers.forEach((observer) => {\n observer.disconnect();\n });\n }\n\n // 페이지 이동 시 page_visit event 자동 수집\n this.sendEvent(new AddPageVisitEvent({}));\n }\n\n private registerSectionViewObserver() {\n const targetElements = Array.from(\n document.querySelectorAll(`[${BLUX_ATTRIBUTES.section}]`),\n );\n\n targetElements.forEach((targetElement) => {\n const section = targetElement.getAttribute(BLUX_ATTRIBUTES.section);\n if (!section) return;\n // 이미 observe 중인 section은 skip\n if (this.observingTargetElements[section]) {\n return;\n }\n\n this.observingTargetElements[section] = targetElement;\n const observer = new IntersectionObserver(\n this.handleIntersection.bind(this),\n { threshold: 0 },\n );\n observer.observe(targetElement);\n this.sectionViewObservers.push(observer);\n\n Logger.debug(\n `SectionView observer is registered for section: \"${section}\".`,\n );\n });\n }\n\n private handleIntersection(entries: IntersectionObserverEntry[]) {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n const section = entry.target.getAttribute(BLUX_ATTRIBUTES.section);\n const recommendationId = entry.target.getAttribute(\n BLUX_ATTRIBUTES.recommendation_id,\n );\n if (!section) {\n return;\n }\n\n if (!this.sectionViewCollectedSections.includes(section)) {\n this.sendEvent(\n new AddSectionViewEvent({\n section,\n recommendation_id: recommendationId ?? undefined,\n }),\n );\n this.sectionViewCollectedSections.push(section);\n }\n }\n });\n }\n\n public async getUserRec(\n rec: UserRec,\n ): Promise<APIs.bluxUsersGetItemRecommendationsV2.ResponseData> {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n const recRequest = rec.request;\n\n const recommendationResponse = await getItemRecommendations(\n this.api,\n {\n application_id: bluxUser.applicationId,\n blux_user_id: bluxUser.id,\n },\n {\n call_type: recRequest.call_type,\n limit: recRequest.limit,\n offset: recRequest.offset,\n },\n this.generateApiHeader(bluxUser),\n );\n\n return recommendationResponse.data;\n } catch (error) {\n Logger.error(error, { tags: { from: \"getItemRecommendations\" } });\n return {\n item_ids: [],\n metadata: {},\n recommendation_id: null,\n };\n }\n }\n\n public async getItemRec(\n rec: ItemRec,\n ): Promise<APIs.bluxUsersGetItemRecommendationsV2.ResponseData> {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n const recRequest = rec.request;\n\n const recommendationResponse = await getItemRecommendations(\n this.api,\n {\n application_id: bluxUser.applicationId,\n blux_user_id: bluxUser.id,\n },\n {\n call_type: recRequest.call_type,\n limit: recRequest.limit,\n offset: recRequest.offset,\n item_id: recRequest.item_id,\n },\n this.generateApiHeader(bluxUser),\n );\n\n return recommendationResponse.data;\n } catch (error) {\n Logger.error(error, { tags: { from: \"getItemRecommendations\" } });\n return {\n item_ids: [],\n metadata: {},\n recommendation_id: null,\n };\n }\n }\n\n public async getItemsRec(\n rec: ItemsRec,\n ): Promise<APIs.bluxUsersGetItemRecommendationsV2.ResponseData> {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n const recRequest = rec.request;\n\n const recommendationResponse = await getItemRecommendations(\n this.api,\n {\n application_id: bluxUser.applicationId,\n blux_user_id: bluxUser.id,\n },\n {\n call_type: recRequest.call_type,\n limit: recRequest.limit,\n offset: recRequest.offset,\n item_ids: recRequest.item_ids,\n },\n this.generateApiHeader(bluxUser),\n );\n\n return recommendationResponse.data;\n } catch (error) {\n Logger.error(error, { tags: { from: \"getItemRecommendations\" } });\n return {\n item_ids: [],\n metadata: {},\n recommendation_id: null,\n };\n }\n }\n\n public async getCategoryRec(\n rec: CategoryRec,\n ): Promise<APIs.bluxUsersGetItemRecommendationsV2.ResponseData> {\n try {\n const bluxUser = await this.getBluxUserWithTimeout();\n const recRequest = rec.request;\n\n const recommendationResponse = await getItemRecommendations(\n this.api,\n {\n application_id: bluxUser.applicationId,\n blux_user_id: bluxUser.id,\n },\n {\n call_type: recRequest.call_type,\n limit: recRequest.limit,\n offset: recRequest.offset,\n category_id: recRequest.category_id,\n },\n this.generateApiHeader(bluxUser),\n );\n\n return recommendationResponse.data;\n } catch (error) {\n Logger.error(error, { tags: { from: \"getItemRecommendations\" } });\n return {\n item_ids: [],\n metadata: {},\n recommendation_id: null,\n };\n }\n }\n}\n"]}
|
package/dist/src/apis/APIs.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
import type { RecResponse } from "../utils/zodSchemas";
|
|
2
3
|
import type { Serialize } from "../utils/Base";
|
|
3
4
|
declare enum HttpMethod {
|
|
4
5
|
GET = "get",
|
|
@@ -37,9 +38,9 @@ export declare namespace APIs {
|
|
|
37
38
|
sdk_version: string;
|
|
38
39
|
timezone: string;
|
|
39
40
|
isVisitHandlingInSdk: boolean;
|
|
41
|
+
blux_user_id?: string | undefined;
|
|
40
42
|
device_id?: import("bson-objectid").default | undefined;
|
|
41
43
|
country_code?: "AF" | "AL" | "DZ" | "AS" | "AD" | "AO" | "AI" | "AG" | "AR" | "AM" | "AW" | "AU" | "AT" | "AZ" | "BS" | "BH" | "BD" | "BB" | "BY" | "BE" | "BZ" | "BJ" | "BM" | "BT" | "BO" | "BA" | "BW" | "BR" | "IO" | "BN" | "BG" | "BF" | "BI" | "KH" | "CM" | "CV" | "KY" | "CF" | "TD" | "CL" | "CN" | "CO" | "KM" | "CG" | "CD" | "CK" | "CR" | "CI" | "HR" | "CU" | "CY" | "CZ" | "DK" | "DJ" | "DM" | "DO" | "EC" | "EG" | "SV" | "GQ" | "ER" | "EE" | "ET" | "FK" | "FO" | "FJ" | "FI" | "FR" | "GF" | "PF" | "GA" | "GM" | "GE" | "DE" | "GH" | "GI" | "GR" | "GL" | "GD" | "GP" | "GU" | "GT" | "GN" | "GW" | "HT" | "VA" | "HN" | "HK" | "HU" | "IS" | "IN" | "ID" | "IR" | "IQ" | "IE" | "IL" | "IT" | "JM" | "JP" | "JO" | "KE" | "KI" | "KP" | "KR" | "KW" | "KG" | "LA" | "LV" | "LB" | "LS" | "LR" | "LY" | "LI" | "LT" | "LU" | "MO" | "MK" | "MG" | "MW" | "MY" | "MV" | "ML" | "MT" | "MH" | "MQ" | "MR" | "MU" | "YT" | "MX" | "FM" | "MD" | "MC" | "MN" | "ME" | "MS" | "MA" | "MZ" | "MM" | "NA" | "NR" | "NP" | "NL" | "NC" | "NZ" | "NI" | "NE" | "NG" | "NU" | "NF" | "MP" | "NO" | "OM" | "PK" | "PW" | "PS" | "PA" | "PG" | "PY" | "GY" | "PE" | "PH" | "PL" | "PT" | "PR" | "QA" | "RO" | "RU" | "KZ" | "RW" | "RE" | "BL" | "SH" | "KN" | "LC" | "MF" | "PM" | "VC" | "WS" | "SM" | "ST" | "SA" | "SN" | "RS" | "SC" | "SL" | "SG" | "SK" | "SI" | "SB" | "SO" | "ZA" | "SS" | "ES" | "LK" | "SD" | "SR" | "SZ" | "SE" | "CH" | "SY" | "TW" | "TJ" | "TZ" | "TH" | "TL" | "TG" | "TK" | "TO" | "TT" | "TN" | "TR" | "TM" | "TC" | "TV" | "UG" | "UA" | "AE" | "GB" | "US" | "CA" | "UY" | "UZ" | "VU" | "VE" | "VN" | "VG" | "VI" | "WF" | "YE" | "ZM" | "ZW" | undefined;
|
|
42
|
-
blux_user_id?: string | undefined;
|
|
43
44
|
}, {
|
|
44
45
|
device_model: string;
|
|
45
46
|
language_code: string;
|
|
@@ -48,10 +49,10 @@ export declare namespace APIs {
|
|
|
48
49
|
sdk_type: string;
|
|
49
50
|
sdk_version: string;
|
|
50
51
|
timezone: string;
|
|
52
|
+
blux_user_id?: string | undefined;
|
|
51
53
|
device_id?: string | undefined;
|
|
52
54
|
country_code?: unknown;
|
|
53
55
|
isVisitHandlingInSdk?: boolean | undefined;
|
|
54
|
-
blux_user_id?: string | undefined;
|
|
55
56
|
}>;
|
|
56
57
|
type Body = Serialize<z.input<typeof bodySchema>>;
|
|
57
58
|
const pathSchema: z.ZodObject<{
|
|
@@ -132,11 +133,11 @@ export declare namespace APIs {
|
|
|
132
133
|
application_id: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, import("bson-objectid").default, string>;
|
|
133
134
|
blux_user_id: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, import("bson-objectid").default, string>;
|
|
134
135
|
}, "strip", z.ZodTypeAny, {
|
|
135
|
-
blux_user_id: import("bson-objectid").default;
|
|
136
136
|
application_id: import("bson-objectid").default;
|
|
137
|
+
blux_user_id: import("bson-objectid").default;
|
|
137
138
|
}, {
|
|
138
|
-
blux_user_id: string;
|
|
139
139
|
application_id: string;
|
|
140
|
+
blux_user_id: string;
|
|
140
141
|
}>;
|
|
141
142
|
type PathParam = Serialize<z.input<typeof pathSchema>>;
|
|
142
143
|
const bodySchema: z.ZodObject<{
|
|
@@ -215,52 +216,6 @@ export declare namespace APIs {
|
|
|
215
216
|
type Body = Serialize<z.input<typeof bodySchema>>;
|
|
216
217
|
type ResponseData = boolean;
|
|
217
218
|
}
|
|
218
|
-
namespace bluxUsersGetItemRecommendations {
|
|
219
|
-
const name = "bluxUsersGetItemRecommendations";
|
|
220
|
-
const path: string;
|
|
221
|
-
const method = HttpMethod.POST;
|
|
222
|
-
const bodySchema: z.ZodObject<{
|
|
223
|
-
call_type: z.ZodString;
|
|
224
|
-
limit: z.ZodNumber;
|
|
225
|
-
offset: z.ZodDefault<z.ZodNumber>;
|
|
226
|
-
item_ids: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
227
|
-
options: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
|
|
228
|
-
}, "strip", z.ZodTypeAny, {
|
|
229
|
-
call_type: string;
|
|
230
|
-
limit: number;
|
|
231
|
-
offset: number;
|
|
232
|
-
options?: Record<string, any> | undefined;
|
|
233
|
-
item_ids?: string[] | undefined;
|
|
234
|
-
}, {
|
|
235
|
-
call_type: string;
|
|
236
|
-
limit: number;
|
|
237
|
-
options?: Record<string, any> | undefined;
|
|
238
|
-
offset?: number | undefined;
|
|
239
|
-
item_ids?: string[] | undefined;
|
|
240
|
-
}>;
|
|
241
|
-
type Body = Serialize<z.input<typeof bodySchema>>;
|
|
242
|
-
const pathSchema: z.ZodObject<{
|
|
243
|
-
application_id: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, import("bson-objectid").default, string>;
|
|
244
|
-
blux_user_id: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, import("bson-objectid").default, string>;
|
|
245
|
-
}, "strip", z.ZodTypeAny, {
|
|
246
|
-
blux_user_id: import("bson-objectid").default;
|
|
247
|
-
application_id: import("bson-objectid").default;
|
|
248
|
-
}, {
|
|
249
|
-
blux_user_id: string;
|
|
250
|
-
application_id: string;
|
|
251
|
-
}>;
|
|
252
|
-
type PathParam = Serialize<z.input<typeof pathSchema>>;
|
|
253
|
-
type ResponseData = {
|
|
254
|
-
recommendation_id?: string;
|
|
255
|
-
items: string[];
|
|
256
|
-
metadata: Record<string, any>;
|
|
257
|
-
status: {
|
|
258
|
-
is_success: boolean;
|
|
259
|
-
code: number;
|
|
260
|
-
message?: string;
|
|
261
|
-
};
|
|
262
|
-
};
|
|
263
|
-
}
|
|
264
219
|
namespace bluxUsersUpdateUserProperties {
|
|
265
220
|
const name = "bluxUsersUpdateUserProperties";
|
|
266
221
|
const path: string;
|
|
@@ -350,5 +305,59 @@ export declare namespace APIs {
|
|
|
350
305
|
blux_user_id: string;
|
|
351
306
|
};
|
|
352
307
|
}
|
|
308
|
+
namespace bluxUsersGetItemRecommendationsV2 {
|
|
309
|
+
const name = "bluxUsersGetItemRecommendationsV2";
|
|
310
|
+
const path: string;
|
|
311
|
+
const method = HttpMethod.POST;
|
|
312
|
+
const bodySchema: z.ZodObject<z.objectUtil.extendShape<Pick<{
|
|
313
|
+
application_id: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, import("bson-objectid").default, string>;
|
|
314
|
+
blux_user_id: z.ZodOptional<z.ZodNullable<z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, import("bson-objectid").default, string>>>;
|
|
315
|
+
pipeline: z.ZodArray<z.ZodObject<{
|
|
316
|
+
name: z.ZodString;
|
|
317
|
+
kwargs: z.ZodRecord<z.ZodString, z.ZodAny>;
|
|
318
|
+
}, "strip", z.ZodTypeAny, {
|
|
319
|
+
name: string;
|
|
320
|
+
kwargs: Record<string, any>;
|
|
321
|
+
}, {
|
|
322
|
+
name: string;
|
|
323
|
+
kwargs: Record<string, any>;
|
|
324
|
+
}>, "many">;
|
|
325
|
+
item_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
326
|
+
item_ids: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
|
|
327
|
+
limit: z.ZodNumber;
|
|
328
|
+
offset: z.ZodDefault<z.ZodOptional<z.ZodNullable<z.ZodNumber>>>;
|
|
329
|
+
options: z.ZodOptional<z.ZodNullable<z.ZodRecord<z.ZodString, z.ZodAny>>>;
|
|
330
|
+
}, "item_id" | "item_ids" | "limit" | "offset">, {
|
|
331
|
+
call_type: z.ZodString;
|
|
332
|
+
category_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
333
|
+
}>, "strip", z.ZodTypeAny, {
|
|
334
|
+
limit: number;
|
|
335
|
+
offset: number | null;
|
|
336
|
+
call_type: string;
|
|
337
|
+
item_id?: string | null | undefined;
|
|
338
|
+
item_ids?: string[] | null | undefined;
|
|
339
|
+
category_id?: string | null | undefined;
|
|
340
|
+
}, {
|
|
341
|
+
limit: number;
|
|
342
|
+
call_type: string;
|
|
343
|
+
item_id?: string | null | undefined;
|
|
344
|
+
item_ids?: string[] | null | undefined;
|
|
345
|
+
offset?: number | null | undefined;
|
|
346
|
+
category_id?: string | null | undefined;
|
|
347
|
+
}>;
|
|
348
|
+
type Body = Serialize<z.input<typeof bodySchema>>;
|
|
349
|
+
const pathSchema: z.ZodObject<{
|
|
350
|
+
application_id: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, import("bson-objectid").default, string>;
|
|
351
|
+
blux_user_id: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, import("bson-objectid").default, string>;
|
|
352
|
+
}, "strip", z.ZodTypeAny, {
|
|
353
|
+
application_id: import("bson-objectid").default;
|
|
354
|
+
blux_user_id: import("bson-objectid").default;
|
|
355
|
+
}, {
|
|
356
|
+
application_id: string;
|
|
357
|
+
blux_user_id: string;
|
|
358
|
+
}>;
|
|
359
|
+
type PathParam = Serialize<z.input<typeof pathSchema>>;
|
|
360
|
+
type ResponseData = RecResponse;
|
|
361
|
+
}
|
|
353
362
|
}
|
|
354
363
|
export {};
|
package/dist/src/apis/APIs.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-namespace */
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import { countryCodeWithLowerCaseSchema, customPropertiesRequestSchema, customPropertiesSchema, dateSchema, objectIdSchema, } from "../utils/zodSchemas";
|
|
3
|
+
import { countryCodeWithLowerCaseSchema, customPropertiesRequestSchema, customPropertiesSchema, dateSchema, objectIdSchema, recommendationRequestSchema, } from "../utils/zodSchemas";
|
|
4
4
|
var HttpMethod;
|
|
5
5
|
(function (HttpMethod) {
|
|
6
6
|
HttpMethod["GET"] = "get";
|
|
@@ -15,6 +15,7 @@ export var DevicePlatform;
|
|
|
15
15
|
DevicePlatform["browser"] = "browser";
|
|
16
16
|
})(DevicePlatform || (DevicePlatform = {}));
|
|
17
17
|
const applicationsRoot = "/applications/{application_id}";
|
|
18
|
+
const applicationsRootV2 = "/v2/applications/{application_id}";
|
|
18
19
|
export var APIs;
|
|
19
20
|
(function (APIs) {
|
|
20
21
|
let bluxUsersInitialize;
|
|
@@ -93,23 +94,6 @@ export var APIs;
|
|
|
93
94
|
})),
|
|
94
95
|
});
|
|
95
96
|
})(bluxUsersCollectEvents = APIs.bluxUsersCollectEvents || (APIs.bluxUsersCollectEvents = {}));
|
|
96
|
-
let bluxUsersGetItemRecommendations;
|
|
97
|
-
(function (bluxUsersGetItemRecommendations) {
|
|
98
|
-
bluxUsersGetItemRecommendations.name = "bluxUsersGetItemRecommendations";
|
|
99
|
-
bluxUsersGetItemRecommendations.path = `${applicationsRoot}/blux-users/{blux_user_id}/item-recommendations`;
|
|
100
|
-
bluxUsersGetItemRecommendations.method = HttpMethod.POST;
|
|
101
|
-
bluxUsersGetItemRecommendations.bodySchema = z.object({
|
|
102
|
-
call_type: z.string(),
|
|
103
|
-
limit: z.number(),
|
|
104
|
-
offset: z.number().default(0),
|
|
105
|
-
item_ids: z.array(z.string()).optional(),
|
|
106
|
-
options: z.record(z.string(), z.any()).optional(),
|
|
107
|
-
});
|
|
108
|
-
bluxUsersGetItemRecommendations.pathSchema = z.object({
|
|
109
|
-
application_id: objectIdSchema,
|
|
110
|
-
blux_user_id: objectIdSchema,
|
|
111
|
-
});
|
|
112
|
-
})(bluxUsersGetItemRecommendations = APIs.bluxUsersGetItemRecommendations || (APIs.bluxUsersGetItemRecommendations = {}));
|
|
113
97
|
let bluxUsersUpdateUserProperties;
|
|
114
98
|
(function (bluxUsersUpdateUserProperties) {
|
|
115
99
|
bluxUsersUpdateUserProperties.name = "bluxUsersUpdateUserProperties";
|
|
@@ -143,5 +127,16 @@ export var APIs;
|
|
|
143
127
|
blux_user_id: objectIdSchema,
|
|
144
128
|
});
|
|
145
129
|
})(bluxUsersUpdateCustomUserProperties = APIs.bluxUsersUpdateCustomUserProperties || (APIs.bluxUsersUpdateCustomUserProperties = {}));
|
|
130
|
+
let bluxUsersGetItemRecommendationsV2;
|
|
131
|
+
(function (bluxUsersGetItemRecommendationsV2) {
|
|
132
|
+
bluxUsersGetItemRecommendationsV2.name = "bluxUsersGetItemRecommendationsV2";
|
|
133
|
+
bluxUsersGetItemRecommendationsV2.path = `${applicationsRootV2}/blux-users/{blux_user_id}/item-recommendations`;
|
|
134
|
+
bluxUsersGetItemRecommendationsV2.method = HttpMethod.POST;
|
|
135
|
+
bluxUsersGetItemRecommendationsV2.bodySchema = recommendationRequestSchema;
|
|
136
|
+
bluxUsersGetItemRecommendationsV2.pathSchema = z.object({
|
|
137
|
+
application_id: objectIdSchema,
|
|
138
|
+
blux_user_id: objectIdSchema,
|
|
139
|
+
});
|
|
140
|
+
})(bluxUsersGetItemRecommendationsV2 = APIs.bluxUsersGetItemRecommendationsV2 || (APIs.bluxUsersGetItemRecommendationsV2 = {}));
|
|
146
141
|
})(APIs || (APIs = {}));
|
|
147
142
|
//# sourceMappingURL=APIs.js.map
|