chartgpu-angular 0.0.0-stage → 18.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +123 -2
- package/esm2022/chartgpu-angular.mjs +5 -0
- package/esm2022/lib/chartgpu-angular.component.mjs +288 -0
- package/esm2022/lib/chartgpu-angular.types.mjs +2 -0
- package/esm2022/lib/connect-charts.directive.mjs +64 -0
- package/esm2022/lib/gpu-context.provider.mjs +6 -0
- package/esm2022/lib/gpu-context.service.mjs +78 -0
- package/esm2022/public-api.mjs +6 -0
- package/fesm2022/chartgpu-angular.mjs +435 -0
- package/fesm2022/chartgpu-angular.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/chartgpu-angular.component.d.ts +103 -0
- package/lib/chartgpu-angular.types.d.ts +89 -0
- package/lib/connect-charts.directive.d.ts +16 -0
- package/lib/gpu-context.provider.d.ts +1 -0
- package/lib/gpu-context.service.d.ts +20 -0
- package/package.json +44 -3
- package/public-api.d.ts +5 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { Injectable, computed, signal } from '@angular/core';
|
|
2
|
+
import { createPipelineCache } from 'chartgpu';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
const INITIAL_STATE = {
|
|
5
|
+
adapter: null,
|
|
6
|
+
device: null,
|
|
7
|
+
pipelineCache: null,
|
|
8
|
+
error: null,
|
|
9
|
+
isReady: false,
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Creates one shared WebGPU context and pipeline cache for charts in a dashboard.
|
|
13
|
+
* The device is intentionally not destroyed with the service so charts can share it
|
|
14
|
+
* for the lifetime of the application.
|
|
15
|
+
*/
|
|
16
|
+
export class ChartgpuGPUContextService {
|
|
17
|
+
state = signal(INITIAL_STATE);
|
|
18
|
+
context = computed(() => {
|
|
19
|
+
const state = this.state();
|
|
20
|
+
if (!state.adapter || !state.device || !state.pipelineCache) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
adapter: state.adapter,
|
|
25
|
+
device: state.device,
|
|
26
|
+
pipelineCache: state.pipelineCache,
|
|
27
|
+
};
|
|
28
|
+
});
|
|
29
|
+
initialization;
|
|
30
|
+
initialize() {
|
|
31
|
+
if (!this.initialization) {
|
|
32
|
+
this.initialization = this.createContext();
|
|
33
|
+
}
|
|
34
|
+
return this.initialization;
|
|
35
|
+
}
|
|
36
|
+
async createContext() {
|
|
37
|
+
try {
|
|
38
|
+
if (typeof navigator === 'undefined' || !('gpu' in navigator)) {
|
|
39
|
+
throw new Error('WebGPU not supported in this browser');
|
|
40
|
+
}
|
|
41
|
+
const gpu = navigator.gpu;
|
|
42
|
+
if (!gpu) {
|
|
43
|
+
throw new Error('WebGPU not supported in this browser');
|
|
44
|
+
}
|
|
45
|
+
const adapter = await gpu.requestAdapter({ powerPreference: 'high-performance' });
|
|
46
|
+
if (!adapter) {
|
|
47
|
+
const error = new Error('WebGPU is not available. No compatible GPUAdapter was found.');
|
|
48
|
+
const state = { ...INITIAL_STATE, error };
|
|
49
|
+
this.state.set(state);
|
|
50
|
+
return state;
|
|
51
|
+
}
|
|
52
|
+
const device = await adapter.requestDevice();
|
|
53
|
+
const pipelineCache = createPipelineCache(device);
|
|
54
|
+
const state = {
|
|
55
|
+
adapter,
|
|
56
|
+
device,
|
|
57
|
+
pipelineCache,
|
|
58
|
+
error: null,
|
|
59
|
+
isReady: true,
|
|
60
|
+
};
|
|
61
|
+
this.state.set(state);
|
|
62
|
+
return state;
|
|
63
|
+
}
|
|
64
|
+
catch (cause) {
|
|
65
|
+
const error = cause instanceof Error ? cause : new Error(String(cause));
|
|
66
|
+
const state = { ...INITIAL_STATE, error };
|
|
67
|
+
this.state.set(state);
|
|
68
|
+
return state;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartgpuGPUContextService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
72
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartgpuGPUContextService, providedIn: 'root' });
|
|
73
|
+
}
|
|
74
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartgpuGPUContextService, decorators: [{
|
|
75
|
+
type: Injectable,
|
|
76
|
+
args: [{ providedIn: 'root' }]
|
|
77
|
+
}] });
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3B1LWNvbnRleHQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NoYXJ0Z3B1LWFuZ3VsYXIvc3JjL2xpYi9ncHUtY29udGV4dC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBSS9DLE1BQU0sYUFBYSxHQUE0QjtJQUM3QyxPQUFPLEVBQUUsSUFBSTtJQUNiLE1BQU0sRUFBRSxJQUFJO0lBQ1osYUFBYSxFQUFFLElBQUk7SUFDbkIsS0FBSyxFQUFFLElBQUk7SUFDWCxPQUFPLEVBQUUsS0FBSztDQUNmLENBQUM7QUFFRjs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLHlCQUF5QjtJQUMzQixLQUFLLEdBQUcsTUFBTSxDQUEwQixhQUFhLENBQUMsQ0FBQztJQUN2RCxPQUFPLEdBQUcsUUFBUSxDQUErQixHQUFHLEVBQUU7UUFDN0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM1RCxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtZQUNwQixhQUFhLEVBQUUsS0FBSyxDQUFDLGFBQWE7U0FDbkMsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0lBRUssY0FBYyxDQUFvQztJQUUxRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYTtRQUN6QixJQUFJLENBQUM7WUFDSCxJQUFJLE9BQU8sU0FBUyxLQUFLLFdBQVcsSUFBSSxDQUFDLENBQUMsS0FBSyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQzlELE1BQU0sSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztZQUMxRCxDQUFDO1lBRUQsTUFBTSxHQUFHLEdBQUksU0FNWCxDQUFDLEdBQUcsQ0FBQztZQUNQLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDVCxNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7WUFDMUQsQ0FBQztZQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7WUFDbEYsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNiLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7Z0JBQ3hGLE1BQU0sS0FBSyxHQUE0QixFQUFFLEdBQUcsYUFBYSxFQUFFLEtBQUssRUFBRSxDQUFDO2dCQUNuRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEIsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDN0MsTUFBTSxhQUFhLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEQsTUFBTSxLQUFLLEdBQTRCO2dCQUNyQyxPQUFPO2dCQUNQLE1BQU07Z0JBQ04sYUFBYTtnQkFDYixLQUFLLEVBQUUsSUFBSTtnQkFDWCxPQUFPLEVBQUUsSUFBSTthQUNkLENBQUM7WUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN0QixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sS0FBSyxHQUFHLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDeEUsTUFBTSxLQUFLLEdBQTRCLEVBQUUsR0FBRyxhQUFhLEVBQUUsS0FBSyxFQUFFLENBQUM7WUFDbkUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdEIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQzt3R0FsRVUseUJBQXlCOzRHQUF6Qix5QkFBeUIsY0FEWixNQUFNOzs0RkFDbkIseUJBQXlCO2tCQURyQyxVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGNvbXB1dGVkLCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZVBpcGVsaW5lQ2FjaGUgfSBmcm9tICdjaGFydGdwdSc7XG5pbXBvcnQgdHlwZSB7IENoYXJ0R1BVQ3JlYXRlQ29udGV4dCB9IGZyb20gJ2NoYXJ0Z3B1JztcbmltcG9ydCB0eXBlIHsgQ2hhcnRncHVHUFVDb250ZXh0U3RhdGUgfSBmcm9tICcuL2NoYXJ0Z3B1LWFuZ3VsYXIudHlwZXMnO1xuXG5jb25zdCBJTklUSUFMX1NUQVRFOiBDaGFydGdwdUdQVUNvbnRleHRTdGF0ZSA9IHtcbiAgYWRhcHRlcjogbnVsbCxcbiAgZGV2aWNlOiBudWxsLFxuICBwaXBlbGluZUNhY2hlOiBudWxsLFxuICBlcnJvcjogbnVsbCxcbiAgaXNSZWFkeTogZmFsc2UsXG59O1xuXG4vKipcbiAqIENyZWF0ZXMgb25lIHNoYXJlZCBXZWJHUFUgY29udGV4dCBhbmQgcGlwZWxpbmUgY2FjaGUgZm9yIGNoYXJ0cyBpbiBhIGRhc2hib2FyZC5cbiAqIFRoZSBkZXZpY2UgaXMgaW50ZW50aW9uYWxseSBub3QgZGVzdHJveWVkIHdpdGggdGhlIHNlcnZpY2Ugc28gY2hhcnRzIGNhbiBzaGFyZSBpdFxuICogZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgYXBwbGljYXRpb24uXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgQ2hhcnRncHVHUFVDb250ZXh0U2VydmljZSB7XG4gIHJlYWRvbmx5IHN0YXRlID0gc2lnbmFsPENoYXJ0Z3B1R1BVQ29udGV4dFN0YXRlPihJTklUSUFMX1NUQVRFKTtcbiAgcmVhZG9ubHkgY29udGV4dCA9IGNvbXB1dGVkPENoYXJ0R1BVQ3JlYXRlQ29udGV4dCB8IG51bGw+KCgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMuc3RhdGUoKTtcbiAgICBpZiAoIXN0YXRlLmFkYXB0ZXIgfHwgIXN0YXRlLmRldmljZSB8fCAhc3RhdGUucGlwZWxpbmVDYWNoZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFkYXB0ZXI6IHN0YXRlLmFkYXB0ZXIsXG4gICAgICBkZXZpY2U6IHN0YXRlLmRldmljZSxcbiAgICAgIHBpcGVsaW5lQ2FjaGU6IHN0YXRlLnBpcGVsaW5lQ2FjaGUsXG4gICAgfTtcbiAgfSk7XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXphdGlvbj86IFByb21pc2U8Q2hhcnRncHVHUFVDb250ZXh0U3RhdGU+O1xuXG4gIGluaXRpYWxpemUoKTogUHJvbWlzZTxDaGFydGdwdUdQVUNvbnRleHRTdGF0ZT4ge1xuICAgIGlmICghdGhpcy5pbml0aWFsaXphdGlvbikge1xuICAgICAgdGhpcy5pbml0aWFsaXphdGlvbiA9IHRoaXMuY3JlYXRlQ29udGV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pbml0aWFsaXphdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlQ29udGV4dCgpOiBQcm9taXNlPENoYXJ0Z3B1R1BVQ29udGV4dFN0YXRlPiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAndW5kZWZpbmVkJyB8fCAhKCdncHUnIGluIG5hdmlnYXRvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWJHUFUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXInKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ3B1ID0gKG5hdmlnYXRvciBhcyBOYXZpZ2F0b3IgJiB7XG4gICAgICAgIGdwdT86IHtcbiAgICAgICAgICByZXF1ZXN0QWRhcHRlcihvcHRpb25zOiB7XG4gICAgICAgICAgICBwb3dlclByZWZlcmVuY2U6ICdoaWdoLXBlcmZvcm1hbmNlJztcbiAgICAgICAgICB9KTogUHJvbWlzZTxDaGFydEdQVUNyZWF0ZUNvbnRleHRbJ2FkYXB0ZXInXSB8IG51bGw+O1xuICAgICAgICB9O1xuICAgICAgfSkuZ3B1O1xuICAgICAgaWYgKCFncHUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWJHUFUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXInKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWRhcHRlciA9IGF3YWl0IGdwdS5yZXF1ZXN0QWRhcHRlcih7IHBvd2VyUHJlZmVyZW5jZTogJ2hpZ2gtcGVyZm9ybWFuY2UnIH0pO1xuICAgICAgaWYgKCFhZGFwdGVyKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdXZWJHUFUgaXMgbm90IGF2YWlsYWJsZS4gTm8gY29tcGF0aWJsZSBHUFVBZGFwdGVyIHdhcyBmb3VuZC4nKTtcbiAgICAgICAgY29uc3Qgc3RhdGU6IENoYXJ0Z3B1R1BVQ29udGV4dFN0YXRlID0geyAuLi5JTklUSUFMX1NUQVRFLCBlcnJvciB9O1xuICAgICAgICB0aGlzLnN0YXRlLnNldChzdGF0ZSk7XG4gICAgICAgIHJldHVybiBzdGF0ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGV2aWNlID0gYXdhaXQgYWRhcHRlci5yZXF1ZXN0RGV2aWNlKCk7XG4gICAgICBjb25zdCBwaXBlbGluZUNhY2hlID0gY3JlYXRlUGlwZWxpbmVDYWNoZShkZXZpY2UpO1xuICAgICAgY29uc3Qgc3RhdGU6IENoYXJ0Z3B1R1BVQ29udGV4dFN0YXRlID0ge1xuICAgICAgICBhZGFwdGVyLFxuICAgICAgICBkZXZpY2UsXG4gICAgICAgIHBpcGVsaW5lQ2FjaGUsXG4gICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICBpc1JlYWR5OiB0cnVlLFxuICAgICAgfTtcbiAgICAgIHRoaXMuc3RhdGUuc2V0KHN0YXRlKTtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9IGNhdGNoIChjYXVzZTogdW5rbm93bikge1xuICAgICAgY29uc3QgZXJyb3IgPSBjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UgOiBuZXcgRXJyb3IoU3RyaW5nKGNhdXNlKSk7XG4gICAgICBjb25zdCBzdGF0ZTogQ2hhcnRncHVHUFVDb250ZXh0U3RhdGUgPSB7IC4uLklOSVRJQUxfU1RBVEUsIGVycm9yIH07XG4gICAgICB0aGlzLnN0YXRlLnNldChzdGF0ZSk7XG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './lib/chartgpu-angular.component';
|
|
2
|
+
export * from './lib/chartgpu-angular.types';
|
|
3
|
+
export * from './lib/connect-charts.directive';
|
|
4
|
+
export * from './lib/gpu-context.provider';
|
|
5
|
+
export * from './lib/gpu-context.service';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2NoYXJ0Z3B1LWFuZ3VsYXIvc3JjL3B1YmxpYy1hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDJCQUEyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9saWIvY2hhcnRncHUtYW5ndWxhci5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY2hhcnRncHUtYW5ndWxhci50eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb25uZWN0LWNoYXJ0cy5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZ3B1LWNvbnRleHQucHJvdmlkZXInO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZ3B1LWNvbnRleHQuc2VydmljZSc7XG4iXX0=
|
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
import { NgStyle } from '@angular/common';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { input, output, viewChild, signal, afterNextRender, effect, untracked, Component, ChangeDetectionStrategy, Directive, computed, Injectable, makeEnvironmentProviders } from '@angular/core';
|
|
4
|
+
import { ChartGPU, connectCharts, createPipelineCache } from 'chartgpu';
|
|
5
|
+
|
|
6
|
+
class ChartGpuAngularComponent {
|
|
7
|
+
destroyRef;
|
|
8
|
+
options = input.required();
|
|
9
|
+
gpuContext = input(null);
|
|
10
|
+
theme = input(undefined);
|
|
11
|
+
className = input();
|
|
12
|
+
style = input();
|
|
13
|
+
ready = output();
|
|
14
|
+
chartReady = output();
|
|
15
|
+
chartDispose = output();
|
|
16
|
+
resize = output();
|
|
17
|
+
click = output();
|
|
18
|
+
chartClick = output();
|
|
19
|
+
mouseOver = output();
|
|
20
|
+
mouseOut = output();
|
|
21
|
+
crosshairMove = output();
|
|
22
|
+
dataAppend = output();
|
|
23
|
+
zoomChange = output();
|
|
24
|
+
zoomRangeChange = output();
|
|
25
|
+
deviceLost = output();
|
|
26
|
+
chartError = output();
|
|
27
|
+
host = viewChild('host');
|
|
28
|
+
canvasHost = viewChild('canvasHost');
|
|
29
|
+
chartInstance = signal(null);
|
|
30
|
+
initializationError = signal(null);
|
|
31
|
+
chartContainer;
|
|
32
|
+
createdWithOptions;
|
|
33
|
+
resizeTimeout;
|
|
34
|
+
resizeObserver;
|
|
35
|
+
removeChartListeners;
|
|
36
|
+
destroying = false;
|
|
37
|
+
constructor(destroyRef) {
|
|
38
|
+
this.destroyRef = destroyRef;
|
|
39
|
+
this.destroyRef.onDestroy(() => {
|
|
40
|
+
this.resizeObserver?.disconnect();
|
|
41
|
+
if (this.resizeTimeout !== undefined) {
|
|
42
|
+
clearTimeout(this.resizeTimeout);
|
|
43
|
+
}
|
|
44
|
+
this.disposeChart();
|
|
45
|
+
});
|
|
46
|
+
afterNextRender(() => {
|
|
47
|
+
const container = this.host()?.nativeElement;
|
|
48
|
+
if (container) {
|
|
49
|
+
this.observeResize(container);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
effect(onCleanup => {
|
|
53
|
+
const container = this.canvasHost()?.nativeElement;
|
|
54
|
+
const options = this.options();
|
|
55
|
+
const gpuContext = this.gpuContext();
|
|
56
|
+
const theme = this.theme();
|
|
57
|
+
this.initializationError.set(null);
|
|
58
|
+
if (!container) {
|
|
59
|
+
this.disposeChart();
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (typeof navigator === 'undefined' || !('gpu' in navigator)) {
|
|
63
|
+
this.reportError(new Error('WebGPU not supported in this browser'));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (untracked(() => this.chartInstance()) && this.chartContainer === container) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
let cancelled = false;
|
|
70
|
+
let createdInstance;
|
|
71
|
+
const initialOptions = this.getEffectiveOptions(options, theme);
|
|
72
|
+
void (gpuContext
|
|
73
|
+
? ChartGPU.create(container, initialOptions, gpuContext)
|
|
74
|
+
: ChartGPU.create(container, initialOptions)).then(instance => {
|
|
75
|
+
createdInstance = instance;
|
|
76
|
+
if (cancelled) {
|
|
77
|
+
instance.dispose();
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const latest = untracked(() => ({
|
|
82
|
+
options: this.options(),
|
|
83
|
+
theme: this.theme(),
|
|
84
|
+
}));
|
|
85
|
+
if (latest.options !== options || latest.theme !== theme) {
|
|
86
|
+
instance.setOption(this.getEffectiveOptions(latest.options, latest.theme));
|
|
87
|
+
}
|
|
88
|
+
this.createdWithOptions = latest;
|
|
89
|
+
this.chartContainer = container;
|
|
90
|
+
this.chartInstance.set(instance);
|
|
91
|
+
this.removeChartListeners = this.listenToChart(instance);
|
|
92
|
+
this.ready.emit({ container });
|
|
93
|
+
this.chartReady.emit(instance);
|
|
94
|
+
const range = instance.getZoomRange();
|
|
95
|
+
if (range) {
|
|
96
|
+
this.emitZoomRange(range);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
catch (cause) {
|
|
100
|
+
instance.dispose();
|
|
101
|
+
throw cause;
|
|
102
|
+
}
|
|
103
|
+
}).catch((cause) => {
|
|
104
|
+
if (cancelled) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (createdInstance && this.chartInstance() !== createdInstance && !createdInstance.disposed) {
|
|
108
|
+
createdInstance.dispose();
|
|
109
|
+
}
|
|
110
|
+
this.reportError(cause);
|
|
111
|
+
});
|
|
112
|
+
onCleanup(() => {
|
|
113
|
+
cancelled = true;
|
|
114
|
+
if (this.chartContainer === container) {
|
|
115
|
+
this.disposeChart();
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}, { allowSignalWrites: true });
|
|
119
|
+
effect(() => {
|
|
120
|
+
const options = this.options();
|
|
121
|
+
const theme = this.theme();
|
|
122
|
+
const instance = this.chartInstance();
|
|
123
|
+
if (!instance || instance.disposed) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (this.createdWithOptions?.options === options && this.createdWithOptions.theme === theme) {
|
|
127
|
+
this.createdWithOptions = undefined;
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
instance.setOption(this.getEffectiveOptions(options, theme));
|
|
132
|
+
}
|
|
133
|
+
catch (cause) {
|
|
134
|
+
this.reportError(cause);
|
|
135
|
+
}
|
|
136
|
+
}, { allowSignalWrites: true });
|
|
137
|
+
}
|
|
138
|
+
emitClick(event) {
|
|
139
|
+
this.click.emit({ x: event.offsetX, y: event.offsetY });
|
|
140
|
+
}
|
|
141
|
+
ngOnDestroy() {
|
|
142
|
+
this.destroying = true;
|
|
143
|
+
}
|
|
144
|
+
getChart() {
|
|
145
|
+
const instance = this.chartInstance();
|
|
146
|
+
return instance && !instance.disposed ? instance : null;
|
|
147
|
+
}
|
|
148
|
+
getContainer() {
|
|
149
|
+
return this.canvasHost()?.nativeElement ?? null;
|
|
150
|
+
}
|
|
151
|
+
appendData(seriesIndex, newPoints, options) {
|
|
152
|
+
this.getChart()?.appendData(seriesIndex, newPoints, options);
|
|
153
|
+
}
|
|
154
|
+
renderFrame() {
|
|
155
|
+
return this.getChart()?.renderFrame() ?? false;
|
|
156
|
+
}
|
|
157
|
+
needsRender() {
|
|
158
|
+
return this.getChart()?.needsRender() ?? false;
|
|
159
|
+
}
|
|
160
|
+
getRenderMode() {
|
|
161
|
+
return this.getChart()?.getRenderMode() ?? 'auto';
|
|
162
|
+
}
|
|
163
|
+
setRenderMode(mode) {
|
|
164
|
+
this.getChart()?.setRenderMode(mode);
|
|
165
|
+
}
|
|
166
|
+
setOption(options) {
|
|
167
|
+
this.getChart()?.setOption(options);
|
|
168
|
+
}
|
|
169
|
+
setZoomRange(start, end, source) {
|
|
170
|
+
this.getChart()?.setZoomRange(start, end, source);
|
|
171
|
+
}
|
|
172
|
+
setInteractionX(x, source) {
|
|
173
|
+
this.getChart()?.setInteractionX(x, source);
|
|
174
|
+
}
|
|
175
|
+
getInteractionX() {
|
|
176
|
+
return this.getChart()?.getInteractionX() ?? null;
|
|
177
|
+
}
|
|
178
|
+
hitTest(event) {
|
|
179
|
+
return this.getChart()?.hitTest(event) ?? null;
|
|
180
|
+
}
|
|
181
|
+
getEffectiveOptions(options, theme) {
|
|
182
|
+
return theme !== undefined ? { ...options, theme } : options;
|
|
183
|
+
}
|
|
184
|
+
listenToChart(instance) {
|
|
185
|
+
const click = (payload) => this.chartClick.emit(payload);
|
|
186
|
+
const mouseOver = (payload) => this.mouseOver.emit(payload);
|
|
187
|
+
const mouseOut = (payload) => this.mouseOut.emit(payload);
|
|
188
|
+
const crosshairMove = (payload) => this.crosshairMove.emit(payload);
|
|
189
|
+
const dataAppend = (payload) => this.dataAppend.emit(payload);
|
|
190
|
+
const zoomChange = (payload) => this.emitZoomRange(payload);
|
|
191
|
+
const deviceLost = (payload) => this.deviceLost.emit(payload);
|
|
192
|
+
instance.on('click', click);
|
|
193
|
+
instance.on('mouseover', mouseOver);
|
|
194
|
+
instance.on('mouseout', mouseOut);
|
|
195
|
+
instance.on('crosshairMove', crosshairMove);
|
|
196
|
+
instance.on('dataAppend', dataAppend);
|
|
197
|
+
instance.on('zoomRangeChange', zoomChange);
|
|
198
|
+
instance.on('deviceLost', deviceLost);
|
|
199
|
+
return () => {
|
|
200
|
+
if (instance.disposed) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
instance.off('click', click);
|
|
204
|
+
instance.off('mouseover', mouseOver);
|
|
205
|
+
instance.off('mouseout', mouseOut);
|
|
206
|
+
instance.off('crosshairMove', crosshairMove);
|
|
207
|
+
instance.off('dataAppend', dataAppend);
|
|
208
|
+
instance.off('zoomRangeChange', zoomChange);
|
|
209
|
+
instance.off('deviceLost', deviceLost);
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
emitZoomRange(range) {
|
|
213
|
+
this.zoomChange.emit({ range: { start: range.start, end: range.end } });
|
|
214
|
+
this.zoomRangeChange.emit({ start: range.start, end: range.end });
|
|
215
|
+
}
|
|
216
|
+
observeResize(container) {
|
|
217
|
+
if (typeof ResizeObserver === 'undefined') {
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
this.resizeObserver = new ResizeObserver(entries => {
|
|
221
|
+
const entry = entries[0];
|
|
222
|
+
if (!entry) {
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
const { width, height } = entry.contentRect;
|
|
226
|
+
this.resize.emit({ width, height, container });
|
|
227
|
+
if (this.resizeTimeout !== undefined) {
|
|
228
|
+
clearTimeout(this.resizeTimeout);
|
|
229
|
+
}
|
|
230
|
+
this.resizeTimeout = setTimeout(() => {
|
|
231
|
+
this.chartInstance()?.resize();
|
|
232
|
+
this.resizeTimeout = undefined;
|
|
233
|
+
}, 100);
|
|
234
|
+
});
|
|
235
|
+
this.resizeObserver.observe(container);
|
|
236
|
+
}
|
|
237
|
+
reportError(cause) {
|
|
238
|
+
const error = cause instanceof Error ? cause : new Error(String(cause));
|
|
239
|
+
this.initializationError.set(error);
|
|
240
|
+
this.chartError.emit(error);
|
|
241
|
+
}
|
|
242
|
+
disposeChart() {
|
|
243
|
+
const instance = this.chartInstance();
|
|
244
|
+
this.removeChartListeners?.();
|
|
245
|
+
this.removeChartListeners = undefined;
|
|
246
|
+
if (instance && !instance.disposed) {
|
|
247
|
+
instance.dispose();
|
|
248
|
+
if (!this.destroying) {
|
|
249
|
+
this.chartDispose.emit();
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
this.chartInstance.set(null);
|
|
253
|
+
this.chartContainer = undefined;
|
|
254
|
+
this.createdWithOptions = undefined;
|
|
255
|
+
}
|
|
256
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartGpuAngularComponent, deps: [{ token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
257
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChartGpuAngularComponent, isStandalone: true, selector: "lib-chartgpu-angular", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: true, transformFunction: null }, gpuContext: { classPropertyName: "gpuContext", publicName: "gpuContext", isSignal: true, isRequired: false, transformFunction: null }, theme: { classPropertyName: "theme", publicName: "theme", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { ready: "ready", chartReady: "chartReady", chartDispose: "chartDispose", resize: "resize", click: "click", chartClick: "chartClick", mouseOver: "mouseOver", mouseOut: "mouseOut", crosshairMove: "crosshairMove", dataAppend: "dataAppend", zoomChange: "zoomChange", zoomRangeChange: "zoomRangeChange", deviceLost: "deviceLost", chartError: "chartError" }, host: { classAttribute: "chartgpu-angular" }, viewQueries: [{ propertyName: "host", first: true, predicate: ["host"], descendants: true, isSignal: true }, { propertyName: "canvasHost", first: true, predicate: ["canvasHost"], descendants: true, isSignal: true }], ngImport: i0, template: `
|
|
258
|
+
<div
|
|
259
|
+
#host
|
|
260
|
+
class="chartgpu-host"
|
|
261
|
+
[class]="className() ?? ''"
|
|
262
|
+
[ngStyle]="style()"
|
|
263
|
+
(click)="emitClick($event)"
|
|
264
|
+
>
|
|
265
|
+
<div #canvasHost class="chartgpu-canvas-host"></div>
|
|
266
|
+
@if (initializationError(); as error) {
|
|
267
|
+
<div class="chartgpu-error" role="alert">{{ error.message }}</div>
|
|
268
|
+
}
|
|
269
|
+
</div>
|
|
270
|
+
`, isInline: true, styles: [":host{display:block;width:100%;height:100%}.chartgpu-host{position:relative;width:100%;height:100%}.chartgpu-canvas-host{position:absolute;inset:0}.chartgpu-error{position:absolute;inset:0;display:grid;place-items:center;padding:1rem;text-align:center}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
271
|
+
}
|
|
272
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartGpuAngularComponent, decorators: [{
|
|
273
|
+
type: Component,
|
|
274
|
+
args: [{ selector: 'lib-chartgpu-angular', standalone: true, imports: [NgStyle], changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'chartgpu-angular' }, template: `
|
|
275
|
+
<div
|
|
276
|
+
#host
|
|
277
|
+
class="chartgpu-host"
|
|
278
|
+
[class]="className() ?? ''"
|
|
279
|
+
[ngStyle]="style()"
|
|
280
|
+
(click)="emitClick($event)"
|
|
281
|
+
>
|
|
282
|
+
<div #canvasHost class="chartgpu-canvas-host"></div>
|
|
283
|
+
@if (initializationError(); as error) {
|
|
284
|
+
<div class="chartgpu-error" role="alert">{{ error.message }}</div>
|
|
285
|
+
}
|
|
286
|
+
</div>
|
|
287
|
+
`, styles: [":host{display:block;width:100%;height:100%}.chartgpu-host{position:relative;width:100%;height:100%}.chartgpu-canvas-host{position:absolute;inset:0}.chartgpu-error{position:absolute;inset:0;display:grid;place-items:center;padding:1rem;text-align:center}\n"] }]
|
|
288
|
+
}], ctorParameters: () => [{ type: i0.DestroyRef }] });
|
|
289
|
+
|
|
290
|
+
class ChartgpuConnectChartsDirective {
|
|
291
|
+
charts = input([], {
|
|
292
|
+
alias: 'libChartgpuConnectCharts',
|
|
293
|
+
});
|
|
294
|
+
syncOptions = input();
|
|
295
|
+
connectionError = output();
|
|
296
|
+
ids = new WeakMap();
|
|
297
|
+
nextId = 1;
|
|
298
|
+
signature;
|
|
299
|
+
constructor() {
|
|
300
|
+
effect(onCleanup => {
|
|
301
|
+
const charts = this.charts();
|
|
302
|
+
const options = this.syncOptions();
|
|
303
|
+
const optionsSignature = options
|
|
304
|
+
? `crosshair=${options.syncCrosshair ?? ''},zoom=${options.syncZoom ?? ''}`
|
|
305
|
+
: '';
|
|
306
|
+
const signature = `${charts.map(chart => {
|
|
307
|
+
if (!chart) {
|
|
308
|
+
return 'null';
|
|
309
|
+
}
|
|
310
|
+
let id = this.ids.get(chart);
|
|
311
|
+
if (id === undefined) {
|
|
312
|
+
id = this.nextId++;
|
|
313
|
+
this.ids.set(chart, id);
|
|
314
|
+
}
|
|
315
|
+
return `${id}:${chart.disposed ? 1 : 0}`;
|
|
316
|
+
}).join('|')}|${optionsSignature}`;
|
|
317
|
+
if (signature === this.signature) {
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
this.signature = signature;
|
|
321
|
+
if (charts.length === 0 || charts.some(chart => !chart || chart.disposed)) {
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
const resolved = [];
|
|
325
|
+
for (const chart of charts) {
|
|
326
|
+
if (!chart || chart.disposed) {
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
resolved.push(chart);
|
|
330
|
+
}
|
|
331
|
+
try {
|
|
332
|
+
const disconnect = connectCharts(resolved, options);
|
|
333
|
+
onCleanup(disconnect);
|
|
334
|
+
}
|
|
335
|
+
catch (cause) {
|
|
336
|
+
this.connectionError.emit(cause instanceof Error ? cause : new Error(String(cause)));
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartgpuConnectChartsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
341
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: ChartgpuConnectChartsDirective, isStandalone: true, selector: "[libChartgpuConnectCharts]", inputs: { charts: { classPropertyName: "charts", publicName: "libChartgpuConnectCharts", isSignal: true, isRequired: false, transformFunction: null }, syncOptions: { classPropertyName: "syncOptions", publicName: "syncOptions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { connectionError: "connectionError" }, ngImport: i0 });
|
|
342
|
+
}
|
|
343
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartgpuConnectChartsDirective, decorators: [{
|
|
344
|
+
type: Directive,
|
|
345
|
+
args: [{
|
|
346
|
+
selector: '[libChartgpuConnectCharts]',
|
|
347
|
+
standalone: true,
|
|
348
|
+
}]
|
|
349
|
+
}], ctorParameters: () => [] });
|
|
350
|
+
|
|
351
|
+
const INITIAL_STATE = {
|
|
352
|
+
adapter: null,
|
|
353
|
+
device: null,
|
|
354
|
+
pipelineCache: null,
|
|
355
|
+
error: null,
|
|
356
|
+
isReady: false,
|
|
357
|
+
};
|
|
358
|
+
/**
|
|
359
|
+
* Creates one shared WebGPU context and pipeline cache for charts in a dashboard.
|
|
360
|
+
* The device is intentionally not destroyed with the service so charts can share it
|
|
361
|
+
* for the lifetime of the application.
|
|
362
|
+
*/
|
|
363
|
+
class ChartgpuGPUContextService {
|
|
364
|
+
state = signal(INITIAL_STATE);
|
|
365
|
+
context = computed(() => {
|
|
366
|
+
const state = this.state();
|
|
367
|
+
if (!state.adapter || !state.device || !state.pipelineCache) {
|
|
368
|
+
return null;
|
|
369
|
+
}
|
|
370
|
+
return {
|
|
371
|
+
adapter: state.adapter,
|
|
372
|
+
device: state.device,
|
|
373
|
+
pipelineCache: state.pipelineCache,
|
|
374
|
+
};
|
|
375
|
+
});
|
|
376
|
+
initialization;
|
|
377
|
+
initialize() {
|
|
378
|
+
if (!this.initialization) {
|
|
379
|
+
this.initialization = this.createContext();
|
|
380
|
+
}
|
|
381
|
+
return this.initialization;
|
|
382
|
+
}
|
|
383
|
+
async createContext() {
|
|
384
|
+
try {
|
|
385
|
+
if (typeof navigator === 'undefined' || !('gpu' in navigator)) {
|
|
386
|
+
throw new Error('WebGPU not supported in this browser');
|
|
387
|
+
}
|
|
388
|
+
const gpu = navigator.gpu;
|
|
389
|
+
if (!gpu) {
|
|
390
|
+
throw new Error('WebGPU not supported in this browser');
|
|
391
|
+
}
|
|
392
|
+
const adapter = await gpu.requestAdapter({ powerPreference: 'high-performance' });
|
|
393
|
+
if (!adapter) {
|
|
394
|
+
const error = new Error('WebGPU is not available. No compatible GPUAdapter was found.');
|
|
395
|
+
const state = { ...INITIAL_STATE, error };
|
|
396
|
+
this.state.set(state);
|
|
397
|
+
return state;
|
|
398
|
+
}
|
|
399
|
+
const device = await adapter.requestDevice();
|
|
400
|
+
const pipelineCache = createPipelineCache(device);
|
|
401
|
+
const state = {
|
|
402
|
+
adapter,
|
|
403
|
+
device,
|
|
404
|
+
pipelineCache,
|
|
405
|
+
error: null,
|
|
406
|
+
isReady: true,
|
|
407
|
+
};
|
|
408
|
+
this.state.set(state);
|
|
409
|
+
return state;
|
|
410
|
+
}
|
|
411
|
+
catch (cause) {
|
|
412
|
+
const error = cause instanceof Error ? cause : new Error(String(cause));
|
|
413
|
+
const state = { ...INITIAL_STATE, error };
|
|
414
|
+
this.state.set(state);
|
|
415
|
+
return state;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartgpuGPUContextService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
419
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartgpuGPUContextService, providedIn: 'root' });
|
|
420
|
+
}
|
|
421
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChartgpuGPUContextService, decorators: [{
|
|
422
|
+
type: Injectable,
|
|
423
|
+
args: [{ providedIn: 'root' }]
|
|
424
|
+
}] });
|
|
425
|
+
|
|
426
|
+
function provideChartGpuContext() {
|
|
427
|
+
return makeEnvironmentProviders([ChartgpuGPUContextService]);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Generated bundle index. Do not edit.
|
|
432
|
+
*/
|
|
433
|
+
|
|
434
|
+
export { ChartGpuAngularComponent, ChartgpuConnectChartsDirective, ChartgpuGPUContextService, provideChartGpuContext };
|
|
435
|
+
//# sourceMappingURL=chartgpu-angular.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chartgpu-angular.mjs","sources":["../../../projects/chartgpu-angular/src/lib/chartgpu-angular.component.ts","../../../projects/chartgpu-angular/src/lib/connect-charts.directive.ts","../../../projects/chartgpu-angular/src/lib/gpu-context.service.ts","../../../projects/chartgpu-angular/src/lib/gpu-context.provider.ts","../../../projects/chartgpu-angular/src/chartgpu-angular.ts"],"sourcesContent":["import { NgStyle } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n OnDestroy,\n afterNextRender,\n effect,\n input,\n output,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport {\n ChartGPU,\n type ChartGPUCrosshairMovePayload,\n type ChartGPUDeviceLostPayload,\n type ChartGPUEventPayload,\n type ChartGPUInstance,\n type ChartGPUZoomRangeChangePayload,\n type OHLCDataPoint,\n} from 'chartgpu';\nimport type {\n ChartgpuAppendDataOptions,\n ChartgpuCartesianSeriesData,\n ChartgpuChartHandle,\n ChartgpuClickEvent,\n ChartgpuDataAppendEvent,\n ChartgpuGPUContext,\n ChartgpuOptions,\n ChartgpuReadyEvent,\n ChartgpuResizeEvent,\n ChartgpuStyle,\n ChartgpuZoomChangeEvent,\n ChartgpuZoomRangeChangeEvent,\n} from './chartgpu-angular.types';\n\n@Component({\n selector: 'lib-chartgpu-angular',\n standalone: true,\n imports: [NgStyle],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'chartgpu-angular' },\n template: `\n <div\n #host\n class=\"chartgpu-host\"\n [class]=\"className() ?? ''\"\n [ngStyle]=\"style()\"\n (click)=\"emitClick($event)\"\n >\n <div #canvasHost class=\"chartgpu-canvas-host\"></div>\n @if (initializationError(); as error) {\n <div class=\"chartgpu-error\" role=\"alert\">{{ error.message }}</div>\n }\n </div>\n `,\n styles: [`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n }\n\n .chartgpu-host {\n position: relative;\n width: 100%;\n height: 100%;\n }\n\n .chartgpu-canvas-host {\n position: absolute;\n inset: 0;\n }\n\n .chartgpu-error {\n position: absolute;\n inset: 0;\n display: grid;\n place-items: center;\n padding: 1rem;\n text-align: center;\n }\n `],\n})\nexport class ChartGpuAngularComponent implements ChartgpuChartHandle, OnDestroy {\n readonly options = input.required<ChartgpuOptions>();\n readonly gpuContext = input<ChartgpuGPUContext | null>(null);\n readonly theme = input<ChartgpuOptions['theme'] | undefined>(undefined);\n readonly className = input<string | undefined>();\n readonly style = input<ChartgpuStyle | undefined>();\n\n readonly ready = output<ChartgpuReadyEvent>();\n readonly chartReady = output<ChartGPUInstance>();\n readonly chartDispose = output<void>();\n readonly resize = output<ChartgpuResizeEvent>();\n readonly click = output<ChartgpuClickEvent>();\n readonly chartClick = output<ChartGPUEventPayload>();\n readonly mouseOver = output<ChartGPUEventPayload>();\n readonly mouseOut = output<ChartGPUEventPayload>();\n readonly crosshairMove = output<ChartGPUCrosshairMovePayload>();\n readonly dataAppend = output<ChartgpuDataAppendEvent>();\n readonly zoomChange = output<ChartgpuZoomChangeEvent>();\n readonly zoomRangeChange = output<ChartgpuZoomRangeChangeEvent>();\n readonly deviceLost = output<ChartGPUDeviceLostPayload>();\n readonly chartError = output<Error>();\n\n readonly host = viewChild<ElementRef<HTMLDivElement>>('host');\n readonly canvasHost = viewChild<ElementRef<HTMLDivElement>>('canvasHost');\n\n private readonly chartInstance = signal<ChartGPUInstance | null>(null);\n readonly initializationError = signal<Error | null>(null);\n private chartContainer?: HTMLDivElement;\n private createdWithOptions?: {\n options: ChartgpuOptions;\n theme: ChartgpuOptions['theme'] | undefined;\n };\n private resizeTimeout?: ReturnType<typeof setTimeout>;\n private resizeObserver?: ResizeObserver;\n private removeChartListeners?: () => void;\n private destroying = false;\n\n constructor(private readonly destroyRef: DestroyRef) {\n this.destroyRef.onDestroy(() => {\n this.resizeObserver?.disconnect();\n if (this.resizeTimeout !== undefined) {\n clearTimeout(this.resizeTimeout);\n }\n this.disposeChart();\n });\n\n afterNextRender(() => {\n const container = this.host()?.nativeElement;\n if (container) {\n this.observeResize(container);\n }\n });\n\n effect(onCleanup => {\n const container = this.canvasHost()?.nativeElement;\n const options = this.options();\n const gpuContext = this.gpuContext();\n const theme = this.theme();\n\n this.initializationError.set(null);\n if (!container) {\n this.disposeChart();\n return;\n }\n if (typeof navigator === 'undefined' || !('gpu' in navigator)) {\n this.reportError(new Error('WebGPU not supported in this browser'));\n return;\n }\n\n if (untracked(() => this.chartInstance()) && this.chartContainer === container) {\n return;\n }\n\n let cancelled = false;\n let createdInstance: ChartGPUInstance | undefined;\n const initialOptions = this.getEffectiveOptions(options, theme);\n\n void (gpuContext\n ? ChartGPU.create(container, initialOptions, gpuContext)\n : ChartGPU.create(container, initialOptions)\n ).then(instance => {\n createdInstance = instance;\n if (cancelled) {\n instance.dispose();\n return;\n }\n\n try {\n const latest = untracked(() => ({\n options: this.options(),\n theme: this.theme(),\n }));\n if (latest.options !== options || latest.theme !== theme) {\n instance.setOption(this.getEffectiveOptions(latest.options, latest.theme));\n }\n\n this.createdWithOptions = latest;\n this.chartContainer = container;\n this.chartInstance.set(instance);\n this.removeChartListeners = this.listenToChart(instance);\n this.ready.emit({ container });\n this.chartReady.emit(instance);\n\n const range = instance.getZoomRange();\n if (range) {\n this.emitZoomRange(range);\n }\n } catch (cause: unknown) {\n instance.dispose();\n throw cause;\n }\n }).catch((cause: unknown) => {\n if (cancelled) {\n return;\n }\n if (createdInstance && this.chartInstance() !== createdInstance && !createdInstance.disposed) {\n createdInstance.dispose();\n }\n this.reportError(cause);\n });\n\n onCleanup(() => {\n cancelled = true;\n if (this.chartContainer === container) {\n this.disposeChart();\n }\n });\n }, { allowSignalWrites: true });\n\n effect(() => {\n const options = this.options();\n const theme = this.theme();\n const instance = this.chartInstance();\n if (!instance || instance.disposed) {\n return;\n }\n\n if (this.createdWithOptions?.options === options && this.createdWithOptions.theme === theme) {\n this.createdWithOptions = undefined;\n return;\n }\n\n try {\n instance.setOption(this.getEffectiveOptions(options, theme));\n } catch (cause: unknown) {\n this.reportError(cause);\n }\n }, { allowSignalWrites: true });\n }\n\n protected emitClick(event: MouseEvent): void {\n this.click.emit({ x: event.offsetX, y: event.offsetY });\n }\n\n ngOnDestroy(): void {\n this.destroying = true;\n }\n\n getChart(): ChartGPUInstance | null {\n const instance = this.chartInstance();\n return instance && !instance.disposed ? instance : null;\n }\n\n getContainer(): HTMLDivElement | null {\n return this.canvasHost()?.nativeElement ?? null;\n }\n\n appendData(\n seriesIndex: number,\n newPoints: ChartgpuCartesianSeriesData | OHLCDataPoint[],\n options?: ChartgpuAppendDataOptions,\n ): void {\n this.getChart()?.appendData(seriesIndex, newPoints, options);\n }\n\n renderFrame(): boolean {\n return this.getChart()?.renderFrame() ?? false;\n }\n\n needsRender(): boolean {\n return this.getChart()?.needsRender() ?? false;\n }\n\n getRenderMode(): 'auto' | 'external' {\n return this.getChart()?.getRenderMode() ?? 'auto';\n }\n\n setRenderMode(mode: 'auto' | 'external'): void {\n this.getChart()?.setRenderMode(mode);\n }\n\n setOption(options: ChartgpuOptions): void {\n this.getChart()?.setOption(options);\n }\n\n setZoomRange(start: number, end: number, source?: unknown): void {\n this.getChart()?.setZoomRange(start, end, source);\n }\n\n setInteractionX(x: number | null, source?: unknown): void {\n this.getChart()?.setInteractionX(x, source);\n }\n\n getInteractionX(): number | null {\n return this.getChart()?.getInteractionX() ?? null;\n }\n\n hitTest(event: PointerEvent | MouseEvent) {\n return this.getChart()?.hitTest(event) ?? null;\n }\n\n private getEffectiveOptions(\n options: ChartgpuOptions,\n theme: ChartgpuOptions['theme'] | undefined,\n ): ChartgpuOptions {\n return theme !== undefined ? { ...options, theme } : options;\n }\n\n private listenToChart(instance: ChartGPUInstance): () => void {\n const click = (payload: ChartGPUEventPayload) => this.chartClick.emit(payload);\n const mouseOver = (payload: ChartGPUEventPayload) => this.mouseOver.emit(payload);\n const mouseOut = (payload: ChartGPUEventPayload) => this.mouseOut.emit(payload);\n const crosshairMove = (payload: ChartGPUCrosshairMovePayload) => this.crosshairMove.emit(payload);\n const dataAppend = (payload: ChartgpuDataAppendEvent) => this.dataAppend.emit(payload);\n const zoomChange = (payload: ChartGPUZoomRangeChangePayload) => this.emitZoomRange(payload);\n const deviceLost = (payload: ChartGPUDeviceLostPayload) => this.deviceLost.emit(payload);\n\n instance.on('click', click);\n instance.on('mouseover', mouseOver);\n instance.on('mouseout', mouseOut);\n instance.on('crosshairMove', crosshairMove);\n instance.on('dataAppend', dataAppend);\n instance.on('zoomRangeChange', zoomChange);\n instance.on('deviceLost', deviceLost);\n\n return () => {\n if (instance.disposed) {\n return;\n }\n instance.off('click', click);\n instance.off('mouseover', mouseOver);\n instance.off('mouseout', mouseOut);\n instance.off('crosshairMove', crosshairMove);\n instance.off('dataAppend', dataAppend);\n instance.off('zoomRangeChange', zoomChange);\n instance.off('deviceLost', deviceLost);\n };\n }\n\n private emitZoomRange(range: { start: number; end: number }): void {\n this.zoomChange.emit({ range: { start: range.start, end: range.end } });\n this.zoomRangeChange.emit({ start: range.start, end: range.end });\n }\n\n private observeResize(container: HTMLDivElement): void {\n if (typeof ResizeObserver === 'undefined') {\n return;\n }\n\n this.resizeObserver = new ResizeObserver(entries => {\n const entry = entries[0];\n if (!entry) {\n return;\n }\n const { width, height } = entry.contentRect;\n this.resize.emit({ width, height, container });\n if (this.resizeTimeout !== undefined) {\n clearTimeout(this.resizeTimeout);\n }\n this.resizeTimeout = setTimeout(() => {\n this.chartInstance()?.resize();\n this.resizeTimeout = undefined;\n }, 100);\n });\n this.resizeObserver.observe(container);\n }\n\n private reportError(cause: unknown): void {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n this.initializationError.set(error);\n this.chartError.emit(error);\n }\n\n private disposeChart(): void {\n const instance = this.chartInstance();\n this.removeChartListeners?.();\n this.removeChartListeners = undefined;\n if (instance && !instance.disposed) {\n instance.dispose();\n if (!this.destroying) {\n this.chartDispose.emit();\n }\n }\n this.chartInstance.set(null);\n this.chartContainer = undefined;\n this.createdWithOptions = undefined;\n }\n}\n","import { Directive, effect, input, output } from '@angular/core';\nimport { connectCharts } from 'chartgpu';\nimport type { ChartGPUInstance, ChartSyncOptions } from 'chartgpu';\n\n@Directive({\n selector: '[libChartgpuConnectCharts]',\n standalone: true,\n})\nexport class ChartgpuConnectChartsDirective {\n readonly charts = input<ReadonlyArray<ChartGPUInstance | null | undefined>>([], {\n alias: 'libChartgpuConnectCharts',\n });\n readonly syncOptions = input<ChartSyncOptions | undefined>();\n readonly connectionError = output<Error>();\n\n private readonly ids = new WeakMap<object, number>();\n private nextId = 1;\n private signature: string | undefined;\n\n constructor() {\n effect(onCleanup => {\n const charts = this.charts();\n const options = this.syncOptions();\n const optionsSignature = options\n ? `crosshair=${options.syncCrosshair ?? ''},zoom=${options.syncZoom ?? ''}`\n : '';\n const signature = `${charts.map(chart => {\n if (!chart) {\n return 'null';\n }\n\n let id = this.ids.get(chart);\n if (id === undefined) {\n id = this.nextId++;\n this.ids.set(chart, id);\n }\n return `${id}:${chart.disposed ? 1 : 0}`;\n }).join('|')}|${optionsSignature}`;\n\n if (signature === this.signature) {\n return;\n }\n this.signature = signature;\n\n if (charts.length === 0 || charts.some(chart => !chart || chart.disposed)) {\n return;\n }\n\n const resolved: ChartGPUInstance[] = [];\n for (const chart of charts) {\n if (!chart || chart.disposed) {\n return;\n }\n resolved.push(chart);\n }\n\n try {\n const disconnect = connectCharts(resolved, options);\n onCleanup(disconnect);\n } catch (cause: unknown) {\n this.connectionError.emit(cause instanceof Error ? cause : new Error(String(cause)));\n }\n });\n }\n}\n","import { Injectable, computed, signal } from '@angular/core';\nimport { createPipelineCache } from 'chartgpu';\nimport type { ChartGPUCreateContext } from 'chartgpu';\nimport type { ChartgpuGPUContextState } from './chartgpu-angular.types';\n\nconst INITIAL_STATE: ChartgpuGPUContextState = {\n adapter: null,\n device: null,\n pipelineCache: null,\n error: null,\n isReady: false,\n};\n\n/**\n * Creates one shared WebGPU context and pipeline cache for charts in a dashboard.\n * The device is intentionally not destroyed with the service so charts can share it\n * for the lifetime of the application.\n */\n@Injectable({ providedIn: 'root' })\nexport class ChartgpuGPUContextService {\n readonly state = signal<ChartgpuGPUContextState>(INITIAL_STATE);\n readonly context = computed<ChartGPUCreateContext | null>(() => {\n const state = this.state();\n if (!state.adapter || !state.device || !state.pipelineCache) {\n return null;\n }\n\n return {\n adapter: state.adapter,\n device: state.device,\n pipelineCache: state.pipelineCache,\n };\n });\n\n private initialization?: Promise<ChartgpuGPUContextState>;\n\n initialize(): Promise<ChartgpuGPUContextState> {\n if (!this.initialization) {\n this.initialization = this.createContext();\n }\n return this.initialization;\n }\n\n private async createContext(): Promise<ChartgpuGPUContextState> {\n try {\n if (typeof navigator === 'undefined' || !('gpu' in navigator)) {\n throw new Error('WebGPU not supported in this browser');\n }\n\n const gpu = (navigator as Navigator & {\n gpu?: {\n requestAdapter(options: {\n powerPreference: 'high-performance';\n }): Promise<ChartGPUCreateContext['adapter'] | null>;\n };\n }).gpu;\n if (!gpu) {\n throw new Error('WebGPU not supported in this browser');\n }\n\n const adapter = await gpu.requestAdapter({ powerPreference: 'high-performance' });\n if (!adapter) {\n const error = new Error('WebGPU is not available. No compatible GPUAdapter was found.');\n const state: ChartgpuGPUContextState = { ...INITIAL_STATE, error };\n this.state.set(state);\n return state;\n }\n\n const device = await adapter.requestDevice();\n const pipelineCache = createPipelineCache(device);\n const state: ChartgpuGPUContextState = {\n adapter,\n device,\n pipelineCache,\n error: null,\n isReady: true,\n };\n this.state.set(state);\n return state;\n } catch (cause: unknown) {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n const state: ChartgpuGPUContextState = { ...INITIAL_STATE, error };\n this.state.set(state);\n return state;\n }\n }\n}\n","import { makeEnvironmentProviders } from '@angular/core';\nimport { ChartgpuGPUContextService } from './gpu-context.service';\n\nexport function provideChartGpuContext() {\n return makeEnvironmentProviders([ChartgpuGPUContextService]);\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|