@coderyo/core 1.0.1 → 1.0.3
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/index.d.ts +35 -2
- package/dist/index.js +155 -9
- package/dist/index.js.map +1 -1
- package/package.json +12 -12
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { DrawingRecord, DrawingStyleMeta } from '@coderyo/drawings';
|
|
|
3
3
|
import * as _coderyo_data from '@coderyo/data';
|
|
4
4
|
import { RealtimeStreamMode, Interval, DataProvider, SymbolResolver, Bar } from '@coderyo/data';
|
|
5
5
|
import { IndicatorConfig } from '@coderyo/indicators';
|
|
6
|
+
export { DEFAULT_INDICATOR_CONFIG, IndicatorConfig, IndicatorSource, clearedIndicatorConfig, hasAnyActiveIndicators, hasMainChartOverlays, hasVisibleIndicatorPanes, indicatorConfigStorageKey } from '@coderyo/indicators';
|
|
6
7
|
import { FetchPolicy } from '@coderyo/virtual-window';
|
|
7
8
|
import { ChartVisibleRange } from '@coderyo/renderer-lite';
|
|
8
9
|
export { ChartVisibleRange } from '@coderyo/renderer-lite';
|
|
@@ -40,6 +41,13 @@ interface ChartFeatures {
|
|
|
40
41
|
tickStream?: boolean;
|
|
41
42
|
/** Run Pine-lite VM in a Web Worker when available (default true). */
|
|
42
43
|
pineWorker?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* On interval/symbol reload, set bar spacing (px) for the interval (default true).
|
|
46
|
+
* Does not choose how many bars are visible — use history limit / setVisibleRange.
|
|
47
|
+
*/
|
|
48
|
+
autoBarSpacingOnInterval?: boolean;
|
|
49
|
+
/** Override default bar spacing per interval (integrator). */
|
|
50
|
+
barSpacingByInterval?: Partial<Record<Interval, number>>;
|
|
43
51
|
}
|
|
44
52
|
interface ResolvedChartFeatures {
|
|
45
53
|
fetchPolicy: FetchPolicy;
|
|
@@ -56,12 +64,24 @@ interface ResolvedChartFeatures {
|
|
|
56
64
|
telemetry: boolean;
|
|
57
65
|
tickStream: boolean;
|
|
58
66
|
pineWorker: boolean;
|
|
67
|
+
autoBarSpacingOnInterval: boolean;
|
|
68
|
+
barSpacingByInterval?: Partial<Record<Interval, number>>;
|
|
59
69
|
}
|
|
60
70
|
declare const DEFAULT_CHART_FEATURES: ResolvedChartFeatures;
|
|
61
71
|
declare function resolveChartFeatures(partial?: ChartFeatures): ResolvedChartFeatures;
|
|
62
72
|
/** Empty chart until integrator calls setSymbol. */
|
|
63
73
|
declare const PENDING_SYMBOL = "";
|
|
64
74
|
|
|
75
|
+
/** Pluggable key-value storage for `indicatorPersist` (default: `localStorage`). */
|
|
76
|
+
interface ChartStorageAdapter {
|
|
77
|
+
getItem(key: string): string | null;
|
|
78
|
+
setItem(key: string, value: string): void;
|
|
79
|
+
}
|
|
80
|
+
declare function createLocalChartStorage(): ChartStorageAdapter;
|
|
81
|
+
declare const defaultChartStorage: ChartStorageAdapter;
|
|
82
|
+
declare function loadIndicatorConfig(storage: ChartStorageAdapter, symbol: string, interval: string): IndicatorConfig;
|
|
83
|
+
declare function saveIndicatorConfig(storage: ChartStorageAdapter, symbol: string, interval: string, config: IndicatorConfig): void;
|
|
84
|
+
|
|
65
85
|
interface ChartOptions {
|
|
66
86
|
width?: number;
|
|
67
87
|
height?: number;
|
|
@@ -86,6 +106,8 @@ interface ChartOptions {
|
|
|
86
106
|
};
|
|
87
107
|
/** @deprecated Use features.indicators */
|
|
88
108
|
indicatorConfig?: IndicatorConfig;
|
|
109
|
+
/** Storage backend for `features.indicatorPersist` (default `localStorage`). */
|
|
110
|
+
chartStorage?: ChartStorageAdapter;
|
|
89
111
|
}
|
|
90
112
|
type ChartEvent = 'connectionChange' | 'barUpdate' | 'error' | 'visibleRangeChange' | 'symbolChange' | 'intervalChange' | 'crosshairChange' | 'destroyed' | 'drawingSelectionChange' | 'drawingContextMenu' | 'requestCursorTool' | 'featuresChange' | 'telemetry';
|
|
91
113
|
type EventHandler = (payload?: unknown) => void;
|
|
@@ -111,6 +133,9 @@ declare class ChartController {
|
|
|
111
133
|
private catchUpInFlight;
|
|
112
134
|
private lastCatchUpAt;
|
|
113
135
|
private offPageResume;
|
|
136
|
+
/** After clearAllIndicators(); blocks Pine replot until script/features change. */
|
|
137
|
+
private pinePlotsSuppressed;
|
|
138
|
+
private readonly chartStorage;
|
|
114
139
|
constructor(container: HTMLElement, options: ChartOptions);
|
|
115
140
|
getFeatures(): ResolvedChartFeatures;
|
|
116
141
|
setFeatures(patch: ChartFeatures): this;
|
|
@@ -145,6 +170,10 @@ declare class ChartController {
|
|
|
145
170
|
updateSelectedDrawingStyle(patch: DrawingStyleMeta): void;
|
|
146
171
|
deselectDrawing(): void;
|
|
147
172
|
setIndicatorConfig(config: IndicatorConfig | null): void;
|
|
173
|
+
private applyPersistedIndicatorsOnInit;
|
|
174
|
+
private applyPersistedIndicatorsForContext;
|
|
175
|
+
clearAllIndicators(): IndicatorConfig;
|
|
176
|
+
clearAllDrawings(): number;
|
|
148
177
|
setReturnToCursorAfterDraw(v: boolean): void;
|
|
149
178
|
setSymbol(symbol: string): Promise<void>;
|
|
150
179
|
setInterval(interval: Interval): Promise<void>;
|
|
@@ -191,7 +220,7 @@ interface WireChartBridgeOptions {
|
|
|
191
220
|
declare function wireChartBridge(opts: WireChartBridgeOptions): () => void;
|
|
192
221
|
|
|
193
222
|
/** Synced by scripts/sync-versions.mjs from repo VERSION file */
|
|
194
|
-
declare const TRADVIEW_VERSION: "1.0.
|
|
223
|
+
declare const TRADVIEW_VERSION: "1.0.3";
|
|
195
224
|
|
|
196
225
|
/** Playground / docs: opt-in full TV-like chart features. */
|
|
197
226
|
declare function createDemoChartFeatures(opts: {
|
|
@@ -252,6 +281,10 @@ interface IChart {
|
|
|
252
281
|
updateSelectedDrawingStyle(patch: DrawingStyleMeta): void;
|
|
253
282
|
deselectDrawing(): void;
|
|
254
283
|
setIndicatorConfig(config: IndicatorConfig | null): void;
|
|
284
|
+
/** Hide all indicator panes and overlays; returns the applied config. */
|
|
285
|
+
clearAllIndicators(): IndicatorConfig;
|
|
286
|
+
/** Remove all drawings for the current symbol/interval; returns count removed. */
|
|
287
|
+
clearAllDrawings(): number;
|
|
255
288
|
setReturnToCursorAfterDraw(v: boolean): void;
|
|
256
289
|
setFeatures(patch: ChartFeatures): IChart;
|
|
257
290
|
getFeatures(): ResolvedChartFeatures;
|
|
@@ -265,4 +298,4 @@ interface IChart {
|
|
|
265
298
|
}
|
|
266
299
|
declare function createChart(target: HTMLElement | string, options: CreateChartOptions): IChart;
|
|
267
300
|
|
|
268
|
-
export { ChartController, type ChartEvent, type ChartFeatures, type ChartOptions, type CreateChartOptions, DEFAULT_CHART_FEATURES, type IChart, PENDING_SYMBOL, type ResolvedChartFeatures, TRADVIEW_API_VERSION, TRADVIEW_VERSION, type WireChartBridgeOptions, createChart, createDemoChartFeatures, createDemoChartOptions, resolveChartFeatures, wireChartBridge };
|
|
301
|
+
export { ChartController, type ChartEvent, type ChartFeatures, type ChartOptions, type ChartStorageAdapter, type CreateChartOptions, DEFAULT_CHART_FEATURES, type IChart, PENDING_SYMBOL, type ResolvedChartFeatures, TRADVIEW_API_VERSION, TRADVIEW_VERSION, type WireChartBridgeOptions, createChart, createDemoChartFeatures, createDemoChartOptions, createLocalChartStorage, defaultChartStorage, loadIndicatorConfig, resolveChartFeatures, saveIndicatorConfig, wireChartBridge };
|
package/dist/index.js
CHANGED
|
@@ -5,10 +5,19 @@ import {
|
|
|
5
5
|
} from "@coderyo/bridge";
|
|
6
6
|
|
|
7
7
|
// src/version.ts
|
|
8
|
-
var TRADVIEW_VERSION = "1.0.
|
|
8
|
+
var TRADVIEW_VERSION = "1.0.3";
|
|
9
9
|
|
|
10
10
|
// src/bridge-wire.ts
|
|
11
11
|
var TRADVIEW_API_VERSION = 1;
|
|
12
|
+
var DRAWING_TOOLS = /* @__PURE__ */ new Set([
|
|
13
|
+
"cursor",
|
|
14
|
+
"trendline",
|
|
15
|
+
"hline",
|
|
16
|
+
"vline",
|
|
17
|
+
"rectangle",
|
|
18
|
+
"fibonacci",
|
|
19
|
+
"text"
|
|
20
|
+
]);
|
|
12
21
|
var CHART_EVENT_TO_BRIDGE = {
|
|
13
22
|
connectionChange: "chart.connectionChange",
|
|
14
23
|
visibleRangeChange: "chart.visibleRange",
|
|
@@ -174,6 +183,22 @@ function wireChartBridge(opts) {
|
|
|
174
183
|
chart.setFeatures(p.features);
|
|
175
184
|
}
|
|
176
185
|
break;
|
|
186
|
+
case "host.setIndicatorConfig":
|
|
187
|
+
if (p.config && typeof p.config === "object") {
|
|
188
|
+
chart.setIndicatorConfig(p.config);
|
|
189
|
+
}
|
|
190
|
+
break;
|
|
191
|
+
case "host.clearAllIndicators":
|
|
192
|
+
chart.clearAllIndicators();
|
|
193
|
+
break;
|
|
194
|
+
case "host.clearAllDrawings":
|
|
195
|
+
chart.clearAllDrawings();
|
|
196
|
+
break;
|
|
197
|
+
case "host.setDrawingTool":
|
|
198
|
+
if (typeof p.tool === "string" && DRAWING_TOOLS.has(p.tool)) {
|
|
199
|
+
chart.setDrawingTool(p.tool);
|
|
200
|
+
}
|
|
201
|
+
break;
|
|
177
202
|
case "host.destroy":
|
|
178
203
|
chart.destroy();
|
|
179
204
|
break;
|
|
@@ -189,6 +214,7 @@ function wireChartBridge(opts) {
|
|
|
189
214
|
}
|
|
190
215
|
|
|
191
216
|
// src/chart-controller.ts
|
|
217
|
+
import { clearedIndicatorConfig } from "@coderyo/indicators";
|
|
192
218
|
import { floorBarOpenTime, intervalMs as intervalMs2 } from "@coderyo/data";
|
|
193
219
|
import { parseInterval } from "@coderyo/data";
|
|
194
220
|
import { BarStore, computeGapStartTimes, TickAggregator } from "@coderyo/series";
|
|
@@ -251,7 +277,9 @@ var DEFAULT_CHART_FEATURES = {
|
|
|
251
277
|
protobuf: false,
|
|
252
278
|
telemetry: false,
|
|
253
279
|
tickStream: false,
|
|
254
|
-
pineWorker: true
|
|
280
|
+
pineWorker: true,
|
|
281
|
+
autoBarSpacingOnInterval: true,
|
|
282
|
+
barSpacingByInterval: void 0
|
|
255
283
|
};
|
|
256
284
|
function resolveChartFeatures(partial) {
|
|
257
285
|
const d = DEFAULT_CHART_FEATURES;
|
|
@@ -275,7 +303,9 @@ function resolveChartFeatures(partial) {
|
|
|
275
303
|
protobuf: partial?.protobuf ?? d.protobuf,
|
|
276
304
|
telemetry: partial?.telemetry ?? d.telemetry,
|
|
277
305
|
tickStream: partial?.tickStream ?? d.tickStream,
|
|
278
|
-
pineWorker: partial?.pineWorker ?? d.pineWorker
|
|
306
|
+
pineWorker: partial?.pineWorker ?? d.pineWorker,
|
|
307
|
+
autoBarSpacingOnInterval: partial?.autoBarSpacingOnInterval ?? d.autoBarSpacingOnInterval,
|
|
308
|
+
barSpacingByInterval: partial?.barSpacingByInterval ?? d.barSpacingByInterval
|
|
279
309
|
};
|
|
280
310
|
}
|
|
281
311
|
function mergeChartFeatures(current, patch) {
|
|
@@ -293,16 +323,58 @@ function mergeChartFeatures(current, patch) {
|
|
|
293
323
|
protobuf: patch.protobuf ?? current.protobuf,
|
|
294
324
|
telemetry: patch.telemetry ?? current.telemetry,
|
|
295
325
|
tickStream: patch.tickStream ?? current.tickStream,
|
|
296
|
-
pineWorker: patch.pineWorker ?? current.pineWorker
|
|
326
|
+
pineWorker: patch.pineWorker ?? current.pineWorker,
|
|
327
|
+
autoBarSpacingOnInterval: patch.autoBarSpacingOnInterval ?? current.autoBarSpacingOnInterval,
|
|
328
|
+
barSpacingByInterval: patch.barSpacingByInterval ?? current.barSpacingByInterval
|
|
297
329
|
});
|
|
298
330
|
}
|
|
299
331
|
var PENDING_SYMBOL = "";
|
|
300
332
|
|
|
333
|
+
// src/indicator-storage.ts
|
|
334
|
+
import {
|
|
335
|
+
DEFAULT_INDICATOR_CONFIG,
|
|
336
|
+
indicatorConfigStorageKey
|
|
337
|
+
} from "@coderyo/indicators";
|
|
338
|
+
function createLocalChartStorage() {
|
|
339
|
+
return {
|
|
340
|
+
getItem: (key) => {
|
|
341
|
+
try {
|
|
342
|
+
return localStorage.getItem(key);
|
|
343
|
+
} catch {
|
|
344
|
+
return null;
|
|
345
|
+
}
|
|
346
|
+
},
|
|
347
|
+
setItem: (key, value) => {
|
|
348
|
+
try {
|
|
349
|
+
localStorage.setItem(key, value);
|
|
350
|
+
} catch {
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
var defaultChartStorage = createLocalChartStorage();
|
|
356
|
+
function loadIndicatorConfig(storage, symbol, interval) {
|
|
357
|
+
try {
|
|
358
|
+
const raw = storage.getItem(indicatorConfigStorageKey(symbol, interval));
|
|
359
|
+
if (!raw) return { ...DEFAULT_INDICATOR_CONFIG };
|
|
360
|
+
return { ...DEFAULT_INDICATOR_CONFIG, ...JSON.parse(raw) };
|
|
361
|
+
} catch {
|
|
362
|
+
return { ...DEFAULT_INDICATOR_CONFIG };
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
function saveIndicatorConfig(storage, symbol, interval, config) {
|
|
366
|
+
try {
|
|
367
|
+
storage.setItem(indicatorConfigStorageKey(symbol, interval), JSON.stringify(config));
|
|
368
|
+
} catch {
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
301
372
|
// src/chart-controller.ts
|
|
302
373
|
var ChartController = class {
|
|
303
374
|
constructor(container, options) {
|
|
304
375
|
this.container = container;
|
|
305
376
|
this.options = options;
|
|
377
|
+
this.chartStorage = options.chartStorage ?? defaultChartStorage;
|
|
306
378
|
this.features = resolveChartFeatures({
|
|
307
379
|
...options.features,
|
|
308
380
|
fetchPolicy: options.features?.fetchPolicy ?? options.fetchPolicy,
|
|
@@ -321,8 +393,12 @@ var ChartController = class {
|
|
|
321
393
|
showGrid: options.showGrid ?? false,
|
|
322
394
|
indicatorConfig: this.features.indicators,
|
|
323
395
|
smoothPriceUpdate: this.features.smoothPriceUpdate,
|
|
324
|
-
smoothPriceDurationMs: this.features.smoothPriceDurationMs
|
|
396
|
+
smoothPriceDurationMs: this.features.smoothPriceDurationMs,
|
|
397
|
+
onIndicatorConfigChange: (config) => this.setIndicatorConfig(config),
|
|
398
|
+
autoBarSpacingOnInterval: this.features.autoBarSpacingOnInterval,
|
|
399
|
+
barSpacingByInterval: this.features.barSpacingByInterval
|
|
325
400
|
});
|
|
401
|
+
this.orchestrator.setIntervalContext(interval);
|
|
326
402
|
if (options.width) container.style.width = `${options.width}px`;
|
|
327
403
|
if (options.height) container.style.height = `${options.height}px`;
|
|
328
404
|
this.resizeObserver = new ResizeObserver(() => {
|
|
@@ -366,6 +442,7 @@ var ChartController = class {
|
|
|
366
442
|
this.emit("crosshairChange", payload);
|
|
367
443
|
});
|
|
368
444
|
this.bindPageResumeCatchUp();
|
|
445
|
+
this.applyPersistedIndicatorsOnInit(options);
|
|
369
446
|
if (this.hasActiveSymbol()) {
|
|
370
447
|
void this.bootstrap(this.loadGeneration);
|
|
371
448
|
} else {
|
|
@@ -393,10 +470,16 @@ var ChartController = class {
|
|
|
393
470
|
catchUpInFlight = false;
|
|
394
471
|
lastCatchUpAt = 0;
|
|
395
472
|
offPageResume = null;
|
|
473
|
+
/** After clearAllIndicators(); blocks Pine replot until script/features change. */
|
|
474
|
+
pinePlotsSuppressed = false;
|
|
475
|
+
chartStorage;
|
|
396
476
|
getFeatures() {
|
|
397
477
|
return { ...this.features };
|
|
398
478
|
}
|
|
399
479
|
setFeatures(patch) {
|
|
480
|
+
if (patch.pineEnabled === true || patch.pineScript !== void 0) {
|
|
481
|
+
this.pinePlotsSuppressed = false;
|
|
482
|
+
}
|
|
400
483
|
this.features = mergeChartFeatures(this.features, patch);
|
|
401
484
|
this.applyFeatures();
|
|
402
485
|
this.emit("featuresChange", this.getFeatures());
|
|
@@ -410,6 +493,10 @@ var ChartController = class {
|
|
|
410
493
|
const fetchPolicy = this.features.gaps.fillVisibleHoles ? "fill-visible-holes" : this.features.fetchPolicy;
|
|
411
494
|
this.virtualWindow.setFetchPolicy(fetchPolicy);
|
|
412
495
|
this.orchestrator.setIndicatorConfig(this.features.indicators);
|
|
496
|
+
this.orchestrator.setBarSpacingPolicy({
|
|
497
|
+
autoBarSpacingOnInterval: this.features.autoBarSpacingOnInterval,
|
|
498
|
+
barSpacingByInterval: this.features.barSpacingByInterval
|
|
499
|
+
});
|
|
413
500
|
this.orchestrator.setSmoothPriceUpdate(
|
|
414
501
|
this.features.smoothPriceUpdate,
|
|
415
502
|
this.features.smoothPriceDurationMs
|
|
@@ -438,7 +525,7 @@ var ChartController = class {
|
|
|
438
525
|
}
|
|
439
526
|
}
|
|
440
527
|
applyPinePlots(bars) {
|
|
441
|
-
if (!this.features.pineEnabled || !this.pineIr) {
|
|
528
|
+
if (this.pinePlotsSuppressed || !this.features.pineEnabled || !this.pineIr) {
|
|
442
529
|
this.orchestrator.setPinePlots(null);
|
|
443
530
|
return;
|
|
444
531
|
}
|
|
@@ -593,27 +680,66 @@ var ChartController = class {
|
|
|
593
680
|
setIndicatorConfig(config) {
|
|
594
681
|
this.features = mergeChartFeatures(this.features, { indicators: config });
|
|
595
682
|
this.orchestrator.setIndicatorConfig(config);
|
|
683
|
+
if (config && this.features.indicatorPersist && this.hasActiveSymbol()) {
|
|
684
|
+
saveIndicatorConfig(
|
|
685
|
+
this.chartStorage,
|
|
686
|
+
this.store.symbol,
|
|
687
|
+
this.store.interval,
|
|
688
|
+
config
|
|
689
|
+
);
|
|
690
|
+
}
|
|
596
691
|
this.emit("featuresChange", this.getFeatures());
|
|
597
692
|
}
|
|
693
|
+
applyPersistedIndicatorsOnInit(options) {
|
|
694
|
+
if (!this.features.indicatorPersist || !this.hasActiveSymbol()) return;
|
|
695
|
+
const explicit = options.features?.indicators !== void 0 || options.indicatorConfig !== void 0;
|
|
696
|
+
if (explicit) return;
|
|
697
|
+
this.applyPersistedIndicatorsForContext();
|
|
698
|
+
}
|
|
699
|
+
applyPersistedIndicatorsForContext() {
|
|
700
|
+
if (!this.features.indicatorPersist || !this.hasActiveSymbol()) return;
|
|
701
|
+
const loaded = loadIndicatorConfig(
|
|
702
|
+
this.chartStorage,
|
|
703
|
+
this.store.symbol,
|
|
704
|
+
this.store.interval
|
|
705
|
+
);
|
|
706
|
+
this.features = mergeChartFeatures(this.features, { indicators: loaded });
|
|
707
|
+
this.orchestrator.setIndicatorConfig(loaded);
|
|
708
|
+
this.emit("featuresChange", this.getFeatures());
|
|
709
|
+
}
|
|
710
|
+
clearAllIndicators() {
|
|
711
|
+
const config = clearedIndicatorConfig(this.features.indicators ?? void 0);
|
|
712
|
+
this.setIndicatorConfig(config);
|
|
713
|
+
this.orchestrator.setPinePlots(null);
|
|
714
|
+
this.pinePlotsSuppressed = true;
|
|
715
|
+
return config;
|
|
716
|
+
}
|
|
717
|
+
clearAllDrawings() {
|
|
718
|
+
return this.drawingManager?.clearAll() ?? 0;
|
|
719
|
+
}
|
|
598
720
|
setReturnToCursorAfterDraw(v) {
|
|
599
721
|
this.drawingManager?.setReturnToCursorAfterDraw(v);
|
|
600
722
|
}
|
|
601
723
|
async setSymbol(symbol) {
|
|
602
724
|
const trimmed = symbol.trim();
|
|
603
725
|
if (!trimmed) return;
|
|
726
|
+
this.orchestrator.setIntervalContext(this.store.interval);
|
|
604
727
|
const gen = this.beginDataContextChange();
|
|
605
728
|
await this.teardownSubscription();
|
|
606
729
|
await this.store.setSymbolInterval(trimmed, this.store.interval);
|
|
607
730
|
this.drawingManager?.setContext(symbol, this.store.interval);
|
|
731
|
+
this.applyPersistedIndicatorsForContext();
|
|
608
732
|
const info = await this.resolveSymbol(symbol);
|
|
609
733
|
await this.bootstrap(gen);
|
|
610
734
|
this.emit("symbolChange", info ?? { symbol });
|
|
611
735
|
}
|
|
612
736
|
async setInterval(interval) {
|
|
737
|
+
this.orchestrator.setIntervalContext(interval);
|
|
613
738
|
const gen = this.beginDataContextChange();
|
|
614
739
|
await this.teardownSubscription();
|
|
615
740
|
await this.store.setSymbolInterval(this.store.symbol, interval);
|
|
616
741
|
this.drawingManager?.setContext(this.store.symbol, interval);
|
|
742
|
+
this.applyPersistedIndicatorsForContext();
|
|
617
743
|
if (this.hasActiveSymbol()) {
|
|
618
744
|
await this.bootstrap(gen);
|
|
619
745
|
}
|
|
@@ -956,7 +1082,7 @@ function toHistoryQuery(req) {
|
|
|
956
1082
|
}
|
|
957
1083
|
|
|
958
1084
|
// src/demo-presets.ts
|
|
959
|
-
import { DEFAULT_INDICATOR_CONFIG } from "@coderyo/indicators";
|
|
1085
|
+
import { DEFAULT_INDICATOR_CONFIG as DEFAULT_INDICATOR_CONFIG2 } from "@coderyo/indicators";
|
|
960
1086
|
import { PINE_SAMPLE_SCRIPT } from "@coderyo/pine-lite";
|
|
961
1087
|
function createDemoChartFeatures(opts) {
|
|
962
1088
|
return {
|
|
@@ -964,7 +1090,7 @@ function createDemoChartFeatures(opts) {
|
|
|
964
1090
|
streamMode: "bar+tick",
|
|
965
1091
|
gaps: { whitespace: false, fillVisibleHoles: false },
|
|
966
1092
|
drawings: { layer: true, persist: true },
|
|
967
|
-
indicators: opts.indicatorConfig ??
|
|
1093
|
+
indicators: opts.indicatorConfig ?? DEFAULT_INDICATOR_CONFIG2,
|
|
968
1094
|
indicatorPersist: true,
|
|
969
1095
|
smoothPriceUpdate: true,
|
|
970
1096
|
smoothPriceDurationMs: 150,
|
|
@@ -974,7 +1100,7 @@ function createDemoChartFeatures(opts) {
|
|
|
974
1100
|
};
|
|
975
1101
|
}
|
|
976
1102
|
function createDemoChartOptions(base) {
|
|
977
|
-
const indicatorConfig = base.indicatorConfig ??
|
|
1103
|
+
const indicatorConfig = base.indicatorConfig ?? DEFAULT_INDICATOR_CONFIG2;
|
|
978
1104
|
return {
|
|
979
1105
|
...base,
|
|
980
1106
|
features: createDemoChartFeatures({
|
|
@@ -1072,6 +1198,8 @@ function wrap(controller, beforeDestroy) {
|
|
|
1072
1198
|
controller.setIndicatorConfig(c);
|
|
1073
1199
|
return wrap(controller, beforeDestroy);
|
|
1074
1200
|
},
|
|
1201
|
+
clearAllIndicators: () => controller.clearAllIndicators(),
|
|
1202
|
+
clearAllDrawings: () => controller.clearAllDrawings(),
|
|
1075
1203
|
setReturnToCursorAfterDraw: (v) => {
|
|
1076
1204
|
controller.setReturnToCursorAfterDraw(v);
|
|
1077
1205
|
return wrap(controller, beforeDestroy);
|
|
@@ -1117,6 +1245,14 @@ function createChart(target, options) {
|
|
|
1117
1245
|
}
|
|
1118
1246
|
|
|
1119
1247
|
// src/index.ts
|
|
1248
|
+
import {
|
|
1249
|
+
DEFAULT_INDICATOR_CONFIG as DEFAULT_INDICATOR_CONFIG3,
|
|
1250
|
+
clearedIndicatorConfig as clearedIndicatorConfig2,
|
|
1251
|
+
hasVisibleIndicatorPanes,
|
|
1252
|
+
hasMainChartOverlays,
|
|
1253
|
+
hasAnyActiveIndicators,
|
|
1254
|
+
indicatorConfigStorageKey as indicatorConfigStorageKey2
|
|
1255
|
+
} from "@coderyo/indicators";
|
|
1120
1256
|
import {
|
|
1121
1257
|
compilePineLite as compilePineLite2,
|
|
1122
1258
|
runPineLite,
|
|
@@ -1126,17 +1262,27 @@ import {
|
|
|
1126
1262
|
export {
|
|
1127
1263
|
ChartController,
|
|
1128
1264
|
DEFAULT_CHART_FEATURES,
|
|
1265
|
+
DEFAULT_INDICATOR_CONFIG3 as DEFAULT_INDICATOR_CONFIG,
|
|
1129
1266
|
PENDING_SYMBOL,
|
|
1130
1267
|
PINE_EDITOR_DEFAULT,
|
|
1131
1268
|
PINE_SAMPLE_SCRIPT2 as PINE_SAMPLE_SCRIPT,
|
|
1132
1269
|
TRADVIEW_API_VERSION,
|
|
1133
1270
|
TRADVIEW_VERSION,
|
|
1271
|
+
clearedIndicatorConfig2 as clearedIndicatorConfig,
|
|
1134
1272
|
compilePineLite2 as compilePineLite,
|
|
1135
1273
|
createChart,
|
|
1136
1274
|
createDemoChartFeatures,
|
|
1137
1275
|
createDemoChartOptions,
|
|
1276
|
+
createLocalChartStorage,
|
|
1277
|
+
defaultChartStorage,
|
|
1278
|
+
hasAnyActiveIndicators,
|
|
1279
|
+
hasMainChartOverlays,
|
|
1280
|
+
hasVisibleIndicatorPanes,
|
|
1281
|
+
indicatorConfigStorageKey2 as indicatorConfigStorageKey,
|
|
1282
|
+
loadIndicatorConfig,
|
|
1138
1283
|
resolveChartFeatures,
|
|
1139
1284
|
runPineLite,
|
|
1285
|
+
saveIndicatorConfig,
|
|
1140
1286
|
wireChartBridge
|
|
1141
1287
|
};
|
|
1142
1288
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bridge-wire.ts","../src/version.ts","../src/chart-controller.ts","../src/fetch-chart-history.ts","../src/chart-features.ts","../src/demo-presets.ts","../src/create-chart.ts","../src/index.ts"],"sourcesContent":["import type { BridgeAdapter } from '@coderyo/bridge';\nimport {\n BRIDGE_SCHEMA_VERSION,\n isBridgeInbound,\n type BridgeInboundType,\n type BridgeOutboundType,\n} from '@coderyo/bridge';\nimport type { Interval } from '@coderyo/data';\nimport type { CrosshairPayload } from '@coderyo/renderer-lite';\nimport type { ChartController, ChartEvent } from './chart-controller.js';\nimport type { IChart } from './create-chart.js';\nimport { TRADVIEW_VERSION } from './version.js';\n\nexport const TRADVIEW_API_VERSION = 1 as const;\n\nconst CHART_EVENT_TO_BRIDGE: Partial<Record<ChartEvent, BridgeOutboundType>> = {\n connectionChange: 'chart.connectionChange',\n visibleRangeChange: 'chart.visibleRange',\n error: 'chart.error',\n symbolChange: 'chart.symbol',\n intervalChange: 'chart.interval',\n crosshairChange: 'chart.crosshair',\n destroyed: 'chart.destroyed',\n barUpdate: 'chart.barUpdate',\n};\n\nexport interface WireChartBridgeOptions {\n controller: ChartController;\n chart: IChart;\n bridge: BridgeAdapter;\n chartId?: string;\n /** Allowlist of outbound bridge events; default all mapped events. */\n outboundEvents?: BridgeOutboundType[];\n crosshairThrottleMs?: number;\n}\n\nexport function wireChartBridge(opts: WireChartBridgeOptions): () => void {\n const chartId = opts.chartId ?? `chart-${Date.now()}`;\n const { bridge, chart, controller } = opts;\n const allow = opts.outboundEvents ? new Set(opts.outboundEvents) : null;\n\n const shouldPost = (type: BridgeOutboundType): boolean =>\n allow === null || allow.has(type);\n\n const post = (type: BridgeOutboundType, payload: Record<string, unknown>) => {\n if (!shouldPost(type)) return;\n bridge.post({ type, payload });\n };\n\n post('chart.ready', {\n chartId,\n bridgeSchemaVersion: BRIDGE_SCHEMA_VERSION,\n apiVersion: TRADVIEW_API_VERSION,\n version: TRADVIEW_VERSION,\n });\n\n const postResize = () => {\n const el = controller.getContainer();\n const r = el.getBoundingClientRect();\n post('chart.resize', {\n chartId,\n width: Math.round(r.width),\n height: Math.round(r.height),\n });\n };\n if (shouldPost('chart.resize')) postResize();\n\n let crosshairTimer: ReturnType<typeof setTimeout> | null = null;\n let crosshairPending: CrosshairPayload | null = null;\n const throttleMs = opts.crosshairThrottleMs ?? 0;\n\n const flushCrosshair = () => {\n crosshairTimer = null;\n const p = crosshairPending;\n crosshairPending = null;\n if (!p) return;\n post('chart.crosshair', {\n chartId,\n time: p.time,\n price: p.price,\n ohlcv: p.ohlcv,\n symbol: controller.getSymbol(),\n interval: controller.getInterval(),\n });\n };\n\n const handlers = new Map<ChartEvent, (p?: unknown) => void>();\n\n handlers.set('connectionChange', (state) => {\n post('chart.connectionChange', { chartId, state });\n });\n handlers.set('visibleRangeChange', (range) => {\n const r = range as { from?: number; to?: number };\n post('chart.visibleRange', { chartId, from: r.from, to: r.to });\n });\n handlers.set('error', (err) => {\n const e = err as { code?: string; message?: string };\n post('chart.error', {\n chartId,\n code: e?.code ?? 'UNKNOWN',\n message: e?.message ?? String(err),\n });\n });\n handlers.set('symbolChange', (symbol) => {\n post('chart.symbol', { chartId, symbol: String(symbol ?? '') });\n });\n handlers.set('intervalChange', (interval) => {\n post('chart.interval', { chartId, interval: String(interval ?? '') });\n });\n handlers.set('crosshairChange', (payload) => {\n const p = payload as CrosshairPayload | null;\n if (!p) return;\n if (throttleMs <= 0) {\n post('chart.crosshair', {\n chartId,\n time: p.time,\n price: p.price,\n ohlcv: p.ohlcv,\n symbol: controller.getSymbol(),\n interval: controller.getInterval(),\n });\n return;\n }\n crosshairPending = p;\n if (!crosshairTimer) {\n crosshairTimer = setTimeout(flushCrosshair, throttleMs);\n }\n });\n handlers.set('destroyed', () => {\n post('chart.destroyed', { chartId });\n });\n handlers.set('barUpdate', (bar) => {\n const b = bar as { t?: number; c?: number };\n post('chart.barUpdate', { chartId, t: b?.t, c: b?.c });\n });\n\n for (const [ev, fn] of handlers) {\n const bridgeType = CHART_EVENT_TO_BRIDGE[ev];\n if (!bridgeType || shouldPost(bridgeType)) {\n chart.on(ev, fn);\n }\n }\n\n const offHost = bridge.onMessage((msg) => {\n if (!isBridgeInbound(msg)) return;\n const p = msg.payload ?? {};\n switch (msg.type as BridgeInboundType) {\n case 'host.setSymbol':\n if (typeof p.symbol === 'string') chart.setSymbol(p.symbol);\n break;\n case 'host.setInterval':\n if (typeof p.interval === 'string') chart.setInterval(p.interval as Interval);\n break;\n case 'host.setTheme':\n if (p.theme === 'dark' || p.theme === 'light') chart.setTheme(p.theme);\n break;\n case 'host.setShowGrid':\n if (typeof p.showGrid === 'boolean') chart.setShowGrid(p.showGrid);\n break;\n case 'host.fitContent':\n chart.fitContent();\n break;\n case 'host.scrollToRealtime':\n chart.scrollToRealtime();\n break;\n case 'host.resize':\n chart.resize({\n width: typeof p.width === 'number' ? p.width : undefined,\n height: typeof p.height === 'number' ? p.height : undefined,\n });\n postResize();\n break;\n case 'host.setLogScale':\n if (typeof p.enabled === 'boolean') chart.setLogScale(p.enabled);\n break;\n case 'host.setBarSpace':\n if (typeof p.px === 'number') chart.setBarSpace(p.px);\n break;\n case 'host.setVisibleRange':\n if (typeof p.fromMs === 'number' && typeof p.toMs === 'number') {\n chart.setVisibleRange({ fromMs: p.fromMs, toMs: p.toMs });\n }\n break;\n case 'host.scrollToTimestamp':\n if (typeof p.tsMs === 'number') {\n chart.scrollToTimestamp(\n p.tsMs,\n typeof p.animationMs === 'number' ? p.animationMs : undefined,\n );\n }\n break;\n case 'host.reloadHistory':\n void chart.reloadHistory();\n break;\n case 'host.setLocale':\n if (typeof p.locale === 'string') chart.setLocale(p.locale);\n break;\n case 'host.setFeatures':\n if (p.features && typeof p.features === 'object') {\n chart.setFeatures(p.features as import('./chart-features.js').ChartFeatures);\n }\n break;\n case 'host.destroy':\n chart.destroy();\n break;\n default:\n break;\n }\n });\n\n return () => {\n if (crosshairTimer) clearTimeout(crosshairTimer);\n offHost();\n for (const [ev, fn] of handlers) chart.off(ev, fn);\n };\n}","/** Synced by scripts/sync-versions.mjs from repo VERSION file */\nexport const TRADVIEW_VERSION = '1.0.1' as const;\n","import type { DrawingRecord, DrawingStyleMeta } from '@coderyo/drawings';\nimport type { IndicatorConfig } from '@coderyo/indicators';\n\nimport type {\n Bar,\n DataProvider,\n HistoryQuery,\n Interval,\n RealtimeStreamMode,\n SubscribeParams,\n SymbolResolver,\n} from '@coderyo/data';\nimport { floorBarOpenTime, intervalMs } from '@coderyo/data';\nimport type { HistoryRequest } from '@coderyo/virtual-window';\nimport { parseInterval } from '@coderyo/data';\nimport { BarStore, computeGapStartTimes, TickAggregator } from '@coderyo/series';\nimport { setLocale as setI18nLocale } from '@coderyo/i18n';\nimport { fetchChartHistory } from './fetch-chart-history.js';\nimport { VirtualWindow, type FetchPolicy } from '@coderyo/virtual-window';\nimport { DrawingManager } from '@coderyo/drawings';\nimport {\n compilePineLite,\n runPineLiteAsync,\n terminatePineWorker,\n type PineIrProgram,\n} from '@coderyo/pine-lite';\nimport { PaneOrchestrator, type ChartVisibleRange } from '@coderyo/renderer-lite';\n\nexport type { ChartVisibleRange };\nimport {\n mergeChartFeatures,\n PENDING_SYMBOL,\n resolveChartFeatures,\n type ChartFeatures,\n type ResolvedChartFeatures,\n} from './chart-features.js';\n\nexport interface ChartOptions {\n width?: number;\n height?: number;\n theme?: 'dark' | 'light';\n interval?: Interval;\n /** Omit for empty chart until setSymbol(). */\n symbol?: string;\n chartId?: string;\n /** Host element below main chart for MACD/RSI/KDJ panes (from ui-shell layout). */\n indicatorHost?: HTMLElement;\n dataProvider: DataProvider;\n /** Integrator feature flags (minimal defaults). */\n features?: ChartFeatures;\n /** @deprecated Use features.fetchPolicy */\n fetchPolicy?: FetchPolicy;\n scaleMode?: 'linear' | 'log';\n /** Grid lines on chart panes (default false). */\n showGrid?: boolean;\n symbolResolver?: SymbolResolver;\n drawingDefaults?: { returnToCursorAfterDraw?: boolean };\n /** @deprecated Use features.indicators */\n indicatorConfig?: IndicatorConfig;\n}\n\nexport type ChartEvent =\n | 'connectionChange'\n | 'barUpdate'\n | 'error'\n | 'visibleRangeChange'\n | 'symbolChange'\n | 'intervalChange'\n | 'crosshairChange'\n | 'destroyed'\n | 'drawingSelectionChange'\n | 'drawingContextMenu'\n | 'requestCursorTool'\n | 'featuresChange'\n | 'telemetry';\n\ntype EventHandler = (payload?: unknown) => void;\n\nexport class ChartController {\n private readonly store: BarStore;\n private readonly virtualWindow: VirtualWindow;\n private readonly orchestrator: PaneOrchestrator;\n private readonly handlers = new Map<ChartEvent, Set<EventHandler>>();\n private subscriptionId: string | null = null;\n private destroyed = false;\n private readonly resizeObserver: ResizeObserver;\n private loadingMore = false;\n private visibleRangeInitialized = false;\n /** Bumped on symbol/interval change to drop stale bootstrap / loadMore / WS merges. */\n private loadGeneration = 0;\n private drawingManager: DrawingManager | null = null;\n private offCrosshair: (() => void) | null = null;\n private features: ResolvedChartFeatures;\n private pineIr: PineIrProgram | null = null;\n private tickAggregator: TickAggregator | null = null;\n private catchUpInFlight = false;\n private lastCatchUpAt = 0;\n private offPageResume: (() => void) | null = null;\n\n constructor(\n private readonly container: HTMLElement,\n private readonly options: ChartOptions,\n ) {\n this.features = resolveChartFeatures({\n ...options.features,\n fetchPolicy: options.features?.fetchPolicy ?? options.fetchPolicy,\n indicators:\n options.features?.indicators !== undefined\n ? options.features.indicators\n : options.indicatorConfig !== undefined\n ? options.indicatorConfig\n : undefined,\n });\n\n const symbol = options.symbol?.trim() || PENDING_SYMBOL;\n const interval = parseInterval(options.interval ?? '1h');\n const fetchPolicy = this.features.gaps.fillVisibleHoles\n ? 'fill-visible-holes'\n : this.features.fetchPolicy;\n\n this.store = new BarStore(symbol || PENDING_SYMBOL, interval);\n this.virtualWindow = new VirtualWindow(this.store, { fetchPolicy });\n this.orchestrator = new PaneOrchestrator({\n container,\n indicatorRoot: options.indicatorHost,\n theme: options.theme ?? 'dark',\n scaleMode: options.scaleMode ?? 'linear',\n showGrid: options.showGrid ?? false,\n indicatorConfig: this.features.indicators,\n smoothPriceUpdate: this.features.smoothPriceUpdate,\n smoothPriceDurationMs: this.features.smoothPriceDurationMs,\n });\n\n if (options.width) container.style.width = `${options.width}px`;\n if (options.height) container.style.height = `${options.height}px`;\n\n this.resizeObserver = new ResizeObserver(() => {\n if (!this.destroyed) this.resize();\n });\n this.resizeObserver.observe(container);\n\n this.orchestrator.bus.subscribeTransform(() => {\n const bus = this.orchestrator.bus;\n if (bus.visibleToMs > bus.visibleFromMs) {\n this.virtualWindow.setVisibleRange({\n fromMs: bus.visibleFromMs,\n toMs: bus.visibleToMs,\n });\n this.visibleRangeInitialized = true;\n }\n void this.maybeLoadMore();\n this.drawingManager?.redraw();\n });\n\n const overlay = this.orchestrator.getOverlayCanvas();\n if (overlay) {\n this.orchestrator.setOverlayPointerEvents('none');\n this.drawingManager = new DrawingManager({\n canvas: overlay,\n interactionHost: overlay.parentElement ?? undefined,\n chartId: options.chartId ?? 'default',\n symbol,\n interval,\n priceToY: (p) => this.orchestrator.priceToY(p),\n timeToX: (t) => this.orchestrator.timeToX(t),\n xToTime: (x) => this.orchestrator.xToTime(x),\n yToPrice: (y) => this.orchestrator.yToPrice(y),\n returnToCursorAfterDraw: options.drawingDefaults?.returnToCursorAfterDraw ?? false,\n onRequestCursorTool: () => this.emit('requestCursorTool'),\n onSelectionChange: (id, record) =>\n this.emit('drawingSelectionChange', { id, record }),\n onContextMenu: (payload) => this.emit('drawingContextMenu', payload),\n });\n this.drawingManager.setPersistence(this.features.drawings.persist);\n this.applyDrawingLayer();\n }\n\n this.offCrosshair = this.orchestrator.subscribeCrosshair((payload) => {\n this.emit('crosshairChange', payload);\n });\n\n this.bindPageResumeCatchUp();\n\n if (this.hasActiveSymbol()) {\n void this.bootstrap(this.loadGeneration);\n } else {\n this.emit('connectionChange', 'disconnected');\n }\n }\n\n getFeatures(): ResolvedChartFeatures {\n return { ...this.features };\n }\n\n setFeatures(patch: ChartFeatures): this {\n this.features = mergeChartFeatures(this.features, patch);\n this.applyFeatures();\n this.emit('featuresChange', this.getFeatures());\n return this;\n }\n\n hasActiveSymbol(): boolean {\n const s = this.store.symbol;\n return s.length > 0 && s !== PENDING_SYMBOL;\n }\n\n private applyFeatures(): void {\n const fetchPolicy = this.features.gaps.fillVisibleHoles\n ? 'fill-visible-holes'\n : this.features.fetchPolicy;\n this.virtualWindow.setFetchPolicy(fetchPolicy);\n\n this.orchestrator.setIndicatorConfig(this.features.indicators);\n this.orchestrator.setSmoothPriceUpdate(\n this.features.smoothPriceUpdate,\n this.features.smoothPriceDurationMs,\n );\n this.drawingManager?.setPersistence(this.features.drawings.persist);\n this.applyDrawingLayer();\n this.recompilePine();\n }\n\n private recompilePine(): void {\n if (!this.features.pineEnabled || !this.features.pineScript?.trim()) {\n this.pineIr = null;\n this.orchestrator.setPinePlots(null);\n return;\n }\n const compiled = compilePineLite(this.features.pineScript);\n if (!compiled.ok || !compiled.ir) {\n this.pineIr = null;\n this.orchestrator.setPinePlots(null);\n this.emit('error', { kind: 'pine', errors: compiled.errors });\n return;\n }\n this.pineIr = compiled.ir;\n if (this.hasActiveSymbol()) {\n const bars = this.virtualWindow.getBarsForRender();\n if (bars.length > 0) this.applyPinePlots(bars);\n }\n }\n\n private applyPinePlots(bars: Bar[]): void {\n if (!this.features.pineEnabled || !this.pineIr) {\n this.orchestrator.setPinePlots(null);\n return;\n }\n const ir = this.pineIr;\n const useWorker = this.features.pineWorker;\n void runPineLiteAsync(ir, bars, { useWorker })\n .then((result) => {\n if (this.destroyed || this.pineIr !== ir) return;\n this.orchestrator.setPinePlots(\n result.plots.map((p) => ({\n title: p.title,\n values: p.values,\n color: undefined,\n })),\n );\n })\n .catch((err) => this.emit('error', err));\n }\n\n private trackTelemetry(event: string, data?: Record<string, unknown>): void {\n if (!this.features.telemetry) return;\n this.emit('telemetry', { event, ...data });\n }\n\n setLocale(locale: string): this {\n setI18nLocale(locale);\n this.trackTelemetry('locale', { locale });\n return this;\n }\n\n subscribeBars(handler: (bar: Bar) => void): () => void {\n const wrapper = (payload?: unknown) => handler(payload as Bar);\n this.on('barUpdate', wrapper);\n return () => this.off('barUpdate', wrapper);\n }\n\n /** Integrator push: update last candle close (and H/L) without WS. */\n updateLastPrice(price: number, timeMs = Date.now()): this {\n if (!this.hasActiveSymbol() || this.destroyed) return this;\n const bar = this.buildBarFromPrice(price, timeMs);\n void this.applyRealtimeBar(bar, true);\n return this;\n }\n\n private buildBarFromPrice(price: number, timeMs: number): Bar {\n const interval = this.store.interval;\n const open = floorBarOpenTime(timeMs, interval);\n const times = this.store.sortedTimes;\n const lastT = times.length > 0 ? times[times.length - 1]! : undefined;\n const existing = lastT !== undefined ? this.store.getBar(lastT) : undefined;\n\n if (existing && existing.t === open) {\n return {\n ...existing,\n c: price,\n h: Math.max(existing.h, price),\n l: Math.min(existing.l, price),\n };\n }\n\n const prevClose = existing?.c ?? price;\n return {\n t: open,\n o: prevClose,\n h: Math.max(prevClose, price),\n l: Math.min(prevClose, price),\n c: price,\n v: existing?.v ?? 0,\n };\n }\n\n private async applyRealtimeBar(\n bar: Bar,\n partial: boolean,\n loadGen = this.loadGeneration,\n ): Promise<void> {\n await this.store.mergeRealtime({ bar, partial });\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n\n const bars = this.virtualWindow.getBarsForRender();\n const last = bars[bars.length - 1];\n if (last && this.features.smoothPriceUpdate) {\n this.orchestrator.updateLastBar(last, {\n smooth: true,\n durationMs: this.features.smoothPriceDurationMs,\n });\n this.drawingManager?.redraw();\n } else {\n this.refreshRender(loadGen);\n }\n this.emit('barUpdate', bar);\n this.trackTelemetry('barUpdate', { t: bar.t, partial });\n }\n\n private applyDrawingLayer(): void {\n if (!this.drawingManager) return;\n this.drawingManager.setLayerVisible(this.features.drawings.layer);\n this.syncOverlayPointerEvents();\n }\n\n private syncOverlayPointerEvents(): void {\n if (!this.drawingManager) return;\n const layer = this.features.drawings.layer;\n if (!layer) {\n this.orchestrator.setOverlayPointerEvents('none');\n return;\n }\n const tool = this.drawingManager.getTool();\n this.orchestrator.setOverlayPointerEvents(tool === 'cursor' ? 'none' : 'auto');\n }\n\n getContainer(): HTMLElement {\n return this.container;\n }\n\n getSymbol(): string {\n return this.store.symbol;\n }\n\n getInterval(): Interval {\n return this.store.interval;\n }\n\n async searchSymbols(query: string): Promise<import('@coderyo/data').SymbolSearchHit[]> {\n const resolver = this.options.symbolResolver;\n if (resolver?.search) return resolver.search(query);\n if (this.options.dataProvider.searchSymbols) {\n return this.options.dataProvider.searchSymbols(query);\n }\n return [];\n }\n\n async resolveSymbol(symbol: string): Promise<import('@coderyo/data').SymbolInfo | null> {\n if (this.options.symbolResolver) {\n return this.options.symbolResolver.resolve(symbol);\n }\n return { symbol };\n }\n\n on(event: ChartEvent, handler: EventHandler): this {\n if (!this.handlers.has(event)) this.handlers.set(event, new Set());\n this.handlers.get(event)!.add(handler);\n return this;\n }\n\n off(event: ChartEvent, handler: EventHandler): this {\n this.handlers.get(event)?.delete(handler);\n return this;\n }\n\n resize(size?: { width?: number; height?: number }): this {\n if (size?.width) this.container.style.width = `${size.width}px`;\n if (size?.height) this.container.style.height = `${size.height}px`;\n this.orchestrator.resize();\n return this;\n }\n\n setDrawingTool(tool: import('@coderyo/drawings').DrawingTool): this {\n this.drawingManager?.setTool(tool);\n this.syncOverlayPointerEvents();\n return this;\n }\n\n deleteSelectedDrawing(): boolean {\n return this.drawingManager?.deleteSelected() ?? false;\n }\n\n copySelectedDrawing(): DrawingRecord | null {\n return this.drawingManager?.copySelected() ?? null;\n }\n\n toggleLockSelectedDrawing(): boolean {\n return this.drawingManager?.toggleLockSelected() ?? false;\n }\n\n updateSelectedDrawingStyle(patch: DrawingStyleMeta): void {\n this.drawingManager?.updateSelectedStyle(patch);\n }\n\n deselectDrawing(): void {\n this.drawingManager?.deselect();\n }\n\n setIndicatorConfig(config: IndicatorConfig | null): void {\n this.features = mergeChartFeatures(this.features, { indicators: config });\n this.orchestrator.setIndicatorConfig(config);\n this.emit('featuresChange', this.getFeatures());\n }\n\n setReturnToCursorAfterDraw(v: boolean): void {\n this.drawingManager?.setReturnToCursorAfterDraw(v);\n }\n\n async setSymbol(symbol: string): Promise<void> {\n const trimmed = symbol.trim();\n if (!trimmed) return;\n const gen = this.beginDataContextChange();\n await this.teardownSubscription();\n await this.store.setSymbolInterval(trimmed, this.store.interval);\n this.drawingManager?.setContext(symbol, this.store.interval);\n const info = await this.resolveSymbol(symbol);\n await this.bootstrap(gen);\n this.emit('symbolChange', info ?? { symbol });\n }\n\n async setInterval(interval: Interval): Promise<void> {\n const gen = this.beginDataContextChange();\n await this.teardownSubscription();\n await this.store.setSymbolInterval(this.store.symbol, interval);\n this.drawingManager?.setContext(this.store.symbol, interval);\n if (this.hasActiveSymbol()) {\n await this.bootstrap(gen);\n }\n }\n\n setTheme(theme: 'dark' | 'light'): this {\n this.orchestrator.setTheme(theme);\n return this;\n }\n\n setShowGrid(show: boolean): this {\n this.orchestrator.setShowGrid(show);\n return this;\n }\n\n fitContent(): this {\n this.orchestrator.fitContent();\n return this;\n }\n\n scrollToRealtime(): this {\n this.orchestrator.scrollToRealtime();\n return this;\n }\n\n getVisibleRange(): ChartVisibleRange | null {\n return this.orchestrator.getVisibleRange();\n }\n\n getBarSpace(): number {\n return this.orchestrator.getBarSpace();\n }\n\n setBarSpace(px: number): this {\n this.orchestrator.setBarSpace(px);\n return this;\n }\n\n setVisibleRange(range: ChartVisibleRange): this {\n this.orchestrator.setVisibleRange(range);\n const { fromMs, toMs } = range;\n if (toMs > fromMs) {\n this.virtualWindow.setVisibleRange({ fromMs, toMs });\n this.visibleRangeInitialized = true;\n }\n return this;\n }\n\n scrollToTimestamp(tsMs: number, animationMs?: number): this {\n this.orchestrator.scrollToTimestamp(tsMs, animationMs);\n return this;\n }\n\n async reloadHistory(): Promise<this> {\n if (!this.hasActiveSymbol()) return this;\n const savedRange = this.getVisibleRange();\n const savedBarSpace = this.getBarSpace();\n const loadGen = this.loadGeneration;\n const symbol = this.store.symbol;\n const interval = this.store.interval;\n\n try {\n const history = await fetchChartHistory(this.options.dataProvider, {\n mode: 'loadMore',\n symbol,\n interval,\n endTime: Date.now(),\n limit: 500,\n });\n if (!this.isLoadGenerationCurrent(loadGen)) return this;\n if (this.store.symbol !== symbol || this.store.interval !== interval) return this;\n if (history.bars.length === 0) return this;\n\n await this.store.mergeBars(history.bars.map((bar) => ({ bar, source: 'rest' as const })));\n if (!this.isLoadGenerationCurrent(loadGen)) return this;\n\n this.orchestrator.preserveViewportOnNextSetBars();\n this.refreshRender(loadGen);\n if (savedBarSpace > 0) this.setBarSpace(savedBarSpace);\n if (savedRange) this.setVisibleRange(savedRange);\n } catch (err) {\n this.emit('error', err);\n }\n return this;\n }\n\n setLogScale(enabled: boolean): this {\n this.orchestrator.setLogScale(enabled);\n return this;\n }\n\n setFullscreen(_enabled: boolean): this {\n if (_enabled && this.container.requestFullscreen) {\n void this.container.requestFullscreen();\n } else if (document.fullscreenElement) {\n void document.exitFullscreen();\n }\n return this;\n }\n\n async exportImage(opts?: { pixelRatio?: number }): Promise<Blob> {\n const canvas = this.container.querySelector('canvas');\n if (!canvas) throw new Error('No canvas to export');\n const scale = opts?.pixelRatio ?? 2;\n const exportCanvas = document.createElement('canvas');\n exportCanvas.width = canvas.width * scale;\n exportCanvas.height = canvas.height * scale;\n const ctx = exportCanvas.getContext('2d')!;\n ctx.scale(scale, scale);\n ctx.drawImage(canvas, 0, 0);\n return new Promise((resolve, reject) => {\n exportCanvas.toBlob((b) => (b ? resolve(b) : reject(new Error('export failed'))), 'image/png');\n });\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.offPageResume?.();\n this.offPageResume = null;\n this.offCrosshair?.();\n this.offCrosshair = null;\n this.resizeObserver.disconnect();\n this.drawingManager?.destroy();\n void this.teardownSubscription();\n this.orchestrator.destroy();\n terminatePineWorker();\n this.emit('destroyed', { chartId: this.options.chartId ?? 'default' });\n this.emit('connectionChange', 'disconnected');\n }\n\n private beginDataContextChange(): number {\n this.loadGeneration += 1;\n this.visibleRangeInitialized = false;\n this.virtualWindow.setVisibleRange({ fromMs: 0, toMs: 0 });\n this.orchestrator.resetViewState();\n this.orchestrator.clearBars();\n return this.loadGeneration;\n }\n\n private isLoadGenerationCurrent(gen: number): boolean {\n return !this.destroyed && gen === this.loadGeneration;\n }\n\n private async bootstrap(loadGen: number): Promise<void> {\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n\n const symbol = this.store.symbol;\n const interval = this.store.interval;\n const endTime = Date.now();\n if (this.features.protobuf) {\n this.emit('error', {\n code: 'PROTOBUF_UNAVAILABLE',\n message: 'Protobuf encoding requires protocol v1.1 (not in 1.0.0)',\n });\n }\n\n const history = await fetchChartHistory(this.options.dataProvider, {\n mode: 'loadMore',\n symbol,\n interval,\n endTime,\n limit: 500,\n });\n\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n if (this.store.symbol !== symbol || this.store.interval !== interval) return;\n\n await this.store.mergeBars(history.bars.map((bar) => ({ bar })));\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n this.refreshRender(loadGen);\n void this.resolveSymbol(symbol).then((info) => {\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n this.emit('symbolChange', info ?? { symbol });\n });\n this.emit('intervalChange', interval);\n\n const streamMode: RealtimeStreamMode = this.features.tickStream\n ? 'bar+tick'\n : this.features.streamMode;\n const tickOnly = streamMode === 'tick';\n\n const params: SubscribeParams = {\n symbol,\n interval,\n channels: tickOnly ? ['tick'] : this.features.tickStream ? ['bar', 'tick'] : ['bar'],\n streamMode,\n };\n\n this.tickAggregator = tickOnly\n ? new TickAggregator(interval, (bar, partial) => {\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n if (this.store.symbol !== symbol || this.store.interval !== interval) return;\n void this.applyRealtimeBar(bar, partial, loadGen);\n })\n : null;\n\n await this.options.dataProvider.connect?.();\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n\n const sub = await this.options.dataProvider.subscribe(params, {\n onBar: tickOnly\n ? undefined\n : (bar, meta) => {\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n if (this.store.symbol !== symbol || this.store.interval !== interval) return;\n void this.applyRealtimeBar(bar, meta.partial, loadGen);\n },\n onTick: (tick) => {\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n if (this.store.symbol !== symbol || this.store.interval !== interval) return;\n if (this.tickAggregator) {\n this.tickAggregator.ingest(tick);\n return;\n }\n const bar = this.buildBarFromPrice(tick.price, tick.t);\n void this.applyRealtimeBar(bar, true, loadGen);\n },\n onConnectionChange: (state) => {\n this.emit('connectionChange', state);\n // Only backfill on reconnect; initial connect loads history in bootstrap.\n if (state === 'connected' && this.subscriptionId != null) {\n void this.catchUpMissedBars();\n }\n },\n onError: (err) => this.emit('error', err),\n });\n if (!this.isLoadGenerationCurrent(loadGen)) {\n await this.options.dataProvider.unsubscribe(sub.id);\n return;\n }\n this.subscriptionId = sub.id;\n }\n\n private async teardownSubscription(): Promise<void> {\n this.tickAggregator?.flush();\n this.tickAggregator = null;\n if (this.subscriptionId) {\n await this.options.dataProvider.unsubscribe(this.subscriptionId);\n this.subscriptionId = null;\n }\n }\n\n private bindPageResumeCatchUp(): void {\n if (typeof document === 'undefined') return;\n\n const onResume = () => {\n if (document.visibilityState !== 'visible') return;\n void this.catchUpMissedBars();\n };\n\n document.addEventListener('visibilitychange', onResume);\n const cleanups: Array<() => void> = [\n () => document.removeEventListener('visibilitychange', onResume),\n ];\n\n if (typeof window !== 'undefined') {\n const onFocus = () => void this.catchUpMissedBars();\n window.addEventListener('focus', onFocus);\n cleanups.push(() => window.removeEventListener('focus', onFocus));\n }\n\n this.offPageResume = () => {\n for (const fn of cleanups) fn();\n };\n }\n\n /**\n * Backfill bars missed while the tab/window was backgrounded or WS delivery paused.\n */\n private async catchUpMissedBars(): Promise<void> {\n if (this.destroyed || !this.hasActiveSymbol()) return;\n\n const now = Date.now();\n if (now - this.lastCatchUpAt < 400) return;\n if (this.catchUpInFlight) return;\n\n const times = this.store.sortedTimes;\n if (times.length === 0) return;\n\n const lastT = times[times.length - 1]!;\n const interval = this.store.interval;\n const to = now + intervalMs(interval);\n if (to <= lastT) return;\n\n this.catchUpInFlight = true;\n this.lastCatchUpAt = now;\n const loadGen = this.loadGeneration;\n const symbol = this.store.symbol;\n\n try {\n const history = await fetchChartHistory(this.options.dataProvider, {\n mode: 'range',\n symbol,\n interval,\n from: lastT,\n to,\n });\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n if (this.store.symbol !== symbol || this.store.interval !== interval) return;\n if (history.bars.length === 0) return;\n\n await this.store.mergeBars(\n history.bars.map((bar) => ({ bar, source: 'rest' as const })),\n );\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n\n this.orchestrator.preserveViewportOnNextSetBars();\n this.refreshRender(loadGen);\n } catch (err) {\n this.emit('error', err);\n } finally {\n this.catchUpInFlight = false;\n }\n }\n\n private async maybeLoadMore(): Promise<void> {\n if (this.destroyed || this.loadingMore) return;\n const loadGen = this.loadGeneration;\n const reqs = this.virtualWindow.planFetches();\n if (reqs.length === 0) return;\n\n this.loadingMore = true;\n try {\n for (const req of reqs) {\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n const history = await fetchChartHistory(\n this.options.dataProvider,\n toHistoryQuery(req),\n );\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n if (history.bars.length === 0) continue;\n await this.store.mergeBars(\n history.bars.map((bar) => ({ bar, source: 'rest' as const })),\n req.mode === 'loadMore',\n );\n }\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n this.refreshRender(loadGen);\n } catch (err) {\n this.emit('error', err);\n } finally {\n this.loadingMore = false;\n }\n }\n\n private refreshRender(loadGen = this.loadGeneration): void {\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n\n const times = this.store.sortedTimes;\n if (times.length === 0) return;\n\n // Only seed visible range once; resetting to full series each tick triggers spurious loadMore.\n if (!this.visibleRangeInitialized) {\n this.virtualWindow.setVisibleRange({\n fromMs: times[0]!,\n toMs: times[times.length - 1]!,\n });\n this.visibleRangeInitialized = true;\n }\n\n const bars = this.virtualWindow.getBarsForRender();\n if (bars.length === 0) return;\n\n const gaps = this.features.gaps.whitespace\n ? computeGapStartTimes(\n bars.map((b) => b.t),\n this.store.interval,\n )\n : undefined;\n this.orchestrator.setBars(bars, gaps);\n this.applyPinePlots(bars);\n this.drawingManager?.redraw();\n this.emit('visibleRangeChange', {\n from: bars[0]!.t,\n to: bars[bars.length - 1]!.t,\n });\n }\n\n private emit(event: ChartEvent, payload?: unknown): void {\n for (const h of this.handlers.get(event) ?? []) h(payload);\n }\n}\n\nfunction toHistoryQuery(req: HistoryRequest): HistoryQuery {\n if (req.mode === 'loadMore') {\n return {\n mode: 'loadMore',\n symbol: req.symbol,\n interval: req.interval,\n endTime: req.endTime ?? Date.now(),\n limit: req.limit,\n };\n }\n return {\n mode: 'range',\n symbol: req.symbol,\n interval: req.interval,\n from: req.fromMs ?? 0,\n to: req.toMs ?? Date.now(),\n };\n}","import type { Bar, DataProvider, HistoryQuery } from '@coderyo/data';\nimport { intervalMs } from '@coderyo/data';\n\n/** REST with optional WS `requestWsHistory` fallback when capabilities allow. */\nexport async function fetchChartHistory(\n provider: DataProvider,\n query: HistoryQuery,\n): Promise<{ bars: Bar[]; nextCursor?: string; hasMore?: boolean }> {\n const caps = await provider.getCapabilities?.();\n if (caps?.wsHistory && provider.requestWsHistory) {\n try {\n if (query.mode === 'range') {\n const bars = await provider.requestWsHistory({\n symbol: query.symbol,\n interval: query.interval,\n from: query.from,\n to: query.to,\n });\n return { bars, hasMore: false };\n }\n if (query.mode === 'loadMore') {\n const ms = intervalMs(query.interval);\n const from = query.endTime - ms * query.limit;\n const bars = await provider.requestWsHistory({\n symbol: query.symbol,\n interval: query.interval,\n from,\n to: query.endTime,\n });\n return { bars, hasMore: false };\n }\n } catch {\n /* fall through to REST */\n }\n }\n return provider.getHistory(query);\n}","import type { RealtimeStreamMode } from '@coderyo/data';\nimport type { IndicatorConfig } from '@coderyo/indicators';\nimport type { FetchPolicy } from '@coderyo/virtual-window';\n\nexport interface ChartGapsFeatures {\n whitespace?: boolean;\n fillVisibleHoles?: boolean;\n}\n\nexport interface ChartDrawingsFeatures {\n /** Show interactive drawing overlay (default false). API remains available when false. */\n layer?: boolean;\n /** Persist drawings to localStorage (default true when layer/API used). */\n persist?: boolean;\n}\n\nexport interface ChartFeatures {\n fetchPolicy?: FetchPolicy;\n streamMode?: RealtimeStreamMode;\n gaps?: ChartGapsFeatures;\n drawings?: ChartDrawingsFeatures;\n /** Pass config to enable MA + indicator panes; omit/null = no indicators. */\n indicators?: IndicatorConfig | null;\n /** Save indicator params to storage (default false). */\n indicatorPersist?: boolean;\n /** Ease last candle OHLC + price line to new values (~150ms). */\n smoothPriceUpdate?: boolean;\n smoothPriceDurationMs?: number;\n /** Pine-lite script source (requires pineEnabled). */\n pineScript?: string | null;\n /** Post-1.0 hooks — default false. */\n pineEnabled?: boolean;\n protobuf?: boolean;\n telemetry?: boolean;\n tickStream?: boolean;\n /** Run Pine-lite VM in a Web Worker when available (default true). */\n pineWorker?: boolean;\n}\n\nexport interface ResolvedChartFeatures {\n fetchPolicy: FetchPolicy;\n streamMode: RealtimeStreamMode;\n gaps: Required<ChartGapsFeatures>;\n drawings: Required<ChartDrawingsFeatures>;\n indicators: IndicatorConfig | null;\n indicatorPersist: boolean;\n smoothPriceUpdate: boolean;\n smoothPriceDurationMs: number;\n pineScript: string | null;\n pineEnabled: boolean;\n protobuf: boolean;\n telemetry: boolean;\n tickStream: boolean;\n pineWorker: boolean;\n}\n\nexport const DEFAULT_CHART_FEATURES: ResolvedChartFeatures = {\n fetchPolicy: 'lazy-left-only',\n streamMode: 'bar',\n gaps: { whitespace: false, fillVisibleHoles: false },\n drawings: { layer: false, persist: true },\n indicators: null,\n indicatorPersist: false,\n smoothPriceUpdate: false,\n smoothPriceDurationMs: 150,\n pineScript: null,\n pineEnabled: false,\n protobuf: false,\n telemetry: false,\n tickStream: false,\n pineWorker: true,\n};\n\nexport function resolveChartFeatures(partial?: ChartFeatures): ResolvedChartFeatures {\n const d = DEFAULT_CHART_FEATURES;\n return {\n fetchPolicy: partial?.fetchPolicy ?? d.fetchPolicy,\n streamMode: partial?.streamMode ?? d.streamMode,\n gaps: {\n whitespace: partial?.gaps?.whitespace ?? d.gaps.whitespace,\n fillVisibleHoles: partial?.gaps?.fillVisibleHoles ?? d.gaps.fillVisibleHoles,\n },\n drawings: {\n layer: partial?.drawings?.layer ?? d.drawings.layer,\n persist: partial?.drawings?.persist ?? d.drawings.persist,\n },\n indicators: partial?.indicators !== undefined ? partial.indicators : d.indicators,\n indicatorPersist: partial?.indicatorPersist ?? d.indicatorPersist,\n smoothPriceUpdate: partial?.smoothPriceUpdate ?? d.smoothPriceUpdate,\n smoothPriceDurationMs: partial?.smoothPriceDurationMs ?? d.smoothPriceDurationMs,\n pineScript: partial?.pineScript !== undefined ? partial.pineScript : d.pineScript,\n pineEnabled: partial?.pineEnabled ?? d.pineEnabled,\n protobuf: partial?.protobuf ?? d.protobuf,\n telemetry: partial?.telemetry ?? d.telemetry,\n tickStream: partial?.tickStream ?? d.tickStream,\n pineWorker: partial?.pineWorker ?? d.pineWorker,\n };\n}\n\nexport function mergeChartFeatures(\n current: ResolvedChartFeatures,\n patch: ChartFeatures,\n): ResolvedChartFeatures {\n return resolveChartFeatures({\n fetchPolicy: patch.fetchPolicy ?? current.fetchPolicy,\n streamMode: patch.streamMode ?? current.streamMode,\n gaps: { ...current.gaps, ...patch.gaps },\n drawings: { ...current.drawings, ...patch.drawings },\n indicators: patch.indicators !== undefined ? patch.indicators : current.indicators,\n indicatorPersist: patch.indicatorPersist ?? current.indicatorPersist,\n smoothPriceUpdate: patch.smoothPriceUpdate ?? current.smoothPriceUpdate,\n smoothPriceDurationMs: patch.smoothPriceDurationMs ?? current.smoothPriceDurationMs,\n pineScript: patch.pineScript !== undefined ? patch.pineScript : current.pineScript,\n pineEnabled: patch.pineEnabled ?? current.pineEnabled,\n protobuf: patch.protobuf ?? current.protobuf,\n telemetry: patch.telemetry ?? current.telemetry,\n tickStream: patch.tickStream ?? current.tickStream,\n pineWorker: patch.pineWorker ?? current.pineWorker,\n });\n}\n\n/** Empty chart until integrator calls setSymbol. */\nexport const PENDING_SYMBOL = '';","import type { IndicatorConfig } from '@coderyo/indicators';\nimport { DEFAULT_INDICATOR_CONFIG } from '@coderyo/indicators';\nimport { PINE_SAMPLE_SCRIPT } from '@coderyo/pine-lite';\nimport type { Interval } from '@coderyo/data';\nimport type { ChartFeatures } from './chart-features.js';\nimport type { ChartOptions } from './chart-controller.js';\n\n/** Playground / docs: opt-in full TV-like chart features. */\nexport function createDemoChartFeatures(opts: {\n indicatorConfig?: IndicatorConfig;\n returnToCursorAfterDraw?: boolean;\n}): ChartFeatures {\n return {\n fetchPolicy: 'lazy-left-only',\n streamMode: 'bar+tick',\n gaps: { whitespace: false, fillVisibleHoles: false },\n drawings: { layer: true, persist: true },\n indicators: opts.indicatorConfig ?? DEFAULT_INDICATOR_CONFIG,\n indicatorPersist: true,\n smoothPriceUpdate: true,\n smoothPriceDurationMs: 150,\n tickStream: true,\n pineEnabled: true,\n pineScript: PINE_SAMPLE_SCRIPT,\n };\n}\n\nexport function createDemoChartOptions(\n base: Pick<ChartOptions, 'dataProvider' | 'indicatorHost' | 'symbolResolver' | 'chartId'> & {\n symbol: string;\n interval: Interval;\n theme?: 'dark' | 'light';\n showGrid?: boolean;\n indicatorConfig?: IndicatorConfig;\n returnToCursorAfterDraw?: boolean;\n },\n): ChartOptions {\n const indicatorConfig = base.indicatorConfig ?? DEFAULT_INDICATOR_CONFIG;\n return {\n ...base,\n features: createDemoChartFeatures({\n indicatorConfig,\n returnToCursorAfterDraw: base.returnToCursorAfterDraw,\n }),\n indicatorConfig,\n drawingDefaults: { returnToCursorAfterDraw: base.returnToCursorAfterDraw ?? false },\n };\n}","import type { BridgeAdapter } from '@coderyo/bridge';\nimport type { BridgeOutboundType } from '@coderyo/bridge';\nimport type { DrawingRecord, DrawingStyleMeta } from '@coderyo/drawings';\nimport type { IndicatorConfig } from '@coderyo/indicators';\nimport type { DataProvider } from '@coderyo/data';\nimport { wireChartBridge, TRADVIEW_API_VERSION } from './bridge-wire.js';\nimport { ChartController, type ChartOptions } from './chart-controller.js';\nimport type { ChartFeatures, ResolvedChartFeatures } from './chart-features.js';\nimport { TRADVIEW_VERSION } from './version.js';\nimport type { ChartVisibleRange } from '@coderyo/renderer-lite';\n\nexport { TRADVIEW_API_VERSION, TRADVIEW_VERSION };\nexport type { ChartVisibleRange };\nexport type { ChartFeatures, ResolvedChartFeatures } from './chart-features.js';\nexport { resolveChartFeatures, DEFAULT_CHART_FEATURES, PENDING_SYMBOL } from './chart-features.js';\nexport { createDemoChartFeatures, createDemoChartOptions } from './demo-presets.js';\n\nexport interface CreateChartOptions extends Omit<ChartOptions, 'dataProvider'> {\n dataProvider: DataProvider;\n bridge?: BridgeAdapter;\n chartId?: string;\n /** If set, only these bridge outbound events are posted. */\n bridgeOutboundEvents?: BridgeOutboundType[];\n bridgeCrosshairThrottleMs?: number;\n}\n\nexport interface IChart {\n setSymbol(symbol: string): IChart;\n setInterval(interval: import('@coderyo/data').Interval): IChart;\n setTheme(theme: 'dark' | 'light'): IChart;\n setShowGrid(show: boolean): IChart;\n setLogScale(enabled: boolean): IChart;\n fitContent(): IChart;\n scrollToRealtime(): IChart;\n /** Visible time range in ms (`fromMs` / `toMs`), or `null` if unknown. */\n getVisibleRange(): ChartVisibleRange | null;\n /** Bar spacing in px (zoom). Alias for LWC `barSpacing`. */\n getBarSpace(): number;\n setBarSpace(px: number): IChart;\n /** Restore viewport time range after re-bootstrap. */\n setVisibleRange(range: ChartVisibleRange): IChart;\n /** Scroll so `tsMs` aligns to the right edge of the viewport. */\n scrollToTimestamp(tsMs: number, animationMs?: number): IChart;\n /** Re-fetch recent history without clearing scroll/zoom. */\n reloadHistory(): Promise<IChart>;\n resize(size?: { width?: number; height?: number }): IChart;\n setFullscreen(enabled: boolean): IChart;\n exportImage(opts?: { pixelRatio?: number }): Promise<Blob>;\n on(event: import('./chart-controller.js').ChartEvent, handler: (p?: unknown) => void): IChart;\n off(event: import('./chart-controller.js').ChartEvent, handler: (p?: unknown) => void): IChart;\n searchSymbols(query: string): Promise<import('@coderyo/data').SymbolSearchHit[]>;\n setDrawingTool(tool: import('@coderyo/drawings').DrawingTool): IChart;\n deleteSelectedDrawing(): boolean;\n copySelectedDrawing(): DrawingRecord | null;\n toggleLockSelectedDrawing(): boolean;\n updateSelectedDrawingStyle(patch: DrawingStyleMeta): void;\n deselectDrawing(): void;\n setIndicatorConfig(config: IndicatorConfig | null): void;\n setReturnToCursorAfterDraw(v: boolean): void;\n setFeatures(patch: ChartFeatures): IChart;\n getFeatures(): ResolvedChartFeatures;\n /** Integrator push: smooth-update last candle toward `price` (no WS required). */\n updateLastPrice(price: number, timeMs?: number): IChart;\n hasActiveSymbol(): boolean;\n setLocale(locale: string): IChart;\n /** Subscribe to realtime bar updates; returns unsubscribe. */\n subscribeBars(handler: (bar: import('@coderyo/data').Bar) => void): () => void;\n destroy(): void;\n}\n\nfunction wrap(controller: ChartController, beforeDestroy?: () => void): IChart {\n return {\n setSymbol: (s) => {\n void controller.setSymbol(s);\n return wrap(controller, beforeDestroy);\n },\n setInterval: (i) => {\n void controller.setInterval(i);\n return wrap(controller, beforeDestroy);\n },\n setTheme: (t) => {\n controller.setTheme(t);\n return wrap(controller, beforeDestroy);\n },\n setShowGrid: (show) => {\n controller.setShowGrid(show);\n return wrap(controller, beforeDestroy);\n },\n setLogScale: (enabled) => {\n controller.setLogScale(enabled);\n return wrap(controller, beforeDestroy);\n },\n fitContent: () => {\n controller.fitContent();\n return wrap(controller, beforeDestroy);\n },\n scrollToRealtime: () => {\n controller.scrollToRealtime();\n return wrap(controller, beforeDestroy);\n },\n getVisibleRange: () => controller.getVisibleRange(),\n getBarSpace: () => controller.getBarSpace(),\n setBarSpace: (px) => {\n controller.setBarSpace(px);\n return wrap(controller, beforeDestroy);\n },\n setVisibleRange: (range) => {\n controller.setVisibleRange(range);\n return wrap(controller, beforeDestroy);\n },\n scrollToTimestamp: (tsMs, animationMs) => {\n controller.scrollToTimestamp(tsMs, animationMs);\n return wrap(controller, beforeDestroy);\n },\n reloadHistory: async () => {\n await controller.reloadHistory();\n return wrap(controller, beforeDestroy);\n },\n resize: (s) => {\n controller.resize(s);\n return wrap(controller, beforeDestroy);\n },\n setFullscreen: (e) => {\n controller.setFullscreen(e);\n return wrap(controller, beforeDestroy);\n },\n exportImage: (o) => controller.exportImage(o),\n on: (e, h) => {\n controller.on(e, h);\n return wrap(controller, beforeDestroy);\n },\n off: (e, h) => {\n controller.off(e, h);\n return wrap(controller, beforeDestroy);\n },\n searchSymbols: (q) => controller.searchSymbols(q),\n setDrawingTool: (tool) => {\n controller.setDrawingTool(tool);\n return wrap(controller, beforeDestroy);\n },\n deleteSelectedDrawing: () => controller.deleteSelectedDrawing(),\n copySelectedDrawing: () => controller.copySelectedDrawing(),\n toggleLockSelectedDrawing: () => controller.toggleLockSelectedDrawing(),\n updateSelectedDrawingStyle: (p) => {\n controller.updateSelectedDrawingStyle(p);\n return wrap(controller, beforeDestroy);\n },\n deselectDrawing: () => {\n controller.deselectDrawing();\n return wrap(controller, beforeDestroy);\n },\n setIndicatorConfig: (c) => {\n controller.setIndicatorConfig(c);\n return wrap(controller, beforeDestroy);\n },\n setReturnToCursorAfterDraw: (v) => {\n controller.setReturnToCursorAfterDraw(v);\n return wrap(controller, beforeDestroy);\n },\n setFeatures: (patch) => {\n controller.setFeatures(patch);\n return wrap(controller, beforeDestroy);\n },\n getFeatures: () => controller.getFeatures(),\n updateLastPrice: (price, timeMs) => {\n controller.updateLastPrice(price, timeMs);\n return wrap(controller, beforeDestroy);\n },\n hasActiveSymbol: () => controller.hasActiveSymbol(),\n setLocale: (locale) => {\n controller.setLocale(locale);\n return wrap(controller, beforeDestroy);\n },\n subscribeBars: (handler) => controller.subscribeBars(handler),\n destroy: () => {\n controller.destroy();\n beforeDestroy?.();\n },\n };\n}\n\nexport function createChart(\n target: HTMLElement | string,\n options: CreateChartOptions,\n): IChart {\n const el =\n typeof target === 'string'\n ? (document.querySelector(target) as HTMLElement | null)\n : target;\n if (!el) throw new Error('Chart container not found');\n const controller = new ChartController(el, options);\n let bridgeTeardown: (() => void) | undefined;\n const chart = wrap(controller, () => bridgeTeardown?.());\n if (options.bridge) {\n bridgeTeardown = wireChartBridge({\n controller,\n chart,\n bridge: options.bridge,\n chartId: options.chartId,\n outboundEvents: options.bridgeOutboundEvents,\n crosshairThrottleMs: options.bridgeCrosshairThrottleMs,\n });\n }\n return chart;\n}","export {\n createChart,\n type IChart,\n type CreateChartOptions,\n TRADVIEW_API_VERSION,\n TRADVIEW_VERSION,\n type ChartFeatures,\n type ResolvedChartFeatures,\n resolveChartFeatures,\n DEFAULT_CHART_FEATURES,\n PENDING_SYMBOL,\n createDemoChartFeatures,\n createDemoChartOptions,\n} from './create-chart.js';\nexport {\n ChartController,\n type ChartOptions,\n type ChartEvent,\n type ChartVisibleRange,\n} from './chart-controller.js';\nexport { wireChartBridge, type WireChartBridgeOptions } from './bridge-wire.js';\nexport {\n compilePineLite,\n runPineLite,\n PINE_SAMPLE_SCRIPT,\n PINE_EDITOR_DEFAULT,\n type PineCompileResult,\n type PineIrProgram,\n type PinePlotSeries,\n} from '@coderyo/pine-lite';"],"mappings":"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","names":["intervalMs","intervalMs","compilePineLite","PINE_SAMPLE_SCRIPT"]}
|
|
1
|
+
{"version":3,"sources":["../src/bridge-wire.ts","../src/version.ts","../src/chart-controller.ts","../src/fetch-chart-history.ts","../src/chart-features.ts","../src/indicator-storage.ts","../src/demo-presets.ts","../src/create-chart.ts","../src/index.ts"],"sourcesContent":["import type { BridgeAdapter } from '@coderyo/bridge';\nimport {\n BRIDGE_SCHEMA_VERSION,\n isBridgeInbound,\n type BridgeInboundType,\n type BridgeOutboundType,\n} from '@coderyo/bridge';\nimport type { DrawingTool } from '@coderyo/drawings';\nimport type { Interval } from '@coderyo/data';\nimport type { IndicatorConfig } from '@coderyo/indicators';\nimport type { CrosshairPayload } from '@coderyo/renderer-lite';\nimport type { ChartController, ChartEvent } from './chart-controller.js';\nimport type { IChart } from './create-chart.js';\nimport { TRADVIEW_VERSION } from './version.js';\n\nexport const TRADVIEW_API_VERSION = 1 as const;\n\nconst DRAWING_TOOLS = new Set<DrawingTool>([\n 'cursor',\n 'trendline',\n 'hline',\n 'vline',\n 'rectangle',\n 'fibonacci',\n 'text',\n]);\n\nconst CHART_EVENT_TO_BRIDGE: Partial<Record<ChartEvent, BridgeOutboundType>> = {\n connectionChange: 'chart.connectionChange',\n visibleRangeChange: 'chart.visibleRange',\n error: 'chart.error',\n symbolChange: 'chart.symbol',\n intervalChange: 'chart.interval',\n crosshairChange: 'chart.crosshair',\n destroyed: 'chart.destroyed',\n barUpdate: 'chart.barUpdate',\n};\n\nexport interface WireChartBridgeOptions {\n controller: ChartController;\n chart: IChart;\n bridge: BridgeAdapter;\n chartId?: string;\n /** Allowlist of outbound bridge events; default all mapped events. */\n outboundEvents?: BridgeOutboundType[];\n crosshairThrottleMs?: number;\n}\n\nexport function wireChartBridge(opts: WireChartBridgeOptions): () => void {\n const chartId = opts.chartId ?? `chart-${Date.now()}`;\n const { bridge, chart, controller } = opts;\n const allow = opts.outboundEvents ? new Set(opts.outboundEvents) : null;\n\n const shouldPost = (type: BridgeOutboundType): boolean =>\n allow === null || allow.has(type);\n\n const post = (type: BridgeOutboundType, payload: Record<string, unknown>) => {\n if (!shouldPost(type)) return;\n bridge.post({ type, payload });\n };\n\n post('chart.ready', {\n chartId,\n bridgeSchemaVersion: BRIDGE_SCHEMA_VERSION,\n apiVersion: TRADVIEW_API_VERSION,\n version: TRADVIEW_VERSION,\n });\n\n const postResize = () => {\n const el = controller.getContainer();\n const r = el.getBoundingClientRect();\n post('chart.resize', {\n chartId,\n width: Math.round(r.width),\n height: Math.round(r.height),\n });\n };\n if (shouldPost('chart.resize')) postResize();\n\n let crosshairTimer: ReturnType<typeof setTimeout> | null = null;\n let crosshairPending: CrosshairPayload | null = null;\n const throttleMs = opts.crosshairThrottleMs ?? 0;\n\n const flushCrosshair = () => {\n crosshairTimer = null;\n const p = crosshairPending;\n crosshairPending = null;\n if (!p) return;\n post('chart.crosshair', {\n chartId,\n time: p.time,\n price: p.price,\n ohlcv: p.ohlcv,\n symbol: controller.getSymbol(),\n interval: controller.getInterval(),\n });\n };\n\n const handlers = new Map<ChartEvent, (p?: unknown) => void>();\n\n handlers.set('connectionChange', (state) => {\n post('chart.connectionChange', { chartId, state });\n });\n handlers.set('visibleRangeChange', (range) => {\n const r = range as { from?: number; to?: number };\n post('chart.visibleRange', { chartId, from: r.from, to: r.to });\n });\n handlers.set('error', (err) => {\n const e = err as { code?: string; message?: string };\n post('chart.error', {\n chartId,\n code: e?.code ?? 'UNKNOWN',\n message: e?.message ?? String(err),\n });\n });\n handlers.set('symbolChange', (symbol) => {\n post('chart.symbol', { chartId, symbol: String(symbol ?? '') });\n });\n handlers.set('intervalChange', (interval) => {\n post('chart.interval', { chartId, interval: String(interval ?? '') });\n });\n handlers.set('crosshairChange', (payload) => {\n const p = payload as CrosshairPayload | null;\n if (!p) return;\n if (throttleMs <= 0) {\n post('chart.crosshair', {\n chartId,\n time: p.time,\n price: p.price,\n ohlcv: p.ohlcv,\n symbol: controller.getSymbol(),\n interval: controller.getInterval(),\n });\n return;\n }\n crosshairPending = p;\n if (!crosshairTimer) {\n crosshairTimer = setTimeout(flushCrosshair, throttleMs);\n }\n });\n handlers.set('destroyed', () => {\n post('chart.destroyed', { chartId });\n });\n handlers.set('barUpdate', (bar) => {\n const b = bar as { t?: number; c?: number };\n post('chart.barUpdate', { chartId, t: b?.t, c: b?.c });\n });\n\n for (const [ev, fn] of handlers) {\n const bridgeType = CHART_EVENT_TO_BRIDGE[ev];\n if (!bridgeType || shouldPost(bridgeType)) {\n chart.on(ev, fn);\n }\n }\n\n const offHost = bridge.onMessage((msg) => {\n if (!isBridgeInbound(msg)) return;\n const p = msg.payload ?? {};\n switch (msg.type as BridgeInboundType) {\n case 'host.setSymbol':\n if (typeof p.symbol === 'string') chart.setSymbol(p.symbol);\n break;\n case 'host.setInterval':\n if (typeof p.interval === 'string') chart.setInterval(p.interval as Interval);\n break;\n case 'host.setTheme':\n if (p.theme === 'dark' || p.theme === 'light') chart.setTheme(p.theme);\n break;\n case 'host.setShowGrid':\n if (typeof p.showGrid === 'boolean') chart.setShowGrid(p.showGrid);\n break;\n case 'host.fitContent':\n chart.fitContent();\n break;\n case 'host.scrollToRealtime':\n chart.scrollToRealtime();\n break;\n case 'host.resize':\n chart.resize({\n width: typeof p.width === 'number' ? p.width : undefined,\n height: typeof p.height === 'number' ? p.height : undefined,\n });\n postResize();\n break;\n case 'host.setLogScale':\n if (typeof p.enabled === 'boolean') chart.setLogScale(p.enabled);\n break;\n case 'host.setBarSpace':\n if (typeof p.px === 'number') chart.setBarSpace(p.px);\n break;\n case 'host.setVisibleRange':\n if (typeof p.fromMs === 'number' && typeof p.toMs === 'number') {\n chart.setVisibleRange({ fromMs: p.fromMs, toMs: p.toMs });\n }\n break;\n case 'host.scrollToTimestamp':\n if (typeof p.tsMs === 'number') {\n chart.scrollToTimestamp(\n p.tsMs,\n typeof p.animationMs === 'number' ? p.animationMs : undefined,\n );\n }\n break;\n case 'host.reloadHistory':\n void chart.reloadHistory();\n break;\n case 'host.setLocale':\n if (typeof p.locale === 'string') chart.setLocale(p.locale);\n break;\n case 'host.setFeatures':\n if (p.features && typeof p.features === 'object') {\n chart.setFeatures(p.features as import('./chart-features.js').ChartFeatures);\n }\n break;\n case 'host.setIndicatorConfig':\n if (p.config && typeof p.config === 'object') {\n chart.setIndicatorConfig(p.config as IndicatorConfig);\n }\n break;\n case 'host.clearAllIndicators':\n chart.clearAllIndicators();\n break;\n case 'host.clearAllDrawings':\n chart.clearAllDrawings();\n break;\n case 'host.setDrawingTool':\n if (typeof p.tool === 'string' && DRAWING_TOOLS.has(p.tool as DrawingTool)) {\n chart.setDrawingTool(p.tool as DrawingTool);\n }\n break;\n case 'host.destroy':\n chart.destroy();\n break;\n default:\n break;\n }\n });\n\n return () => {\n if (crosshairTimer) clearTimeout(crosshairTimer);\n offHost();\n for (const [ev, fn] of handlers) chart.off(ev, fn);\n };\n}","/** Synced by scripts/sync-versions.mjs from repo VERSION file */\nexport const TRADVIEW_VERSION = '1.0.3' as const;\n","import type { DrawingRecord, DrawingStyleMeta } from '@coderyo/drawings';\nimport { clearedIndicatorConfig, type IndicatorConfig } from '@coderyo/indicators';\n\nimport type {\n Bar,\n DataProvider,\n HistoryQuery,\n Interval,\n RealtimeStreamMode,\n SubscribeParams,\n SymbolResolver,\n} from '@coderyo/data';\nimport { floorBarOpenTime, intervalMs } from '@coderyo/data';\nimport type { HistoryRequest } from '@coderyo/virtual-window';\nimport { parseInterval } from '@coderyo/data';\nimport { BarStore, computeGapStartTimes, TickAggregator } from '@coderyo/series';\nimport { setLocale as setI18nLocale } from '@coderyo/i18n';\nimport { fetchChartHistory } from './fetch-chart-history.js';\nimport { VirtualWindow, type FetchPolicy } from '@coderyo/virtual-window';\nimport { DrawingManager } from '@coderyo/drawings';\nimport {\n compilePineLite,\n runPineLiteAsync,\n terminatePineWorker,\n type PineIrProgram,\n} from '@coderyo/pine-lite';\nimport { PaneOrchestrator, type ChartVisibleRange } from '@coderyo/renderer-lite';\n\nexport type { ChartVisibleRange };\nimport {\n mergeChartFeatures,\n PENDING_SYMBOL,\n resolveChartFeatures,\n type ChartFeatures,\n type ResolvedChartFeatures,\n} from './chart-features.js';\nimport {\n defaultChartStorage,\n loadIndicatorConfig,\n saveIndicatorConfig,\n type ChartStorageAdapter,\n} from './indicator-storage.js';\n\nexport interface ChartOptions {\n width?: number;\n height?: number;\n theme?: 'dark' | 'light';\n interval?: Interval;\n /** Omit for empty chart until setSymbol(). */\n symbol?: string;\n chartId?: string;\n /** Host element below main chart for MACD/RSI/KDJ panes (from ui-shell layout). */\n indicatorHost?: HTMLElement;\n dataProvider: DataProvider;\n /** Integrator feature flags (minimal defaults). */\n features?: ChartFeatures;\n /** @deprecated Use features.fetchPolicy */\n fetchPolicy?: FetchPolicy;\n scaleMode?: 'linear' | 'log';\n /** Grid lines on chart panes (default false). */\n showGrid?: boolean;\n symbolResolver?: SymbolResolver;\n drawingDefaults?: { returnToCursorAfterDraw?: boolean };\n /** @deprecated Use features.indicators */\n indicatorConfig?: IndicatorConfig;\n /** Storage backend for `features.indicatorPersist` (default `localStorage`). */\n chartStorage?: ChartStorageAdapter;\n}\n\nexport type ChartEvent =\n | 'connectionChange'\n | 'barUpdate'\n | 'error'\n | 'visibleRangeChange'\n | 'symbolChange'\n | 'intervalChange'\n | 'crosshairChange'\n | 'destroyed'\n | 'drawingSelectionChange'\n | 'drawingContextMenu'\n | 'requestCursorTool'\n | 'featuresChange'\n | 'telemetry';\n\ntype EventHandler = (payload?: unknown) => void;\n\nexport class ChartController {\n private readonly store: BarStore;\n private readonly virtualWindow: VirtualWindow;\n private readonly orchestrator: PaneOrchestrator;\n private readonly handlers = new Map<ChartEvent, Set<EventHandler>>();\n private subscriptionId: string | null = null;\n private destroyed = false;\n private readonly resizeObserver: ResizeObserver;\n private loadingMore = false;\n private visibleRangeInitialized = false;\n /** Bumped on symbol/interval change to drop stale bootstrap / loadMore / WS merges. */\n private loadGeneration = 0;\n private drawingManager: DrawingManager | null = null;\n private offCrosshair: (() => void) | null = null;\n private features: ResolvedChartFeatures;\n private pineIr: PineIrProgram | null = null;\n private tickAggregator: TickAggregator | null = null;\n private catchUpInFlight = false;\n private lastCatchUpAt = 0;\n private offPageResume: (() => void) | null = null;\n /** After clearAllIndicators(); blocks Pine replot until script/features change. */\n private pinePlotsSuppressed = false;\n private readonly chartStorage: ChartStorageAdapter;\n\n constructor(\n private readonly container: HTMLElement,\n private readonly options: ChartOptions,\n ) {\n this.chartStorage = options.chartStorage ?? defaultChartStorage;\n this.features = resolveChartFeatures({\n ...options.features,\n fetchPolicy: options.features?.fetchPolicy ?? options.fetchPolicy,\n indicators:\n options.features?.indicators !== undefined\n ? options.features.indicators\n : options.indicatorConfig !== undefined\n ? options.indicatorConfig\n : undefined,\n });\n\n const symbol = options.symbol?.trim() || PENDING_SYMBOL;\n const interval = parseInterval(options.interval ?? '1h');\n const fetchPolicy = this.features.gaps.fillVisibleHoles\n ? 'fill-visible-holes'\n : this.features.fetchPolicy;\n\n this.store = new BarStore(symbol || PENDING_SYMBOL, interval);\n this.virtualWindow = new VirtualWindow(this.store, { fetchPolicy });\n this.orchestrator = new PaneOrchestrator({\n container,\n indicatorRoot: options.indicatorHost,\n theme: options.theme ?? 'dark',\n scaleMode: options.scaleMode ?? 'linear',\n showGrid: options.showGrid ?? false,\n indicatorConfig: this.features.indicators,\n smoothPriceUpdate: this.features.smoothPriceUpdate,\n smoothPriceDurationMs: this.features.smoothPriceDurationMs,\n onIndicatorConfigChange: (config) => this.setIndicatorConfig(config),\n autoBarSpacingOnInterval: this.features.autoBarSpacingOnInterval,\n barSpacingByInterval: this.features.barSpacingByInterval,\n });\n this.orchestrator.setIntervalContext(interval);\n\n if (options.width) container.style.width = `${options.width}px`;\n if (options.height) container.style.height = `${options.height}px`;\n\n this.resizeObserver = new ResizeObserver(() => {\n if (!this.destroyed) this.resize();\n });\n this.resizeObserver.observe(container);\n\n this.orchestrator.bus.subscribeTransform(() => {\n const bus = this.orchestrator.bus;\n if (bus.visibleToMs > bus.visibleFromMs) {\n this.virtualWindow.setVisibleRange({\n fromMs: bus.visibleFromMs,\n toMs: bus.visibleToMs,\n });\n this.visibleRangeInitialized = true;\n }\n void this.maybeLoadMore();\n this.drawingManager?.redraw();\n });\n\n const overlay = this.orchestrator.getOverlayCanvas();\n if (overlay) {\n this.orchestrator.setOverlayPointerEvents('none');\n this.drawingManager = new DrawingManager({\n canvas: overlay,\n interactionHost: overlay.parentElement ?? undefined,\n chartId: options.chartId ?? 'default',\n symbol,\n interval,\n priceToY: (p) => this.orchestrator.priceToY(p),\n timeToX: (t) => this.orchestrator.timeToX(t),\n xToTime: (x) => this.orchestrator.xToTime(x),\n yToPrice: (y) => this.orchestrator.yToPrice(y),\n returnToCursorAfterDraw: options.drawingDefaults?.returnToCursorAfterDraw ?? false,\n onRequestCursorTool: () => this.emit('requestCursorTool'),\n onSelectionChange: (id, record) =>\n this.emit('drawingSelectionChange', { id, record }),\n onContextMenu: (payload) => this.emit('drawingContextMenu', payload),\n });\n this.drawingManager.setPersistence(this.features.drawings.persist);\n this.applyDrawingLayer();\n }\n\n this.offCrosshair = this.orchestrator.subscribeCrosshair((payload) => {\n this.emit('crosshairChange', payload);\n });\n\n this.bindPageResumeCatchUp();\n this.applyPersistedIndicatorsOnInit(options);\n\n if (this.hasActiveSymbol()) {\n void this.bootstrap(this.loadGeneration);\n } else {\n this.emit('connectionChange', 'disconnected');\n }\n }\n\n getFeatures(): ResolvedChartFeatures {\n return { ...this.features };\n }\n\n setFeatures(patch: ChartFeatures): this {\n if (patch.pineEnabled === true || patch.pineScript !== undefined) {\n this.pinePlotsSuppressed = false;\n }\n this.features = mergeChartFeatures(this.features, patch);\n this.applyFeatures();\n this.emit('featuresChange', this.getFeatures());\n return this;\n }\n\n hasActiveSymbol(): boolean {\n const s = this.store.symbol;\n return s.length > 0 && s !== PENDING_SYMBOL;\n }\n\n private applyFeatures(): void {\n const fetchPolicy = this.features.gaps.fillVisibleHoles\n ? 'fill-visible-holes'\n : this.features.fetchPolicy;\n this.virtualWindow.setFetchPolicy(fetchPolicy);\n\n this.orchestrator.setIndicatorConfig(this.features.indicators);\n this.orchestrator.setBarSpacingPolicy({\n autoBarSpacingOnInterval: this.features.autoBarSpacingOnInterval,\n barSpacingByInterval: this.features.barSpacingByInterval,\n });\n this.orchestrator.setSmoothPriceUpdate(\n this.features.smoothPriceUpdate,\n this.features.smoothPriceDurationMs,\n );\n this.drawingManager?.setPersistence(this.features.drawings.persist);\n this.applyDrawingLayer();\n this.recompilePine();\n }\n\n private recompilePine(): void {\n if (!this.features.pineEnabled || !this.features.pineScript?.trim()) {\n this.pineIr = null;\n this.orchestrator.setPinePlots(null);\n return;\n }\n const compiled = compilePineLite(this.features.pineScript);\n if (!compiled.ok || !compiled.ir) {\n this.pineIr = null;\n this.orchestrator.setPinePlots(null);\n this.emit('error', { kind: 'pine', errors: compiled.errors });\n return;\n }\n this.pineIr = compiled.ir;\n if (this.hasActiveSymbol()) {\n const bars = this.virtualWindow.getBarsForRender();\n if (bars.length > 0) this.applyPinePlots(bars);\n }\n }\n\n private applyPinePlots(bars: Bar[]): void {\n if (this.pinePlotsSuppressed || !this.features.pineEnabled || !this.pineIr) {\n this.orchestrator.setPinePlots(null);\n return;\n }\n const ir = this.pineIr;\n const useWorker = this.features.pineWorker;\n void runPineLiteAsync(ir, bars, { useWorker })\n .then((result) => {\n if (this.destroyed || this.pineIr !== ir) return;\n this.orchestrator.setPinePlots(\n result.plots.map((p) => ({\n title: p.title,\n values: p.values,\n color: undefined,\n })),\n );\n })\n .catch((err) => this.emit('error', err));\n }\n\n private trackTelemetry(event: string, data?: Record<string, unknown>): void {\n if (!this.features.telemetry) return;\n this.emit('telemetry', { event, ...data });\n }\n\n setLocale(locale: string): this {\n setI18nLocale(locale);\n this.trackTelemetry('locale', { locale });\n return this;\n }\n\n subscribeBars(handler: (bar: Bar) => void): () => void {\n const wrapper = (payload?: unknown) => handler(payload as Bar);\n this.on('barUpdate', wrapper);\n return () => this.off('barUpdate', wrapper);\n }\n\n /** Integrator push: update last candle close (and H/L) without WS. */\n updateLastPrice(price: number, timeMs = Date.now()): this {\n if (!this.hasActiveSymbol() || this.destroyed) return this;\n const bar = this.buildBarFromPrice(price, timeMs);\n void this.applyRealtimeBar(bar, true);\n return this;\n }\n\n private buildBarFromPrice(price: number, timeMs: number): Bar {\n const interval = this.store.interval;\n const open = floorBarOpenTime(timeMs, interval);\n const times = this.store.sortedTimes;\n const lastT = times.length > 0 ? times[times.length - 1]! : undefined;\n const existing = lastT !== undefined ? this.store.getBar(lastT) : undefined;\n\n if (existing && existing.t === open) {\n return {\n ...existing,\n c: price,\n h: Math.max(existing.h, price),\n l: Math.min(existing.l, price),\n };\n }\n\n const prevClose = existing?.c ?? price;\n return {\n t: open,\n o: prevClose,\n h: Math.max(prevClose, price),\n l: Math.min(prevClose, price),\n c: price,\n v: existing?.v ?? 0,\n };\n }\n\n private async applyRealtimeBar(\n bar: Bar,\n partial: boolean,\n loadGen = this.loadGeneration,\n ): Promise<void> {\n await this.store.mergeRealtime({ bar, partial });\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n\n const bars = this.virtualWindow.getBarsForRender();\n const last = bars[bars.length - 1];\n if (last && this.features.smoothPriceUpdate) {\n this.orchestrator.updateLastBar(last, {\n smooth: true,\n durationMs: this.features.smoothPriceDurationMs,\n });\n this.drawingManager?.redraw();\n } else {\n this.refreshRender(loadGen);\n }\n this.emit('barUpdate', bar);\n this.trackTelemetry('barUpdate', { t: bar.t, partial });\n }\n\n private applyDrawingLayer(): void {\n if (!this.drawingManager) return;\n this.drawingManager.setLayerVisible(this.features.drawings.layer);\n this.syncOverlayPointerEvents();\n }\n\n private syncOverlayPointerEvents(): void {\n if (!this.drawingManager) return;\n const layer = this.features.drawings.layer;\n if (!layer) {\n this.orchestrator.setOverlayPointerEvents('none');\n return;\n }\n const tool = this.drawingManager.getTool();\n this.orchestrator.setOverlayPointerEvents(tool === 'cursor' ? 'none' : 'auto');\n }\n\n getContainer(): HTMLElement {\n return this.container;\n }\n\n getSymbol(): string {\n return this.store.symbol;\n }\n\n getInterval(): Interval {\n return this.store.interval;\n }\n\n async searchSymbols(query: string): Promise<import('@coderyo/data').SymbolSearchHit[]> {\n const resolver = this.options.symbolResolver;\n if (resolver?.search) return resolver.search(query);\n if (this.options.dataProvider.searchSymbols) {\n return this.options.dataProvider.searchSymbols(query);\n }\n return [];\n }\n\n async resolveSymbol(symbol: string): Promise<import('@coderyo/data').SymbolInfo | null> {\n if (this.options.symbolResolver) {\n return this.options.symbolResolver.resolve(symbol);\n }\n return { symbol };\n }\n\n on(event: ChartEvent, handler: EventHandler): this {\n if (!this.handlers.has(event)) this.handlers.set(event, new Set());\n this.handlers.get(event)!.add(handler);\n return this;\n }\n\n off(event: ChartEvent, handler: EventHandler): this {\n this.handlers.get(event)?.delete(handler);\n return this;\n }\n\n resize(size?: { width?: number; height?: number }): this {\n if (size?.width) this.container.style.width = `${size.width}px`;\n if (size?.height) this.container.style.height = `${size.height}px`;\n this.orchestrator.resize();\n return this;\n }\n\n setDrawingTool(tool: import('@coderyo/drawings').DrawingTool): this {\n this.drawingManager?.setTool(tool);\n this.syncOverlayPointerEvents();\n return this;\n }\n\n deleteSelectedDrawing(): boolean {\n return this.drawingManager?.deleteSelected() ?? false;\n }\n\n copySelectedDrawing(): DrawingRecord | null {\n return this.drawingManager?.copySelected() ?? null;\n }\n\n toggleLockSelectedDrawing(): boolean {\n return this.drawingManager?.toggleLockSelected() ?? false;\n }\n\n updateSelectedDrawingStyle(patch: DrawingStyleMeta): void {\n this.drawingManager?.updateSelectedStyle(patch);\n }\n\n deselectDrawing(): void {\n this.drawingManager?.deselect();\n }\n\n setIndicatorConfig(config: IndicatorConfig | null): void {\n this.features = mergeChartFeatures(this.features, { indicators: config });\n this.orchestrator.setIndicatorConfig(config);\n if (config && this.features.indicatorPersist && this.hasActiveSymbol()) {\n saveIndicatorConfig(\n this.chartStorage,\n this.store.symbol,\n this.store.interval,\n config,\n );\n }\n this.emit('featuresChange', this.getFeatures());\n }\n\n private applyPersistedIndicatorsOnInit(options: ChartOptions): void {\n if (!this.features.indicatorPersist || !this.hasActiveSymbol()) return;\n const explicit =\n options.features?.indicators !== undefined || options.indicatorConfig !== undefined;\n if (explicit) return;\n this.applyPersistedIndicatorsForContext();\n }\n\n private applyPersistedIndicatorsForContext(): void {\n if (!this.features.indicatorPersist || !this.hasActiveSymbol()) return;\n const loaded = loadIndicatorConfig(\n this.chartStorage,\n this.store.symbol,\n this.store.interval,\n );\n this.features = mergeChartFeatures(this.features, { indicators: loaded });\n this.orchestrator.setIndicatorConfig(loaded);\n this.emit('featuresChange', this.getFeatures());\n }\n\n clearAllIndicators(): IndicatorConfig {\n const config = clearedIndicatorConfig(this.features.indicators ?? undefined);\n this.setIndicatorConfig(config);\n this.orchestrator.setPinePlots(null);\n this.pinePlotsSuppressed = true;\n return config;\n }\n\n clearAllDrawings(): number {\n return this.drawingManager?.clearAll() ?? 0;\n }\n\n setReturnToCursorAfterDraw(v: boolean): void {\n this.drawingManager?.setReturnToCursorAfterDraw(v);\n }\n\n async setSymbol(symbol: string): Promise<void> {\n const trimmed = symbol.trim();\n if (!trimmed) return;\n this.orchestrator.setIntervalContext(this.store.interval);\n const gen = this.beginDataContextChange();\n await this.teardownSubscription();\n await this.store.setSymbolInterval(trimmed, this.store.interval);\n this.drawingManager?.setContext(symbol, this.store.interval);\n this.applyPersistedIndicatorsForContext();\n const info = await this.resolveSymbol(symbol);\n await this.bootstrap(gen);\n this.emit('symbolChange', info ?? { symbol });\n }\n\n async setInterval(interval: Interval): Promise<void> {\n this.orchestrator.setIntervalContext(interval);\n const gen = this.beginDataContextChange();\n await this.teardownSubscription();\n await this.store.setSymbolInterval(this.store.symbol, interval);\n this.drawingManager?.setContext(this.store.symbol, interval);\n this.applyPersistedIndicatorsForContext();\n if (this.hasActiveSymbol()) {\n await this.bootstrap(gen);\n }\n }\n\n setTheme(theme: 'dark' | 'light'): this {\n this.orchestrator.setTheme(theme);\n return this;\n }\n\n setShowGrid(show: boolean): this {\n this.orchestrator.setShowGrid(show);\n return this;\n }\n\n fitContent(): this {\n this.orchestrator.fitContent();\n return this;\n }\n\n scrollToRealtime(): this {\n this.orchestrator.scrollToRealtime();\n return this;\n }\n\n getVisibleRange(): ChartVisibleRange | null {\n return this.orchestrator.getVisibleRange();\n }\n\n getBarSpace(): number {\n return this.orchestrator.getBarSpace();\n }\n\n setBarSpace(px: number): this {\n this.orchestrator.setBarSpace(px);\n return this;\n }\n\n setVisibleRange(range: ChartVisibleRange): this {\n this.orchestrator.setVisibleRange(range);\n const { fromMs, toMs } = range;\n if (toMs > fromMs) {\n this.virtualWindow.setVisibleRange({ fromMs, toMs });\n this.visibleRangeInitialized = true;\n }\n return this;\n }\n\n scrollToTimestamp(tsMs: number, animationMs?: number): this {\n this.orchestrator.scrollToTimestamp(tsMs, animationMs);\n return this;\n }\n\n async reloadHistory(): Promise<this> {\n if (!this.hasActiveSymbol()) return this;\n const savedRange = this.getVisibleRange();\n const savedBarSpace = this.getBarSpace();\n const loadGen = this.loadGeneration;\n const symbol = this.store.symbol;\n const interval = this.store.interval;\n\n try {\n const history = await fetchChartHistory(this.options.dataProvider, {\n mode: 'loadMore',\n symbol,\n interval,\n endTime: Date.now(),\n limit: 500,\n });\n if (!this.isLoadGenerationCurrent(loadGen)) return this;\n if (this.store.symbol !== symbol || this.store.interval !== interval) return this;\n if (history.bars.length === 0) return this;\n\n await this.store.mergeBars(history.bars.map((bar) => ({ bar, source: 'rest' as const })));\n if (!this.isLoadGenerationCurrent(loadGen)) return this;\n\n this.orchestrator.preserveViewportOnNextSetBars();\n this.refreshRender(loadGen);\n if (savedBarSpace > 0) this.setBarSpace(savedBarSpace);\n if (savedRange) this.setVisibleRange(savedRange);\n } catch (err) {\n this.emit('error', err);\n }\n return this;\n }\n\n setLogScale(enabled: boolean): this {\n this.orchestrator.setLogScale(enabled);\n return this;\n }\n\n setFullscreen(_enabled: boolean): this {\n if (_enabled && this.container.requestFullscreen) {\n void this.container.requestFullscreen();\n } else if (document.fullscreenElement) {\n void document.exitFullscreen();\n }\n return this;\n }\n\n async exportImage(opts?: { pixelRatio?: number }): Promise<Blob> {\n const canvas = this.container.querySelector('canvas');\n if (!canvas) throw new Error('No canvas to export');\n const scale = opts?.pixelRatio ?? 2;\n const exportCanvas = document.createElement('canvas');\n exportCanvas.width = canvas.width * scale;\n exportCanvas.height = canvas.height * scale;\n const ctx = exportCanvas.getContext('2d')!;\n ctx.scale(scale, scale);\n ctx.drawImage(canvas, 0, 0);\n return new Promise((resolve, reject) => {\n exportCanvas.toBlob((b) => (b ? resolve(b) : reject(new Error('export failed'))), 'image/png');\n });\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.offPageResume?.();\n this.offPageResume = null;\n this.offCrosshair?.();\n this.offCrosshair = null;\n this.resizeObserver.disconnect();\n this.drawingManager?.destroy();\n void this.teardownSubscription();\n this.orchestrator.destroy();\n terminatePineWorker();\n this.emit('destroyed', { chartId: this.options.chartId ?? 'default' });\n this.emit('connectionChange', 'disconnected');\n }\n\n private beginDataContextChange(): number {\n this.loadGeneration += 1;\n this.visibleRangeInitialized = false;\n this.virtualWindow.setVisibleRange({ fromMs: 0, toMs: 0 });\n this.orchestrator.resetViewState();\n this.orchestrator.clearBars();\n return this.loadGeneration;\n }\n\n private isLoadGenerationCurrent(gen: number): boolean {\n return !this.destroyed && gen === this.loadGeneration;\n }\n\n private async bootstrap(loadGen: number): Promise<void> {\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n\n const symbol = this.store.symbol;\n const interval = this.store.interval;\n const endTime = Date.now();\n if (this.features.protobuf) {\n this.emit('error', {\n code: 'PROTOBUF_UNAVAILABLE',\n message: 'Protobuf encoding requires protocol v1.1 (not in 1.0.0)',\n });\n }\n\n const history = await fetchChartHistory(this.options.dataProvider, {\n mode: 'loadMore',\n symbol,\n interval,\n endTime,\n limit: 500,\n });\n\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n if (this.store.symbol !== symbol || this.store.interval !== interval) return;\n\n await this.store.mergeBars(history.bars.map((bar) => ({ bar })));\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n this.refreshRender(loadGen);\n void this.resolveSymbol(symbol).then((info) => {\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n this.emit('symbolChange', info ?? { symbol });\n });\n this.emit('intervalChange', interval);\n\n const streamMode: RealtimeStreamMode = this.features.tickStream\n ? 'bar+tick'\n : this.features.streamMode;\n const tickOnly = streamMode === 'tick';\n\n const params: SubscribeParams = {\n symbol,\n interval,\n channels: tickOnly ? ['tick'] : this.features.tickStream ? ['bar', 'tick'] : ['bar'],\n streamMode,\n };\n\n this.tickAggregator = tickOnly\n ? new TickAggregator(interval, (bar, partial) => {\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n if (this.store.symbol !== symbol || this.store.interval !== interval) return;\n void this.applyRealtimeBar(bar, partial, loadGen);\n })\n : null;\n\n await this.options.dataProvider.connect?.();\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n\n const sub = await this.options.dataProvider.subscribe(params, {\n onBar: tickOnly\n ? undefined\n : (bar, meta) => {\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n if (this.store.symbol !== symbol || this.store.interval !== interval) return;\n void this.applyRealtimeBar(bar, meta.partial, loadGen);\n },\n onTick: (tick) => {\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n if (this.store.symbol !== symbol || this.store.interval !== interval) return;\n if (this.tickAggregator) {\n this.tickAggregator.ingest(tick);\n return;\n }\n const bar = this.buildBarFromPrice(tick.price, tick.t);\n void this.applyRealtimeBar(bar, true, loadGen);\n },\n onConnectionChange: (state) => {\n this.emit('connectionChange', state);\n // Only backfill on reconnect; initial connect loads history in bootstrap.\n if (state === 'connected' && this.subscriptionId != null) {\n void this.catchUpMissedBars();\n }\n },\n onError: (err) => this.emit('error', err),\n });\n if (!this.isLoadGenerationCurrent(loadGen)) {\n await this.options.dataProvider.unsubscribe(sub.id);\n return;\n }\n this.subscriptionId = sub.id;\n }\n\n private async teardownSubscription(): Promise<void> {\n this.tickAggregator?.flush();\n this.tickAggregator = null;\n if (this.subscriptionId) {\n await this.options.dataProvider.unsubscribe(this.subscriptionId);\n this.subscriptionId = null;\n }\n }\n\n private bindPageResumeCatchUp(): void {\n if (typeof document === 'undefined') return;\n\n const onResume = () => {\n if (document.visibilityState !== 'visible') return;\n void this.catchUpMissedBars();\n };\n\n document.addEventListener('visibilitychange', onResume);\n const cleanups: Array<() => void> = [\n () => document.removeEventListener('visibilitychange', onResume),\n ];\n\n if (typeof window !== 'undefined') {\n const onFocus = () => void this.catchUpMissedBars();\n window.addEventListener('focus', onFocus);\n cleanups.push(() => window.removeEventListener('focus', onFocus));\n }\n\n this.offPageResume = () => {\n for (const fn of cleanups) fn();\n };\n }\n\n /**\n * Backfill bars missed while the tab/window was backgrounded or WS delivery paused.\n */\n private async catchUpMissedBars(): Promise<void> {\n if (this.destroyed || !this.hasActiveSymbol()) return;\n\n const now = Date.now();\n if (now - this.lastCatchUpAt < 400) return;\n if (this.catchUpInFlight) return;\n\n const times = this.store.sortedTimes;\n if (times.length === 0) return;\n\n const lastT = times[times.length - 1]!;\n const interval = this.store.interval;\n const to = now + intervalMs(interval);\n if (to <= lastT) return;\n\n this.catchUpInFlight = true;\n this.lastCatchUpAt = now;\n const loadGen = this.loadGeneration;\n const symbol = this.store.symbol;\n\n try {\n const history = await fetchChartHistory(this.options.dataProvider, {\n mode: 'range',\n symbol,\n interval,\n from: lastT,\n to,\n });\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n if (this.store.symbol !== symbol || this.store.interval !== interval) return;\n if (history.bars.length === 0) return;\n\n await this.store.mergeBars(\n history.bars.map((bar) => ({ bar, source: 'rest' as const })),\n );\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n\n this.orchestrator.preserveViewportOnNextSetBars();\n this.refreshRender(loadGen);\n } catch (err) {\n this.emit('error', err);\n } finally {\n this.catchUpInFlight = false;\n }\n }\n\n private async maybeLoadMore(): Promise<void> {\n if (this.destroyed || this.loadingMore) return;\n const loadGen = this.loadGeneration;\n const reqs = this.virtualWindow.planFetches();\n if (reqs.length === 0) return;\n\n this.loadingMore = true;\n try {\n for (const req of reqs) {\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n const history = await fetchChartHistory(\n this.options.dataProvider,\n toHistoryQuery(req),\n );\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n if (history.bars.length === 0) continue;\n await this.store.mergeBars(\n history.bars.map((bar) => ({ bar, source: 'rest' as const })),\n req.mode === 'loadMore',\n );\n }\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n this.refreshRender(loadGen);\n } catch (err) {\n this.emit('error', err);\n } finally {\n this.loadingMore = false;\n }\n }\n\n private refreshRender(loadGen = this.loadGeneration): void {\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n\n const times = this.store.sortedTimes;\n if (times.length === 0) return;\n\n // Only seed visible range once; resetting to full series each tick triggers spurious loadMore.\n if (!this.visibleRangeInitialized) {\n this.virtualWindow.setVisibleRange({\n fromMs: times[0]!,\n toMs: times[times.length - 1]!,\n });\n this.visibleRangeInitialized = true;\n }\n\n const bars = this.virtualWindow.getBarsForRender();\n if (bars.length === 0) return;\n\n const gaps = this.features.gaps.whitespace\n ? computeGapStartTimes(\n bars.map((b) => b.t),\n this.store.interval,\n )\n : undefined;\n this.orchestrator.setBars(bars, gaps);\n this.applyPinePlots(bars);\n this.drawingManager?.redraw();\n this.emit('visibleRangeChange', {\n from: bars[0]!.t,\n to: bars[bars.length - 1]!.t,\n });\n }\n\n private emit(event: ChartEvent, payload?: unknown): void {\n for (const h of this.handlers.get(event) ?? []) h(payload);\n }\n}\n\nfunction toHistoryQuery(req: HistoryRequest): HistoryQuery {\n if (req.mode === 'loadMore') {\n return {\n mode: 'loadMore',\n symbol: req.symbol,\n interval: req.interval,\n endTime: req.endTime ?? Date.now(),\n limit: req.limit,\n };\n }\n return {\n mode: 'range',\n symbol: req.symbol,\n interval: req.interval,\n from: req.fromMs ?? 0,\n to: req.toMs ?? Date.now(),\n };\n}","import type { Bar, DataProvider, HistoryQuery } from '@coderyo/data';\nimport { intervalMs } from '@coderyo/data';\n\n/** REST with optional WS `requestWsHistory` fallback when capabilities allow. */\nexport async function fetchChartHistory(\n provider: DataProvider,\n query: HistoryQuery,\n): Promise<{ bars: Bar[]; nextCursor?: string; hasMore?: boolean }> {\n const caps = await provider.getCapabilities?.();\n if (caps?.wsHistory && provider.requestWsHistory) {\n try {\n if (query.mode === 'range') {\n const bars = await provider.requestWsHistory({\n symbol: query.symbol,\n interval: query.interval,\n from: query.from,\n to: query.to,\n });\n return { bars, hasMore: false };\n }\n if (query.mode === 'loadMore') {\n const ms = intervalMs(query.interval);\n const from = query.endTime - ms * query.limit;\n const bars = await provider.requestWsHistory({\n symbol: query.symbol,\n interval: query.interval,\n from,\n to: query.endTime,\n });\n return { bars, hasMore: false };\n }\n } catch {\n /* fall through to REST */\n }\n }\n return provider.getHistory(query);\n}","import type { Interval, RealtimeStreamMode } from '@coderyo/data';\nimport type { IndicatorConfig } from '@coderyo/indicators';\nimport type { FetchPolicy } from '@coderyo/virtual-window';\n\nexport interface ChartGapsFeatures {\n whitespace?: boolean;\n fillVisibleHoles?: boolean;\n}\n\nexport interface ChartDrawingsFeatures {\n /** Show interactive drawing overlay (default false). API remains available when false. */\n layer?: boolean;\n /** Persist drawings to localStorage (default true when layer/API used). */\n persist?: boolean;\n}\n\nexport interface ChartFeatures {\n fetchPolicy?: FetchPolicy;\n streamMode?: RealtimeStreamMode;\n gaps?: ChartGapsFeatures;\n drawings?: ChartDrawingsFeatures;\n /** Pass config to enable MA + indicator panes; omit/null = no indicators. */\n indicators?: IndicatorConfig | null;\n /** Save indicator params to storage (default false). */\n indicatorPersist?: boolean;\n /** Ease last candle OHLC + price line to new values (~150ms). */\n smoothPriceUpdate?: boolean;\n smoothPriceDurationMs?: number;\n /** Pine-lite script source (requires pineEnabled). */\n pineScript?: string | null;\n /** Post-1.0 hooks — default false. */\n pineEnabled?: boolean;\n protobuf?: boolean;\n telemetry?: boolean;\n tickStream?: boolean;\n /** Run Pine-lite VM in a Web Worker when available (default true). */\n pineWorker?: boolean;\n /**\n * On interval/symbol reload, set bar spacing (px) for the interval (default true).\n * Does not choose how many bars are visible — use history limit / setVisibleRange.\n */\n autoBarSpacingOnInterval?: boolean;\n /** Override default bar spacing per interval (integrator). */\n barSpacingByInterval?: Partial<Record<Interval, number>>;\n}\n\nexport interface ResolvedChartFeatures {\n fetchPolicy: FetchPolicy;\n streamMode: RealtimeStreamMode;\n gaps: Required<ChartGapsFeatures>;\n drawings: Required<ChartDrawingsFeatures>;\n indicators: IndicatorConfig | null;\n indicatorPersist: boolean;\n smoothPriceUpdate: boolean;\n smoothPriceDurationMs: number;\n pineScript: string | null;\n pineEnabled: boolean;\n protobuf: boolean;\n telemetry: boolean;\n tickStream: boolean;\n pineWorker: boolean;\n autoBarSpacingOnInterval: boolean;\n barSpacingByInterval?: Partial<Record<Interval, number>>;\n}\n\nexport const DEFAULT_CHART_FEATURES: ResolvedChartFeatures = {\n fetchPolicy: 'lazy-left-only',\n streamMode: 'bar',\n gaps: { whitespace: false, fillVisibleHoles: false },\n drawings: { layer: false, persist: true },\n indicators: null,\n indicatorPersist: false,\n smoothPriceUpdate: false,\n smoothPriceDurationMs: 150,\n pineScript: null,\n pineEnabled: false,\n protobuf: false,\n telemetry: false,\n tickStream: false,\n pineWorker: true,\n autoBarSpacingOnInterval: true,\n barSpacingByInterval: undefined,\n};\n\nexport function resolveChartFeatures(partial?: ChartFeatures): ResolvedChartFeatures {\n const d = DEFAULT_CHART_FEATURES;\n return {\n fetchPolicy: partial?.fetchPolicy ?? d.fetchPolicy,\n streamMode: partial?.streamMode ?? d.streamMode,\n gaps: {\n whitespace: partial?.gaps?.whitespace ?? d.gaps.whitespace,\n fillVisibleHoles: partial?.gaps?.fillVisibleHoles ?? d.gaps.fillVisibleHoles,\n },\n drawings: {\n layer: partial?.drawings?.layer ?? d.drawings.layer,\n persist: partial?.drawings?.persist ?? d.drawings.persist,\n },\n indicators: partial?.indicators !== undefined ? partial.indicators : d.indicators,\n indicatorPersist: partial?.indicatorPersist ?? d.indicatorPersist,\n smoothPriceUpdate: partial?.smoothPriceUpdate ?? d.smoothPriceUpdate,\n smoothPriceDurationMs: partial?.smoothPriceDurationMs ?? d.smoothPriceDurationMs,\n pineScript: partial?.pineScript !== undefined ? partial.pineScript : d.pineScript,\n pineEnabled: partial?.pineEnabled ?? d.pineEnabled,\n protobuf: partial?.protobuf ?? d.protobuf,\n telemetry: partial?.telemetry ?? d.telemetry,\n tickStream: partial?.tickStream ?? d.tickStream,\n pineWorker: partial?.pineWorker ?? d.pineWorker,\n autoBarSpacingOnInterval: partial?.autoBarSpacingOnInterval ?? d.autoBarSpacingOnInterval,\n barSpacingByInterval: partial?.barSpacingByInterval ?? d.barSpacingByInterval,\n };\n}\n\nexport function mergeChartFeatures(\n current: ResolvedChartFeatures,\n patch: ChartFeatures,\n): ResolvedChartFeatures {\n return resolveChartFeatures({\n fetchPolicy: patch.fetchPolicy ?? current.fetchPolicy,\n streamMode: patch.streamMode ?? current.streamMode,\n gaps: { ...current.gaps, ...patch.gaps },\n drawings: { ...current.drawings, ...patch.drawings },\n indicators: patch.indicators !== undefined ? patch.indicators : current.indicators,\n indicatorPersist: patch.indicatorPersist ?? current.indicatorPersist,\n smoothPriceUpdate: patch.smoothPriceUpdate ?? current.smoothPriceUpdate,\n smoothPriceDurationMs: patch.smoothPriceDurationMs ?? current.smoothPriceDurationMs,\n pineScript: patch.pineScript !== undefined ? patch.pineScript : current.pineScript,\n pineEnabled: patch.pineEnabled ?? current.pineEnabled,\n protobuf: patch.protobuf ?? current.protobuf,\n telemetry: patch.telemetry ?? current.telemetry,\n tickStream: patch.tickStream ?? current.tickStream,\n pineWorker: patch.pineWorker ?? current.pineWorker,\n autoBarSpacingOnInterval:\n patch.autoBarSpacingOnInterval ?? current.autoBarSpacingOnInterval,\n barSpacingByInterval: patch.barSpacingByInterval ?? current.barSpacingByInterval,\n });\n}\n\n/** Empty chart until integrator calls setSymbol. */\nexport const PENDING_SYMBOL = '';","import {\n DEFAULT_INDICATOR_CONFIG,\n indicatorConfigStorageKey,\n type IndicatorConfig,\n} from '@coderyo/indicators';\n\n/** Pluggable key-value storage for `indicatorPersist` (default: `localStorage`). */\nexport interface ChartStorageAdapter {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n}\n\nexport function createLocalChartStorage(): ChartStorageAdapter {\n return {\n getItem: (key) => {\n try {\n return localStorage.getItem(key);\n } catch {\n return null;\n }\n },\n setItem: (key, value) => {\n try {\n localStorage.setItem(key, value);\n } catch {\n /* ignore quota / private mode */\n }\n },\n };\n}\n\nexport const defaultChartStorage: ChartStorageAdapter = createLocalChartStorage();\n\nexport function loadIndicatorConfig(\n storage: ChartStorageAdapter,\n symbol: string,\n interval: string,\n): IndicatorConfig {\n try {\n const raw = storage.getItem(indicatorConfigStorageKey(symbol, interval));\n if (!raw) return { ...DEFAULT_INDICATOR_CONFIG };\n return { ...DEFAULT_INDICATOR_CONFIG, ...JSON.parse(raw) };\n } catch {\n return { ...DEFAULT_INDICATOR_CONFIG };\n }\n}\n\nexport function saveIndicatorConfig(\n storage: ChartStorageAdapter,\n symbol: string,\n interval: string,\n config: IndicatorConfig,\n): void {\n try {\n storage.setItem(indicatorConfigStorageKey(symbol, interval), JSON.stringify(config));\n } catch {\n /* ignore */\n }\n}","import type { IndicatorConfig } from '@coderyo/indicators';\nimport { DEFAULT_INDICATOR_CONFIG } from '@coderyo/indicators';\nimport { PINE_SAMPLE_SCRIPT } from '@coderyo/pine-lite';\nimport type { Interval } from '@coderyo/data';\nimport type { ChartFeatures } from './chart-features.js';\nimport type { ChartOptions } from './chart-controller.js';\n\n/** Playground / docs: opt-in full TV-like chart features. */\nexport function createDemoChartFeatures(opts: {\n indicatorConfig?: IndicatorConfig;\n returnToCursorAfterDraw?: boolean;\n}): ChartFeatures {\n return {\n fetchPolicy: 'lazy-left-only',\n streamMode: 'bar+tick',\n gaps: { whitespace: false, fillVisibleHoles: false },\n drawings: { layer: true, persist: true },\n indicators: opts.indicatorConfig ?? DEFAULT_INDICATOR_CONFIG,\n indicatorPersist: true,\n smoothPriceUpdate: true,\n smoothPriceDurationMs: 150,\n tickStream: true,\n pineEnabled: true,\n pineScript: PINE_SAMPLE_SCRIPT,\n };\n}\n\nexport function createDemoChartOptions(\n base: Pick<ChartOptions, 'dataProvider' | 'indicatorHost' | 'symbolResolver' | 'chartId'> & {\n symbol: string;\n interval: Interval;\n theme?: 'dark' | 'light';\n showGrid?: boolean;\n indicatorConfig?: IndicatorConfig;\n returnToCursorAfterDraw?: boolean;\n },\n): ChartOptions {\n const indicatorConfig = base.indicatorConfig ?? DEFAULT_INDICATOR_CONFIG;\n return {\n ...base,\n features: createDemoChartFeatures({\n indicatorConfig,\n returnToCursorAfterDraw: base.returnToCursorAfterDraw,\n }),\n indicatorConfig,\n drawingDefaults: { returnToCursorAfterDraw: base.returnToCursorAfterDraw ?? false },\n };\n}","import type { BridgeAdapter } from '@coderyo/bridge';\nimport type { BridgeOutboundType } from '@coderyo/bridge';\nimport type { DrawingRecord, DrawingStyleMeta } from '@coderyo/drawings';\nimport type { IndicatorConfig } from '@coderyo/indicators';\nimport type { DataProvider } from '@coderyo/data';\nimport { wireChartBridge, TRADVIEW_API_VERSION } from './bridge-wire.js';\nimport { ChartController, type ChartOptions } from './chart-controller.js';\nimport type { ChartFeatures, ResolvedChartFeatures } from './chart-features.js';\nimport { TRADVIEW_VERSION } from './version.js';\nimport type { ChartVisibleRange } from '@coderyo/renderer-lite';\n\nexport { TRADVIEW_API_VERSION, TRADVIEW_VERSION };\nexport type { ChartVisibleRange };\nexport type { ChartFeatures, ResolvedChartFeatures } from './chart-features.js';\nexport { resolveChartFeatures, DEFAULT_CHART_FEATURES, PENDING_SYMBOL } from './chart-features.js';\nexport { createDemoChartFeatures, createDemoChartOptions } from './demo-presets.js';\n\nexport interface CreateChartOptions extends Omit<ChartOptions, 'dataProvider'> {\n dataProvider: DataProvider;\n bridge?: BridgeAdapter;\n chartId?: string;\n /** If set, only these bridge outbound events are posted. */\n bridgeOutboundEvents?: BridgeOutboundType[];\n bridgeCrosshairThrottleMs?: number;\n}\n\nexport interface IChart {\n setSymbol(symbol: string): IChart;\n setInterval(interval: import('@coderyo/data').Interval): IChart;\n setTheme(theme: 'dark' | 'light'): IChart;\n setShowGrid(show: boolean): IChart;\n setLogScale(enabled: boolean): IChart;\n fitContent(): IChart;\n scrollToRealtime(): IChart;\n /** Visible time range in ms (`fromMs` / `toMs`), or `null` if unknown. */\n getVisibleRange(): ChartVisibleRange | null;\n /** Bar spacing in px (zoom). Alias for LWC `barSpacing`. */\n getBarSpace(): number;\n setBarSpace(px: number): IChart;\n /** Restore viewport time range after re-bootstrap. */\n setVisibleRange(range: ChartVisibleRange): IChart;\n /** Scroll so `tsMs` aligns to the right edge of the viewport. */\n scrollToTimestamp(tsMs: number, animationMs?: number): IChart;\n /** Re-fetch recent history without clearing scroll/zoom. */\n reloadHistory(): Promise<IChart>;\n resize(size?: { width?: number; height?: number }): IChart;\n setFullscreen(enabled: boolean): IChart;\n exportImage(opts?: { pixelRatio?: number }): Promise<Blob>;\n on(event: import('./chart-controller.js').ChartEvent, handler: (p?: unknown) => void): IChart;\n off(event: import('./chart-controller.js').ChartEvent, handler: (p?: unknown) => void): IChart;\n searchSymbols(query: string): Promise<import('@coderyo/data').SymbolSearchHit[]>;\n setDrawingTool(tool: import('@coderyo/drawings').DrawingTool): IChart;\n deleteSelectedDrawing(): boolean;\n copySelectedDrawing(): DrawingRecord | null;\n toggleLockSelectedDrawing(): boolean;\n updateSelectedDrawingStyle(patch: DrawingStyleMeta): void;\n deselectDrawing(): void;\n setIndicatorConfig(config: IndicatorConfig | null): void;\n /** Hide all indicator panes and overlays; returns the applied config. */\n clearAllIndicators(): IndicatorConfig;\n /** Remove all drawings for the current symbol/interval; returns count removed. */\n clearAllDrawings(): number;\n setReturnToCursorAfterDraw(v: boolean): void;\n setFeatures(patch: ChartFeatures): IChart;\n getFeatures(): ResolvedChartFeatures;\n /** Integrator push: smooth-update last candle toward `price` (no WS required). */\n updateLastPrice(price: number, timeMs?: number): IChart;\n hasActiveSymbol(): boolean;\n setLocale(locale: string): IChart;\n /** Subscribe to realtime bar updates; returns unsubscribe. */\n subscribeBars(handler: (bar: import('@coderyo/data').Bar) => void): () => void;\n destroy(): void;\n}\n\nfunction wrap(controller: ChartController, beforeDestroy?: () => void): IChart {\n return {\n setSymbol: (s) => {\n void controller.setSymbol(s);\n return wrap(controller, beforeDestroy);\n },\n setInterval: (i) => {\n void controller.setInterval(i);\n return wrap(controller, beforeDestroy);\n },\n setTheme: (t) => {\n controller.setTheme(t);\n return wrap(controller, beforeDestroy);\n },\n setShowGrid: (show) => {\n controller.setShowGrid(show);\n return wrap(controller, beforeDestroy);\n },\n setLogScale: (enabled) => {\n controller.setLogScale(enabled);\n return wrap(controller, beforeDestroy);\n },\n fitContent: () => {\n controller.fitContent();\n return wrap(controller, beforeDestroy);\n },\n scrollToRealtime: () => {\n controller.scrollToRealtime();\n return wrap(controller, beforeDestroy);\n },\n getVisibleRange: () => controller.getVisibleRange(),\n getBarSpace: () => controller.getBarSpace(),\n setBarSpace: (px) => {\n controller.setBarSpace(px);\n return wrap(controller, beforeDestroy);\n },\n setVisibleRange: (range) => {\n controller.setVisibleRange(range);\n return wrap(controller, beforeDestroy);\n },\n scrollToTimestamp: (tsMs, animationMs) => {\n controller.scrollToTimestamp(tsMs, animationMs);\n return wrap(controller, beforeDestroy);\n },\n reloadHistory: async () => {\n await controller.reloadHistory();\n return wrap(controller, beforeDestroy);\n },\n resize: (s) => {\n controller.resize(s);\n return wrap(controller, beforeDestroy);\n },\n setFullscreen: (e) => {\n controller.setFullscreen(e);\n return wrap(controller, beforeDestroy);\n },\n exportImage: (o) => controller.exportImage(o),\n on: (e, h) => {\n controller.on(e, h);\n return wrap(controller, beforeDestroy);\n },\n off: (e, h) => {\n controller.off(e, h);\n return wrap(controller, beforeDestroy);\n },\n searchSymbols: (q) => controller.searchSymbols(q),\n setDrawingTool: (tool) => {\n controller.setDrawingTool(tool);\n return wrap(controller, beforeDestroy);\n },\n deleteSelectedDrawing: () => controller.deleteSelectedDrawing(),\n copySelectedDrawing: () => controller.copySelectedDrawing(),\n toggleLockSelectedDrawing: () => controller.toggleLockSelectedDrawing(),\n updateSelectedDrawingStyle: (p) => {\n controller.updateSelectedDrawingStyle(p);\n return wrap(controller, beforeDestroy);\n },\n deselectDrawing: () => {\n controller.deselectDrawing();\n return wrap(controller, beforeDestroy);\n },\n setIndicatorConfig: (c) => {\n controller.setIndicatorConfig(c);\n return wrap(controller, beforeDestroy);\n },\n clearAllIndicators: () => controller.clearAllIndicators(),\n clearAllDrawings: () => controller.clearAllDrawings(),\n setReturnToCursorAfterDraw: (v) => {\n controller.setReturnToCursorAfterDraw(v);\n return wrap(controller, beforeDestroy);\n },\n setFeatures: (patch) => {\n controller.setFeatures(patch);\n return wrap(controller, beforeDestroy);\n },\n getFeatures: () => controller.getFeatures(),\n updateLastPrice: (price, timeMs) => {\n controller.updateLastPrice(price, timeMs);\n return wrap(controller, beforeDestroy);\n },\n hasActiveSymbol: () => controller.hasActiveSymbol(),\n setLocale: (locale) => {\n controller.setLocale(locale);\n return wrap(controller, beforeDestroy);\n },\n subscribeBars: (handler) => controller.subscribeBars(handler),\n destroy: () => {\n controller.destroy();\n beforeDestroy?.();\n },\n };\n}\n\nexport function createChart(\n target: HTMLElement | string,\n options: CreateChartOptions,\n): IChart {\n const el =\n typeof target === 'string'\n ? (document.querySelector(target) as HTMLElement | null)\n : target;\n if (!el) throw new Error('Chart container not found');\n const controller = new ChartController(el, options);\n let bridgeTeardown: (() => void) | undefined;\n const chart = wrap(controller, () => bridgeTeardown?.());\n if (options.bridge) {\n bridgeTeardown = wireChartBridge({\n controller,\n chart,\n bridge: options.bridge,\n chartId: options.chartId,\n outboundEvents: options.bridgeOutboundEvents,\n crosshairThrottleMs: options.bridgeCrosshairThrottleMs,\n });\n }\n return chart;\n}","export {\n createChart,\n type IChart,\n type CreateChartOptions,\n TRADVIEW_API_VERSION,\n TRADVIEW_VERSION,\n type ChartFeatures,\n type ResolvedChartFeatures,\n resolveChartFeatures,\n DEFAULT_CHART_FEATURES,\n PENDING_SYMBOL,\n createDemoChartFeatures,\n createDemoChartOptions,\n} from './create-chart.js';\nexport {\n ChartController,\n type ChartOptions,\n type ChartEvent,\n type ChartVisibleRange,\n} from './chart-controller.js';\nexport { wireChartBridge, type WireChartBridgeOptions } from './bridge-wire.js';\nexport {\n type ChartStorageAdapter,\n createLocalChartStorage,\n defaultChartStorage,\n loadIndicatorConfig,\n saveIndicatorConfig,\n} from './indicator-storage.js';\nexport {\n DEFAULT_INDICATOR_CONFIG,\n clearedIndicatorConfig,\n hasVisibleIndicatorPanes,\n hasMainChartOverlays,\n hasAnyActiveIndicators,\n indicatorConfigStorageKey,\n type IndicatorConfig,\n type IndicatorSource,\n} from '@coderyo/indicators';\nexport {\n compilePineLite,\n runPineLite,\n PINE_SAMPLE_SCRIPT,\n PINE_EDITOR_DEFAULT,\n type PineCompileResult,\n type PineIrProgram,\n type PinePlotSeries,\n} from '@coderyo/pine-lite';"],"mappings":"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","names":["intervalMs","intervalMs","DEFAULT_INDICATOR_CONFIG","DEFAULT_INDICATOR_CONFIG","clearedIndicatorConfig","indicatorConfigStorageKey","compilePineLite","PINE_SAMPLE_SCRIPT"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coderyo/core",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -10,22 +10,22 @@
|
|
|
10
10
|
}
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@coderyo/data": "1.0.
|
|
14
|
-
"@coderyo/
|
|
15
|
-
"@coderyo/
|
|
16
|
-
"@coderyo/virtual-window": "1.0.
|
|
17
|
-
"@coderyo/
|
|
18
|
-
"@coderyo/
|
|
19
|
-
"@coderyo/
|
|
20
|
-
"@coderyo/
|
|
21
|
-
"@coderyo/
|
|
13
|
+
"@coderyo/data": "1.0.3",
|
|
14
|
+
"@coderyo/series": "1.0.3",
|
|
15
|
+
"@coderyo/bridge": "1.0.3",
|
|
16
|
+
"@coderyo/virtual-window": "1.0.3",
|
|
17
|
+
"@coderyo/drawings": "1.0.3",
|
|
18
|
+
"@coderyo/indicators": "1.0.3",
|
|
19
|
+
"@coderyo/renderer-lite": "1.0.3",
|
|
20
|
+
"@coderyo/pine-lite": "1.0.3",
|
|
21
|
+
"@coderyo/i18n": "1.0.3"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"tsup": "^8.5.0",
|
|
25
25
|
"typescript": "^5.8.3",
|
|
26
26
|
"vitest": "^3.2.4",
|
|
27
|
-
"@coderyo/
|
|
28
|
-
"@coderyo/
|
|
27
|
+
"@coderyo/eslint-config": "0.0.0",
|
|
28
|
+
"@coderyo/tsconfig": "0.0.0"
|
|
29
29
|
},
|
|
30
30
|
"files": [
|
|
31
31
|
"dist"
|