@deeptick/client 0.1.1 → 0.2.0

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/package.json CHANGED
@@ -1,52 +1,38 @@
1
1
  {
2
2
  "name": "@deeptick/client",
3
- "version": "0.1.1",
4
- "description": "DeepTick TypeScript SDK high-frequency crypto market data",
3
+ "version": "0.2.0",
4
+ "description": "DeepTick TypeScript SDK for authenticated market data downloads",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
8
8
  "exports": {
9
- ".": "./dist/index.js",
10
- "./streaming": "./dist/streaming.js",
11
- "./feed": "./dist/feed.js",
12
- "./cache": "./dist/cache.js",
13
- "./types": "./dist/types.js"
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
14
13
  },
15
14
  "files": [
16
15
  "dist",
17
- "src",
18
16
  "README.md"
19
17
  ],
20
18
  "scripts": {
21
- "build": "tsc",
22
- "dev": "tsc --watch",
23
- "clean": "rm -rf dist"
19
+ "build": "tsc -p tsconfig.json",
20
+ "test": "npm run build && node --test test/*.test.mjs",
21
+ "prepack": "npm run build"
24
22
  },
25
- "dependencies": {
26
- "ws": "^8.18.0"
23
+ "engines": {
24
+ "node": ">=18"
27
25
  },
28
26
  "devDependencies": {
29
- "typescript": "^5.5.0",
30
- "@types/ws": "^8.5.12",
31
- "@types/node": "^22.0.0"
32
- },
33
- "peerDependencies": {
34
- "apache-arrow": ">=15.0.0",
35
- "parquet-wasm": ">=0.6.0"
36
- },
37
- "peerDependenciesMeta": {
38
- "apache-arrow": { "optional": true },
39
- "parquet-wasm": { "optional": true }
27
+ "@types/node": "^22.0.0",
28
+ "typescript": "^5.5.0"
40
29
  },
41
30
  "keywords": [
42
31
  "deeptick",
43
- "crypto",
44
32
  "market-data",
45
- "order-book",
46
- "websocket",
47
- "streaming",
33
+ "crypto",
48
34
  "parquet",
49
- "hft"
35
+ "fetch"
50
36
  ],
51
37
  "license": "MIT",
52
38
  "author": "DeepTick",
package/dist/cache.d.ts DELETED
@@ -1,48 +0,0 @@
1
- /**
2
- * DeepTick TypeScript Client — Caching + Parallel Downloads.
3
- *
4
- * Disk-based cache for downloaded data so repeat queries are instant.
5
- * Parallel multi-day fetches via Promise.all.
6
- *
7
- * Usage:
8
- * import { CachedClient } from '@deeptick/client';
9
- *
10
- * const client = new CachedClient('https://deeptick.lacertalabs.xyz');
11
- *
12
- * // First call: downloads from server, caches locally
13
- * const trades = await client.loadTrades('hyperliquid', 'BTC', '2026-05-01', '2026-05-07');
14
- *
15
- * // Second call: instant from disk cache
16
- * const trades2 = await client.loadTrades('hyperliquid', 'BTC', '2026-05-01', '2026-05-07');
17
- */
18
- export interface CacheStats {
19
- cacheDir: string;
20
- cacheHits: number;
21
- cacheMisses: number;
22
- hitRatePct: number;
23
- bytesDownloaded: number;
24
- bytesFromCache: number;
25
- }
26
- export declare class CachedClient {
27
- private baseUrl;
28
- private cacheDir;
29
- private maxConcurrency;
30
- private apiKey;
31
- cacheHits: number;
32
- cacheMisses: number;
33
- bytesDownloaded: number;
34
- bytesFromCache: number;
35
- constructor(baseUrl?: string, cacheDir?: string, maxConcurrency?: number, apiKey?: string);
36
- private cachePath;
37
- private isCached;
38
- private downloadDate;
39
- private dateRange;
40
- load(dataType: string, exchange: string, symbol: string, startDate: string, endDate?: string, columns?: string[]): Promise<string[]>;
41
- loadTrades(exchange: string, symbol: string, startDate: string, endDate?: string): Promise<string[]>;
42
- loadBookDeltas(exchange: string, symbol: string, startDate: string, endDate?: string): Promise<string[]>;
43
- loadDerivativeTicker(exchange: string, symbol: string, startDate: string, endDate?: string): Promise<string[]>;
44
- loadFunding(exchange: string, symbol: string, startDate: string, endDate?: string): Promise<string[]>;
45
- getStats(): CacheStats;
46
- clearCache(): void;
47
- }
48
- //# sourceMappingURL=cache.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,MAAM,CAAS;IAEvB,SAAS,SAAK;IACd,WAAW,SAAK;IAChB,eAAe,SAAK;IACpB,cAAc,SAAK;gBAGjB,OAAO,GAAE,MAA2C,EACpD,QAAQ,CAAC,EAAE,MAAM,EACjB,cAAc,GAAE,MAAU,EAC1B,MAAM,GAAE,MAA2C;IAWrD,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,QAAQ;YAMF,YAAY;IA+C1B,OAAO,CAAC,SAAS;IAYX,IAAI,CACR,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC;IAiBd,UAAU,CACd,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GACpE,OAAO,CAAC,MAAM,EAAE,CAAC;IAId,cAAc,CAClB,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GACpE,OAAO,CAAC,MAAM,EAAE,CAAC;IAId,oBAAoB,CACxB,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GACpE,OAAO,CAAC,MAAM,EAAE,CAAC;IAId,WAAW,CACf,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GACpE,OAAO,CAAC,MAAM,EAAE,CAAC;IAMpB,QAAQ,IAAI,UAAU;IAYtB,UAAU,IAAI,IAAI;CAInB"}
package/dist/cache.js DELETED
@@ -1,140 +0,0 @@
1
- /**
2
- * DeepTick TypeScript Client — Caching + Parallel Downloads.
3
- *
4
- * Disk-based cache for downloaded data so repeat queries are instant.
5
- * Parallel multi-day fetches via Promise.all.
6
- *
7
- * Usage:
8
- * import { CachedClient } from '@deeptick/client';
9
- *
10
- * const client = new CachedClient('https://deeptick.lacertalabs.xyz');
11
- *
12
- * // First call: downloads from server, caches locally
13
- * const trades = await client.loadTrades('hyperliquid', 'BTC', '2026-05-01', '2026-05-07');
14
- *
15
- * // Second call: instant from disk cache
16
- * const trades2 = await client.loadTrades('hyperliquid', 'BTC', '2026-05-01', '2026-05-07');
17
- */
18
- import * as fs from 'fs';
19
- import * as path from 'path';
20
- import * as os from 'os';
21
- import * as crypto from 'crypto';
22
- export class CachedClient {
23
- baseUrl;
24
- cacheDir;
25
- maxConcurrency;
26
- apiKey;
27
- cacheHits = 0;
28
- cacheMisses = 0;
29
- bytesDownloaded = 0;
30
- bytesFromCache = 0;
31
- constructor(baseUrl = 'https://deeptick.lacertalabs.xyz', cacheDir, maxConcurrency = 8, apiKey = process.env.DEEPTICK_API_KEY ?? '') {
32
- this.baseUrl = baseUrl.replace(/\/$/, '');
33
- this.cacheDir = cacheDir || path.join(os.homedir(), '.deeptick', 'cache');
34
- this.maxConcurrency = maxConcurrency;
35
- this.apiKey = apiKey;
36
- fs.mkdirSync(this.cacheDir, { recursive: true });
37
- }
38
- // ─── Cache Key ────────────────────────────────────────────────────
39
- cachePath(exchange, dataType, symbol, date, columns) {
40
- const safeSymbol = symbol.replace(/\//g, '-').replace(/:/g, '-');
41
- let colHash = '';
42
- if (columns && columns.length > 0) {
43
- const sorted = [...columns].sort().join(',');
44
- colHash = '_' + crypto.createHash('md5').update(sorted).digest('hex').slice(0, 8);
45
- }
46
- return path.join(this.cacheDir, exchange, dataType, safeSymbol, `${date}${colHash}.bin`);
47
- }
48
- isCached(filePath) {
49
- return fs.existsSync(filePath);
50
- }
51
- // ─── Download ─────────────────────────────────────────────────────
52
- async downloadDate(exchange, dataType, symbol, date, columns, format = 'csv') {
53
- const cp = this.cachePath(exchange, dataType, symbol, date, columns);
54
- if (this.isCached(cp)) {
55
- this.cacheHits++;
56
- this.bytesFromCache += fs.statSync(cp).size;
57
- return fs.readFileSync(cp, 'utf-8');
58
- }
59
- this.cacheMisses++;
60
- let url = `${this.baseUrl}/v1/data/${exchange}/${dataType}/${symbol}/${date}?format=${format}`;
61
- if (columns && columns.length > 0) {
62
- url += `&columns=${columns.join(',')}`;
63
- }
64
- try {
65
- const headers = {};
66
- if (this.apiKey) {
67
- headers['X-API-Key'] = this.apiKey;
68
- }
69
- const resp = await fetch(url, { headers });
70
- if (!resp.ok) {
71
- if (resp.status === 404)
72
- return null;
73
- throw new Error(`HTTP ${resp.status}`);
74
- }
75
- const data = await resp.text();
76
- this.bytesDownloaded += Buffer.byteLength(data);
77
- // Cache to disk
78
- const dir = path.dirname(cp);
79
- fs.mkdirSync(dir, { recursive: true });
80
- fs.writeFileSync(cp, data);
81
- return data;
82
- }
83
- catch (err) {
84
- console.error(`[cache] Download error for ${exchange}/${dataType}/${symbol}/${date}:`, err);
85
- return null;
86
- }
87
- }
88
- // ─── Parallel Multi-Day Loader ────────────────────────────────────
89
- dateRange(start, end) {
90
- const dates = [];
91
- const current = new Date(start + 'T00:00:00Z');
92
- const endDate = new Date(end + 'T00:00:00Z');
93
- while (current <= endDate) {
94
- dates.push(current.toISOString().split('T')[0]);
95
- current.setUTCDate(current.getUTCDate() + 1);
96
- }
97
- return dates;
98
- }
99
- async load(dataType, exchange, symbol, startDate, endDate, columns) {
100
- const end = endDate || startDate;
101
- const dates = this.dateRange(startDate, end);
102
- // Parallel download with concurrency limit
103
- const results = [];
104
- for (let i = 0; i < dates.length; i += this.maxConcurrency) {
105
- const batch = dates.slice(i, i + this.maxConcurrency);
106
- const batchResults = await Promise.all(batch.map(d => this.downloadDate(exchange, dataType, symbol, d, columns)));
107
- results.push(...batchResults);
108
- }
109
- return results.filter((r) => r !== null);
110
- }
111
- async loadTrades(exchange, symbol, startDate, endDate) {
112
- return this.load('trades', exchange, symbol, startDate, endDate);
113
- }
114
- async loadBookDeltas(exchange, symbol, startDate, endDate) {
115
- return this.load('book_l2_delta', exchange, symbol, startDate, endDate);
116
- }
117
- async loadDerivativeTicker(exchange, symbol, startDate, endDate) {
118
- return this.load('derivative_ticker', exchange, symbol, startDate, endDate);
119
- }
120
- async loadFunding(exchange, symbol, startDate, endDate) {
121
- return this.loadDerivativeTicker(exchange, symbol, startDate, endDate);
122
- }
123
- // ─── Cache Management ────────────────────────────────────────────
124
- getStats() {
125
- const total = this.cacheHits + this.cacheMisses;
126
- return {
127
- cacheDir: this.cacheDir,
128
- cacheHits: this.cacheHits,
129
- cacheMisses: this.cacheMisses,
130
- hitRatePct: total > 0 ? Math.round((this.cacheHits / total) * 1000) / 10 : 0,
131
- bytesDownloaded: this.bytesDownloaded,
132
- bytesFromCache: this.bytesFromCache,
133
- };
134
- }
135
- clearCache() {
136
- fs.rmSync(this.cacheDir, { recursive: true, force: true });
137
- fs.mkdirSync(this.cacheDir, { recursive: true });
138
- }
139
- }
140
- //# sourceMappingURL=cache.js.map
package/dist/cache.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
package/dist/feed.d.ts DELETED
@@ -1,89 +0,0 @@
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
- export declare enum FeedMode {
33
- LIVE = "live",
34
- REPLAY = "replay",
35
- AUTO = "auto"
36
- }
37
- export interface FeedOptions {
38
- channels?: string[];
39
- sources?: string[];
40
- from?: string;
41
- to?: string;
42
- speed?: number;
43
- reconnect?: boolean;
44
- apiKey?: string;
45
- }
46
- export interface FeedStats {
47
- mode: FeedMode;
48
- currentMode: FeedMode;
49
- messagesReceived: number;
50
- connected: boolean;
51
- url: string;
52
- }
53
- type DataCallback = (topic: string, data: Record<string, any>) => void;
54
- type ReplayEndCallback = (stats: {
55
- totalEvents: number;
56
- durationS: number;
57
- }) => void;
58
- type ModeChangeCallback = (from: FeedMode, to: FeedMode) => void;
59
- export declare class DeepTickFeed {
60
- private mode;
61
- private currentMode;
62
- private url;
63
- private options;
64
- private ws;
65
- private messagesReceived;
66
- private connected;
67
- private dataCallbacks;
68
- private replayEndCallbacks;
69
- private modeChangeCallbacks;
70
- private constructor();
71
- static live(url?: string, options?: FeedOptions): DeepTickFeed;
72
- static replay(url?: string, options?: FeedOptions): DeepTickFeed;
73
- static auto(baseUrl?: string, options?: FeedOptions): DeepTickFeed;
74
- /** Register a callback for data events (works identically for live and replay) */
75
- onData(cb: DataCallback): this;
76
- /** Register a callback for replay completion */
77
- onReplayEnd(cb: ReplayEndCallback): this;
78
- /** Register a callback for mode changes (replay → live in auto mode) */
79
- onModeChange(cb: ModeChangeCallback): this;
80
- connect(): Promise<void>;
81
- disconnect(): Promise<void>;
82
- subscribe(channels: string[]): Promise<void>;
83
- private startLive;
84
- private startReplay;
85
- private switchToLive;
86
- getStats(): FeedStats;
87
- }
88
- export {};
89
- //# sourceMappingURL=feed.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feed.d.ts","sourceRoot":"","sources":["../src/feed.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAIH,oBAAY,QAAQ;IAClB,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,IAAI,SAAS;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,QAAQ,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,KAAK,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;AACvE,KAAK,iBAAiB,GAAG,CAAC,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,KAAK,IAAI,CAAC;AACrF,KAAK,kBAAkB,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,KAAK,IAAI,CAAC;AAEjE,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAW;IACvB,OAAO,CAAC,WAAW,CAAW;IAC9B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,kBAAkB,CAA2B;IACrD,OAAO,CAAC,mBAAmB,CAA4B;IAEvD,OAAO;IASP,MAAM,CAAC,IAAI,CAAC,GAAG,GAAE,MAAmD,EAAE,OAAO,GAAE,WAAgB,GAAG,YAAY;IAI9G,MAAM,CAAC,MAAM,CAAC,GAAG,GAAE,MAAsD,EAAE,OAAO,GAAE,WAAgB,GAAG,YAAY;IAInH,MAAM,CAAC,IAAI,CAAC,OAAO,GAAE,MAAyC,EAAE,OAAO,GAAE,WAAgB,GAAG,YAAY;IAUxG,kFAAkF;IAClF,MAAM,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAK9B,gDAAgD;IAChD,WAAW,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI;IAKxC,wEAAwE;IACxE,YAAY,CAAC,EAAE,EAAE,kBAAkB,GAAG,IAAI;IAOpC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAsExB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IASlD,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,WAAW;YAaL,YAAY;IAgD1B,QAAQ,IAAI,SAAS;CAStB"}
package/dist/feed.js DELETED
@@ -1,232 +0,0 @@
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
package/dist/feed.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"feed.js","sourceRoot":"","sources":["../src/feed.ts"],"names":[],"mappings":"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"}