@blocklet/js-sdk 1.16.26-beta-351de484 → 1.16.26-beta-63f52a83

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/index.cjs CHANGED
@@ -56,6 +56,12 @@ class AuthService {
56
56
  locale
57
57
  });
58
58
  }
59
+ /**
60
+ *
61
+ * 指定要退出登录的设备 id
62
+ * @param {{ visitorId: string }} { visitorId }
63
+ * @return {*} {Promise<void>}
64
+ */
59
65
  async logout({ visitorId }) {
60
66
  const { data } = await this.api.post("/api/user/logout", {
61
67
  visitorId
@@ -115,8 +121,15 @@ const sleep = (time = 0) => {
115
121
  }, time);
116
122
  });
117
123
  };
124
+ const getBearerToken = (token) => {
125
+ return `Bearer ${encodeURIComponent(token)}`;
126
+ };
127
+ const visitorIdKey = "__visitor_id";
128
+ const getVisitorId = () => {
129
+ return localStorage.getItem(visitorIdKey);
130
+ };
118
131
 
119
- async function sleepForLoading(config, lazyTime) {
132
+ async function sleepForLoading(config, lazyTime = 300) {
120
133
  config.metaData.endTime = +/* @__PURE__ */ new Date();
121
134
  const { startTime, endTime } = config.metaData;
122
135
  const timeDiff = endTime - startTime;
@@ -124,15 +137,16 @@ async function sleepForLoading(config, lazyTime) {
124
137
  await sleep(lazyTime - timeDiff);
125
138
  delete config.metaData;
126
139
  }
127
- const createApi = (options = {}, { lazy = false, lazyTime = 300 } = {}) => {
140
+ const createAxios$1 = (options, requestParams) => {
128
141
  const instance = axios__default.create({
129
142
  ...options,
130
143
  headers: {
131
- ...options.headers,
132
- "x-blocklet-js-sdk-version": version
144
+ ...options?.headers,
145
+ "x-blocklet-js-sdk-version": version,
146
+ "x-blocklet-visitor-id": getVisitorId()
133
147
  }
134
148
  });
135
- if (lazy) {
149
+ if (requestParams?.lazy) {
136
150
  instance.interceptors.request.use(
137
151
  (config) => {
138
152
  config.metaData = { startTime: +/* @__PURE__ */ new Date() };
@@ -142,34 +156,32 @@ const createApi = (options = {}, { lazy = false, lazyTime = 300 } = {}) => {
142
156
  );
143
157
  instance.interceptors.response.use(
144
158
  async (res) => {
145
- await sleepForLoading(res.config, lazyTime);
159
+ await sleepForLoading(res.config, requestParams?.lazyTime);
146
160
  return res;
147
161
  },
148
162
  async (err) => {
149
- await sleepForLoading(err.response.config, lazyTime);
163
+ await sleepForLoading(err.response.config, requestParams?.lazyTime);
150
164
  return Promise.reject(err);
151
165
  }
152
166
  );
153
167
  }
154
168
  return instance;
155
169
  };
156
-
157
- const baseURL = constant.WELLKNOWN_SERVICE_PATH_PREFIX;
158
- async function renewRefreshToken(refreshToken) {
170
+ async function renewRefreshToken$1(refreshToken) {
159
171
  if (!refreshToken) {
160
172
  throw new Error("Refresh token not found");
161
173
  }
162
- const refreshApi = createApi({
163
- baseURL,
174
+ const refreshApi = createAxios$1({
175
+ baseURL: constant.WELLKNOWN_SERVICE_PATH_PREFIX,
164
176
  timeout: 10 * 1e3,
165
177
  headers: {
166
- authorization: `Bearer ${encodeURIComponent(refreshToken)}`
178
+ authorization: getBearerToken(refreshToken)
167
179
  }
168
180
  });
169
- const { data } = await refreshApi.post("api/did/refreshSession");
181
+ const { data } = await refreshApi.post("/api/did/refreshSession");
170
182
  return data;
171
183
  }
172
- function createRequest({
184
+ function createRequest$1({
173
185
  getSessionToken,
174
186
  setSessionToken,
175
187
  removeSessionToken,
@@ -178,19 +190,21 @@ function createRequest({
178
190
  removeRefreshToken,
179
191
  onRefreshTokenError,
180
192
  onRefreshTokenSuccess
181
- }, options = {}) {
193
+ }, requestOptions, requestParams) {
182
194
  let refreshingTokenRequest = null;
183
- const service = createApi({
184
- baseURL,
185
- timeout: 30 * 1e3,
186
- ...options
187
- });
195
+ const service = createAxios$1(
196
+ {
197
+ timeout: 30 * 1e3,
198
+ ...requestOptions
199
+ },
200
+ requestParams
201
+ );
188
202
  service.interceptors.request.use(
189
203
  async (config) => {
190
204
  if (!Cookie__default.get(constant.SESSION_TOKEN_STORAGE_KEY)) {
191
205
  const token = getSessionToken();
192
206
  if (token) {
193
- config.headers.authorization = `Bearer ${encodeURIComponent(token)}`;
207
+ config.headers.authorization = getBearerToken(token);
194
208
  }
195
209
  }
196
210
  if (refreshingTokenRequest) {
@@ -207,10 +221,10 @@ function createRequest({
207
221
  originalRequest.headers = { ...originalRequest?.headers };
208
222
  if (error?.response?.status === 401 && !originalRequest._retry) {
209
223
  originalRequest._retry = true;
210
- if (!refreshingTokenRequest) {
211
- refreshingTokenRequest = renewRefreshToken(getRefreshToken());
212
- }
213
224
  try {
225
+ if (!refreshingTokenRequest) {
226
+ refreshingTokenRequest = renewRefreshToken$1(getRefreshToken());
227
+ }
214
228
  const tokenData = await refreshingTokenRequest;
215
229
  setSessionToken(tokenData.nextToken);
216
230
  setRefreshToken(tokenData.nextRefreshToken);
@@ -218,13 +232,13 @@ function createRequest({
218
232
  onRefreshTokenSuccess(tokenData);
219
233
  }
220
234
  return service(originalRequest);
221
- } catch (error2) {
235
+ } catch (refreshTokenError) {
222
236
  removeSessionToken();
223
237
  removeRefreshToken();
224
238
  if (typeof onRefreshTokenError === "function") {
225
- onRefreshTokenError(error2);
239
+ onRefreshTokenError(refreshTokenError);
226
240
  }
227
- return Promise.reject(error2);
241
+ return Promise.reject(error);
228
242
  } finally {
229
243
  refreshingTokenRequest = null;
230
244
  }
@@ -235,6 +249,111 @@ function createRequest({
235
249
  return service;
236
250
  }
237
251
 
252
+ function createFetch$1(globalOptions = {}, requestParams) {
253
+ return async (input, options) => {
254
+ const startAt = Date.now();
255
+ const request = fetch(input, {
256
+ ...globalOptions,
257
+ ...options,
258
+ headers: {
259
+ ...globalOptions?.headers,
260
+ ...options?.headers,
261
+ "x-blocklet-js-sdk-version": version,
262
+ "x-blocklet-visitor-id": getVisitorId()
263
+ }
264
+ });
265
+ try {
266
+ return request;
267
+ } catch (error) {
268
+ throw error;
269
+ } finally {
270
+ const endAt = Date.now();
271
+ if (requestParams?.lazy) {
272
+ const lazyTime = requestParams?.lazyTime ?? 300;
273
+ const timeDiff = endAt - startAt;
274
+ if (timeDiff < lazyTime)
275
+ await sleep(lazyTime - timeDiff);
276
+ }
277
+ }
278
+ };
279
+ }
280
+ async function renewRefreshToken(refreshToken) {
281
+ if (!refreshToken) {
282
+ throw new Error("Refresh token not found");
283
+ }
284
+ const refreshApi = createFetch$1();
285
+ const res = await refreshApi(ufo.joinURL(constant.WELLKNOWN_SERVICE_PATH_PREFIX, "/api/did/refreshSession"), {
286
+ method: "POST",
287
+ headers: {
288
+ authorization: getBearerToken(refreshToken)
289
+ }
290
+ });
291
+ const data = await res.json();
292
+ return data;
293
+ }
294
+ function createRequest({
295
+ baseURL,
296
+ getSessionToken,
297
+ setSessionToken,
298
+ removeSessionToken,
299
+ getRefreshToken,
300
+ setRefreshToken,
301
+ removeRefreshToken,
302
+ onRefreshTokenError,
303
+ onRefreshTokenSuccess
304
+ }, requestOptions, requestParams) {
305
+ let refreshingTokenRequest = null;
306
+ const service = createFetch$1(requestOptions, requestParams);
307
+ return async (input, options) => {
308
+ let authorization;
309
+ const finalUrl = typeof input === "string" ? ufo.joinURL(baseURL, input) : input;
310
+ if (!Cookie__default.get(constant.SESSION_TOKEN_STORAGE_KEY)) {
311
+ const token = getSessionToken();
312
+ if (token) {
313
+ authorization = getBearerToken(token);
314
+ }
315
+ }
316
+ if (refreshingTokenRequest) {
317
+ await refreshingTokenRequest;
318
+ }
319
+ const res = await service(finalUrl, {
320
+ ...options,
321
+ headers: {
322
+ ...options?.headers,
323
+ authorization
324
+ }
325
+ });
326
+ if (!res.ok && res.status === 401) {
327
+ refreshingTokenRequest = renewRefreshToken(getRefreshToken());
328
+ try {
329
+ const tokenData = await refreshingTokenRequest;
330
+ setSessionToken(tokenData.nextToken);
331
+ setRefreshToken(tokenData.nextRefreshToken);
332
+ if (typeof onRefreshTokenSuccess === "function") {
333
+ onRefreshTokenSuccess(tokenData);
334
+ }
335
+ return service(finalUrl, {
336
+ ...options,
337
+ headers: {
338
+ ...options?.headers,
339
+ authorization
340
+ }
341
+ });
342
+ } catch (error) {
343
+ removeSessionToken();
344
+ removeRefreshToken();
345
+ if (typeof onRefreshTokenError === "function") {
346
+ onRefreshTokenError(error);
347
+ }
348
+ return res;
349
+ } finally {
350
+ refreshingTokenRequest = null;
351
+ }
352
+ }
353
+ return res;
354
+ };
355
+ }
356
+
238
357
  var __defProp = Object.defineProperty;
239
358
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
240
359
  var __publicField = (obj, key, value) => {
@@ -248,7 +367,34 @@ class BlockletSDK {
248
367
  __publicField(this, "userSession");
249
368
  __publicField(this, "token");
250
369
  const tokenService = new TokenService();
251
- const api = createRequest({
370
+ const internalApi = createRequest$1(
371
+ {
372
+ getSessionToken: tokenService.getSessionToken,
373
+ setSessionToken: tokenService.setSessionToken,
374
+ removeSessionToken: tokenService.removeSessionToken,
375
+ getRefreshToken: tokenService.getRefreshToken,
376
+ setRefreshToken: tokenService.setRefreshToken,
377
+ removeRefreshToken: tokenService.removeRefreshToken,
378
+ onRefreshTokenError: () => {
379
+ console.error("Failed to refresh token");
380
+ },
381
+ onRefreshTokenSuccess: () => {
382
+ }
383
+ },
384
+ {
385
+ baseURL: constant.WELLKNOWN_SERVICE_PATH_PREFIX
386
+ }
387
+ );
388
+ this.user = new AuthService({ api: internalApi });
389
+ this.userSession = new UserSessionService({ api: internalApi });
390
+ this.token = tokenService;
391
+ this.api = internalApi;
392
+ }
393
+ }
394
+ function createAxios(config, requestParams) {
395
+ const tokenService = new TokenService();
396
+ return createRequest$1(
397
+ {
252
398
  getSessionToken: tokenService.getSessionToken,
253
399
  setSessionToken: tokenService.setSessionToken,
254
400
  removeSessionToken: tokenService.removeSessionToken,
@@ -260,12 +406,32 @@ class BlockletSDK {
260
406
  },
261
407
  onRefreshTokenSuccess: () => {
262
408
  }
263
- });
264
- this.user = new AuthService({ api });
265
- this.userSession = new UserSessionService({ api });
266
- this.api = api;
267
- this.token = tokenService;
268
- }
409
+ },
410
+ config,
411
+ requestParams
412
+ );
413
+ }
414
+ function createFetch(options, requestParams) {
415
+ const tokenService = new TokenService();
416
+ return createRequest(
417
+ {
418
+ getSessionToken: tokenService.getSessionToken,
419
+ setSessionToken: tokenService.setSessionToken,
420
+ removeSessionToken: tokenService.removeSessionToken,
421
+ getRefreshToken: tokenService.getRefreshToken,
422
+ setRefreshToken: tokenService.setRefreshToken,
423
+ removeRefreshToken: tokenService.removeRefreshToken,
424
+ onRefreshTokenError: () => {
425
+ console.error("Failed to refresh token");
426
+ },
427
+ onRefreshTokenSuccess: () => {
428
+ }
429
+ },
430
+ options,
431
+ requestParams
432
+ );
269
433
  }
270
434
 
271
435
  exports.BlockletSDK = BlockletSDK;
436
+ exports.createAxios = createAxios;
437
+ exports.createFetch = createFetch;
package/dist/index.d.cts CHANGED
@@ -1,4 +1,5 @@
1
- import { Axios } from 'axios';
1
+ import * as axios from 'axios';
2
+ import { Axios, AxiosRequestConfig } from 'axios';
2
3
 
3
4
  type UserPublicInfo = {
4
5
  avatar: string;
@@ -41,6 +42,12 @@ declare class AuthService {
41
42
  did: string;
42
43
  locale: string;
43
44
  }): Promise<string>;
45
+ /**
46
+ *
47
+ * 指定要退出登录的设备 id
48
+ * @param {{ visitorId: string }} { visitorId }
49
+ * @return {*} {Promise<void>}
50
+ */
44
51
  logout({ visitorId }: {
45
52
  visitorId: string;
46
53
  }): Promise<void>;
@@ -94,6 +101,11 @@ declare class UserSessionService {
94
101
  }): Promise<UserSession[]>;
95
102
  }
96
103
 
104
+ type RequestParams = {
105
+ lazy?: boolean;
106
+ lazyTime?: number;
107
+ };
108
+
97
109
  declare class BlockletSDK {
98
110
  api: Axios;
99
111
  user: AuthService;
@@ -101,5 +113,7 @@ declare class BlockletSDK {
101
113
  token: TokenService;
102
114
  constructor();
103
115
  }
116
+ declare function createAxios(config?: AxiosRequestConfig, requestParams?: RequestParams): axios.AxiosInstance;
117
+ declare function createFetch(options?: RequestInit, requestParams?: RequestParams): (input: string | Request | URL, options?: RequestInit) => Promise<Response>;
104
118
 
105
- export { AuthService, BlockletSDK, type NotificationConfig, type PrivacyConfig, TokenService, type UserPublicInfo, type UserSession, UserSessionService, type UserSessionUser, type Webhook };
119
+ export { AuthService, BlockletSDK, type NotificationConfig, type PrivacyConfig, TokenService, type UserPublicInfo, type UserSession, UserSessionService, type UserSessionUser, type Webhook, createAxios, createFetch };
package/dist/index.d.mts CHANGED
@@ -1,4 +1,5 @@
1
- import { Axios } from 'axios';
1
+ import * as axios from 'axios';
2
+ import { Axios, AxiosRequestConfig } from 'axios';
2
3
 
3
4
  type UserPublicInfo = {
4
5
  avatar: string;
@@ -41,6 +42,12 @@ declare class AuthService {
41
42
  did: string;
42
43
  locale: string;
43
44
  }): Promise<string>;
45
+ /**
46
+ *
47
+ * 指定要退出登录的设备 id
48
+ * @param {{ visitorId: string }} { visitorId }
49
+ * @return {*} {Promise<void>}
50
+ */
44
51
  logout({ visitorId }: {
45
52
  visitorId: string;
46
53
  }): Promise<void>;
@@ -94,6 +101,11 @@ declare class UserSessionService {
94
101
  }): Promise<UserSession[]>;
95
102
  }
96
103
 
104
+ type RequestParams = {
105
+ lazy?: boolean;
106
+ lazyTime?: number;
107
+ };
108
+
97
109
  declare class BlockletSDK {
98
110
  api: Axios;
99
111
  user: AuthService;
@@ -101,5 +113,7 @@ declare class BlockletSDK {
101
113
  token: TokenService;
102
114
  constructor();
103
115
  }
116
+ declare function createAxios(config?: AxiosRequestConfig, requestParams?: RequestParams): axios.AxiosInstance;
117
+ declare function createFetch(options?: RequestInit, requestParams?: RequestParams): (input: string | Request | URL, options?: RequestInit) => Promise<Response>;
104
118
 
105
- export { AuthService, BlockletSDK, type NotificationConfig, type PrivacyConfig, TokenService, type UserPublicInfo, type UserSession, UserSessionService, type UserSessionUser, type Webhook };
119
+ export { AuthService, BlockletSDK, type NotificationConfig, type PrivacyConfig, TokenService, type UserPublicInfo, type UserSession, UserSessionService, type UserSessionUser, type Webhook, createAxios, createFetch };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { Axios } from 'axios';
1
+ import * as axios from 'axios';
2
+ import { Axios, AxiosRequestConfig } from 'axios';
2
3
 
3
4
  type UserPublicInfo = {
4
5
  avatar: string;
@@ -41,6 +42,12 @@ declare class AuthService {
41
42
  did: string;
42
43
  locale: string;
43
44
  }): Promise<string>;
45
+ /**
46
+ *
47
+ * 指定要退出登录的设备 id
48
+ * @param {{ visitorId: string }} { visitorId }
49
+ * @return {*} {Promise<void>}
50
+ */
44
51
  logout({ visitorId }: {
45
52
  visitorId: string;
46
53
  }): Promise<void>;
@@ -94,6 +101,11 @@ declare class UserSessionService {
94
101
  }): Promise<UserSession[]>;
95
102
  }
96
103
 
104
+ type RequestParams = {
105
+ lazy?: boolean;
106
+ lazyTime?: number;
107
+ };
108
+
97
109
  declare class BlockletSDK {
98
110
  api: Axios;
99
111
  user: AuthService;
@@ -101,5 +113,7 @@ declare class BlockletSDK {
101
113
  token: TokenService;
102
114
  constructor();
103
115
  }
116
+ declare function createAxios(config?: AxiosRequestConfig, requestParams?: RequestParams): axios.AxiosInstance;
117
+ declare function createFetch(options?: RequestInit, requestParams?: RequestParams): (input: string | Request | URL, options?: RequestInit) => Promise<Response>;
104
118
 
105
- export { AuthService, BlockletSDK, type NotificationConfig, type PrivacyConfig, TokenService, type UserPublicInfo, type UserSession, UserSessionService, type UserSessionUser, type Webhook };
119
+ export { AuthService, BlockletSDK, type NotificationConfig, type PrivacyConfig, TokenService, type UserPublicInfo, type UserSession, UserSessionService, type UserSessionUser, type Webhook, createAxios, createFetch };
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { WELLKNOWN_SERVICE_PATH_PREFIX, SESSION_TOKEN_STORAGE_KEY, REFRESH_TOKEN_STORAGE_KEY } from '@abtnode/constant';
2
- import { withQuery } from 'ufo';
2
+ import { withQuery, joinURL } from 'ufo';
3
3
  import Cookie from 'js-cookie';
4
4
  import axios from 'axios';
5
5
 
@@ -49,6 +49,12 @@ class AuthService {
49
49
  locale
50
50
  });
51
51
  }
52
+ /**
53
+ *
54
+ * 指定要退出登录的设备 id
55
+ * @param {{ visitorId: string }} { visitorId }
56
+ * @return {*} {Promise<void>}
57
+ */
52
58
  async logout({ visitorId }) {
53
59
  const { data } = await this.api.post("/api/user/logout", {
54
60
  visitorId
@@ -108,8 +114,15 @@ const sleep = (time = 0) => {
108
114
  }, time);
109
115
  });
110
116
  };
117
+ const getBearerToken = (token) => {
118
+ return `Bearer ${encodeURIComponent(token)}`;
119
+ };
120
+ const visitorIdKey = "__visitor_id";
121
+ const getVisitorId = () => {
122
+ return localStorage.getItem(visitorIdKey);
123
+ };
111
124
 
112
- async function sleepForLoading(config, lazyTime) {
125
+ async function sleepForLoading(config, lazyTime = 300) {
113
126
  config.metaData.endTime = +/* @__PURE__ */ new Date();
114
127
  const { startTime, endTime } = config.metaData;
115
128
  const timeDiff = endTime - startTime;
@@ -117,15 +130,16 @@ async function sleepForLoading(config, lazyTime) {
117
130
  await sleep(lazyTime - timeDiff);
118
131
  delete config.metaData;
119
132
  }
120
- const createApi = (options = {}, { lazy = false, lazyTime = 300 } = {}) => {
133
+ const createAxios$1 = (options, requestParams) => {
121
134
  const instance = axios.create({
122
135
  ...options,
123
136
  headers: {
124
- ...options.headers,
125
- "x-blocklet-js-sdk-version": version
137
+ ...options?.headers,
138
+ "x-blocklet-js-sdk-version": version,
139
+ "x-blocklet-visitor-id": getVisitorId()
126
140
  }
127
141
  });
128
- if (lazy) {
142
+ if (requestParams?.lazy) {
129
143
  instance.interceptors.request.use(
130
144
  (config) => {
131
145
  config.metaData = { startTime: +/* @__PURE__ */ new Date() };
@@ -135,34 +149,32 @@ const createApi = (options = {}, { lazy = false, lazyTime = 300 } = {}) => {
135
149
  );
136
150
  instance.interceptors.response.use(
137
151
  async (res) => {
138
- await sleepForLoading(res.config, lazyTime);
152
+ await sleepForLoading(res.config, requestParams?.lazyTime);
139
153
  return res;
140
154
  },
141
155
  async (err) => {
142
- await sleepForLoading(err.response.config, lazyTime);
156
+ await sleepForLoading(err.response.config, requestParams?.lazyTime);
143
157
  return Promise.reject(err);
144
158
  }
145
159
  );
146
160
  }
147
161
  return instance;
148
162
  };
149
-
150
- const baseURL = WELLKNOWN_SERVICE_PATH_PREFIX;
151
- async function renewRefreshToken(refreshToken) {
163
+ async function renewRefreshToken$1(refreshToken) {
152
164
  if (!refreshToken) {
153
165
  throw new Error("Refresh token not found");
154
166
  }
155
- const refreshApi = createApi({
156
- baseURL,
167
+ const refreshApi = createAxios$1({
168
+ baseURL: WELLKNOWN_SERVICE_PATH_PREFIX,
157
169
  timeout: 10 * 1e3,
158
170
  headers: {
159
- authorization: `Bearer ${encodeURIComponent(refreshToken)}`
171
+ authorization: getBearerToken(refreshToken)
160
172
  }
161
173
  });
162
- const { data } = await refreshApi.post("api/did/refreshSession");
174
+ const { data } = await refreshApi.post("/api/did/refreshSession");
163
175
  return data;
164
176
  }
165
- function createRequest({
177
+ function createRequest$1({
166
178
  getSessionToken,
167
179
  setSessionToken,
168
180
  removeSessionToken,
@@ -171,19 +183,21 @@ function createRequest({
171
183
  removeRefreshToken,
172
184
  onRefreshTokenError,
173
185
  onRefreshTokenSuccess
174
- }, options = {}) {
186
+ }, requestOptions, requestParams) {
175
187
  let refreshingTokenRequest = null;
176
- const service = createApi({
177
- baseURL,
178
- timeout: 30 * 1e3,
179
- ...options
180
- });
188
+ const service = createAxios$1(
189
+ {
190
+ timeout: 30 * 1e3,
191
+ ...requestOptions
192
+ },
193
+ requestParams
194
+ );
181
195
  service.interceptors.request.use(
182
196
  async (config) => {
183
197
  if (!Cookie.get(SESSION_TOKEN_STORAGE_KEY)) {
184
198
  const token = getSessionToken();
185
199
  if (token) {
186
- config.headers.authorization = `Bearer ${encodeURIComponent(token)}`;
200
+ config.headers.authorization = getBearerToken(token);
187
201
  }
188
202
  }
189
203
  if (refreshingTokenRequest) {
@@ -200,10 +214,10 @@ function createRequest({
200
214
  originalRequest.headers = { ...originalRequest?.headers };
201
215
  if (error?.response?.status === 401 && !originalRequest._retry) {
202
216
  originalRequest._retry = true;
203
- if (!refreshingTokenRequest) {
204
- refreshingTokenRequest = renewRefreshToken(getRefreshToken());
205
- }
206
217
  try {
218
+ if (!refreshingTokenRequest) {
219
+ refreshingTokenRequest = renewRefreshToken$1(getRefreshToken());
220
+ }
207
221
  const tokenData = await refreshingTokenRequest;
208
222
  setSessionToken(tokenData.nextToken);
209
223
  setRefreshToken(tokenData.nextRefreshToken);
@@ -211,13 +225,13 @@ function createRequest({
211
225
  onRefreshTokenSuccess(tokenData);
212
226
  }
213
227
  return service(originalRequest);
214
- } catch (error2) {
228
+ } catch (refreshTokenError) {
215
229
  removeSessionToken();
216
230
  removeRefreshToken();
217
231
  if (typeof onRefreshTokenError === "function") {
218
- onRefreshTokenError(error2);
232
+ onRefreshTokenError(refreshTokenError);
219
233
  }
220
- return Promise.reject(error2);
234
+ return Promise.reject(error);
221
235
  } finally {
222
236
  refreshingTokenRequest = null;
223
237
  }
@@ -228,6 +242,111 @@ function createRequest({
228
242
  return service;
229
243
  }
230
244
 
245
+ function createFetch$1(globalOptions = {}, requestParams) {
246
+ return async (input, options) => {
247
+ const startAt = Date.now();
248
+ const request = fetch(input, {
249
+ ...globalOptions,
250
+ ...options,
251
+ headers: {
252
+ ...globalOptions?.headers,
253
+ ...options?.headers,
254
+ "x-blocklet-js-sdk-version": version,
255
+ "x-blocklet-visitor-id": getVisitorId()
256
+ }
257
+ });
258
+ try {
259
+ return request;
260
+ } catch (error) {
261
+ throw error;
262
+ } finally {
263
+ const endAt = Date.now();
264
+ if (requestParams?.lazy) {
265
+ const lazyTime = requestParams?.lazyTime ?? 300;
266
+ const timeDiff = endAt - startAt;
267
+ if (timeDiff < lazyTime)
268
+ await sleep(lazyTime - timeDiff);
269
+ }
270
+ }
271
+ };
272
+ }
273
+ async function renewRefreshToken(refreshToken) {
274
+ if (!refreshToken) {
275
+ throw new Error("Refresh token not found");
276
+ }
277
+ const refreshApi = createFetch$1();
278
+ const res = await refreshApi(joinURL(WELLKNOWN_SERVICE_PATH_PREFIX, "/api/did/refreshSession"), {
279
+ method: "POST",
280
+ headers: {
281
+ authorization: getBearerToken(refreshToken)
282
+ }
283
+ });
284
+ const data = await res.json();
285
+ return data;
286
+ }
287
+ function createRequest({
288
+ baseURL,
289
+ getSessionToken,
290
+ setSessionToken,
291
+ removeSessionToken,
292
+ getRefreshToken,
293
+ setRefreshToken,
294
+ removeRefreshToken,
295
+ onRefreshTokenError,
296
+ onRefreshTokenSuccess
297
+ }, requestOptions, requestParams) {
298
+ let refreshingTokenRequest = null;
299
+ const service = createFetch$1(requestOptions, requestParams);
300
+ return async (input, options) => {
301
+ let authorization;
302
+ const finalUrl = typeof input === "string" ? joinURL(baseURL, input) : input;
303
+ if (!Cookie.get(SESSION_TOKEN_STORAGE_KEY)) {
304
+ const token = getSessionToken();
305
+ if (token) {
306
+ authorization = getBearerToken(token);
307
+ }
308
+ }
309
+ if (refreshingTokenRequest) {
310
+ await refreshingTokenRequest;
311
+ }
312
+ const res = await service(finalUrl, {
313
+ ...options,
314
+ headers: {
315
+ ...options?.headers,
316
+ authorization
317
+ }
318
+ });
319
+ if (!res.ok && res.status === 401) {
320
+ refreshingTokenRequest = renewRefreshToken(getRefreshToken());
321
+ try {
322
+ const tokenData = await refreshingTokenRequest;
323
+ setSessionToken(tokenData.nextToken);
324
+ setRefreshToken(tokenData.nextRefreshToken);
325
+ if (typeof onRefreshTokenSuccess === "function") {
326
+ onRefreshTokenSuccess(tokenData);
327
+ }
328
+ return service(finalUrl, {
329
+ ...options,
330
+ headers: {
331
+ ...options?.headers,
332
+ authorization
333
+ }
334
+ });
335
+ } catch (error) {
336
+ removeSessionToken();
337
+ removeRefreshToken();
338
+ if (typeof onRefreshTokenError === "function") {
339
+ onRefreshTokenError(error);
340
+ }
341
+ return res;
342
+ } finally {
343
+ refreshingTokenRequest = null;
344
+ }
345
+ }
346
+ return res;
347
+ };
348
+ }
349
+
231
350
  var __defProp = Object.defineProperty;
232
351
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
233
352
  var __publicField = (obj, key, value) => {
@@ -241,7 +360,34 @@ class BlockletSDK {
241
360
  __publicField(this, "userSession");
242
361
  __publicField(this, "token");
243
362
  const tokenService = new TokenService();
244
- const api = createRequest({
363
+ const internalApi = createRequest$1(
364
+ {
365
+ getSessionToken: tokenService.getSessionToken,
366
+ setSessionToken: tokenService.setSessionToken,
367
+ removeSessionToken: tokenService.removeSessionToken,
368
+ getRefreshToken: tokenService.getRefreshToken,
369
+ setRefreshToken: tokenService.setRefreshToken,
370
+ removeRefreshToken: tokenService.removeRefreshToken,
371
+ onRefreshTokenError: () => {
372
+ console.error("Failed to refresh token");
373
+ },
374
+ onRefreshTokenSuccess: () => {
375
+ }
376
+ },
377
+ {
378
+ baseURL: WELLKNOWN_SERVICE_PATH_PREFIX
379
+ }
380
+ );
381
+ this.user = new AuthService({ api: internalApi });
382
+ this.userSession = new UserSessionService({ api: internalApi });
383
+ this.token = tokenService;
384
+ this.api = internalApi;
385
+ }
386
+ }
387
+ function createAxios(config, requestParams) {
388
+ const tokenService = new TokenService();
389
+ return createRequest$1(
390
+ {
245
391
  getSessionToken: tokenService.getSessionToken,
246
392
  setSessionToken: tokenService.setSessionToken,
247
393
  removeSessionToken: tokenService.removeSessionToken,
@@ -253,12 +399,30 @@ class BlockletSDK {
253
399
  },
254
400
  onRefreshTokenSuccess: () => {
255
401
  }
256
- });
257
- this.user = new AuthService({ api });
258
- this.userSession = new UserSessionService({ api });
259
- this.api = api;
260
- this.token = tokenService;
261
- }
402
+ },
403
+ config,
404
+ requestParams
405
+ );
406
+ }
407
+ function createFetch(options, requestParams) {
408
+ const tokenService = new TokenService();
409
+ return createRequest(
410
+ {
411
+ getSessionToken: tokenService.getSessionToken,
412
+ setSessionToken: tokenService.setSessionToken,
413
+ removeSessionToken: tokenService.removeSessionToken,
414
+ getRefreshToken: tokenService.getRefreshToken,
415
+ setRefreshToken: tokenService.setRefreshToken,
416
+ removeRefreshToken: tokenService.removeRefreshToken,
417
+ onRefreshTokenError: () => {
418
+ console.error("Failed to refresh token");
419
+ },
420
+ onRefreshTokenSuccess: () => {
421
+ }
422
+ },
423
+ options,
424
+ requestParams
425
+ );
262
426
  }
263
427
 
264
- export { BlockletSDK };
428
+ export { BlockletSDK, createAxios, createFetch };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blocklet/js-sdk",
3
- "version": "1.16.26-beta-351de484",
3
+ "version": "1.16.26-beta-63f52a83",
4
4
  "main": "dist/index.cjs",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",
@@ -31,7 +31,7 @@
31
31
  "build": "unbuild"
32
32
  },
33
33
  "dependencies": {
34
- "@abtnode/constant": "1.16.26-beta-351de484",
34
+ "@abtnode/constant": "1.16.26-beta-63f52a83",
35
35
  "axios": "^0.27.2",
36
36
  "js-cookie": "^3.0.5",
37
37
  "ufo": "^1.3.2"
@@ -39,5 +39,5 @@
39
39
  "devDependencies": {
40
40
  "unbuild": "^2.0.0"
41
41
  },
42
- "gitHead": "00eba435a21506382c7823ea804abea196390a0f"
42
+ "gitHead": "ce04b1916e531d79d9535111cd370c69c04fcbc1"
43
43
  }