@wioex/stream-sdk
Version: 
WebSocket streaming SDK for real-time WioEX market data
385 lines • 11.1 kB
TypeScript
/**
 * WioEX Stream SDK - Type Definitions
 */
/**
 * Token fetch retry configuration
 */
export interface TokenFetchRetryConfig {
    /** Maximum number of retry attempts (default: 3) */
    maxAttempts?: number;
    /** Initial delay between retries in milliseconds (default: 1000) */
    delay?: number;
    /** Backoff strategy (default: 'exponential') */
    backoff?: 'linear' | 'exponential';
}
/**
 * Configuration options for WioexStreamClient
 */
export interface WioexStreamConfig {
    /** WioEX API key for authentication (Node.js only - backend) */
    apiKey?: string;
    /** Temporary token for secure authentication (recommended for browser) */
    token?: string;
    /** Token expiration time (Unix timestamp in seconds) */
    tokenExpiresAt?: number;
    /** Backend endpoint URL to fetch token (browser only) */
    tokenEndpoint?: string;
    /** Custom headers for token endpoint request */
    tokenFetchHeaders?: Record<string, string>;
    /** Token fetch retry configuration */
    tokenFetchRetry?: TokenFetchRetryConfig;
    /** Callback to get new token when current token is expiring */
    onTokenExpiring?: () => Promise<{
        token: string;
        expiresAt: number;
    }>;
    /** Automatically refresh token before expiry (default: true if onTokenExpiring provided) */
    autoRefreshToken?: boolean;
    /** Refresh token N milliseconds before expiry (default: 3600000 = 1 hour) */
    refreshBeforeExpiry?: number;
    /** Enable lazy connection on first subscribe (default: true) */
    lazyConnect?: boolean;
    /** Enable debug logging to console (default: false) */
    debug?: boolean;
    /** Maximum number of symbols to track (1-8) */
    maxSymbols?: number;
    /** Auto-reconnect on connection loss */
    autoReconnect?: boolean;
    /** Reconnection delay in milliseconds */
    reconnectDelay?: number;
    /** Maximum reconnection attempts (0 = infinite) */
    maxReconnectAttempts?: number;
    /** WebSocket URL (default: wss://stream.wioex.com/rs/i/{max}/websocket) */
    streamUrl?: string;
    /** Error reporting level: 'none' | 'minimal' | 'standard' | 'detailed' */
    errorReportingLevel?: ErrorReportingLevel;
    /** Error reporting endpoint URL */
    errorReportingUrl?: string;
    /** Include WebSocket message data in error reports */
    includeMessageData?: boolean;
    /** Include connection details in error reports */
    includeConnectionData?: boolean;
    /** Performance optimization options */
    performance?: {
        /** Throttle ticker events (ms, 0 = disabled, default: 16 for 60 FPS) */
        tickerThrottle?: number;
        /** Batch ticker updates instead of throttling */
        batchTickers?: boolean;
        /** Maximum ticker batch size */
        tickerBatchSize?: number;
        /** Error reporting batch size (default: 10) */
        errorBatchSize?: number;
        /** Error reporting flush interval in ms (default: 5000) */
        errorBatchInterval?: number;
        /** Enable error deduplication (default: true) */
        errorDeduplication?: boolean;
        /** Enable stats tracking (default: true, disable in production for 5-10% performance gain) */
        enableStats?: boolean;
        /** Use binary protocol (MessagePack) instead of JSON (default: false, opt-in for 50-60% speed boost) */
        useBinaryProtocol?: boolean;
    };
}
/**
 * Error reporting levels
 */
export type ErrorReportingLevel = 'none' | 'minimal' | 'standard' | 'detailed';
/**
 * Error context data
 */
export interface ErrorContext {
    /** Connection state when error occurred */
    connectionState?: ConnectionState;
    /** Last message received */
    lastMessage?: string;
    /** Message that triggered error */
    triggerMessage?: unknown;
    /** Subscribed stocks at time of error */
    subscribedStocks?: string[];
    /** Additional context information */
    [key: string]: unknown;
}
/**
 * Error report payload
 */
export interface ErrorReportPayload {
    /** SDK version */
    sdk_version: string;
    /** SDK type */
    sdk_type: 'stream';
    /** Category (always 'stream' for this SDK) */
    category: 'stream';
    /** Runtime environment */
    runtime: string;
    /** API key identification (hashed) */
    api_key_id: string;
    /** Error reporting level used */
    reporting_level: ErrorReportingLevel;
    /** Error information */
    error: {
        /** Error type/class */
        type: string;
        /** Error message */
        message: string;
        /** Error stack trace (if available) */
        stack?: string;
        /** Error code (if available) */
        code?: string;
    };
    /** Error context */
    context?: ErrorContext;
    /** Timestamp when error occurred */
    timestamp: number;
}
/**
 * Connection states
 */
export declare enum ConnectionState {
    DISCONNECTED = "disconnected",
    CONNECTING = "connecting",
    CONNECTED = "connected",
    REGISTERED = "registered",
    RECONNECTING = "reconnecting",
    FAILED = "failed"
}
/**
 * WebSocket message actions
 */
export type MessageAction = 'register' | 'subscribe' | 'unsubscribe' | 'ping' | 'pong';
/**
 * Register message
 */
export interface RegisterMessage {
    action: 'register';
    token: string;
}
/**
 * Subscribe message
 */
export interface SubscribeMessage {
    action: 'subscribe';
    stocks: string[];
}
/**
 * Unsubscribe message
 */
export interface UnsubscribeMessage {
    action: 'unsubscribe';
    stocks: string[];
}
/**
 * Ping message
 */
export interface PingMessage {
    action: 'ping';
}
/**
 * Subscribe to signals message
 */
export interface SubscribeSignalsMessage {
    action: 'subscribe-signals';
    symbols: string[];
}
/**
 * Unsubscribe from signals message
 */
export interface UnsubscribeSignalsMessage {
    action: 'unsubscribe-signals';
    symbols: string[];
}
/**
 * Outgoing WebSocket messages
 */
export type OutgoingMessage = RegisterMessage | SubscribeMessage | UnsubscribeMessage | PingMessage | SubscribeSignalsMessage | UnsubscribeSignalsMessage;
/**
 * Registration response
 */
export interface RegistrationResponse {
    status: 'success' | 'error';
    type: 'registered';
    message: string;
}
/**
 * Subscription response
 */
export interface SubscriptionResponse {
    status: 'success' | 'error';
    type: 'subscribed' | 'unsubscribed';
    message: string;
    stocks?: string[];
}
/**
 * Ticker data from WioEX
 */
export interface TickerData {
    ticket: string;
    last: string;
    open: string;
    high: string;
    low: string;
    volume: string;
    bid: string;
    ask: string;
    change: string;
    changePercent: string;
    timestamp: number;
}
/**
 * Ticker update message (v2 - Streamlined format)
 */
export interface TickerUpdateMessage {
    type: 'ticker';
    data: TickerData;
}
/**
 * Signal type
 */
export type SignalType = 'BUY' | 'SELL' | 'HOLD' | 'STRONG_BUY' | 'STRONG_SELL';
/**
 * Signal timeframe
 */
export type SignalTimeframe = '5m' | '15m' | '1h' | '4h' | '1d' | '1w' | '1M';
/**
 * Signal data
 */
export interface SignalData {
    symbol: string;
    signalType: SignalType;
    entryPrice: number;
    targetPrice: number | null;
    stopLoss: number | null;
    confidence: number;
    reason: string | null;
    timeframe: SignalTimeframe;
    source: string;
    createdAt: string;
    expiresAt: string | null;
}
/**
 * Signal message
 */
export interface SignalMessage {
    type: 'signal';
    data: SignalData;
}
/**
 * Signal trigger type
 */
export type SignalTriggerType = 'entry' | 'target' | 'stop_loss' | 'expired';
/**
 * Signal triggered data
 */
export interface SignalTriggeredData {
    symbol: string;
    signalType: SignalType;
    triggerType: SignalTriggerType;
    triggeredPrice: number;
    triggeredAt: string;
    entryPrice: number;
    targetPrice: number | null;
    stopLoss: number | null;
}
/**
 * Signal triggered message
 */
export interface SignalTriggeredMessage {
    type: 'signal-triggered';
    data: SignalTriggeredData;
}
/**
 * Signal subscription response
 */
export interface SignalSubscriptionResponse {
    type: 'signalSubscribed';
    status: 'success' | 'error';
    message: string;
    symbols?: string[];
}
/**
 * Signal unsubscription response
 */
export interface SignalUnsubscriptionResponse {
    type: 'signalUnsubscribed';
    status: 'success' | 'error';
    message: string;
}
/**
 * Error message
 */
export interface ErrorMessage {
    status: 'error';
    type: string;
    message: string;
    code?: string;
}
/**
 * Incoming WebSocket messages
 */
export type IncomingMessage = RegistrationResponse | SubscriptionResponse | TickerUpdateMessage | SignalMessage | SignalTriggeredMessage | SignalSubscriptionResponse | SignalUnsubscriptionResponse | ErrorMessage;
/**
 * Event types
 */
export interface WioexStreamEvents {
    /** Connection established */
    connected: () => void;
    /** Client registered successfully */
    registered: (data: RegistrationResponse) => void;
    /** Subscribed to stocks */
    subscribed: (stocks: string[]) => void;
    /** Unsubscribed from stocks */
    unsubscribed: (stocks: string[]) => void;
    /** Ticker data update */
    ticker: (data: TickerData) => void;
    /** New trading signal received */
    signal: (data: SignalData) => void;
    /** Trading signal triggered (entry/target/stop-loss) */
    signalTriggered: (data: SignalTriggeredData) => void;
    /** Successfully subscribed to signals */
    signalSubscribed: (symbols: string[]) => void;
    /** Successfully unsubscribed from signals */
    signalUnsubscribed: (symbols: string[]) => void;
    /** Signal subscription error */
    signalError: (error: Error) => void;
    /** Connection error */
    error: (error: Error) => void;
    /** Connection closed */
    disconnected: (code: number, reason: string) => void;
    /** Reconnecting attempt */
    reconnecting: (attempt: number) => void;
    /** Connection state changed */
    stateChange: (state: ConnectionState) => void;
    /** Token fetch started */
    tokenFetchStarted: (source: 'endpoint' | 'api') => void;
    /** Token fetch succeeded */
    tokenFetchSucceeded: (data: {
        token: string;
        expiresAt: number;
        source: 'endpoint' | 'api';
    }) => void;
    /** Token fetch failed (will retry if configured) */
    tokenFetchFailed: (error: Error, attempt: number, willRetry: boolean) => void;
    /** Token is expiring and will be refreshed */
    tokenExpiring: (data: {
        currentToken: string;
        expiresAt: number;
    }) => void;
    /** Token has been successfully refreshed */
    tokenRefreshed: (data: {
        token: string;
        expiresAt: number;
    }) => void;
    /** Token refresh failed */
    tokenRefreshFailed: (error: Error) => void;
}
/**
 * Client statistics
 */
export interface ClientStats {
    connectedAt: number | null;
    reconnectAttempts: number;
    messagesReceived: number;
    messagesSent: number;
    tickersReceived: number;
    subscribedStocks: string[];
    state: ConnectionState;
}
//# sourceMappingURL=types.d.ts.map