// src/files/arrow.ts import { Table as Arrow, tableFromIPC, tableToIPC } from "apache-arrow"; export type { Table as Arrow } from "apache-arrow"; import type { JSONObject } from "../util/types"; export const ARROW_MIME_TYPE = "application/vnd.apache.arrow.file"; /** * Is a given object an Arrow table? */ export const isArrow = (obj: unknown): obj is Arrow => obj instanceof Arrow; /** * Is a given File a valid Arrow IPC file? */ export const isArrowFile = async (file: File): Promise => { try { const buffer = await file.arrayBuffer(); arrayBufferToArrow(buffer); return true; } catch {} return false; }; /** * Load an Arrow table from an IPC file, as an ArrayBuffer. */ export const arrayBufferToArrow = (arrayBuffer: ArrayBuffer): Arrow => { const arrow = tableFromIPC(new Uint8Array(arrayBuffer)); return arrow; }; /** * Convert an Arrow to an IPC file, as an ArrayBuffer. */ export const arrowToArrayBuffer = (arrow: Arrow): ArrayBuffer => { const array: Uint8Array = tableToIPC(arrow, "file"); return array.buffer as ArrayBuffer; }; /** * Convert an Apache Arrow table to an array of JSON row objects. */ export function arrowToJSON(arrow: Arrow): Record[] { const rows: Record[] = []; for (let i = 0; i < arrow.numRows; i++) { const row = arrow.get(i); if (row) { rows.push(row.toJSON()); } } return rows; }