@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
- // Interceptar mudanças de estado (para request real)
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 se há mock ANTES de enviar a requisição
94
- self.mockResolver.resolve(method, url)
95
- .then((mockResponse) => {
94
+ // Verificar mock e potencialmente interceptar
95
+ checkMockWithRetry().then(mockResponse => {
96
96
  if (mockResponse) {
97
- // ✅ Mock encontrado - simular resposta ao invés de fazer request real
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
- try {
109
- // Injetar dados fake no xhr para simular resposta
110
- Object.defineProperty(xhr, 'readyState', {
111
- value: 4,
112
- configurable: true
113
- });
114
- Object.defineProperty(xhr, 'status', {
115
- value: mockResponse.status || 200,
116
- configurable: true
117
- });
118
- Object.defineProperty(xhr, 'statusText', {
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
- catch (error) {
141
- self.logger.debug('Erro ao simular mock response:', error);
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
- // Não chamar send original para requisições mockadas
124
+ // NÃO chamar send original para requisições mockadas
145
125
  return;
146
126
  }
147
- // NÃO mock - fazer request real normalmente
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(xhr, event);
164
+ originalOnReadyStateChange.call(this, event);
185
165
  }
186
166
  };
187
- // Chamar send original para requisições reais
188
- return self.originalSend.apply(xhr, [body]);
189
- })
190
- .catch(() => {
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(xhr, event);
204
+ originalOnReadyStateChange.call(this, event);
226
205
  }
227
206
  };
228
- return self.originalSend.apply(xhr, [body]);
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');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluwa-tool/sdk",
3
- "version": "1.0.38",
3
+ "version": "1.0.40",
4
4
  "description": "Fluwa DevTools SDK for network interception and mocking",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",