feat: support per-request header override (#2631)

## Summary

This PR introduces a `HeaderProvider` which is called for all remote
HTTP calls to get the latest headers to inject. This is useful for
features like adding the latest auth tokens where the header provider
can auto-refresh tokens internally and each request always set the
refreshed token.

---------

Co-authored-by: Claude <noreply@anthropic.com>
This commit is contained in:
Jack Ye
2025-09-10 13:44:00 -07:00
committed by GitHub
parent 3c7419b392
commit 8da74dcb37
31 changed files with 2639 additions and 49 deletions

View File

@@ -2,12 +2,14 @@
// SPDX-FileCopyrightText: Copyright The LanceDB Authors
use std::collections::HashMap;
use std::sync::Arc;
use lancedb::database::CreateTableMode;
use napi::bindgen_prelude::*;
use napi_derive::*;
use crate::error::NapiErrorExt;
use crate::header::JsHeaderProvider;
use crate::table::Table;
use crate::ConnectionOptions;
use lancedb::connection::{ConnectBuilder, Connection as LanceDBConnection};
@@ -45,7 +47,11 @@ impl Connection {
impl Connection {
/// Create a new Connection instance from the given URI.
#[napi(factory)]
pub async fn new(uri: String, options: ConnectionOptions) -> napi::Result<Self> {
pub async fn new(
uri: String,
options: ConnectionOptions,
header_provider: Option<&JsHeaderProvider>,
) -> napi::Result<Self> {
let mut builder = ConnectBuilder::new(&uri);
if let Some(interval) = options.read_consistency_interval {
builder =
@@ -57,8 +63,16 @@ impl Connection {
}
}
// Create client config, optionally with header provider
let client_config = options.client_config.unwrap_or_default();
builder = builder.client_config(client_config.into());
let mut rust_config: lancedb::remote::ClientConfig = client_config.into();
if let Some(provider) = header_provider {
rust_config.header_provider =
Some(Arc::new(provider.clone()) as Arc<dyn lancedb::remote::HeaderProvider>);
}
builder = builder.client_config(rust_config);
if let Some(api_key) = options.api_key {
builder = builder.api_key(&api_key);