@fluwa-tool/sdk 1.0.45 → 1.0.47
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.
|
@@ -91,124 +91,157 @@ class XMLHttpRequestInterceptor {
|
|
|
91
91
|
requestMetadata.status = mockResponse.status || 200;
|
|
92
92
|
requestMetadata.response = mockResponse.response;
|
|
93
93
|
const delay = mockResponse.delay || 0;
|
|
94
|
-
// Aguardar axios anexar seus handlers
|
|
94
|
+
// Aguardar axios anexar seus handlers
|
|
95
|
+
// Usar múltiplos microtasks e macrotasks para garantir timing correto
|
|
95
96
|
Promise.resolve().then(() => {
|
|
96
|
-
|
|
97
|
+
// Dar 50ms extra para axios configurar tudo
|
|
97
98
|
setTimeout(() => {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
|
152
|
-
setTimeout(() => {
|
|
153
|
-
setReadyState(1);
|
|
154
|
-
if (xhr.onreadystatechange) {
|
|
99
|
+
self.logger.debug(`⏱️ [XMLHttpRequestInterceptor] Iniciando simulação de resposta com delay: ${delay}ms`);
|
|
100
|
+
const executeSimulation = () => {
|
|
101
|
+
const duration = Date.now() - (xhr._fluwaStartTime || 0);
|
|
102
|
+
requestMetadata.duration = duration;
|
|
103
|
+
self.requestLogger.logComplete(requestMetadata).catch(() => { });
|
|
104
|
+
// Simular readyState progression usando defineProperty (Hermes engine compat)
|
|
105
|
+
const setReadyState = (state) => {
|
|
155
106
|
try {
|
|
156
|
-
|
|
157
|
-
|
|
107
|
+
Object.defineProperty(xhr, 'readyState', {
|
|
108
|
+
value: state,
|
|
109
|
+
writable: true,
|
|
110
|
+
configurable: true,
|
|
111
|
+
});
|
|
112
|
+
self.logger.debug(`📊 [XMLHttpRequestInterceptor] readyState = ${state}`);
|
|
158
113
|
}
|
|
159
114
|
catch (e) {
|
|
160
|
-
|
|
115
|
+
// Fallback: try direct assignment se defineProperty falhar
|
|
116
|
+
xhr.readyState = state;
|
|
117
|
+
self.logger.debug(`📊 [XMLHttpRequestInterceptor] readyState = ${state} (fallback)`);
|
|
161
118
|
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
119
|
+
};
|
|
120
|
+
// Primeiro: configurar todas as propriedades de resposta ANTES de começar readyState
|
|
121
|
+
self.logger.debug(`🔧 [XMLHttpRequestInterceptor] Configurando propriedades de resposta`);
|
|
122
|
+
try {
|
|
123
|
+
// Override status (read-only property in Hermes)
|
|
167
124
|
try {
|
|
168
|
-
|
|
169
|
-
|
|
125
|
+
Object.defineProperty(xhr, 'status', {
|
|
126
|
+
value: mockResponse.status || 200,
|
|
127
|
+
writable: true,
|
|
128
|
+
configurable: true,
|
|
129
|
+
});
|
|
130
|
+
self.logger.debug(`✅ [XMLHttpRequestInterceptor] status = ${mockResponse.status || 200}`);
|
|
170
131
|
}
|
|
171
|
-
catch (
|
|
172
|
-
self.logger.debug(
|
|
132
|
+
catch (statusErr) {
|
|
133
|
+
self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] Não foi possível setar status:`, statusErr);
|
|
173
134
|
}
|
|
174
|
-
|
|
175
|
-
}, 5);
|
|
176
|
-
setTimeout(() => {
|
|
177
|
-
setReadyState(3);
|
|
178
|
-
if (xhr.onreadystatechange) {
|
|
135
|
+
// Override responseText (read-only property in Hermes)
|
|
179
136
|
try {
|
|
180
|
-
|
|
181
|
-
|
|
137
|
+
Object.defineProperty(xhr, 'responseText', {
|
|
138
|
+
value: JSON.stringify(mockResponse.response),
|
|
139
|
+
writable: true,
|
|
140
|
+
configurable: true,
|
|
141
|
+
});
|
|
142
|
+
self.logger.debug(`✅ [XMLHttpRequestInterceptor] responseText configurado`);
|
|
182
143
|
}
|
|
183
|
-
catch (
|
|
184
|
-
self.logger.debug(
|
|
144
|
+
catch (textErr) {
|
|
145
|
+
self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] Não foi possível setar responseText:`, textErr);
|
|
146
|
+
}
|
|
147
|
+
// Override response (read-only property in Hermes)
|
|
148
|
+
try {
|
|
149
|
+
Object.defineProperty(xhr, 'response', {
|
|
150
|
+
value: mockResponse.response,
|
|
151
|
+
writable: true,
|
|
152
|
+
configurable: true,
|
|
153
|
+
});
|
|
154
|
+
self.logger.debug(`✅ [XMLHttpRequestInterceptor] response configurado`);
|
|
185
155
|
}
|
|
156
|
+
catch (respErr) {
|
|
157
|
+
self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] Não foi possível setar response:`, respErr);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch (e) {
|
|
161
|
+
self.logger.debug('❌ Erro ao injetar propriedades mock:', e);
|
|
186
162
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
163
|
+
// Agora simular readyState progression com dispatchEvent (suporta addEventListener)
|
|
164
|
+
const fireEvent = (state, delayMs) => {
|
|
165
|
+
setTimeout(() => {
|
|
166
|
+
setReadyState(state);
|
|
167
|
+
// 1. Tentar chamar onreadystatechange direto se existir
|
|
168
|
+
if (xhr.onreadystatechange && typeof xhr.onreadystatechange === 'function') {
|
|
169
|
+
try {
|
|
170
|
+
self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onreadystatechange para readyState=${state}`);
|
|
171
|
+
xhr.onreadystatechange();
|
|
172
|
+
}
|
|
173
|
+
catch (e) {
|
|
174
|
+
self.logger.debug(`❌ Erro ao chamar onreadystatechange(${state}):`, e);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// 2. Disparar eventos (para listeners adicionados com addEventListener)
|
|
178
|
+
try {
|
|
179
|
+
// ProgressEvent está disponível em React Native
|
|
180
|
+
const event = new ProgressEvent('readystatechange');
|
|
181
|
+
self.logger.debug(`📤 [XMLHttpRequestInterceptor] Disparando evento readystatechange em readyState=${state}`);
|
|
182
|
+
xhr.dispatchEvent(event);
|
|
183
|
+
}
|
|
184
|
+
catch (e) {
|
|
185
|
+
self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] Não conseguiu disparar evento readystatechange:`, e);
|
|
186
|
+
}
|
|
187
|
+
}, delayMs);
|
|
188
|
+
};
|
|
189
|
+
// Aumentar delays para garantir que axios anexe seus handlers
|
|
190
|
+
fireEvent(1, 50); // readyState = 1 em 50ms
|
|
191
|
+
fireEvent(2, 100); // readyState = 2 em 100ms
|
|
192
|
+
fireEvent(3, 150); // readyState = 3 em 150ms
|
|
193
|
+
// Final: readyState = 4 com eventos e callbacks
|
|
194
|
+
setTimeout(() => {
|
|
195
|
+
setReadyState(4);
|
|
196
|
+
// 1. Chamar onreadystatechange se existir
|
|
197
|
+
if (xhr.onreadystatechange && typeof xhr.onreadystatechange === 'function') {
|
|
198
|
+
try {
|
|
199
|
+
self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onreadystatechange para readyState=4`);
|
|
200
|
+
xhr.onreadystatechange();
|
|
201
|
+
}
|
|
202
|
+
catch (e) {
|
|
203
|
+
self.logger.debug(`❌ Erro ao chamar onreadystatechange(4):`, e);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// 2. Disparar evento readystatechange
|
|
192
207
|
try {
|
|
193
|
-
|
|
194
|
-
|
|
208
|
+
const event = new ProgressEvent('readystatechange');
|
|
209
|
+
self.logger.debug(`📤 [XMLHttpRequestInterceptor] Disparando evento readystatechange em readyState=4`);
|
|
210
|
+
xhr.dispatchEvent(event);
|
|
195
211
|
}
|
|
196
212
|
catch (e) {
|
|
197
|
-
self.logger.debug(
|
|
213
|
+
self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] Não conseguiu disparar evento readystatechange:`, e);
|
|
198
214
|
}
|
|
199
|
-
|
|
200
|
-
|
|
215
|
+
// 3. Chamar onload se existir
|
|
216
|
+
if (xhr.onload && typeof xhr.onload === 'function') {
|
|
217
|
+
try {
|
|
218
|
+
self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onload`);
|
|
219
|
+
xhr.onload();
|
|
220
|
+
}
|
|
221
|
+
catch (e) {
|
|
222
|
+
self.logger.debug(`❌ Erro ao chamar onload:`, e);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// 4. Disparar evento load
|
|
201
226
|
try {
|
|
202
|
-
|
|
203
|
-
|
|
227
|
+
const loadEvent = new ProgressEvent('load');
|
|
228
|
+
self.logger.debug(`📤 [XMLHttpRequestInterceptor] Disparando evento load`);
|
|
229
|
+
xhr.dispatchEvent(loadEvent);
|
|
204
230
|
}
|
|
205
231
|
catch (e) {
|
|
206
|
-
self.logger.debug(
|
|
232
|
+
self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] Não conseguiu disparar evento load:`, e);
|
|
207
233
|
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
-
|
|
234
|
+
self.logger.debug(`✅ [XMLHttpRequestInterceptor] Simulação de resposta COMPLETA`);
|
|
235
|
+
}, 200);
|
|
236
|
+
};
|
|
237
|
+
// Executar após o delay do mock
|
|
238
|
+
if (delay > 0) {
|
|
239
|
+
setTimeout(executeSimulation, delay);
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
executeSimulation();
|
|
243
|
+
}
|
|
244
|
+
}, 50); // 50ms para axios anexar handlers
|
|
212
245
|
});
|
|
213
246
|
return;
|
|
214
247
|
}
|