@fluwa-tool/sdk 1.0.43 → 1.0.44

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,20 +82,64 @@ 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
86
  requestMetadata.source = types_1.RequestSource.MOCK;
87
87
  requestMetadata.status = mockResponse.status || 200;
88
88
  requestMetadata.response = mockResponse.response;
89
89
  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
90
+ // Aguardar axios anexar seus handlers (envolver em Promise.resolve para dar tempo)
91
+ Promise.resolve().then(() => {
92
+ setTimeout(() => {
93
+ const duration = Date.now() - (xhr._fluwaStartTime || 0);
94
+ requestMetadata.duration = duration;
95
+ self.requestLogger.logComplete(requestMetadata).catch(() => { });
96
+ // Simular readyState progression usando defineProperty (Hermes engine compat)
97
+ const setReadyState = (state) => {
98
+ try {
99
+ Object.defineProperty(xhr, 'readyState', {
100
+ value: state,
101
+ writable: true,
102
+ configurable: true,
103
+ });
104
+ }
105
+ catch (e) {
106
+ // Fallback: try direct assignment se defineProperty falhar
107
+ xhr.readyState = state;
108
+ }
109
+ };
110
+ // Primeiro: configurar todas as propriedades de resposta ANTES de começar readyState
111
+ try {
112
+ // Override status (read-only property in Hermes)
113
+ if (!Object.getOwnPropertyDescriptor(xhr, 'status')) {
114
+ Object.defineProperty(xhr, 'status', {
115
+ value: mockResponse.status || 200,
116
+ writable: true,
117
+ configurable: true,
118
+ });
119
+ }
120
+ // Override responseText (read-only property in Hermes)
121
+ if (!Object.getOwnPropertyDescriptor(xhr, 'responseText')) {
122
+ Object.defineProperty(xhr, 'responseText', {
123
+ value: JSON.stringify(mockResponse.response),
124
+ writable: true,
125
+ configurable: true,
126
+ });
127
+ }
128
+ // Override response (read-only property in Hermes)
129
+ if (!Object.getOwnPropertyDescriptor(xhr, 'response')) {
130
+ Object.defineProperty(xhr, 'response', {
131
+ value: mockResponse.response,
132
+ writable: true,
133
+ configurable: true,
134
+ });
135
+ }
136
+ }
137
+ catch (e) {
138
+ self.logger.debug('Erro ao injetar propriedades mock:', e);
139
+ }
140
+ // Agora simular readyState progression
97
141
  setTimeout(() => {
98
- xhr.readyState = 1;
142
+ setReadyState(1);
99
143
  if (xhr.onreadystatechange) {
100
144
  try {
101
145
  xhr.onreadystatechange();
@@ -103,37 +147,27 @@ class XMLHttpRequestInterceptor {
103
147
  catch (e) { }
104
148
  }
105
149
  }, 0);
106
- // readyState 2 = HEADERS_RECEIVED
107
150
  setTimeout(() => {
108
- xhr.readyState = 2;
151
+ setReadyState(2);
109
152
  if (xhr.onreadystatechange) {
110
153
  try {
111
154
  xhr.onreadystatechange();
112
155
  }
113
156
  catch (e) { }
114
157
  }
115
- }, 10);
116
- // readyState 3 = LOADING
158
+ }, 5);
117
159
  setTimeout(() => {
118
- xhr.readyState = 3;
160
+ setReadyState(3);
119
161
  if (xhr.onreadystatechange) {
120
162
  try {
121
163
  xhr.onreadystatechange();
122
164
  }
123
165
  catch (e) { }
124
166
  }
125
- }, 20);
126
- // readyState 4 = DONE (injetar resposta aqui)
167
+ }, 10);
168
+ // Final: readyState = 4 com propriedades configuradas
127
169
  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
170
+ setReadyState(4);
137
171
  if (xhr.onreadystatechange) {
138
172
  try {
139
173
  xhr.onreadystatechange();
@@ -146,14 +180,9 @@ class XMLHttpRequestInterceptor {
146
180
  }
147
181
  catch (e) { }
148
182
  }
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);
183
+ }, 15);
184
+ }, delay);
185
+ });
157
186
  return;
158
187
  }
159
188
  // 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.44",
4
4
  "description": "Fluwa DevTools SDK for network interception and mocking",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",