@fluwa-tool/sdk 1.0.43 → 1.0.45
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.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Interceptador de XMLHttpRequest
|
|
3
|
-
*
|
|
3
|
+
* Faz fetch interno quando há mock para evitar modificar xhr read-only
|
|
4
4
|
*/
|
|
5
5
|
import { ILogger } from '../../core/Logger';
|
|
6
6
|
import { IRequestLogger } from './RequestLogger';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Interceptador de XMLHttpRequest
|
|
4
|
-
*
|
|
4
|
+
* Faz fetch interno quando há mock para evitar modificar xhr read-only
|
|
5
5
|
*/
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.XMLHttpRequestInterceptor = void 0;
|
|
@@ -82,78 +82,134 @@ class XMLHttpRequestInterceptor {
|
|
|
82
82
|
};
|
|
83
83
|
checkMockWithRetry().then(mockResponse => {
|
|
84
84
|
if (mockResponse) {
|
|
85
|
-
// Mock encontrado - simular resposta
|
|
85
|
+
// Mock encontrado - simular resposta XHR
|
|
86
|
+
self.logger.debug(`🎯 [XMLHttpRequestInterceptor] Mock encontrado para ${method} ${url}`, {
|
|
87
|
+
status: mockResponse.status,
|
|
88
|
+
hasResponse: !!mockResponse.response,
|
|
89
|
+
});
|
|
86
90
|
requestMetadata.source = types_1.RequestSource.MOCK;
|
|
87
91
|
requestMetadata.status = mockResponse.status || 200;
|
|
88
92
|
requestMetadata.response = mockResponse.response;
|
|
89
93
|
const delay = mockResponse.delay || 0;
|
|
90
|
-
//
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
94
|
+
// Aguardar axios anexar seus handlers (envolver em Promise.resolve para dar tempo)
|
|
95
|
+
Promise.resolve().then(() => {
|
|
96
|
+
self.logger.debug(`⏱️ [XMLHttpRequestInterceptor] Iniciando simulação de resposta com delay: ${delay}ms`);
|
|
97
|
+
setTimeout(() => {
|
|
98
|
+
const duration = Date.now() - (xhr._fluwaStartTime || 0);
|
|
99
|
+
requestMetadata.duration = duration;
|
|
100
|
+
self.requestLogger.logComplete(requestMetadata).catch(() => { });
|
|
101
|
+
// Simular readyState progression usando defineProperty (Hermes engine compat)
|
|
102
|
+
const setReadyState = (state) => {
|
|
103
|
+
try {
|
|
104
|
+
Object.defineProperty(xhr, 'readyState', {
|
|
105
|
+
value: state,
|
|
106
|
+
writable: true,
|
|
107
|
+
configurable: true,
|
|
108
|
+
});
|
|
109
|
+
self.logger.debug(`📊 [XMLHttpRequestInterceptor] readyState = ${state}`);
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
// Fallback: try direct assignment se defineProperty falhar
|
|
113
|
+
xhr.readyState = state;
|
|
114
|
+
self.logger.debug(`📊 [XMLHttpRequestInterceptor] readyState = ${state} (fallback)`);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
// Primeiro: configurar todas as propriedades de resposta ANTES de começar readyState
|
|
118
|
+
self.logger.debug(`🔧 [XMLHttpRequestInterceptor] Configurando propriedades de resposta`);
|
|
119
|
+
try {
|
|
120
|
+
// Override status (read-only property in Hermes)
|
|
121
|
+
if (!Object.getOwnPropertyDescriptor(xhr, 'status')) {
|
|
122
|
+
Object.defineProperty(xhr, 'status', {
|
|
123
|
+
value: mockResponse.status || 200,
|
|
124
|
+
writable: true,
|
|
125
|
+
configurable: true,
|
|
126
|
+
});
|
|
127
|
+
self.logger.debug(`✅ [XMLHttpRequestInterceptor] status = ${mockResponse.status || 200}`);
|
|
128
|
+
}
|
|
129
|
+
// Override responseText (read-only property in Hermes)
|
|
130
|
+
if (!Object.getOwnPropertyDescriptor(xhr, 'responseText')) {
|
|
131
|
+
Object.defineProperty(xhr, 'responseText', {
|
|
132
|
+
value: JSON.stringify(mockResponse.response),
|
|
133
|
+
writable: true,
|
|
134
|
+
configurable: true,
|
|
135
|
+
});
|
|
136
|
+
self.logger.debug(`✅ [XMLHttpRequestInterceptor] responseText configurado`);
|
|
137
|
+
}
|
|
138
|
+
// Override response (read-only property in Hermes)
|
|
139
|
+
if (!Object.getOwnPropertyDescriptor(xhr, 'response')) {
|
|
140
|
+
Object.defineProperty(xhr, 'response', {
|
|
141
|
+
value: mockResponse.response,
|
|
142
|
+
writable: true,
|
|
143
|
+
configurable: true,
|
|
144
|
+
});
|
|
145
|
+
self.logger.debug(`✅ [XMLHttpRequestInterceptor] response configurado`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch (e) {
|
|
149
|
+
self.logger.debug('❌ Erro ao injetar propriedades mock:', e);
|
|
150
|
+
}
|
|
151
|
+
// Agora simular readyState progression
|
|
97
152
|
setTimeout(() => {
|
|
98
|
-
|
|
153
|
+
setReadyState(1);
|
|
99
154
|
if (xhr.onreadystatechange) {
|
|
100
155
|
try {
|
|
156
|
+
self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onreadystatechange para readyState=1`);
|
|
101
157
|
xhr.onreadystatechange();
|
|
102
158
|
}
|
|
103
|
-
catch (e) {
|
|
159
|
+
catch (e) {
|
|
160
|
+
self.logger.debug(`❌ Erro ao chamar onreadystatechange(1):`, e);
|
|
161
|
+
}
|
|
104
162
|
}
|
|
105
163
|
}, 0);
|
|
106
|
-
// readyState 2 = HEADERS_RECEIVED
|
|
107
164
|
setTimeout(() => {
|
|
108
|
-
|
|
165
|
+
setReadyState(2);
|
|
109
166
|
if (xhr.onreadystatechange) {
|
|
110
167
|
try {
|
|
168
|
+
self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onreadystatechange para readyState=2`);
|
|
111
169
|
xhr.onreadystatechange();
|
|
112
170
|
}
|
|
113
|
-
catch (e) {
|
|
171
|
+
catch (e) {
|
|
172
|
+
self.logger.debug(`❌ Erro ao chamar onreadystatechange(2):`, e);
|
|
173
|
+
}
|
|
114
174
|
}
|
|
115
|
-
},
|
|
116
|
-
// readyState 3 = LOADING
|
|
175
|
+
}, 5);
|
|
117
176
|
setTimeout(() => {
|
|
118
|
-
|
|
177
|
+
setReadyState(3);
|
|
119
178
|
if (xhr.onreadystatechange) {
|
|
120
179
|
try {
|
|
180
|
+
self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onreadystatechange para readyState=3`);
|
|
121
181
|
xhr.onreadystatechange();
|
|
122
182
|
}
|
|
123
|
-
catch (e) {
|
|
183
|
+
catch (e) {
|
|
184
|
+
self.logger.debug(`❌ Erro ao chamar onreadystatechange(3):`, e);
|
|
185
|
+
}
|
|
124
186
|
}
|
|
125
|
-
},
|
|
126
|
-
// readyState 4
|
|
187
|
+
}, 10);
|
|
188
|
+
// Final: readyState = 4 com propriedades já configuradas
|
|
127
189
|
setTimeout(() => {
|
|
128
|
-
|
|
129
|
-
xhr.statusText = responseStatus >= 200 && responseStatus < 300 ? 'OK' : 'Error';
|
|
130
|
-
xhr.responseText = responseJSON;
|
|
131
|
-
xhr.response = mockResponse.response;
|
|
132
|
-
xhr.readyState = 4;
|
|
133
|
-
const duration = Date.now() - (xhr._fluwaStartTime || 0);
|
|
134
|
-
requestMetadata.duration = duration;
|
|
135
|
-
self.requestLogger.logComplete(requestMetadata).catch(() => { });
|
|
136
|
-
// Chamar evento final
|
|
190
|
+
setReadyState(4);
|
|
137
191
|
if (xhr.onreadystatechange) {
|
|
138
192
|
try {
|
|
193
|
+
self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onreadystatechange para readyState=4`);
|
|
139
194
|
xhr.onreadystatechange();
|
|
140
195
|
}
|
|
141
|
-
catch (e) {
|
|
196
|
+
catch (e) {
|
|
197
|
+
self.logger.debug(`❌ Erro ao chamar onreadystatechange(4):`, e);
|
|
198
|
+
}
|
|
142
199
|
}
|
|
143
200
|
if (xhr.onload) {
|
|
144
201
|
try {
|
|
202
|
+
self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onload`);
|
|
145
203
|
xhr.onload();
|
|
146
204
|
}
|
|
147
|
-
catch (e) {
|
|
205
|
+
catch (e) {
|
|
206
|
+
self.logger.debug(`❌ Erro ao chamar onload:`, e);
|
|
207
|
+
}
|
|
148
208
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
// Fallback: fazer request real
|
|
154
|
-
self.originalSend.apply(xhr, [body]);
|
|
155
|
-
}
|
|
156
|
-
}, delay);
|
|
209
|
+
self.logger.debug(`✅ [XMLHttpRequestInterceptor] Simulação de resposta COMPLETA`);
|
|
210
|
+
}, 15);
|
|
211
|
+
}, delay);
|
|
212
|
+
});
|
|
157
213
|
return;
|
|
158
214
|
}
|
|
159
215
|
// Sem mock - fazer request real
|