@aifabrix/miso-client 1.0.1 → 1.0.3
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 +393 -82
- package/dist/examples/env-config-example.d.ts +2 -0
- package/dist/examples/env-config-example.d.ts.map +1 -0
- package/dist/examples/env-config-example.js +31 -0
- package/dist/examples/env-config-example.js.map +1 -0
- package/dist/examples/manual-config-example.d.ts +2 -0
- package/dist/examples/manual-config-example.d.ts.map +1 -0
- package/dist/examples/manual-config-example.js +34 -0
- package/dist/examples/manual-config-example.js.map +1 -0
- package/dist/examples/step-3-authentication.d.ts +8 -0
- package/dist/examples/step-3-authentication.d.ts.map +1 -0
- package/dist/examples/step-3-authentication.js +41 -0
- package/dist/examples/step-3-authentication.js.map +1 -0
- package/dist/examples/step-4-rbac.d.ts +8 -0
- package/dist/examples/step-4-rbac.d.ts.map +1 -0
- package/dist/examples/step-4-rbac.js +46 -0
- package/dist/examples/step-4-rbac.js.map +1 -0
- package/dist/examples/step-5-logging.d.ts +8 -0
- package/dist/examples/step-5-logging.d.ts.map +1 -0
- package/dist/examples/step-5-logging.js +57 -0
- package/dist/examples/step-5-logging.js.map +1 -0
- package/dist/examples/step-6-audit.d.ts +8 -0
- package/dist/examples/step-6-audit.d.ts.map +1 -0
- package/dist/examples/step-6-audit.js +83 -0
- package/dist/examples/step-6-audit.js.map +1 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +37 -6
- package/dist/src/index.js.map +1 -1
- package/dist/src/services/auth.service.d.ts +12 -2
- package/dist/src/services/auth.service.d.ts.map +1 -1
- package/dist/src/services/auth.service.js +84 -17
- package/dist/src/services/auth.service.js.map +1 -1
- package/dist/src/services/logger.service.d.ts +2 -2
- package/dist/src/services/logger.service.d.ts.map +1 -1
- package/dist/src/services/logger.service.js +18 -15
- package/dist/src/services/logger.service.js.map +1 -1
- package/dist/src/services/permission.service.d.ts +7 -2
- package/dist/src/services/permission.service.d.ts.map +1 -1
- package/dist/src/services/permission.service.js +49 -23
- package/dist/src/services/permission.service.js.map +1 -1
- package/dist/src/services/role.service.d.ts +7 -2
- package/dist/src/services/role.service.d.ts.map +1 -1
- package/dist/src/services/role.service.js +47 -21
- package/dist/src/services/role.service.js.map +1 -1
- package/dist/src/types/config.types.d.ts +8 -4
- package/dist/src/types/config.types.d.ts.map +1 -1
- package/dist/src/utils/config-loader.d.ts.map +1 -1
- package/dist/src/utils/config-loader.js +11 -6
- package/dist/src/utils/config-loader.js.map +1 -1
- package/dist/src/utils/http-client.d.ts +16 -2
- package/dist/src/utils/http-client.d.ts.map +1 -1
- package/dist/src/utils/http-client.js +90 -9
- package/dist/src/utils/http-client.js.map +1 -1
- package/package.json +2 -1
|
@@ -10,21 +10,25 @@ exports.HttpClient = void 0;
|
|
|
10
10
|
const axios_1 = __importDefault(require("axios"));
|
|
11
11
|
class HttpClient {
|
|
12
12
|
constructor(config) {
|
|
13
|
+
this.clientToken = null;
|
|
14
|
+
this.tokenExpiresAt = null;
|
|
15
|
+
this.tokenRefreshPromise = null;
|
|
13
16
|
this.config = config;
|
|
14
17
|
this.axios = axios_1.default.create({
|
|
15
18
|
baseURL: config.controllerUrl,
|
|
16
19
|
timeout: 30000,
|
|
17
20
|
headers: {
|
|
18
|
-
'Content-Type': 'application/json'
|
|
19
|
-
'X-Environment': config.environment,
|
|
20
|
-
'X-Application': config.applicationKey
|
|
21
|
+
'Content-Type': 'application/json'
|
|
21
22
|
}
|
|
22
23
|
});
|
|
23
|
-
//
|
|
24
|
-
this.axios.interceptors.request.use((config) => {
|
|
24
|
+
// Interceptor adds client token (or fetches it if needed)
|
|
25
|
+
this.axios.interceptors.request.use(async (config) => {
|
|
25
26
|
config.headers = config.headers || {};
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
// Get client token (fetch if needed)
|
|
28
|
+
const token = await this.getClientToken();
|
|
29
|
+
if (token) {
|
|
30
|
+
config.headers['x-client-token'] = token;
|
|
31
|
+
}
|
|
28
32
|
return config;
|
|
29
33
|
}, (error) => Promise.reject(error));
|
|
30
34
|
// Add response interceptor for error handling
|
|
@@ -32,10 +36,66 @@ class HttpClient {
|
|
|
32
36
|
if (error.response?.status === 401) {
|
|
33
37
|
// Enhance error with authentication context
|
|
34
38
|
error.message = 'Authentication failed - token may be invalid';
|
|
39
|
+
// Clear token on 401 to force refresh
|
|
40
|
+
this.clientToken = null;
|
|
41
|
+
this.tokenExpiresAt = null;
|
|
35
42
|
}
|
|
36
43
|
return Promise.reject(error);
|
|
37
44
|
});
|
|
38
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Get client token, fetching if needed
|
|
48
|
+
* Proactively refreshes if token will expire within 60 seconds
|
|
49
|
+
*/
|
|
50
|
+
async getClientToken() {
|
|
51
|
+
const now = new Date();
|
|
52
|
+
// If token exists and not expired (with 60s buffer for proactive refresh), return it
|
|
53
|
+
if (this.clientToken && this.tokenExpiresAt && this.tokenExpiresAt > new Date(now.getTime() + 60000)) {
|
|
54
|
+
return this.clientToken;
|
|
55
|
+
}
|
|
56
|
+
// If refresh is already in progress, wait for it
|
|
57
|
+
if (this.tokenRefreshPromise) {
|
|
58
|
+
return this.tokenRefreshPromise;
|
|
59
|
+
}
|
|
60
|
+
// Fetch new token (either expired or about to expire soon)
|
|
61
|
+
this.tokenRefreshPromise = this.fetchClientToken();
|
|
62
|
+
try {
|
|
63
|
+
const token = await this.tokenRefreshPromise;
|
|
64
|
+
return token;
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
this.tokenRefreshPromise = null;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Fetch client token from controller
|
|
72
|
+
*/
|
|
73
|
+
async fetchClientToken() {
|
|
74
|
+
try {
|
|
75
|
+
// Create a temporary axios instance without interceptors to avoid recursion
|
|
76
|
+
const tempAxios = axios_1.default.create({
|
|
77
|
+
baseURL: this.config.controllerUrl,
|
|
78
|
+
timeout: 30000,
|
|
79
|
+
headers: {
|
|
80
|
+
'Content-Type': 'application/json',
|
|
81
|
+
'X-Client-Id': this.config.clientId,
|
|
82
|
+
'X-Client-Secret': this.config.clientSecret
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
const response = await tempAxios.post('/api/auth/token');
|
|
86
|
+
if (response.data.success && response.data.token) {
|
|
87
|
+
this.clientToken = response.data.token;
|
|
88
|
+
// Set expiration with 30 second buffer before actual expiration
|
|
89
|
+
const expiresIn = response.data.expiresIn - 30;
|
|
90
|
+
this.tokenExpiresAt = new Date(Date.now() + expiresIn * 1000);
|
|
91
|
+
return this.clientToken;
|
|
92
|
+
}
|
|
93
|
+
throw new Error('Failed to get client token: Invalid response');
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
throw new Error('Failed to get client token: ' + (error instanceof Error ? error.message : 'Unknown error'));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
39
99
|
async get(url, config) {
|
|
40
100
|
const response = await this.axios.get(url, config);
|
|
41
101
|
return response.data;
|
|
@@ -52,12 +112,33 @@ class HttpClient {
|
|
|
52
112
|
const response = await this.axios.delete(url, config);
|
|
53
113
|
return response.data;
|
|
54
114
|
}
|
|
55
|
-
//
|
|
56
|
-
async
|
|
115
|
+
// Generic method for all requests (uses client credentials)
|
|
116
|
+
async request(method, url, data, config) {
|
|
117
|
+
switch (method) {
|
|
118
|
+
case 'GET':
|
|
119
|
+
return this.get(url, config);
|
|
120
|
+
case 'POST':
|
|
121
|
+
return this.post(url, data, config);
|
|
122
|
+
case 'PUT':
|
|
123
|
+
return this.put(url, data, config);
|
|
124
|
+
case 'DELETE':
|
|
125
|
+
return this.delete(url, config);
|
|
126
|
+
default:
|
|
127
|
+
throw new Error(`Unsupported HTTP method: ${method}`);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// For requests that need Bearer token (user auth)
|
|
131
|
+
// IMPORTANT: Client token is sent as x-client-token header (via interceptor)
|
|
132
|
+
// User token is sent as Authorization: Bearer header (this method parameter)
|
|
133
|
+
// These are two separate tokens for different purposes
|
|
134
|
+
async authenticatedRequest(method, url, token, // User authentication token (sent as Bearer token)
|
|
135
|
+
data, config) {
|
|
57
136
|
const requestConfig = {
|
|
58
137
|
...config,
|
|
59
138
|
headers: {
|
|
60
139
|
...config?.headers,
|
|
140
|
+
// Add Bearer token for user authentication
|
|
141
|
+
// x-client-token is automatically added by interceptor (not a Bearer token)
|
|
61
142
|
Authorization: `Bearer ${token}`
|
|
62
143
|
}
|
|
63
144
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../../src/utils/http-client.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;AAEH,kDAMe;AAGf,MAAa,UAAU;
|
|
1
|
+
{"version":3,"file":"http-client.js","sourceRoot":"","sources":["../../../src/utils/http-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aifabrix/miso-client",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "AI Fabrix Client SDK for authentication, authorization, and logging",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"test": "jest",
|
|
10
10
|
"test:watch": "jest --watch",
|
|
11
11
|
"test:coverage": "jest --coverage",
|
|
12
|
+
"test:no-coverage": "jest --no-coverage",
|
|
12
13
|
"lint": "eslint src/**/*.ts",
|
|
13
14
|
"lint:fix": "eslint src/**/*.ts --fix",
|
|
14
15
|
"prepublishOnly": "npm run build"
|