Unified Arrow Flight and Flight SQL client for JavaScript and TypeScript runtimes. Provides complete gRPC client support for Apache Arrow Flight and Flight SQL protocols.
bun add @qualithm/arrow-flight-client
# or
npm install @qualithm/arrow-flight-client
import { createFlightClient, decodeFlightDataToTable } from "@qualithm/arrow-flight-client"
const client = createFlightClient({
url: "http://localhost:50051",
auth: { type: "bearer", token: "your-token" }
})
// List available flights
for await (const info of client.listFlights()) {
console.log(info.flightDescriptor?.path)
}
// Fetch data
const flightInfo = await client.getFlightInfo({ type: "path", path: ["my", "dataset"] })
const ticket = flightInfo.endpoint[0].ticket
const table = await decodeFlightDataToTable(client.doGet(ticket))
console.log(`Received ${table.numRows} rows`)
client.close()
import { createFlightClient, decodeFlightDataToTable } from "@qualithm/arrow-flight-client"
// Create a client
const client = createFlightClient({
url: "http://localhost:50051",
auth: { type: "bearer", token: "your-token" }
})
// List available flights
for await (const info of client.listFlights()) {
console.log(info.flightDescriptor?.path)
}
// Fetch data
const flightInfo = await client.getFlightInfo({ type: "path", path: ["my", "dataset"] })
const ticket = flightInfo.endpoint[0].ticket
const table = await decodeFlightDataToTable(client.doGet(ticket))
console.log(`Received ${table.numRows} rows`)
// Clean up
client.close()
import { createFlightSqlClient } from "@qualithm/arrow-flight-client"
const client = createFlightSqlClient({
url: "http://localhost:50051",
auth: { type: "bearer", token: "your-token" }
})
// Execute a query
const table = await client.query("SELECT * FROM users LIMIT 10")
console.log(`Got ${table.numRows} rows`)
// Stream large results
for await (const batch of client.queryBatches("SELECT * FROM large_table")) {
console.log(`Batch: ${batch.numRows} rows`)
}
// Prepared statements
const stmt = await client.prepare("SELECT * FROM users WHERE id = ?")
const result = await client.executePrepared(stmt)
await client.closePreparedStatement(stmt)
// Transactions
const txn = await client.beginTransaction()
try {
await client.executeUpdate("INSERT INTO users (name) VALUES ('Alice')", {
transactionId: txn.id
})
await client.commit(txn)
} catch {
await client.rollback(txn)
}
// Database metadata
const catalogs = await client.getCatalogs()
const schemas = await client.getDbSchemas({})
const tables = await client.getTables({})
client.close()
const client = createFlightClient({
url: "https://flight-server:50051",
auth: { type: "bearer", token: "your-api-token" }
})
const client = createFlightClient({
url: "https://flight-server:50051",
auth: {
type: "basic",
credentials: { username: "user", password: "pass" }
}
})
// Authenticate (performs Flight Handshake RPC)
await client.authenticate()
import { readFileSync } from "node:fs"
const client = createFlightClient({
url: "https://flight-server:50051",
tls: {
ca: readFileSync("ca.pem"),
cert: readFileSync("client.pem"),
key: readFileSync("client-key.pem")
}
})
import {
encodeTableToFlightData,
decodeFlightDataToTable,
decodeFlightDataStream
} from "@qualithm/arrow-flight-client"
import { tableFromArrays } from "apache-arrow"
// Create Arrow data
const table = tableFromArrays({
id: Int32Array.from([1, 2, 3]),
name: ["Alice", "Bob", "Charlie"]
})
// Encode for upload
const flightData = encodeTableToFlightData(table)
// Decode a stream
const receivedTable = await decodeFlightDataToTable(flightDataStream)
// Stream batches
for await (const batch of decodeFlightDataStream(flightDataStream)) {
console.log(`Batch: ${batch.numRows} rows`)
}
import {
FlightError,
FlightConnectionError,
FlightAuthError,
FlightServerError,
FlightTimeoutError
} from "@qualithm/arrow-flight-client"
try {
await client.query("SELECT * FROM users")
} catch (error) {
if (FlightConnectionError.isError(error)) {
console.error("connection failed:", error.message)
} else if (FlightAuthError.isError(error)) {
console.error("authentication failed:", error.message)
} else if (FlightServerError.isError(error)) {
console.error("server error:", error.message)
} else if (FlightTimeoutError.isError(error)) {
console.error("request timed out:", error.message)
} else if (FlightError.isError(error)) {
console.error("flight error:", error.message)
}
}
Full API documentation is generated with TypeDoc:
bun run docs
# Output in docs/
See the examples/ directory for runnable examples:
| Example | Description |
|---|---|
flight-client.ts |
FlightClient operations |
flight-sql-client.ts |
FlightSqlClient SQL operations |
bun run examples/flight-client.ts
bun install
bun run build
bun run test # unit tests
bun run test:integration # integration tests (requires Flight server)
bun run test:coverage # with coverage report
bun run lint
bun run format
bun run typecheck
bun run bench # Server benchmarks (requires Flight server)
bun run bench:ipc # Arrow IPC benchmarks
The package is automatically published to NPM when CI passes on main. Update the version in
package.json before merging to trigger a new release.
Apache-2.0