@oxyhq/services 5.10.1 → 5.10.2
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/lib/commonjs/core/OxyServices.js +44 -13
- package/lib/commonjs/core/OxyServices.js.map +1 -1
- package/lib/module/core/OxyServices.js +44 -13
- package/lib/module/core/OxyServices.js.map +1 -1
- package/lib/typescript/core/OxyServices.d.ts +1 -8
- package/lib/typescript/core/OxyServices.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/OxyServices.ts +56 -13
|
@@ -14,10 +14,36 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
|
|
|
14
14
|
* This class provides the core HTTP client setup, token management, and error handling.
|
|
15
15
|
* Specific functionality is delegated to focused service modules.
|
|
16
16
|
*/
|
|
17
|
-
|
|
17
|
+
// Centralized token store
|
|
18
|
+
class TokenStore {
|
|
18
19
|
accessToken = null;
|
|
19
20
|
refreshToken = null;
|
|
20
|
-
|
|
21
|
+
constructor() {}
|
|
22
|
+
static getInstance() {
|
|
23
|
+
if (!TokenStore.instance) {
|
|
24
|
+
TokenStore.instance = new TokenStore();
|
|
25
|
+
}
|
|
26
|
+
return TokenStore.instance;
|
|
27
|
+
}
|
|
28
|
+
setTokens(accessToken, refreshToken = '') {
|
|
29
|
+
this.accessToken = accessToken;
|
|
30
|
+
this.refreshToken = refreshToken;
|
|
31
|
+
}
|
|
32
|
+
getAccessToken() {
|
|
33
|
+
return this.accessToken;
|
|
34
|
+
}
|
|
35
|
+
getRefreshToken() {
|
|
36
|
+
return this.refreshToken;
|
|
37
|
+
}
|
|
38
|
+
clearTokens() {
|
|
39
|
+
this.accessToken = null;
|
|
40
|
+
this.refreshToken = null;
|
|
41
|
+
}
|
|
42
|
+
hasAccessToken() {
|
|
43
|
+
return !!this.accessToken;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
class OxyServices {
|
|
21
47
|
/**
|
|
22
48
|
* Creates a new instance of the OxyServices client
|
|
23
49
|
* @param config - Configuration for the client
|
|
@@ -27,6 +53,7 @@ class OxyServices {
|
|
|
27
53
|
baseURL: config.baseURL,
|
|
28
54
|
timeout: 10000 // 10 second timeout
|
|
29
55
|
});
|
|
56
|
+
this.tokenStore = TokenStore.getInstance();
|
|
30
57
|
this.setupInterceptors();
|
|
31
58
|
}
|
|
32
59
|
|
|
@@ -36,13 +63,15 @@ class OxyServices {
|
|
|
36
63
|
setupInterceptors() {
|
|
37
64
|
// Request interceptor for adding auth header and handling token refresh
|
|
38
65
|
this.client.interceptors.request.use(async req => {
|
|
39
|
-
if (!this.
|
|
66
|
+
if (!this.tokenStore.hasAccessToken()) {
|
|
40
67
|
return req;
|
|
41
68
|
}
|
|
42
69
|
|
|
43
70
|
// Check if token is expired and refresh if needed
|
|
44
71
|
try {
|
|
45
|
-
const
|
|
72
|
+
const accessToken = this.tokenStore.getAccessToken();
|
|
73
|
+
if (!accessToken) return req;
|
|
74
|
+
const decoded = (0, _jwtDecode.jwtDecode)(accessToken);
|
|
46
75
|
const currentTime = Math.floor(Date.now() / 1000);
|
|
47
76
|
|
|
48
77
|
// If token expires in less than 60 seconds, refresh it
|
|
@@ -51,7 +80,7 @@ class OxyServices {
|
|
|
51
80
|
if (decoded.sessionId) {
|
|
52
81
|
try {
|
|
53
82
|
const res = await this.client.get(`/api/session/token/${decoded.sessionId}`);
|
|
54
|
-
this.
|
|
83
|
+
this.tokenStore.setTokens(res.data.accessToken);
|
|
55
84
|
} catch (refreshError) {
|
|
56
85
|
// If refresh fails, clear tokens
|
|
57
86
|
this.clearTokens();
|
|
@@ -60,7 +89,10 @@ class OxyServices {
|
|
|
60
89
|
}
|
|
61
90
|
|
|
62
91
|
// Add authorization header
|
|
63
|
-
|
|
92
|
+
const currentToken = this.tokenStore.getAccessToken();
|
|
93
|
+
if (currentToken) {
|
|
94
|
+
req.headers.Authorization = `Bearer ${currentToken}`;
|
|
95
|
+
}
|
|
64
96
|
} catch (error) {
|
|
65
97
|
// If token is invalid, clear it
|
|
66
98
|
this.clearTokens();
|
|
@@ -80,27 +112,26 @@ class OxyServices {
|
|
|
80
112
|
* Set authentication tokens
|
|
81
113
|
*/
|
|
82
114
|
setTokens(accessToken, refreshToken = '') {
|
|
83
|
-
this.accessToken
|
|
84
|
-
this.refreshToken = refreshToken;
|
|
115
|
+
this.tokenStore.setTokens(accessToken, refreshToken);
|
|
85
116
|
}
|
|
86
117
|
|
|
87
118
|
/**
|
|
88
119
|
* Clear stored authentication tokens
|
|
89
120
|
*/
|
|
90
121
|
clearTokens() {
|
|
91
|
-
this.
|
|
92
|
-
this.refreshToken = null;
|
|
122
|
+
this.tokenStore.clearTokens();
|
|
93
123
|
}
|
|
94
124
|
|
|
95
125
|
/**
|
|
96
126
|
* Get the current user ID from the access token
|
|
97
127
|
*/
|
|
98
128
|
getCurrentUserId() {
|
|
99
|
-
|
|
129
|
+
const accessToken = this.tokenStore.getAccessToken();
|
|
130
|
+
if (!accessToken) {
|
|
100
131
|
return null;
|
|
101
132
|
}
|
|
102
133
|
try {
|
|
103
|
-
const decoded = (0, _jwtDecode.jwtDecode)(
|
|
134
|
+
const decoded = (0, _jwtDecode.jwtDecode)(accessToken);
|
|
104
135
|
return decoded.userId || decoded.id || null;
|
|
105
136
|
} catch (error) {
|
|
106
137
|
return null;
|
|
@@ -111,7 +142,7 @@ class OxyServices {
|
|
|
111
142
|
* Check if the client has a valid access token
|
|
112
143
|
*/
|
|
113
144
|
hasAccessToken() {
|
|
114
|
-
return
|
|
145
|
+
return this.tokenStore.hasAccessToken();
|
|
115
146
|
}
|
|
116
147
|
|
|
117
148
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_axios","_interopRequireDefault","require","_jwtDecode","_errorUtils","e","__esModule","default","
|
|
1
|
+
{"version":3,"names":["_axios","_interopRequireDefault","require","_jwtDecode","_errorUtils","e","__esModule","default","TokenStore","accessToken","refreshToken","constructor","getInstance","instance","setTokens","getAccessToken","getRefreshToken","clearTokens","hasAccessToken","OxyServices","config","client","axios","create","baseURL","timeout","tokenStore","setupInterceptors","interceptors","request","use","req","decoded","jwtDecode","currentTime","Math","floor","Date","now","exp","sessionId","res","get","data","refreshError","currentToken","headers","Authorization","error","getBaseURL","defaults","getCurrentUserId","userId","id","validate","valid","getClient","handleError","handleHttpError","healthCheck","auth","options","debug","onError","loadUser","session","next","authHeader","token","startsWith","substring","console","log","method","path","message","code","status","json","decodeError","user","apiError","exports"],"sourceRoot":"../../../src","sources":["core/OxyServices.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,10 +9,36 @@ import { handleHttpError } from '../utils/errorUtils';
|
|
|
9
9
|
* This class provides the core HTTP client setup, token management, and error handling.
|
|
10
10
|
* Specific functionality is delegated to focused service modules.
|
|
11
11
|
*/
|
|
12
|
-
|
|
12
|
+
// Centralized token store
|
|
13
|
+
class TokenStore {
|
|
13
14
|
accessToken = null;
|
|
14
15
|
refreshToken = null;
|
|
15
|
-
|
|
16
|
+
constructor() {}
|
|
17
|
+
static getInstance() {
|
|
18
|
+
if (!TokenStore.instance) {
|
|
19
|
+
TokenStore.instance = new TokenStore();
|
|
20
|
+
}
|
|
21
|
+
return TokenStore.instance;
|
|
22
|
+
}
|
|
23
|
+
setTokens(accessToken, refreshToken = '') {
|
|
24
|
+
this.accessToken = accessToken;
|
|
25
|
+
this.refreshToken = refreshToken;
|
|
26
|
+
}
|
|
27
|
+
getAccessToken() {
|
|
28
|
+
return this.accessToken;
|
|
29
|
+
}
|
|
30
|
+
getRefreshToken() {
|
|
31
|
+
return this.refreshToken;
|
|
32
|
+
}
|
|
33
|
+
clearTokens() {
|
|
34
|
+
this.accessToken = null;
|
|
35
|
+
this.refreshToken = null;
|
|
36
|
+
}
|
|
37
|
+
hasAccessToken() {
|
|
38
|
+
return !!this.accessToken;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export class OxyServices {
|
|
16
42
|
/**
|
|
17
43
|
* Creates a new instance of the OxyServices client
|
|
18
44
|
* @param config - Configuration for the client
|
|
@@ -22,6 +48,7 @@ export class OxyServices {
|
|
|
22
48
|
baseURL: config.baseURL,
|
|
23
49
|
timeout: 10000 // 10 second timeout
|
|
24
50
|
});
|
|
51
|
+
this.tokenStore = TokenStore.getInstance();
|
|
25
52
|
this.setupInterceptors();
|
|
26
53
|
}
|
|
27
54
|
|
|
@@ -31,13 +58,15 @@ export class OxyServices {
|
|
|
31
58
|
setupInterceptors() {
|
|
32
59
|
// Request interceptor for adding auth header and handling token refresh
|
|
33
60
|
this.client.interceptors.request.use(async req => {
|
|
34
|
-
if (!this.
|
|
61
|
+
if (!this.tokenStore.hasAccessToken()) {
|
|
35
62
|
return req;
|
|
36
63
|
}
|
|
37
64
|
|
|
38
65
|
// Check if token is expired and refresh if needed
|
|
39
66
|
try {
|
|
40
|
-
const
|
|
67
|
+
const accessToken = this.tokenStore.getAccessToken();
|
|
68
|
+
if (!accessToken) return req;
|
|
69
|
+
const decoded = jwtDecode(accessToken);
|
|
41
70
|
const currentTime = Math.floor(Date.now() / 1000);
|
|
42
71
|
|
|
43
72
|
// If token expires in less than 60 seconds, refresh it
|
|
@@ -46,7 +75,7 @@ export class OxyServices {
|
|
|
46
75
|
if (decoded.sessionId) {
|
|
47
76
|
try {
|
|
48
77
|
const res = await this.client.get(`/api/session/token/${decoded.sessionId}`);
|
|
49
|
-
this.
|
|
78
|
+
this.tokenStore.setTokens(res.data.accessToken);
|
|
50
79
|
} catch (refreshError) {
|
|
51
80
|
// If refresh fails, clear tokens
|
|
52
81
|
this.clearTokens();
|
|
@@ -55,7 +84,10 @@ export class OxyServices {
|
|
|
55
84
|
}
|
|
56
85
|
|
|
57
86
|
// Add authorization header
|
|
58
|
-
|
|
87
|
+
const currentToken = this.tokenStore.getAccessToken();
|
|
88
|
+
if (currentToken) {
|
|
89
|
+
req.headers.Authorization = `Bearer ${currentToken}`;
|
|
90
|
+
}
|
|
59
91
|
} catch (error) {
|
|
60
92
|
// If token is invalid, clear it
|
|
61
93
|
this.clearTokens();
|
|
@@ -75,27 +107,26 @@ export class OxyServices {
|
|
|
75
107
|
* Set authentication tokens
|
|
76
108
|
*/
|
|
77
109
|
setTokens(accessToken, refreshToken = '') {
|
|
78
|
-
this.accessToken
|
|
79
|
-
this.refreshToken = refreshToken;
|
|
110
|
+
this.tokenStore.setTokens(accessToken, refreshToken);
|
|
80
111
|
}
|
|
81
112
|
|
|
82
113
|
/**
|
|
83
114
|
* Clear stored authentication tokens
|
|
84
115
|
*/
|
|
85
116
|
clearTokens() {
|
|
86
|
-
this.
|
|
87
|
-
this.refreshToken = null;
|
|
117
|
+
this.tokenStore.clearTokens();
|
|
88
118
|
}
|
|
89
119
|
|
|
90
120
|
/**
|
|
91
121
|
* Get the current user ID from the access token
|
|
92
122
|
*/
|
|
93
123
|
getCurrentUserId() {
|
|
94
|
-
|
|
124
|
+
const accessToken = this.tokenStore.getAccessToken();
|
|
125
|
+
if (!accessToken) {
|
|
95
126
|
return null;
|
|
96
127
|
}
|
|
97
128
|
try {
|
|
98
|
-
const decoded = jwtDecode(
|
|
129
|
+
const decoded = jwtDecode(accessToken);
|
|
99
130
|
return decoded.userId || decoded.id || null;
|
|
100
131
|
} catch (error) {
|
|
101
132
|
return null;
|
|
@@ -106,7 +137,7 @@ export class OxyServices {
|
|
|
106
137
|
* Check if the client has a valid access token
|
|
107
138
|
*/
|
|
108
139
|
hasAccessToken() {
|
|
109
|
-
return
|
|
140
|
+
return this.tokenStore.hasAccessToken();
|
|
110
141
|
}
|
|
111
142
|
|
|
112
143
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["axios","jwtDecode","handleHttpError","
|
|
1
|
+
{"version":3,"names":["axios","jwtDecode","handleHttpError","TokenStore","accessToken","refreshToken","constructor","getInstance","instance","setTokens","getAccessToken","getRefreshToken","clearTokens","hasAccessToken","OxyServices","config","client","create","baseURL","timeout","tokenStore","setupInterceptors","interceptors","request","use","req","decoded","currentTime","Math","floor","Date","now","exp","sessionId","res","get","data","refreshError","currentToken","headers","Authorization","error","getBaseURL","defaults","getCurrentUserId","userId","id","validate","valid","getClient","handleError","healthCheck","auth","options","debug","onError","loadUser","session","next","authHeader","token","startsWith","substring","console","log","method","path","message","code","status","json","decodeError","user","apiError"],"sourceRoot":"../../../src","sources":["core/OxyServices.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,15 +1,8 @@
|
|
|
1
1
|
import { AxiosInstance } from 'axios';
|
|
2
2
|
import { OxyConfig, ApiError } from '../models/interfaces';
|
|
3
|
-
/**
|
|
4
|
-
* OxyServices - Base client library for interacting with the Oxy API
|
|
5
|
-
*
|
|
6
|
-
* This class provides the core HTTP client setup, token management, and error handling.
|
|
7
|
-
* Specific functionality is delegated to focused service modules.
|
|
8
|
-
*/
|
|
9
3
|
export declare class OxyServices {
|
|
10
4
|
protected client: AxiosInstance;
|
|
11
|
-
private
|
|
12
|
-
private refreshToken;
|
|
5
|
+
private tokenStore;
|
|
13
6
|
/**
|
|
14
7
|
* Creates a new instance of the OxyServices client
|
|
15
8
|
* @param config - Configuration for the client
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OxyServices.d.ts","sourceRoot":"","sources":["../../../src/core/OxyServices.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAA8B,MAAM,OAAO,CAAC;AAEzE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAQ,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"OxyServices.d.ts","sourceRoot":"","sources":["../../../src/core/OxyServices.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,aAAa,EAA8B,MAAM,OAAO,CAAC;AAEzE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAQ,MAAM,sBAAsB,CAAC;AAsDjE,qBAAa,WAAW;IACtB,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC;IAChC,OAAO,CAAC,UAAU,CAAa;IAE/B;;;OAGG;gBACS,MAAM,EAAE,SAAS;IAU7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA2CzB;;OAEG;IACI,UAAU,IAAI,MAAM;IAI3B;;OAEG;IACI,SAAS,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,GAAE,MAAW,GAAG,IAAI;IAItE;;OAEG;IACI,WAAW,IAAI,IAAI;IAI1B;;OAEG;IACI,gBAAgB,IAAI,MAAM,GAAG,IAAI;IAcxC;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAalC;;OAEG;IACH,SAAS,CAAC,SAAS,IAAI,aAAa;IAIpC;;OAEG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,GAAG,QAAQ;IAI3C;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KACnB,CAAC;IASF;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,IAAI,CAAC,OAAO,GAAE;QACZ,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC;QACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,OAAO,CAAC,EAAE,OAAO,CAAC;KACd,IAII,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,MAAM,GAAG;CAoGxC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oxyhq/services",
|
|
3
|
-
"version": "5.10.
|
|
3
|
+
"version": "5.10.2",
|
|
4
4
|
"description": "Reusable OxyHQ module to handle authentication, user management, karma system, device-based session management and more 🚀",
|
|
5
5
|
"main": "lib/commonjs/index.js",
|
|
6
6
|
"module": "lib/module/index.js",
|
package/src/core/OxyServices.ts
CHANGED
|
@@ -16,11 +16,48 @@ interface JwtPayload {
|
|
|
16
16
|
* This class provides the core HTTP client setup, token management, and error handling.
|
|
17
17
|
* Specific functionality is delegated to focused service modules.
|
|
18
18
|
*/
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
// Centralized token store
|
|
20
|
+
class TokenStore {
|
|
21
|
+
private static instance: TokenStore;
|
|
21
22
|
private accessToken: string | null = null;
|
|
22
23
|
private refreshToken: string | null = null;
|
|
23
24
|
|
|
25
|
+
private constructor() {}
|
|
26
|
+
|
|
27
|
+
static getInstance(): TokenStore {
|
|
28
|
+
if (!TokenStore.instance) {
|
|
29
|
+
TokenStore.instance = new TokenStore();
|
|
30
|
+
}
|
|
31
|
+
return TokenStore.instance;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
setTokens(accessToken: string, refreshToken: string = ''): void {
|
|
35
|
+
this.accessToken = accessToken;
|
|
36
|
+
this.refreshToken = refreshToken;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
getAccessToken(): string | null {
|
|
40
|
+
return this.accessToken;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
getRefreshToken(): string | null {
|
|
44
|
+
return this.refreshToken;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
clearTokens(): void {
|
|
48
|
+
this.accessToken = null;
|
|
49
|
+
this.refreshToken = null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
hasAccessToken(): boolean {
|
|
53
|
+
return !!this.accessToken;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export class OxyServices {
|
|
58
|
+
protected client: AxiosInstance;
|
|
59
|
+
private tokenStore: TokenStore;
|
|
60
|
+
|
|
24
61
|
/**
|
|
25
62
|
* Creates a new instance of the OxyServices client
|
|
26
63
|
* @param config - Configuration for the client
|
|
@@ -31,6 +68,7 @@ export class OxyServices {
|
|
|
31
68
|
timeout: 10000 // 10 second timeout
|
|
32
69
|
});
|
|
33
70
|
|
|
71
|
+
this.tokenStore = TokenStore.getInstance();
|
|
34
72
|
this.setupInterceptors();
|
|
35
73
|
}
|
|
36
74
|
|
|
@@ -40,13 +78,16 @@ export class OxyServices {
|
|
|
40
78
|
private setupInterceptors(): void {
|
|
41
79
|
// Request interceptor for adding auth header and handling token refresh
|
|
42
80
|
this.client.interceptors.request.use(async (req: InternalAxiosRequestConfig) => {
|
|
43
|
-
if (!this.
|
|
81
|
+
if (!this.tokenStore.hasAccessToken()) {
|
|
44
82
|
return req;
|
|
45
83
|
}
|
|
46
84
|
|
|
47
85
|
// Check if token is expired and refresh if needed
|
|
48
86
|
try {
|
|
49
|
-
const
|
|
87
|
+
const accessToken = this.tokenStore.getAccessToken();
|
|
88
|
+
if (!accessToken) return req;
|
|
89
|
+
|
|
90
|
+
const decoded = jwtDecode<JwtPayload>(accessToken);
|
|
50
91
|
const currentTime = Math.floor(Date.now() / 1000);
|
|
51
92
|
|
|
52
93
|
// If token expires in less than 60 seconds, refresh it
|
|
@@ -55,7 +96,7 @@ export class OxyServices {
|
|
|
55
96
|
if (decoded.sessionId) {
|
|
56
97
|
try {
|
|
57
98
|
const res = await this.client.get(`/api/session/token/${decoded.sessionId}`);
|
|
58
|
-
this.
|
|
99
|
+
this.tokenStore.setTokens(res.data.accessToken);
|
|
59
100
|
} catch (refreshError) {
|
|
60
101
|
// If refresh fails, clear tokens
|
|
61
102
|
this.clearTokens();
|
|
@@ -64,7 +105,10 @@ export class OxyServices {
|
|
|
64
105
|
}
|
|
65
106
|
|
|
66
107
|
// Add authorization header
|
|
67
|
-
|
|
108
|
+
const currentToken = this.tokenStore.getAccessToken();
|
|
109
|
+
if (currentToken) {
|
|
110
|
+
req.headers.Authorization = `Bearer ${currentToken}`;
|
|
111
|
+
}
|
|
68
112
|
} catch (error) {
|
|
69
113
|
// If token is invalid, clear it
|
|
70
114
|
this.clearTokens();
|
|
@@ -85,28 +129,27 @@ export class OxyServices {
|
|
|
85
129
|
* Set authentication tokens
|
|
86
130
|
*/
|
|
87
131
|
public setTokens(accessToken: string, refreshToken: string = ''): void {
|
|
88
|
-
this.accessToken
|
|
89
|
-
this.refreshToken = refreshToken;
|
|
132
|
+
this.tokenStore.setTokens(accessToken, refreshToken);
|
|
90
133
|
}
|
|
91
134
|
|
|
92
135
|
/**
|
|
93
136
|
* Clear stored authentication tokens
|
|
94
137
|
*/
|
|
95
138
|
public clearTokens(): void {
|
|
96
|
-
this.
|
|
97
|
-
this.refreshToken = null;
|
|
139
|
+
this.tokenStore.clearTokens();
|
|
98
140
|
}
|
|
99
141
|
|
|
100
142
|
/**
|
|
101
143
|
* Get the current user ID from the access token
|
|
102
144
|
*/
|
|
103
145
|
public getCurrentUserId(): string | null {
|
|
104
|
-
|
|
146
|
+
const accessToken = this.tokenStore.getAccessToken();
|
|
147
|
+
if (!accessToken) {
|
|
105
148
|
return null;
|
|
106
149
|
}
|
|
107
150
|
|
|
108
151
|
try {
|
|
109
|
-
const decoded = jwtDecode<JwtPayload>(
|
|
152
|
+
const decoded = jwtDecode<JwtPayload>(accessToken);
|
|
110
153
|
return decoded.userId || decoded.id || null;
|
|
111
154
|
} catch (error) {
|
|
112
155
|
return null;
|
|
@@ -117,7 +160,7 @@ export class OxyServices {
|
|
|
117
160
|
* Check if the client has a valid access token
|
|
118
161
|
*/
|
|
119
162
|
private hasAccessToken(): boolean {
|
|
120
|
-
return
|
|
163
|
+
return this.tokenStore.hasAccessToken();
|
|
121
164
|
}
|
|
122
165
|
|
|
123
166
|
/**
|