我想使用 RxJS 监控活动的 chrome 运行时连接,以下工作但必须有一种更清洁的方法。
import { Subject, merge } from "rxjs";
import { scan, map } from "rxjs/operators";
type Port = chrome.runtime.Port;
const onConnect$ = new Subject<Port>();
const onDisconnect$ = new Subject<Port>();
onConnect$.subscribe(port => port.onDisconnect.addListener(port => onDisconnect$.next(port)));
const connectedPorts$ = merge(
onConnect$.pipe(map(port => ({ type: "connected", port }))),
onDisconnect$.pipe(map(port => ({ type: "disconnected", port })))
).pipe(
scan((connections, action) => {
if (action.type == "connected") return [...connections, action.port];
return connections.filter(c => c.sender?.id != action.port.sender?.id);
}, [] as Port[])
);
connectedPorts$.subscribe(conns => console.log("Connected Ports Updated", conns));