@fluwa-tool/sdk 1.0.44 → 1.0.46
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.
|
@@ -83,105 +83,145 @@ class XMLHttpRequestInterceptor {
|
|
|
83
83
|
checkMockWithRetry().then(mockResponse => {
|
|
84
84
|
if (mockResponse) {
|
|
85
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
|
-
// Aguardar axios anexar seus handlers
|
|
94
|
+
// Aguardar axios anexar seus handlers
|
|
95
|
+
// Usar múltiplos microtasks e macrotasks para garantir timing correto
|
|
91
96
|
Promise.resolve().then(() => {
|
|
97
|
+
// Dar 50ms extra para axios configurar tudo
|
|
92
98
|
setTimeout(() => {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
value: state,
|
|
101
|
-
writable: true,
|
|
102
|
-
configurable: true,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
catch (e) {
|
|
106
|
-
// Fallback: try direct assignment se defineProperty falhar
|
|
107
|
-
xhr.readyState = state;
|
|
108
|
-
}
|
|
109
|
-
};
|
|
110
|
-
// Primeiro: configurar todas as propriedades de resposta ANTES de começar readyState
|
|
111
|
-
try {
|
|
112
|
-
// Override status (read-only property in Hermes)
|
|
113
|
-
if (!Object.getOwnPropertyDescriptor(xhr, 'status')) {
|
|
114
|
-
Object.defineProperty(xhr, 'status', {
|
|
115
|
-
value: mockResponse.status || 200,
|
|
116
|
-
writable: true,
|
|
117
|
-
configurable: true,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
// Override responseText (read-only property in Hermes)
|
|
121
|
-
if (!Object.getOwnPropertyDescriptor(xhr, 'responseText')) {
|
|
122
|
-
Object.defineProperty(xhr, 'responseText', {
|
|
123
|
-
value: JSON.stringify(mockResponse.response),
|
|
124
|
-
writable: true,
|
|
125
|
-
configurable: true,
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
// Override response (read-only property in Hermes)
|
|
129
|
-
if (!Object.getOwnPropertyDescriptor(xhr, 'response')) {
|
|
130
|
-
Object.defineProperty(xhr, 'response', {
|
|
131
|
-
value: mockResponse.response,
|
|
132
|
-
writable: true,
|
|
133
|
-
configurable: true,
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
catch (e) {
|
|
138
|
-
self.logger.debug('Erro ao injetar propriedades mock:', e);
|
|
139
|
-
}
|
|
140
|
-
// Agora simular readyState progression
|
|
141
|
-
setTimeout(() => {
|
|
142
|
-
setReadyState(1);
|
|
143
|
-
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) => {
|
|
144
106
|
try {
|
|
145
|
-
|
|
107
|
+
Object.defineProperty(xhr, 'readyState', {
|
|
108
|
+
value: state,
|
|
109
|
+
writable: true,
|
|
110
|
+
configurable: true,
|
|
111
|
+
});
|
|
112
|
+
self.logger.debug(`📊 [XMLHttpRequestInterceptor] readyState = ${state}`);
|
|
146
113
|
}
|
|
147
|
-
catch (e) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
setReadyState(2);
|
|
152
|
-
if (xhr.onreadystatechange) {
|
|
153
|
-
try {
|
|
154
|
-
xhr.onreadystatechange();
|
|
114
|
+
catch (e) {
|
|
115
|
+
// Fallback: try direct assignment se defineProperty falhar
|
|
116
|
+
xhr.readyState = state;
|
|
117
|
+
self.logger.debug(`📊 [XMLHttpRequestInterceptor] readyState = ${state} (fallback)`);
|
|
155
118
|
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
if (xhr.onreadystatechange) {
|
|
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)
|
|
162
124
|
try {
|
|
163
|
-
|
|
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}`);
|
|
164
131
|
}
|
|
165
|
-
catch (
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
setTimeout(() => {
|
|
170
|
-
setReadyState(4);
|
|
171
|
-
if (xhr.onreadystatechange) {
|
|
132
|
+
catch (statusErr) {
|
|
133
|
+
self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] Não foi possível setar status:`, statusErr);
|
|
134
|
+
}
|
|
135
|
+
// Override responseText (read-only property in Hermes)
|
|
172
136
|
try {
|
|
173
|
-
|
|
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`);
|
|
174
143
|
}
|
|
175
|
-
catch (
|
|
176
|
-
|
|
177
|
-
|
|
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)
|
|
178
148
|
try {
|
|
179
|
-
|
|
149
|
+
Object.defineProperty(xhr, 'response', {
|
|
150
|
+
value: mockResponse.response,
|
|
151
|
+
writable: true,
|
|
152
|
+
configurable: true,
|
|
153
|
+
});
|
|
154
|
+
self.logger.debug(`✅ [XMLHttpRequestInterceptor] response configurado`);
|
|
155
|
+
}
|
|
156
|
+
catch (respErr) {
|
|
157
|
+
self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] Não foi possível setar response:`, respErr);
|
|
180
158
|
}
|
|
181
|
-
catch (e) { }
|
|
182
159
|
}
|
|
183
|
-
|
|
184
|
-
|
|
160
|
+
catch (e) {
|
|
161
|
+
self.logger.debug('❌ Erro ao injetar propriedades mock:', e);
|
|
162
|
+
}
|
|
163
|
+
// Agora simular readyState progression com delays maiores para garantir callbacks
|
|
164
|
+
const fireEvent = (state, delayMs) => {
|
|
165
|
+
setTimeout(() => {
|
|
166
|
+
setReadyState(state);
|
|
167
|
+
self.logger.debug(`📋 [XMLHttpRequestInterceptor] onreadystatechange=${typeof xhr.onreadystatechange}, onload=${typeof xhr.onload}`);
|
|
168
|
+
if (xhr.onreadystatechange) {
|
|
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
|
+
else {
|
|
178
|
+
self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] onreadystatechange NÃO DEFINIDO em readyState=${state}`);
|
|
179
|
+
}
|
|
180
|
+
}, delayMs);
|
|
181
|
+
};
|
|
182
|
+
// Aumentar delays para garantir que axios anexe seus handlers
|
|
183
|
+
fireEvent(1, 50); // readyState = 1 em 50ms
|
|
184
|
+
fireEvent(2, 100); // readyState = 2 em 100ms
|
|
185
|
+
fireEvent(3, 150); // readyState = 3 em 150ms
|
|
186
|
+
// Final: readyState = 4 com callbacks
|
|
187
|
+
setTimeout(() => {
|
|
188
|
+
setReadyState(4);
|
|
189
|
+
self.logger.debug(`📋 [XMLHttpRequestInterceptor] onreadystatechange=${typeof xhr.onreadystatechange}, onload=${typeof xhr.onload}`);
|
|
190
|
+
if (xhr.onreadystatechange) {
|
|
191
|
+
try {
|
|
192
|
+
self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onreadystatechange para readyState=4`);
|
|
193
|
+
xhr.onreadystatechange();
|
|
194
|
+
}
|
|
195
|
+
catch (e) {
|
|
196
|
+
self.logger.debug(`❌ Erro ao chamar onreadystatechange(4):`, e);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] onreadystatechange NÃO DEFINIDO em readyState=4`);
|
|
201
|
+
}
|
|
202
|
+
if (xhr.onload) {
|
|
203
|
+
try {
|
|
204
|
+
self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onload`);
|
|
205
|
+
xhr.onload();
|
|
206
|
+
}
|
|
207
|
+
catch (e) {
|
|
208
|
+
self.logger.debug(`❌ Erro ao chamar onload:`, e);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] onload NÃO DEFINIDO`);
|
|
213
|
+
}
|
|
214
|
+
self.logger.debug(`✅ [XMLHttpRequestInterceptor] Simulação de resposta COMPLETA`);
|
|
215
|
+
}, 200);
|
|
216
|
+
};
|
|
217
|
+
// Executar após o delay do mock
|
|
218
|
+
if (delay > 0) {
|
|
219
|
+
setTimeout(executeSimulation, delay);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
executeSimulation();
|
|
223
|
+
}
|
|
224
|
+
}, 50); // 50ms para axios anexar handlers
|
|
185
225
|
});
|
|
186
226
|
return;
|
|
187
227
|
}
|