@blux.ai/web-sdk 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/demo/src/App.test.tsx +9 -0
- package/demo/src/App.tsx +252 -0
- package/demo/src/index.css +16 -0
- package/demo/src/index.tsx +19 -0
- package/demo/src/react-app-env.d.ts +1 -0
- package/demo/src/reportWebVitals.ts +15 -0
- package/demo/src/setupTests.ts +5 -0
- package/dist/BluxClient.d.ts +2 -2
- package/dist/BluxClient.js +1 -1
- package/dist/BluxClient.js.map +1 -1
- package/dist/apis/APIs.d.ts +317 -0
- package/dist/apis/APIs.js +138 -0
- package/dist/apis/APIs.js.map +1 -0
- package/dist/apis/createEvent.d.ts +1 -1
- package/dist/apis/createEvent.js +2 -2
- package/dist/apis/createEvent.js.map +1 -1
- package/dist/apis/getItemRecommendation.d.ts +2 -2
- package/dist/apis/getItemRecommendation.js +2 -2
- package/dist/apis/getItemRecommendation.js.map +1 -1
- package/dist/apis/initialize.d.ts +1 -1
- package/dist/apis/initialize.js +1 -1
- package/dist/apis/initialize.js.map +1 -1
- package/dist/apis/signIn.d.ts +1 -1
- package/dist/apis/signIn.js +2 -2
- package/dist/apis/signIn.js.map +1 -1
- package/dist/apis/signOut.d.ts +1 -1
- package/dist/apis/signOut.js +1 -1
- package/dist/apis/signOut.js.map +1 -1
- package/dist/apis/updateCustomUserProperties.d.ts +1 -1
- package/dist/apis/updateCustomUserProperties.js +1 -1
- package/dist/apis/updateCustomUserProperties.js.map +1 -1
- package/dist/apis/updateUserProperties.d.ts +1 -1
- package/dist/apis/updateUserProperties.js +2 -2
- package/dist/apis/updateUserProperties.js.map +1 -1
- package/dist/constants/COUNTRIES.d.ts +928 -0
- package/dist/constants/COUNTRIES.js +1159 -0
- package/dist/constants/COUNTRIES.js.map +1 -0
- package/dist/constants/ISO8601_REGEX.d.ts +1 -0
- package/dist/constants/ISO8601_REGEX.js +4 -0
- package/dist/constants/ISO8601_REGEX.js.map +1 -0
- package/dist/events/AddProductDetailViewEvent.js +1 -2
- package/dist/events/AddProductDetailViewEvent.js.map +1 -1
- package/dist/events/AddPurchaseEvent.js +1 -2
- package/dist/events/AddPurchaseEvent.js.map +1 -1
- package/dist/events/Event.d.ts +11 -0
- package/dist/events/Event.js +12 -0
- package/dist/events/Event.js.map +1 -1
- package/dist/events/VisitEvent.js +1 -2
- package/dist/events/VisitEvent.js.map +1 -1
- package/dist/utils/Base.d.ts +13 -0
- package/dist/utils/Base.js +2 -0
- package/dist/utils/Base.js.map +1 -0
- package/dist/utils/assertEqualTypes.d.ts +3 -0
- package/dist/utils/assertEqualTypes.js +5 -0
- package/dist/utils/assertEqualTypes.js.map +1 -0
- package/dist/utils/getPath.js +6 -1
- package/dist/utils/getPath.js.map +1 -1
- package/dist/utils/zodSchemas.d.ts +19 -0
- package/dist/utils/zodSchemas.js +105 -0
- package/dist/utils/zodSchemas.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
|
+
import App from "./App";
|
|
4
|
+
|
|
5
|
+
test("renders learn react link", () => {
|
|
6
|
+
render(<App />);
|
|
7
|
+
const linkElement = screen.getByText(/learn react/i);
|
|
8
|
+
expect(linkElement).toBeInTheDocument();
|
|
9
|
+
});
|
package/demo/src/App.tsx
ADDED
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import { AddCustomEvent, ItemRecommendation, BluxClient } from "@blux.ai/web-sdk";
|
|
3
|
+
|
|
4
|
+
const bluxClient = new BluxClient("stg");
|
|
5
|
+
bluxClient.setLogLevel("debug");
|
|
6
|
+
|
|
7
|
+
const searchParams = new URL(window.location.href).searchParams;
|
|
8
|
+
const APPLICATION_ID_FROM_QUERY_PARAMS = searchParams.get("application_id");
|
|
9
|
+
const API_KEY_FROM_QUERY_PARAMS = searchParams.get("api_key");
|
|
10
|
+
const PHONE_NUMBER_FROM_QUERY_PARAMS = searchParams.get("phone_number");
|
|
11
|
+
const EMAIL_FROM_QUERY_PARAMS = searchParams.get("email");
|
|
12
|
+
|
|
13
|
+
function App() {
|
|
14
|
+
const [applicationId, setApplicationId] = useState<string>(
|
|
15
|
+
APPLICATION_ID_FROM_QUERY_PARAMS ?? "",
|
|
16
|
+
);
|
|
17
|
+
const [bluxApiKey, setBluxApiKey] = useState<string>(
|
|
18
|
+
API_KEY_FROM_QUERY_PARAMS ?? "",
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
const [userId, signIn] = useState<string>(
|
|
22
|
+
`test_user_id_${Math.floor(Math.random() * 100)}`,
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
const [telNumber, setTelNumber] = useState<string>(
|
|
26
|
+
PHONE_NUMBER_FROM_QUERY_PARAMS ?? "",
|
|
27
|
+
);
|
|
28
|
+
const [email, setEmail] = useState<string>(EMAIL_FROM_QUERY_PARAMS ?? "");
|
|
29
|
+
const [customKey, setCustomKey] = useState<string>("custom_key");
|
|
30
|
+
const [customValue, setCustomValue] = useState<string>("custom_value");
|
|
31
|
+
const [eventType, setEventType] = useState<string>("custom_event_type");
|
|
32
|
+
const [itemId, setItemId] = useState<string>("item_id_3");
|
|
33
|
+
|
|
34
|
+
// Recommendation Related States
|
|
35
|
+
const [callType, setCallType] = useState<string>("");
|
|
36
|
+
const [limit, setLimit] = useState<number>(10);
|
|
37
|
+
const [offset, setOffset] = useState<number>(0);
|
|
38
|
+
const [recommendationItemIds, setRecommendationItemIds] = useState<string>("ITEM_ID_1, ITEM_ID_2, ITEM_ID_3");
|
|
39
|
+
|
|
40
|
+
const [isInitialized, setIsInitialized] = useState<boolean>(false);
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<div className="p-10">
|
|
44
|
+
<div className="input-container flex flex-col">
|
|
45
|
+
<div>BluxUser</div>
|
|
46
|
+
<div>
|
|
47
|
+
{bluxClient.bluxUser$.value
|
|
48
|
+
? JSON.stringify(bluxClient.bluxUser$.value, null, 2)
|
|
49
|
+
: "not initialized"}
|
|
50
|
+
</div>
|
|
51
|
+
<div className="flex">
|
|
52
|
+
<div>
|
|
53
|
+
<div>ApplicationId</div>
|
|
54
|
+
<input
|
|
55
|
+
className="w-[500px] rounded-md border-black border-2"
|
|
56
|
+
type="text"
|
|
57
|
+
placeholder="Enter Application Id"
|
|
58
|
+
value={applicationId}
|
|
59
|
+
onChange={(e) => setApplicationId(e.target.value)}
|
|
60
|
+
/>
|
|
61
|
+
<div className="mt-3">BluxApiKey</div>
|
|
62
|
+
<input
|
|
63
|
+
className="w-[500px] rounded-md border-black border-2"
|
|
64
|
+
type="text"
|
|
65
|
+
placeholder="Enter Blux API Key"
|
|
66
|
+
value={bluxApiKey}
|
|
67
|
+
onChange={(e) => setBluxApiKey(e.target.value)}
|
|
68
|
+
/>
|
|
69
|
+
<div className="mt-3">User Id</div>
|
|
70
|
+
<input
|
|
71
|
+
className="w-[500px] rounded-md border-black border-2"
|
|
72
|
+
type="text"
|
|
73
|
+
placeholder="Enter User Id"
|
|
74
|
+
value={userId}
|
|
75
|
+
onChange={(e) => signIn(e.target.value)}
|
|
76
|
+
/>
|
|
77
|
+
<div className="mt-3">Phone Number</div>
|
|
78
|
+
<input
|
|
79
|
+
className="w-[500px] rounded-md border-black border-2"
|
|
80
|
+
type="text"
|
|
81
|
+
placeholder="Enter phone number"
|
|
82
|
+
value={telNumber}
|
|
83
|
+
onChange={(e) => setTelNumber(e.target.value)}
|
|
84
|
+
/>
|
|
85
|
+
<div className="mt-3">Email</div>
|
|
86
|
+
<input
|
|
87
|
+
className="w-[500px] rounded-md border-black border-2"
|
|
88
|
+
type="text"
|
|
89
|
+
placeholder="Enter email"
|
|
90
|
+
value={email}
|
|
91
|
+
onChange={(e) => setEmail(e.target.value)}
|
|
92
|
+
/>
|
|
93
|
+
<div className="mt-3">CustomKey</div>
|
|
94
|
+
<input
|
|
95
|
+
className="w-[500px] rounded-md border-black border-2"
|
|
96
|
+
type="text"
|
|
97
|
+
placeholder="Enter custom key"
|
|
98
|
+
value={customKey}
|
|
99
|
+
onChange={(e) => setCustomKey(e.target.value)}
|
|
100
|
+
/>
|
|
101
|
+
<div className="mt-3">CustomValue</div>
|
|
102
|
+
<input
|
|
103
|
+
className="w-[500px] rounded-md border-black border-2"
|
|
104
|
+
type="text"
|
|
105
|
+
placeholder="Enter custom value"
|
|
106
|
+
value={customValue}
|
|
107
|
+
onChange={(e) => setCustomValue(e.target.value)}
|
|
108
|
+
/>
|
|
109
|
+
<div className="mt-3">CustomEventType</div>
|
|
110
|
+
<input
|
|
111
|
+
className="w-[500px] rounded-md border-black border-2"
|
|
112
|
+
type="text"
|
|
113
|
+
placeholder="Enter custom event type"
|
|
114
|
+
value={eventType}
|
|
115
|
+
onChange={(e) => setEventType(e.target.value)}
|
|
116
|
+
/>
|
|
117
|
+
<div className="mt-3">CustomEvent ItemId</div>
|
|
118
|
+
<input
|
|
119
|
+
className="w-[500px] rounded-md border-black border-2"
|
|
120
|
+
type="text"
|
|
121
|
+
placeholder="Enter custom event item id"
|
|
122
|
+
value={itemId}
|
|
123
|
+
onChange={(e) => setItemId(e.target.value)}
|
|
124
|
+
/>
|
|
125
|
+
</div>
|
|
126
|
+
<div>
|
|
127
|
+
<div className="mt-3 ml-10">RecommendationCallType</div>
|
|
128
|
+
<input
|
|
129
|
+
className="w-[500px] rounded-md border-black border-2 ml-10"
|
|
130
|
+
type="text"
|
|
131
|
+
placeholder="Enter call type for item recommendation"
|
|
132
|
+
value={callType}
|
|
133
|
+
onChange={(e) => setCallType(e.target.value)}
|
|
134
|
+
/>
|
|
135
|
+
<div className="ml-10">RecommendationLimit</div>
|
|
136
|
+
<input
|
|
137
|
+
className="w-[500px] rounded-md border-black border-2 ml-10"
|
|
138
|
+
type="text"
|
|
139
|
+
placeholder="Enter recommendation limit"
|
|
140
|
+
value={limit}
|
|
141
|
+
onChange={(e) => setLimit(Number(e.target.value))}
|
|
142
|
+
/>
|
|
143
|
+
<div className="mt-3 ml-10">RecommendationOffset</div>
|
|
144
|
+
<input
|
|
145
|
+
className="w-[500px] rounded-md border-black border-2 ml-10"
|
|
146
|
+
type="text"
|
|
147
|
+
placeholder="Enter recommendation offset"
|
|
148
|
+
value={offset}
|
|
149
|
+
onChange={(e) => setOffset(Number(e.target.value))}
|
|
150
|
+
/>
|
|
151
|
+
<div className="mt-3 ml-10">RecommendationItemIds</div>
|
|
152
|
+
<input
|
|
153
|
+
className="w-[500px] rounded-md border-black border-2 ml-10"
|
|
154
|
+
type="text"
|
|
155
|
+
placeholder="Enter recommendation item ids (comma separated)"
|
|
156
|
+
value={recommendationItemIds}
|
|
157
|
+
onChange={(e) => setRecommendationItemIds(e.target.value)}
|
|
158
|
+
/>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
<div className="mt-10 flex gap-4 w-[1000px] flex-wrap">
|
|
163
|
+
<button
|
|
164
|
+
className="bg-blue-500 rounded-md p-4 disabled:bg-gray-300"
|
|
165
|
+
onClick={() =>
|
|
166
|
+
bluxClient
|
|
167
|
+
.init({ applicationId, bluxApiKey })
|
|
168
|
+
.then((isSuccess) => setIsInitialized(isSuccess))
|
|
169
|
+
}
|
|
170
|
+
disabled={applicationId === "" || bluxApiKey === ""}
|
|
171
|
+
>
|
|
172
|
+
init
|
|
173
|
+
</button>
|
|
174
|
+
<button
|
|
175
|
+
className="bg-blue-500 rounded-md p-4 disabled:bg-gray-300"
|
|
176
|
+
onClick={() => bluxClient.signIn(userId)}
|
|
177
|
+
disabled={!isInitialized}
|
|
178
|
+
>
|
|
179
|
+
signIn
|
|
180
|
+
</button>
|
|
181
|
+
<button
|
|
182
|
+
className="bg-blue-500 rounded-md p-4 disabled:bg-gray-300"
|
|
183
|
+
onClick={() => bluxClient.signOut()}
|
|
184
|
+
disabled={!isInitialized}
|
|
185
|
+
>
|
|
186
|
+
signOut
|
|
187
|
+
</button>
|
|
188
|
+
<button
|
|
189
|
+
className="bg-blue-500 rounded-md p-4 disabled:bg-gray-300"
|
|
190
|
+
onClick={() =>
|
|
191
|
+
bluxClient.setUserProperties({ phone_number: telNumber })
|
|
192
|
+
}
|
|
193
|
+
disabled={!isInitialized}
|
|
194
|
+
>
|
|
195
|
+
setUserProperties (phone number)
|
|
196
|
+
</button>
|
|
197
|
+
<button
|
|
198
|
+
className="bg-blue-500 rounded-md p-4 disabled:bg-gray-300"
|
|
199
|
+
onClick={() => bluxClient.setUserProperties({ email_address: email })}
|
|
200
|
+
disabled={!isInitialized}
|
|
201
|
+
>
|
|
202
|
+
setUserProperties (email)
|
|
203
|
+
</button>
|
|
204
|
+
<button
|
|
205
|
+
className="bg-blue-500 rounded-md p-4 disabled:bg-gray-300"
|
|
206
|
+
onClick={() =>
|
|
207
|
+
bluxClient.setCustomUserProperties({ [customKey]: customValue })
|
|
208
|
+
}
|
|
209
|
+
disabled={!isInitialized}
|
|
210
|
+
>
|
|
211
|
+
setCustomProperties
|
|
212
|
+
</button>
|
|
213
|
+
<button
|
|
214
|
+
className="bg-blue-500 rounded-md p-4 disabled:bg-gray-300"
|
|
215
|
+
onClick={() =>
|
|
216
|
+
bluxClient.sendEvent(
|
|
217
|
+
new AddCustomEvent({
|
|
218
|
+
item_id: itemId,
|
|
219
|
+
event_properties: { [customKey]: customValue },
|
|
220
|
+
event_type: eventType,
|
|
221
|
+
}),
|
|
222
|
+
)
|
|
223
|
+
}
|
|
224
|
+
disabled={!isInitialized}
|
|
225
|
+
>
|
|
226
|
+
sendCustomEvent
|
|
227
|
+
</button>
|
|
228
|
+
<button
|
|
229
|
+
className="bg-blue-500 rounded-md p-4 disabled:bg-gray-300"
|
|
230
|
+
onClick={async () =>
|
|
231
|
+
{
|
|
232
|
+
const recommendationResponse = await bluxClient.getItemRecommendation(
|
|
233
|
+
new ItemRecommendation({
|
|
234
|
+
call_type: callType,
|
|
235
|
+
limit,
|
|
236
|
+
offset,
|
|
237
|
+
item_ids: recommendationItemIds ? recommendationItemIds.split(","): undefined,
|
|
238
|
+
}),
|
|
239
|
+
)
|
|
240
|
+
console.log(recommendationResponse);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
disabled={!isInitialized || callType === ""}
|
|
244
|
+
>
|
|
245
|
+
getItemRecommendation
|
|
246
|
+
</button>
|
|
247
|
+
</div>
|
|
248
|
+
</div>
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export default App;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
@tailwind base;
|
|
2
|
+
@tailwind components;
|
|
3
|
+
@tailwind utilities;
|
|
4
|
+
body {
|
|
5
|
+
margin: 0;
|
|
6
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
|
|
7
|
+
"Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
|
|
8
|
+
sans-serif;
|
|
9
|
+
-webkit-font-smoothing: antialiased;
|
|
10
|
+
-moz-osx-font-smoothing: grayscale;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
code {
|
|
14
|
+
font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
|
|
15
|
+
monospace;
|
|
16
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import ReactDOM from "react-dom/client";
|
|
3
|
+
import "./index.css";
|
|
4
|
+
import App from "./App";
|
|
5
|
+
import reportWebVitals from "./reportWebVitals";
|
|
6
|
+
|
|
7
|
+
const root = ReactDOM.createRoot(
|
|
8
|
+
document.getElementById("root") as HTMLElement,
|
|
9
|
+
);
|
|
10
|
+
root.render(
|
|
11
|
+
<React.StrictMode>
|
|
12
|
+
<App />
|
|
13
|
+
</React.StrictMode>,
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
// If you want to start measuring performance in your app, pass a function
|
|
17
|
+
// to log results (for example: reportWebVitals(console.log))
|
|
18
|
+
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
|
|
19
|
+
reportWebVitals();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/// <reference types="react-scripts" />
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ReportHandler } from "web-vitals";
|
|
2
|
+
|
|
3
|
+
const reportWebVitals = (onPerfEntry?: ReportHandler) => {
|
|
4
|
+
if (onPerfEntry && onPerfEntry instanceof Function) {
|
|
5
|
+
import("web-vitals").then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
|
|
6
|
+
getCLS(onPerfEntry);
|
|
7
|
+
getFID(onPerfEntry);
|
|
8
|
+
getFCP(onPerfEntry);
|
|
9
|
+
getLCP(onPerfEntry);
|
|
10
|
+
getTTFB(onPerfEntry);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default reportWebVitals;
|
package/dist/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 { ItemRecommendationResponse } from "@blux.ai/common";
|
|
6
5
|
import type { Recommendation } from "./recommendations/Recommendation";
|
|
6
|
+
import { type APIs } from "./apis/APIs";
|
|
7
7
|
export type SdkInfo = {
|
|
8
8
|
type: string;
|
|
9
9
|
version: string;
|
|
@@ -37,7 +37,7 @@ export declare class BluxClient {
|
|
|
37
37
|
}): Promise<void>;
|
|
38
38
|
setCustomUserProperties(customUserProperties: Record<string, string | boolean | number | null>): Promise<void>;
|
|
39
39
|
sendEvent(event: Event | Event[]): void;
|
|
40
|
-
getItemRecommendation(recommendation: Recommendation): Promise<
|
|
40
|
+
getItemRecommendation(recommendation: Recommendation): Promise<APIs.bluxUsersGetItemRecommendations.ResponseData>;
|
|
41
41
|
}
|
|
42
42
|
export declare const bluxClient: BluxClient;
|
|
43
43
|
export {};
|
package/dist/BluxClient.js
CHANGED
|
@@ -4,7 +4,6 @@ import { Logger } from "./utils/Logger";
|
|
|
4
4
|
import axios from "axios";
|
|
5
5
|
import { filterNullable } from "./utils/operators";
|
|
6
6
|
import { API_URL_BY_STAGE } from "./constants/URLS";
|
|
7
|
-
import { DevicePlatform } from "@blux.ai/common";
|
|
8
7
|
import { initialize } from "./apis/initialize";
|
|
9
8
|
import { signIn } from "./apis/signIn";
|
|
10
9
|
import { signOut } from "./apis/signOut";
|
|
@@ -13,6 +12,7 @@ import { updateCustomUserProperties } from "./apis/updateCustomUserProperties";
|
|
|
13
12
|
import { collectEvent } from "./apis/createEvent";
|
|
14
13
|
import { VisitEvent } from "./events/VisitEvent";
|
|
15
14
|
import { getItemRecommendation } from "./apis/getItemRecommendation";
|
|
15
|
+
import { DevicePlatform } from "./apis/APIs";
|
|
16
16
|
export class BluxClient {
|
|
17
17
|
STAGE;
|
|
18
18
|
api;
|
package/dist/BluxClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BluxClient.js","sourceRoot":"/","sources":["BluxClient.ts"],"names":[],"mappings":"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","sourcesContent":["import {\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 { API_URL_BY_STAGE } from \"./constants/URLS\";\nimport type { Event } from \"./events/Event\";\nimport type { ItemRecommendationResponse } from \"@blux.ai/common\";\nimport { DevicePlatform } from \"@blux.ai/common\";\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\";\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: \"0.0.3\",\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 private readonly STAGE: \"local\" | \"dev\" | \"stg\" | \"prod\" = \"prod\",\n ) {\n this.api = axios.create({\n baseURL: API_URL_BY_STAGE[this.STAGE],\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 async init({\n applicationId,\n bluxApiKey,\n }: {\n applicationId: string;\n bluxApiKey: string;\n }): Promise<boolean> {\n this.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(\"Saved Device ID is not exists, newly registered.\");\n }\n\n const {\n data: { blux_user_id, device_id },\n } = await initialize(\n this.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: this.sdkInfo.version,\n sdk_type: this.sdkInfo.type,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n },\n this.generateApiHeader({\n bluxApiKey,\n }),\n );\n\n LocalStorage.setDeviceId(device_id);\n\n this.bluxUser$.next({\n id: blux_user_id,\n bluxApiKey,\n applicationId,\n deviceId: device_id,\n });\n\n return true;\n } catch (error) {\n Logger.error(error, { tags: { from: \"init\" } });\n return false;\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 intialized. 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 public async getItemRecommendation(\n recommendation: Recommendation,\n ): Promise<ItemRecommendationResponse> {\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\nexport const bluxClient = new BluxClient(\"prod\");\n"]}
|
|
1
|
+
{"version":3,"file":"BluxClient.js","sourceRoot":"/","sources":["BluxClient.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,EACV,UAAU,EACV,MAAM,EACN,cAAc,EACd,GAAG,EACH,SAAS,EACT,UAAU,EACV,OAAO,EACP,cAAc,GACf,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAa,MAAM,aAAa,CAAC;AAexD,MAAM,OAAO,UAAU;IAeF;IAdF,GAAG,CAAgB;IAEnB,OAAO,GAAY;QAClC,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,OAAO;KACjB,CAAC;IAEc,SAAS,GAAG,IAAI,eAAe,CAC7C,SAAS,CACV,CAAC;IAEc,aAAa,GAAG,IAAI,eAAe,CAAiB,EAAE,CAAC,CAAC;IAExE,YACmB,QAA0C,MAAM;QAAhD,UAAK,GAAL,KAAK,CAA2C;QAEjE,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;YACtB,OAAO,EAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;SACtC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa;aACf,IAAI,CACH,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EACnC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,EACrD,UAAU,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE;YACxC,IAAI;gBACF,MAAM,YAAY,CAChB,IAAI,CAAC,GAAG,EACR;oBACE,YAAY,EAAE,QAAQ,CAAC,EAAE;oBACzB,cAAc,EAAE,QAAQ,CAAC,aAAa;iBACvC,EACD;oBACE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;wBACjC,GAAG,OAAO;wBACV,OAAO,EAAE,QAAQ,CAAC,MAAM;wBACxB,OAAO,EAAE,QAAQ,CAAC,EAAE;wBACpB,SAAS,EAAE,QAAQ,CAAC,QAAQ;qBAC7B,CAAC,CAAC;iBACJ,EACD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CACjC,CAAC;aACH;YAAC,OAAO,KAAK,EAAE;gBACd,eAAe;gBACf,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE,CAAC,CAAC;aAC/D;YAED,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uCAAuC;QAC3E,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,mBAAmB,EAAE,EAAE,CAC1B,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,CAC7B,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CACvD,CACF,EACD,SAAS,CAAC,cAAc,CAAC,CAC1B;aACA,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACnC,CAAC;IAEO,iBAAiB,CAAC,EAAE,UAAU,EAA0B;QAC9D,OAAO;YACL,aAAa,EAAE,UAAU;SAC1B,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,EAChB,aAAa,EACb,UAAU,GAIX;QACC,IAAI,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QACnC,IAAI;YACF,MAAM,CAAC,KAAK,CAAC,6BAA6B,aAAa,EAAE,CAAC,CAAC;YAE3D,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;YAE5C,IAAI,CAAC,QAAQ,EAAE;gBACb,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;aAClE;YAED,MAAM,EACJ,IAAI,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,GAClC,GAAG,MAAM,UAAU,CAClB,IAAI,CAAC,GAAG,EACR,EAAE,cAAc,EAAE,aAAa,EAAE,EACjC;gBACE,oBAAoB,EAAE,IAAI;gBAC1B,SAAS,EAAE,QAAQ,IAAI,SAAS;gBAChC,YAAY,EAAE,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC9C,YAAY,EAAE,SAAS,CAAC,SAAS;gBACjC,aAAa,EAAE,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC/C,QAAQ,EAAE,cAAc,CAAC,OAAO;gBAChC,UAAU,EAAE,SAAS,CAAC,SAAS;gBAC/B,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBACjC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;gBAC3B,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,eAAe,EAAE,CAAC,QAAQ;aAC3D,EACD,IAAI,CAAC,iBAAiB,CAAC;gBACrB,UAAU;aACX,CAAC,CACH,CAAC;YAEF,YAAY,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAEpC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAClB,EAAE,EAAE,YAAY;gBAChB,UAAU;gBACV,aAAa;gBACb,QAAQ,EAAE,SAAS;aACpB,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC;SACb;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YAChD,OAAO,KAAK,CAAC;SACd;IACH,CAAC;IAEM,WAAW,CAAC,QAAkB;QACnC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAEO,KAAK,CAAC,sBAAsB;QAClC,MAAM,QAAQ,GAAG,MAAM,cAAc,CACnC,IAAI,CAAC,SAAS,CAAC,IAAI,CACjB,cAAc,EAAE,EAChB,OAAO,CAAC,IAAI,CAAC,EACb,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE;YACnB,OAAO,UAAU,CAAC,GAAG,EAAE,CACrB,KAAK,CAAC,IAAI,KAAK,cAAc;gBAC3B,CAAC,CAAC,IAAI,KAAK,CACP,iEAAiE,CAClE;gBACH,CAAC,CAAC,KAAK,CACV,CAAC;QACJ,CAAC,CAAC,CACH,CACF,CAAC;QAEF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,MAAc;QAChC,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAErD,MAAM,EACJ,IAAI,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,GACzC,GAAG,MAAM,MAAM,CACd,IAAI,CAAC,GAAG,EACR,EAAE,cAAc,EAAE,QAAQ,CAAC,aAAa,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,EAAE,EACrE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAAE,EACjD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CACjC,CAAC;YAEF,IAAI,gBAAgB,KAAK,QAAQ,CAAC,EAAE,EAAE;gBACpC,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;gBAC9C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAClB,GAAG,QAAQ;oBACX,EAAE,EAAE,gBAAgB;iBACrB,CAAC,CAAC;aACJ;SACF;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;SACnD;IACH,CAAC;IAEM,KAAK,CAAC,OAAO;QAClB,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAErD,MAAM,EACJ,IAAI,EAAE,EAAE,YAAY,EAAE,gBAAgB,EAAE,GACzC,GAAG,MAAM,OAAO,CACf,IAAI,CAAC,GAAG,EACR,EAAE,cAAc,EAAE,QAAQ,CAAC,aAAa,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,EAAE,EACrE,EAAE,SAAS,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAChC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CACjC,CAAC;YAEF,MAAM,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAC/C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAClB,GAAG,QAAQ;gBACX,EAAE,EAAE,gBAAgB;aACrB,CAAC,CAAC;SACJ;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;SACpD;IACH,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,cAG9B;QACC,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAErD,MAAM,oBAAoB,CACxB,IAAI,CAAC,GAAG,EACR,EAAE,cAAc,EAAE,QAAQ,CAAC,aAAa,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,EAAE,EACrE,EAAE,UAAU,EAAE,cAAc,EAAE,EAC9B,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CACjC,CAAC;SACH;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,EAAE,CAAC,CAAC;SAC9D;IACH,CAAC;IAEM,KAAK,CAAC,uBAAuB,CAClC,oBAAsE;QAEtE,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAErD,MAAM,0BAA0B,CAC9B,IAAI,CAAC,GAAG,EACR,EAAE,cAAc,EAAE,QAAQ,CAAC,aAAa,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,EAAE,EACrE,EAAE,UAAU,EAAE,oBAAoB,EAAE,EACpC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CACjC,CAAC;SACH;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,yBAAyB,EAAE,EAAE,CAAC,CAAC;SACpE;IACH,CAAC;IAEM,SAAS,CAAC,KAAsB;QACrC,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAC3D,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CACzB,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YACtB,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK;YAC3B,GAAG,QAAQ,CAAC,MAAM,CAChB,CAAC,OAAO,EAAE,EAAE,CACV,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAClE;SACF,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,qBAAqB,CAChC,cAA8B;QAE9B,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAC;YACrD,MAAM,qBAAqB,GAAG,cAAc,CAAC,OAAO,CAAC;YAErD,MAAM,sBAAsB,GAAG,MAAM,qBAAqB,CACxD,IAAI,CAAC,GAAG,EACR;gBACE,cAAc,EAAE,QAAQ,CAAC,aAAa;gBACtC,YAAY,EAAE,QAAQ,CAAC,EAAE;aAC1B,EACD;gBACE,SAAS,EAAE,qBAAqB,CAAC,SAAS;gBAC1C,KAAK,EAAE,qBAAqB,CAAC,KAAK;gBAClC,MAAM,EAAE,qBAAqB,CAAC,MAAM;gBACpC,QAAQ,EAAE,qBAAqB,CAAC,QAAQ;aACzC,EACD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CACjC,CAAC;YAEF,OAAO,sBAAsB,CAAC,IAAI,CAAC;SACpC;QAAC,OAAO,KAAK,EAAE;YACd,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,EAAE,CAAC,CAAC;YACjE,OAAO;gBACL,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,EAAE;gBACZ,MAAM,EAAE;oBACN,UAAU,EAAE,KAAK;oBACjB,IAAI,EAAE,GAAG;oBACT,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB;aACF,CAAC;SACH;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC","sourcesContent":["import {\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 { API_URL_BY_STAGE } from \"./constants/URLS\";\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\";\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: \"0.0.3\",\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 private readonly STAGE: \"local\" | \"dev\" | \"stg\" | \"prod\" = \"prod\",\n ) {\n this.api = axios.create({\n baseURL: API_URL_BY_STAGE[this.STAGE],\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 async init({\n applicationId,\n bluxApiKey,\n }: {\n applicationId: string;\n bluxApiKey: string;\n }): Promise<boolean> {\n this.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(\"Saved Device ID is not exists, newly registered.\");\n }\n\n const {\n data: { blux_user_id, device_id },\n } = await initialize(\n this.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: this.sdkInfo.version,\n sdk_type: this.sdkInfo.type,\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n },\n this.generateApiHeader({\n bluxApiKey,\n }),\n );\n\n LocalStorage.setDeviceId(device_id);\n\n this.bluxUser$.next({\n id: blux_user_id,\n bluxApiKey,\n applicationId,\n deviceId: device_id,\n });\n\n return true;\n } catch (error) {\n Logger.error(error, { tags: { from: \"init\" } });\n return false;\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 intialized. 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 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\nexport const bluxClient = new BluxClient(\"prod\");\n"]}
|