@@ -12,6 +12,7 @@ const parquet_types = require('./types');
12
12
const BufferReader = require ( './bufferReader' ) ;
13
13
const bloomFilterReader = require ( './bloomFilterIO/bloomFilterReader' ) ;
14
14
const groupBy = require ( "lodash/groupBy" ) ;
15
+ const fetch = require ( 'cross-fetch' ) ;
15
16
16
17
const {
17
18
getBloomFiltersFor,
@@ -125,8 +126,8 @@ class ParquetReader {
125
126
* a `url` property.
126
127
* This function returns a new parquet reader
127
128
*/
128
- static async openUrl ( request , params , options ) {
129
- let envelopeReader = await ParquetEnvelopeReader . openUrl ( request , params , options ) ;
129
+ static async openUrl ( params , options ) {
130
+ let envelopeReader = await ParquetEnvelopeReader . openUrl ( params , options ) ;
130
131
return this . openEnvelopeReader ( envelopeReader , options ) ;
131
132
}
132
133
@@ -136,7 +137,9 @@ class ParquetReader {
136
137
}
137
138
try {
138
139
await envelopeReader . readHeader ( ) ;
140
+
139
141
let metadata = await envelopeReader . readFooter ( ) ;
142
+
140
143
return new ParquetReader ( metadata , envelopeReader , opts ) ;
141
144
} catch ( err ) {
142
145
await envelopeReader . close ( ) ;
@@ -373,7 +376,7 @@ class ParquetEnvelopeReader {
373
376
return new ParquetEnvelopeReader ( readFn , closeFn , fileStat , options ) ;
374
377
}
375
378
376
- static async openUrl ( request , params , options ) {
379
+ static async openUrl ( params , options ) {
377
380
if ( typeof params === 'string' )
378
381
params = { url : params } ;
379
382
if ( ! params . url )
@@ -382,34 +385,23 @@ class ParquetEnvelopeReader {
382
385
let base = params . url . split ( '/' ) ;
383
386
base = base . slice ( 0 , base . length - 1 ) . join ( '/' ) + '/' ;
384
387
385
- params . encoding = params . encoding || null ;
386
-
387
388
let defaultHeaders = params . headers || { } ;
388
389
389
- let filesize = async ( ) => new Promise ( ( resolve , reject ) => {
390
- let req = request ( params ) ;
391
- req . on ( 'response' , res => {
392
- req . abort ( ) ;
393
- resolve ( res . headers [ 'content-length' ] ) ;
394
- } ) ;
395
- req . on ( 'error' , reject ) ;
396
- } ) ;
390
+ let filesize = async ( ) => {
391
+
392
+ const { headers } = await fetch ( params . url ) ;
393
+ return headers . get ( 'Content-Length' ) ;
394
+ } ;
397
395
398
- let readFn = ( offset , length , file ) => {
396
+ let readFn = async ( offset , length , file ) => {
399
397
let url = file ? base + file : params . url ;
400
-
401
398
let range = `bytes=${ offset } -${ offset + length - 1 } ` ;
402
399
let headers = Object . assign ( { } , defaultHeaders , { range} ) ;
403
- let req = Object . assign ( { } , params , { headers, url} ) ;
404
- return new Promise ( ( resolve , reject ) => {
405
- request ( req , ( err , res ) => {
406
- if ( err ) {
407
- reject ( err ) ;
408
- } else {
409
- resolve ( res . body ) ;
410
- }
411
- } ) ;
412
- } ) ;
400
+ const response = await fetch ( url , { headers } ) ;
401
+ const arrayBuffer = await response . arrayBuffer ( ) ;
402
+ const buffer = Buffer . from ( arrayBuffer ) ;
403
+
404
+ return buffer ;
413
405
} ;
414
406
415
407
let closeFn = ( ) => ( { } ) ;
@@ -436,6 +428,7 @@ class ParquetEnvelopeReader {
436
428
437
429
readHeader ( ) {
438
430
return this . read ( 0 , PARQUET_MAGIC . length ) . then ( buf => {
431
+
439
432
if ( buf . toString ( ) != PARQUET_MAGIC ) {
440
433
throw 'not valid parquet file'
441
434
}
@@ -623,7 +616,9 @@ class ParquetEnvelopeReader {
623
616
if ( typeof this . fileSize === 'function' ) {
624
617
this . fileSize = await this . fileSize ( ) ;
625
618
}
619
+
626
620
let trailerLen = PARQUET_MAGIC . length + 4 ;
621
+
627
622
let trailerBuf = await this . read ( this . fileSize - trailerLen , trailerLen ) ;
628
623
629
624
if ( trailerBuf . slice ( 4 ) . toString ( ) != PARQUET_MAGIC ) {
0 commit comments