@clairejs/client 3.4.6 → 3.4.9
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/README.md
CHANGED
|
@@ -9,7 +9,7 @@ export interface RequestData {
|
|
|
9
9
|
headers?: object;
|
|
10
10
|
options?: RequestOptions;
|
|
11
11
|
}
|
|
12
|
-
export declare class DefaultHttpClient extends AbstractHttpClient {
|
|
12
|
+
export declare abstract class DefaultHttpClient extends AbstractHttpClient {
|
|
13
13
|
protected readonly apiServerUrl: string;
|
|
14
14
|
protected readonly logger?: LogHandler | undefined;
|
|
15
15
|
protected readonly maxRetryCount: number;
|
|
@@ -18,8 +18,8 @@ export declare class DefaultHttpClient extends AbstractHttpClient {
|
|
|
18
18
|
private readonly api;
|
|
19
19
|
constructor(apiServerUrl: string, logger?: LogHandler | undefined, maxRetryCount?: number, delayMsBetweenRetry?: number, storage?: AbstractStorage | undefined);
|
|
20
20
|
protected resolveUrl(url: string): Promise<string>;
|
|
21
|
-
protected
|
|
22
|
-
protected errorHandler<T = any>(_operation: () => Promise<T>, err: any): Promise<T | undefined>;
|
|
21
|
+
protected abstract getAuthorizationHeader(): Promise<Record<string, string>>;
|
|
22
|
+
protected abstract errorHandler<T = any>(_operation: () => Promise<T>, err: any): Promise<T | undefined>;
|
|
23
23
|
protected retry<T = any>(apiCall: () => Promise<T>, retryCount?: number): Promise<T | undefined>;
|
|
24
24
|
protected performRequest<T = any>(data: RequestData): Promise<T | undefined>;
|
|
25
25
|
protected doGet<T = any>(url: string, headers?: object, options?: RequestOptions): Promise<T | undefined>;
|
|
@@ -53,12 +53,6 @@ export class DefaultHttpClient extends AbstractHttpClient {
|
|
|
53
53
|
async resolveUrl(url) {
|
|
54
54
|
return this.apiServerUrl + url;
|
|
55
55
|
}
|
|
56
|
-
async getAuthorization() {
|
|
57
|
-
return "";
|
|
58
|
-
}
|
|
59
|
-
async errorHandler(_operation, err) {
|
|
60
|
-
throw err;
|
|
61
|
-
}
|
|
62
56
|
async retry(apiCall, retryCount = 0) {
|
|
63
57
|
try {
|
|
64
58
|
return await apiCall();
|
|
@@ -79,7 +73,7 @@ export class DefaultHttpClient extends AbstractHttpClient {
|
|
|
79
73
|
async performRequest(data) {
|
|
80
74
|
const finalUrl = await this.resolveUrl(data.url);
|
|
81
75
|
const operation = async () => {
|
|
82
|
-
const authHeader = !data.options?.noAuthorization ?
|
|
76
|
+
const authHeader = !data.options?.noAuthorization ? await this.getAuthorizationHeader() : {};
|
|
83
77
|
const result = await this.api({
|
|
84
78
|
method: data.method,
|
|
85
79
|
url: finalUrl,
|
|
@@ -2,7 +2,7 @@ import { AccessToken, LogHandler } from "@clairejs/core";
|
|
|
2
2
|
import { AbstractStorage } from "../system/AbstractStorage";
|
|
3
3
|
import { AbstractTokenManager } from "./AbstractTokenManager";
|
|
4
4
|
import { DefaultHttpClient } from "./DefaultHttpClient";
|
|
5
|
-
export declare class RefreshHttpClient extends DefaultHttpClient {
|
|
5
|
+
export declare abstract class RefreshHttpClient extends DefaultHttpClient {
|
|
6
6
|
protected readonly apiServerUrl: string;
|
|
7
7
|
protected readonly tokenManager: AbstractTokenManager;
|
|
8
8
|
protected readonly logger?: LogHandler | undefined;
|
|
@@ -13,9 +13,9 @@ export declare class RefreshHttpClient extends DefaultHttpClient {
|
|
|
13
13
|
private refreshQueue;
|
|
14
14
|
private tokenQueue;
|
|
15
15
|
constructor(apiServerUrl: string, tokenManager: AbstractTokenManager, logger?: LogHandler | undefined, maxRetryCount?: number, delayMsBetweenRetry?: number, storage?: AbstractStorage | undefined);
|
|
16
|
-
protected getRefreshedAccessToken(): Promise<AccessToken>;
|
|
17
|
-
protected reauthenticate(): Promise<void>;
|
|
18
16
|
protected getAuthorization(): Promise<string>;
|
|
19
|
-
protected refreshToken
|
|
17
|
+
protected abstract refreshSession(refreshToken: string): Promise<AccessToken | undefined>;
|
|
20
18
|
protected errorHandler<T = any>(operation: () => Promise<T>, err: any): Promise<T | undefined>;
|
|
19
|
+
protected getAuthorizationHeader(): Promise<Record<string, string>>;
|
|
20
|
+
protected refreshToken(token?: AccessToken): Promise<void>;
|
|
21
21
|
}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { Errors, LogLevel } from "@clairejs/core";
|
|
2
2
|
import { DefaultHttpClient } from "./DefaultHttpClient";
|
|
3
|
-
const tokenExpiredError = Errors.TOKEN_EXPIRED().name;
|
|
4
|
-
const invalidTokenError = Errors.INVALID_TOKEN().name;
|
|
5
3
|
export class RefreshHttpClient extends DefaultHttpClient {
|
|
6
4
|
apiServerUrl;
|
|
7
5
|
tokenManager;
|
|
@@ -21,12 +19,6 @@ export class RefreshHttpClient extends DefaultHttpClient {
|
|
|
21
19
|
this.delayMsBetweenRetry = delayMsBetweenRetry;
|
|
22
20
|
this.storage = storage;
|
|
23
21
|
}
|
|
24
|
-
async getRefreshedAccessToken() {
|
|
25
|
-
throw Errors.INVALID_TOKEN();
|
|
26
|
-
}
|
|
27
|
-
async reauthenticate() {
|
|
28
|
-
throw Errors.INVALID_CREDENTIALS();
|
|
29
|
-
}
|
|
30
22
|
async getAuthorization() {
|
|
31
23
|
if (this.refreshing) {
|
|
32
24
|
const promise = new Promise((resolver) => {
|
|
@@ -39,6 +31,19 @@ export class RefreshHttpClient extends DefaultHttpClient {
|
|
|
39
31
|
return accessToken?.token || "";
|
|
40
32
|
}
|
|
41
33
|
}
|
|
34
|
+
async errorHandler(operation, err) {
|
|
35
|
+
if (err.name === Errors.TOKEN_EXPIRED().name) {
|
|
36
|
+
return await this.refreshToken()
|
|
37
|
+
.then(operation)
|
|
38
|
+
.catch((err) => {
|
|
39
|
+
throw err.response.data || err;
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
async getAuthorizationHeader() {
|
|
45
|
+
return { authorization: await this.getAuthorization() };
|
|
46
|
+
}
|
|
42
47
|
async refreshToken(token) {
|
|
43
48
|
if (this.refreshing) {
|
|
44
49
|
this.logger?.log(LogLevel.DEBUG, "Awaiting refresh token, queued");
|
|
@@ -47,14 +52,16 @@ export class RefreshHttpClient extends DefaultHttpClient {
|
|
|
47
52
|
});
|
|
48
53
|
}
|
|
49
54
|
token = token || (await this.tokenManager.getAccessToken());
|
|
50
|
-
//-- call to api server to refresh token
|
|
51
55
|
if (!token || !token.refreshToken) {
|
|
52
56
|
//-- there is no refresh token to refresh
|
|
53
|
-
|
|
57
|
+
throw Errors.SESSION_EXPIRED();
|
|
54
58
|
}
|
|
55
59
|
try {
|
|
56
60
|
this.refreshing = true;
|
|
57
|
-
token = await this.
|
|
61
|
+
token = await this.refreshSession(token.refreshToken);
|
|
62
|
+
if (!token) {
|
|
63
|
+
throw Errors.SESSION_EXPIRED();
|
|
64
|
+
}
|
|
58
65
|
await this.tokenManager.setAccessToken(token);
|
|
59
66
|
this.logger?.log(LogLevel.DEBUG, "Access token was refreshed");
|
|
60
67
|
}
|
|
@@ -64,36 +71,11 @@ export class RefreshHttpClient extends DefaultHttpClient {
|
|
|
64
71
|
resolver();
|
|
65
72
|
}
|
|
66
73
|
for (const resolver of this.tokenQueue) {
|
|
67
|
-
resolver(token
|
|
74
|
+
resolver(token?.token || "");
|
|
68
75
|
}
|
|
69
76
|
//-- clear queue
|
|
70
77
|
this.refreshQueue = [];
|
|
71
78
|
this.tokenQueue = [];
|
|
72
79
|
}
|
|
73
80
|
}
|
|
74
|
-
async errorHandler(operation, err) {
|
|
75
|
-
const errorName = err.name;
|
|
76
|
-
if (errorName === tokenExpiredError) {
|
|
77
|
-
return await this.refreshToken()
|
|
78
|
-
.catch(() => this.reauthenticate())
|
|
79
|
-
.catch(() => {
|
|
80
|
-
throw Errors.SESSION_EXPIRED();
|
|
81
|
-
})
|
|
82
|
-
.then(() => operation())
|
|
83
|
-
.catch((err) => {
|
|
84
|
-
throw err.response?.data || Errors.HTTP_REQUEST_ERROR();
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
else if (errorName === invalidTokenError) {
|
|
88
|
-
return await this.reauthenticate()
|
|
89
|
-
.catch(() => {
|
|
90
|
-
throw Errors.SESSION_EXPIRED();
|
|
91
|
-
})
|
|
92
|
-
.then(() => operation())
|
|
93
|
-
.catch((err) => {
|
|
94
|
-
throw err.response?.data || Errors.HTTP_REQUEST_ERROR();
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
throw err;
|
|
98
|
-
}
|
|
99
81
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clairejs/client",
|
|
3
|
-
"version": "3.4.
|
|
3
|
+
"version": "3.4.9",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"type": "module",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"axios": "^1.3.4"
|
|
14
14
|
},
|
|
15
15
|
"peerDependencies": {
|
|
16
|
-
"@clairejs/core": "^3.8.
|
|
16
|
+
"@clairejs/core": "^3.8.10"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@types/mocha": "^10.0.1",
|