@fluwa-tool/sdk 1.0.43 → 1.0.45

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.
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Interceptador de XMLHttpRequest
3
- * Usa fetch interno quando há mock para evitar problemas em React Native
3
+ * Faz fetch interno quando há mock para evitar modificar xhr read-only
4
4
  */
5
5
  import { ILogger } from '../../core/Logger';
6
6
  import { IRequestLogger } from './RequestLogger';
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  /**
3
3
  * Interceptador de XMLHttpRequest
4
- * Usa fetch interno quando há mock para evitar problemas em React Native
4
+ * Faz fetch interno quando há mock para evitar modificar xhr read-only
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.XMLHttpRequestInterceptor = void 0;
@@ -82,78 +82,134 @@ class XMLHttpRequestInterceptor {
82
82
  };
83
83
  checkMockWithRetry().then(mockResponse => {
84
84
  if (mockResponse) {
85
- // Mock encontrado - simular resposta do xhr
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
- // Disparar eventos de forma assíncrona para o axios processar
91
- setTimeout(() => {
92
- try {
93
- const responseJSON = JSON.stringify(mockResponse.response);
94
- const responseStatus = mockResponse.status || 200;
95
- // Simular progresso: LOADING → DONE
96
- // readyState 1 = OPENED
94
+ // Aguardar axios anexar seus handlers (envolver em Promise.resolve para dar tempo)
95
+ Promise.resolve().then(() => {
96
+ self.logger.debug(`⏱️ [XMLHttpRequestInterceptor] Iniciando simulação de resposta com delay: ${delay}ms`);
97
+ setTimeout(() => {
98
+ const duration = Date.now() - (xhr._fluwaStartTime || 0);
99
+ requestMetadata.duration = duration;
100
+ self.requestLogger.logComplete(requestMetadata).catch(() => { });
101
+ // Simular readyState progression usando defineProperty (Hermes engine compat)
102
+ const setReadyState = (state) => {
103
+ try {
104
+ Object.defineProperty(xhr, 'readyState', {
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
97
152
  setTimeout(() => {
98
- xhr.readyState = 1;
153
+ setReadyState(1);
99
154
  if (xhr.onreadystatechange) {
100
155
  try {
156
+ self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onreadystatechange para readyState=1`);
101
157
  xhr.onreadystatechange();
102
158
  }
103
- catch (e) { }
159
+ catch (e) {
160
+ self.logger.debug(`❌ Erro ao chamar onreadystatechange(1):`, e);
161
+ }
104
162
  }
105
163
  }, 0);
106
- // readyState 2 = HEADERS_RECEIVED
107
164
  setTimeout(() => {
108
- xhr.readyState = 2;
165
+ setReadyState(2);
109
166
  if (xhr.onreadystatechange) {
110
167
  try {
168
+ self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onreadystatechange para readyState=2`);
111
169
  xhr.onreadystatechange();
112
170
  }
113
- catch (e) { }
171
+ catch (e) {
172
+ self.logger.debug(`❌ Erro ao chamar onreadystatechange(2):`, e);
173
+ }
114
174
  }
115
- }, 10);
116
- // readyState 3 = LOADING
175
+ }, 5);
117
176
  setTimeout(() => {
118
- xhr.readyState = 3;
177
+ setReadyState(3);
119
178
  if (xhr.onreadystatechange) {
120
179
  try {
180
+ self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onreadystatechange para readyState=3`);
121
181
  xhr.onreadystatechange();
122
182
  }
123
- catch (e) { }
183
+ catch (e) {
184
+ self.logger.debug(`❌ Erro ao chamar onreadystatechange(3):`, e);
185
+ }
124
186
  }
125
- }, 20);
126
- // readyState 4 = DONE (injetar resposta aqui)
187
+ }, 10);
188
+ // Final: readyState = 4 com propriedades configuradas
127
189
  setTimeout(() => {
128
- xhr.status = responseStatus;
129
- xhr.statusText = responseStatus >= 200 && responseStatus < 300 ? 'OK' : 'Error';
130
- xhr.responseText = responseJSON;
131
- xhr.response = mockResponse.response;
132
- xhr.readyState = 4;
133
- const duration = Date.now() - (xhr._fluwaStartTime || 0);
134
- requestMetadata.duration = duration;
135
- self.requestLogger.logComplete(requestMetadata).catch(() => { });
136
- // Chamar evento final
190
+ setReadyState(4);
137
191
  if (xhr.onreadystatechange) {
138
192
  try {
193
+ self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onreadystatechange para readyState=4`);
139
194
  xhr.onreadystatechange();
140
195
  }
141
- catch (e) { }
196
+ catch (e) {
197
+ self.logger.debug(`❌ Erro ao chamar onreadystatechange(4):`, e);
198
+ }
142
199
  }
143
200
  if (xhr.onload) {
144
201
  try {
202
+ self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onload`);
145
203
  xhr.onload();
146
204
  }
147
- catch (e) { }
205
+ catch (e) {
206
+ self.logger.debug(`❌ Erro ao chamar onload:`, e);
207
+ }
148
208
  }
149
- }, 30);
150
- }
151
- catch (error) {
152
- self.logger.debug('Erro ao simular resposta mockada:', error);
153
- // Fallback: fazer request real
154
- self.originalSend.apply(xhr, [body]);
155
- }
156
- }, delay);
209
+ self.logger.debug(`✅ [XMLHttpRequestInterceptor] Simulação de resposta COMPLETA`);
210
+ }, 15);
211
+ }, delay);
212
+ });
157
213
  return;
158
214
  }
159
215
  // Sem mock - fazer request real
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluwa-tool/sdk",
3
- "version": "1.0.43",
3
+ "version": "1.0.45",
4
4
  "description": "Fluwa DevTools SDK for network interception and mocking",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",