@blocklet/js-sdk 1.16.22
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 +242 -0
- package/dist/index.d.cts +55 -0
- package/dist/index.d.mts +55 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.mjs +235 -0
- package/package.json +41 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const constant = require('@abtnode/constant');
|
|
4
|
+
const ufo = require('ufo');
|
|
5
|
+
const Cookie = require('js-cookie');
|
|
6
|
+
const axios = require('axios');
|
|
7
|
+
|
|
8
|
+
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
|
|
9
|
+
|
|
10
|
+
const Cookie__default = /*#__PURE__*/_interopDefaultCompat(Cookie);
|
|
11
|
+
const axios__default = /*#__PURE__*/_interopDefaultCompat(axios);
|
|
12
|
+
|
|
13
|
+
var __defProp$1 = Object.defineProperty;
|
|
14
|
+
var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
15
|
+
var __publicField$1 = (obj, key, value) => {
|
|
16
|
+
__defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
17
|
+
return value;
|
|
18
|
+
};
|
|
19
|
+
class AuthService {
|
|
20
|
+
constructor({ api }) {
|
|
21
|
+
__publicField$1(this, "api");
|
|
22
|
+
this.api = api;
|
|
23
|
+
}
|
|
24
|
+
async getUserPublicInfo({ did }) {
|
|
25
|
+
const { data } = await this.api.get("/api/user", {
|
|
26
|
+
params: { did }
|
|
27
|
+
});
|
|
28
|
+
return data;
|
|
29
|
+
}
|
|
30
|
+
async getUserPrivacyConfig({ did }) {
|
|
31
|
+
const { data } = await this.api.get("/api/user/privacy/config", {
|
|
32
|
+
params: { did }
|
|
33
|
+
});
|
|
34
|
+
return data;
|
|
35
|
+
}
|
|
36
|
+
async saveUserPrivacyConfig(config) {
|
|
37
|
+
const { data } = await this.api.post("/api/user/privacy/config", config);
|
|
38
|
+
return data;
|
|
39
|
+
}
|
|
40
|
+
async getUserNotificationConfig() {
|
|
41
|
+
const { data } = await this.api.get("/api/user/notification/config");
|
|
42
|
+
return data;
|
|
43
|
+
}
|
|
44
|
+
async saveUserNotificationConfig(config) {
|
|
45
|
+
const { data } = await this.api.post("/api/user/notification/config", config);
|
|
46
|
+
return data;
|
|
47
|
+
}
|
|
48
|
+
async testNotificationWebhook(webhook) {
|
|
49
|
+
const { data } = await this.api.put("/api/user/notification/webhook", webhook);
|
|
50
|
+
return data;
|
|
51
|
+
}
|
|
52
|
+
async getProfileUrl({ did, locale }) {
|
|
53
|
+
const url = `${constant.WELLKNOWN_SERVICE_PATH_PREFIX}/user`;
|
|
54
|
+
return ufo.withQuery(url, {
|
|
55
|
+
did,
|
|
56
|
+
locale
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
class TokenService {
|
|
62
|
+
getSessionToken() {
|
|
63
|
+
return Cookie__default.get(constant.SESSION_TOKEN_STORAGE_KEY);
|
|
64
|
+
}
|
|
65
|
+
setSessionToken(value) {
|
|
66
|
+
Cookie__default.set(constant.SESSION_TOKEN_STORAGE_KEY, value);
|
|
67
|
+
}
|
|
68
|
+
removeSessionToken() {
|
|
69
|
+
Cookie__default.remove(constant.SESSION_TOKEN_STORAGE_KEY);
|
|
70
|
+
}
|
|
71
|
+
getRefreshToken() {
|
|
72
|
+
return localStorage.getItem(constant.REFRESH_TOKEN_STORAGE_KEY);
|
|
73
|
+
}
|
|
74
|
+
setRefreshToken(value) {
|
|
75
|
+
localStorage.setItem(constant.REFRESH_TOKEN_STORAGE_KEY, value);
|
|
76
|
+
}
|
|
77
|
+
removeRefreshToken() {
|
|
78
|
+
localStorage.removeItem(constant.REFRESH_TOKEN_STORAGE_KEY);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const version = "1.16.22";
|
|
83
|
+
|
|
84
|
+
const sleep = (time = 0) => {
|
|
85
|
+
return new Promise((resolve) => {
|
|
86
|
+
setTimeout(() => {
|
|
87
|
+
resolve();
|
|
88
|
+
}, time);
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
async function sleepForLoading(config, lazyTime) {
|
|
93
|
+
config.metaData.endTime = +/* @__PURE__ */ new Date();
|
|
94
|
+
const { startTime, endTime } = config.metaData;
|
|
95
|
+
const timeDiff = endTime - startTime;
|
|
96
|
+
if (timeDiff < lazyTime)
|
|
97
|
+
await sleep(lazyTime - timeDiff);
|
|
98
|
+
delete config.metaData;
|
|
99
|
+
}
|
|
100
|
+
const createApi = (options = {}, { lazy = false, lazyTime = 300 } = {}) => {
|
|
101
|
+
const instance = axios__default.create({
|
|
102
|
+
...options,
|
|
103
|
+
headers: {
|
|
104
|
+
...options.headers,
|
|
105
|
+
"x-blocklet-client-sdk-version": version
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
if (lazy) {
|
|
109
|
+
instance.interceptors.request.use(
|
|
110
|
+
(config) => {
|
|
111
|
+
config.metaData = { startTime: +/* @__PURE__ */ new Date() };
|
|
112
|
+
return config;
|
|
113
|
+
},
|
|
114
|
+
(err) => Promise.reject(err)
|
|
115
|
+
);
|
|
116
|
+
instance.interceptors.response.use(
|
|
117
|
+
async (res) => {
|
|
118
|
+
await sleepForLoading(res.config, lazyTime);
|
|
119
|
+
return res;
|
|
120
|
+
},
|
|
121
|
+
async (err) => {
|
|
122
|
+
await sleepForLoading(err.response.config, lazyTime);
|
|
123
|
+
return Promise.reject(err);
|
|
124
|
+
}
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
return instance;
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
const baseURL = constant.WELLKNOWN_SERVICE_PATH_PREFIX;
|
|
131
|
+
async function renewRefreshToken(refreshToken) {
|
|
132
|
+
if (!refreshToken) {
|
|
133
|
+
throw new Error("Refresh token not found");
|
|
134
|
+
}
|
|
135
|
+
const refreshApi = createApi({
|
|
136
|
+
baseURL,
|
|
137
|
+
timeout: 10 * 1e3,
|
|
138
|
+
headers: {
|
|
139
|
+
authorization: `Bearer ${encodeURIComponent(refreshToken)}`
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
const { data } = await refreshApi.post("api/did/refreshSession");
|
|
143
|
+
return data;
|
|
144
|
+
}
|
|
145
|
+
function createRequest({
|
|
146
|
+
getSessionToken,
|
|
147
|
+
setSessionToken,
|
|
148
|
+
removeSessionToken,
|
|
149
|
+
getRefreshToken,
|
|
150
|
+
setRefreshToken,
|
|
151
|
+
removeRefreshToken,
|
|
152
|
+
onRefreshTokenError,
|
|
153
|
+
onRefreshTokenSuccess
|
|
154
|
+
}, options = {}) {
|
|
155
|
+
let refreshingTokenRequest = null;
|
|
156
|
+
const service = createApi({
|
|
157
|
+
baseURL,
|
|
158
|
+
timeout: 30 * 1e3,
|
|
159
|
+
...options
|
|
160
|
+
});
|
|
161
|
+
service.interceptors.request.use(
|
|
162
|
+
async (config) => {
|
|
163
|
+
if (!Cookie__default.get(constant.SESSION_TOKEN_STORAGE_KEY)) {
|
|
164
|
+
const token = getSessionToken();
|
|
165
|
+
if (token) {
|
|
166
|
+
config.headers.authorization = `Bearer ${encodeURIComponent(token)}`;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (refreshingTokenRequest) {
|
|
170
|
+
await refreshingTokenRequest;
|
|
171
|
+
}
|
|
172
|
+
return config;
|
|
173
|
+
},
|
|
174
|
+
(error) => Promise.reject(error)
|
|
175
|
+
);
|
|
176
|
+
service.interceptors.response.use(
|
|
177
|
+
(response) => response,
|
|
178
|
+
async (error) => {
|
|
179
|
+
const originalRequest = error.config;
|
|
180
|
+
originalRequest.headers = { ...originalRequest?.headers };
|
|
181
|
+
if (error?.response?.status === 401 && !originalRequest._retry) {
|
|
182
|
+
originalRequest._retry = true;
|
|
183
|
+
if (!refreshingTokenRequest) {
|
|
184
|
+
refreshingTokenRequest = renewRefreshToken(getRefreshToken());
|
|
185
|
+
}
|
|
186
|
+
try {
|
|
187
|
+
const tokenData = await refreshingTokenRequest;
|
|
188
|
+
setSessionToken(tokenData.nextToken);
|
|
189
|
+
setRefreshToken(tokenData.nextRefreshToken);
|
|
190
|
+
if (typeof onRefreshTokenSuccess === "function") {
|
|
191
|
+
onRefreshTokenSuccess(tokenData);
|
|
192
|
+
}
|
|
193
|
+
return service(originalRequest);
|
|
194
|
+
} catch (error2) {
|
|
195
|
+
removeSessionToken();
|
|
196
|
+
removeRefreshToken();
|
|
197
|
+
if (typeof onRefreshTokenError === "function") {
|
|
198
|
+
onRefreshTokenError(error2);
|
|
199
|
+
}
|
|
200
|
+
return Promise.reject(error2);
|
|
201
|
+
} finally {
|
|
202
|
+
refreshingTokenRequest = null;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return Promise.reject(error);
|
|
206
|
+
}
|
|
207
|
+
);
|
|
208
|
+
return service;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
var __defProp = Object.defineProperty;
|
|
212
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
213
|
+
var __publicField = (obj, key, value) => {
|
|
214
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
215
|
+
return value;
|
|
216
|
+
};
|
|
217
|
+
class BlockletSDK {
|
|
218
|
+
constructor() {
|
|
219
|
+
__publicField(this, "api");
|
|
220
|
+
__publicField(this, "user");
|
|
221
|
+
__publicField(this, "token");
|
|
222
|
+
const tokenService = new TokenService();
|
|
223
|
+
const api = createRequest({
|
|
224
|
+
getSessionToken: tokenService.getSessionToken,
|
|
225
|
+
setSessionToken: tokenService.setSessionToken,
|
|
226
|
+
removeSessionToken: tokenService.removeSessionToken,
|
|
227
|
+
getRefreshToken: tokenService.getRefreshToken,
|
|
228
|
+
setRefreshToken: tokenService.setRefreshToken,
|
|
229
|
+
removeRefreshToken: tokenService.removeRefreshToken,
|
|
230
|
+
onRefreshTokenError: () => {
|
|
231
|
+
console.error("Failed to refresh token");
|
|
232
|
+
},
|
|
233
|
+
onRefreshTokenSuccess: () => {
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
this.user = new AuthService({ api });
|
|
237
|
+
this.api = api;
|
|
238
|
+
this.token = tokenService;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
exports.BlockletSDK = BlockletSDK;
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Axios } from 'axios';
|
|
2
|
+
|
|
3
|
+
type Webhook = {
|
|
4
|
+
type: 'slack' | 'api';
|
|
5
|
+
url: string;
|
|
6
|
+
};
|
|
7
|
+
type NotificationConfig = {
|
|
8
|
+
webhooks?: Webhook[];
|
|
9
|
+
notifications?: {
|
|
10
|
+
email?: boolean;
|
|
11
|
+
wallet?: boolean;
|
|
12
|
+
phone?: boolean;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
type PrivacyConfig = {
|
|
16
|
+
[key: string]: boolean;
|
|
17
|
+
};
|
|
18
|
+
declare class AuthService {
|
|
19
|
+
private api;
|
|
20
|
+
constructor({ api }: {
|
|
21
|
+
api: Axios;
|
|
22
|
+
});
|
|
23
|
+
getUserPublicInfo({ did }: {
|
|
24
|
+
did: string;
|
|
25
|
+
}): Promise<any>;
|
|
26
|
+
getUserPrivacyConfig({ did }: {
|
|
27
|
+
did: string;
|
|
28
|
+
}): Promise<any>;
|
|
29
|
+
saveUserPrivacyConfig(config: PrivacyConfig): Promise<any>;
|
|
30
|
+
getUserNotificationConfig(): Promise<any>;
|
|
31
|
+
saveUserNotificationConfig(config: NotificationConfig): Promise<any>;
|
|
32
|
+
testNotificationWebhook(webhook: Webhook): Promise<any>;
|
|
33
|
+
getProfileUrl({ did, locale }: {
|
|
34
|
+
did: string;
|
|
35
|
+
locale: string;
|
|
36
|
+
}): Promise<string>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
declare class TokenService {
|
|
40
|
+
getSessionToken(): string;
|
|
41
|
+
setSessionToken(value: string): void;
|
|
42
|
+
removeSessionToken(): void;
|
|
43
|
+
getRefreshToken(): string;
|
|
44
|
+
setRefreshToken(value: string): void;
|
|
45
|
+
removeRefreshToken(): void;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
declare class BlockletSDK {
|
|
49
|
+
private api;
|
|
50
|
+
user: AuthService;
|
|
51
|
+
token: TokenService;
|
|
52
|
+
constructor();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export { BlockletSDK };
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Axios } from 'axios';
|
|
2
|
+
|
|
3
|
+
type Webhook = {
|
|
4
|
+
type: 'slack' | 'api';
|
|
5
|
+
url: string;
|
|
6
|
+
};
|
|
7
|
+
type NotificationConfig = {
|
|
8
|
+
webhooks?: Webhook[];
|
|
9
|
+
notifications?: {
|
|
10
|
+
email?: boolean;
|
|
11
|
+
wallet?: boolean;
|
|
12
|
+
phone?: boolean;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
type PrivacyConfig = {
|
|
16
|
+
[key: string]: boolean;
|
|
17
|
+
};
|
|
18
|
+
declare class AuthService {
|
|
19
|
+
private api;
|
|
20
|
+
constructor({ api }: {
|
|
21
|
+
api: Axios;
|
|
22
|
+
});
|
|
23
|
+
getUserPublicInfo({ did }: {
|
|
24
|
+
did: string;
|
|
25
|
+
}): Promise<any>;
|
|
26
|
+
getUserPrivacyConfig({ did }: {
|
|
27
|
+
did: string;
|
|
28
|
+
}): Promise<any>;
|
|
29
|
+
saveUserPrivacyConfig(config: PrivacyConfig): Promise<any>;
|
|
30
|
+
getUserNotificationConfig(): Promise<any>;
|
|
31
|
+
saveUserNotificationConfig(config: NotificationConfig): Promise<any>;
|
|
32
|
+
testNotificationWebhook(webhook: Webhook): Promise<any>;
|
|
33
|
+
getProfileUrl({ did, locale }: {
|
|
34
|
+
did: string;
|
|
35
|
+
locale: string;
|
|
36
|
+
}): Promise<string>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
declare class TokenService {
|
|
40
|
+
getSessionToken(): string;
|
|
41
|
+
setSessionToken(value: string): void;
|
|
42
|
+
removeSessionToken(): void;
|
|
43
|
+
getRefreshToken(): string;
|
|
44
|
+
setRefreshToken(value: string): void;
|
|
45
|
+
removeRefreshToken(): void;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
declare class BlockletSDK {
|
|
49
|
+
private api;
|
|
50
|
+
user: AuthService;
|
|
51
|
+
token: TokenService;
|
|
52
|
+
constructor();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export { BlockletSDK };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Axios } from 'axios';
|
|
2
|
+
|
|
3
|
+
type Webhook = {
|
|
4
|
+
type: 'slack' | 'api';
|
|
5
|
+
url: string;
|
|
6
|
+
};
|
|
7
|
+
type NotificationConfig = {
|
|
8
|
+
webhooks?: Webhook[];
|
|
9
|
+
notifications?: {
|
|
10
|
+
email?: boolean;
|
|
11
|
+
wallet?: boolean;
|
|
12
|
+
phone?: boolean;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
type PrivacyConfig = {
|
|
16
|
+
[key: string]: boolean;
|
|
17
|
+
};
|
|
18
|
+
declare class AuthService {
|
|
19
|
+
private api;
|
|
20
|
+
constructor({ api }: {
|
|
21
|
+
api: Axios;
|
|
22
|
+
});
|
|
23
|
+
getUserPublicInfo({ did }: {
|
|
24
|
+
did: string;
|
|
25
|
+
}): Promise<any>;
|
|
26
|
+
getUserPrivacyConfig({ did }: {
|
|
27
|
+
did: string;
|
|
28
|
+
}): Promise<any>;
|
|
29
|
+
saveUserPrivacyConfig(config: PrivacyConfig): Promise<any>;
|
|
30
|
+
getUserNotificationConfig(): Promise<any>;
|
|
31
|
+
saveUserNotificationConfig(config: NotificationConfig): Promise<any>;
|
|
32
|
+
testNotificationWebhook(webhook: Webhook): Promise<any>;
|
|
33
|
+
getProfileUrl({ did, locale }: {
|
|
34
|
+
did: string;
|
|
35
|
+
locale: string;
|
|
36
|
+
}): Promise<string>;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
declare class TokenService {
|
|
40
|
+
getSessionToken(): string;
|
|
41
|
+
setSessionToken(value: string): void;
|
|
42
|
+
removeSessionToken(): void;
|
|
43
|
+
getRefreshToken(): string;
|
|
44
|
+
setRefreshToken(value: string): void;
|
|
45
|
+
removeRefreshToken(): void;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
declare class BlockletSDK {
|
|
49
|
+
private api;
|
|
50
|
+
user: AuthService;
|
|
51
|
+
token: TokenService;
|
|
52
|
+
constructor();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export { BlockletSDK };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { WELLKNOWN_SERVICE_PATH_PREFIX, SESSION_TOKEN_STORAGE_KEY, REFRESH_TOKEN_STORAGE_KEY } from '@abtnode/constant';
|
|
2
|
+
import { withQuery } from 'ufo';
|
|
3
|
+
import Cookie from 'js-cookie';
|
|
4
|
+
import axios from 'axios';
|
|
5
|
+
|
|
6
|
+
var __defProp$1 = Object.defineProperty;
|
|
7
|
+
var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
+
var __publicField$1 = (obj, key, value) => {
|
|
9
|
+
__defNormalProp$1(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
10
|
+
return value;
|
|
11
|
+
};
|
|
12
|
+
class AuthService {
|
|
13
|
+
constructor({ api }) {
|
|
14
|
+
__publicField$1(this, "api");
|
|
15
|
+
this.api = api;
|
|
16
|
+
}
|
|
17
|
+
async getUserPublicInfo({ did }) {
|
|
18
|
+
const { data } = await this.api.get("/api/user", {
|
|
19
|
+
params: { did }
|
|
20
|
+
});
|
|
21
|
+
return data;
|
|
22
|
+
}
|
|
23
|
+
async getUserPrivacyConfig({ did }) {
|
|
24
|
+
const { data } = await this.api.get("/api/user/privacy/config", {
|
|
25
|
+
params: { did }
|
|
26
|
+
});
|
|
27
|
+
return data;
|
|
28
|
+
}
|
|
29
|
+
async saveUserPrivacyConfig(config) {
|
|
30
|
+
const { data } = await this.api.post("/api/user/privacy/config", config);
|
|
31
|
+
return data;
|
|
32
|
+
}
|
|
33
|
+
async getUserNotificationConfig() {
|
|
34
|
+
const { data } = await this.api.get("/api/user/notification/config");
|
|
35
|
+
return data;
|
|
36
|
+
}
|
|
37
|
+
async saveUserNotificationConfig(config) {
|
|
38
|
+
const { data } = await this.api.post("/api/user/notification/config", config);
|
|
39
|
+
return data;
|
|
40
|
+
}
|
|
41
|
+
async testNotificationWebhook(webhook) {
|
|
42
|
+
const { data } = await this.api.put("/api/user/notification/webhook", webhook);
|
|
43
|
+
return data;
|
|
44
|
+
}
|
|
45
|
+
async getProfileUrl({ did, locale }) {
|
|
46
|
+
const url = `${WELLKNOWN_SERVICE_PATH_PREFIX}/user`;
|
|
47
|
+
return withQuery(url, {
|
|
48
|
+
did,
|
|
49
|
+
locale
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
class TokenService {
|
|
55
|
+
getSessionToken() {
|
|
56
|
+
return Cookie.get(SESSION_TOKEN_STORAGE_KEY);
|
|
57
|
+
}
|
|
58
|
+
setSessionToken(value) {
|
|
59
|
+
Cookie.set(SESSION_TOKEN_STORAGE_KEY, value);
|
|
60
|
+
}
|
|
61
|
+
removeSessionToken() {
|
|
62
|
+
Cookie.remove(SESSION_TOKEN_STORAGE_KEY);
|
|
63
|
+
}
|
|
64
|
+
getRefreshToken() {
|
|
65
|
+
return localStorage.getItem(REFRESH_TOKEN_STORAGE_KEY);
|
|
66
|
+
}
|
|
67
|
+
setRefreshToken(value) {
|
|
68
|
+
localStorage.setItem(REFRESH_TOKEN_STORAGE_KEY, value);
|
|
69
|
+
}
|
|
70
|
+
removeRefreshToken() {
|
|
71
|
+
localStorage.removeItem(REFRESH_TOKEN_STORAGE_KEY);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const version = "1.16.22";
|
|
76
|
+
|
|
77
|
+
const sleep = (time = 0) => {
|
|
78
|
+
return new Promise((resolve) => {
|
|
79
|
+
setTimeout(() => {
|
|
80
|
+
resolve();
|
|
81
|
+
}, time);
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
async function sleepForLoading(config, lazyTime) {
|
|
86
|
+
config.metaData.endTime = +/* @__PURE__ */ new Date();
|
|
87
|
+
const { startTime, endTime } = config.metaData;
|
|
88
|
+
const timeDiff = endTime - startTime;
|
|
89
|
+
if (timeDiff < lazyTime)
|
|
90
|
+
await sleep(lazyTime - timeDiff);
|
|
91
|
+
delete config.metaData;
|
|
92
|
+
}
|
|
93
|
+
const createApi = (options = {}, { lazy = false, lazyTime = 300 } = {}) => {
|
|
94
|
+
const instance = axios.create({
|
|
95
|
+
...options,
|
|
96
|
+
headers: {
|
|
97
|
+
...options.headers,
|
|
98
|
+
"x-blocklet-client-sdk-version": version
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
if (lazy) {
|
|
102
|
+
instance.interceptors.request.use(
|
|
103
|
+
(config) => {
|
|
104
|
+
config.metaData = { startTime: +/* @__PURE__ */ new Date() };
|
|
105
|
+
return config;
|
|
106
|
+
},
|
|
107
|
+
(err) => Promise.reject(err)
|
|
108
|
+
);
|
|
109
|
+
instance.interceptors.response.use(
|
|
110
|
+
async (res) => {
|
|
111
|
+
await sleepForLoading(res.config, lazyTime);
|
|
112
|
+
return res;
|
|
113
|
+
},
|
|
114
|
+
async (err) => {
|
|
115
|
+
await sleepForLoading(err.response.config, lazyTime);
|
|
116
|
+
return Promise.reject(err);
|
|
117
|
+
}
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
return instance;
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const baseURL = WELLKNOWN_SERVICE_PATH_PREFIX;
|
|
124
|
+
async function renewRefreshToken(refreshToken) {
|
|
125
|
+
if (!refreshToken) {
|
|
126
|
+
throw new Error("Refresh token not found");
|
|
127
|
+
}
|
|
128
|
+
const refreshApi = createApi({
|
|
129
|
+
baseURL,
|
|
130
|
+
timeout: 10 * 1e3,
|
|
131
|
+
headers: {
|
|
132
|
+
authorization: `Bearer ${encodeURIComponent(refreshToken)}`
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
const { data } = await refreshApi.post("api/did/refreshSession");
|
|
136
|
+
return data;
|
|
137
|
+
}
|
|
138
|
+
function createRequest({
|
|
139
|
+
getSessionToken,
|
|
140
|
+
setSessionToken,
|
|
141
|
+
removeSessionToken,
|
|
142
|
+
getRefreshToken,
|
|
143
|
+
setRefreshToken,
|
|
144
|
+
removeRefreshToken,
|
|
145
|
+
onRefreshTokenError,
|
|
146
|
+
onRefreshTokenSuccess
|
|
147
|
+
}, options = {}) {
|
|
148
|
+
let refreshingTokenRequest = null;
|
|
149
|
+
const service = createApi({
|
|
150
|
+
baseURL,
|
|
151
|
+
timeout: 30 * 1e3,
|
|
152
|
+
...options
|
|
153
|
+
});
|
|
154
|
+
service.interceptors.request.use(
|
|
155
|
+
async (config) => {
|
|
156
|
+
if (!Cookie.get(SESSION_TOKEN_STORAGE_KEY)) {
|
|
157
|
+
const token = getSessionToken();
|
|
158
|
+
if (token) {
|
|
159
|
+
config.headers.authorization = `Bearer ${encodeURIComponent(token)}`;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
if (refreshingTokenRequest) {
|
|
163
|
+
await refreshingTokenRequest;
|
|
164
|
+
}
|
|
165
|
+
return config;
|
|
166
|
+
},
|
|
167
|
+
(error) => Promise.reject(error)
|
|
168
|
+
);
|
|
169
|
+
service.interceptors.response.use(
|
|
170
|
+
(response) => response,
|
|
171
|
+
async (error) => {
|
|
172
|
+
const originalRequest = error.config;
|
|
173
|
+
originalRequest.headers = { ...originalRequest?.headers };
|
|
174
|
+
if (error?.response?.status === 401 && !originalRequest._retry) {
|
|
175
|
+
originalRequest._retry = true;
|
|
176
|
+
if (!refreshingTokenRequest) {
|
|
177
|
+
refreshingTokenRequest = renewRefreshToken(getRefreshToken());
|
|
178
|
+
}
|
|
179
|
+
try {
|
|
180
|
+
const tokenData = await refreshingTokenRequest;
|
|
181
|
+
setSessionToken(tokenData.nextToken);
|
|
182
|
+
setRefreshToken(tokenData.nextRefreshToken);
|
|
183
|
+
if (typeof onRefreshTokenSuccess === "function") {
|
|
184
|
+
onRefreshTokenSuccess(tokenData);
|
|
185
|
+
}
|
|
186
|
+
return service(originalRequest);
|
|
187
|
+
} catch (error2) {
|
|
188
|
+
removeSessionToken();
|
|
189
|
+
removeRefreshToken();
|
|
190
|
+
if (typeof onRefreshTokenError === "function") {
|
|
191
|
+
onRefreshTokenError(error2);
|
|
192
|
+
}
|
|
193
|
+
return Promise.reject(error2);
|
|
194
|
+
} finally {
|
|
195
|
+
refreshingTokenRequest = null;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return Promise.reject(error);
|
|
199
|
+
}
|
|
200
|
+
);
|
|
201
|
+
return service;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
var __defProp = Object.defineProperty;
|
|
205
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
206
|
+
var __publicField = (obj, key, value) => {
|
|
207
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
208
|
+
return value;
|
|
209
|
+
};
|
|
210
|
+
class BlockletSDK {
|
|
211
|
+
constructor() {
|
|
212
|
+
__publicField(this, "api");
|
|
213
|
+
__publicField(this, "user");
|
|
214
|
+
__publicField(this, "token");
|
|
215
|
+
const tokenService = new TokenService();
|
|
216
|
+
const api = createRequest({
|
|
217
|
+
getSessionToken: tokenService.getSessionToken,
|
|
218
|
+
setSessionToken: tokenService.setSessionToken,
|
|
219
|
+
removeSessionToken: tokenService.removeSessionToken,
|
|
220
|
+
getRefreshToken: tokenService.getRefreshToken,
|
|
221
|
+
setRefreshToken: tokenService.setRefreshToken,
|
|
222
|
+
removeRefreshToken: tokenService.removeRefreshToken,
|
|
223
|
+
onRefreshTokenError: () => {
|
|
224
|
+
console.error("Failed to refresh token");
|
|
225
|
+
},
|
|
226
|
+
onRefreshTokenSuccess: () => {
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
this.user = new AuthService({ api });
|
|
230
|
+
this.api = api;
|
|
231
|
+
this.token = tokenService;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export { BlockletSDK };
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@blocklet/js-sdk",
|
|
3
|
+
"version": "1.16.22",
|
|
4
|
+
"main": "dist/index.cjs",
|
|
5
|
+
"import": "dist/index.mjs",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"publishConfig": {
|
|
9
|
+
"access": "public"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist"
|
|
13
|
+
],
|
|
14
|
+
"bugs": {
|
|
15
|
+
"url": "https://github.com/ArcBlock/blocklet-server/issues"
|
|
16
|
+
},
|
|
17
|
+
"description": "sdk for blocklet development, client only",
|
|
18
|
+
"keywords": [
|
|
19
|
+
"blocklet",
|
|
20
|
+
"client",
|
|
21
|
+
"sdk"
|
|
22
|
+
],
|
|
23
|
+
"author": "blocklet<blocklet@arcblock.io>",
|
|
24
|
+
"homepage": "https://github.com/ArcBlock/blocklet-server#readme",
|
|
25
|
+
"repository": {
|
|
26
|
+
"type": "git",
|
|
27
|
+
"url": "git+https://github.com/ArcBlock/blocklet-server.git"
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"build": "unbuild"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@abtnode/constant": "^1.16.22",
|
|
34
|
+
"axios": "^0.27.2",
|
|
35
|
+
"js-cookie": "^3.0.5",
|
|
36
|
+
"ufo": "^1.3.2"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"unbuild": "^2.0.0"
|
|
40
|
+
}
|
|
41
|
+
}
|