diff --git a/.changeset/eleven-timers-kick.md b/.changeset/eleven-timers-kick.md index a84a957f..8aa5ef38 100644 --- a/.changeset/eleven-timers-kick.md +++ b/.changeset/eleven-timers-kick.md @@ -1,5 +1,5 @@ --- -"@livekit/rtc-node": minor +"@livekit/rtc-node": patch --- Add typeguards for frame processors in order to avoid dual package hazard diff --git a/packages/livekit-rtc/src/audio_stream.ts b/packages/livekit-rtc/src/audio_stream.ts index 94181cb1..b98ed853 100644 --- a/packages/livekit-rtc/src/audio_stream.ts +++ b/packages/livekit-rtc/src/audio_stream.ts @@ -5,7 +5,7 @@ import type { UnderlyingSource } from 'node:stream/web'; import { AudioFrame } from './audio_frame.js'; import type { FfiEvent } from './ffi_client.js'; import { FfiClient, FfiClientEvent, FfiHandle } from './ffi_client.js'; -import { type FrameProcessor, isAudioFrameProcessor } from './frame_processor.js'; +import { type FrameProcessor, isFrameProcessor } from './frame_processor.js'; import { log } from './log.js'; import type { NewAudioStreamResponse } from './proto/audio_frame_pb.js'; import { AudioStreamType, NewAudioStreamRequest } from './proto/audio_frame_pb.js'; @@ -41,7 +41,7 @@ class AudioStreamSource implements UnderlyingSource { if (sampleRateOrOptions !== undefined && typeof sampleRateOrOptions !== 'number') { this.sampleRate = sampleRateOrOptions.sampleRate ?? 48000; this.numChannels = sampleRateOrOptions.numChannels ?? 1; - if (isAudioFrameProcessor(sampleRateOrOptions.noiseCancellation)) { + if (isFrameProcessor(sampleRateOrOptions.noiseCancellation)) { this.frameProcessor = sampleRateOrOptions.noiseCancellation; } else { this.legacyNcOptions = sampleRateOrOptions.noiseCancellation; diff --git a/packages/livekit-rtc/src/frame_processor.ts b/packages/livekit-rtc/src/frame_processor.ts index d8f4b2f9..629d883a 100644 --- a/packages/livekit-rtc/src/frame_processor.ts +++ b/packages/livekit-rtc/src/frame_processor.ts @@ -17,40 +17,26 @@ export type FrameProcessorCredentials = { export const FrameProcessorSymbol = Symbol.for('lk.frame-processor'); -export function isFrameProcessor( +export function isFrameProcessor< + T extends FrameProcessor | FrameProcessor | unknown, +>( maybeProcessor: unknown, - type?: Type, -): maybeProcessor is FrameProcessor< - Type extends 'audio' ? AudioFrame : Type extends 'video' ? VideoFrame : AudioFrame | VideoFrame -> { +): maybeProcessor is T extends FrameProcessor + ? FrameProcessor + : T extends FrameProcessor + ? FrameProcessor + : FrameProcessor | FrameProcessor { return ( maybeProcessor !== null && typeof maybeProcessor === 'object' && 'symbol' in maybeProcessor && - maybeProcessor.symbol === FrameProcessorSymbol && - (!type || ('type' in maybeProcessor && maybeProcessor.type === type)) + maybeProcessor.symbol === FrameProcessorSymbol ); } -export function isAudioFrameProcessor( - maybeProcessor: unknown, -): maybeProcessor is FrameProcessor { - return isFrameProcessor(maybeProcessor, 'audio'); -} - -export function isVideoFrameProcessor( - maybeProcessor: unknown, -): maybeProcessor is FrameProcessor { - return isFrameProcessor(maybeProcessor, 'video'); -} - export abstract class FrameProcessor { readonly symbol = FrameProcessorSymbol; - abstract readonly type: Frame extends VideoFrame - ? 'video' - : Frame extends AudioFrame - ? 'audio' - : never; + abstract isEnabled(): boolean; abstract setEnabled(enabled: boolean): void; diff --git a/packages/livekit-rtc/src/index.ts b/packages/livekit-rtc/src/index.ts index d60dc5a7..add4999d 100644 --- a/packages/livekit-rtc/src/index.ts +++ b/packages/livekit-rtc/src/index.ts @@ -54,4 +54,5 @@ export { FrameProcessor, type FrameProcessorStreamInfo, type FrameProcessorCredentials, + isFrameProcessor, } from './frame_processor.js';