@fluwa-tool/sdk 1.0.45 → 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.
@@ -91,124 +91,137 @@ class XMLHttpRequestInterceptor {
91
91
  requestMetadata.status = mockResponse.status || 200;
92
92
  requestMetadata.response = mockResponse.response;
93
93
  const delay = mockResponse.delay || 0;
94
- // Aguardar axios anexar seus handlers (envolver em Promise.resolve para dar tempo)
94
+ // Aguardar axios anexar seus handlers
95
+ // Usar múltiplos microtasks e macrotasks para garantir timing correto
95
96
  Promise.resolve().then(() => {
96
- self.logger.debug(`⏱️ [XMLHttpRequestInterceptor] Iniciando simulação de resposta com delay: ${delay}ms`);
97
+ // Dar 50ms extra para axios configurar tudo
97
98
  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
152
- setTimeout(() => {
153
- setReadyState(1);
154
- 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) => {
155
106
  try {
156
- self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onreadystatechange para readyState=1`);
157
- xhr.onreadystatechange();
107
+ Object.defineProperty(xhr, 'readyState', {
108
+ value: state,
109
+ writable: true,
110
+ configurable: true,
111
+ });
112
+ self.logger.debug(`📊 [XMLHttpRequestInterceptor] readyState = ${state}`);
158
113
  }
159
114
  catch (e) {
160
- self.logger.debug(`❌ Erro ao chamar onreadystatechange(1):`, e);
115
+ // Fallback: try direct assignment se defineProperty falhar
116
+ xhr.readyState = state;
117
+ self.logger.debug(`📊 [XMLHttpRequestInterceptor] readyState = ${state} (fallback)`);
161
118
  }
162
- }
163
- }, 0);
164
- setTimeout(() => {
165
- setReadyState(2);
166
- 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)
167
124
  try {
168
- self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onreadystatechange para readyState=2`);
169
- xhr.onreadystatechange();
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}`);
170
131
  }
171
- catch (e) {
172
- self.logger.debug(`❌ Erro ao chamar onreadystatechange(2):`, e);
132
+ catch (statusErr) {
133
+ self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] Não foi possível setar status:`, statusErr);
173
134
  }
174
- }
175
- }, 5);
176
- setTimeout(() => {
177
- setReadyState(3);
178
- if (xhr.onreadystatechange) {
135
+ // Override responseText (read-only property in Hermes)
179
136
  try {
180
- self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onreadystatechange para readyState=3`);
181
- xhr.onreadystatechange();
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`);
182
143
  }
183
- catch (e) {
184
- self.logger.debug(`❌ Erro ao chamar onreadystatechange(3):`, e);
144
+ catch (textErr) {
145
+ self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] Não foi possível setar responseText:`, textErr);
185
146
  }
186
- }
187
- }, 10);
188
- // Final: readyState = 4 com propriedades já configuradas
189
- setTimeout(() => {
190
- setReadyState(4);
191
- if (xhr.onreadystatechange) {
147
+ // Override response (read-only property in Hermes)
192
148
  try {
193
- self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onreadystatechange para readyState=4`);
194
- xhr.onreadystatechange();
149
+ Object.defineProperty(xhr, 'response', {
150
+ value: mockResponse.response,
151
+ writable: true,
152
+ configurable: true,
153
+ });
154
+ self.logger.debug(`✅ [XMLHttpRequestInterceptor] response configurado`);
195
155
  }
196
- catch (e) {
197
- self.logger.debug(`❌ Erro ao chamar onreadystatechange(4):`, e);
156
+ catch (respErr) {
157
+ self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] Não foi possível setar response:`, respErr);
198
158
  }
199
159
  }
200
- if (xhr.onload) {
201
- try {
202
- self.logger.debug(`📞 [XMLHttpRequestInterceptor] Chamando onload`);
203
- xhr.onload();
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
+ }
204
198
  }
205
- catch (e) {
206
- self.logger.debug(`❌ Erro ao chamar onload:`, e);
199
+ else {
200
+ self.logger.debug(`⚠️ [XMLHttpRequestInterceptor] onreadystatechange NÃO DEFINIDO em readyState=4`);
207
201
  }
208
- }
209
- self.logger.debug(`✅ [XMLHttpRequestInterceptor] Simulação de resposta COMPLETA`);
210
- }, 15);
211
- }, delay);
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
212
225
  });
213
226
  return;
214
227
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluwa-tool/sdk",
3
- "version": "1.0.45",
3
+ "version": "1.0.46",
4
4
  "description": "Fluwa DevTools SDK for network interception and mocking",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",