@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,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DataClient Auto-Initialization Helper
|
|
4
|
+
* Automatically fetches configuration from server and initializes DataClient
|
|
5
|
+
*
|
|
6
|
+
* Provides zero-config client-side setup for DataClient initialization
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.getCachedDataClientConfig = getCachedDataClientConfig;
|
|
10
|
+
exports.autoInitializeDataClient = autoInitializeDataClient;
|
|
11
|
+
const data_client_1 = require("./data-client");
|
|
12
|
+
const data_client_utils_1 = require("./data-client-utils");
|
|
13
|
+
const client_token_endpoint_1 = require("../express/client-token-endpoint");
|
|
14
|
+
/**
|
|
15
|
+
* Get cached config from localStorage
|
|
16
|
+
*
|
|
17
|
+
* @returns Cached config or null if not found or expired
|
|
18
|
+
*/
|
|
19
|
+
function getCachedConfig() {
|
|
20
|
+
if (!(0, data_client_utils_1.isBrowser)()) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const cachedStr = (0, data_client_utils_1.getLocalStorage)("miso:dataclient-config");
|
|
25
|
+
if (!cachedStr) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
const cached = JSON.parse(cachedStr);
|
|
29
|
+
// Check if expired
|
|
30
|
+
if (cached.expiresAt && cached.expiresAt < Date.now()) {
|
|
31
|
+
(0, data_client_utils_1.removeLocalStorage)("miso:dataclient-config");
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
return cached;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Invalid cache, remove it
|
|
38
|
+
(0, data_client_utils_1.removeLocalStorage)("miso:dataclient-config");
|
|
39
|
+
return null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get cached DataClient configuration from localStorage
|
|
44
|
+
*
|
|
45
|
+
* Returns the cached configuration that was stored by autoInitializeDataClient.
|
|
46
|
+
* Useful for reading configuration without re-initializing DataClient.
|
|
47
|
+
*
|
|
48
|
+
* @returns Cached config or null if not found or expired
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* import { getCachedDataClientConfig } from '@aifabrix/miso-client';
|
|
53
|
+
*
|
|
54
|
+
* const cachedConfig = getCachedDataClientConfig();
|
|
55
|
+
* if (cachedConfig) {
|
|
56
|
+
* console.log('Base URL:', cachedConfig.baseUrl);
|
|
57
|
+
* console.log('Controller URL:', cachedConfig.controllerUrl);
|
|
58
|
+
* console.log('Client ID:', cachedConfig.clientId);
|
|
59
|
+
* }
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
function getCachedDataClientConfig() {
|
|
63
|
+
const cached = getCachedConfig();
|
|
64
|
+
return cached?.config || null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Cache config in localStorage
|
|
68
|
+
*
|
|
69
|
+
* @param config - Config to cache
|
|
70
|
+
* @param expiresIn - Expiration time in seconds
|
|
71
|
+
*/
|
|
72
|
+
function cacheConfig(config, expiresIn) {
|
|
73
|
+
if (!(0, data_client_utils_1.isBrowser)()) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
const cached = {
|
|
78
|
+
config,
|
|
79
|
+
expiresAt: Date.now() + expiresIn * 1000,
|
|
80
|
+
};
|
|
81
|
+
(0, data_client_utils_1.setLocalStorage)("miso:dataclient-config", JSON.stringify(cached));
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Ignore localStorage errors (SSR, private browsing, etc.)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Fetch config from server endpoint
|
|
89
|
+
*
|
|
90
|
+
* @param baseUrl - Base URL for the API
|
|
91
|
+
* @param clientTokenUri - Client token endpoint URI
|
|
92
|
+
* @returns Config response
|
|
93
|
+
*/
|
|
94
|
+
async function fetchConfig(baseUrl, clientTokenUri) {
|
|
95
|
+
// Build full URL
|
|
96
|
+
const fullUrl = /^https?:\/\//i.test(clientTokenUri)
|
|
97
|
+
? clientTokenUri
|
|
98
|
+
: `${baseUrl}${clientTokenUri}`;
|
|
99
|
+
try {
|
|
100
|
+
// Try POST first (standard), fallback to GET
|
|
101
|
+
let response = await fetch(fullUrl, {
|
|
102
|
+
method: "POST",
|
|
103
|
+
headers: {
|
|
104
|
+
"Content-Type": "application/json",
|
|
105
|
+
},
|
|
106
|
+
credentials: "include",
|
|
107
|
+
});
|
|
108
|
+
// If POST fails with 405, try GET
|
|
109
|
+
if (response.status === 405) {
|
|
110
|
+
response = await fetch(fullUrl, {
|
|
111
|
+
method: "GET",
|
|
112
|
+
credentials: "include",
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
if (!response.ok) {
|
|
116
|
+
const errorText = await response.text();
|
|
117
|
+
throw new Error(`Failed to fetch config: ${response.status} ${response.statusText}. ${errorText}`);
|
|
118
|
+
}
|
|
119
|
+
const data = (await response.json());
|
|
120
|
+
// Check if response has config
|
|
121
|
+
if (!(0, client_token_endpoint_1.hasConfig)(data)) {
|
|
122
|
+
throw new Error("Invalid response format: config not found in response. " +
|
|
123
|
+
"Make sure your server endpoint uses createClientTokenEndpoint() helper.");
|
|
124
|
+
}
|
|
125
|
+
return data.config;
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
if (error instanceof Error) {
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
throw new Error(`Network error: ${String(error)}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Auto-initialize DataClient with server-provided configuration
|
|
136
|
+
*
|
|
137
|
+
* Automatically:
|
|
138
|
+
* 1. Detects if running in browser
|
|
139
|
+
* 2. Checks localStorage cache first
|
|
140
|
+
* 3. Fetches config from server endpoint if needed
|
|
141
|
+
* 4. Initializes DataClient with server-provided config
|
|
142
|
+
* 5. Caches config for future use
|
|
143
|
+
*
|
|
144
|
+
* @param options - Optional configuration
|
|
145
|
+
* @returns Initialized DataClient instance
|
|
146
|
+
* @throws Error if initialization fails
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```typescript
|
|
150
|
+
* import { autoInitializeDataClient } from '@aifabrix/miso-client';
|
|
151
|
+
*
|
|
152
|
+
* // One line - everything is automatic
|
|
153
|
+
* const dataClient = await autoInitializeDataClient();
|
|
154
|
+
* ```
|
|
155
|
+
*/
|
|
156
|
+
async function autoInitializeDataClient(options) {
|
|
157
|
+
// Check if running in browser
|
|
158
|
+
if (!(0, data_client_utils_1.isBrowser)()) {
|
|
159
|
+
throw new Error("autoInitializeDataClient() is only available in browser environment");
|
|
160
|
+
}
|
|
161
|
+
const opts = {
|
|
162
|
+
clientTokenUri: options?.clientTokenUri || "/api/v1/auth/client-token",
|
|
163
|
+
cacheConfig: options?.cacheConfig ?? true,
|
|
164
|
+
baseUrl: options?.baseUrl,
|
|
165
|
+
onError: options?.onError,
|
|
166
|
+
};
|
|
167
|
+
try {
|
|
168
|
+
// Auto-detect baseUrl from window.location if not provided
|
|
169
|
+
const baseUrl = opts.baseUrl ||
|
|
170
|
+
((0, data_client_utils_1.isBrowser)()
|
|
171
|
+
? globalThis.window.location.origin
|
|
172
|
+
: "");
|
|
173
|
+
if (!baseUrl) {
|
|
174
|
+
throw new Error("Unable to detect baseUrl. Please provide baseUrl option.");
|
|
175
|
+
}
|
|
176
|
+
let config = null;
|
|
177
|
+
// Check cache first if enabled
|
|
178
|
+
if (opts.cacheConfig) {
|
|
179
|
+
const cached = getCachedConfig();
|
|
180
|
+
if (cached) {
|
|
181
|
+
config = cached.config;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Fetch from server if not cached
|
|
185
|
+
if (!config) {
|
|
186
|
+
config = await fetchConfig(baseUrl, opts.clientTokenUri);
|
|
187
|
+
// Cache config if enabled (use expiresIn from token response if available)
|
|
188
|
+
// Default to 30 minutes (1800 seconds) if not available
|
|
189
|
+
if (opts.cacheConfig) {
|
|
190
|
+
cacheConfig(config, 1800);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Build DataClient config
|
|
194
|
+
const dataClientConfig = {
|
|
195
|
+
baseUrl: config.baseUrl,
|
|
196
|
+
misoConfig: {
|
|
197
|
+
clientId: config.clientId,
|
|
198
|
+
controllerUrl: config.controllerUrl,
|
|
199
|
+
controllerPublicUrl: config.controllerPublicUrl,
|
|
200
|
+
clientTokenUri: config.clientTokenUri,
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
// Initialize and return DataClient
|
|
204
|
+
return new data_client_1.DataClient(dataClientConfig);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
208
|
+
// Call error callback if provided
|
|
209
|
+
if (opts.onError) {
|
|
210
|
+
opts.onError(err);
|
|
211
|
+
}
|
|
212
|
+
throw err;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=data-client-auto-init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-client-auto-init.js","sourceRoot":"","sources":["../../src/utils/data-client-auto-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DataClient cache management utilities
|
|
3
|
+
* Handles cache operations, size enforcement, and metrics tracking
|
|
4
|
+
*/
|
|
5
|
+
import { CacheEntry, CacheConfig } from "../types/data-client.types";
|
|
6
|
+
import { ApiRequestOptions } from "../types/data-client.types";
|
|
7
|
+
/**
|
|
8
|
+
* Cache manager interface
|
|
9
|
+
*/
|
|
10
|
+
export interface CacheManager {
|
|
11
|
+
cache: Map<string, CacheEntry>;
|
|
12
|
+
metrics: {
|
|
13
|
+
cacheHits: number;
|
|
14
|
+
cacheMisses: number;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get cached entry if valid
|
|
19
|
+
*/
|
|
20
|
+
export declare function getCachedEntry<T>(cache: Map<string, CacheEntry>, cacheKey: string, metrics: {
|
|
21
|
+
cacheHits: number;
|
|
22
|
+
cacheMisses: number;
|
|
23
|
+
}): T | null;
|
|
24
|
+
/**
|
|
25
|
+
* Set cache entry with TTL and enforce max size
|
|
26
|
+
*/
|
|
27
|
+
export declare function setCacheEntry(cache: Map<string, CacheEntry>, cacheKey: string, data: unknown, ttl: number, maxSize: number): void;
|
|
28
|
+
/**
|
|
29
|
+
* Check if caching is enabled for request
|
|
30
|
+
*/
|
|
31
|
+
export declare function isCacheEnabled(method: string, cacheConfig: CacheConfig | undefined, options?: ApiRequestOptions): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Generate cache key for request
|
|
34
|
+
*/
|
|
35
|
+
export declare function getCacheKeyForRequest(endpoint: string, options?: ApiRequestOptions): string;
|
|
36
|
+
//# sourceMappingURL=data-client-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-client-cache.d.ts","sourceRoot":"","sources":["../../src/utils/data-client-cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAErE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAC/B,OAAO,EAAE;QACP,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAClD,CAAC,GAAG,IAAI,CAQV;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAC9B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,GACd,IAAI,CAYN;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,GAAG,SAAS,EACpC,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAOT;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,MAAM,CAER"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* DataClient cache management utilities
|
|
4
|
+
* Handles cache operations, size enforcement, and metrics tracking
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.getCachedEntry = getCachedEntry;
|
|
8
|
+
exports.setCacheEntry = setCacheEntry;
|
|
9
|
+
exports.isCacheEnabled = isCacheEnabled;
|
|
10
|
+
exports.getCacheKeyForRequest = getCacheKeyForRequest;
|
|
11
|
+
const data_client_utils_1 = require("./data-client-utils");
|
|
12
|
+
/**
|
|
13
|
+
* Get cached entry if valid
|
|
14
|
+
*/
|
|
15
|
+
function getCachedEntry(cache, cacheKey, metrics) {
|
|
16
|
+
const cached = cache.get(cacheKey);
|
|
17
|
+
if (cached && cached.expiresAt > Date.now()) {
|
|
18
|
+
metrics.cacheHits++;
|
|
19
|
+
return cached.data;
|
|
20
|
+
}
|
|
21
|
+
metrics.cacheMisses++;
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Set cache entry with TTL and enforce max size
|
|
26
|
+
*/
|
|
27
|
+
function setCacheEntry(cache, cacheKey, data, ttl, maxSize) {
|
|
28
|
+
cache.set(cacheKey, {
|
|
29
|
+
data,
|
|
30
|
+
expiresAt: Date.now() + ttl * 1000,
|
|
31
|
+
key: cacheKey,
|
|
32
|
+
});
|
|
33
|
+
// Enforce max cache size
|
|
34
|
+
if (cache.size > maxSize) {
|
|
35
|
+
const firstKey = cache.keys().next().value;
|
|
36
|
+
if (firstKey)
|
|
37
|
+
cache.delete(firstKey);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if caching is enabled for request
|
|
42
|
+
*/
|
|
43
|
+
function isCacheEnabled(method, cacheConfig, options) {
|
|
44
|
+
const isGetRequest = method.toUpperCase() === "GET";
|
|
45
|
+
return ((cacheConfig?.enabled !== false) &&
|
|
46
|
+
isGetRequest &&
|
|
47
|
+
(options?.cache?.enabled !== false));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Generate cache key for request
|
|
51
|
+
*/
|
|
52
|
+
function getCacheKeyForRequest(endpoint, options) {
|
|
53
|
+
return options?.cache?.key || (0, data_client_utils_1.generateCacheKey)(endpoint, options);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=data-client-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-client-cache.js","sourceRoot":"","sources":["../../src/utils/data-client-cache.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAoBH,wCAYC;AAKD,sCAkBC;AAKD,wCAWC;AAKD,sDAKC;AA9ED,2DAAuD;AAcvD;;GAEG;AACH,SAAgB,cAAc,CAC5B,KAA8B,EAC9B,QAAgB,EAChB,OAAmD;IAEnD,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC5C,OAAO,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC,IAAS,CAAC;IAC1B,CAAC;IACD,OAAO,CAAC,WAAW,EAAE,CAAC;IACtB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAgB,aAAa,CAC3B,KAA8B,EAC9B,QAAgB,EAChB,IAAa,EACb,GAAW,EACX,OAAe;IAEf,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;QAClB,IAAI;QACJ,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,IAAI;QAClC,GAAG,EAAE,QAAQ;KACd,CAAC,CAAC;IAEH,yBAAyB;IACzB,IAAI,KAAK,CAAC,IAAI,GAAG,OAAO,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC3C,IAAI,QAAQ;YAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAC5B,MAAc,EACd,WAAoC,EACpC,OAA2B;IAE3B,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;IACpD,OAAO,CACL,CAAC,WAAW,EAAE,OAAO,KAAK,KAAK,CAAC;QAChC,YAAY;QACZ,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,KAAK,KAAK,CAAC,CACpC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CACnC,QAAgB,EAChB,OAA2B;IAE3B,OAAO,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI,IAAA,oCAAgB,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DataClient redirect to login utilities
|
|
3
|
+
* Handles redirect to login flow with proper error handling
|
|
4
|
+
*/
|
|
5
|
+
import { DataClientConfig } from "../types/data-client.types";
|
|
6
|
+
/**
|
|
7
|
+
* Synchronously get and validate redirect URL
|
|
8
|
+
* Validates the URL before returning it
|
|
9
|
+
* @param url - URL to validate and return
|
|
10
|
+
* @param fallbackUrl - Optional fallback URL if primary is invalid
|
|
11
|
+
* @returns Validated URL string or null if both are invalid
|
|
12
|
+
*/
|
|
13
|
+
export declare function getValidatedRedirectUrl(url: string | null, fallbackUrl?: string | null): string | null;
|
|
14
|
+
/**
|
|
15
|
+
* Redirect to login page via controller
|
|
16
|
+
* Calls the controller login endpoint with redirect parameter and x-client-token header
|
|
17
|
+
* @param config - DataClient configuration
|
|
18
|
+
* @param getClientTokenFn - Function to get client token
|
|
19
|
+
* @param redirectUrl - Optional redirect URL to return to after login (defaults to current page URL)
|
|
20
|
+
*/
|
|
21
|
+
export declare function redirectToLogin(config: DataClientConfig, getClientTokenFn: () => Promise<string | null>, redirectUrl?: string): Promise<void>;
|
|
22
|
+
//# sourceMappingURL=data-client-redirect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-client-redirect.d.ts","sourceRoot":"","sources":["../../src/utils/data-client-redirect.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AA0P9D;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAiBtG;AAoGD;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,gBAAgB,EACxB,gBAAgB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EAC9C,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CA+Bf"}
|