From 03befc14a5f9554627f41d1e9def5167fc45697b Mon Sep 17 00:00:00 2001 From: Kenny Daniel Date: Sun, 19 May 2024 21:38:13 -0700 Subject: [PATCH] Brotli --- package.json | 3 +++ rollup.config.js | 2 ++ src/index.js | 4 +++- test/brotli.test.js | 17 +++++++++++++++++ test/files/brotli_compressed.json | 22 ++++++++++++++++++++++ test/files/brotli_compressed.parquet | Bin 0 -> 2805 bytes 6 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 test/brotli.test.js create mode 100644 test/files/brotli_compressed.json create mode 100644 test/files/brotli_compressed.parquet diff --git a/package.json b/package.json index 6e62e73..2cde329 100644 --- a/package.json +++ b/package.json @@ -26,13 +26,16 @@ "test": "vitest run" }, "dependencies": { + "brotli": "1.3.3", "hysnappy": "0.3.1", "pako": "2.1.0" }, "devDependencies": { "@babel/eslint-parser": "7.24.5", + "@rollup/plugin-commonjs": "25.0.7", "@rollup/plugin-node-resolve": "15.2.3", "@rollup/plugin-terser": "0.4.4", + "@types/brotli": "1.3.4", "@types/node": "20.12.12", "@types/pako": "2.0.3", "@vitest/coverage-v8": "1.6.0", diff --git a/rollup.config.js b/rollup.config.js index 296f042..0c91b55 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,3 +1,4 @@ +import commonjs from '@rollup/plugin-commonjs' import resolve from '@rollup/plugin-node-resolve' import terser from '@rollup/plugin-terser' @@ -10,6 +11,7 @@ export default { }, plugins: [ resolve(), // resolve node dependencies + commonjs(), // convert commonjs to es6 terser(), // minify ], } diff --git a/src/index.js b/src/index.js index f790287..5dec0f4 100644 --- a/src/index.js +++ b/src/index.js @@ -1,3 +1,5 @@ +// @ts-ignore +import BROTLI from 'brotli/decompress' import { snappyUncompressor } from 'hysnappy' import pako from 'pako' import { LZ4, LZ4_RAW } from './lz4.js' @@ -8,7 +10,7 @@ import { LZ4, LZ4_RAW } from './lz4.js' export const compressors = { SNAPPY: snappyUncompressor(), GZIP: input => pako.ungzip(input), - BROTLI: () => new Uint8Array(), // TODO + BROTLI, ZSTD: () => new Uint8Array(), // TODO LZ4, LZ4_RAW, diff --git a/test/brotli.test.js b/test/brotli.test.js new file mode 100644 index 0000000..75c6fd4 --- /dev/null +++ b/test/brotli.test.js @@ -0,0 +1,17 @@ +import fs from 'fs' +import { parquetRead, toJson } from 'hyparquet' +import { describe, expect, it } from 'vitest' +import { compressors } from '../src/index.js' + +describe('brotli compressor', () => { + it('read brotli compressed parquet file brotli_compressed', async () => { + const buffer = fs.readFileSync('test/files/brotli_compressed.parquet') + const file = new Uint8Array(buffer).buffer + const expected = fs.readFileSync('test/files/brotli_compressed.json').toString() + + await parquetRead({ file, compressors, onComplete: data => { + expect(data.length).toBe(4) + expect(toJson(data)).toEqual(JSON.parse(expected)) + } }) + }) +}) diff --git a/test/files/brotli_compressed.json b/test/files/brotli_compressed.json new file mode 100644 index 0000000..9956d35 --- /dev/null +++ b/test/files/brotli_compressed.json @@ -0,0 +1,22 @@ +[ + [ + 1593604800, + [97, 98, 99], + 42 + ], + [ + 1593604800, + [100, 101, 102], + 7.7 + ], + [ + 1593604801, + [97, 98, 99], + 42.125 + ], + [ + 1593604801, + [100, 101, 102], + 7.7 + ] +] diff --git a/test/files/brotli_compressed.parquet b/test/files/brotli_compressed.parquet new file mode 100644 index 0000000000000000000000000000000000000000..2e1ee6b586dee9e655f9b2eef2285cdb5fb74baf GIT binary patch literal 2805 zcmcIm&yU(h6do2zXu5}06;o(YwX#~2!)9wcuwxdW!&N)(|{4U_uDi z8RnCD9`VOfP^y|vCd2Gp$YKXwje+R6x(?f&-8vbyuXs_w_>gl{jT}LlLrL-6(+MtEkHqNWA9cf z@#`;Se0+;gdr=FTr)SizMGXY7E@ha@GtALrJ_P++B>6`q`y`%y{tnQ4(amd|uSzLh z%cE4>*L$X;GI8Mh(=}2<#H>?+N6cjqNMw{uq%-N8Z?oF}w?c23t>pKyWFnhLzKmT# zD7}@6d#Y=we(KNIBi3>ab8@H;?2+U8?2XN@9}1ODJZ#b0{n~*vU~A zmN3lK3lIoFr(1wzmKLk?D}qqnxggp!0Ga@hyA)()q8FmTJAN_DOnEL&#~!FF(^)W_ zPl(oYXsW?rNNKh$ZKw{Xgk^844u^v=iGFMjeQV$nEuY`!wmBA`4DF@|$6QztOfL-1_Fzc6mg`J;BLj&bD(&KEux9ebpdrCdwcKh`Qzpt*JHj#bdi zX?3W=Ua>#uif*;1IfgA-=_yI#IF^xrC)FMbhiOIJf5wO^`f{V-fs9} zv3g>Zr7`hSZ}A4Pw}oBbkoi$d2xBX)dCXB;=54Z9b0uFZl6Z=z$djX%up(}`1lUU_ zt?SLaUM85ZWypCC{2wU?B8d$c`LQYOa%QVQ{ff@6r8-jIC{lZ%w3YT%_Pho#40RGN!L0%`=BKawfZENLbM{`O6;Mf5i{dyR0 z#{YiDsMzC~&C}e5upio2;I&7_?KT&3&)Y`11odn7<{VWxpWt4K73S`!vg9kJ-8rYC zQ=d>jZUO2EHRBg~spg?hC$k#!TC0#>hYHdwZ|rV{X$|)KGCI$L-dC zaiaK|P~!Ic4eDQ$C9W+udq#P0{$6$@;01Ws9SQWiQ^FU#)4nQKr|niXPu8Ma$b&r9 zuIto~;Yd?mu#Yv1)J&Z0ALPchKDIgs@E-olnV__)C#t+VqCWcKsD6;+M3*D2MtT|> zRHFR{{fhC!yU_2XJsWk}sTHD}w?2r(R%uT{YnwE7IqX-mPsGCfe1o0`BaE}F14I(4 zT%W)b;x$PBLu+GlnLz)yq3ba;{LDxMV(rmc4;NG>4|1nqc#mOpNiuL=50ykkJi