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,7 +447,11 @@ export function createCallViewModel$(
|
|||||||
|
|
||||||
const localTransport$ = scope.behavior(
|
const localTransport$ = scope.behavior(
|
||||||
matrixRTCMode$.pipe(
|
matrixRTCMode$.pipe(
|
||||||
map((mode) =>
|
generateItem(
|
||||||
|
"CallViewModel localTransport$",
|
||||||
|
// Re-create LocalTransport whenever the mode changes
|
||||||
|
(mode) => ({ keys: [mode], data: undefined }),
|
||||||
|
(scope, _data$, mode) =>
|
||||||
createLocalTransport$({
|
createLocalTransport$({
|
||||||
scope: scope,
|
scope: scope,
|
||||||
memberships$: memberships$,
|
memberships$: memberships$,
|
||||||
|
|||||||
@@ -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