All files / packages/core/src middleware.ts

100% Statements 21/21
90% Branches 9/10
100% Functions 4/4
100% Lines 20/20

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52      54x   54x 1371x 1371x 1371x   255x 255x 22x 233x 224x   9x     255x   1311x 1056x                         54x     40x   40x   40x 40x           2091x    
import { loggers } from '@ydbjs/debug'
import { ClientError, type ClientMiddleware } from 'nice-grpc'
 
let log = loggers.grpc
 
export const debug: ClientMiddleware = async function* (call, options) {
	let hasError = false
	try {
		return yield* call.next(call.request, options)
	} catch (error) {
		hasError = true
		if (error instanceof ClientError) {
			log.log('%s', error.message)
		} else if (error instanceof Error && error.name === 'AbortError') {
			log.log('%s %s: %s', call.method.path, 'CANCELLED', error.message)
		} else {
			log.log('%s %s: %s', call.method.path, 'UNKNOWN', error)
		}
 
		throw error
	} finally {
		if (!hasError) {
			log.log('%s %s', call.method.path, 'OK')
		}
	}
}
 
// Process-global middleware registry. Drivers compose registered entries
// into their gRPC client middleware chain at construction time. Used by
// `@ydbjs/telemetry` to install W3C trace context propagation without
// pulling `@opentelemetry/api` into `@ydbjs/core`.
//
// Timing: `addClientMiddleware()` must run **before** `new Driver(...)` for
// the middleware to apply. Matches OTel's NodeSDK.start() pattern — start
// instrumentation, then create application objects.
let registeredMiddlewares: ClientMiddleware[] = []
 
export function addClientMiddleware(mw: ClientMiddleware): Disposable {
	registeredMiddlewares.push(mw)
 
	return {
		[Symbol.dispose]() {
			let i = registeredMiddlewares.indexOf(mw)
			Eif (i >= 0) registeredMiddlewares.splice(i, 1)
		},
	}
}
 
export function getRegisteredClientMiddlewares(): readonly ClientMiddleware[] {
	return registeredMiddlewares
}