@aicacia/peer
Version:
simple peer to peer for webrtc
99 lines (98 loc) • 3.71 kB
TypeScript
import { EventEmitter, type EventEmitter as EventEmitterTypes } from "eventemitter3";
export interface PeerOptions {
id?: string;
sdpTransform?: (sdp?: string) => string;
channelName?: string;
channelConfig?: RTCDataChannelInit;
config?: RTCConfiguration;
offerConfig?: RTCOfferOptions;
answerConfig?: RTCAnswerOptions;
maxChannelMessageSize?: number;
webrtc?: PeerWebRTC;
}
export interface PeerWebRTC {
RTCPeerConnection: typeof RTCPeerConnection;
RTCSessionDescription: typeof RTCSessionDescription;
RTCIceCandidate: typeof RTCIceCandidate;
}
export type SignalMessage = {
type: "renegotiate";
renegotiate?: boolean;
} | {
type: "transceiverRequest";
transceiverRequest: {
kind: string;
init?: RTCRtpTransceiverInit;
};
} | {
type: "candidate";
candidate: RTCIceCandidateInit;
} | RTCSessionDescriptionInit;
interface PeerEvents {
signal(message: SignalMessage): void;
connect(): void;
data(event: string | Blob | ArrayBuffer | Uint8Array): void;
error(error: Error): void;
close(): void;
transceiver(transceiver: RTCRtpTransceiver): void;
track(track: RTCTrackEvent): void;
negotiated(): void;
}
type PeerEventNames = EventEmitterTypes.EventNames<PeerEvents>;
type EventEmitterReturnType<T> = T extends [] ? void : T extends [infer R] ? R : T;
export declare class Peer extends EventEmitter<PeerEvents> {
private id;
private initiator;
private channelName;
private channelConfig?;
private channel?;
private maxChannelMessageSize;
private sdpTransform;
private config;
private connection?;
private offerConfig?;
private answerConfig?;
private pendingCandidates;
private webrtc;
constructor(options?: PeerOptions);
getId(): string;
getConnection(): RTCPeerConnection | undefined;
getChannel(): RTCDataChannel | undefined;
isReady(): boolean | undefined;
isClosed(): boolean;
ready(): Promise<void>;
data(): Promise<string | Blob | ArrayBuffer | Uint8Array<ArrayBufferLike>>;
closed(): Promise<void>;
isInitiator(): boolean;
init(): this;
close(): this;
send(chunk: string | Blob | ArrayBuffer | ArrayBufferView): this;
write(chunk: string | Blob | ArrayBuffer | ArrayBufferView): void;
writableStream(): WritableStream<string | Blob | ArrayBuffer | ArrayBufferView<ArrayBufferLike>>;
readableStream(): ReadableStream<string | Blob | ArrayBuffer>;
signal(message: SignalMessage): Promise<this>;
waitOnce<K extends PeerEventNames>(event: K): Promise<EventEmitterReturnType<EventEmitter.ArgumentMap<PeerEvents>[K]>>;
addTransceiverFromKind(kind: string, init?: RTCRtpTransceiverInit): RTCRtpTransceiver | null;
addTrack(track: MediaStreamTrack): RTCRtpSender;
removeTrack(sender: RTCRtpSender): this;
private internalSignal;
negotiate(): Promise<this>;
private createOffer;
private createAnswer;
private createPeer;
private internalClose;
private onConnectionStateChange;
private onNegotiationNeeded;
private onICEConnectionStateChange;
private onICEGatheringStateChange;
private onSignalingStateChange;
private onICECandidate;
private onTrackRemote;
private onDataChannel;
private onDataChannelOpen;
private onDataChannelMessage;
private onDataChannelError;
}
export declare function writableStreamFromChannel(channel: RTCDataChannel, maxChannelMessageSize: number): WritableStream<string | Blob | ArrayBuffer | ArrayBufferView<ArrayBufferLike>>;
export declare function readableStreamFromChannel(channel: RTCDataChannel): ReadableStream<string | Blob | ArrayBuffer>;
export {};