@fluwa-tool/sdk 1.0.49 → 1.0.51
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.
|
@@ -82,7 +82,7 @@ class XMLHttpRequestInterceptor {
|
|
|
82
82
|
};
|
|
83
83
|
checkMockWithRetry().then(mockResponse => {
|
|
84
84
|
if (mockResponse) {
|
|
85
|
-
// Mock encontrado -
|
|
85
|
+
// Mock encontrado - usar proxy do Fluwa Server
|
|
86
86
|
self.logger.debug(`🎯 [XMLHttpRequestInterceptor] Mock encontrado para ${method} ${url}`, {
|
|
87
87
|
status: mockResponse.status,
|
|
88
88
|
hasResponse: !!mockResponse.response,
|
|
@@ -90,159 +90,41 @@ class XMLHttpRequestInterceptor {
|
|
|
90
90
|
requestMetadata.source = types_1.RequestSource.MOCK;
|
|
91
91
|
requestMetadata.status = mockResponse.status || 200;
|
|
92
92
|
requestMetadata.response = mockResponse.response;
|
|
93
|
-
|
|
94
|
-
//
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
// Simular readyState progression usando defineProperty (Hermes engine compat)
|
|
105
|
-
const setReadyState = (state) => {
|
|
106
|
-
try {
|
|
107
|
-
Object.defineProperty(xhr, 'readyState', {
|
|
108
|
-
value: state,
|
|
109
|
-
writable: true,
|
|
110
|
-
configurable: true,
|
|
111
|
-
});
|
|
112
|
-
self.logger.debug(`📊 [XMLHttpRequestInterceptor] readyState = ${state}`);
|
|
113
|
-
}
|
|
114
|
-
catch (e) {
|
|
115
|
-
// Fallback: try direct assignment se defineProperty falhar
|
|
116
|
-
xhr.readyState = state;
|
|
117
|
-
self.logger.debug(`📊 [XMLHttpRequestInterceptor] readyState = ${state} (fallback)`);
|
|
118
|
-
}
|
|
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)
|
|
124
|
-
try {
|
|
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}`);
|
|
131
|
-
}
|
|
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)
|
|
136
|
-
try {
|
|
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`);
|
|
143
|
-
}
|
|
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`);
|
|
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);
|
|
162
|
-
}
|
|
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
|
-
// Usar objeto simples em vez de ProgressEvent (não existe em React Native)
|
|
180
|
-
const event = { type: 'readystatechange', target: xhr };
|
|
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
|
|
207
|
-
try {
|
|
208
|
-
const event = { type: 'readystatechange', target: xhr };
|
|
209
|
-
self.logger.debug(`📤 [XMLHttpRequestInterceptor] Disparando evento readystatechange em readyState=4`);
|
|
210
|
-
xhr.dispatchEvent(event);
|
|
211
|
-
}
|
|
212
|
-
catch (e) {
|
|
213
|
-
self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] Não conseguiu disparar evento readystatechange:`, e);
|
|
214
|
-
}
|
|
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
|
|
226
|
-
try {
|
|
227
|
-
const loadEvent = { type: 'load', target: xhr };
|
|
228
|
-
self.logger.debug(`📤 [XMLHttpRequestInterceptor] Disparando evento load`);
|
|
229
|
-
xhr.dispatchEvent(loadEvent);
|
|
230
|
-
}
|
|
231
|
-
catch (e) {
|
|
232
|
-
self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] Não conseguiu disparar evento load:`, e);
|
|
233
|
-
}
|
|
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
|
|
93
|
+
// ✅ NOVA ABORDAGEM: Redirecionar para endpoint do Fluwa que retorna o mock
|
|
94
|
+
// Em vez de tentar simular a resposta XHR, fazemos uma requisição REAL para o Fluwa Server
|
|
95
|
+
const mockProxyUrl = `http://192.168.0.6:5555/api/mock-proxy`;
|
|
96
|
+
self.logger.debug(`🔀 [XMLHttpRequestInterceptor] Redirecionando para proxy do Fluwa: ${mockProxyUrl}`);
|
|
97
|
+
// Modifi car URL e corpo para chamar o endpoint proxy
|
|
98
|
+
const mockRequestBody = JSON.stringify({
|
|
99
|
+
originalMethod: method,
|
|
100
|
+
originalUrl: url,
|
|
101
|
+
mockStatus: mockResponse.status || 200,
|
|
102
|
+
mockResponse: mockResponse.response,
|
|
103
|
+
mockDelay: mockResponse.delay || 0,
|
|
245
104
|
});
|
|
105
|
+
// Chamar originalSend com URL do proxy
|
|
106
|
+
// Isso faz axios fazer uma requisição REAL para o Fluwa Server
|
|
107
|
+
// que retorna o mock como resposta HTTP normal
|
|
108
|
+
try {
|
|
109
|
+
// Restaurar para o método proxy (POST para o endpoint /api/mock-proxy)
|
|
110
|
+
self.originalOpen.call(xhr, 'POST', mockProxyUrl, true);
|
|
111
|
+
// Copiar headers originais
|
|
112
|
+
Object.keys(headers).forEach(header => {
|
|
113
|
+
self.originalSetRequestHeader.call(xhr, header, headers[header]);
|
|
114
|
+
});
|
|
115
|
+
// Adicionar header especial para o Fluwa Server saber que é um mock proxy
|
|
116
|
+
self.originalSetRequestHeader.call(xhr, 'X-Fluwa-Mock-Proxy', 'true');
|
|
117
|
+
const duration = Date.now() - (xhr._fluwaStartTime || 0);
|
|
118
|
+
requestMetadata.duration = duration;
|
|
119
|
+
self.requestLogger.logComplete(requestMetadata).catch(() => { });
|
|
120
|
+
self.logger.debug(`✅ [XMLHttpRequestInterceptor] Enviando mock via proxy do Fluwa`);
|
|
121
|
+
self.originalSend.call(xhr, mockRequestBody);
|
|
122
|
+
}
|
|
123
|
+
catch (e) {
|
|
124
|
+
self.logger.debug(`❌ [XMLHttpRequestInterceptor] Erro ao chamar proxy:`, e);
|
|
125
|
+
// Fallback: tentar fazer requisição real
|
|
126
|
+
self.originalSend.apply(xhr, [body]);
|
|
127
|
+
}
|
|
246
128
|
return;
|
|
247
129
|
}
|
|
248
130
|
// Sem mock - fazer request real
|