From ceab2004075e4ac2185c92c949cf39e556d46b16 Mon Sep 17 00:00:00 2001 From: chulanovskyi Date: Mon, 17 Mar 2025 16:42:40 +0200 Subject: [PATCH] fix: use `createBlobDecoder` in browser environment for parsing `.avro` binary files --- reverse_engineering/helpers/fileHelper.js | 32 ++++++++++++++++------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/reverse_engineering/helpers/fileHelper.js b/reverse_engineering/helpers/fileHelper.js index 19ce0f8..2da138e 100644 --- a/reverse_engineering/helpers/fileHelper.js +++ b/reverse_engineering/helpers/fileHelper.js @@ -39,16 +39,28 @@ const readAvroData = (filePath, cb) => { null: (buf, cb) => cb(null, buf), }; - avro.createFileDecoder(filePath, { codecs }) - .on('metadata', type => { - try { - const schema = JSON.stringify(type); - return cb(null, schema); - } catch (error) { - return cb(error); - } - }) - .on('error', cb); + const processMetadata = metadata => { + try { + const schema = JSON.stringify(metadata); + return cb(null, schema); + } catch (error) { + return cb(error); + } + }; + + try { + avro.createFileDecoder(filePath, { codecs }).on('metadata', processMetadata).on('error', cb); + } catch (err) { + // In browser environment file decoder is unavailable, need to use a fallback strategy + if (err.toString().includes('createFileDecoder is not a function')) { + const avroBuffer = fs.readFileSync(filePath); + const avroBlob = new Blob([avroBuffer]); + + avro.createBlobDecoder(avroBlob).on('metadata', processMetadata).on('error', cb); + } else { + cb(err); + } + } }; const getExtension = filePath => path.extname(filePath);