import { sesame } from './proto/api';
import { EaseKind } from './sesame-api-client';
import Long from 'long';
/** Makes specified keys required and non-nullable, keeping the rest as-is from the generated type. */
type WithRequired<T, K extends keyof T> = Omit<T, K> & {
    [P in K]-?: NonNullable<T[P]>;
};
export declare function keyframe(timeUs: number | Long, value: sesame.v1.common.IPropValue, easingIn?: EaseKind, easingOut?: EaseKind): sesame.v1.compositor.IKeyFrame;
export type CompositorID = string;
export type ReplayID = string;
export type AudioMixerID = string;
export type INodeConfig = WithRequired<Omit<sesame.v1.compositor.INodeAddRequest, 'nodeId'>, 'compositorId' | 'parentAddress' | 'nodeType'>;
export type IEncoderConfig = WithRequired<sesame.v1.outputs.IEncoderConfig, 'width' | 'height' | 'fps' | 'preset' | 'bitrateKbps'>;
export type IRecorderOutputConfig = WithRequired<Omit<sesame.v1.outputs.IEncodedRecorderOutputConfig, 'encoder'>, 'filename' | 'sizeGb' | 'groupId' | 'recorderType'>;
export type IFullRecorderOutputConfig = WithRequired<sesame.v1.outputs.IEncodedRecorderOutputConfig, 'filename' | 'sizeGb' | 'groupId' | 'recorderType'>;
export type ISuperSlowmoRecorderOutputConfig = WithRequired<Omit<sesame.v1.outputs.IEncodedSuperSlowMoRecorderOutputConfig, 'encoder'>, 'filename' | 'sizeGb' | 'groupId' | 'recorderType' | 'compositionIds' | 'sourceIds'>;
export type IFullSuperSlowmoRecorderOutputConfig = WithRequired<sesame.v1.outputs.IEncodedSuperSlowMoRecorderOutputConfig, 'filename' | 'sizeGb' | 'groupId' | 'recorderType' | 'compositionIds' | 'sourceIds'>;
export type IDecklinkOutputConfig = WithRequired<sesame.v1.outputs.IDecklinkOutputConfig, 'deviceIndex' | 'videoFormat' | 'keyAndFill'>;
export type IWebSocketOutputConfig = WithRequired<sesame.v1.outputs.IEncodedWebSocketOutputConfig, 'channel'>;
export type ISrtOutputConfig = WithRequired<sesame.v1.outputs.IEncodedSrtOutputConfig, 'url'>;
export type IMoqOutputConfig = WithRequired<sesame.v1.outputs.IEncodedMoqOutputConfig, 'url' | 'broadcast' | 'key'>;
export type ISystemAudioOutputConfig = WithRequired<sesame.v1.outputs.ISystemAudioOutputConfig, 'deviceName'>;
export type IOutputConfig = Omit<sesame.v1.outputs.IOutputAddRequest, 'id' | 'recorder' | 'superSlowmoRecorder' | 'decklink' | 'websocket' | 'srt' | 'moq' | 'systemAudio'> & {
    recorder?: (IFullRecorderOutputConfig | null);
    superSlowmoRecorder?: (IFullSuperSlowmoRecorderOutputConfig | null);
    decklink?: (IDecklinkOutputConfig | null);
    websocket?: (IWebSocketOutputConfig | null);
    srt?: (ISrtOutputConfig | null);
    moq?: (IMoqOutputConfig | null);
    systemAudio?: (ISystemAudioOutputConfig | null);
};
export type IAudioMixerChannel = WithRequired<sesame.v1.audio.IAudioMixerChannel, 'id' | 'sourceId' | 'channelType' | 'sourceChannels' | 'plugins' | 'level' | 'pan'>;
export type IAudioMixerConfig = WithRequired<sesame.v1.audio.IAudioMixerConfig, 'channels' | 'outputType' | 'order'>;
export type ISourceConfig = Omit<sesame.v1.sources.ISourceConfig, 'file' | 'recorder' | 'browser' | 'rtt' | 'decklink' | 'systemAudio' | 'srtStream' | 'websocket' | 'moq'> & {
    file?: (IFileSourceConfig | null);
    recorder?: (IRecorderSourceConfig | null);
    browser?: (IBrowserSourceConfig | null);
    rtt?: (IRTTSourceConfig | null);
    decklink?: (IDecklinkSourceConfig | null);
    systemAudio?: (ISystemAudioSourceConfig | null);
    srtStream?: (ISrtSourceConfig | null);
    websocket?: (IWebsocketSourceConfig | null);
    moq?: (IMoqSourceConfig | null);
};
export type IFileSourceConfig = WithRequired<sesame.v1.sources.IFileSourceConfig, 'url'>;
export type IRecorderSourceConfig = WithRequired<sesame.v1.sources.IRecorderSourceConfig, 'recorderId'>;
export type IBrowserSourceConfig = WithRequired<sesame.v1.sources.IBrowserSourceConfig, 'url' | 'width' | 'height'>;
export type IRTTSourceConfig = WithRequired<sesame.v1.sources.IRTTSourceConfig, 'rttId'>;
export type IDecklinkSourceConfig = WithRequired<sesame.v1.sources.IDecklinkSourceConfig, 'deviceIndex' | 'videoFormat'>;
export type ISystemAudioSourceConfig = WithRequired<sesame.v1.sources.ISystemAudioSourceConfig, 'deviceName'>;
export type ISrtSourceConfig = WithRequired<sesame.v1.sources.ISrtSourceConfig, 'url'>;
export type IWebsocketSourceConfig = WithRequired<sesame.v1.sources.IWebsocketSourceConfig, 'channel'>;
export type IMoqSourceConfig = WithRequired<sesame.v1.sources.IMoqSourceConfig, 'url' | 'broadcast' | 'key'>;
export type ISourceTransportConfig = WithRequired<Omit<sesame.v1.sources.ISourceTransportCommand, 'sourceId'>, 'cmdType' | 'value'>;
export interface ITransportCommand {
    type: 'play' | 'pause' | 'stop' | 'seek' | 'seek_usertime' | 'jog' | 'live' | 'set_recorder' | 'load_playlist' | 'eject_playlist' | 'load_clip' | 'set_metadata' | 'take' | 'pre_roll' | 'post_roll' | 'next_playlist_clip' | 'skip_next_playlist_clip' | 'transitions_disabled' | 'set_scrubbing';
    value?: number | string;
    transactionId?: number;
    user?: string;
    id?: string;
}
export type IPlaylistClip = WithRequired<sesame.v1.recorder.IPlaylistItem, 'id' | 'recorderId'>;
export interface IPlaylist {
    id: string;
    duration: number;
    clips: IPlaylistClip[];
}
export interface ITransactionOptions {
    transactionId?: number;
    dependencies?: number[];
}
/**
 * CommandList helper class for building Sesame command sequences.
 *
 * Provides a fluent API for constructing command lists that can be sent to the Sesame server.
 *
 * @example
 * ```typescript
 * const cl = new CommandList();
 * cl.sourceAdd('cam1', { decklink: { deviceIndex: 0, videoFormat: DecklinkVideoFormat.HD_1080i_50 } });
 * cl.compositorAdd('main', 1920, 1080, false);
 * await client.execute(cl);
 * ```
 */
export declare class CommandList {
    private cl;
    constructor();
    private add;
    applyTransaction(transaction: ITransactionOptions): void;
    getLength(): number;
    filterCreatedAndDestroyedSources(): void;
    getCommandListMsg(): sesame.v1.commands.CommandList;
    callback(event: string, data: string, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    compositorAdd(id: string, width: number, height: number, multisample: boolean, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    compositorRemove(id: string, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    compositorClear(id: string, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    sourceAdd(id: string, cfg: ISourceConfig, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    sourceRemove(id: string, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    nodeAdd(id: string, cfg: INodeConfig, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    nodeRemove(compositorId: string, address: string, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    propertySet(propertyDomain: sesame.v1.common.IPropertyDomain, addr: string, prop: string, val: sesame.v1.common.IPropValue, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    playlistLoad(sourceId: string, playlist: IPlaylist): sesame.v1.commands.CommandListItem;
    playlistEject(sourceId: string): sesame.v1.commands.CommandListItem;
    transportCommand(id: string, msg: ITransportCommand, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    sourceUpdate(id: string, cfg: ISourceConfig, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    sourceUpdateMetadata(id: string, metadata: sesame.v1.common.ITransportMetadata, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    sourceUpdateTransport(id: string, cfg: ISourceTransportConfig, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    outputAdd(id: string, cfg: IOutputConfig, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    outputUpdate(id: string, cfg: IOutputConfig, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    outputRemove(id: string, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    audioMixerAdd(id: string, cfg: IAudioMixerConfig, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    audioMixerUpdate(id: string, cfg: IAudioMixerConfig, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    audioMixerChannelAdd(mixerId: string, cfg: IAudioMixerChannel, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    audioMixerRemove(mixerId: string, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    audioMixerChannelRemove(mixerId: string, channelId: string, timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
    propertyAnimate(propertyDomain: sesame.v1.common.IPropertyDomain, addr: string, prop: string, before: sesame.v1.compositor.AnimationChannelEvaluationMode, after: sesame.v1.compositor.AnimationChannelEvaluationMode, keyframes: sesame.v1.compositor.IKeyFrame[], timeOffsetMs?: number): sesame.v1.commands.CommandListItem;
}
export {};
//# sourceMappingURL=command-list.d.ts.map