Как сохранить список подключений RxJS - PullRequest
0 голосов
/ 29 января 2020

Я хочу отслеживать активные chrome соединения во время выполнения, используя Rx JS, работает следующее, но должен быть более чистый способ сделать это.

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));

1 Ответ

1 голос
/ 31 января 2020

(Я не проверял это сам, но похоже, что он соответствует Chrome API времени выполнения.)

Один из способов, которым ваш нынешний подход может быть чище, - это лучше обобщить создание среды выполнения потоки событий. Использование Субъектов (а также подписка на слушателей в рамках другого вызова для подписки) приводит к усложнению, и обычно излишне.

Этот код устанавливает два экземпляра Observable<Port>, один из только что подключенных портов и один из только что отключенные порты.

const fromRuntimeEvent = (target, eventType) =>
  new Observable((observer) => {
    const listener = (event) => observer.next(event);
    try {
      target[eventType].addListener(listener);
    } catch (e) {
      observer.error(e);
    }
    return () => target[eventType].removeListener(listener);
  });

const connections$ = fromRuntimeEvent(chrome.runtime, 'onConnect');
const disconnectsFor = (port) => fromRuntimeEvent(port, 'onDisconnect');

const disconnections$ = connections$.pipe(
  mergeMap((port) => disconnectsFor(port))
);

Отсюда, использование scan в том виде, в каком вы уже есть, имеет смысл для меня, просто не забудьте учесть и отключения.

...