From b9efe776e04ef1631f6af702aa3642f41c0cd1fd Mon Sep 17 00:00:00 2001 From: aoife cassidy Date: Tue, 20 Aug 2024 10:50:42 -0700 Subject: [PATCH 1/6] bump(ffi): LocalTrackSubscribed, DisconnectReason --- packages/livekit-rtc/rust-sdks | 2 +- packages/livekit-rtc/src/proto/room_pb.ts | 210 ++++++++++++++++++---- packages/livekit-rtc/src/room.ts | 14 +- 3 files changed, 192 insertions(+), 34 deletions(-) diff --git a/packages/livekit-rtc/rust-sdks b/packages/livekit-rtc/rust-sdks index 8c8bf0a5..b9644e8d 160000 --- a/packages/livekit-rtc/rust-sdks +++ b/packages/livekit-rtc/rust-sdks @@ -1 +1 @@ -Subproject commit 8c8bf0a5fca4eb1808c6780b2e2e0aab9990836f +Subproject commit b9644e8ddc28c8bfe23d65880cecd272fa0e7e43 diff --git a/packages/livekit-rtc/src/proto/room_pb.ts b/packages/livekit-rtc/src/proto/room_pb.ts index 1a57a301..fefc54b7 100644 --- a/packages/livekit-rtc/src/proto/room_pb.ts +++ b/packages/livekit-rtc/src/proto/room_pb.ts @@ -150,6 +150,100 @@ proto3.util.setEnumType(DataPacketKind, "livekit.proto.DataPacketKind", [ { no: 1, name: "KIND_RELIABLE" }, ]); +/** + * @generated from enum livekit.proto.DisconnectReason + */ +export enum DisconnectReason { + /** + * @generated from enum value: UNKNOWN_REASON = 0; + */ + UNKNOWN_REASON = 0, + + /** + * the client initiated the disconnect + * + * @generated from enum value: CLIENT_INITIATED = 1; + */ + CLIENT_INITIATED = 1, + + /** + * another participant with the same identity has joined the room + * + * @generated from enum value: DUPLICATE_IDENTITY = 2; + */ + DUPLICATE_IDENTITY = 2, + + /** + * the server instance is shutting down + * + * @generated from enum value: SERVER_SHUTDOWN = 3; + */ + SERVER_SHUTDOWN = 3, + + /** + * RoomService.RemoveParticipant was called + * + * @generated from enum value: PARTICIPANT_REMOVED = 4; + */ + PARTICIPANT_REMOVED = 4, + + /** + * RoomService.DeleteRoom was called + * + * @generated from enum value: ROOM_DELETED = 5; + */ + ROOM_DELETED = 5, + + /** + * the client is attempting to resume a session, but server is not aware of it + * + * @generated from enum value: STATE_MISMATCH = 6; + */ + STATE_MISMATCH = 6, + + /** + * client was unable to connect fully + * + * @generated from enum value: JOIN_FAILURE = 7; + */ + JOIN_FAILURE = 7, + + /** + * Cloud-only, the server requested Participant to migrate the connection elsewhere + * + * @generated from enum value: MIGRATION = 8; + */ + MIGRATION = 8, + + /** + * the signal websocket was closed unexpectedly + * + * @generated from enum value: SIGNAL_CLOSE = 9; + */ + SIGNAL_CLOSE = 9, + + /** + * the room was closed, due to all Standard and Ingress participants having left + * + * @generated from enum value: ROOM_CLOSED = 10; + */ + ROOM_CLOSED = 10, +} +// Retrieve enum metadata with: proto3.getEnumType(DisconnectReason) +proto3.util.setEnumType(DisconnectReason, "livekit.proto.DisconnectReason", [ + { no: 0, name: "UNKNOWN_REASON" }, + { no: 1, name: "CLIENT_INITIATED" }, + { no: 2, name: "DUPLICATE_IDENTITY" }, + { no: 3, name: "SERVER_SHUTDOWN" }, + { no: 4, name: "PARTICIPANT_REMOVED" }, + { no: 5, name: "ROOM_DELETED" }, + { no: 6, name: "STATE_MISMATCH" }, + { no: 7, name: "JOIN_FAILURE" }, + { no: 8, name: "MIGRATION" }, + { no: 9, name: "SIGNAL_CLOSE" }, + { no: 10, name: "ROOM_CLOSED" }, +]); + /** * Connect to a new LiveKit room * @@ -1857,6 +1951,11 @@ export class TrackPublishOptions extends Message { */ source = TrackSource.SOURCE_UNKNOWN; + /** + * @generated from field: string stream = 8; + */ + stream = ""; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -1872,6 +1971,7 @@ export class TrackPublishOptions extends Message { { no: 5, name: "red", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, { no: 6, name: "simulcast", kind: "scalar", T: 8 /* ScalarType.BOOL */ }, { no: 7, name: "source", kind: "enum", T: proto3.getEnumType(TrackSource) }, + { no: 8, name: "stream", kind: "scalar", T: 9 /* ScalarType.STRING */ }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): TrackPublishOptions { @@ -2251,91 +2351,97 @@ export class RoomEvent extends Message { case: "localTrackUnpublished"; } | { /** - * @generated from field: livekit.proto.TrackPublished track_published = 6; + * @generated from field: livekit.proto.LocalTrackSubscribed local_track_subscribed = 6; + */ + value: LocalTrackSubscribed; + case: "localTrackSubscribed"; + } | { + /** + * @generated from field: livekit.proto.TrackPublished track_published = 7; */ value: TrackPublished; case: "trackPublished"; } | { /** - * @generated from field: livekit.proto.TrackUnpublished track_unpublished = 7; + * @generated from field: livekit.proto.TrackUnpublished track_unpublished = 8; */ value: TrackUnpublished; case: "trackUnpublished"; } | { /** - * @generated from field: livekit.proto.TrackSubscribed track_subscribed = 8; + * @generated from field: livekit.proto.TrackSubscribed track_subscribed = 9; */ value: TrackSubscribed; case: "trackSubscribed"; } | { /** - * @generated from field: livekit.proto.TrackUnsubscribed track_unsubscribed = 9; + * @generated from field: livekit.proto.TrackUnsubscribed track_unsubscribed = 10; */ value: TrackUnsubscribed; case: "trackUnsubscribed"; } | { /** - * @generated from field: livekit.proto.TrackSubscriptionFailed track_subscription_failed = 10; + * @generated from field: livekit.proto.TrackSubscriptionFailed track_subscription_failed = 11; */ value: TrackSubscriptionFailed; case: "trackSubscriptionFailed"; } | { /** - * @generated from field: livekit.proto.TrackMuted track_muted = 11; + * @generated from field: livekit.proto.TrackMuted track_muted = 12; */ value: TrackMuted; case: "trackMuted"; } | { /** - * @generated from field: livekit.proto.TrackUnmuted track_unmuted = 12; + * @generated from field: livekit.proto.TrackUnmuted track_unmuted = 13; */ value: TrackUnmuted; case: "trackUnmuted"; } | { /** - * @generated from field: livekit.proto.ActiveSpeakersChanged active_speakers_changed = 13; + * @generated from field: livekit.proto.ActiveSpeakersChanged active_speakers_changed = 14; */ value: ActiveSpeakersChanged; case: "activeSpeakersChanged"; } | { /** - * @generated from field: livekit.proto.RoomMetadataChanged room_metadata_changed = 14; + * @generated from field: livekit.proto.RoomMetadataChanged room_metadata_changed = 15; */ value: RoomMetadataChanged; case: "roomMetadataChanged"; } | { /** - * @generated from field: livekit.proto.RoomSidChanged room_sid_changed = 15; + * @generated from field: livekit.proto.RoomSidChanged room_sid_changed = 16; */ value: RoomSidChanged; case: "roomSidChanged"; } | { /** - * @generated from field: livekit.proto.ParticipantMetadataChanged participant_metadata_changed = 16; + * @generated from field: livekit.proto.ParticipantMetadataChanged participant_metadata_changed = 17; */ value: ParticipantMetadataChanged; case: "participantMetadataChanged"; } | { /** - * @generated from field: livekit.proto.ParticipantNameChanged participant_name_changed = 17; + * @generated from field: livekit.proto.ParticipantNameChanged participant_name_changed = 18; */ value: ParticipantNameChanged; case: "participantNameChanged"; } | { /** - * @generated from field: livekit.proto.ParticipantAttributesChanged participant_attributes_changed = 18; + * @generated from field: livekit.proto.ParticipantAttributesChanged participant_attributes_changed = 19; */ value: ParticipantAttributesChanged; case: "participantAttributesChanged"; } | { /** - * @generated from field: livekit.proto.ConnectionQualityChanged connection_quality_changed = 19; + * @generated from field: livekit.proto.ConnectionQualityChanged connection_quality_changed = 20; */ value: ConnectionQualityChanged; case: "connectionQualityChanged"; } | { /** - * @generated from field: livekit.proto.ConnectionStateChanged connection_state_changed = 20; + * @generated from field: livekit.proto.ConnectionStateChanged connection_state_changed = 21; */ value: ConnectionStateChanged; case: "connectionStateChanged"; @@ -2400,21 +2506,22 @@ export class RoomEvent extends Message { { no: 3, name: "participant_disconnected", kind: "message", T: ParticipantDisconnected, oneof: "message" }, { no: 4, name: "local_track_published", kind: "message", T: LocalTrackPublished, oneof: "message" }, { no: 5, name: "local_track_unpublished", kind: "message", T: LocalTrackUnpublished, oneof: "message" }, - { no: 6, name: "track_published", kind: "message", T: TrackPublished, oneof: "message" }, - { no: 7, name: "track_unpublished", kind: "message", T: TrackUnpublished, oneof: "message" }, - { no: 8, name: "track_subscribed", kind: "message", T: TrackSubscribed, oneof: "message" }, - { no: 9, name: "track_unsubscribed", kind: "message", T: TrackUnsubscribed, oneof: "message" }, - { no: 10, name: "track_subscription_failed", kind: "message", T: TrackSubscriptionFailed, oneof: "message" }, - { no: 11, name: "track_muted", kind: "message", T: TrackMuted, oneof: "message" }, - { no: 12, name: "track_unmuted", kind: "message", T: TrackUnmuted, oneof: "message" }, - { no: 13, name: "active_speakers_changed", kind: "message", T: ActiveSpeakersChanged, oneof: "message" }, - { no: 14, name: "room_metadata_changed", kind: "message", T: RoomMetadataChanged, oneof: "message" }, - { no: 15, name: "room_sid_changed", kind: "message", T: RoomSidChanged, oneof: "message" }, - { no: 16, name: "participant_metadata_changed", kind: "message", T: ParticipantMetadataChanged, oneof: "message" }, - { no: 17, name: "participant_name_changed", kind: "message", T: ParticipantNameChanged, oneof: "message" }, - { no: 18, name: "participant_attributes_changed", kind: "message", T: ParticipantAttributesChanged, oneof: "message" }, - { no: 19, name: "connection_quality_changed", kind: "message", T: ConnectionQualityChanged, oneof: "message" }, - { no: 20, name: "connection_state_changed", kind: "message", T: ConnectionStateChanged, oneof: "message" }, + { no: 6, name: "local_track_subscribed", kind: "message", T: LocalTrackSubscribed, oneof: "message" }, + { no: 7, name: "track_published", kind: "message", T: TrackPublished, oneof: "message" }, + { no: 8, name: "track_unpublished", kind: "message", T: TrackUnpublished, oneof: "message" }, + { no: 9, name: "track_subscribed", kind: "message", T: TrackSubscribed, oneof: "message" }, + { no: 10, name: "track_unsubscribed", kind: "message", T: TrackUnsubscribed, oneof: "message" }, + { no: 11, name: "track_subscription_failed", kind: "message", T: TrackSubscriptionFailed, oneof: "message" }, + { no: 12, name: "track_muted", kind: "message", T: TrackMuted, oneof: "message" }, + { no: 13, name: "track_unmuted", kind: "message", T: TrackUnmuted, oneof: "message" }, + { no: 14, name: "active_speakers_changed", kind: "message", T: ActiveSpeakersChanged, oneof: "message" }, + { no: 15, name: "room_metadata_changed", kind: "message", T: RoomMetadataChanged, oneof: "message" }, + { no: 16, name: "room_sid_changed", kind: "message", T: RoomSidChanged, oneof: "message" }, + { no: 17, name: "participant_metadata_changed", kind: "message", T: ParticipantMetadataChanged, oneof: "message" }, + { no: 18, name: "participant_name_changed", kind: "message", T: ParticipantNameChanged, oneof: "message" }, + { no: 19, name: "participant_attributes_changed", kind: "message", T: ParticipantAttributesChanged, oneof: "message" }, + { no: 20, name: "connection_quality_changed", kind: "message", T: ConnectionQualityChanged, oneof: "message" }, + { no: 21, name: "connection_state_changed", kind: "message", T: ConnectionStateChanged, oneof: "message" }, { no: 22, name: "disconnected", kind: "message", T: Disconnected, oneof: "message" }, { no: 23, name: "reconnecting", kind: "message", T: Reconnecting, oneof: "message" }, { no: 24, name: "reconnected", kind: "message", T: Reconnected, oneof: "message" }, @@ -2684,6 +2791,43 @@ export class LocalTrackUnpublished extends Message { } } +/** + * @generated from message livekit.proto.LocalTrackSubscribed + */ +export class LocalTrackSubscribed extends Message { + /** + * @generated from field: string track_sid = 2; + */ + trackSid = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "livekit.proto.LocalTrackSubscribed"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 2, name: "track_sid", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): LocalTrackSubscribed { + return new LocalTrackSubscribed().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): LocalTrackSubscribed { + return new LocalTrackSubscribed().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): LocalTrackSubscribed { + return new LocalTrackSubscribed().fromJsonString(jsonString, options); + } + + static equals(a: LocalTrackSubscribed | PlainMessage | undefined, b: LocalTrackSubscribed | PlainMessage | undefined): boolean { + return proto3.util.equals(LocalTrackSubscribed, a, b); + } +} + /** * @generated from message livekit.proto.TrackPublished */ @@ -3601,6 +3745,11 @@ export class Connected extends Message { * @generated from message livekit.proto.Disconnected */ export class Disconnected extends Message { + /** + * @generated from field: livekit.proto.DisconnectReason reason = 1; + */ + reason = DisconnectReason.UNKNOWN_REASON; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -3609,6 +3758,7 @@ export class Disconnected extends Message { static readonly runtime: typeof proto3 = proto3; static readonly typeName = "livekit.proto.Disconnected"; static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "reason", kind: "enum", T: proto3.getEnumType(DisconnectReason) }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): Disconnected { diff --git a/packages/livekit-rtc/src/room.ts b/packages/livekit-rtc/src/room.ts index 56f591fb..bf0ff150 100644 --- a/packages/livekit-rtc/src/room.ts +++ b/packages/livekit-rtc/src/room.ts @@ -16,6 +16,7 @@ import type { ConnectResponse, ConnectionQuality, DataPacketKind, + DisconnectReason, DisconnectResponse, IceServer, RoomInfo, @@ -27,7 +28,7 @@ import { IceTransportType, } from './proto/room_pb.js'; import { TrackKind } from './proto/track_pb.js'; -import type { RemoteTrack } from './track.js'; +import type { LocalTrack, RemoteTrack } from './track.js'; import { RemoteAudioTrack, RemoteVideoTrack } from './track.js'; import type { LocalTrackPublication, TrackPublication } from './track_publication.js'; import { RemoteTrackPublication } from './track_publication.js'; @@ -185,6 +186,9 @@ export class Room extends (EventEmitter as new () => TypedEmitter const publication = this.localParticipant.trackPublications.get(ev.value.publicationSid); this.localParticipant.trackPublications.delete(ev.value.publicationSid); this.emit(RoomEvent.LocalTrackUnpublished, publication, this.localParticipant); + } else if (ev.case == 'localTrackSubscribed') { + const publication = this.localParticipant.trackPublications.get(ev.value.trackSid); + this.emit(RoomEvent.LocalTrackSubscribed, publication.track); } else if (ev.case == 'trackPublished') { const participant = this.remoteParticipants.get(ev.value.participantIdentity); const publication = new RemoteTrackPublication(ev.value.publication); @@ -295,7 +299,7 @@ export class Room extends (EventEmitter as new () => TypedEmitter /*} else if (ev.case == 'connected') { this.emit(RoomEvent.Connected);*/ } else if (ev.case == 'disconnected') { - this.emit(RoomEvent.Disconnected); + this.emit(RoomEvent.Disconnected, ev.value.reason); } else if (ev.case == 'reconnecting') { this.emit(RoomEvent.Reconnecting); } else if (ev.case == 'reconnected') { @@ -336,6 +340,9 @@ export type RoomCallbacks = { publication: LocalTrackPublication, participant: LocalParticipant, ) => void; + localTrackSubscribed: ( + track: LocalTrack, + ) => void; trackPublished: (publication: RemoteTrackPublication, participant: RemoteParticipant) => void; trackUnpublished: (publication: RemoteTrackPublication, participant: RemoteParticipant) => void; trackSubscribed: ( @@ -374,7 +381,7 @@ export type RoomCallbacks = { encryptionError: (error: Error) => void; connectionStateChanged: (state: ConnectionState) => void; connected: () => void; - disconnected: (reason?: string) => void; + disconnected: (reason: DisconnectReason) => void; reconnecting: () => void; reconnected: () => void; }; @@ -384,6 +391,7 @@ export enum RoomEvent { ParticipantDisconnected = 'participantDisconnected', LocalTrackPublished = 'localTrackPublished', LocalTrackUnpublished = 'localTrackUnpublished', + LocalTrackSubscribed = 'localTrackSubscribed', TrackPublished = 'trackPublished', TrackUnpublished = 'trackUnpublished', TrackSubscribed = 'trackSubscribed', From b31fb89683f013d9018d157df96d79b565e5c60f Mon Sep 17 00:00:00 2001 From: aoife cassidy Date: Tue, 20 Aug 2024 10:55:18 -0700 Subject: [PATCH 2/6] lint --- packages/livekit-rtc/src/room.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/livekit-rtc/src/room.ts b/packages/livekit-rtc/src/room.ts index bf0ff150..7a9514cd 100644 --- a/packages/livekit-rtc/src/room.ts +++ b/packages/livekit-rtc/src/room.ts @@ -340,9 +340,7 @@ export type RoomCallbacks = { publication: LocalTrackPublication, participant: LocalParticipant, ) => void; - localTrackSubscribed: ( - track: LocalTrack, - ) => void; + localTrackSubscribed: (track: LocalTrack) => void; trackPublished: (publication: RemoteTrackPublication, participant: RemoteParticipant) => void; trackUnpublished: (publication: RemoteTrackPublication, participant: RemoteParticipant) => void; trackSubscribed: ( From 805ca1af59d25ce3b1dc528104bb1ce45f62b9f9 Mon Sep 17 00:00:00 2001 From: aoife cassidy Date: Tue, 20 Aug 2024 13:03:59 -0700 Subject: [PATCH 3/6] bump rust-sdks --- packages/livekit-rtc/rust-sdks | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/livekit-rtc/rust-sdks b/packages/livekit-rtc/rust-sdks index b9644e8d..1abf0929 160000 --- a/packages/livekit-rtc/rust-sdks +++ b/packages/livekit-rtc/rust-sdks @@ -1 +1 @@ -Subproject commit b9644e8ddc28c8bfe23d65880cecd272fa0e7e43 +Subproject commit 1abf092970e2e5dfe2bfb0bf6ca2d5f55c63c1ce From 7f7a359e6f11d1863e9e43b584885e2b7c3b01e7 Mon Sep 17 00:00:00 2001 From: aoife cassidy Date: Tue, 20 Aug 2024 13:05:05 -0700 Subject: [PATCH 4/6] Create little-cougars-lick.md --- .changeset/little-cougars-lick.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/little-cougars-lick.md diff --git a/.changeset/little-cougars-lick.md b/.changeset/little-cougars-lick.md new file mode 100644 index 00000000..b6e6c039 --- /dev/null +++ b/.changeset/little-cougars-lick.md @@ -0,0 +1,5 @@ +--- +"@livekit/rtc-node": patch +--- + +bump(ffi): LocalTrackSubscribed, DisconnectReason From 3112d02a92b714b89e6b9eaaf7b74857ea28f18a Mon Sep 17 00:00:00 2001 From: aoife cassidy Date: Tue, 20 Aug 2024 13:12:49 -0700 Subject: [PATCH 5/6] Update little-cougars-lick.md --- .changeset/little-cougars-lick.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/little-cougars-lick.md b/.changeset/little-cougars-lick.md index b6e6c039..313b5dc9 100644 --- a/.changeset/little-cougars-lick.md +++ b/.changeset/little-cougars-lick.md @@ -1,5 +1,5 @@ --- -"@livekit/rtc-node": patch +"@livekit/rtc-node": minor --- bump(ffi): LocalTrackSubscribed, DisconnectReason From 3c28b096dcea2e881db181f81857849b7ddc76ae Mon Sep 17 00:00:00 2001 From: aoife cassidy Date: Tue, 20 Aug 2024 13:49:08 -0700 Subject: [PATCH 6/6] bump --- packages/livekit-rtc/rust-sdks | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/livekit-rtc/rust-sdks b/packages/livekit-rtc/rust-sdks index 1abf0929..e8496a98 160000 --- a/packages/livekit-rtc/rust-sdks +++ b/packages/livekit-rtc/rust-sdks @@ -1 +1 @@ -Subproject commit 1abf092970e2e5dfe2bfb0bf6ca2d5f55c63c1ce +Subproject commit e8496a987c054a23ca1a5ad0c90797cd37bca5b9