@tradecanvas/core 1.83.1 → 1.84.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/README.md +6 -6
  2. package/dist/{WebGLSeriesRenderer-CNjcz7gD.js → WebGLSeriesRenderer-DguvFCTx.js} +1 -1
  3. package/dist/{WebGLSeriesRenderer-CNjcz7gD.js.map → WebGLSeriesRenderer-DguvFCTx.js.map} +1 -1
  4. package/dist/{WebGLSeriesRenderer-CcD5VtQE.cjs → WebGLSeriesRenderer-lwJz1WAg.cjs} +1 -1
  5. package/dist/{WebGLSeriesRenderer-CcD5VtQE.cjs.map → WebGLSeriesRenderer-lwJz1WAg.cjs.map} +1 -1
  6. package/dist/index.cjs +8 -8
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.js +3241 -2505
  9. package/dist/index.js.map +1 -1
  10. package/dist/indicator.worker-1I8WNx4q.js +18 -0
  11. package/dist/indicator.worker-1I8WNx4q.js.map +1 -0
  12. package/dist/indicator.worker-g0us81yM.cjs +2 -0
  13. package/dist/indicator.worker-g0us81yM.cjs.map +1 -0
  14. package/dist/indicators/IndicatorEngine.d.ts +33 -40
  15. package/dist/indicators/IndicatorEngine.d.ts.map +1 -1
  16. package/dist/indicators/IndicatorValueMap.d.ts +6 -0
  17. package/dist/indicators/IndicatorValueMap.d.ts.map +1 -1
  18. package/dist/indicators/PointwiseIndicator.d.ts +7 -5
  19. package/dist/indicators/PointwiseIndicator.d.ts.map +1 -1
  20. package/dist/indicators/builtInFactories.d.ts +8 -0
  21. package/dist/indicators/builtInFactories.d.ts.map +1 -0
  22. package/dist/indicators/index.d.ts +7 -0
  23. package/dist/indicators/index.d.ts.map +1 -1
  24. package/dist/indicators/indicatorInstance.d.ts +59 -0
  25. package/dist/indicators/indicatorInstance.d.ts.map +1 -0
  26. package/dist/indicators/instanceReads.d.ts +40 -0
  27. package/dist/indicators/instanceReads.d.ts.map +1 -0
  28. package/dist/indicators/overlay/ChandeKrollStop.d.ts +4 -0
  29. package/dist/indicators/overlay/ChandeKrollStop.d.ts.map +1 -1
  30. package/dist/indicators/overlay/DEMA.d.ts +4 -0
  31. package/dist/indicators/overlay/DEMA.d.ts.map +1 -1
  32. package/dist/indicators/overlay/VWAP.d.ts +4 -0
  33. package/dist/indicators/overlay/VWAP.d.ts.map +1 -1
  34. package/dist/indicators/panel/MACD.d.ts +4 -0
  35. package/dist/indicators/panel/MACD.d.ts.map +1 -1
  36. package/dist/indicators/panel/RSI.d.ts +4 -0
  37. package/dist/indicators/panel/RSI.d.ts.map +1 -1
  38. package/dist/indicators/panel/UlcerIndex.d.ts +4 -0
  39. package/dist/indicators/panel/UlcerIndex.d.ts.map +1 -1
  40. package/dist/indicators/panel/VolumeOscillator.d.ts +4 -0
  41. package/dist/indicators/panel/VolumeOscillator.d.ts.map +1 -1
  42. package/dist/indicators/recompute.bench.d.ts +2 -0
  43. package/dist/indicators/recompute.bench.d.ts.map +1 -0
  44. package/dist/indicators/registry.d.ts.map +1 -1
  45. package/dist/indicators/worker/IndicatorWorkerBridge.d.ts +81 -0
  46. package/dist/indicators/worker/IndicatorWorkerBridge.d.ts.map +1 -0
  47. package/dist/indicators/worker/IndicatorWorkerHost.d.ts +2 -1
  48. package/dist/indicators/worker/IndicatorWorkerHost.d.ts.map +1 -1
  49. package/dist/indicators/worker/IndicatorWorkerPool.d.ts +99 -0
  50. package/dist/indicators/worker/IndicatorWorkerPool.d.ts.map +1 -0
  51. package/dist/indicators/worker/columns.d.ts +78 -0
  52. package/dist/indicators/worker/columns.d.ts.map +1 -0
  53. package/dist/indicators/worker/messages.d.ts +26 -13
  54. package/dist/indicators/worker/messages.d.ts.map +1 -1
  55. package/dist/indicators/worker/spawnWorker.d.ts +17 -0
  56. package/dist/indicators/worker/spawnWorker.d.ts.map +1 -0
  57. package/dist/indicators/worker/workerHandler.d.ts +16 -0
  58. package/dist/indicators/worker/workerHandler.d.ts.map +1 -0
  59. package/dist/indicators/worker/workerJobs.d.ts +56 -0
  60. package/dist/indicators/worker/workerJobs.d.ts.map +1 -0
  61. package/dist/indicators/worker/workerState.d.ts +28 -0
  62. package/dist/indicators/worker/workerState.d.ts.map +1 -0
  63. package/dist/interaction/InteractionManager.d.ts +2 -0
  64. package/dist/interaction/InteractionManager.d.ts.map +1 -1
  65. package/package.json +2 -2
@@ -426,4 +426,4 @@ void main() {
426
426
  outColor = v_color * (c.x * c.y);
427
427
  }
428
428
  `,W=24,G=5,K=G*4,q=10,J=q*4,Y=()=>{},X=[`a_ohlc`,`a_vd`,`a_col`,`a_up`,`a_rect`,`a_color`,`a_dash`],xe=class n{label;gl;kit;drawer;candleBars;volumeBars;candleColumns;volumeColumns;rects;seriesBuffer;columnBuffer;rectBuffer;uploads=new r;gpuFloats=0;columns=new Float32Array(4096*G);rectValues=new Float32Array(64*q);clip=[0,0,0,0];lost=!1;lostCallback=null;restoredCallback=null;release=Y;static create(e={}){if(typeof document>`u`)return null;let t=document.createElement(`canvas`),r=null;try{r=t.getContext(`webgl2`,{alpha:!0,premultipliedAlpha:!0,antialias:!1,depth:!1,stencil:!1,preserveDrawingBuffer:!1,failIfMajorPerformanceCaveat:e.failIfMajorPerformanceCaveat??!1})}catch(e){return $(e),null}if(!r)return null;try{let i=new n(t,r);return i.release=e.release??Y,i}catch(e){return $(e),Q(r),null}}constructor(e,t){this.canvas=e,this.gl=t,this.kit=new h(t),this.label=Se(t),this.build(),e.addEventListener(`webglcontextlost`,this.handleLost),e.addEventListener(`webglcontextrestored`,this.handleRestored)}build(){let e=this.kit;Object.assign(this,{candleBars:e.program(he,U,X),volumeBars:e.program(ge,U,X),candleColumns:e.program(_e,U,X),volumeColumns:e.program(ve,U,X),rects:e.program(ye,be,X),seriesBuffer:e.buffer(),columnBuffer:e.buffer(),rectBuffer:e.buffer(),drawer:new oe(e),uploads:new r,gpuFloats:0})}onRestored(e){this.restoredCallback=e}onLost(e){this.lostCallback=e,(this.lost||this.gl.isContextLost())&&(this.lost=!0,queueMicrotask(()=>{this.lostCallback===e&&e()}))}recorder(e,t){return V(e,t)}render(e){let t=this.gl;if(this.lost||t.isContextLost())return{series:!1,volume:!1,background:!1,recorded:!1,under:!1};let n=Z(e.recorded)?e.recorded:null,r=Z(e.under)?e.under:null,i={series:e.candles,volume:e.volume!==null,background:e.background!==null,recorded:n!==null,under:r!==null};return t.viewport(0,0,this.canvas.width,this.canvas.height),t.disable(t.SCISSOR_TEST),t.clearColor(0,0,0,0),t.clear(t.COLOR_BUFFER_BIT),t.enable(t.BLEND),e.background&&this.drawBackground(e,e.background),r&&this.drawRecorded(e,r),this.drawSeries(e),n&&this.drawRecorded(e,n),i}drawSeries(t){let n=this.gl,{data:r,viewport:i,dpr:a}=t;if(r.length===0||!t.candles&&!t.volume)return;this.syncSeries(t);let o=Math.max(0,i.visibleRange.from),s=Math.min(i.visibleRange.to,r.length-1);if(s<o)return;let{chartRect:c}=i;this.clip=[c.x*a,c.y*a,(c.x+c.width)*a,(c.y+c.height)*a];let l=Math.floor(this.clip[0]),u=Math.floor(this.clip[1]),d=Math.ceil(this.clip[2])-l,f=Math.ceil(this.clip[3])-u;n.enable(n.SCISSOR_TEST),n.scissor(l,this.canvas.height-u-f,Math.max(0,d),Math.max(0,f)),n.blendFunc(n.ONE,n.ONE_MINUS_SRC_ALPHA);let p=e.f(i),m=p?this.buildColumns(t,o,s):0;t.volume&&this.drawVolume(t,o,s,p,m);let{min:h,max:g}=i.priceRange;t.candles&&g-h!==0&&this.drawCandles(t,o,s,p,m),n.disable(n.SCISSOR_TEST)}drawRecorded(e,t){t.commands.length!==0&&this.drawer.draw(t.commands,this.canvas.width,this.canvas.height,(t,n)=>this.drawRecordedRects(e,t,n))}drawRecordedRects(e,t,n){let r=this.gl,i=this.use(this.rects,e);this.kit.float(i,`u_dpr`,1),this.kit.int(i,`u_union`,0),r.bindBuffer(r.ARRAY_BUFFER,this.rectBuffer),r.bufferData(r.ARRAY_BUFFER,t,r.STREAM_DRAW),this.bindRects(i,0),r.drawArraysInstanced(r.TRIANGLES,0,6,n)}destroy(){this.canvas.removeEventListener(`webglcontextlost`,this.handleLost),this.canvas.removeEventListener(`webglcontextrestored`,this.handleRestored),this.lostCallback=null,this.restoredCallback=null,this.release(),this.release=Y;let e=this.gl;if(e.isContextLost())this.canvas.addEventListener(`webglcontextrestored`,()=>Q(e),{once:!0});else{for(let e of[this.candleBars,this.volumeBars,this.candleColumns,this.volumeColumns,this.rects])this.kit.deleteProgram(e);this.drawer.destroy(),e.deleteBuffer(this.seriesBuffer),e.deleteBuffer(this.columnBuffer),e.deleteBuffer(this.rectBuffer),Q(e)}this.canvas.remove()}handleLost=e=>{e.preventDefault(),!this.lost&&(this.lost=!0,this.release(),this.release=Y,this.lostCallback?.())};handleRestored=()=>{if(!this.lost||this.gl.isContextLost())return;let t=e.n();if(!t){Q(this.gl);return}try{this.build()}catch(e){t(),$(e),Q(this.gl);return}this.release=t,this.lost=!1,this.restoredCallback?.()};syncSeries(e){let t=this.gl,n=this.uploads.sync(e.data,e.seriesRevision),r=this.uploads.values;t.bindBuffer(t.ARRAY_BUFFER,this.seriesBuffer),n.full||r.length!==this.gpuFloats?(t.bufferData(t.ARRAY_BUFFER,r,t.DYNAMIC_DRAW),this.gpuFloats=r.length):n.to>n.from&&t.bufferSubData(t.ARRAY_BUFFER,n.from*W,r,n.from*6,(n.to-n.from)*6)}buildColumns(t,n,r){let{viewport:i,data:a}=t,o=i.barWidth+i.barSpacing,s=-i.offset+i.chartRect.x+i.barWidth/2,c=this.uploads.base,l=0;e.d(a,n,r,e=>e*o+s,e=>{if((l+1)*G>this.columns.length){let e=new Float32Array(this.columns.length*2);e.set(this.columns),this.columns=e}let t=l*G;this.columns[t]=e.x,this.columns[t+1]=e.high-c,this.columns[t+2]=e.low-c,this.columns[t+3]=e.volume,this.columns[t+4]=+(e.close>=e.open),l++});let u=this.gl;return u.bindBuffer(u.ARRAY_BUFFER,this.columnBuffer),u.bufferData(u.ARRAY_BUFFER,this.columns.subarray(0,l*G),u.STREAM_DRAW),l}drawBackground(t,n){let{viewport:r,theme:i}=t,a=e.c(i),o=n.grid?e.l(r,n.marks):{horizontal:[],vertical:[]},s={horizontal:a.horizontal.visible?o.horizontal:[],vertical:a.vertical.visible?o.vertical:[]},c=s.horizontal.length+s.vertical.length,l=c+n.rects.length;if(l===0)return;this.rectValues.length<l*q&&(this.rectValues=new Float32Array(l*q*2));let u=this.rectValues,d=0,m=(e,t,n,r,i,a,o)=>{u[d++]=e,u[d++]=t,u[d++]=n,u[d++]=r;for(let e=0;e<4;e++)u[d++]=i[e]*a;u[d++]=o?o[0]:0,u[d++]=o?o[1]:0},h=p(f(a.horizontal.visible?a.horizontal.color:a.vertical.color)),{chartRect:g}=r;for(let e of s.horizontal)m(g.x,e-.5,g.x+g.width,e+.5,h,1);for(let e of s.vertical)m(e-.5,g.y,e+.5,g.y+g.height,h,1);let _=``,v=h;for(let e of n.rects)e.color!==_&&(_=e.color,v=p(f(e.color))),m(e.x,e.y,e.x+e.width,e.y+e.height,v,e.alpha,e.dash);let y=this.gl,b=this.use(this.rects,t);y.bindBuffer(y.ARRAY_BUFFER,this.rectBuffer),y.bufferData(y.ARRAY_BUFFER,u.subarray(0,d),y.STREAM_DRAW),c>0&&(y.uniform1i(this.loc(b,`u_union`),1),y.blendColor(0,0,0,h[3]),y.blendFuncSeparate(y.ONE,y.ONE_MINUS_SRC_ALPHA,y.CONSTANT_ALPHA,y.ONE_MINUS_SRC_ALPHA),this.bindRects(b,0),y.drawArraysInstanced(y.TRIANGLES,0,6,c)),n.rects.length>0&&(y.uniform1i(this.loc(b,`u_union`),0),y.blendFunc(y.ONE,y.ONE_MINUS_SRC_ALPHA),this.bindRects(b,c),y.drawArraysInstanced(y.TRIANGLES,0,6,n.rects.length))}drawCandles(e,t,n,r,i){let{theme:a,viewport:o,dpr:s}=e,c=p(f(a.candleUp)),l=p(f(a.candleDown));if(r){let t=this.use(this.candleColumns,e);this.vec4(t,`u_upBody`,c),this.vec4(t,`u_downBody`,l),this.bindColumns(t),this.gl.drawArraysInstanced(this.gl.TRIANGLES,0,6,i);return}let u=this.use(this.candleBars,e);this.barUniforms(u,o,t,s),this.vec4(u,`u_upBody`,c),this.vec4(u,`u_downBody`,l),this.vec4(u,`u_upWick`,p(f(a.candleUpWick))),this.vec4(u,`u_downWick`,p(f(a.candleDownWick))),this.bindBars(u,t),this.gl.drawArraysInstanced(this.gl.TRIANGLES,0,12,n-t+1)}drawVolume(e,n,r,i,a){let{data:o,viewport:s,theme:c,dpr:l}=e,u=0;for(let e=n;e<=r;e++)o[e].volume>u&&(u=o[e].volume);if(u===0)return;let{chartRect:d}=s,m=(0,t.resolveVolumeColors)(c),h=this.use(i?this.volumeColumns:this.volumeBars,e);if(this.float(h,`u_volBottom`,d.y+d.height),this.float(h,`u_volScale`,d.height*(e.volume?.heightRatio??.15)/u),this.vec4(h,`u_volUp`,p(f(m.up))),this.vec4(h,`u_volDown`,p(f(m.down))),i){this.bindColumns(h),this.gl.drawArraysInstanced(this.gl.TRIANGLES,0,6,a);return}this.barUniforms(h,s,n,l),this.bindBars(h,n),this.gl.drawArraysInstanced(this.gl.TRIANGLES,0,6,r-n+1)}barUniforms(t,n,r,i){let a=n.barWidth+n.barSpacing,o=-n.offset+n.chartRect.x+n.barWidth/2,{body:s,wick:c}=e.h(n.barWidth,i);this.float(t,`u_x0`,r*a+o),this.float(t,`u_unit`,a),this.float(t,`u_wick`,c),this.float(t,`u_body`,s)}use(e,t){let n=this.gl;this.kit.use(e),n.uniform2f(this.loc(e,`u_canvas`),this.canvas.width,this.canvas.height),this.vec4(e,`u_clip`,this.clip),this.float(e,`u_dpr`,t.dpr);let r=m(t.viewport,this.uploads.base);return n.uniform1i(this.loc(e,`u_log`),r.log),n.uniform1i(this.loc(e,`u_invert`),r.invert),this.float(e,`u_yA`,r.yA),this.float(e,`u_yB`,r.yB),this.float(e,`u_logOffset`,r.logOffset),this.float(e,`u_min`,r.min),this.float(e,`u_logFloor`,r.logFloor),this.float(e,`u_logK`,r.logK),this.float(e,`u_top`,r.top),this.float(e,`u_bottom`,r.bottom),e}bindBars(e,t){let n=this.gl;n.bindBuffer(n.ARRAY_BUFFER,this.seriesBuffer),this.attrib(e,`a_ohlc`,4,W,t*W),this.attrib(e,`a_vd`,2,W,t*W+16)}bindRects(e,t){this.attrib(e,`a_rect`,4,J,t*J),this.attrib(e,`a_color`,4,J,t*J+16),this.attrib(e,`a_dash`,2,J,t*J+32)}bindColumns(e){let t=this.gl;t.bindBuffer(t.ARRAY_BUFFER,this.columnBuffer),this.attrib(e,`a_col`,4,K,0),this.attrib(e,`a_up`,1,K,16)}attrib(e,t,n,r,i){this.kit.attrib(e,t,n,r,i)}float(e,t,n){this.kit.float(e,t,n)}vec4(e,t,n){this.kit.vec4(e,t,n)}loc(e,t){return this.kit.loc(e,t)}};function Z(e){return typeof e==`object`&&!!e&&Array.isArray(e.commands)}function Se(e){let t=String(e.getParameter(e.RENDERER));if(t&&t!==`WebKit WebGL`)return t;let n=e.getExtension(`WEBGL_debug_renderer_info`);return n?String(e.getParameter(n.UNMASKED_RENDERER_WEBGL)):t}function Q(e){e.getExtension(`WEBGL_lose_context`)?.loseContext()}function $(e){console.warn(`TradeCanvas: WebGL renderer unavailable, drawing with Canvas 2D.`,e)}exports.WebGLSeriesRenderer=xe;
429
- //# sourceMappingURL=WebGLSeriesRenderer-CcD5VtQE.cjs.map
429
+ //# sourceMappingURL=WebGLSeriesRenderer-lwJz1WAg.cjs.map