import {Observable, Subject, AsyncSubject} from 'rxjs'; import EndlessSubject from './endlessSubject'; export interface NewableSubject, T> { new (): U; } export type RequestOptions, R> = { topic: string; data: T; Subject?: NewableSubject; }; declare interface BaseChannel { new (plugins: Object[]): this; registerPlugin(plugin: Object): void; } declare interface Channel extends BaseChannel { observe(topic: String): Observable; subject(topic: String, subject?: EndlessSubject): Subject; } declare interface RequestResponseChannel extends BaseChannel { observe(topic: String): Observable<{data: Req; replySubject: Subject}>; request>(options: RequestOptions): Subject; subject(topic: String, subject?: EndlessSubject): Subject; } export {Channel, RequestResponseChannel};