Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions src/metadata.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,16 @@ function decode(/** @type {Uint8Array} */ value) {
* or a second request for up to the metadata size.
*
* @param {AsyncBuffer} asyncBuffer parquet file contents
* @param {MetadataOptions & { initialFetchSize?: number }} options initial fetch size in bytes (default 512kb)
* @param {import('../src/types.d.ts').MetadataAsyncOptions} options
* @returns {Promise<FileMetaData>} parquet metadata object
*/
export async function parquetMetadataAsync(asyncBuffer, { parsers, initialFetchSize = defaultInitialFetchSize, geoparquet = true } = {}) {
export async function parquetMetadataAsync(asyncBuffer, { parsers, initialFetchSize = defaultInitialFetchSize, suffixStart, geoparquet = true } = {}) {
if (!asyncBuffer || !(asyncBuffer.byteLength >= 0)) throw new Error('parquet expected AsyncBuffer')

// fetch last bytes (footer) of the file
const footerOffset = Math.max(0, asyncBuffer.byteLength - initialFetchSize)
// suffixStart overrides initialFetchSize - allows caller to specify exact start offset
const footerOffset = suffixStart ?? Math.max(0, asyncBuffer.byteLength - initialFetchSize)
const fetchSize = asyncBuffer.byteLength - footerOffset
const footerBuffer = await asyncBuffer.slice(footerOffset, asyncBuffer.byteLength)

// Check for parquet magic number "PAR1"
Expand All @@ -56,7 +58,7 @@ export async function parquetMetadataAsync(asyncBuffer, { parsers, initialFetchS
}

// check if metadata size fits inside the initial fetch
if (metadataLength + 8 > initialFetchSize) {
if (metadataLength + 8 > fetchSize) {
// fetch the rest of the metadata
const metadataOffset = asyncBuffer.byteLength - metadataLength - 8
const metadataBuffer = await asyncBuffer.slice(metadataOffset, footerOffset)
Expand Down
8 changes: 8 additions & 0 deletions src/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,14 @@ export interface MetadataOptions {
geoparquet?: boolean // parse geoparquet metadata and set logical type to geometry/geography for geospatial columns (default true)
}

/**
* Options for parquetMetadataAsync
*/
export interface MetadataAsyncOptions extends MetadataOptions {
initialFetchSize?: number // fetch last N bytes from EOF (default 512kb)
suffixStart?: number // if provided, fetch from this byte offset to EOF (overrides initialFetchSize)
}

/**
* Parquet query options for reading data
*/
Expand Down