///
///
import { ChunkStreamSession, Message, MessageData } from "./chunk-stream";
import * as net from 'net';
import { Subject } from "rxjs";
import * as FLV from '@astronautlabs/flv';
export declare class VideoMessageData extends MessageData {
tag: FLV.VideoTag;
}
export declare class AudioMessageData extends MessageData {
tag: FLV.AudioTag;
}
export declare enum UserControlMessageType {
StreamBegin = 0,
StreamEOF = 1,
StreamDry = 2,
SetBufferLength = 3,
StreamIsRecorded = 4,
PingRequest = 6,
PingResponse = 7
}
/**
* Defines the chunk streams that various kinds of messages are sent on.
* Note that this is completely arbitrary (except for chunk stream 2).
* Other implementations differ on which chunk stream IDs are used, implementations
* should not depend on this.
*/
export declare enum ChunkStreams {
/**
* Used for Command messages (RTMP§7.2)
*/
Invoke = 3,
/**
* Used for audio data
*/
Audio = 4,
/**
* Used for video data
*/
Video = 5,
/**
* Dedicated chunk stream for AV control operations (play/pause/publish/etc)
* Stole the idea from ffmpeg
*/
AvInvoke = 6
}
export declare const CommandParameterCount: {
_result: number;
_error: number;
onStatus: number;
releaseStream: number;
getStreamLength: number;
getMovLen: number;
FCPublish: number;
FCUnpublish: number;
FCSubscribe: number;
onFCPublish: number;
connect: number;
call: number;
createStream: number;
close: number;
play: number;
play2: number;
deleteStream: number;
closeStream: number;
receiveAudio: number;
receiveVideo: number;
publish: number;
seek: number;
pause: number;
};
export declare class CommandAMF0Data extends MessageData {
private $args;
get commandName(): string;
set commandName(value: string);
get transactionId(): number;
set transactionId(value: number);
get commandObject(): T;
set commandObject(value: T);
get parameters(): any[];
set parameters(value: any[]);
inspect(): string;
}
export declare class DataAMF3Data extends MessageData {
private $name;
get name(): string;
set name(value: string);
inspect(): string;
}
export declare class DataAMF0Data extends MessageData {
private $name;
get name(): string;
set name(value: string);
inspect(): string;
}
export interface OnMetaData {
audiosamplerate: number;
stereo: boolean;
width: number;
height: number;
framerate: number;
}
export declare class SetDataFrameData extends DataAMF0Data {
constructor(...args: any[]);
private $key;
private $value;
get key(): string;
set key(value: string);
get value(): any;
set value(value: any);
}
export declare class ClearDataFrameData extends DataAMF0Data {
constructor(...args: any[]);
private $metadata;
get metadata(): any;
set metadata(value: any);
}
export declare class RtmpSampleAccessData extends DataAMF0Data {
constructor(...args: any[]);
private $audioRestricted;
private $videoRestricted;
get audioRestricted(): boolean;
set audioRestricted(value: boolean);
get videoRestricted(): boolean;
set videoRestricted(value: boolean);
}
export declare class CommandAMF3Data extends MessageData {
private $args;
get commandName(): string;
set commandName(value: string);
get transactionId(): number;
set transactionId(value: number);
get commandObject(): T;
set commandObject(value: T);
get parameters(): any[];
set parameters(value: any[]);
inspect(): string;
}
export declare enum AudioCodecFlags {
SUPPORT_SND_NONE = 1,
SUPPORT_SND_ADPCM = 2,
SUPPORT_SND_MP3 = 4,
SUPPORT_SND_INTEL = 8,
SUPPORT_SND_UNUSED = 16,
SUPPORT_SND_NELLY8 = 32,
SUPPORT_SND_G711A = 128,
SUPPORT_SND_G711U = 256,
SUPPORT_SND_NELLY16 = 512,
SUPPORT_SND_AAC = 1024,
SUPPORT_SND_SPEEX = 2048,
SUPPORT_SND_ALL = 4095
}
export declare enum VideoCodecFlags {
SUPPORT_VID_UNUSED = 1,
SUPPORT_VID_JPEG = 2,
SUPPORT_VID_SORENSON = 4,
SUPPORT_VID_HOMEBREW = 8,
SUPPORT_VID_VP6 = 16,
SUPPORT_VID_VP6ALPHA = 32,
SUPPORT_VID_HOMEBREWV = 64,
SUPPORT_VID_H264 = 128,
SUPPORT_VID_ALL = 255
}
export declare enum VideoFunctionFlags {
SUPPORT_VID_CLIENT_SEEK = 1
}
export declare enum ObjectEncoding {
AMF0 = 0,
AMF3 = 3
}
export interface ConnectCommandObject {
app: string;
flashver: string;
swfUrl: string;
tcUrl: string;
fpad: boolean;
audioCodecs: number;
videoCodecs: number;
videoFunction: number;
pageUrl: string;
objectEncoding: number;
}
export declare class UnknownMessageData extends MessageData {
messageType: number;
length: number;
timestamp: number;
messageStreamId: number;
$marker: any;
}
export declare class UserControlData extends MessageData {
eventType: number;
}
export declare class StreamBeginEventData extends UserControlData {
streamID: number;
}
export declare class StreamEndEventData extends UserControlData {
streamID: number;
}
export declare class StreamDryEventData extends UserControlData {
streamID: number;
}
export declare class SetBufferLengthEventData extends UserControlData {
streamID: number;
bufferLength: number;
}
export declare class StreamIsRecordedEventData extends UserControlData {
streamID: number;
}
export declare class PingRequestData extends UserControlData {
timestamp: number;
}
export declare class PingResponseData extends UserControlData {
timestamp: number;
}
/**
* Represents a media stream. Subclass and override the command methods to
* add behavior.
*/
export declare class ServerStream {
readonly session: Session;
readonly id: number;
constructor(session: Session, id: number);
destroyed: Subject;
messageReceived: Subject;
dataReceived: Subject;
notifyBegin(): void;
notifyDry(): void;
notifyEnd(): void;
dispose(): void;
receiveData(data: DataAMF0Data | DataAMF3Data): void;
receiveCommand(commandName: string, transactionId: number, commandObject: any, parameters: any[]): Promise;
receiveMessage(message: Message): void;
}
export interface RPCOptions {
/**
* Whether this RPC call is enabled or not. Defaults to true.
*/
enabled?: boolean;
/**
* Whether a _result should be sent for this RPC call. Default is true.
*/
isVoid?: boolean;
}
export declare function RPC(options?: RPCOptions): {
(target: Function): void;
(target: Object, propertyKey: string | symbol): void;
};
export declare class ServerControlStream extends ServerStream {
constructor(session: Session);
receiveCommand(commandName: string, transactionId: number, commandObject: any, parameters: any[]): Promise;
}
export interface Status {
level: 'status' | 'error';
code: string;
description: string;
}
export declare class ServerMediaStream extends ServerStream {
sendStatus(status: Status): void;
notifyBegin(): void;
metadata: Record;
metadataChanged: Subject>;
sampleAccessRestrictionsChanged: Subject<{
audioRestricted: boolean;
videoRestricted: boolean;
}>;
receiveMetadata(key: string, value: any): void;
receiveSampleRestrictions(restrictions: {
audioRestricted: boolean;
videoRestricted: boolean;
}): void;
sendDataFrame(key: string, value: any): void;
receiveData(data: DataAMF0Data | DataAMF3Data): void;
restrictSampleAccess(audioRestricted: boolean, videoRestricted: boolean): void;
pause(paused: boolean, milliseconds: number): void;
seek(milliseconds: number): void;
publish(streamKey: string, publishType: 'live' | 'record' | 'append'): void;
play(streamKey: string, start: number, duration: number, reset: boolean): void;
play2(params: any): void;
isAudioEnabled: boolean;
isVideoEnabled: boolean;
audioEnabled: Subject;
videoEnabled: Subject;
enableAudio(enabled: boolean): void;
enableVideo(enabled: boolean): void;
/**
* Send a video message. Can provide either a VideoMessageData object or an already serialized
* VideoMessageData object.
* @param timestamp
* @param message
* @returns
*/
sendVideo(timestamp: number, message: VideoMessageData | Buffer): void;
/**
* Send an audio message. Can provide either an AudioMessageData object or an already serialized
* AudioMessageData object.
* @param timestamp
* @param message
* @returns
*/
sendAudio(timestamp: number, message: AudioMessageData | Buffer): void;
/**
* Handle a custom RPC call. Return true if it was handled, otherwise an error result is sent to the
* client and an error is printed to the logs.
*
* @param commandName
* @param command
* @param args
* @returns
*/
call(commandName: string, command: any, args: Record): boolean;
/**
* Receive an audio message on this stream.
* @param timestamp The timestamp of the audio message
* @param message The decoded message
* @param buffer The serialized message for efficient passthrough to other streams
*/
receiveAudio(timestamp: number, message: AudioMessageData, buffer: Buffer): void;
/**
* Receive a video message on this stream.
* @param timestamp The timestamp of the video message
* @param message The decoded message
* @param buffer The serialized message for efficient passthrough to other streams
*/
receiveVideo(timestamp: number, message: VideoMessageData, buffer: Buffer): void;
receiveMessage(message: Message): void;
sendCommand0(commandName: string, parameters: any[], options?: {
transactionId?: number;
commandObject?: any;
}): void;
receiveCommand(commandName: string, transactionId: number, commandObject: any, parameters: any[]): Promise;
}
export declare class Session {
readonly server: Server;
readonly socket: net.Socket;
constructor(server: Server, socket: net.Socket);
close(): void;
chunkSession: ChunkStreamSession;
private receiveMessage;
private _streams;
getStream(id: number): ServerStream;
private handleStreamMessage;
dataReceived: Subject;
receiveData(data: any): void;
/**
* Handle a custom RPC call. Return true if it was handled, otherwise an error result is sent to the
* client and an error is printed to the logs.
*
* @param commandName
* @param command
* @param args
* @returns
*/
call(commandName: string, command: any, args: Record): boolean;
receiveCommand(commandName: string, transactionId: number, commandObject: any, parameters: any[]): Promise;
private nextStreamID;
streamCreated: Subject;
protected createStream(id: number): ServerMediaStream;
private onCreateStream;
private pingInterval;
private _pingTime;
get pingTime(): any;
set pingTime(value: any);
private startPingTimer;
clientConnectInfo: ConnectCommandObject;
private onConnect;
messageReceived: Subject;
userControl(data: UserControlData): void;
ping(): void;
streamBegin(streamID: number): void;
streamEnd(streamID: number): void;
streamDry(streamID: number): void;
sendCommand0(commandName: string, parameters: any[], options?: {
messageStreamId?: number;
transactionId?: number;
commandObject?: any;
}): void;
sendData0(data: DataAMF0Data, options?: {
messageStreamId?: number;
}): void;
sendCommand3(commandName: string, parameters: any[], options?: {
transactionId?: number;
commandObject?: any;
}): void;
/**
* Prepare the server for receiving a media stream, if necessary.
* The default implementation does nothing.
* @param streamName
* @returns
*/
protected FCPublish(streamName: string): string;
/**
* Prepare the server for no longer receiving a media stream, if necessary.
* The default implementation does nothing.
* @param streamName
*/
protected FCUnpublish(streamName: string): void;
/**
* Subscribe the server to a specific upstream media stream, if necessary.
* Traditionally this is used to tell an edge server to start pulling a stream from the
* appropriate origin. That logic is specific to a particular RTMP server implementation,
* so by default this method does nothing.
* @param streamName
* @param mediaCasterType
*/
protected FCSubscribe(streamName: string, mediaCasterType?: string): void;
/**
* Unsubscribe the server from a specific upstream media stream, if necessary.
* The implementation should properly handle multiple subscribed streams in deciding
* how to handle this operation, since this call is specific only to a single client.
* Since this logic is specific to a particular RTMP server implementation,
* by default this method does nothing.
* @param streamName
*/
protected FCUnsubscribe(streamName: string): void;
/**
* A variant method name of FCUnsubscribe. The default implementation calls FCUnsubscribe().
* You should implement FCUnsubscribe() instead if you require this functionality.
* @param streamName
*/
protected FCUnSubscribe(streamName: string): void;
}
export declare class Server {
readonly port: number;
constructor(port?: number);
version: number;
fullVersion: string;
private _server;
connections: Session[];
preferredWindowSize: number;
preferredChunkSize: number;
preferredPingTime: number;
protected createSession(socket: net.Socket): Session;
listen(): Promise;
stop(): void;
}