Fix resource leak due to unsafe scope reference
This commit is contained in:
@@ -60,6 +60,7 @@ import {
|
|||||||
import {
|
import {
|
||||||
accumulate,
|
accumulate,
|
||||||
filterBehavior,
|
filterBehavior,
|
||||||
|
generateItem,
|
||||||
generateItems,
|
generateItems,
|
||||||
pauseWhen,
|
pauseWhen,
|
||||||
} from "../../utils/observable";
|
} from "../../utils/observable";
|
||||||
@@ -446,29 +447,33 @@ export function createCallViewModel$(
|
|||||||
|
|
||||||
const localTransport$ = scope.behavior(
|
const localTransport$ = scope.behavior(
|
||||||
matrixRTCMode$.pipe(
|
matrixRTCMode$.pipe(
|
||||||
map((mode) =>
|
generateItem(
|
||||||
createLocalTransport$({
|
"CallViewModel localTransport$",
|
||||||
scope: scope,
|
// Re-create LocalTransport whenever the mode changes
|
||||||
memberships$: memberships$,
|
(mode) => ({ keys: [mode], data: undefined }),
|
||||||
ownMembershipIdentity,
|
(scope, _data$, mode) =>
|
||||||
client,
|
createLocalTransport$({
|
||||||
delayId$: scope.behavior(
|
scope: scope,
|
||||||
(
|
memberships$: memberships$,
|
||||||
fromEvent(
|
ownMembershipIdentity,
|
||||||
matrixRTCSession,
|
client,
|
||||||
MembershipManagerEvent.DelayIdChanged,
|
delayId$: scope.behavior(
|
||||||
// The type of reemitted event includes the original emitted as the second arg.
|
(
|
||||||
) as Observable<[string | undefined, IMembershipManager]>
|
fromEvent(
|
||||||
).pipe(map(([delayId]) => delayId ?? null)),
|
matrixRTCSession,
|
||||||
matrixRTCSession.delayId ?? null,
|
MembershipManagerEvent.DelayIdChanged,
|
||||||
),
|
// The type of reemitted event includes the original emitted as the second arg.
|
||||||
roomId: matrixRoom.roomId,
|
) as Observable<[string | undefined, IMembershipManager]>
|
||||||
forceJwtEndpoint:
|
).pipe(map(([delayId]) => delayId ?? null)),
|
||||||
mode === MatrixRTCMode.Matrix_2_0
|
matrixRTCSession.delayId ?? null,
|
||||||
? JwtEndpointVersion.Matrix_2_0
|
),
|
||||||
: JwtEndpointVersion.Legacy,
|
roomId: matrixRoom.roomId,
|
||||||
useOldestMember: mode === MatrixRTCMode.Legacy,
|
forceJwtEndpoint:
|
||||||
}),
|
mode === MatrixRTCMode.Matrix_2_0
|
||||||
|
? JwtEndpointVersion.Matrix_2_0
|
||||||
|
: JwtEndpointVersion.Legacy,
|
||||||
|
useOldestMember: mode === MatrixRTCMode.Legacy,
|
||||||
|
}),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -213,6 +213,38 @@ export function filterBehavior<T, S extends T>(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps a changing input value to an item whose lifetime is tied to a certain
|
||||||
|
* computed key. The item may capture some dynamic data from the input.
|
||||||
|
*/
|
||||||
|
export function generateItem<
|
||||||
|
Input,
|
||||||
|
Keys extends [unknown, ...unknown[]],
|
||||||
|
Data,
|
||||||
|
Item,
|
||||||
|
>(
|
||||||
|
name: string,
|
||||||
|
generator: (input: Input) => { keys: readonly [...Keys]; data: Data },
|
||||||
|
factory: (
|
||||||
|
scope: ObservableScope,
|
||||||
|
data$: Behavior<Data>,
|
||||||
|
...keys: Keys
|
||||||
|
) => Item,
|
||||||
|
): OperatorFunction<Input, Item> {
|
||||||
|
return (input$) =>
|
||||||
|
input$.pipe(
|
||||||
|
generateItemsInternal(
|
||||||
|
name,
|
||||||
|
function* (input) {
|
||||||
|
yield generator(input);
|
||||||
|
},
|
||||||
|
factory,
|
||||||
|
(items) => items,
|
||||||
|
),
|
||||||
|
map(([item]) => item),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function generateItemsInternal<
|
function generateItemsInternal<
|
||||||
Input,
|
Input,
|
||||||
Keys extends [unknown, ...unknown[]],
|
Keys extends [unknown, ...unknown[]],
|
||||||
|
|||||||
Reference in New Issue
Block a user