concatenação parcial de dados num arquivo s3
npm install brcap-paginacao-s3javascript
const { uploadControlado } = require('brcap-dbf');
const finalMultipart = await uploadControlado({
path: 'path/do/arquivo.dbf',
bucket: 'nome-do-bucket',
total: 100, // total de páginas
paginasPorVez: 10, // limitador do buffer de quantas páginas por vez
// este parâmetro determina quantas conexões simultâneas serão feitas
// NO MÁXIMO pela lib
paginaDisponivel: async (pagina) => { // função/promise para fornecer a página
// por exemplo, calcular limit e offset a partir de uma página
const resultadosQuery = await ModelSequelize.all({
where: {
//...
},
limit,
offset
});
return resultadosQuery.map(({ dataValues }) => dataValues);
},
});
// a variável de retorno será o retorno do complete multipart da amazon
`
#### 2. Opção com maior controle e escalável: 3 funções
São fornecidas as funções criaArquivo, concatenaPagina, finalizaArquivo que poderão ser
usadas para uma solução escalável dentro da própria amazon, em que a parte escalável ficaria
concentrada no uso da função concatenaPagina. Abaixo um exemplo de uso.
`javascript
const {
criaArquivo,
concatenaPagina,
finalizaArquivo,
} = require('brcap-dbf');
// cria o upload e sobe a primeira página com a função criaArquivo
const multipart = await criaArquivo({
path,
bucket,
dados: dadosDaPrimeiraPagina,
});
// o retorno será o multipart da amazon, da primeira parte,
// mais os dados necessários para terminar o processo
// a promise concatena pagina pode ser usada com o objeto retornado
// do arquivo criado. Cada uma dessas promises poderia estar
// por exemplo numa lambda, e seus resultados (junto com o objeto
// multipart) irem para uma outra lambda que invoque a finalização
const parts = await Promise.all(paginas.map((pagina) => concatenaPagina({
path,
bucket,
multipart,
dados: geraPagina(pagina), // como no exemplo anterior
pagina, // número da página, NECESSARIAMENTE COMEÇANDO DE 2, pois a primeira página
// foi subida na função criaArquivo. Assim como a última será informada na função
// final finalizaArquivo
})));
// o retorno da função é idêntico ao da uploadControlado
const finalMultipart = await finalizaArquivo({
...params,
dados: ultimaPagina(),
multipart,
parts,
});
`
Desenvolvimento
Para rodar os testes, npm test. Os testes de integração rodam via npm run integration e demoram em torno de 12 MINUTOS para terminar. E de fato sobem arquivos. Aconselhável checar o código antes de rodar os testes de integração. Os testes unitários rodam em 10 segundos. Para verificar a cobertura de código, npx jest test --coverage. Importante o argumento test para que não rode os testes de integração. Uma página HTML com as informações de cobertura de testes pode ser visualizada com o comando npx http-server coverage/lcov-report -p 1234` no endereço http://localhost:1234/.