@coderyo/core 1.0.0-rc.2 → 1.0.0-rc.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 +12 -1
- package/dist/index.js +78 -9
- package/dist/index.js.map +1 -1
- package/package.json +8 -8
package/dist/index.d.ts
CHANGED
|
@@ -25,6 +25,9 @@ interface ChartFeatures {
|
|
|
25
25
|
indicators?: IndicatorConfig | null;
|
|
26
26
|
/** Save indicator params to storage (default false). */
|
|
27
27
|
indicatorPersist?: boolean;
|
|
28
|
+
/** Ease last candle OHLC + price line to new values (~150ms). */
|
|
29
|
+
smoothPriceUpdate?: boolean;
|
|
30
|
+
smoothPriceDurationMs?: number;
|
|
28
31
|
/** Post-1.0 hooks — default false, no-op until implemented. */
|
|
29
32
|
pineEnabled?: boolean;
|
|
30
33
|
protobuf?: boolean;
|
|
@@ -38,6 +41,8 @@ interface ResolvedChartFeatures {
|
|
|
38
41
|
drawings: Required<ChartDrawingsFeatures>;
|
|
39
42
|
indicators: IndicatorConfig | null;
|
|
40
43
|
indicatorPersist: boolean;
|
|
44
|
+
smoothPriceUpdate: boolean;
|
|
45
|
+
smoothPriceDurationMs: number;
|
|
41
46
|
pineEnabled: boolean;
|
|
42
47
|
protobuf: boolean;
|
|
43
48
|
telemetry: boolean;
|
|
@@ -97,6 +102,10 @@ declare class ChartController {
|
|
|
97
102
|
setFeatures(patch: ChartFeatures): this;
|
|
98
103
|
hasActiveSymbol(): boolean;
|
|
99
104
|
private applyFeatures;
|
|
105
|
+
/** Integrator push: update last candle close (and H/L) without WS. */
|
|
106
|
+
updateLastPrice(price: number, timeMs?: number): this;
|
|
107
|
+
private buildBarFromPrice;
|
|
108
|
+
private applyRealtimeBar;
|
|
100
109
|
private applyDrawingLayer;
|
|
101
110
|
private syncOverlayPointerEvents;
|
|
102
111
|
getContainer(): HTMLElement;
|
|
@@ -152,7 +161,7 @@ interface WireChartBridgeOptions {
|
|
|
152
161
|
declare function wireChartBridge(opts: WireChartBridgeOptions): () => void;
|
|
153
162
|
|
|
154
163
|
/** Synced by scripts/sync-versions.mjs from repo VERSION file */
|
|
155
|
-
declare const TRADVIEW_VERSION: "1.0.0-rc.
|
|
164
|
+
declare const TRADVIEW_VERSION: "1.0.0-rc.3";
|
|
156
165
|
|
|
157
166
|
/** Playground / docs: opt-in full TV-like chart features. */
|
|
158
167
|
declare function createDemoChartFeatures(opts: {
|
|
@@ -205,6 +214,8 @@ interface IChart {
|
|
|
205
214
|
setReturnToCursorAfterDraw(v: boolean): void;
|
|
206
215
|
setFeatures(patch: ChartFeatures): IChart;
|
|
207
216
|
getFeatures(): ResolvedChartFeatures;
|
|
217
|
+
/** Integrator push: smooth-update last candle toward `price` (no WS required). */
|
|
218
|
+
updateLastPrice(price: number, timeMs?: number): IChart;
|
|
208
219
|
hasActiveSymbol(): boolean;
|
|
209
220
|
destroy(): void;
|
|
210
221
|
}
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
} from "@coderyo/bridge";
|
|
6
6
|
|
|
7
7
|
// src/version.ts
|
|
8
|
-
var TRADVIEW_VERSION = "1.0.0-rc.
|
|
8
|
+
var TRADVIEW_VERSION = "1.0.0-rc.3";
|
|
9
9
|
|
|
10
10
|
// src/bridge-wire.ts
|
|
11
11
|
var TRADVIEW_API_VERSION = 1;
|
|
@@ -154,6 +154,7 @@ function wireChartBridge(opts) {
|
|
|
154
154
|
}
|
|
155
155
|
|
|
156
156
|
// src/chart-controller.ts
|
|
157
|
+
import { floorBarOpenTime } from "@coderyo/data";
|
|
157
158
|
import { parseInterval } from "@coderyo/data";
|
|
158
159
|
import { BarStore } from "@coderyo/series";
|
|
159
160
|
import { VirtualWindow } from "@coderyo/virtual-window";
|
|
@@ -168,6 +169,8 @@ var DEFAULT_CHART_FEATURES = {
|
|
|
168
169
|
drawings: { layer: false, persist: true },
|
|
169
170
|
indicators: null,
|
|
170
171
|
indicatorPersist: false,
|
|
172
|
+
smoothPriceUpdate: false,
|
|
173
|
+
smoothPriceDurationMs: 150,
|
|
171
174
|
pineEnabled: false,
|
|
172
175
|
protobuf: false,
|
|
173
176
|
telemetry: false,
|
|
@@ -188,6 +191,8 @@ function resolveChartFeatures(partial) {
|
|
|
188
191
|
},
|
|
189
192
|
indicators: partial?.indicators !== void 0 ? partial.indicators : d.indicators,
|
|
190
193
|
indicatorPersist: partial?.indicatorPersist ?? d.indicatorPersist,
|
|
194
|
+
smoothPriceUpdate: partial?.smoothPriceUpdate ?? d.smoothPriceUpdate,
|
|
195
|
+
smoothPriceDurationMs: partial?.smoothPriceDurationMs ?? d.smoothPriceDurationMs,
|
|
191
196
|
pineEnabled: partial?.pineEnabled ?? d.pineEnabled,
|
|
192
197
|
protobuf: partial?.protobuf ?? d.protobuf,
|
|
193
198
|
telemetry: partial?.telemetry ?? d.telemetry,
|
|
@@ -202,6 +207,8 @@ function mergeChartFeatures(current, patch) {
|
|
|
202
207
|
drawings: { ...current.drawings, ...patch.drawings },
|
|
203
208
|
indicators: patch.indicators !== void 0 ? patch.indicators : current.indicators,
|
|
204
209
|
indicatorPersist: patch.indicatorPersist ?? current.indicatorPersist,
|
|
210
|
+
smoothPriceUpdate: patch.smoothPriceUpdate ?? current.smoothPriceUpdate,
|
|
211
|
+
smoothPriceDurationMs: patch.smoothPriceDurationMs ?? current.smoothPriceDurationMs,
|
|
205
212
|
pineEnabled: patch.pineEnabled ?? current.pineEnabled,
|
|
206
213
|
protobuf: patch.protobuf ?? current.protobuf,
|
|
207
214
|
telemetry: patch.telemetry ?? current.telemetry,
|
|
@@ -231,7 +238,9 @@ var ChartController = class {
|
|
|
231
238
|
theme: options.theme ?? "dark",
|
|
232
239
|
scaleMode: options.scaleMode ?? "linear",
|
|
233
240
|
showGrid: options.showGrid ?? false,
|
|
234
|
-
indicatorConfig: this.features.indicators
|
|
241
|
+
indicatorConfig: this.features.indicators,
|
|
242
|
+
smoothPriceUpdate: this.features.smoothPriceUpdate,
|
|
243
|
+
smoothPriceDurationMs: this.features.smoothPriceDurationMs
|
|
235
244
|
});
|
|
236
245
|
if (options.width) container.style.width = `${options.width}px`;
|
|
237
246
|
if (options.height) container.style.height = `${options.height}px`;
|
|
@@ -314,9 +323,60 @@ var ChartController = class {
|
|
|
314
323
|
const fetchPolicy = this.features.gaps.fillVisibleHoles ? "fill-visible-holes" : this.features.fetchPolicy;
|
|
315
324
|
this.virtualWindow.setFetchPolicy(fetchPolicy);
|
|
316
325
|
this.orchestrator.setIndicatorConfig(this.features.indicators);
|
|
326
|
+
this.orchestrator.setSmoothPriceUpdate(
|
|
327
|
+
this.features.smoothPriceUpdate,
|
|
328
|
+
this.features.smoothPriceDurationMs
|
|
329
|
+
);
|
|
317
330
|
this.drawingManager?.setPersistence(this.features.drawings.persist);
|
|
318
331
|
this.applyDrawingLayer();
|
|
319
332
|
}
|
|
333
|
+
/** Integrator push: update last candle close (and H/L) without WS. */
|
|
334
|
+
updateLastPrice(price, timeMs = Date.now()) {
|
|
335
|
+
if (!this.hasActiveSymbol() || this.destroyed) return this;
|
|
336
|
+
const bar = this.buildBarFromPrice(price, timeMs);
|
|
337
|
+
void this.applyRealtimeBar(bar, true);
|
|
338
|
+
return this;
|
|
339
|
+
}
|
|
340
|
+
buildBarFromPrice(price, timeMs) {
|
|
341
|
+
const interval = this.store.interval;
|
|
342
|
+
const open = floorBarOpenTime(timeMs, interval);
|
|
343
|
+
const times = this.store.sortedTimes;
|
|
344
|
+
const lastT = times.length > 0 ? times[times.length - 1] : void 0;
|
|
345
|
+
const existing = lastT !== void 0 ? this.store.getBar(lastT) : void 0;
|
|
346
|
+
if (existing && existing.t === open) {
|
|
347
|
+
return {
|
|
348
|
+
...existing,
|
|
349
|
+
c: price,
|
|
350
|
+
h: Math.max(existing.h, price),
|
|
351
|
+
l: Math.min(existing.l, price)
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
const prevClose = existing?.c ?? price;
|
|
355
|
+
return {
|
|
356
|
+
t: open,
|
|
357
|
+
o: prevClose,
|
|
358
|
+
h: Math.max(prevClose, price),
|
|
359
|
+
l: Math.min(prevClose, price),
|
|
360
|
+
c: price,
|
|
361
|
+
v: existing?.v ?? 0
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
async applyRealtimeBar(bar, partial, loadGen = this.loadGeneration) {
|
|
365
|
+
await this.store.mergeRealtime({ bar, partial });
|
|
366
|
+
if (!this.isLoadGenerationCurrent(loadGen)) return;
|
|
367
|
+
const bars = this.virtualWindow.getBarsForRender();
|
|
368
|
+
const last = bars[bars.length - 1];
|
|
369
|
+
if (last && this.features.smoothPriceUpdate) {
|
|
370
|
+
this.orchestrator.updateLastBar(last, {
|
|
371
|
+
smooth: true,
|
|
372
|
+
durationMs: this.features.smoothPriceDurationMs
|
|
373
|
+
});
|
|
374
|
+
this.drawingManager?.redraw();
|
|
375
|
+
} else {
|
|
376
|
+
this.refreshRender(loadGen);
|
|
377
|
+
}
|
|
378
|
+
this.emit("barUpdate", bar);
|
|
379
|
+
}
|
|
320
380
|
applyDrawingLayer() {
|
|
321
381
|
if (!this.drawingManager) return;
|
|
322
382
|
this.drawingManager.setLayerVisible(this.features.drawings.layer);
|
|
@@ -518,11 +578,13 @@ var ChartController = class {
|
|
|
518
578
|
onBar: (bar, meta) => {
|
|
519
579
|
if (!this.isLoadGenerationCurrent(loadGen)) return;
|
|
520
580
|
if (this.store.symbol !== symbol || this.store.interval !== interval) return;
|
|
521
|
-
void this.
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
this.
|
|
581
|
+
void this.applyRealtimeBar(bar, meta.partial, loadGen);
|
|
582
|
+
},
|
|
583
|
+
onTick: (tick) => {
|
|
584
|
+
if (!this.isLoadGenerationCurrent(loadGen)) return;
|
|
585
|
+
if (this.store.symbol !== symbol || this.store.interval !== interval) return;
|
|
586
|
+
const bar = this.buildBarFromPrice(tick.price, tick.t);
|
|
587
|
+
void this.applyRealtimeBar(bar, true, loadGen);
|
|
526
588
|
},
|
|
527
589
|
onConnectionChange: (state) => this.emit("connectionChange", state),
|
|
528
590
|
onError: (err) => this.emit("error", err)
|
|
@@ -612,11 +674,14 @@ import { DEFAULT_INDICATOR_CONFIG } from "@coderyo/indicators";
|
|
|
612
674
|
function createDemoChartFeatures(opts) {
|
|
613
675
|
return {
|
|
614
676
|
fetchPolicy: "lazy-left-only",
|
|
615
|
-
streamMode: "bar",
|
|
677
|
+
streamMode: "bar+tick",
|
|
616
678
|
gaps: { whitespace: false, fillVisibleHoles: false },
|
|
617
679
|
drawings: { layer: true, persist: true },
|
|
618
680
|
indicators: opts.indicatorConfig ?? DEFAULT_INDICATOR_CONFIG,
|
|
619
|
-
indicatorPersist: true
|
|
681
|
+
indicatorPersist: true,
|
|
682
|
+
smoothPriceUpdate: true,
|
|
683
|
+
smoothPriceDurationMs: 150,
|
|
684
|
+
tickStream: true
|
|
620
685
|
};
|
|
621
686
|
}
|
|
622
687
|
function createDemoChartOptions(base) {
|
|
@@ -709,6 +774,10 @@ function wrap(controller, beforeDestroy) {
|
|
|
709
774
|
return wrap(controller, beforeDestroy);
|
|
710
775
|
},
|
|
711
776
|
getFeatures: () => controller.getFeatures(),
|
|
777
|
+
updateLastPrice: (price, timeMs) => {
|
|
778
|
+
controller.updateLastPrice(price, timeMs);
|
|
779
|
+
return wrap(controller, beforeDestroy);
|
|
780
|
+
},
|
|
712
781
|
hasActiveSymbol: () => controller.hasActiveSymbol(),
|
|
713
782
|
destroy: () => {
|
|
714
783
|
controller.destroy();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/bridge-wire.ts","../src/version.ts","../src/chart-controller.ts","../src/chart-features.ts","../src/demo-presets.ts","../src/create-chart.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};\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\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.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.0-rc.2' as const;\n","import type { DrawingRecord, DrawingStyleMeta } from '@coderyo/drawings';\nimport type { IndicatorConfig } from '@coderyo/indicators';\n\nimport type {\n DataProvider,\n HistoryQuery,\n Interval,\n RealtimeStreamMode,\n SubscribeParams,\n SymbolResolver,\n} from '@coderyo/data';\nimport type { HistoryRequest } from '@coderyo/virtual-window';\nimport { parseInterval } from '@coderyo/data';\nimport { BarStore } from '@coderyo/series';\nimport { VirtualWindow, type FetchPolicy } from '@coderyo/virtual-window';\nimport { DrawingManager } from '@coderyo/drawings';\nimport { PaneOrchestrator } from '@coderyo/renderer-lite';\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\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\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 });\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 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.drawingManager?.setPersistence(this.features.drawings.persist);\n this.applyDrawingLayer();\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 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.offCrosshair?.();\n this.offCrosshair = null;\n this.resizeObserver.disconnect();\n this.drawingManager?.destroy();\n void this.teardownSubscription();\n this.orchestrator.destroy();\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 const history = await this.options.dataProvider.getHistory({\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\n const params: SubscribeParams = {\n symbol,\n interval,\n channels: this.features.tickStream ? ['bar', 'tick'] : ['bar'],\n streamMode,\n };\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: (bar, meta) => {\n if (!this.isLoadGenerationCurrent(loadGen)) return;\n if (this.store.symbol !== symbol || this.store.interval !== interval) return;\n void this.store\n .mergeRealtime({\n bar,\n partial: meta.partial,\n })\n .then(() => this.refreshRender(loadGen));\n this.emit('barUpdate', bar);\n },\n onConnectionChange: (state) => this.emit('connectionChange', state),\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 if (this.subscriptionId) {\n await this.options.dataProvider.unsubscribe(this.subscriptionId);\n this.subscriptionId = null;\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 this.options.dataProvider.getHistory(toHistoryQuery(req));\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 this.orchestrator.setBars(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 { 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 /** Post-1.0 hooks — default false, no-op until implemented. */\n pineEnabled?: boolean;\n protobuf?: boolean;\n telemetry?: boolean;\n tickStream?: 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 pineEnabled: boolean;\n protobuf: boolean;\n telemetry: boolean;\n tickStream: 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 pineEnabled: false,\n protobuf: false,\n telemetry: false,\n tickStream: false,\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 pineEnabled: partial?.pineEnabled ?? d.pineEnabled,\n protobuf: partial?.protobuf ?? d.protobuf,\n telemetry: partial?.telemetry ?? d.telemetry,\n tickStream: partial?.tickStream ?? d.tickStream,\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 pineEnabled: patch.pineEnabled ?? current.pineEnabled,\n protobuf: patch.protobuf ?? current.protobuf,\n telemetry: patch.telemetry ?? current.telemetry,\n tickStream: patch.tickStream ?? current.tickStream,\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 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',\n gaps: { whitespace: false, fillVisibleHoles: false },\n drawings: { layer: true, persist: true },\n indicators: opts.indicatorConfig ?? DEFAULT_INDICATOR_CONFIG,\n indicatorPersist: true,\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';\n\nexport { TRADVIEW_API_VERSION, TRADVIEW_VERSION };\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 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 hasActiveSymbol(): boolean;\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 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 hasActiveSymbol: () => controller.hasActiveSymbol(),\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}"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/bridge-wire.ts","../src/version.ts","../src/chart-controller.ts","../src/chart-features.ts","../src/demo-presets.ts","../src/create-chart.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};\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\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.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.0-rc.3' 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 } from '@coderyo/data';\nimport type { HistoryRequest } from '@coderyo/virtual-window';\nimport { parseInterval } from '@coderyo/data';\nimport { BarStore } from '@coderyo/series';\nimport { VirtualWindow, type FetchPolicy } from '@coderyo/virtual-window';\nimport { DrawingManager } from '@coderyo/drawings';\nimport { PaneOrchestrator } from '@coderyo/renderer-lite';\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\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\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 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 }\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 }\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 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.offCrosshair?.();\n this.offCrosshair = null;\n this.resizeObserver.disconnect();\n this.drawingManager?.destroy();\n void this.teardownSubscription();\n this.orchestrator.destroy();\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 const history = await this.options.dataProvider.getHistory({\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\n const params: SubscribeParams = {\n symbol,\n interval,\n channels: this.features.tickStream ? ['bar', 'tick'] : ['bar'],\n streamMode,\n };\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: (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 const bar = this.buildBarFromPrice(tick.price, tick.t);\n void this.applyRealtimeBar(bar, true, loadGen);\n },\n onConnectionChange: (state) => this.emit('connectionChange', state),\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 if (this.subscriptionId) {\n await this.options.dataProvider.unsubscribe(this.subscriptionId);\n this.subscriptionId = null;\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 this.options.dataProvider.getHistory(toHistoryQuery(req));\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 this.orchestrator.setBars(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 { 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 /** Post-1.0 hooks — default false, no-op until implemented. */\n pineEnabled?: boolean;\n protobuf?: boolean;\n telemetry?: boolean;\n tickStream?: 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 pineEnabled: boolean;\n protobuf: boolean;\n telemetry: boolean;\n tickStream: 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 pineEnabled: false,\n protobuf: false,\n telemetry: false,\n tickStream: false,\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 pineEnabled: partial?.pineEnabled ?? d.pineEnabled,\n protobuf: partial?.protobuf ?? d.protobuf,\n telemetry: partial?.telemetry ?? d.telemetry,\n tickStream: partial?.tickStream ?? d.tickStream,\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 pineEnabled: patch.pineEnabled ?? current.pineEnabled,\n protobuf: patch.protobuf ?? current.protobuf,\n telemetry: patch.telemetry ?? current.telemetry,\n tickStream: patch.tickStream ?? current.tickStream,\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 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 };\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';\n\nexport { TRADVIEW_API_VERSION, TRADVIEW_VERSION };\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 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 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 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 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}"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coderyo/core",
|
|
3
|
-
"version": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.3",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -10,13 +10,13 @@
|
|
|
10
10
|
}
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@coderyo/data": "1.0.0-rc.
|
|
14
|
-
"@coderyo/
|
|
15
|
-
"@coderyo/
|
|
16
|
-
"@coderyo/
|
|
17
|
-
"@coderyo/
|
|
18
|
-
"@coderyo/
|
|
19
|
-
"@coderyo/
|
|
13
|
+
"@coderyo/data": "1.0.0-rc.3",
|
|
14
|
+
"@coderyo/series": "1.0.0-rc.3",
|
|
15
|
+
"@coderyo/indicators": "1.0.0-rc.3",
|
|
16
|
+
"@coderyo/bridge": "1.0.0-rc.3",
|
|
17
|
+
"@coderyo/virtual-window": "1.0.0-rc.3",
|
|
18
|
+
"@coderyo/renderer-lite": "1.0.0-rc.3",
|
|
19
|
+
"@coderyo/drawings": "1.0.0-rc.3"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"tsup": "^8.5.0",
|