58 lines
2.6 KiB
TypeScript
58 lines
2.6 KiB
TypeScript
import WebSocket from 'isomorphic-ws';
|
|
import { DefaultLogger } from '../logger';
|
|
import { WsKey } from '../websocket-client';
|
|
export declare enum WsConnectionStateEnum {
|
|
INITIAL = 0,
|
|
CONNECTING = 1,
|
|
CONNECTED = 2,
|
|
CLOSING = 3,
|
|
RECONNECTING = 4
|
|
}
|
|
/** A "topic" is always a string */
|
|
type WsTopic = string;
|
|
/**
|
|
* A "Set" is used to ensure we only subscribe to a topic once (tracking a list of unique topics we're expected to be connected to)
|
|
* Note: Accurate duplicate tracking only works for plaintext topics. E.g. JSON objects may not be seen as duplicates if keys are in different orders. If that's needed, check the FTX implementation.
|
|
*/
|
|
type WsTopicList = Set<WsTopic>;
|
|
interface WsStoredState {
|
|
/** The currently active websocket connection */
|
|
ws?: WebSocket;
|
|
/** The current lifecycle state of the connection (enum) */
|
|
connectionState?: WsConnectionStateEnum;
|
|
/** A timer that will send an upstream heartbeat (ping) when it expires */
|
|
activePingTimer?: ReturnType<typeof setTimeout> | undefined;
|
|
/** A timer tracking that an upstream heartbeat was sent, expecting a reply before it expires */
|
|
activePongTimer?: ReturnType<typeof setTimeout> | undefined;
|
|
/** If a reconnection is in progress, this will have the timer for the delayed reconnect */
|
|
activeReconnectTimer?: ReturnType<typeof setTimeout> | undefined;
|
|
/**
|
|
* All the topics we are expected to be subscribed to (and we automatically resubscribe to if the connection drops)
|
|
*/
|
|
subscribedTopics: WsTopicList;
|
|
}
|
|
export default class WsStore {
|
|
private wsState;
|
|
private logger;
|
|
constructor(logger: typeof DefaultLogger);
|
|
/** Get WS stored state for key, optionally create if missing */
|
|
get(key: WsKey, createIfMissing?: true): WsStoredState;
|
|
get(key: WsKey, createIfMissing?: false): WsStoredState | undefined;
|
|
getKeys(): WsKey[];
|
|
create(key: WsKey): WsStoredState | undefined;
|
|
delete(key: WsKey): void;
|
|
hasExistingActiveConnection(key: WsKey): boolean;
|
|
getWs(key: WsKey): WebSocket | undefined;
|
|
setWs(key: WsKey, wsConnection: WebSocket): WebSocket;
|
|
isWsOpen(key: WsKey): boolean;
|
|
getConnectionState(key: WsKey): WsConnectionStateEnum;
|
|
setConnectionState(key: WsKey, state: WsConnectionStateEnum): void;
|
|
isConnectionState(key: WsKey, state: WsConnectionStateEnum): boolean;
|
|
isWsConnecting(key: WsKey): boolean;
|
|
getTopics(key: WsKey): WsTopicList;
|
|
getTopicsByKey(): Record<WsKey, WsTopicList>;
|
|
addTopic(key: WsKey, topic: WsTopic): WsTopicList;
|
|
deleteTopic(key: WsKey, topic: WsTopic): boolean;
|
|
}
|
|
export {};
|