@fluwa-tool/sdk 1.0.38 → 1.0.40
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.
|
@@ -27,15 +27,6 @@ class XMLHttpRequestInterceptor {
|
|
|
27
27
|
this.logger.debug('XMLHttpRequest não disponível nesse ambiente (requer navegador)');
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
|
-
// Em React Native, desabilitar XMLHttpRequestInterceptor pois tem problemas ao simular mocks
|
|
31
|
-
// FetchInterceptor já cobre as requisições
|
|
32
|
-
const isReactNative = typeof navigator !== 'undefined' &&
|
|
33
|
-
navigator.product === 'ReactNative';
|
|
34
|
-
if (isReactNative) {
|
|
35
|
-
this.logger.debug('XMLHttpRequest interceptor desabilitado em React Native (usar FetchInterceptor)');
|
|
36
|
-
this.isInstalled = true; // Marcar como instalado para não tentar novamente
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
30
|
const self = this;
|
|
40
31
|
const originalXHR = XMLHttpRequest.prototype;
|
|
41
32
|
// Armazenar referência ao open original
|
|
@@ -88,63 +79,52 @@ class XMLHttpRequestInterceptor {
|
|
|
88
79
|
};
|
|
89
80
|
// Logar início imediatamente
|
|
90
81
|
self.requestLogger.logStart(requestMetadata).catch(() => { });
|
|
91
|
-
//
|
|
82
|
+
// Tentar encontrar mock (com pequeno delay para WebSocket carregar)
|
|
83
|
+
const checkMockWithRetry = async () => {
|
|
84
|
+
let mockResponse = await self.mockResolver.resolve(method, url);
|
|
85
|
+
// Se não encontrou, aguardar e tentar novamente
|
|
86
|
+
if (!mockResponse) {
|
|
87
|
+
await new Promise(resolve => setTimeout(resolve, 150));
|
|
88
|
+
mockResponse = await self.mockResolver.resolve(method, url);
|
|
89
|
+
}
|
|
90
|
+
return mockResponse;
|
|
91
|
+
};
|
|
92
|
+
// Interceptar mudanças de estado
|
|
92
93
|
const originalOnReadyStateChange = xhr.onreadystatechange;
|
|
93
|
-
// Verificar
|
|
94
|
-
|
|
95
|
-
.then((mockResponse) => {
|
|
94
|
+
// Verificar mock e potencialmente interceptar
|
|
95
|
+
checkMockWithRetry().then(mockResponse => {
|
|
96
96
|
if (mockResponse) {
|
|
97
|
-
// ✅ Mock encontrado -
|
|
97
|
+
// ✅ Mock encontrado - fazer fetch interno para obter a resposta
|
|
98
98
|
requestMetadata.source = types_1.RequestSource.MOCK;
|
|
99
99
|
requestMetadata.status = mockResponse.status || 200;
|
|
100
100
|
requestMetadata.response = mockResponse.response;
|
|
101
|
-
// Guardar no xhr para depois extrair no handler
|
|
102
|
-
xhr._fluwaMockResponse = mockResponse;
|
|
103
|
-
xhr._fluwaMockStatus = mockResponse.status || 200;
|
|
104
101
|
// Aplicar delay se configurado
|
|
105
102
|
const delay = mockResponse.delay || 0;
|
|
106
|
-
// Simular a resposta mockada assincronamente
|
|
107
103
|
setTimeout(() => {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
value: 'OK',
|
|
120
|
-
configurable: true
|
|
121
|
-
});
|
|
122
|
-
Object.defineProperty(xhr, 'responseText', {
|
|
123
|
-
value: JSON.stringify(mockResponse.response),
|
|
124
|
-
configurable: true
|
|
125
|
-
});
|
|
126
|
-
Object.defineProperty(xhr, 'response', {
|
|
127
|
-
value: mockResponse.response,
|
|
128
|
-
configurable: true
|
|
129
|
-
});
|
|
130
|
-
const duration = Date.now() - (xhr._fluwaStartTime || 0);
|
|
131
|
-
requestMetadata.duration = duration;
|
|
132
|
-
// Registrar completamento do mock
|
|
133
|
-
self.requestLogger.logComplete(requestMetadata).catch(() => { });
|
|
134
|
-
// Chamar handler original para processar a "resposta"
|
|
135
|
-
// Sem Event object (React Native não suporta)
|
|
136
|
-
if (originalOnReadyStateChange) {
|
|
104
|
+
const duration = Date.now() - (xhr._fluwaStartTime || 0);
|
|
105
|
+
requestMetadata.duration = duration;
|
|
106
|
+
self.requestLogger.logComplete(requestMetadata).catch(() => { });
|
|
107
|
+
// Simular que a resposta chegou (chamar onreadystatechange)
|
|
108
|
+
if (originalOnReadyStateChange) {
|
|
109
|
+
try {
|
|
110
|
+
// Injetar dados da resposta no xhr
|
|
111
|
+
xhr._fluwaStatus = mockResponse.status || 200;
|
|
112
|
+
xhr._fluwaResponse = mockResponse.response;
|
|
113
|
+
xhr._fluwaResponseText = JSON.stringify(mockResponse.response);
|
|
114
|
+
// Chamar handler como se a requisição tivesse completado
|
|
137
115
|
originalOnReadyStateChange.call(xhr);
|
|
138
116
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
117
|
+
catch (error) {
|
|
118
|
+
self.logger.debug('Erro ao simular resposta mockada:', error);
|
|
119
|
+
// Se der erro, deixar passar para o servidor real
|
|
120
|
+
self.originalSend.apply(xhr, [body]);
|
|
121
|
+
}
|
|
142
122
|
}
|
|
143
123
|
}, delay);
|
|
144
|
-
//
|
|
124
|
+
// NÃO chamar send original para requisições mockadas
|
|
145
125
|
return;
|
|
146
126
|
}
|
|
147
|
-
//
|
|
127
|
+
// Sem mock - fazer request real normalmente
|
|
148
128
|
xhr.onreadystatechange = function (event) {
|
|
149
129
|
if (xhr.readyState === 4) {
|
|
150
130
|
// Requisição completou
|
|
@@ -181,14 +161,13 @@ class XMLHttpRequestInterceptor {
|
|
|
181
161
|
}
|
|
182
162
|
// Chamar handler original
|
|
183
163
|
if (originalOnReadyStateChange) {
|
|
184
|
-
originalOnReadyStateChange.call(
|
|
164
|
+
originalOnReadyStateChange.call(this, event);
|
|
185
165
|
}
|
|
186
166
|
};
|
|
187
|
-
// Chamar send original
|
|
188
|
-
|
|
189
|
-
})
|
|
190
|
-
|
|
191
|
-
// Erro ao verificar mock, continua com request real
|
|
167
|
+
// Chamar send original
|
|
168
|
+
self.originalSend.apply(xhr, [body]);
|
|
169
|
+
}).catch(() => {
|
|
170
|
+
// Erro ao verificar mock - fazer request real
|
|
192
171
|
xhr.onreadystatechange = function (event) {
|
|
193
172
|
if (xhr.readyState === 4) {
|
|
194
173
|
requestMetadata.status = xhr.status;
|
|
@@ -222,13 +201,11 @@ class XMLHttpRequestInterceptor {
|
|
|
222
201
|
self.requestLogger.logComplete(requestMetadata).catch(() => { });
|
|
223
202
|
}
|
|
224
203
|
if (originalOnReadyStateChange) {
|
|
225
|
-
originalOnReadyStateChange.call(
|
|
204
|
+
originalOnReadyStateChange.call(this, event);
|
|
226
205
|
}
|
|
227
206
|
};
|
|
228
|
-
|
|
207
|
+
self.originalSend.apply(xhr, [body]);
|
|
229
208
|
});
|
|
230
|
-
// Retornar undefined (send é síncrono mas processamento é async)
|
|
231
|
-
return;
|
|
232
209
|
};
|
|
233
210
|
this.isInstalled = true;
|
|
234
211
|
this.logger.success('XMLHttpRequest interceptor instalado');
|