@deeptick/client 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/feed.js ADDED
@@ -0,0 +1,232 @@
1
+ /**
2
+ * DeepTick TypeScript Unified Feed — Seamless Live ↔ Replay switching.
3
+ *
4
+ * Same interface for both live streaming and historical replay.
5
+ * Backtest code = production code.
6
+ *
7
+ * Usage:
8
+ * import { DeepTickFeed, FeedMode } from '@deeptick/client';
9
+ *
10
+ * // Live mode
11
+ * const feed = DeepTickFeed.live('wss://deeptick.lacertalabs.xyz/v1/stream');
12
+ * feed.onData((topic, data) => console.log(topic, data));
13
+ * await feed.connect();
14
+ * await feed.subscribe(['hyperliquid.trades.BTC']);
15
+ *
16
+ * // Replay mode — same callback, historical data
17
+ * const feed = DeepTickFeed.replay('wss://deeptick.lacertalabs.xyz/v1/replay/ws', {
18
+ * sources: ['hyperliquid:trades:BTC'],
19
+ * from: '2026-05-01',
20
+ * to: '2026-05-03',
21
+ * speed: 10,
22
+ * });
23
+ * feed.onData((topic, data) => console.log(topic, data)); // Same handler!
24
+ * await feed.connect();
25
+ *
26
+ * // Auto mode — replay then switch to live
27
+ * const feed = DeepTickFeed.auto('wss://deeptick.lacertalabs.xyz', {
28
+ * sources: ['hyperliquid:trades:BTC'],
29
+ * from: '2026-05-01',
30
+ * });
31
+ */
32
+ import WebSocket from 'ws';
33
+ export var FeedMode;
34
+ (function (FeedMode) {
35
+ FeedMode["LIVE"] = "live";
36
+ FeedMode["REPLAY"] = "replay";
37
+ FeedMode["AUTO"] = "auto";
38
+ })(FeedMode || (FeedMode = {}));
39
+ export class DeepTickFeed {
40
+ mode;
41
+ currentMode;
42
+ url;
43
+ options;
44
+ ws = null;
45
+ messagesReceived = 0;
46
+ connected = false;
47
+ dataCallbacks = [];
48
+ replayEndCallbacks = [];
49
+ modeChangeCallbacks = [];
50
+ constructor(mode, url, options = {}) {
51
+ this.mode = mode;
52
+ this.currentMode = mode;
53
+ this.url = url;
54
+ this.options = options;
55
+ }
56
+ // ─── Factory Methods ─────────────────────────────────────────────
57
+ static live(url = 'wss://deeptick.lacertalabs.xyz/v1/stream', options = {}) {
58
+ return new DeepTickFeed(FeedMode.LIVE, url, options);
59
+ }
60
+ static replay(url = 'wss://deeptick.lacertalabs.xyz/v1/replay/ws', options = {}) {
61
+ return new DeepTickFeed(FeedMode.REPLAY, url, options);
62
+ }
63
+ static auto(baseUrl = 'wss://deeptick.lacertalabs.xyz', options = {}) {
64
+ const today = new Date().toISOString().split('T')[0];
65
+ return new DeepTickFeed(FeedMode.AUTO, `${baseUrl}/v1/replay/ws`, {
66
+ ...options,
67
+ to: today,
68
+ });
69
+ }
70
+ // ─── Callbacks ───────────────────────────────────────────────────
71
+ /** Register a callback for data events (works identically for live and replay) */
72
+ onData(cb) {
73
+ this.dataCallbacks.push(cb);
74
+ return this;
75
+ }
76
+ /** Register a callback for replay completion */
77
+ onReplayEnd(cb) {
78
+ this.replayEndCallbacks.push(cb);
79
+ return this;
80
+ }
81
+ /** Register a callback for mode changes (replay → live in auto mode) */
82
+ onModeChange(cb) {
83
+ this.modeChangeCallbacks.push(cb);
84
+ return this;
85
+ }
86
+ // ─── Connection ──────────────────────────────────────────────────
87
+ async connect() {
88
+ return new Promise((resolve, reject) => {
89
+ const urlWithKey = this.options.apiKey
90
+ ? `${this.url}?api_key=${this.options.apiKey}`
91
+ : this.url;
92
+ this.ws = new WebSocket(urlWithKey);
93
+ this.ws.on('open', () => {
94
+ this.connected = true;
95
+ });
96
+ this.ws.on('message', (raw) => {
97
+ const frame = JSON.parse(raw.toString());
98
+ this.messagesReceived++;
99
+ switch (frame.type) {
100
+ case 'welcome':
101
+ // Start feed based on mode
102
+ if (this.mode === FeedMode.LIVE) {
103
+ this.startLive();
104
+ }
105
+ else {
106
+ this.startReplay();
107
+ }
108
+ resolve();
109
+ break;
110
+ case 'data':
111
+ for (const cb of this.dataCallbacks) {
112
+ cb(frame.topic, frame.data);
113
+ }
114
+ break;
115
+ case 'replay_end':
116
+ for (const cb of this.replayEndCallbacks) {
117
+ cb({
118
+ totalEvents: frame.total_events,
119
+ durationS: frame.duration_s,
120
+ });
121
+ }
122
+ if (this.currentMode === FeedMode.AUTO) {
123
+ // Switch to live
124
+ this.switchToLive();
125
+ }
126
+ break;
127
+ case 'subscribed':
128
+ case 'replay_start':
129
+ case 'heartbeat':
130
+ break;
131
+ case 'error':
132
+ console.error('[feed] Server error:', frame.message);
133
+ break;
134
+ }
135
+ });
136
+ this.ws.on('close', () => {
137
+ this.connected = false;
138
+ });
139
+ this.ws.on('error', (err) => {
140
+ if (!this.connected) {
141
+ reject(err);
142
+ }
143
+ });
144
+ });
145
+ }
146
+ async disconnect() {
147
+ this.connected = false;
148
+ if (this.ws) {
149
+ this.ws.close();
150
+ this.ws = null;
151
+ }
152
+ }
153
+ async subscribe(channels) {
154
+ this.options.channels = channels;
155
+ if (this.connected && this.currentMode === FeedMode.LIVE && this.ws) {
156
+ this.ws.send(JSON.stringify({ action: 'subscribe', channels }));
157
+ }
158
+ }
159
+ // ─── Internal ────────────────────────────────────────────────────
160
+ startLive() {
161
+ if (this.options.channels && this.ws) {
162
+ this.ws.send(JSON.stringify({
163
+ action: 'subscribe',
164
+ channels: this.options.channels,
165
+ }));
166
+ }
167
+ this.currentMode = FeedMode.LIVE;
168
+ }
169
+ startReplay() {
170
+ if (this.ws) {
171
+ this.ws.send(JSON.stringify({
172
+ action: 'replay',
173
+ sources: this.options.sources || [],
174
+ from: this.options.from || '',
175
+ to: this.options.to || '',
176
+ speed: this.options.speed || 0,
177
+ }));
178
+ }
179
+ this.currentMode = FeedMode.REPLAY;
180
+ }
181
+ async switchToLive() {
182
+ const oldMode = this.currentMode;
183
+ // Close replay connection
184
+ if (this.ws) {
185
+ this.ws.close();
186
+ }
187
+ // Connect to live endpoint
188
+ const liveUrl = this.url.replace('/v1/replay/ws', '/v1/stream');
189
+ const urlWithKey = this.options.apiKey
190
+ ? `${liveUrl}?api_key=${this.options.apiKey}`
191
+ : liveUrl;
192
+ return new Promise((resolve) => {
193
+ this.ws = new WebSocket(urlWithKey);
194
+ this.ws.on('open', () => {
195
+ this.connected = true;
196
+ });
197
+ this.ws.on('message', (raw) => {
198
+ const frame = JSON.parse(raw.toString());
199
+ this.messagesReceived++;
200
+ if (frame.type === 'welcome') {
201
+ // Build channels from sources
202
+ if (!this.options.channels && this.options.sources) {
203
+ this.options.channels = this.options.sources.map(s => s.replace(/:/g, '.'));
204
+ }
205
+ this.startLive();
206
+ for (const cb of this.modeChangeCallbacks) {
207
+ cb(oldMode, FeedMode.LIVE);
208
+ }
209
+ resolve();
210
+ }
211
+ else if (frame.type === 'data') {
212
+ for (const cb of this.dataCallbacks) {
213
+ cb(frame.topic, frame.data);
214
+ }
215
+ }
216
+ });
217
+ this.ws.on('close', () => {
218
+ this.connected = false;
219
+ });
220
+ });
221
+ }
222
+ getStats() {
223
+ return {
224
+ mode: this.mode,
225
+ currentMode: this.currentMode,
226
+ messagesReceived: this.messagesReceived,
227
+ connected: this.connected,
228
+ url: this.url,
229
+ };
230
+ }
231
+ }
232
+ //# sourceMappingURL=feed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed.js","sourceRoot":"","sources":["../src/feed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @deeptick/client — TypeScript SDK for DeepTick market data
3
+ *
4
+ * Three layers:
5
+ * 1. CachedClient — Download + cache daily archives
6
+ * 2. DeepTickStream — Real-time WebSocket streaming
7
+ * 3. DeepTickFeed — Unified live/replay feed
8
+ * 4. derive — Client-side derived computations
9
+ *
10
+ * Usage:
11
+ * import { DeepTickStream } from '@deeptick/client';
12
+ * import { CachedClient } from '@deeptick/client/cache';
13
+ * import { DeepTickFeed } from '@deeptick/client/feed';
14
+ * import { derive } from '@deeptick/client/types';
15
+ */
16
+ export { DeepTickStream } from './streaming.js';
17
+ export type { StreamFrame, StreamTrade, StreamBookTicker, StreamBookDelta, StreamDerivativeTicker, DataCallback, DeepTickStreamOptions, } from './streaming.js';
18
+ export { DeepTickFeed, FeedMode } from './feed.js';
19
+ export type { FeedOptions, FeedStats } from './feed.js';
20
+ export { CachedClient } from './cache.js';
21
+ export type { CacheStats } from './cache.js';
22
+ export { derive, unpackLevels } from './types.js';
23
+ export type { TradeRecord, BookDeltaRecord, BBORecord, CandleRecord, BookSnapshot, VolumeProfileBucket, ImbalanceRecord, FundingCrossRecord, } from './types.js';
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EACV,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,YAAY,EACZ,qBAAqB,GACtB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAClD,YAAY,EACV,WAAW,EACX,eAAe,EACf,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,eAAe,EACf,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @deeptick/client — TypeScript SDK for DeepTick market data
3
+ *
4
+ * Three layers:
5
+ * 1. CachedClient — Download + cache daily archives
6
+ * 2. DeepTickStream — Real-time WebSocket streaming
7
+ * 3. DeepTickFeed — Unified live/replay feed
8
+ * 4. derive — Client-side derived computations
9
+ *
10
+ * Usage:
11
+ * import { DeepTickStream } from '@deeptick/client';
12
+ * import { CachedClient } from '@deeptick/client/cache';
13
+ * import { DeepTickFeed } from '@deeptick/client/feed';
14
+ * import { derive } from '@deeptick/client/types';
15
+ */
16
+ // Re-export everything
17
+ export { DeepTickStream } from './streaming.js';
18
+ export { DeepTickFeed, FeedMode } from './feed.js';
19
+ export { CachedClient } from './cache.js';
20
+ export { derive, unpackLevels } from './types.js';
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,uBAAuB;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAWhD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGnD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG1C,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,179 @@
1
+ /**
2
+ * DeepTick TypeScript Client — Real-time Streaming
3
+ *
4
+ * Connects to the DeepTick WebSocket endpoint and delivers live market data.
5
+ * Works in both Node.js (via `ws` package) and browser environments.
6
+ *
7
+ * Install:
8
+ * npm install @deeptick/client # includes streaming
9
+ * # Node.js also needs: npm install ws
10
+ *
11
+ * Usage:
12
+ * import { DeepTickStream } from '@deeptick/client';
13
+ *
14
+ * const stream = new DeepTickStream('wss://deeptick.lacertalabs.xyz/v1/stream');
15
+ *
16
+ * stream.onTrade((exchange, symbol, trade) => {
17
+ * console.log(`[${exchange}] ${symbol}: ${trade.price} x ${trade.amount}`);
18
+ * });
19
+ *
20
+ * stream.onBookTicker((exchange, symbol, ticker) => {
21
+ * console.log(`[${exchange}] ${symbol}: ${ticker.bid_price}/${ticker.ask_price}`);
22
+ * });
23
+ *
24
+ * await stream.connect();
25
+ * await stream.subscribe(['hyperliquid.trades.BTC', '*.book_ticker.*']);
26
+ */
27
+ /** Wire protocol frame from server */
28
+ export interface StreamFrame {
29
+ type: 'data' | 'heartbeat' | 'welcome' | 'subscribed' | 'unsubscribed' | 'pong' | 'error';
30
+ topic?: string;
31
+ data?: Record<string, any>;
32
+ ts?: number;
33
+ connection_id?: string;
34
+ channels?: string[];
35
+ message?: string;
36
+ client_ts?: number;
37
+ }
38
+ /** Trade data from stream */
39
+ export interface StreamTrade {
40
+ exchange: string;
41
+ symbol: string;
42
+ timestamp: number;
43
+ local_timestamp: number;
44
+ trade_id: string;
45
+ price: number;
46
+ amount: number;
47
+ side: 'buy' | 'sell';
48
+ data_type: 'trades';
49
+ }
50
+ /** Native top-of-book ticker data from stream */
51
+ export interface StreamBookTicker {
52
+ exchange: string;
53
+ symbol: string;
54
+ timestamp: number;
55
+ local_timestamp: number;
56
+ bid_price: number;
57
+ bid_amount: number;
58
+ ask_price: number;
59
+ ask_amount: number;
60
+ data_type: 'book_ticker';
61
+ }
62
+ /** Book delta data from stream */
63
+ export interface StreamBookDelta {
64
+ exchange: string;
65
+ symbol: string;
66
+ timestamp: number;
67
+ local_timestamp: number;
68
+ is_snapshot: boolean;
69
+ bids_packed: string;
70
+ asks_packed: string;
71
+ data_type: 'book_l2_delta';
72
+ }
73
+ /** Derivative ticker data from stream */
74
+ export interface StreamDerivativeTicker {
75
+ exchange: string;
76
+ symbol: string;
77
+ timestamp: number;
78
+ local_timestamp: number;
79
+ funding_timestamp: number | null;
80
+ funding_rate: number | null;
81
+ predicted_funding_rate: number | null;
82
+ open_interest: number | null;
83
+ last_price: number | null;
84
+ mark_price: number | null;
85
+ index_price: number | null;
86
+ data_type: 'derivative_ticker';
87
+ }
88
+ /** Callback signature for data handlers */
89
+ export type DataCallback<T = Record<string, any>> = (exchange: string, symbol: string, data: T) => void;
90
+ /** Streaming client options */
91
+ export interface DeepTickStreamOptions {
92
+ /** WebSocket URL (default: wss://deeptick.lacertalabs.xyz/v1/stream) */
93
+ url?: string;
94
+ /** Auto-reconnect on disconnect (default: true) */
95
+ reconnect?: boolean;
96
+ /** Initial reconnect delay in ms (default: 1000) */
97
+ reconnectDelay?: number;
98
+ /** Max reconnect delay in ms (default: 30000) */
99
+ reconnectMaxDelay?: number;
100
+ /** Max queued messages before dropping (default: 10000) */
101
+ maxQueueSize?: number;
102
+ }
103
+ export declare class DeepTickStream {
104
+ private url;
105
+ private reconnect;
106
+ private reconnectDelay;
107
+ private reconnectMaxDelay;
108
+ private currentDelay;
109
+ private maxQueueSize;
110
+ private ws;
111
+ private connected;
112
+ private stopped;
113
+ private channels;
114
+ private connectionId;
115
+ private tradeCallbacks;
116
+ private bookTickerCallbacks;
117
+ private bookDeltaCallbacks;
118
+ private derivativeTickerCallbacks;
119
+ private liquidationCallbacks;
120
+ private globalCallbacks;
121
+ private connectCallbacks;
122
+ private disconnectCallbacks;
123
+ private errorCallbacks;
124
+ messagesReceived: number;
125
+ reconnectCount: number;
126
+ lastMessageTime: number;
127
+ private pendingSubscribe;
128
+ private pendingConnect;
129
+ constructor(urlOrOptions?: string | DeepTickStreamOptions);
130
+ /** Register callback for trade data */
131
+ onTrade(cb: DataCallback<StreamTrade>): this;
132
+ /** Register callback for native top-of-book ticker data */
133
+ onBookTicker(cb: DataCallback<StreamBookTicker>): this;
134
+ /** Deprecated alias for onBookTicker. */
135
+ onBBO(cb: DataCallback<StreamBookTicker>): this;
136
+ /** Register callback for book delta data */
137
+ onBookDelta(cb: DataCallback<StreamBookDelta>): this;
138
+ /** Register callback for derivative ticker data */
139
+ onDerivativeTicker(cb: DataCallback<StreamDerivativeTicker>): this;
140
+ /** Deprecated alias for onDerivativeTicker. */
141
+ onFunding(cb: DataCallback<StreamDerivativeTicker>): this;
142
+ /** Deprecated alias for onDerivativeTicker. */
143
+ onOpenInterest(cb: DataCallback<StreamDerivativeTicker>): this;
144
+ /** Register callback for liquidation data */
145
+ onLiquidation(cb: DataCallback): this;
146
+ /** Register callback for ALL data types */
147
+ onData(cb: DataCallback): this;
148
+ /** Register callback for connection events */
149
+ onConnect(cb: () => void): this;
150
+ /** Register callback for disconnection events */
151
+ onDisconnect(cb: (reason: string) => void): this;
152
+ /** Register callback for errors */
153
+ onError(cb: (error: Error) => void): this;
154
+ /** Connect to the DeepTick streaming endpoint */
155
+ connect(): Promise<void>;
156
+ /** Disconnect from the streaming endpoint */
157
+ disconnect(): void;
158
+ /** Subscribe to data channels */
159
+ subscribe(channels: string[]): Promise<void>;
160
+ /** Unsubscribe from specific channels */
161
+ unsubscribe(channels: string[]): void;
162
+ /** Send ping and measure round-trip latency (ms) */
163
+ ping(): Promise<number>;
164
+ /** Get streaming client statistics */
165
+ getStats(): {
166
+ connected: boolean;
167
+ connectionId: string | null;
168
+ url: string;
169
+ channels: string[];
170
+ messagesReceived: number;
171
+ reconnectCount: number;
172
+ lastMessageAgeMs: number;
173
+ };
174
+ private handleMessage;
175
+ private dispatchData;
176
+ private scheduleReconnect;
177
+ }
178
+ export type { TradeRecord, BBORecord, BookDeltaRecord, CandleRecord } from './types.js';
179
+ //# sourceMappingURL=streaming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../src/streaming.ts"],"names":[],"mappings":"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"}