Manipular resposta XMLHttpRequest com dados grandes
No Chrome, configurei umXMLHttpRequest
:
const xhr = new XMLHttpRequest();
xhr.open(method, url, true);
...
xhr.onreadystatechange = () => {
if (xhr.readyState === XMLHttpRequest.DONE) {
if (isStatusCodeSuccess(xhr.status)) {
// handle response;
} else {
// handle error
}
}
};
xhr.addEventListener('progress', event => {
console.log(event.loaded, event.target.response.length);
});
xhr.send(data);
Em algum momento, solicito alguns dados JSON cujo tamanho total é de cerca de 295 MB não compactado / 5,8 MB compactado. Infelizmente, quando o código a seguir é chamado com êxito, a resposta é uma sequência vazia.
Usando o ouvinte de eventos de progresso, posso ver que a resposta é tratada corretamente, pedaço por pedaço, até um determinado ponto. Aqui está um trecho dos logs do console que ele produz:
32768 32768
4639135 4639135
7376739 7376739
11525403 11525403
...
261489180 261489180
264684030 264684030
267880247 267880247
271037819 0
274232442 0
277428774 0
...
304018210 0
309230213 0
310445469 0
Parece que há uma limitação de cadeia / alocação no Chrome, mas não recebo nenhum erro.
No firefox, recebo o seguinte erro:InternalError: allocation size overflow
.
Tentei armazenar o resultado, mas não consigo "esvaziar" o objeto Xml Http Request, pois os atributos são somente leitura.
Qual é a limitação oficial para variáveis em navegadores? Não consegui encontrar uma resposta oficial, apenas algumas experimentaisLimite de tamanho de string Javascript: 256 MB para mim - é o mesmo para todos os navegadores?
Existe alguma maneira de solucionar esse problema e lidar com grandes resultados do POST? além de usar o WebSocket.
Estou pensando em:
tipo de conteúdo específico para transmitir os dados, como oapplication/octet-stream
parâmetro específico para manipular os dados por partes, como oalcance cabeçalho, embora o conteúdo que estou buscando não seja estático (ele muda com o tempo)algoritmo conhecido para reduzir o comprimento da resposta JSON, onde posso descompactar parte por parte dos dados para evitar atingir a limitação acima