@aifabrix/miso-client 3.1.1 → 3.2.0
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 +1 -1
- package/dist/express/client-token-endpoint.d.ts +76 -0
- package/dist/express/client-token-endpoint.d.ts.map +1 -0
- package/dist/express/client-token-endpoint.js +108 -0
- package/dist/express/client-token-endpoint.js.map +1 -0
- package/dist/express/index.d.ts +2 -1
- package/dist/express/index.d.ts.map +1 -1
- package/dist/express/index.js +8 -3
- package/dist/express/index.js.map +1 -1
- package/dist/express/response-middleware.d.ts.map +1 -1
- package/dist/express/response-middleware.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -1
- package/dist/index.js.map +1 -1
- package/dist/services/auth.service.js +5 -5
- package/dist/services/auth.service.js.map +1 -1
- package/dist/services/browser-permission.service.d.ts +60 -0
- package/dist/services/browser-permission.service.d.ts.map +1 -0
- package/dist/services/browser-permission.service.js +159 -0
- package/dist/services/browser-permission.service.js.map +1 -0
- package/dist/services/browser-role.service.d.ts +60 -0
- package/dist/services/browser-role.service.d.ts.map +1 -0
- package/dist/services/browser-role.service.js +159 -0
- package/dist/services/browser-role.service.js.map +1 -0
- package/dist/services/cache.service.d.ts.map +1 -1
- package/dist/services/cache.service.js +4 -0
- package/dist/services/cache.service.js.map +1 -1
- package/dist/services/logger.service.d.ts +4 -0
- package/dist/services/logger.service.d.ts.map +1 -1
- package/dist/services/logger.service.js +21 -0
- package/dist/services/logger.service.js.map +1 -1
- package/dist/types/data-client.types.d.ts +1 -0
- package/dist/types/data-client.types.d.ts.map +1 -1
- package/dist/types/data-client.types.js.map +1 -1
- package/dist/utils/audit-log-queue.d.ts +4 -0
- package/dist/utils/audit-log-queue.d.ts.map +1 -1
- package/dist/utils/audit-log-queue.js +22 -2
- package/dist/utils/audit-log-queue.js.map +1 -1
- package/dist/utils/auth-strategy.js +2 -2
- package/dist/utils/browser-jwt-decoder.d.ts +20 -0
- package/dist/utils/browser-jwt-decoder.d.ts.map +1 -0
- package/dist/utils/browser-jwt-decoder.js +75 -0
- package/dist/utils/browser-jwt-decoder.js.map +1 -0
- package/dist/utils/controller-url-resolver.d.ts +16 -0
- package/dist/utils/controller-url-resolver.d.ts.map +1 -1
- package/dist/utils/controller-url-resolver.js +12 -0
- package/dist/utils/controller-url-resolver.js.map +1 -1
- package/dist/utils/data-client-audit.d.ts +24 -0
- package/dist/utils/data-client-audit.d.ts.map +1 -0
- package/dist/utils/data-client-audit.js +138 -0
- package/dist/utils/data-client-audit.js.map +1 -0
- package/dist/utils/data-client-auth.d.ts +59 -0
- package/dist/utils/data-client-auth.d.ts.map +1 -0
- package/dist/utils/data-client-auth.js +427 -0
- package/dist/utils/data-client-auth.js.map +1 -0
- package/dist/utils/data-client-auto-init.d.ts +66 -0
- package/dist/utils/data-client-auto-init.d.ts.map +1 -0
- package/dist/utils/data-client-auto-init.js +215 -0
- package/dist/utils/data-client-auto-init.js.map +1 -0
- package/dist/utils/data-client-cache.d.ts +36 -0
- package/dist/utils/data-client-cache.d.ts.map +1 -0
- package/dist/utils/data-client-cache.js +55 -0
- package/dist/utils/data-client-cache.js.map +1 -0
- package/dist/utils/data-client-redirect.d.ts +22 -0
- package/dist/utils/data-client-redirect.d.ts.map +1 -0
- package/dist/utils/data-client-redirect.js +345 -0
- package/dist/utils/data-client-redirect.js.map +1 -0
- package/dist/utils/data-client-request.d.ts +32 -0
- package/dist/utils/data-client-request.d.ts.map +1 -0
- package/dist/utils/data-client-request.js +309 -0
- package/dist/utils/data-client-request.js.map +1 -0
- package/dist/utils/data-client-utils.d.ts +49 -0
- package/dist/utils/data-client-utils.d.ts.map +1 -0
- package/dist/utils/data-client-utils.js +139 -0
- package/dist/utils/data-client-utils.js.map +1 -0
- package/dist/utils/data-client.d.ts +103 -29
- package/dist/utils/data-client.d.ts.map +1 -1
- package/dist/utils/data-client.js +321 -774
- package/dist/utils/data-client.js.map +1 -1
- package/dist/utils/internal-http-client.d.ts.map +1 -1
- package/dist/utils/internal-http-client.js +7 -3
- package/dist/utils/internal-http-client.js.map +1 -1
- package/package.json +9 -2
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DataClient authentication utilities
|
|
4
|
+
* Handles authentication, token management, and login/logout flows
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.redirectToLogin = void 0;
|
|
11
|
+
exports.getToken = getToken;
|
|
12
|
+
exports.hasClientToken = hasClientToken;
|
|
13
|
+
exports.hasAnyToken = hasAnyToken;
|
|
14
|
+
exports.getClientToken = getClientToken;
|
|
15
|
+
exports.getControllerUrl = getControllerUrl;
|
|
16
|
+
exports.logout = logout;
|
|
17
|
+
exports.getEnvironmentToken = getEnvironmentToken;
|
|
18
|
+
exports.getClientTokenInfo = getClientTokenInfo;
|
|
19
|
+
const data_client_utils_1 = require("./data-client-utils");
|
|
20
|
+
const token_utils_1 = require("./token-utils");
|
|
21
|
+
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
22
|
+
const data_client_audit_1 = require("./data-client-audit");
|
|
23
|
+
const data_client_redirect_1 = require("./data-client-redirect");
|
|
24
|
+
/**
|
|
25
|
+
* Get authentication token from localStorage
|
|
26
|
+
*/
|
|
27
|
+
function getToken(tokenKeys) {
|
|
28
|
+
if (!(0, data_client_utils_1.isBrowser)())
|
|
29
|
+
return null;
|
|
30
|
+
const keys = tokenKeys || ["token", "accessToken", "authToken"];
|
|
31
|
+
for (const key of keys) {
|
|
32
|
+
const token = (0, data_client_utils_1.getLocalStorage)(key);
|
|
33
|
+
if (token)
|
|
34
|
+
return token;
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Check if client token is available (from localStorage cache or config)
|
|
40
|
+
*/
|
|
41
|
+
function hasClientToken(misoClient, misoConfig) {
|
|
42
|
+
if (!(0, data_client_utils_1.isBrowser)()) {
|
|
43
|
+
// Server-side: check if misoClient config has clientSecret
|
|
44
|
+
if (misoClient && misoConfig?.clientSecret) {
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
// Browser-side: check localStorage cache
|
|
50
|
+
const cachedToken = (0, data_client_utils_1.getLocalStorage)("miso:client-token");
|
|
51
|
+
if (cachedToken) {
|
|
52
|
+
const expiresAtStr = (0, data_client_utils_1.getLocalStorage)("miso:client-token-expires-at");
|
|
53
|
+
if (expiresAtStr) {
|
|
54
|
+
const expiresAt = parseInt(expiresAtStr, 10);
|
|
55
|
+
if (expiresAt > Date.now()) {
|
|
56
|
+
return true; // Valid cached token
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Check config token
|
|
61
|
+
if (misoConfig?.clientToken) {
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
// Check if misoClient config has onClientTokenRefresh callback (browser pattern)
|
|
65
|
+
if (misoConfig?.onClientTokenRefresh) {
|
|
66
|
+
return true; // Has means to get client token
|
|
67
|
+
}
|
|
68
|
+
// Check if misoClient config has clientSecret (server-side fallback)
|
|
69
|
+
if (misoConfig?.clientSecret) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Check if any authentication token is available (user token OR client token)
|
|
76
|
+
*/
|
|
77
|
+
function hasAnyToken(tokenKeys, misoClient, misoConfig) {
|
|
78
|
+
return getToken(tokenKeys) !== null || hasClientToken(misoClient || null, misoConfig);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get client token for requests
|
|
82
|
+
* Checks localStorage cache first, then config, then calls getEnvironmentToken() if needed
|
|
83
|
+
* @returns Client token string or null if unavailable
|
|
84
|
+
*/
|
|
85
|
+
async function getClientToken(misoConfig, _baseUrl, _getEnvironmentToken) {
|
|
86
|
+
if (!(0, data_client_utils_1.isBrowser)()) {
|
|
87
|
+
// Server-side: return null (client token handled by MisoClient)
|
|
88
|
+
console.log("[getClientToken] Not in browser environment");
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
// Check localStorage cache first
|
|
92
|
+
const cachedToken = (0, data_client_utils_1.getLocalStorage)("miso:client-token");
|
|
93
|
+
const expiresAtStr = (0, data_client_utils_1.getLocalStorage)("miso:client-token-expires-at");
|
|
94
|
+
console.log("[getClientToken] Checking localStorage:", {
|
|
95
|
+
hasToken: !!cachedToken,
|
|
96
|
+
hasExpiresAt: !!expiresAtStr,
|
|
97
|
+
expiresAt: expiresAtStr,
|
|
98
|
+
currentTime: Date.now(),
|
|
99
|
+
});
|
|
100
|
+
if (cachedToken) {
|
|
101
|
+
// If we have expiration timestamp, check it
|
|
102
|
+
if (expiresAtStr) {
|
|
103
|
+
const expiresAt = parseInt(expiresAtStr, 10);
|
|
104
|
+
const now = Date.now();
|
|
105
|
+
const timeUntilExpiry = expiresAt - now;
|
|
106
|
+
const timeUntilExpirySeconds = Math.floor(timeUntilExpiry / 1000);
|
|
107
|
+
console.log("[getClientToken] Token expiration check:", {
|
|
108
|
+
expiresAt,
|
|
109
|
+
expiresAtISO: new Date(expiresAt).toISOString(),
|
|
110
|
+
now,
|
|
111
|
+
nowISO: new Date(now).toISOString(),
|
|
112
|
+
timeUntilExpiry,
|
|
113
|
+
timeUntilExpirySeconds,
|
|
114
|
+
isValid: expiresAt > now,
|
|
115
|
+
expired: expiresAt <= now,
|
|
116
|
+
isNaN: isNaN(expiresAt),
|
|
117
|
+
});
|
|
118
|
+
if (isNaN(expiresAt)) {
|
|
119
|
+
console.warn("[getClientToken] Invalid expiration timestamp format, assuming token is valid");
|
|
120
|
+
return cachedToken;
|
|
121
|
+
}
|
|
122
|
+
else if (expiresAt > now) {
|
|
123
|
+
console.log("[getClientToken] Returning valid cached token (checked expiration)");
|
|
124
|
+
return cachedToken; // Valid cached token
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
console.warn("[getClientToken] Cached token expired, removing from cache");
|
|
128
|
+
(0, data_client_utils_1.removeLocalStorage)("miso:client-token");
|
|
129
|
+
(0, data_client_utils_1.removeLocalStorage)("miso:client-token-expires-at");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// No expiration timestamp - try to decode JWT to check expiration
|
|
134
|
+
try {
|
|
135
|
+
// Decode JWT to check exp claim
|
|
136
|
+
const decoded = jsonwebtoken_1.default.decode(cachedToken);
|
|
137
|
+
if (decoded && decoded.exp) {
|
|
138
|
+
const now = Date.now();
|
|
139
|
+
const jwtExpiresAt = decoded.exp * 1000; // Convert to milliseconds
|
|
140
|
+
const jwtTimeUntilExpiry = jwtExpiresAt - now;
|
|
141
|
+
console.log("[getClientToken] Token expiration from JWT:", {
|
|
142
|
+
jwtExpiresAt,
|
|
143
|
+
jwtExpiresAtISO: new Date(jwtExpiresAt).toISOString(),
|
|
144
|
+
now,
|
|
145
|
+
nowISO: new Date(now).toISOString(),
|
|
146
|
+
jwtTimeUntilExpiry,
|
|
147
|
+
jwtTimeUntilExpirySeconds: Math.floor(jwtTimeUntilExpiry / 1000),
|
|
148
|
+
jwtIsValid: jwtExpiresAt > now,
|
|
149
|
+
});
|
|
150
|
+
if (jwtExpiresAt > now) {
|
|
151
|
+
console.log("[getClientToken] Returning valid cached token (checked JWT expiration)");
|
|
152
|
+
return cachedToken;
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
console.warn("[getClientToken] Token expired (from JWT), removing from cache");
|
|
156
|
+
(0, data_client_utils_1.removeLocalStorage)("miso:client-token");
|
|
157
|
+
(0, data_client_utils_1.removeLocalStorage)("miso:client-token-expires-at");
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
// Can't determine expiration - assume token is valid if it exists
|
|
162
|
+
console.log("[getClientToken] No expiration info available, assuming token is valid");
|
|
163
|
+
return cachedToken;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
// Failed to decode token - assume it's valid if it exists
|
|
168
|
+
console.warn("[getClientToken] Failed to decode token, assuming valid:", error);
|
|
169
|
+
return cachedToken;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// Check config token
|
|
174
|
+
if (misoConfig?.clientToken) {
|
|
175
|
+
console.log("[getClientToken] Returning token from config");
|
|
176
|
+
return misoConfig.clientToken;
|
|
177
|
+
}
|
|
178
|
+
// Don't fetch client token if we don't have a cached token
|
|
179
|
+
// This prevents unnecessary fetch calls during auth error handling
|
|
180
|
+
// redirectToLogin can work without a client token (it's optional)
|
|
181
|
+
console.warn("[getClientToken] No token available, returning null");
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Build controller URL from configuration
|
|
186
|
+
* Uses controllerPublicUrl (browser) or controllerUrl (fallback)
|
|
187
|
+
* @returns Controller base URL or null if not configured
|
|
188
|
+
*/
|
|
189
|
+
function getControllerUrl(misoConfig) {
|
|
190
|
+
if (!misoConfig) {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
// Browser: prefer controllerPublicUrl, fallback to controllerUrl
|
|
194
|
+
if ((0, data_client_utils_1.isBrowser)()) {
|
|
195
|
+
return misoConfig.controllerPublicUrl ||
|
|
196
|
+
misoConfig.controllerUrl ||
|
|
197
|
+
null;
|
|
198
|
+
}
|
|
199
|
+
// Server: prefer controllerPrivateUrl, fallback to controllerUrl
|
|
200
|
+
return misoConfig.controllerPrivateUrl ||
|
|
201
|
+
misoConfig.controllerUrl ||
|
|
202
|
+
null;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Redirect to login page via controller
|
|
206
|
+
* Re-exported from data-client-redirect for backward compatibility
|
|
207
|
+
*/
|
|
208
|
+
var data_client_redirect_2 = require("./data-client-redirect");
|
|
209
|
+
Object.defineProperty(exports, "redirectToLogin", { enumerable: true, get: function () { return data_client_redirect_2.redirectToLogin; } });
|
|
210
|
+
/**
|
|
211
|
+
* Logout user and redirect
|
|
212
|
+
* Calls logout API with x-client-token header, clears tokens from localStorage, clears cache, and redirects
|
|
213
|
+
* @param redirectUrl - Optional redirect URL after logout (defaults to logoutUrl or loginUrl)
|
|
214
|
+
*/
|
|
215
|
+
async function logout(config, getTokenFn, getClientTokenFn, clearCacheFn, redirectUrl) {
|
|
216
|
+
if (!(0, data_client_utils_1.isBrowser)())
|
|
217
|
+
return;
|
|
218
|
+
const token = getTokenFn();
|
|
219
|
+
// Build controller URL
|
|
220
|
+
const controllerUrl = getControllerUrl(config.misoConfig);
|
|
221
|
+
// Call logout API if controller URL available and token exists
|
|
222
|
+
if (controllerUrl && token) {
|
|
223
|
+
try {
|
|
224
|
+
// Get client token
|
|
225
|
+
const clientToken = await getClientTokenFn();
|
|
226
|
+
// Build logout endpoint URL
|
|
227
|
+
const logoutEndpoint = `${controllerUrl}/api/v1/auth/logout`;
|
|
228
|
+
// Build headers
|
|
229
|
+
const headers = {
|
|
230
|
+
"Content-Type": "application/json",
|
|
231
|
+
};
|
|
232
|
+
// Add x-client-token header if available
|
|
233
|
+
if (clientToken) {
|
|
234
|
+
headers["x-client-token"] = clientToken;
|
|
235
|
+
}
|
|
236
|
+
// Make fetch request
|
|
237
|
+
const response = await fetch(logoutEndpoint, {
|
|
238
|
+
method: "POST",
|
|
239
|
+
headers,
|
|
240
|
+
body: JSON.stringify({ token }),
|
|
241
|
+
credentials: "include", // Include cookies for CORS
|
|
242
|
+
});
|
|
243
|
+
if (!response.ok) {
|
|
244
|
+
// Log error but continue with cleanup (logout should always clear local state)
|
|
245
|
+
const errorText = await response.text().catch(() => "Unknown error");
|
|
246
|
+
console.error(`Logout API call failed: ${response.status} ${response.statusText}. ${errorText}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
// Log error but continue with cleanup (logout should always clear local state)
|
|
251
|
+
console.error("Logout API call failed:", error);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Clear tokens from localStorage (always, even if API call failed)
|
|
255
|
+
const keys = config.tokenKeys || ["token", "accessToken", "authToken"];
|
|
256
|
+
keys.forEach(key => {
|
|
257
|
+
try {
|
|
258
|
+
const storage = globalThis.localStorage;
|
|
259
|
+
if (storage) {
|
|
260
|
+
storage.removeItem(key);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
catch (e) {
|
|
264
|
+
// Ignore localStorage errors (SSR, private browsing, etc.)
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
// Clear HTTP cache
|
|
268
|
+
clearCacheFn();
|
|
269
|
+
// Determine redirect URL: redirectUrl param > logoutUrl config > loginUrl config > '/login'
|
|
270
|
+
const finalRedirectUrl = redirectUrl ||
|
|
271
|
+
config.logoutUrl ||
|
|
272
|
+
config.loginUrl ||
|
|
273
|
+
"/login";
|
|
274
|
+
// Construct full URL (if relative, make absolute)
|
|
275
|
+
let fullUrl;
|
|
276
|
+
if (/^https?:\/\//i.test(finalRedirectUrl)) {
|
|
277
|
+
fullUrl = finalRedirectUrl;
|
|
278
|
+
}
|
|
279
|
+
else {
|
|
280
|
+
const origin = globalThis.window.location.origin;
|
|
281
|
+
fullUrl = `${origin}${finalRedirectUrl.startsWith("/") ? finalRedirectUrl : `/${finalRedirectUrl}`}`;
|
|
282
|
+
}
|
|
283
|
+
// Validate URL before redirecting
|
|
284
|
+
const validatedUrl = (0, data_client_redirect_1.getValidatedRedirectUrl)(fullUrl);
|
|
285
|
+
if (!validatedUrl) {
|
|
286
|
+
console.error("[logout] Invalid redirect URL, cannot redirect:", fullUrl);
|
|
287
|
+
// Fallback to current origin/login if validation fails
|
|
288
|
+
const origin = globalThis.window.location.origin;
|
|
289
|
+
const fallbackUrl = `${origin}/login`;
|
|
290
|
+
console.warn("[logout] Using fallback redirect URL:", fallbackUrl);
|
|
291
|
+
globalThis.window.location.href = fallbackUrl;
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
// Redirect to validated URL
|
|
295
|
+
console.log("[logout] Redirecting to validated URL:", validatedUrl);
|
|
296
|
+
try {
|
|
297
|
+
globalThis.window.location.href = validatedUrl;
|
|
298
|
+
}
|
|
299
|
+
catch (redirectError) {
|
|
300
|
+
console.error("[logout] Failed to redirect:", redirectError);
|
|
301
|
+
// Fallback to current origin/login if redirect fails
|
|
302
|
+
const origin = globalThis.window.location.origin;
|
|
303
|
+
const fallbackUrl = `${origin}/login`;
|
|
304
|
+
globalThis.window.location.href = fallbackUrl;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Get environment token (browser-side)
|
|
309
|
+
* Checks localStorage cache first, then calls backend endpoint if needed
|
|
310
|
+
* Uses clientTokenUri from config or defaults to /api/v1/auth/client-token
|
|
311
|
+
*
|
|
312
|
+
* @returns Client token string
|
|
313
|
+
* @throws Error if token fetch fails
|
|
314
|
+
*/
|
|
315
|
+
async function getEnvironmentToken(config, misoClient) {
|
|
316
|
+
if (!(0, data_client_utils_1.isBrowser)()) {
|
|
317
|
+
throw new Error("getEnvironmentToken() is only available in browser environment");
|
|
318
|
+
}
|
|
319
|
+
const cacheKey = "miso:client-token";
|
|
320
|
+
const expiresAtKey = "miso:client-token-expires-at";
|
|
321
|
+
// Check cache first
|
|
322
|
+
const cachedToken = (0, data_client_utils_1.getLocalStorage)(cacheKey);
|
|
323
|
+
const expiresAtStr = (0, data_client_utils_1.getLocalStorage)(expiresAtKey);
|
|
324
|
+
if (cachedToken && expiresAtStr) {
|
|
325
|
+
const expiresAt = parseInt(expiresAtStr, 10);
|
|
326
|
+
const now = Date.now();
|
|
327
|
+
// If token is still valid, return cached token
|
|
328
|
+
if (expiresAt > now) {
|
|
329
|
+
return cachedToken;
|
|
330
|
+
}
|
|
331
|
+
// Token expired, remove from cache
|
|
332
|
+
(0, data_client_utils_1.removeLocalStorage)(cacheKey);
|
|
333
|
+
(0, data_client_utils_1.removeLocalStorage)(expiresAtKey);
|
|
334
|
+
}
|
|
335
|
+
// Cache miss or expired - fetch from backend
|
|
336
|
+
const clientTokenUri = config.misoConfig?.clientTokenUri || "/api/v1/auth/client-token";
|
|
337
|
+
// Build full URL
|
|
338
|
+
const fullUrl = /^https?:\/\//i.test(clientTokenUri)
|
|
339
|
+
? clientTokenUri
|
|
340
|
+
: `${config.baseUrl}${clientTokenUri}`;
|
|
341
|
+
try {
|
|
342
|
+
// Make request to backend endpoint
|
|
343
|
+
const response = await fetch(fullUrl, {
|
|
344
|
+
method: "POST",
|
|
345
|
+
headers: {
|
|
346
|
+
"Content-Type": "application/json",
|
|
347
|
+
},
|
|
348
|
+
credentials: "include", // Include cookies for CORS
|
|
349
|
+
});
|
|
350
|
+
if (!response.ok) {
|
|
351
|
+
const errorText = await response.text();
|
|
352
|
+
throw new Error(`Failed to get environment token: ${response.status} ${response.statusText}. ${errorText}`);
|
|
353
|
+
}
|
|
354
|
+
const data = (await response.json());
|
|
355
|
+
// Extract token from response (support both nested and flat formats)
|
|
356
|
+
const token = data.data?.token || data.token || data.accessToken || data.access_token;
|
|
357
|
+
if (!token || typeof token !== "string") {
|
|
358
|
+
throw new Error("Invalid response format: token not found in response");
|
|
359
|
+
}
|
|
360
|
+
// Calculate expiration time (default to 1 hour if not provided)
|
|
361
|
+
const expiresIn = data.data?.expiresIn || data.expiresIn || data.expires_in || 3600;
|
|
362
|
+
const expiresAt = Date.now() + expiresIn * 1000;
|
|
363
|
+
// Cache token
|
|
364
|
+
(0, data_client_utils_1.setLocalStorage)(cacheKey, token);
|
|
365
|
+
(0, data_client_utils_1.setLocalStorage)(expiresAtKey, expiresAt.toString());
|
|
366
|
+
// Log audit event if misoClient available
|
|
367
|
+
if (misoClient && !(0, data_client_audit_1.shouldSkipAudit)(clientTokenUri, config.audit)) {
|
|
368
|
+
try {
|
|
369
|
+
await misoClient.log.audit("client.token.request.success", clientTokenUri, {
|
|
370
|
+
method: "POST",
|
|
371
|
+
url: clientTokenUri,
|
|
372
|
+
statusCode: response.status,
|
|
373
|
+
cached: false,
|
|
374
|
+
}, {});
|
|
375
|
+
}
|
|
376
|
+
catch (auditError) {
|
|
377
|
+
// Silently fail audit logging to avoid breaking requests
|
|
378
|
+
console.warn("Failed to log audit event:", auditError);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
return token;
|
|
382
|
+
}
|
|
383
|
+
catch (error) {
|
|
384
|
+
// Log audit event for error if misoClient available
|
|
385
|
+
if (misoClient && !(0, data_client_audit_1.shouldSkipAudit)(clientTokenUri, config.audit)) {
|
|
386
|
+
try {
|
|
387
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
388
|
+
await misoClient.log.audit("client.token.request.failed", clientTokenUri, {
|
|
389
|
+
method: "POST",
|
|
390
|
+
url: clientTokenUri,
|
|
391
|
+
statusCode: 0,
|
|
392
|
+
error: errorMessage,
|
|
393
|
+
cached: false,
|
|
394
|
+
}, {});
|
|
395
|
+
}
|
|
396
|
+
catch (auditError) {
|
|
397
|
+
// Silently fail audit logging to avoid breaking requests
|
|
398
|
+
console.warn("Failed to log audit event:", auditError);
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
throw error;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Get client token information (browser-side)
|
|
406
|
+
* Extracts application and environment info from client token
|
|
407
|
+
*
|
|
408
|
+
* @returns Client token info or null if token not available
|
|
409
|
+
*/
|
|
410
|
+
function getClientTokenInfo(misoConfig) {
|
|
411
|
+
if (!(0, data_client_utils_1.isBrowser)()) {
|
|
412
|
+
return null;
|
|
413
|
+
}
|
|
414
|
+
// Try to get token from cache first
|
|
415
|
+
const cachedToken = (0, data_client_utils_1.getLocalStorage)("miso:client-token");
|
|
416
|
+
if (cachedToken) {
|
|
417
|
+
return (0, token_utils_1.extractClientTokenInfo)(cachedToken);
|
|
418
|
+
}
|
|
419
|
+
// Try to get token from config (if provided)
|
|
420
|
+
const configToken = misoConfig?.clientToken;
|
|
421
|
+
if (configToken) {
|
|
422
|
+
return (0, token_utils_1.extractClientTokenInfo)(configToken);
|
|
423
|
+
}
|
|
424
|
+
// No token available
|
|
425
|
+
return null;
|
|
426
|
+
}
|
|
427
|
+
//# sourceMappingURL=data-client-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-client-auth.js","sourceRoot":"","sources":["../../src/utils/data-client-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DataClient Auto-Initialization Helper
|
|
3
|
+
* Automatically fetches configuration from server and initializes DataClient
|
|
4
|
+
*
|
|
5
|
+
* Provides zero-config client-side setup for DataClient initialization
|
|
6
|
+
*/
|
|
7
|
+
import { DataClient } from "./data-client";
|
|
8
|
+
import { DataClientConfigResponse } from "../express/client-token-endpoint";
|
|
9
|
+
/**
|
|
10
|
+
* Options for autoInitializeDataClient
|
|
11
|
+
*/
|
|
12
|
+
export interface AutoInitOptions {
|
|
13
|
+
/** Client token endpoint URI (default: '/api/v1/auth/client-token') */
|
|
14
|
+
clientTokenUri?: string;
|
|
15
|
+
/** Override baseUrl detection (auto-detected from window.location if not provided) */
|
|
16
|
+
baseUrl?: string;
|
|
17
|
+
/** Error callback */
|
|
18
|
+
onError?: (error: Error) => void;
|
|
19
|
+
/** Whether to cache config in localStorage (default: true) */
|
|
20
|
+
cacheConfig?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get cached DataClient configuration from localStorage
|
|
24
|
+
*
|
|
25
|
+
* Returns the cached configuration that was stored by autoInitializeDataClient.
|
|
26
|
+
* Useful for reading configuration without re-initializing DataClient.
|
|
27
|
+
*
|
|
28
|
+
* @returns Cached config or null if not found or expired
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* import { getCachedDataClientConfig } from '@aifabrix/miso-client';
|
|
33
|
+
*
|
|
34
|
+
* const cachedConfig = getCachedDataClientConfig();
|
|
35
|
+
* if (cachedConfig) {
|
|
36
|
+
* console.log('Base URL:', cachedConfig.baseUrl);
|
|
37
|
+
* console.log('Controller URL:', cachedConfig.controllerUrl);
|
|
38
|
+
* console.log('Client ID:', cachedConfig.clientId);
|
|
39
|
+
* }
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
export declare function getCachedDataClientConfig(): DataClientConfigResponse | null;
|
|
43
|
+
/**
|
|
44
|
+
* Auto-initialize DataClient with server-provided configuration
|
|
45
|
+
*
|
|
46
|
+
* Automatically:
|
|
47
|
+
* 1. Detects if running in browser
|
|
48
|
+
* 2. Checks localStorage cache first
|
|
49
|
+
* 3. Fetches config from server endpoint if needed
|
|
50
|
+
* 4. Initializes DataClient with server-provided config
|
|
51
|
+
* 5. Caches config for future use
|
|
52
|
+
*
|
|
53
|
+
* @param options - Optional configuration
|
|
54
|
+
* @returns Initialized DataClient instance
|
|
55
|
+
* @throws Error if initialization fails
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* import { autoInitializeDataClient } from '@aifabrix/miso-client';
|
|
60
|
+
*
|
|
61
|
+
* // One line - everything is automatic
|
|
62
|
+
* const dataClient = await autoInitializeDataClient();
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export declare function autoInitializeDataClient(options?: AutoInitOptions): Promise<DataClient>;
|
|
66
|
+
//# sourceMappingURL=data-client-auto-init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-client-auto-init.d.ts","sourceRoot":"","sources":["../../src/utils/data-client-auto-init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,OAAO,EAAE,wBAAwB,EAAkC,MAAM,kCAAkC,CAAC;AAE5G;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,sFAAsF;IACtF,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,qBAAqB;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEjC,8DAA8D;IAC9D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AA0CD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,yBAAyB,IAAI,wBAAwB,GAAG,IAAI,CAG3E;AAoFD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,UAAU,CAAC,CAyErB"}
|