aziosxjs 1.0.0 → 1.0.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/README.md +393 -93
- package/dist/adapters/httpAdapter.d.ts +18 -0
- package/dist/adapters/httpAdapter.js +156 -0
- package/dist/adapters/httpAdapter.js.map +1 -1
- package/dist/adapters/index.d.ts +1 -0
- package/dist/adapters/index.js +7 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/auth/AuthManager.d.ts +100 -0
- package/dist/auth/AuthManager.js +226 -0
- package/dist/auth/AuthManager.js.map +1 -0
- package/dist/core/Azios.d.ts +2 -0
- package/dist/core/Azios.js +45 -30
- package/dist/core/Azios.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.js +13 -5
- package/dist/index.js.map +1 -1
- package/dist/monitoring/RequestMonitor.d.ts +113 -0
- package/dist/monitoring/RequestMonitor.js +264 -0
- package/dist/monitoring/RequestMonitor.js.map +1 -0
- package/dist/runtimes/AdapterFactory.js +15 -1
- package/dist/runtimes/AdapterFactory.js.map +1 -1
- package/dist/types/request.d.ts +2 -0
- package/package.json +62 -49
- package/src/adapters/httpAdapter.ts +152 -0
- package/src/adapters/index.ts +1 -0
- package/src/auth/AuthManager.ts +283 -0
- package/src/core/Azios.ts +51 -31
- package/src/index.ts +16 -6
- package/src/monitoring/RequestMonitor.ts +326 -0
- package/src/runtimes/AdapterFactory.ts +17 -1
- package/src/types/request.ts +4 -0
|
@@ -1,2 +1,158 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.NodeHttpAdapter = void 0;
|
|
40
|
+
const http = __importStar(require("http"));
|
|
41
|
+
const https = __importStar(require("https"));
|
|
42
|
+
const url_1 = require("url");
|
|
43
|
+
const HttpAdapter_1 = require("../runtimes/HttpAdapter");
|
|
44
|
+
const AziosError_1 = __importDefault(require("../errors/AziosError"));
|
|
45
|
+
/**
|
|
46
|
+
* Node.js HTTP adapter using built-in http/https modules
|
|
47
|
+
* Compatible with Node.js 16+ (before global fetch was available)
|
|
48
|
+
*/
|
|
49
|
+
class NodeHttpAdapter extends HttpAdapter_1.BaseAdapter {
|
|
50
|
+
/**
|
|
51
|
+
* Check if this adapter is supported (Node.js environment)
|
|
52
|
+
*/
|
|
53
|
+
isSupported() {
|
|
54
|
+
// In Node.js, this adapter is always supported
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Execute HTTP request using Node.js http/https modules
|
|
59
|
+
*/
|
|
60
|
+
async request(config) {
|
|
61
|
+
if (!this.isSupported()) {
|
|
62
|
+
throw new AziosError_1.default('Node HTTP adapter is not supported in this runtime', 'UNSUPPORTED_RUNTIME', config);
|
|
63
|
+
}
|
|
64
|
+
// Check if request is already cancelled
|
|
65
|
+
if (config.signal && config.signal.aborted) {
|
|
66
|
+
throw new AziosError_1.default('Request aborted', 'ABORTED', config);
|
|
67
|
+
}
|
|
68
|
+
return new Promise((resolve, reject) => {
|
|
69
|
+
const { url, method = 'GET', headers = {}, data, timeout, signal } = config;
|
|
70
|
+
const baseURL = config.baseURL || '';
|
|
71
|
+
const fullURL = new url_1.URL(baseURL + url);
|
|
72
|
+
// Add query parameters
|
|
73
|
+
if (config.params) {
|
|
74
|
+
Object.entries(config.params).forEach(([key, value]) => {
|
|
75
|
+
if (value !== null && value !== undefined) {
|
|
76
|
+
if (Array.isArray(value)) {
|
|
77
|
+
value.forEach(v => fullURL.searchParams.append(key, String(v)));
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
fullURL.searchParams.set(key, String(value));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
const isHttps = fullURL.protocol === 'https:';
|
|
86
|
+
const client = isHttps ? https : http;
|
|
87
|
+
const options = {
|
|
88
|
+
hostname: fullURL.hostname,
|
|
89
|
+
port: fullURL.port || (isHttps ? 443 : 80),
|
|
90
|
+
path: fullURL.pathname + fullURL.search,
|
|
91
|
+
method: method.toUpperCase(),
|
|
92
|
+
headers: {
|
|
93
|
+
'Content-Type': 'application/json',
|
|
94
|
+
...headers
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
// Handle timeout
|
|
98
|
+
let timeoutId;
|
|
99
|
+
if (timeout) {
|
|
100
|
+
timeoutId = setTimeout(() => {
|
|
101
|
+
req.destroy(new Error('Request timeout'));
|
|
102
|
+
}, timeout);
|
|
103
|
+
}
|
|
104
|
+
// Handle abort signal
|
|
105
|
+
if (signal) {
|
|
106
|
+
signal.addEventListener('abort', () => {
|
|
107
|
+
req.destroy(new Error('Request aborted'));
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
const req = client.request(options, (res) => {
|
|
111
|
+
let body = '';
|
|
112
|
+
res.on('data', (chunk) => {
|
|
113
|
+
body += chunk;
|
|
114
|
+
});
|
|
115
|
+
res.on('end', () => {
|
|
116
|
+
if (timeoutId) {
|
|
117
|
+
clearTimeout(timeoutId);
|
|
118
|
+
}
|
|
119
|
+
let responseData = body;
|
|
120
|
+
// Parse JSON if content-type is application/json
|
|
121
|
+
const contentType = res.headers['content-type'];
|
|
122
|
+
if ((contentType === null || contentType === void 0 ? void 0 : contentType.includes('application/json')) && body) {
|
|
123
|
+
try {
|
|
124
|
+
responseData = JSON.parse(body);
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
// Keep as string if parsing fails
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const response = {
|
|
131
|
+
data: responseData,
|
|
132
|
+
status: res.statusCode || 200,
|
|
133
|
+
statusText: res.statusMessage || '',
|
|
134
|
+
headers: res.headers,
|
|
135
|
+
config
|
|
136
|
+
};
|
|
137
|
+
resolve(response);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
req.on('error', (error) => {
|
|
141
|
+
if (timeoutId) {
|
|
142
|
+
clearTimeout(timeoutId);
|
|
143
|
+
}
|
|
144
|
+
const errorCode = error.message.includes('aborted') ? 'ABORTED' : 'NETWORK_ERROR';
|
|
145
|
+
reject(new AziosError_1.default(`Request failed: ${error.message}`, errorCode, config, undefined, error));
|
|
146
|
+
});
|
|
147
|
+
// Send request body
|
|
148
|
+
if (data) {
|
|
149
|
+
const body = typeof data === 'string' ? data : JSON.stringify(data);
|
|
150
|
+
req.write(body);
|
|
151
|
+
}
|
|
152
|
+
req.end();
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
exports.NodeHttpAdapter = NodeHttpAdapter;
|
|
157
|
+
exports.default = NodeHttpAdapter;
|
|
2
158
|
//# sourceMappingURL=httpAdapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"httpAdapter.js","sourceRoot":"","sources":["../../src/adapters/httpAdapter.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"httpAdapter.js","sourceRoot":"","sources":["../../src/adapters/httpAdapter.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/index.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as NodeHttpAdapter } from './httpAdapter';
|
package/dist/adapters/index.js
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.NodeHttpAdapter = void 0;
|
|
7
|
+
var httpAdapter_1 = require("./httpAdapter");
|
|
8
|
+
Object.defineProperty(exports, "NodeHttpAdapter", { enumerable: true, get: function () { return __importDefault(httpAdapter_1).default; } });
|
|
2
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":";;;;;;AAAA,6CAA0D;AAAjD,+HAAA,OAAO,OAAmB"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { AziosInstance } from "../types/request";
|
|
2
|
+
import type { AziosRequestConfig } from "../types/config";
|
|
3
|
+
/**
|
|
4
|
+
* Token storage and refresh configuration
|
|
5
|
+
*/
|
|
6
|
+
export interface TokenConfig {
|
|
7
|
+
accessToken: string;
|
|
8
|
+
refreshToken?: string;
|
|
9
|
+
expiresIn?: number;
|
|
10
|
+
tokenType?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Auth endpoints configuration
|
|
14
|
+
*/
|
|
15
|
+
export interface AuthEndpoints {
|
|
16
|
+
refreshUrl: string;
|
|
17
|
+
logoutUrl?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Auth Manager - Handle authentication, token refresh, and 401 responses
|
|
21
|
+
* Production-grade auth system with automatic token refresh and global 401 handling
|
|
22
|
+
*/
|
|
23
|
+
export default class AuthManager {
|
|
24
|
+
private token;
|
|
25
|
+
private endpoints;
|
|
26
|
+
private instance;
|
|
27
|
+
private isRefreshing;
|
|
28
|
+
private refreshSubscribers;
|
|
29
|
+
/**
|
|
30
|
+
* Initialize the auth manager with endpoints
|
|
31
|
+
*/
|
|
32
|
+
initialize(endpoints: AuthEndpoints): void;
|
|
33
|
+
/**
|
|
34
|
+
* Set the Azios instance for making refresh requests
|
|
35
|
+
*/
|
|
36
|
+
setInstance(instance: AziosInstance): void;
|
|
37
|
+
/**
|
|
38
|
+
* Store token
|
|
39
|
+
*/
|
|
40
|
+
setToken(token: TokenConfig): void;
|
|
41
|
+
/**
|
|
42
|
+
* Get current token
|
|
43
|
+
*/
|
|
44
|
+
getToken(): TokenConfig | null;
|
|
45
|
+
/**
|
|
46
|
+
* Get access token string
|
|
47
|
+
*/
|
|
48
|
+
getAccessToken(): string | null;
|
|
49
|
+
/**
|
|
50
|
+
* Check if token exists
|
|
51
|
+
*/
|
|
52
|
+
hasToken(): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Check if token is expired
|
|
55
|
+
*/
|
|
56
|
+
isTokenExpired(): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Clear token
|
|
59
|
+
*/
|
|
60
|
+
clearToken(): void;
|
|
61
|
+
/**
|
|
62
|
+
* Refresh the access token
|
|
63
|
+
*/
|
|
64
|
+
refreshAccessToken(): Promise<boolean>;
|
|
65
|
+
/**
|
|
66
|
+
* Get Authorization header value
|
|
67
|
+
*/
|
|
68
|
+
getAuthHeader(): string | null;
|
|
69
|
+
/**
|
|
70
|
+
* Attach auth header to request
|
|
71
|
+
*/
|
|
72
|
+
attachAuthHeader(config: AziosRequestConfig): AziosRequestConfig;
|
|
73
|
+
/**
|
|
74
|
+
* Handle 401 response (unauthorized)
|
|
75
|
+
*/
|
|
76
|
+
handle401(config: AziosRequestConfig): Promise<boolean>;
|
|
77
|
+
/**
|
|
78
|
+
* Logout user
|
|
79
|
+
*/
|
|
80
|
+
logout(): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Get auth status summary
|
|
83
|
+
*/
|
|
84
|
+
getStatus(): {
|
|
85
|
+
authenticated: boolean;
|
|
86
|
+
tokenExpired: boolean;
|
|
87
|
+
refreshToken: boolean;
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Create auth plugin that integrates with Azios
|
|
92
|
+
*/
|
|
93
|
+
export declare function createAuthPlugin(endpoints: AuthEndpoints): {
|
|
94
|
+
name: string;
|
|
95
|
+
version: string;
|
|
96
|
+
hooks: {
|
|
97
|
+
onInstall: (instance: AziosInstance) => Promise<void>;
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
export type { AuthManager };
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAuthPlugin = createAuthPlugin;
|
|
4
|
+
/**
|
|
5
|
+
* Auth Manager - Handle authentication, token refresh, and 401 responses
|
|
6
|
+
* Production-grade auth system with automatic token refresh and global 401 handling
|
|
7
|
+
*/
|
|
8
|
+
class AuthManager {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.token = null;
|
|
11
|
+
this.endpoints = null;
|
|
12
|
+
this.instance = null;
|
|
13
|
+
this.isRefreshing = false;
|
|
14
|
+
this.refreshSubscribers = [];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Initialize the auth manager with endpoints
|
|
18
|
+
*/
|
|
19
|
+
initialize(endpoints) {
|
|
20
|
+
this.endpoints = endpoints;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Set the Azios instance for making refresh requests
|
|
24
|
+
*/
|
|
25
|
+
setInstance(instance) {
|
|
26
|
+
this.instance = instance;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Store token
|
|
30
|
+
*/
|
|
31
|
+
setToken(token) {
|
|
32
|
+
this.token = token;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get current token
|
|
36
|
+
*/
|
|
37
|
+
getToken() {
|
|
38
|
+
return this.token;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get access token string
|
|
42
|
+
*/
|
|
43
|
+
getAccessToken() {
|
|
44
|
+
var _a;
|
|
45
|
+
return ((_a = this.token) === null || _a === void 0 ? void 0 : _a.accessToken) || null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Check if token exists
|
|
49
|
+
*/
|
|
50
|
+
hasToken() {
|
|
51
|
+
return this.token !== null && this.token.accessToken !== "";
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Check if token is expired
|
|
55
|
+
*/
|
|
56
|
+
isTokenExpired() {
|
|
57
|
+
if (!this.token || !this.token.expiresIn) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
// Check if expiry time has passed (with 60s buffer)
|
|
61
|
+
return Date.now() > this.token.expiresIn - 60000;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Clear token
|
|
65
|
+
*/
|
|
66
|
+
clearToken() {
|
|
67
|
+
this.token = null;
|
|
68
|
+
this.refreshSubscribers = [];
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Refresh the access token
|
|
72
|
+
*/
|
|
73
|
+
async refreshAccessToken() {
|
|
74
|
+
var _a, _b;
|
|
75
|
+
if (!this.instance || !this.endpoints) {
|
|
76
|
+
console.warn("AuthManager not properly initialized");
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
if (!((_a = this.token) === null || _a === void 0 ? void 0 : _a.refreshToken)) {
|
|
80
|
+
console.warn("No refresh token available");
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
// Prevent multiple simultaneous refresh requests
|
|
85
|
+
if (this.isRefreshing) {
|
|
86
|
+
return new Promise(resolve => {
|
|
87
|
+
this.refreshSubscribers.push(() => {
|
|
88
|
+
resolve(true);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
this.isRefreshing = true;
|
|
93
|
+
const response = await this.instance.post(this.endpoints.refreshUrl, { refreshToken: this.token.refreshToken });
|
|
94
|
+
if ((_b = response.data) === null || _b === void 0 ? void 0 : _b.accessToken) {
|
|
95
|
+
this.token = {
|
|
96
|
+
...this.token,
|
|
97
|
+
accessToken: response.data.accessToken,
|
|
98
|
+
expiresIn: Date.now() + (response.data.expiresIn || 3600000)
|
|
99
|
+
};
|
|
100
|
+
// Notify all subscribers
|
|
101
|
+
this.refreshSubscribers.forEach(cb => cb(this.token.accessToken));
|
|
102
|
+
this.refreshSubscribers = [];
|
|
103
|
+
this.isRefreshing = false;
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
this.isRefreshing = false;
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
this.isRefreshing = false;
|
|
111
|
+
console.error("Token refresh failed:", error);
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get Authorization header value
|
|
117
|
+
*/
|
|
118
|
+
getAuthHeader() {
|
|
119
|
+
var _a, _b;
|
|
120
|
+
if (!this.hasToken()) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
const tokenType = ((_a = this.token) === null || _a === void 0 ? void 0 : _a.tokenType) || "Bearer";
|
|
124
|
+
return `${tokenType} ${(_b = this.token) === null || _b === void 0 ? void 0 : _b.accessToken}`;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Attach auth header to request
|
|
128
|
+
*/
|
|
129
|
+
attachAuthHeader(config) {
|
|
130
|
+
const authHeader = this.getAuthHeader();
|
|
131
|
+
if (authHeader) {
|
|
132
|
+
return {
|
|
133
|
+
...config,
|
|
134
|
+
headers: {
|
|
135
|
+
...config.headers,
|
|
136
|
+
Authorization: authHeader
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
return config;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Handle 401 response (unauthorized)
|
|
144
|
+
*/
|
|
145
|
+
async handle401(config) {
|
|
146
|
+
if (!this.hasToken()) {
|
|
147
|
+
// No token to refresh
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
const refreshed = await this.refreshAccessToken();
|
|
151
|
+
if (refreshed) {
|
|
152
|
+
// Update the failed request with new token
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
// Token refresh failed, logout
|
|
156
|
+
await this.logout();
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Logout user
|
|
161
|
+
*/
|
|
162
|
+
async logout() {
|
|
163
|
+
var _a;
|
|
164
|
+
if (this.instance && ((_a = this.endpoints) === null || _a === void 0 ? void 0 : _a.logoutUrl)) {
|
|
165
|
+
try {
|
|
166
|
+
await this.instance.post(this.endpoints.logoutUrl);
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
console.error("Logout failed:", error);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
this.clearToken();
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Get auth status summary
|
|
176
|
+
*/
|
|
177
|
+
getStatus() {
|
|
178
|
+
var _a;
|
|
179
|
+
return {
|
|
180
|
+
authenticated: this.hasToken(),
|
|
181
|
+
tokenExpired: this.isTokenExpired(),
|
|
182
|
+
refreshToken: ((_a = this.token) === null || _a === void 0 ? void 0 : _a.refreshToken) !== undefined
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
exports.default = AuthManager;
|
|
187
|
+
/**
|
|
188
|
+
* Create auth plugin that integrates with Azios
|
|
189
|
+
*/
|
|
190
|
+
function createAuthPlugin(endpoints) {
|
|
191
|
+
const authManager = new AuthManager();
|
|
192
|
+
authManager.initialize(endpoints);
|
|
193
|
+
return {
|
|
194
|
+
name: "auth",
|
|
195
|
+
version: "1.0.0",
|
|
196
|
+
hooks: {
|
|
197
|
+
onInstall: async (instance) => {
|
|
198
|
+
authManager.setInstance(instance);
|
|
199
|
+
// Add response interceptor to handle 401
|
|
200
|
+
instance.interceptors.response.use((response) => response, async (error) => {
|
|
201
|
+
var _a;
|
|
202
|
+
const originalRequest = error.config;
|
|
203
|
+
// Check if error is 401 and retry hasn't been attempted
|
|
204
|
+
if (((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) === 401 &&
|
|
205
|
+
!originalRequest._retry &&
|
|
206
|
+
authManager.hasToken()) {
|
|
207
|
+
originalRequest._retry = true;
|
|
208
|
+
try {
|
|
209
|
+
const refreshed = await authManager.handle401(originalRequest);
|
|
210
|
+
if (refreshed) {
|
|
211
|
+
// Retry original request with new token
|
|
212
|
+
const newConfig = authManager.attachAuthHeader(originalRequest);
|
|
213
|
+
return instance.request(newConfig);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
catch (refreshError) {
|
|
217
|
+
console.error("Auth refresh failed:", refreshError);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
throw error;
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=AuthManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthManager.js","sourceRoot":"","sources":["../../src/auth/AuthManager.ts"],"names":[],"mappings":"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"}
|
package/dist/core/Azios.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { AziosPlugin } from "../types/plugin";
|
|
|
3
3
|
import InterceptorManager from "../interceptors/InterceptorManager";
|
|
4
4
|
import PluginManager from "../plugins/pluginManager";
|
|
5
5
|
import MiddlewareManager from "../middleware/middlewareManager";
|
|
6
|
+
import RequestMonitor from "../monitoring/RequestMonitor";
|
|
6
7
|
/**
|
|
7
8
|
* Core Azios HTTP client class
|
|
8
9
|
* Production-grade implementation with plugin system, middleware, and interceptors
|
|
@@ -15,6 +16,7 @@ export default class Azios {
|
|
|
15
16
|
};
|
|
16
17
|
middlewares: MiddlewareManager;
|
|
17
18
|
plugins: PluginManager;
|
|
19
|
+
monitor: RequestMonitor;
|
|
18
20
|
constructor(config: AziosRequestConfig);
|
|
19
21
|
/**
|
|
20
22
|
* Register middleware using Koa-style middleware pattern
|
package/dist/core/Azios.js
CHANGED
|
@@ -8,6 +8,7 @@ const InterceptorManager_1 = __importDefault(require("../interceptors/Intercepto
|
|
|
8
8
|
const pluginManager_1 = __importDefault(require("../plugins/pluginManager"));
|
|
9
9
|
const middlewareManager_1 = __importDefault(require("../middleware/middlewareManager"));
|
|
10
10
|
const compose_1 = require("../middleware/compose");
|
|
11
|
+
const RequestMonitor_1 = __importDefault(require("../monitoring/RequestMonitor"));
|
|
11
12
|
/**
|
|
12
13
|
* Core Azios HTTP client class
|
|
13
14
|
* Production-grade implementation with plugin system, middleware, and interceptors
|
|
@@ -21,6 +22,7 @@ class Azios {
|
|
|
21
22
|
};
|
|
22
23
|
this.middlewares = new middlewareManager_1.default();
|
|
23
24
|
this.plugins = new pluginManager_1.default();
|
|
25
|
+
this.monitor = new RequestMonitor_1.default(100, false); // Disabled by default
|
|
24
26
|
}
|
|
25
27
|
/**
|
|
26
28
|
* Register middleware using Koa-style middleware pattern
|
|
@@ -47,44 +49,57 @@ class Azios {
|
|
|
47
49
|
async request(config) {
|
|
48
50
|
config = { ...this.defaults, ...config };
|
|
49
51
|
// -------------------------
|
|
50
|
-
//
|
|
52
|
+
// MONITORING: START TRACKING
|
|
51
53
|
// -------------------------
|
|
52
|
-
|
|
53
|
-
// -------------------------
|
|
54
|
-
// MIDDLEWARE PIPELINE
|
|
55
|
-
// -------------------------
|
|
56
|
-
const context = { config };
|
|
57
|
-
const fn = (0, compose_1.compose)(this.middlewares.middlewares);
|
|
58
|
-
await fn(context);
|
|
59
|
-
config = context.config;
|
|
60
|
-
// -------------------------
|
|
61
|
-
// INTERCEPTOR PIPELINE
|
|
62
|
-
// -------------------------
|
|
63
|
-
const chain = [];
|
|
64
|
-
// Request interceptors (reverse order)
|
|
65
|
-
this.interceptors.request.forEach(interceptor => {
|
|
66
|
-
chain.unshift(interceptor.fulfilled, interceptor.rejected);
|
|
67
|
-
});
|
|
68
|
-
// Main dispatch
|
|
69
|
-
chain.push(dispatchRequest_1.default, undefined);
|
|
70
|
-
// Response interceptors (normal order)
|
|
71
|
-
this.interceptors.response.forEach(interceptor => {
|
|
72
|
-
chain.push(interceptor.fulfilled, interceptor.rejected);
|
|
73
|
-
});
|
|
74
|
-
let promise = Promise.resolve(config);
|
|
75
|
-
while (chain.length) {
|
|
76
|
-
const fulfilled = chain.shift();
|
|
77
|
-
const rejected = chain.shift();
|
|
78
|
-
promise = promise.then(fulfilled, rejected);
|
|
79
|
-
}
|
|
54
|
+
const requestId = this.monitor.startRequest(config);
|
|
80
55
|
try {
|
|
56
|
+
// -------------------------
|
|
57
|
+
// PLUGIN: PRE-REQUEST HOOKS
|
|
58
|
+
// -------------------------
|
|
59
|
+
config = await this.plugins.executeBeforeRequestHooks(config);
|
|
60
|
+
// -------------------------
|
|
61
|
+
// MIDDLEWARE PIPELINE
|
|
62
|
+
// -------------------------
|
|
63
|
+
const context = { config };
|
|
64
|
+
const fn = (0, compose_1.compose)(this.middlewares.middlewares);
|
|
65
|
+
await fn(context);
|
|
66
|
+
config = context.config;
|
|
67
|
+
// -------------------------
|
|
68
|
+
// INTERCEPTOR PIPELINE
|
|
69
|
+
// -------------------------
|
|
70
|
+
const chain = [];
|
|
71
|
+
// Request interceptors (reverse order)
|
|
72
|
+
this.interceptors.request.forEach(interceptor => {
|
|
73
|
+
chain.unshift(interceptor.fulfilled, interceptor.rejected);
|
|
74
|
+
});
|
|
75
|
+
// Main dispatch
|
|
76
|
+
chain.push(dispatchRequest_1.default, undefined);
|
|
77
|
+
// Response interceptors (normal order)
|
|
78
|
+
this.interceptors.response.forEach(interceptor => {
|
|
79
|
+
chain.push(interceptor.fulfilled, interceptor.rejected);
|
|
80
|
+
});
|
|
81
|
+
let promise = Promise.resolve(config);
|
|
82
|
+
while (chain.length) {
|
|
83
|
+
const fulfilled = chain.shift();
|
|
84
|
+
const rejected = chain.shift();
|
|
85
|
+
promise = promise.then(fulfilled, rejected);
|
|
86
|
+
}
|
|
81
87
|
const response = await promise;
|
|
82
88
|
// -------------------------
|
|
83
89
|
// PLUGIN: POST-RESPONSE HOOKS
|
|
84
90
|
// -------------------------
|
|
85
|
-
|
|
91
|
+
const finalResponse = await this.plugins.executeAfterResponseHooks(response);
|
|
92
|
+
// -------------------------
|
|
93
|
+
// MONITORING: END TRACKING (SUCCESS)
|
|
94
|
+
// -------------------------
|
|
95
|
+
this.monitor.endRequest(requestId, config, finalResponse);
|
|
96
|
+
return finalResponse;
|
|
86
97
|
}
|
|
87
98
|
catch (error) {
|
|
99
|
+
// -------------------------
|
|
100
|
+
// MONITORING: END TRACKING (ERROR)
|
|
101
|
+
// -------------------------
|
|
102
|
+
this.monitor.endRequestWithError(requestId, config, error);
|
|
88
103
|
// -------------------------
|
|
89
104
|
// PLUGIN: ERROR HOOKS
|
|
90
105
|
// -------------------------
|
package/dist/core/Azios.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Azios.js","sourceRoot":"","sources":["../../src/core/Azios.ts"],"names":[],"mappings":";;;;;AAAA,wEAA+C;AAI/C,4FAAmE;AACnE,6EAAoD;AACpD,wFAA+D;AAC/D,mDAA+C;
|
|
1
|
+
{"version":3,"file":"Azios.js","sourceRoot":"","sources":["../../src/core/Azios.ts"],"names":[],"mappings":"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"}
|