From a7d06d2e02f59e58c30c4bdcbf16a0cfa7a40dbc Mon Sep 17 00:00:00 2001 From: Billy Lindeman Date: Wed, 12 May 2021 14:30:55 -0700 Subject: [PATCH] 1.7.1 --- package-lock.json | 2 +- package.json | 2 +- src/client.ts | 14 +- src/ion.ts | 244 ++++++++-------- src/signal/_proto/library/biz/biz_pb.d.ts | 69 +++-- .../_proto/library/biz/biz_pb_service.d.ts | 9 +- src/signal/_proto/library/biz/ion_pb.d.ts | 132 +++++---- .../_proto/library/biz/ion_pb_service.d.ts | 1 - src/signal/_proto/library/sfu/sfu_pb.d.ts | 65 +++-- .../_proto/library/sfu/sfu_pb_service.d.ts | 9 +- src/signal/biz.ts | 260 +++++++++--------- src/signal/utils.ts | 4 +- src/stream.ts | 50 ++-- 13 files changed, 430 insertions(+), 431 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8f9e2ba7..89cb5552 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ion-sdk-js", - "version": "1.7.0", + "version": "1.7.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 7ef19802..1c5cc4b4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ion-sdk-js", - "version": "1.7.0", + "version": "1.7.1", "description": "A js sdk for ion sfu", "main": "lib/index.js", "types": "lib/index.d.ts", diff --git a/src/client.ts b/src/client.ts index ef099202..5430bf30 100644 --- a/src/client.ts +++ b/src/client.ts @@ -19,9 +19,9 @@ export interface Trickle { } export interface ActiveLayer { - streamId: string, - activeLayer: string, - availableLayers: string[] + streamId: string; + activeLayer: string; + availableLayers: string[]; } enum Role { @@ -244,23 +244,23 @@ export default class Client { private processChannelMessage(msg: any) { if (msg.method !== undefined && msg.params !== undefined) { switch (msg.method) { - case "audioLevels": + case 'audioLevels': if (this.onspeaker) { this.onspeaker(msg.params); } break; - case "activeLayer": + case 'activeLayer': if (this.onactivelayer) { this.onactivelayer(msg.params); } break; default: - // do nothing + // do nothing } } else { // legacy channel message - payload contains audio levels if (this.onspeaker) { - this.onspeaker(msg) + this.onspeaker(msg); } } } diff --git a/src/ion.ts b/src/ion.ts index a05e089c..91a611a2 100644 --- a/src/ion.ts +++ b/src/ion.ts @@ -6,151 +6,151 @@ import { Signal, Trickle } from './signal'; export { Client, LocalStream, RemoteStream, Constraints, Signal, Trickle }; export interface JoinResult { - success: boolean; - reason: string; - } + success: boolean; + reason: string; +} export enum PeerState { - NONE, - JOIN, - UPDATE, - LEAVE, + NONE, + JOIN, + UPDATE, + LEAVE, } export interface Peer { - uid: string; - sid: string; - info: Map; + uid: string; + sid: string; + info: Map; } export interface PeerEvent { - state: PeerState; - peer: Peer; + state: PeerState; + peer: Peer; } export enum StreamState { - NONE, - ADD, - REMOVE, + NONE, + ADD, + REMOVE, } export interface StreamEvent { - uid: string; - state: StreamState; - streams: Stream[]; + uid: string; + state: StreamState; + streams: Stream[]; } export interface Track { - id: string; - label: string; - kind: string; - simulcast: Map; + id: string; + label: string; + kind: string; + simulcast: Map; } export interface Stream { - id: string; - tracks: Track[]; + id: string; + tracks: Track[]; } export interface Message { - from: string ; - to: string; - data: Map; + from: string; + to: string; + data: Map; } export class IonConnector { - private _biz: BizClient; - private _sfu: Client | undefined; - private _sid: string; - private _uid: string; - - onerror?:(err: Error) => void; - - onjoin?:(success: boolean, reason: string) => void; - - onleave?:(reason: string) => void; - - onpeerevent?: (ev: PeerEvent) => void; - - onstreamevent?: (ev: StreamEvent) => void; - - onmessage?:(msg: Message) => void; - - ontrack?: (track: MediaStreamTrack, stream: RemoteStream) => void; - - ondatachannel?: (ev: RTCDataChannelEvent) => void; - - onspeaker?: (ev: string[]) => void; - - constructor(url: string, config?: Configuration) { - this._sid = ""; - this._uid = ""; - this._sfu = undefined; - this._biz = new BizClient(url); - - this._biz.on("join-reply", async (success: boolean, reason: string) => { - if (this.onjoin) { - this.onjoin(success, reason); - } - if (success && !this._sfu) { - const signal = new IonSFUGRPCWebSignal(url); - const sfu = new Client(signal, config); - - sfu.ontrack = (track: MediaStreamTrack, stream: RemoteStream) => - this.ontrack?.call(this, track, stream); - sfu.ondatachannel = (ev: RTCDataChannelEvent) => - this.ondatachannel?.call(this, ev); - sfu.onspeaker = (ev: string[]) => this.onspeaker?.call(this, ev); - - this._sfu = sfu; - - await sfu.join(this._sid, this._uid); - } - }); - - this._biz.on("leave-reply", (reason: string) => { - if (this.onleave) { - this.onleave(reason); - } - }); - - this._biz.on("peer-event", (ev: PeerEvent) => { - if(this.onpeerevent) { - this.onpeerevent(ev); - } - }) - - this._biz.on("stream-event", (ev: StreamEvent) => { - if(this.onstreamevent) { - this.onstreamevent(ev); - } - }) - - this._biz.on("message", (msg: Message) => { - if(this.onmessage) { - this.onmessage(msg); - } - }) - } - - get sfu() { return this._sfu; } - - async join(sid: string, uid: string, info: Map, token: string | undefined): Promise { - this._sid = sid; - this._uid = uid; - return this._biz.join(sid, uid, info, token); - } - - async leave(uid: string): Promise { - return this._biz.leave(uid) - } - - async message(from: string, to: string, data: Map): Promise { - return this._biz.sendMessage(from, to, data); - } - - close() { - this._sfu?.close(); - this._biz.close(); - } -} \ No newline at end of file + private _biz: BizClient; + private _sfu: Client | undefined; + private _sid: string; + private _uid: string; + + onerror?: (err: Error) => void; + + onjoin?: (success: boolean, reason: string) => void; + + onleave?: (reason: string) => void; + + onpeerevent?: (ev: PeerEvent) => void; + + onstreamevent?: (ev: StreamEvent) => void; + + onmessage?: (msg: Message) => void; + + ontrack?: (track: MediaStreamTrack, stream: RemoteStream) => void; + + ondatachannel?: (ev: RTCDataChannelEvent) => void; + + onspeaker?: (ev: string[]) => void; + + constructor(url: string, config?: Configuration) { + this._sid = ''; + this._uid = ''; + this._sfu = undefined; + this._biz = new BizClient(url); + + this._biz.on('join-reply', async (success: boolean, reason: string) => { + if (this.onjoin) { + this.onjoin(success, reason); + } + if (success && !this._sfu) { + const signal = new IonSFUGRPCWebSignal(url); + const sfu = new Client(signal, config); + + sfu.ontrack = (track: MediaStreamTrack, stream: RemoteStream) => this.ontrack?.call(this, track, stream); + sfu.ondatachannel = (ev: RTCDataChannelEvent) => this.ondatachannel?.call(this, ev); + sfu.onspeaker = (ev: string[]) => this.onspeaker?.call(this, ev); + + this._sfu = sfu; + + await sfu.join(this._sid, this._uid); + } + }); + + this._biz.on('leave-reply', (reason: string) => { + if (this.onleave) { + this.onleave(reason); + } + }); + + this._biz.on('peer-event', (ev: PeerEvent) => { + if (this.onpeerevent) { + this.onpeerevent(ev); + } + }); + + this._biz.on('stream-event', (ev: StreamEvent) => { + if (this.onstreamevent) { + this.onstreamevent(ev); + } + }); + + this._biz.on('message', (msg: Message) => { + if (this.onmessage) { + this.onmessage(msg); + } + }); + } + + get sfu() { + return this._sfu; + } + + async join(sid: string, uid: string, info: Map, token: string | undefined): Promise { + this._sid = sid; + this._uid = uid; + return this._biz.join(sid, uid, info, token); + } + + async leave(uid: string): Promise { + return this._biz.leave(uid); + } + + async message(from: string, to: string, data: Map): Promise { + return this._biz.sendMessage(from, to, data); + } + + close() { + this._sfu?.close(); + this._biz.close(); + } +} diff --git a/src/signal/_proto/library/biz/biz_pb.d.ts b/src/signal/_proto/library/biz/biz_pb.d.ts index 04520981..15dc23db 100644 --- a/src/signal/_proto/library/biz/biz_pb.d.ts +++ b/src/signal/_proto/library/biz/biz_pb.d.ts @@ -1,8 +1,8 @@ // package: biz // file: biz.proto -import * as jspb from "google-protobuf"; -import * as ion_pb from "./ion_pb"; +import * as jspb from 'google-protobuf'; +import * as ion_pb from './ion_pb'; export class Join extends jspb.Message { hasPeer(): boolean; @@ -16,8 +16,8 @@ export class Join extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Join.AsObject; static toObject(includeInstance: boolean, msg: Join): Join.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: Join, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): Join; static deserializeBinaryFromReader(message: Join, reader: jspb.BinaryReader): Join; @@ -25,9 +25,9 @@ export class Join extends jspb.Message { export namespace Join { export type AsObject = { - peer?: ion_pb.Peer.AsObject, - token: string, - } + peer?: ion_pb.Peer.AsObject; + token: string; + }; } export class JoinReply extends jspb.Message { @@ -40,8 +40,8 @@ export class JoinReply extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): JoinReply.AsObject; static toObject(includeInstance: boolean, msg: JoinReply): JoinReply.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: JoinReply, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): JoinReply; static deserializeBinaryFromReader(message: JoinReply, reader: jspb.BinaryReader): JoinReply; @@ -49,9 +49,9 @@ export class JoinReply extends jspb.Message { export namespace JoinReply { export type AsObject = { - success: boolean, - reason: string, - } + success: boolean; + reason: string; + }; } export class Leave extends jspb.Message { @@ -61,8 +61,8 @@ export class Leave extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Leave.AsObject; static toObject(includeInstance: boolean, msg: Leave): Leave.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: Leave, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): Leave; static deserializeBinaryFromReader(message: Leave, reader: jspb.BinaryReader): Leave; @@ -70,8 +70,8 @@ export class Leave extends jspb.Message { export namespace Leave { export type AsObject = { - uid: string, - } + uid: string; + }; } export class LeaveReply extends jspb.Message { @@ -81,8 +81,8 @@ export class LeaveReply extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): LeaveReply.AsObject; static toObject(includeInstance: boolean, msg: LeaveReply): LeaveReply.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: LeaveReply, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): LeaveReply; static deserializeBinaryFromReader(message: LeaveReply, reader: jspb.BinaryReader): LeaveReply; @@ -90,8 +90,8 @@ export class LeaveReply extends jspb.Message { export namespace LeaveReply { export type AsObject = { - reason: string, - } + reason: string; + }; } export class SignalRequest extends jspb.Message { @@ -114,8 +114,8 @@ export class SignalRequest extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SignalRequest.AsObject; static toObject(includeInstance: boolean, msg: SignalRequest): SignalRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: SignalRequest, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): SignalRequest; static deserializeBinaryFromReader(message: SignalRequest, reader: jspb.BinaryReader): SignalRequest; @@ -123,10 +123,10 @@ export class SignalRequest extends jspb.Message { export namespace SignalRequest { export type AsObject = { - join?: Join.AsObject, - leave?: Leave.AsObject, - msg?: ion_pb.Message.AsObject, - } + join?: Join.AsObject; + leave?: Leave.AsObject; + msg?: ion_pb.Message.AsObject; + }; export enum PayloadCase { PAYLOAD_NOT_SET = 0, @@ -166,8 +166,8 @@ export class SignalReply extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SignalReply.AsObject; static toObject(includeInstance: boolean, msg: SignalReply): SignalReply.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: SignalReply, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): SignalReply; static deserializeBinaryFromReader(message: SignalReply, reader: jspb.BinaryReader): SignalReply; @@ -175,12 +175,12 @@ export class SignalReply extends jspb.Message { export namespace SignalReply { export type AsObject = { - joinreply?: JoinReply.AsObject, - leavereply?: LeaveReply.AsObject, - peerevent?: ion_pb.PeerEvent.AsObject, - streamevent?: ion_pb.StreamEvent.AsObject, - msg?: ion_pb.Message.AsObject, - } + joinreply?: JoinReply.AsObject; + leavereply?: LeaveReply.AsObject; + peerevent?: ion_pb.PeerEvent.AsObject; + streamevent?: ion_pb.StreamEvent.AsObject; + msg?: ion_pb.Message.AsObject; + }; export enum PayloadCase { PAYLOAD_NOT_SET = 0, @@ -191,4 +191,3 @@ export namespace SignalReply { MSG = 5, } } - diff --git a/src/signal/_proto/library/biz/biz_pb_service.d.ts b/src/signal/_proto/library/biz/biz_pb_service.d.ts index ea29b7c5..342301b2 100644 --- a/src/signal/_proto/library/biz/biz_pb_service.d.ts +++ b/src/signal/_proto/library/biz/biz_pb_service.d.ts @@ -1,8 +1,8 @@ // package: biz // file: biz.proto -import * as biz_pb from "./biz_pb"; -import {grpc} from "@improbable-eng/grpc-web"; +import * as biz_pb from './biz_pb'; +import { grpc } from '@improbable-eng/grpc-web'; type BizSignal = { readonly methodName: string; @@ -18,8 +18,8 @@ export class Biz { static readonly Signal: BizSignal; } -export type ServiceError = { message: string, code: number; metadata: grpc.Metadata } -export type Status = { details: string, code: number; metadata: grpc.Metadata } +export type ServiceError = { message: string; code: number; metadata: grpc.Metadata }; +export type Status = { details: string; code: number; metadata: grpc.Metadata }; interface UnaryResponse { cancel(): void; @@ -52,4 +52,3 @@ export class BizClient { constructor(serviceHost: string, options?: grpc.RpcOptions); signal(metadata?: grpc.Metadata): BidirectionalStream; } - diff --git a/src/signal/_proto/library/biz/ion_pb.d.ts b/src/signal/_proto/library/biz/ion_pb.d.ts index 1ca6ae87..e1a2b0ac 100644 --- a/src/signal/_proto/library/biz/ion_pb.d.ts +++ b/src/signal/_proto/library/biz/ion_pb.d.ts @@ -1,22 +1,21 @@ // package: ion // file: ion.proto -import * as jspb from "google-protobuf"; +import * as jspb from 'google-protobuf'; export class Empty extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Empty.AsObject; static toObject(includeInstance: boolean, msg: Empty): Empty.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: Empty, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): Empty; static deserializeBinaryFromReader(message: Empty, reader: jspb.BinaryReader): Empty; } export namespace Empty { - export type AsObject = { - } + export type AsObject = {}; } export class Error extends jspb.Message { @@ -29,8 +28,8 @@ export class Error extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Error.AsObject; static toObject(includeInstance: boolean, msg: Error): Error.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: Error, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): Error; static deserializeBinaryFromReader(message: Error, reader: jspb.BinaryReader): Error; @@ -38,9 +37,9 @@ export class Error extends jspb.Message { export namespace Error { export type AsObject = { - code: number, - reason: string, - } + code: number; + reason: string; + }; } export class Track extends jspb.Message { @@ -58,8 +57,8 @@ export class Track extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Track.AsObject; static toObject(includeInstance: boolean, msg: Track): Track.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: Track, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): Track; static deserializeBinaryFromReader(message: Track, reader: jspb.BinaryReader): Track; @@ -67,11 +66,11 @@ export class Track extends jspb.Message { export namespace Track { export type AsObject = { - id: string, - label: string, - kind: string, - simulcastMap: Array<[string, string]>, - } + id: string; + label: string; + kind: string; + simulcastMap: Array<[string, string]>; + }; } export class Stream extends jspb.Message { @@ -86,8 +85,8 @@ export class Stream extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Stream.AsObject; static toObject(includeInstance: boolean, msg: Stream): Stream.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: Stream, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): Stream; static deserializeBinaryFromReader(message: Stream, reader: jspb.BinaryReader): Stream; @@ -95,9 +94,9 @@ export class Stream extends jspb.Message { export namespace Stream { export type AsObject = { - id: string, - tracksList: Array, - } + id: string; + tracksList: Array; + }; } export class Peer extends jspb.Message { @@ -115,8 +114,8 @@ export class Peer extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Peer.AsObject; static toObject(includeInstance: boolean, msg: Peer): Peer.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: Peer, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): Peer; static deserializeBinaryFromReader(message: Peer, reader: jspb.BinaryReader): Peer; @@ -124,10 +123,10 @@ export class Peer extends jspb.Message { export namespace Peer { export type AsObject = { - sid: string, - uid: string, - info: Uint8Array | string, - } + sid: string; + uid: string; + info: Uint8Array | string; + }; } export class SessionEvent extends jspb.Message { @@ -143,8 +142,8 @@ export class SessionEvent extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SessionEvent.AsObject; static toObject(includeInstance: boolean, msg: SessionEvent): SessionEvent.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: SessionEvent, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): SessionEvent; static deserializeBinaryFromReader(message: SessionEvent, reader: jspb.BinaryReader): SessionEvent; @@ -152,10 +151,10 @@ export class SessionEvent extends jspb.Message { export namespace SessionEvent { export type AsObject = { - state: SessionEvent.StateMap[keyof SessionEvent.StateMap], - nid: string, - sid: string, - } + state: SessionEvent.StateMap[keyof SessionEvent.StateMap]; + nid: string; + sid: string; + }; export interface StateMap { ADD: 0; @@ -186,8 +185,8 @@ export class StreamEvent extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): StreamEvent.AsObject; static toObject(includeInstance: boolean, msg: StreamEvent): StreamEvent.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: StreamEvent, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): StreamEvent; static deserializeBinaryFromReader(message: StreamEvent, reader: jspb.BinaryReader): StreamEvent; @@ -195,12 +194,12 @@ export class StreamEvent extends jspb.Message { export namespace StreamEvent { export type AsObject = { - state: StreamEvent.StateMap[keyof StreamEvent.StateMap], - nid: string, - sid: string, - uid: string, - streamsList: Array, - } + state: StreamEvent.StateMap[keyof StreamEvent.StateMap]; + nid: string; + sid: string; + uid: string; + streamsList: Array; + }; export interface StateMap { ADD: 0; @@ -222,8 +221,8 @@ export class PeerEvent extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): PeerEvent.AsObject; static toObject(includeInstance: boolean, msg: PeerEvent): PeerEvent.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: PeerEvent, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): PeerEvent; static deserializeBinaryFromReader(message: PeerEvent, reader: jspb.BinaryReader): PeerEvent; @@ -231,9 +230,9 @@ export class PeerEvent extends jspb.Message { export namespace PeerEvent { export type AsObject = { - state: PeerEvent.StateMap[keyof PeerEvent.StateMap], - peer?: Peer.AsObject, - } + state: PeerEvent.StateMap[keyof PeerEvent.StateMap]; + peer?: Peer.AsObject; + }; export interface StateMap { JOIN: 0; @@ -259,8 +258,8 @@ export class Message extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Message.AsObject; static toObject(includeInstance: boolean, msg: Message): Message.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: Message, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): Message; static deserializeBinaryFromReader(message: Message, reader: jspb.BinaryReader): Message; @@ -268,10 +267,10 @@ export class Message extends jspb.Message { export namespace Message { export type AsObject = { - from: string, - to: string, - data: Uint8Array | string, - } + from: string; + to: string; + data: Uint8Array | string; + }; } export class RPC extends jspb.Message { @@ -286,8 +285,8 @@ export class RPC extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): RPC.AsObject; static toObject(includeInstance: boolean, msg: RPC): RPC.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: RPC, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): RPC; static deserializeBinaryFromReader(message: RPC, reader: jspb.BinaryReader): RPC; @@ -295,10 +294,10 @@ export class RPC extends jspb.Message { export namespace RPC { export type AsObject = { - protocol: string, - addr: string, - paramsMap: Array<[string, string]>, - } + protocol: string; + addr: string; + paramsMap: Array<[string, string]>; + }; } export class Node extends jspb.Message { @@ -319,8 +318,8 @@ export class Node extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Node.AsObject; static toObject(includeInstance: boolean, msg: Node): Node.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: Node, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): Node; static deserializeBinaryFromReader(message: Node, reader: jspb.BinaryReader): Node; @@ -328,10 +327,9 @@ export class Node extends jspb.Message { export namespace Node { export type AsObject = { - dc: string, - nid: string, - service: string, - rpc?: RPC.AsObject, - } + dc: string; + nid: string; + service: string; + rpc?: RPC.AsObject; + }; } - diff --git a/src/signal/_proto/library/biz/ion_pb_service.d.ts b/src/signal/_proto/library/biz/ion_pb_service.d.ts index 9209087c..184b718a 100644 --- a/src/signal/_proto/library/biz/ion_pb_service.d.ts +++ b/src/signal/_proto/library/biz/ion_pb_service.d.ts @@ -1,3 +1,2 @@ // package: ion // file: ion.proto - diff --git a/src/signal/_proto/library/sfu/sfu_pb.d.ts b/src/signal/_proto/library/sfu/sfu_pb.d.ts index 514240b0..e98862c5 100644 --- a/src/signal/_proto/library/sfu/sfu_pb.d.ts +++ b/src/signal/_proto/library/sfu/sfu_pb.d.ts @@ -1,7 +1,7 @@ // package: sfu // file: sfu.proto -import * as jspb from "google-protobuf"; +import * as jspb from 'google-protobuf'; export class SignalRequest extends jspb.Message { getId(): string; @@ -28,8 +28,8 @@ export class SignalRequest extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SignalRequest.AsObject; static toObject(includeInstance: boolean, msg: SignalRequest): SignalRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: SignalRequest, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): SignalRequest; static deserializeBinaryFromReader(message: SignalRequest, reader: jspb.BinaryReader): SignalRequest; @@ -37,11 +37,11 @@ export class SignalRequest extends jspb.Message { export namespace SignalRequest { export type AsObject = { - id: string, - join?: JoinRequest.AsObject, - description: Uint8Array | string, - trickle?: Trickle.AsObject, - } + id: string; + join?: JoinRequest.AsObject; + description: Uint8Array | string; + trickle?: Trickle.AsObject; + }; export enum PayloadCase { PAYLOAD_NOT_SET = 0, @@ -86,8 +86,8 @@ export class SignalReply extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): SignalReply.AsObject; static toObject(includeInstance: boolean, msg: SignalReply): SignalReply.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: SignalReply, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): SignalReply; static deserializeBinaryFromReader(message: SignalReply, reader: jspb.BinaryReader): SignalReply; @@ -95,13 +95,13 @@ export class SignalReply extends jspb.Message { export namespace SignalReply { export type AsObject = { - id: string, - join?: JoinReply.AsObject, - description: Uint8Array | string, - trickle?: Trickle.AsObject, - iceconnectionstate: string, - error: string, - } + id: string; + join?: JoinReply.AsObject; + description: Uint8Array | string; + trickle?: Trickle.AsObject; + iceconnectionstate: string; + error: string; + }; export enum PayloadCase { PAYLOAD_NOT_SET = 0, @@ -128,8 +128,8 @@ export class JoinRequest extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): JoinRequest.AsObject; static toObject(includeInstance: boolean, msg: JoinRequest): JoinRequest.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: JoinRequest, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): JoinRequest; static deserializeBinaryFromReader(message: JoinRequest, reader: jspb.BinaryReader): JoinRequest; @@ -137,10 +137,10 @@ export class JoinRequest extends jspb.Message { export namespace JoinRequest { export type AsObject = { - sid: string, - uid: string, - description: Uint8Array | string, - } + sid: string; + uid: string; + description: Uint8Array | string; + }; } export class JoinReply extends jspb.Message { @@ -152,8 +152,8 @@ export class JoinReply extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): JoinReply.AsObject; static toObject(includeInstance: boolean, msg: JoinReply): JoinReply.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: JoinReply, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): JoinReply; static deserializeBinaryFromReader(message: JoinReply, reader: jspb.BinaryReader): JoinReply; @@ -161,8 +161,8 @@ export class JoinReply extends jspb.Message { export namespace JoinReply { export type AsObject = { - description: Uint8Array | string, - } + description: Uint8Array | string; + }; } export class Trickle extends jspb.Message { @@ -175,8 +175,8 @@ export class Trickle extends jspb.Message { serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): Trickle.AsObject; static toObject(includeInstance: boolean, msg: Trickle): Trickle.AsObject; - static extensions: {[key: number]: jspb.ExtensionFieldInfo}; - static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static extensions: { [key: number]: jspb.ExtensionFieldInfo }; + static extensionsBinary: { [key: number]: jspb.ExtensionFieldBinaryInfo }; static serializeBinaryToWriter(message: Trickle, writer: jspb.BinaryWriter): void; static deserializeBinary(bytes: Uint8Array): Trickle; static deserializeBinaryFromReader(message: Trickle, reader: jspb.BinaryReader): Trickle; @@ -184,9 +184,9 @@ export class Trickle extends jspb.Message { export namespace Trickle { export type AsObject = { - target: Trickle.TargetMap[keyof Trickle.TargetMap], - init: string, - } + target: Trickle.TargetMap[keyof Trickle.TargetMap]; + init: string; + }; export interface TargetMap { PUBLISHER: 0; @@ -195,4 +195,3 @@ export namespace Trickle { export const Target: TargetMap; } - diff --git a/src/signal/_proto/library/sfu/sfu_pb_service.d.ts b/src/signal/_proto/library/sfu/sfu_pb_service.d.ts index 028c9575..064cb52f 100644 --- a/src/signal/_proto/library/sfu/sfu_pb_service.d.ts +++ b/src/signal/_proto/library/sfu/sfu_pb_service.d.ts @@ -1,8 +1,8 @@ // package: sfu // file: sfu.proto -import * as sfu_pb from "./sfu_pb"; -import {grpc} from "@improbable-eng/grpc-web"; +import * as sfu_pb from './sfu_pb'; +import { grpc } from '@improbable-eng/grpc-web'; type SFUSignal = { readonly methodName: string; @@ -18,8 +18,8 @@ export class SFU { static readonly Signal: SFUSignal; } -export type ServiceError = { message: string, code: number; metadata: grpc.Metadata } -export type Status = { details: string, code: number; metadata: grpc.Metadata } +export type ServiceError = { message: string; code: number; metadata: grpc.Metadata }; +export type Status = { details: string; code: number; metadata: grpc.Metadata }; interface UnaryResponse { cancel(): void; @@ -52,4 +52,3 @@ export class SFUClient { constructor(serviceHost: string, options?: grpc.RpcOptions); signal(metadata?: grpc.Metadata): BidirectionalStream; } - diff --git a/src/signal/biz.ts b/src/signal/biz.ts index 9c709689..fdf5d5c9 100644 --- a/src/signal/biz.ts +++ b/src/signal/biz.ts @@ -7,150 +7,152 @@ import { JoinResult, PeerState, StreamState, Message } from '../ion'; import { Uint8ArrayToJSONString } from './utils'; export class BizClient extends EventEmitter { - protected client: biz_rpc.BizClient; - protected streaming: biz_rpc.BidirectionalStream; + protected client: biz_rpc.BizClient; + protected streaming: biz_rpc.BidirectionalStream; - constructor(uri: string) { - super(); - this.client = new biz_rpc.BizClient(uri, { - transport: grpc.WebsocketTransport(), - }); + constructor(uri: string) { + super(); + this.client = new biz_rpc.BizClient(uri, { + transport: grpc.WebsocketTransport(), + }); - this.streaming = this.client.signal(); - this.streaming.on('data', (reply: biz.SignalReply) => { - switch (reply.getPayloadCase()) { - case biz.SignalReply.PayloadCase.JOINREPLY: - const result = {success: reply.getJoinreply()?.getSuccess() || false, reason: reply.getJoinreply()?.getReason() || "unkown reason"}; - this.emit('join-reply', result.success, result.reason); + this.streaming = this.client.signal(); + this.streaming.on('data', (reply: biz.SignalReply) => { + switch (reply.getPayloadCase()) { + case biz.SignalReply.PayloadCase.JOINREPLY: + const result = { + success: reply.getJoinreply()?.getSuccess() || false, + reason: reply.getJoinreply()?.getReason() || 'unkown reason', + }; + this.emit('join-reply', result.success, result.reason); + break; + case biz.SignalReply.PayloadCase.LEAVEREPLY: + const reason = reply.getLeavereply()?.getReason() || 'unkown reason'; + this.emit('leave-reply', reason); + break; + case biz.SignalReply.PayloadCase.PEEREVENT: + { + const evt = reply.getPeerevent(); + let state = PeerState.NONE; + const info = JSON.parse(Uint8ArrayToJSONString(evt?.getPeer()?.getInfo() as Uint8Array)); + switch (evt?.getState()) { + case ion.PeerEvent.State.JOIN: + state = PeerState.JOIN; break; - case biz.SignalReply.PayloadCase.LEAVEREPLY: - const reason = reply.getLeavereply()?.getReason() || "unkown reason"; - this.emit('leave-reply', reason); + case ion.PeerEvent.State.UPDATE: + state = PeerState.UPDATE; + break; - case biz.SignalReply.PayloadCase.PEEREVENT: - { - const evt = reply.getPeerevent(); - let state = PeerState.NONE; - const info = JSON.parse(Uint8ArrayToJSONString(evt?.getPeer()?.getInfo() as Uint8Array)); - switch(evt?.getState()) { - case ion.PeerEvent.State.JOIN: - state = PeerState.JOIN; - break; - case ion.PeerEvent.State.UPDATE: - state = PeerState.UPDATE; - - break; - case ion.PeerEvent.State.LEAVE: - state = PeerState.LEAVE; - break; - } - const peer = { - uid: evt?.getPeer()?.getUid() || "", - sid: evt?.getPeer()?.getSid() || "", - info: info || {}, - } - this.emit("peer-event", {state, peer}); - } + case ion.PeerEvent.State.LEAVE: + state = PeerState.LEAVE; break; - case biz.SignalReply.PayloadCase.STREAMEVENT: - { - const evt = reply.getStreamevent(); - let state = StreamState.NONE; - switch(evt?.getState()) { - case ion.StreamEvent.State.ADD: - state = StreamState.ADD; - break; - case ion.StreamEvent.State.REMOVE: - state = StreamState.REMOVE; - break; - }; - const sid = evt?.getSid() || ""; - const uid = evt?.getUid() || ""; - const streams = Array(); - evt?.getStreamsList().forEach((ionStream: ion.Stream) => { - const tracks = Array(); - ionStream.getTracksList().forEach((ionTrack: ion.Track) => { - const track = { - id: ionTrack.getId(), - label: ionTrack.getLabel(), - kind: ionTrack.getKind(), - simulcast: ionTrack.getSimulcastMap(), - } - tracks.push(track); - }); - const stream = { - id: ionStream.getId(), - tracks: tracks || [], - } - streams.push(stream); - }); - this.emit("stream-event", {state, sid, uid, streams}); - } + } + const peer = { + uid: evt?.getPeer()?.getUid() || '', + sid: evt?.getPeer()?.getSid() || '', + info: info || {}, + }; + this.emit('peer-event', { state, peer }); + } + break; + case biz.SignalReply.PayloadCase.STREAMEVENT: + { + const evt = reply.getStreamevent(); + let state = StreamState.NONE; + switch (evt?.getState()) { + case ion.StreamEvent.State.ADD: + state = StreamState.ADD; break; - case biz.SignalReply.PayloadCase.MSG: - const data = JSON.parse(Uint8ArrayToJSONString(reply.getMsg()?.getData() as Uint8Array)); - const msg = {from: reply.getMsg()?.getFrom() || "", to: reply.getMsg()?.getTo() || "", data: data || {}}; - this.emit('message', msg); + case ion.StreamEvent.State.REMOVE: + state = StreamState.REMOVE; break; } - }); - } + const sid = evt?.getSid() || ''; + const uid = evt?.getUid() || ''; + const streams = Array(); + evt?.getStreamsList().forEach((ionStream: ion.Stream) => { + const tracks = Array(); + ionStream.getTracksList().forEach((ionTrack: ion.Track) => { + const track = { + id: ionTrack.getId(), + label: ionTrack.getLabel(), + kind: ionTrack.getKind(), + simulcast: ionTrack.getSimulcastMap(), + }; + tracks.push(track); + }); + const stream = { + id: ionStream.getId(), + tracks: tracks || [], + }; + streams.push(stream); + }); + this.emit('stream-event', { state, sid, uid, streams }); + } + break; + case biz.SignalReply.PayloadCase.MSG: + const data = JSON.parse(Uint8ArrayToJSONString(reply.getMsg()?.getData() as Uint8Array)); + const msg = { from: reply.getMsg()?.getFrom() || '', to: reply.getMsg()?.getTo() || '', data: data || {} }; + this.emit('message', msg); + break; + } + }); + } + async join(sid: string, uid: string, info: Map, token: string | undefined): Promise { + const request = new biz.SignalRequest(); + const join = new biz.Join(); + join.setToken(token || ''); + const peer = new ion.Peer(); + peer.setSid(sid); + peer.setUid(uid); - async join(sid: string, uid: string, info: Map, token: string | undefined): Promise { - const request = new biz.SignalRequest(); - const join = new biz.Join(); - join.setToken(token || ''); - const peer = new ion.Peer(); - peer.setSid(sid); - peer.setUid(uid); + const buffer = Uint8Array.from(JSON.stringify(info), (c) => c.charCodeAt(0)); + peer.setInfo(buffer); - const buffer = Uint8Array.from(JSON.stringify(info), (c) => c.charCodeAt(0)); - peer.setInfo(buffer); + join.setPeer(peer); + request.setJoin(join); - join.setPeer(peer); - request.setJoin(join); - - this.streaming.write(request); + this.streaming.write(request); - return new Promise((resolve, reject) => { - const handler = (result: JoinResult) => { - resolve(result); - this.removeListener('join-reply', handler); - }; - this.addListener('join-reply', handler); - }); - } + return new Promise((resolve, reject) => { + const handler = (result: JoinResult) => { + resolve(result); + this.removeListener('join-reply', handler); + }; + this.addListener('join-reply', handler); + }); + } - async leave(uid: string) { - const request = new biz.SignalRequest(); - const leave = new biz.Leave(); - leave.setUid(uid); - request.setLeave(leave); + async leave(uid: string) { + const request = new biz.SignalRequest(); + const leave = new biz.Leave(); + leave.setUid(uid); + request.setLeave(leave); - this.streaming.write(request); + this.streaming.write(request); - return new Promise((resolve, reject) => { - const handler = (reason: string) => { - resolve(reason); - this.removeListener('join-reply', handler); - }; - this.addListener('join-reply', handler); - }); - } + return new Promise((resolve, reject) => { + const handler = (reason: string) => { + resolve(reason); + this.removeListener('join-reply', handler); + }; + this.addListener('join-reply', handler); + }); + } - async sendMessage(from: string, to: string, data: Map) { - const request = new biz.SignalRequest(); - const message = new ion.Message(); - message.setFrom(from); - message.setTo(to); - const buffer = Uint8Array.from(JSON.stringify(data), (c) => c.charCodeAt(0)); - message.setData(buffer); - request.setMsg(message); - this.streaming.write(request); - } + async sendMessage(from: string, to: string, data: Map) { + const request = new biz.SignalRequest(); + const message = new ion.Message(); + message.setFrom(from); + message.setTo(to); + const buffer = Uint8Array.from(JSON.stringify(data), (c) => c.charCodeAt(0)); + message.setData(buffer); + request.setMsg(message); + this.streaming.write(request); + } - close () { - this.streaming.end(); - } -} \ No newline at end of file + close() { + this.streaming.end(); + } +} diff --git a/src/signal/utils.ts b/src/signal/utils.ts index 4b7ca17f..ec20ba59 100644 --- a/src/signal/utils.ts +++ b/src/signal/utils.ts @@ -1,6 +1,6 @@ export function Uint8ArrayToJSONString(dataArray: Uint8Array): string { let dataString = ''; - if(dataArray.length >= 2) { + if (dataArray.length >= 2) { for (const element of dataArray) { dataString += String.fromCharCode(element); } @@ -8,4 +8,4 @@ export function Uint8ArrayToJSONString(dataArray: Uint8Array): string { dataString = '{}'; } return dataString; -} \ No newline at end of file +} diff --git a/src/stream.ts b/src/stream.ts index 17e8a77b..9d40110c 100644 --- a/src/stream.ts +++ b/src/stream.ts @@ -387,7 +387,7 @@ export class LocalStream extends MediaStream { async enableLayers(layers: Layer[]) { const call = { streamId: this.id, - layers + layers, }; const callStr = JSON.stringify(call); @@ -400,33 +400,37 @@ export class LocalStream extends MediaStream { } } const layerValues = ['high', 'medium', 'low'] as const; - await Promise.all(layerValues.map(async (layer) => { - await this.updateMediaEncodingParams({active: layers.includes(layer)}, layer) - })); + await Promise.all( + layerValues.map(async (layer) => { + await this.updateMediaEncodingParams({ active: layers.includes(layer) }, layer); + }), + ); } async updateMediaEncodingParams(encodingParams: RTCRtpEncodingParameters, layer?: Layer) { if (!this.pc) return; const tracks = this.getTracks(); - await Promise.all(this.pc?.getSenders() - .filter(sender => sender.track && tracks.includes(sender.track)) - .map(async (sender) => { - const params = sender.getParameters(); - if (!params.encodings) { - params.encodings = [{}]; - } - let idx = 0; - if (this.constraints.simulcast && layer) { - const rid = layer === 'high' ? 'f' : layer === 'medium' ? 'h' : 'q'; - idx = params.encodings.findIndex(encoding => encoding.rid === rid); - if (params.encodings.length < idx + 1) return; - } - params.encodings[idx] = { - ...params.encodings[idx], - ...encodingParams, - }; - await sender.setParameters(params); - }) + await Promise.all( + this.pc + ?.getSenders() + .filter((sender) => sender.track && tracks.includes(sender.track)) + .map(async (sender) => { + const params = sender.getParameters(); + if (!params.encodings) { + params.encodings = [{}]; + } + let idx = 0; + if (this.constraints.simulcast && layer) { + const rid = layer === 'high' ? 'f' : layer === 'medium' ? 'h' : 'q'; + idx = params.encodings.findIndex((encoding) => encoding.rid === rid); + if (params.encodings.length < idx + 1) return; + } + params.encodings[idx] = { + ...params.encodings[idx], + ...encodingParams, + }; + await sender.setParameters(params); + }), ); } }