From 832ef285058425d5f631188d4c28863066976d88 Mon Sep 17 00:00:00 2001 From: Anush008 Date: Wed, 18 Mar 2026 13:58:15 +0530 Subject: [PATCH] feat: Support for tracing ID headers Signed-off-by: Anush008 --- packages/js-client-grpc/src/api-client.ts | 5 +++++ packages/js-client-grpc/src/context-headers.ts | 15 +++++++++++++++ packages/js-client-grpc/src/index.ts | 1 + packages/js-client-rest/package.json | 2 +- packages/js-client-rest/src/api-client.ts | 9 +++++++++ packages/js-client-rest/src/context-headers.ts | 15 +++++++++++++++ packages/js-client-rest/src/index.ts | 1 + pnpm-lock.yaml | 10 +++++----- 8 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 packages/js-client-grpc/src/context-headers.ts create mode 100644 packages/js-client-rest/src/context-headers.ts diff --git a/packages/js-client-grpc/src/api-client.ts b/packages/js-client-grpc/src/api-client.ts index 309177e..70bd87c 100644 --- a/packages/js-client-grpc/src/api-client.ts +++ b/packages/js-client-grpc/src/api-client.ts @@ -7,6 +7,7 @@ import {Qdrant} from './proto/qdrant_pb.js'; import {PACKAGE_VERSION} from './client-version.js'; import {QdrantClientResourceExhaustedError} from './errors.js'; import {Compression} from '@connectrpc/connect/protocol'; +import {getContextHeaders} from './context-headers.js'; type Clients = { collections: Client; @@ -99,6 +100,10 @@ export function createApis(baseUrl: string, {timeout, apiKey, compression, heade return next(req); }); } + interceptors.push((next) => (req) => { + for (const [key, value] of Object.entries(getContextHeaders())) req.header.set(key, value); + return next(req); + }); if (Number.isFinite(timeout)) { interceptors.push((next) => async (req) => { const controller = new AbortController(); diff --git a/packages/js-client-grpc/src/context-headers.ts b/packages/js-client-grpc/src/context-headers.ts new file mode 100644 index 0000000..4e26cb5 --- /dev/null +++ b/packages/js-client-grpc/src/context-headers.ts @@ -0,0 +1,15 @@ +let _current: Record = {}; + +export function withHeaders(headers: Record, fn: () => T): T { + const previous = _current; + _current = {...previous, ...headers}; + try { + return fn(); + } finally { + _current = previous; + } +} + +export function getContextHeaders(): Record { + return _current; +} diff --git a/packages/js-client-grpc/src/index.ts b/packages/js-client-grpc/src/index.ts index 04c8c43..612eb74 100644 --- a/packages/js-client-grpc/src/index.ts +++ b/packages/js-client-grpc/src/index.ts @@ -1,4 +1,5 @@ export {QdrantClient, QdrantClientParams} from './qdrant-client.js'; +export {withHeaders} from './context-headers.js'; export * from './errors.js'; export {ConnectError, Code as ConnectErrorCode} from '@connectrpc/connect'; export * from './proto/collections_pb.js'; diff --git a/packages/js-client-rest/package.json b/packages/js-client-rest/package.json index 7e5e47f..803b3c5 100644 --- a/packages/js-client-rest/package.json +++ b/packages/js-client-rest/package.json @@ -55,7 +55,7 @@ }, "dependencies": { "@qdrant/openapi-typescript-fetch": "1.2.6", - "undici": "^6.23.0" + "undici": "^6.24.0" }, "devDependencies": { "@rollup/plugin-commonjs": "^24.1.0", diff --git a/packages/js-client-rest/src/api-client.ts b/packages/js-client-rest/src/api-client.ts index 404796b..6fcd5fd 100644 --- a/packages/js-client-rest/src/api-client.ts +++ b/packages/js-client-rest/src/api-client.ts @@ -9,6 +9,7 @@ import { import {RestArgs} from './types.js'; import {createClientApi} from './openapi/generated_api_client.js'; import {ClientApi} from './openapi/generated_client_type.js'; +import {getContextHeaders} from './context-headers.js'; export type Client = ReturnType>; @@ -21,6 +22,14 @@ export type OpenApiClient = ReturnType; export function createClient(baseUrl: string, {headers, timeout, connections}: RestArgs): Client { const use: Middleware[] = []; + use.push((url, init, next) => { + const ctx = getContextHeaders(); + const entries = Object.entries(ctx); + if (entries.length === 0) return next(url, init); + const merged = new Headers(init.headers as HeadersInit); + for (const [key, value] of entries) merged.set(key, value); + return next(url, {...init, headers: merged}); + }); if (Number.isFinite(timeout)) { use.push(async (url, init, next) => { const controller = new AbortController(); diff --git a/packages/js-client-rest/src/context-headers.ts b/packages/js-client-rest/src/context-headers.ts new file mode 100644 index 0000000..4e26cb5 --- /dev/null +++ b/packages/js-client-rest/src/context-headers.ts @@ -0,0 +1,15 @@ +let _current: Record = {}; + +export function withHeaders(headers: Record, fn: () => T): T { + const previous = _current; + _current = {...previous, ...headers}; + try { + return fn(); + } finally { + _current = previous; + } +} + +export function getContextHeaders(): Record { + return _current; +} diff --git a/packages/js-client-rest/src/index.ts b/packages/js-client-rest/src/index.ts index a75f826..36d7269 100644 --- a/packages/js-client-rest/src/index.ts +++ b/packages/js-client-rest/src/index.ts @@ -1,3 +1,4 @@ export {QdrantClient, QdrantClientParams} from './qdrant-client.js'; +export {withHeaders} from './context-headers.js'; export {Schemas} from './types.js'; export * from './errors.js'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3dcb41f..68c392e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -88,8 +88,8 @@ importers: specifier: '>=4.7' version: 5.0.4 undici: - specifier: ^6.23.0 - version: 6.23.0 + specifier: ^6.24.0 + version: 6.24.1 devDependencies: '@rollup/plugin-commonjs': specifier: ^24.1.0 @@ -1803,8 +1803,8 @@ packages: resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} - undici@6.23.0: - resolution: {integrity: sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==} + undici@6.24.1: + resolution: {integrity: sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==} engines: {node: '>=18.17'} uri-js@4.4.1: @@ -3455,7 +3455,7 @@ snapshots: dependencies: '@fastify/busboy': 2.1.0 - undici@6.23.0: {} + undici@6.24.1: {} uri-js@4.4.1: dependencies: