@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 +201 -35
- package/dist/index.d.cts +16 -2
- package/dist/index.d.mts +16 -2
- package/dist/index.d.ts +16 -2
- package/dist/index.mjs +201 -37
- package/package.json +3 -3
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
|
|
140
|
+
const createAxios$1 = (options, requestParams) => {
|
|
128
141
|
const instance = axios__default.create({
|
|
129
142
|
...options,
|
|
130
143
|
headers: {
|
|
131
|
-
...options
|
|
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 =
|
|
163
|
-
baseURL,
|
|
174
|
+
const refreshApi = createAxios$1({
|
|
175
|
+
baseURL: constant.WELLKNOWN_SERVICE_PATH_PREFIX,
|
|
164
176
|
timeout: 10 * 1e3,
|
|
165
177
|
headers: {
|
|
166
|
-
authorization:
|
|
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
|
-
},
|
|
193
|
+
}, requestOptions, requestParams) {
|
|
182
194
|
let refreshingTokenRequest = null;
|
|
183
|
-
const service =
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
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 =
|
|
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 (
|
|
235
|
+
} catch (refreshTokenError) {
|
|
222
236
|
removeSessionToken();
|
|
223
237
|
removeRefreshToken();
|
|
224
238
|
if (typeof onRefreshTokenError === "function") {
|
|
225
|
-
onRefreshTokenError(
|
|
239
|
+
onRefreshTokenError(refreshTokenError);
|
|
226
240
|
}
|
|
227
|
-
return Promise.reject(
|
|
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
|
|
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
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
133
|
+
const createAxios$1 = (options, requestParams) => {
|
|
121
134
|
const instance = axios.create({
|
|
122
135
|
...options,
|
|
123
136
|
headers: {
|
|
124
|
-
...options
|
|
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 =
|
|
156
|
-
baseURL,
|
|
167
|
+
const refreshApi = createAxios$1({
|
|
168
|
+
baseURL: WELLKNOWN_SERVICE_PATH_PREFIX,
|
|
157
169
|
timeout: 10 * 1e3,
|
|
158
170
|
headers: {
|
|
159
|
-
authorization:
|
|
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
|
-
},
|
|
186
|
+
}, requestOptions, requestParams) {
|
|
175
187
|
let refreshingTokenRequest = null;
|
|
176
|
-
const service =
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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 =
|
|
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 (
|
|
228
|
+
} catch (refreshTokenError) {
|
|
215
229
|
removeSessionToken();
|
|
216
230
|
removeRefreshToken();
|
|
217
231
|
if (typeof onRefreshTokenError === "function") {
|
|
218
|
-
onRefreshTokenError(
|
|
232
|
+
onRefreshTokenError(refreshTokenError);
|
|
219
233
|
}
|
|
220
|
-
return Promise.reject(
|
|
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
|
|
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
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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-
|
|
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-
|
|
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": "
|
|
42
|
+
"gitHead": "ce04b1916e531d79d9535111cd370c69c04fcbc1"
|
|
43
43
|
}
|