Estoy tratando de decodificar un archivo .avro cargado desde un servidor web.
Dado que la versión de cadena de uInt8Array comienza con
"búfer de S3 Objavro.schema�{"tipo":"registro","nombre":"Destino",..."
Supongo que es un archivo de contenedor avro
Encontré ' avro.js ' y ' avsc ' como herramientas para trabajar con el formato .avro y javascript, pero al leer la documentación parece que la decodificación de un archivo contenedor solo es posible en Node.js, no en el navegador. (Los métodos FileDecoder/Encoder toman una ruta a un archivo como cadena, no como uInt8Array)
¿Me equivoco o hay una forma alternativa de decodificar un archivo contenedor .avro en el navegador con javascript?
¡Gracias por publicar!
A continuación se muestra mi integración de avro/binary con axios, en caso de que ayude a alguien más que intente implementar la decodificación del lado del navegador:
[ antes de navegar ]
const axios = require('axios') const avro = require('avsc') const config = { responseType: 'blob' }; const url = 'https://some-url.com' axios.get(url, config) .then(res => { avro.createBlobDecoder(res.data) .on('metadata', (type) => console.log(type)) .on('data', (record) => console.log(record)) }) .catch(e => console.error(e))Afortunadamente encontré una manera de usar avsc con broserify
avro.createBlobDecoder(blob, [{options}]) var avro = require('avsc'); const AVRO = { decodeBlob(blob) { let schema, columnTitles, columnTypes, records = [] return new Promise((resolve) => { avro.createBlobDecoder(blob, { // noDecode: true }) .on('metadata', (s) => { schema = s columnTitles = schema.fields.map(f => f.name) columnTypes = schema.fields.map(f => f.type) }) .on('data', (data) => { records.push(data) }) .on('finish', () => { resolve( { columnTitles: columnTitles, columnTypes: columnTypes, records: records } ) }) }) } } module.exports = AVRO "scripts": { "avro": "browserify public/avro.js --s AVRO > public/build/avro.js" } //s3.getObject => uInt8array const blob = new Blob([uInt8array]) //arr in brackets !important const avroDataObj = await AVRO.decodeBlob(blob)