@@ -15,6 +15,7 @@ import {
1515} from "livekit-client" ;
1616import { type Room as MatrixRoom } from "matrix-js-sdk" ;
1717import {
18+ catchError ,
1819 combineLatest ,
1920 distinctUntilChanged ,
2021 filter ,
@@ -93,14 +94,14 @@ import {
9394 type SpotlightLandscapeLayoutMedia ,
9495 type SpotlightPortraitLayoutMedia ,
9596} from "../layout-types.ts" ;
96- import { type ElementCallError } from "../../utils/errors.ts" ;
97+ import { ElementCallError } from "../../utils/errors.ts" ;
9798import { type ObservableScope } from "../ObservableScope.ts" ;
9899import { createHomeserverConnected$ } from "./localMember/HomeserverConnected.ts" ;
99100import {
100101 createLocalMembership$ ,
101102 enterRTCSession ,
102- RTCBackendState ,
103- } from "./localMember/LocalMembership .ts" ;
103+ TransportState ,
104+ } from "./localMember/LocalMember .ts" ;
104105import { createLocalTransport$ } from "./localMember/LocalTransport.ts" ;
105106import {
106107 createMemberships$ ,
@@ -425,7 +426,18 @@ export function createCallViewModel$(
425426 connectionFactory : connectionFactory ,
426427 inputTransports$ : scope . behavior (
427428 combineLatest (
428- [ localTransport$ , membershipsAndTransports . transports$ ] ,
429+ [
430+ localTransport$ . pipe (
431+ catchError ( ( e : unknown ) => {
432+ logger . info (
433+ "dont pass local transport to createConnectionManager$. localTransport$ threw an error" ,
434+ e ,
435+ ) ;
436+ return of ( null ) ;
437+ } ) ,
438+ ) ,
439+ membershipsAndTransports . transports$ ,
440+ ] ,
429441 ( localTransport , transports ) => {
430442 const localTransportAsArray = localTransport ? [ localTransport ] : [ ] ;
431443 return transports . mapInner ( ( transports ) => [
@@ -457,13 +469,13 @@ export function createCallViewModel$(
457469
458470 const localMembership = createLocalMembership$ ( {
459471 scope : scope ,
460- homeserverConnected$ : createHomeserverConnected$ (
472+ homeserverConnected : createHomeserverConnected$ (
461473 scope ,
462474 client ,
463475 matrixRTCSession ,
464476 ) ,
465477 muteStates : muteStates ,
466- joinMatrixRTC : async ( transport : LivekitTransport ) => {
478+ joinMatrixRTC : ( transport : LivekitTransport ) => {
467479 return enterRTCSession (
468480 matrixRTCSession ,
469481 transport ,
@@ -578,17 +590,6 @@ export function createCallViewModel$(
578590 ) ,
579591 ) ;
580592
581- /**
582- * Whether various media/event sources should pretend to be disconnected from
583- * all network input, even if their connection still technically works.
584- */
585- // We do this when the app is in the 'reconnecting' state, because it might be
586- // that the LiveKit connection is still functional while the homeserver is
587- // down, for example, and we want to avoid making people worry that the app is
588- // in a split-brained state.
589- // DISCUSSION own membership manager ALSO this probably can be simplifis
590- const reconnecting$ = localMembership . reconnecting$ ;
591-
592593 const audioParticipants$ = scope . behavior (
593594 matrixLivekitMembers$ . pipe (
594595 switchMap ( ( membersWithEpoch ) => {
@@ -636,7 +637,7 @@ export function createCallViewModel$(
636637 ) ;
637638
638639 const handsRaised$ = scope . behavior (
639- handsRaisedSubject$ . pipe ( pauseWhen ( reconnecting$ ) ) ,
640+ handsRaisedSubject$ . pipe ( pauseWhen ( localMembership . reconnecting$ ) ) ,
640641 ) ;
641642
642643 const reactions$ = scope . behavior (
@@ -649,7 +650,7 @@ export function createCallViewModel$(
649650 ] ) ,
650651 ) ,
651652 ) ,
652- pauseWhen ( reconnecting$ ) ,
653+ pauseWhen ( localMembership . reconnecting$ ) ,
653654 ) ,
654655 ) ;
655656
@@ -740,7 +741,7 @@ export function createCallViewModel$(
740741 livekitRoom$ ,
741742 focusUrl$ ,
742743 mediaDevices ,
743- reconnecting$ ,
744+ localMembership . reconnecting$ ,
744745 displayName$ ,
745746 matrixMemberMetadataStore . createAvatarUrlBehavior$ ( userId ) ,
746747 handsRaised$ . pipe ( map ( ( v ) => v [ participantId ] ?. time ?? null ) ) ,
@@ -1423,13 +1424,44 @@ export function createCallViewModel$(
14231424 // reassigned here to make it publicly accessible
14241425 const toggleScreenSharing = localMembership . toggleScreenSharing ;
14251426
1427+ const errors$ = scope . behavior < {
1428+ transportError ?: ElementCallError ;
1429+ matrixError ?: ElementCallError ;
1430+ connectionError ?: ElementCallError ;
1431+ publishError ?: ElementCallError ;
1432+ } | null > (
1433+ localMembership . localMemberState$ . pipe (
1434+ map ( ( value ) => {
1435+ const returnObject : {
1436+ transportError ?: ElementCallError ;
1437+ matrixError ?: ElementCallError ;
1438+ connectionError ?: ElementCallError ;
1439+ publishError ?: ElementCallError ;
1440+ } = { } ;
1441+ if ( value instanceof ElementCallError ) return { transportError : value } ;
1442+ if ( value === TransportState . Waiting ) return null ;
1443+ if ( value . matrix instanceof ElementCallError )
1444+ returnObject . matrixError = value . matrix ;
1445+ if ( value . media instanceof ElementCallError )
1446+ returnObject . publishError = value . media ;
1447+ else if (
1448+ typeof value . media === "object" &&
1449+ value . media . connection instanceof ElementCallError
1450+ )
1451+ returnObject . connectionError = value . media . connection ;
1452+ return returnObject ;
1453+ } ) ,
1454+ ) ,
1455+ null ,
1456+ ) ;
1457+
14261458 return {
14271459 autoLeave$ : autoLeave$ ,
14281460 callPickupState$ : callPickupState$ ,
14291461 ringOverlay$ : ringOverlay$ ,
14301462 leave$ : leave$ ,
14311463 hangup : ( ) : void => userHangup$ . next ( ) ,
1432- join : localMembership . requestConnect ,
1464+ join : localMembership . requestJoinAndPublish ,
14331465 toggleScreenSharing : toggleScreenSharing ,
14341466 sharingScreen$ : sharingScreen$ ,
14351467
@@ -1439,9 +1471,17 @@ export function createCallViewModel$(
14391471 unhoverScreen : ( ) : void => screenUnhover$ . next ( ) ,
14401472
14411473 fatalError$ : scope . behavior (
1442- localMembership . connectionState . livekit$ . pipe (
1443- filter ( ( v ) => v . state === RTCBackendState . Error ) ,
1444- map ( ( s ) => s . error ) ,
1474+ errors$ . pipe (
1475+ map ( ( errors ) => {
1476+ logger . debug ( "errors$ to compute any fatal errors:" , errors ) ;
1477+ return (
1478+ errors ?. transportError ??
1479+ errors ?. matrixError ??
1480+ errors ?. connectionError ??
1481+ null
1482+ ) ;
1483+ } ) ,
1484+ filter ( ( error ) => error !== null ) ,
14451485 ) ,
14461486 null ,
14471487 ) ,
@@ -1474,7 +1514,7 @@ export function createCallViewModel$(
14741514 showFooter$ : showFooter$ ,
14751515 earpieceMode$ : earpieceMode$ ,
14761516 audioOutputSwitcher$ : audioOutputSwitcher$ ,
1477- reconnecting$ : reconnecting$ ,
1517+ reconnecting$ : localMembership . reconnecting$ ,
14781518 } ;
14791519}
14801520
0 commit comments