import 'rxjs/add/operator/publish'; import 'rxjs/add/operator/takeUntil'; import 'rxjs/add/operator/takeLast'; import 'rxjs/add/observable/merge'; import { Observable } from 'rxjs/Observable'; import { Database } from '../db'; import { ParsedWSMsg, WSMsgToDBHandler } from '../utils'; export declare type Flags = { /** * 中间件默认获得原消息对象的拷贝,无需担心对所得消息的变动会 * 影响其他中间件获取原消息内容。设置 mutate 为 true,则中间件 * 直接获得原消息对象,对其的变动会影响后续中间件所得消息的内容。 */ mutate?: boolean; }; export declare type CustomMsgHandler = MsgHandler | MsgToDBHandler; export declare type MsgHandlerRemoval = () => void; export declare type Interceptor = (msg: ParsedWSMsg, ...args: any[]) => void | ControlFlow | Observable; export declare type MsgToDBHandler = (msg: ParsedWSMsg, db: Database) => void | ControlFlow | Observable; /** * websocket 拦截器的序列。 */ export declare class Interceptors { private seq; /** * 若提供 destination,会设置默认的消息处理逻辑。当所有通过 * append() 添加的拦截器都 pass-through,由 destination 处理 * (可能经部分拦截器修改的)消息。 */ constructor(destination?: WSMsgToDBHandler); /** * 往当前拦截器序列的尾端添加一个拦截器。 */ append(handler: MsgToDBHandler, options?: Flags): MsgHandlerRemoval; /** * 传入 websocket 消息内容,及相关数据库信息,从头到尾执行序列中的拦截器。 * 如果其中一个拦截器返回 ControlFlow.ShortCircuit,其后续的中间件将被跳过,不执行。 * 如果一个拦截器返回 ControlFlow.IngoreDefaultDBOps,不仅跳过(不执行)后续拦截器, * 也会跳过本会对传入消息进行的默认数据库操作。 */ apply: MsgToDBHandler; } export declare type MsgHandler = (msg: ParsedWSMsg) => void; /** * websocket 代理。 * 使用 Proxy 来为与数据模型无关的推送消息进行相应处理。 */ export declare class Proxy { private seq; private publishedHandler; private daemonManager; /** * 注册一个代理。 * 该代理将会获得原推送消息经解析后的消息对象。 * 返回函数用于移除所注册的回调。 */ register(handler: MsgHandler): MsgHandlerRemoval; /** * 将一条推送消息广播给所有注册的代理。 */ apply: MsgHandler; /** * 根据 pattern(支持正则) 注册一个代理。 * 该代理将会获得原推送消息经解析后的消息对象。 * 返回函数用于移除所注册的回调。 */ on(pattern: string, handler: MsgHandler): MsgHandlerRemoval; /** * 根据某个 pattern 持续订阅某个 socket event, e.g. publish(':change:task/:id') * 以 socket type 开头 例如: change、new、remove、destroy、refresh */ publish(pattern: string): Observable; /** * 获得 `e` 字段能匹配给定 pattern 的 refresh 推送的流,其中每一个值 * 对应所得消息解析完成的完整消息内容。 * @param pattern 要监听的 refresh 事件的格式,如 'tasks/123' * @param appNamespace 提供应用特有的 appNamespace 以避免受潜在的注册了同样 pattern */ fromRefresh(pattern: string, appNamespace: string): Observable; /** * 结合 on/off 方法,创建一个监听符合 pattern 事件的流,并包含 teardown 逻辑。 */ private createMsg$; /** * 初始化在激活状态下主动触发、在挂起状态下懒触发地监听给定 pattern 的 daemon。 */ private initDaemon; private startDaemon; stopDaemon(daemonKey: string): void; /** * 结合 daemon 的行为,实现部分 refresh 推送消息处理需要的操作。 * 注意:为了实现功能,由该方法创建的 daemon 不会被删除。 */ private onRefreshEvent; } /** * 中间件通过返回 ControlFlow 的值来控制自身对一整个序列的 * 中间件执行流程的影响。 */ export declare enum ControlFlow { /** * 当返回 PassThrough,中间件不影响序列中下一个中间件的执行。 */ PassThrough = 0, /** * 当返回 ShortCircuit,中间件截断所在中间件序列的执行流程, * 不执行其后的中间件,如 switch 语句中 break 的效果。 */ ShortCircuit = 1 } export declare function createInterceptor(userFn: CustomMsgHandler, flags?: Flags): Interceptor;