@ni/nimble-components 27.0.0 → 27.0.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.
- package/dist/all-components-bundle.js +465 -33
- package/dist/all-components-bundle.js.map +1 -1
- package/dist/all-components-bundle.min.js +6698 -6624
- package/dist/all-components-bundle.min.js.map +1 -1
- package/dist/esm/src/wafer-map/index.d.ts +9 -1
- package/dist/esm/src/wafer-map/modules/experimental/worker-renderer.d.ts +3 -1
- package/dist/esm/src/wafer-map/modules/zoom-handler.d.ts +2 -0
- package/dist/esm/src/wafer-map/workers/matrix-renderer.d.ts +1 -1
- package/dist/esm/wafer-map/index.d.ts +9 -1
- package/dist/esm/wafer-map/index.js +6 -11
- package/dist/esm/wafer-map/index.js.map +1 -1
- package/dist/esm/wafer-map/modules/experimental/worker-renderer.d.ts +3 -1
- package/dist/esm/wafer-map/modules/experimental/worker-renderer.js +52 -2
- package/dist/esm/wafer-map/modules/experimental/worker-renderer.js.map +1 -1
- package/dist/esm/wafer-map/modules/prerendering.js +5 -3
- package/dist/esm/wafer-map/modules/prerendering.js.map +1 -1
- package/dist/esm/wafer-map/modules/wafer-map-update-tracker.js +14 -3
- package/dist/esm/wafer-map/modules/wafer-map-update-tracker.js.map +1 -1
- package/dist/esm/wafer-map/modules/zoom-handler.d.ts +2 -0
- package/dist/esm/wafer-map/modules/zoom-handler.js +10 -0
- package/dist/esm/wafer-map/modules/zoom-handler.js.map +1 -1
- package/dist/esm/wafer-map/styles.js +10 -5
- package/dist/esm/wafer-map/styles.js.map +1 -1
- package/dist/esm/wafer-map/template.js +2 -1
- package/dist/esm/wafer-map/template.js.map +1 -1
- package/dist/esm/wafer-map/workers/matrix-renderer.d.ts +1 -1
- package/dist/esm/wafer-map/workers/matrix-renderer.js +1 -1
- package/dist/esm/wafer-map/workers/matrix-renderer.js.map +1 -1
- package/package.json +2 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { select } from 'd3-selection';
|
|
2
2
|
import { zoom } from 'd3-zoom';
|
|
3
|
+
import { Observable } from '@microsoft/fast-element';
|
|
3
4
|
/**
|
|
4
5
|
* ZoomHandler deals with user interactions and events like zooming
|
|
5
6
|
*/
|
|
@@ -11,6 +12,9 @@ export class ZoomHandler {
|
|
|
11
12
|
this.onWheelMove = (event) => {
|
|
12
13
|
event.preventDefault();
|
|
13
14
|
};
|
|
15
|
+
this.wafermapNotifier = Observable.getNotifier(this.wafermap);
|
|
16
|
+
this.wafermapNotifier.subscribe(this, 'canvasWidth');
|
|
17
|
+
this.wafermapNotifier.subscribe(this, 'canvasHeight');
|
|
14
18
|
}
|
|
15
19
|
/**
|
|
16
20
|
* @internal
|
|
@@ -28,6 +32,12 @@ export class ZoomHandler {
|
|
|
28
32
|
zoom().on('zoom', null)(select(this.wafermap));
|
|
29
33
|
this.wafermap.removeEventListener('wheel', this.onWheelMove);
|
|
30
34
|
}
|
|
35
|
+
handleChange(source, propertyName) {
|
|
36
|
+
if (source === this.wafermap
|
|
37
|
+
&& (propertyName === 'canvasWidth' || propertyName === 'canvasHeight')) {
|
|
38
|
+
this.createZoomBehavior();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
31
41
|
createZoomBehavior() {
|
|
32
42
|
zoom()
|
|
33
43
|
.scaleExtent(this.scaleExtent)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zoom-handler.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/zoom-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,IAAI,EAAiB,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"zoom-handler.js","sourceRoot":"","sources":["../../../../src/wafer-map/modules/zoom-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,IAAI,EAAiB,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAiB,MAAM,yBAAyB,CAAC;AAOpE;;GAEG;AACH,MAAM,OAAO,WAAW;IAKpB,YAAoC,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;QAJrC,gBAAW,GAAqB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACzC,mBAAc,GAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAkD1C,gBAAW,GAAG,CAAC,KAAY,EAAQ,EAAE;YAClD,KAAK,CAAC,cAAc,EAAE,CAAC;QAC3B,CAAC,CAAC;QAhDE,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC9D,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACrD,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACI,OAAO;QACV,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE;YACtD,OAAO,EAAE,KAAK;SACjB,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,UAAU;QACb,IAAI,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAmB,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACjE,CAAC;IAEM,YAAY,CAAC,MAAgB,EAAE,YAAoB;QACtD,IACI,MAAM,KAAK,IAAI,CAAC,QAAQ;eACrB,CAAC,YAAY,KAAK,aAAa,IAAI,YAAY,KAAK,cAAc,CAAC,EACxE;YACE,IAAI,CAAC,kBAAkB,EAAE,CAAC;SAC7B;IACL,CAAC;IAEO,kBAAkB;QACtB,IAAI,EAAE;aACD,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;aAC7B,eAAe,CAAC;YACb,IAAI,CAAC,cAAc;YACnB,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;SAC1D,CAAC;aACD,EAAE,CAAC,MAAM,EAAE,CAAC,KAAgB,EAAE,EAAE;YAC7B,sEAAsE;YACtE,mEAAmE;YACnE,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAC9C,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAmB,CAAC,CAAC,CAAC;IAC7C,CAAC;CAKJ","sourcesContent":["import { select } from 'd3-selection';\nimport { zoom, ZoomTransform } from 'd3-zoom';\nimport { Observable, type Notifier } from '@microsoft/fast-element';\nimport type { WaferMap } from '..';\n\ninterface ZoomEvent {\n transform: ZoomTransform;\n}\n\n/**\n * ZoomHandler deals with user interactions and events like zooming\n */\nexport class ZoomHandler {\n private readonly scaleExtent: [number, number] = [1, 100];\n private readonly minExtentPoint: [number, number] = [0, 0];\n private readonly wafermapNotifier: Notifier;\n\n public constructor(private readonly wafermap: WaferMap) {\n this.wafermapNotifier = Observable.getNotifier(this.wafermap);\n this.wafermapNotifier.subscribe(this, 'canvasWidth');\n this.wafermapNotifier.subscribe(this, 'canvasHeight');\n }\n\n /**\n * @internal\n */\n public connect(): void {\n this.createZoomBehavior();\n this.wafermap.addEventListener('wheel', this.onWheelMove, {\n passive: false\n });\n }\n\n /**\n * @internal\n */\n public disconnect(): void {\n zoom().on('zoom', null)(select(this.wafermap as Element));\n this.wafermap.removeEventListener('wheel', this.onWheelMove);\n }\n\n public handleChange(source: WaferMap, propertyName: string): void {\n if (\n source === this.wafermap\n && (propertyName === 'canvasWidth' || propertyName === 'canvasHeight')\n ) {\n this.createZoomBehavior();\n }\n }\n\n private createZoomBehavior(): void {\n zoom()\n .scaleExtent(this.scaleExtent)\n .translateExtent([\n this.minExtentPoint,\n [this.wafermap.canvasWidth, this.wafermap.canvasHeight]\n ])\n .on('zoom', (event: ZoomEvent) => {\n // D3 will automatically remove existing handlers when adding new ones\n // See: https://github.com/d3/d3-zoom/blob/v3.0.0/README.md#zoom_on\n this.wafermap.transform = event.transform;\n })(select(this.wafermap as Element));\n }\n\n private readonly onWheelMove = (event: Event): void => {\n event.preventDefault();\n };\n}\n"]}
|
|
@@ -8,6 +8,16 @@ export const styles = css `
|
|
|
8
8
|
height: 500px;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
+
.main-wafer {
|
|
12
|
+
display: inline-block;
|
|
13
|
+
position: absolute;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.worker-wafer {
|
|
17
|
+
display: inline-block;
|
|
18
|
+
position: absolute;
|
|
19
|
+
}
|
|
20
|
+
|
|
11
21
|
.wafer-map-container {
|
|
12
22
|
width: 100%;
|
|
13
23
|
height: 100%;
|
|
@@ -54,11 +64,6 @@ export const styles = css `
|
|
|
54
64
|
stroke: ${borderColor};
|
|
55
65
|
}
|
|
56
66
|
|
|
57
|
-
.wafer-map-canvas {
|
|
58
|
-
display: inline-block;
|
|
59
|
-
position: absolute;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
67
|
.hover-layer {
|
|
63
68
|
position: absolute;
|
|
64
69
|
pointer-events: none;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/wafer-map/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE3E,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/wafer-map/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE3E,MAAM,CAAC,MAAM,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA2DD,WAAW;kBACjB,WAAW;;;;;;;;;;;;;;yBAcJ,iBAAiB;;;;;;;;;;;;;;CAczC,CAAC","sourcesContent":["import { css } from '@microsoft/fast-element';\nimport { DigitalGreenLight } from '@ni/nimble-tokens/dist/styledictionary/js/tokens';\nimport { borderColor, borderWidth } from '../theme-provider/design-tokens';\n\nexport const styles = css`\n :host {\n display: inline-block;\n width: 500px;\n height: 500px;\n }\n\n .main-wafer {\n display: inline-block;\n position: absolute;\n }\n\n .worker-wafer {\n display: inline-block;\n position: absolute;\n }\n\n .wafer-map-container {\n width: 100%;\n height: 100%;\n position: relative;\n display: inline-block;\n justify-content: center;\n align-items: center;\n }\n\n .svg-root {\n width: 100%;\n height: 100%;\n position: absolute;\n }\n\n .notch {\n transform-origin: center center;\n }\n\n .notch.top {\n transform: rotate(-90deg);\n }\n\n .notch.right {\n transform: rotate(0deg);\n }\n\n .notch.left {\n transform: rotate(180deg);\n }\n\n .notch.bottom {\n transform: rotate(90deg);\n }\n\n .circle-base {\n fill: white;\n }\n\n .circle-drawing-path {\n shape-rendering: 'crispEdges';\n vector-effect: non-scaling-stroke;\n stroke-width: ${borderWidth};\n stroke: ${borderColor};\n }\n\n .hover-layer {\n position: absolute;\n pointer-events: none;\n width: 100%;\n height: 100%;\n }\n\n .hover-rect {\n fill: transparent;\n stroke: white;\n outline-style: solid;\n outline-color: ${DigitalGreenLight};\n }\n\n .hover-rect.show {\n opacity: 1;\n stroke-width: 2px;\n outline-width: 2px;\n }\n\n .hover-rect.hide {\n opacity: 0;\n stroke-width: 0px;\n outline-width: 0px;\n }\n`;\n"]}
|
|
@@ -19,7 +19,8 @@ export const template = html `
|
|
|
19
19
|
</g>
|
|
20
20
|
</g>
|
|
21
21
|
</svg>
|
|
22
|
-
<canvas class="wafer
|
|
22
|
+
<canvas class="main-wafer" ${ref('canvas')}></canvas>
|
|
23
|
+
<canvas class="worker-wafer" ${ref('workerCanvas')}></canvas>
|
|
23
24
|
<svg class="hover-layer">
|
|
24
25
|
<rect
|
|
25
26
|
class="hover-rect ${x => x.hoverOpacity}"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/wafer-map/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAGpD,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAU;;;iBAGrB,GAAG,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE;kCAC5C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/wafer-map/template.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAGpD,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAU;;;iBAGrB,GAAG,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE;kCAC5C,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;;;;;;;;;;;;;;;;qCAgBf,GAAG,CAAC,QAAQ,CAAC;uCACX,GAAG,CAAC,cAAc,CAAC;;;oCAGtB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY;6BAC1B,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc;yBACzB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU;0BAChB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW;;;;CAI3C,CAAC","sourcesContent":["import { html, ref } from '@microsoft/fast-element';\nimport type { WaferMap } from '.';\n\nexport const template = html<WaferMap>`\n <div class=\"wafer-map-container\">\n <svg class=\"svg-root\">\n <g ${ref('zoomContainer')} transform=${x => x.transform.toString()}>\n <g class=\"notch ${x => x.orientation}\">\n <svg\n class=\"circle-base\"\n version=\"1.1\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 41 41\"\n >\n <path\n class=\"circle-drawing-path\"\n d=\"m 40.5 21 a 20 20 1 1 1 0 -1 a 0.5 0.5 0 0 0 0 1\"\n />\n </svg>\n </g>\n </g>\n </svg>\n <canvas class=\"main-wafer\" ${ref('canvas')}></canvas>\n <canvas class=\"worker-wafer\" ${ref('workerCanvas')}></canvas>\n <svg class=\"hover-layer\">\n <rect\n class=\"hover-rect ${x => x.hoverOpacity}\"\n transform=\"${x => x.hoverTransform}\"\n width=\"${x => x.hoverWidth}\"\n height=\"${x => x.hoverHeight}\"\n />\n </svg>\n </div>\n`;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const workerCode = "var MatrixRenderer = (function (exports) {\n 'use strict';\n\n /**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n const proxyMarker = Symbol(\"Comlink.proxy\");\n const createEndpoint = Symbol(\"Comlink.endpoint\");\n const releaseProxy = Symbol(\"Comlink.releaseProxy\");\n const finalizer = Symbol(\"Comlink.finalizer\");\n const throwMarker = Symbol(\"Comlink.thrown\");\n const isObject = (val) => (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n /**\n * Internal transfer handle to handle objects marked to proxy.\n */\n const proxyTransferHandler = {\n canHandle: (val) => isObject(val) && val[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return wrap(port);\n },\n };\n /**\n * Internal transfer handler to handle thrown exceptions.\n */\n const throwTransferHandler = {\n canHandle: (value) => isObject(value) && throwMarker in value,\n serialize({ value }) {\n let serialized;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n };\n }\n else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(new Error(serialized.value.message), serialized.value);\n }\n throw serialized.value;\n },\n };\n /**\n * Allows customizing the serialization of certain values.\n */\n const transferHandlers = new Map([\n [\"proxy\", proxyTransferHandler],\n [\"throw\", throwTransferHandler],\n ]);\n function isAllowedOrigin(allowedOrigins, origin) {\n for (const allowedOrigin of allowedOrigins) {\n if (origin === allowedOrigin || allowedOrigin === \"*\") {\n return true;\n }\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n return true;\n }\n }\n return false;\n }\n function expose(obj, ep = globalThis, allowedOrigins = [\"*\"]) {\n ep.addEventListener(\"message\", function callback(ev) {\n if (!ev || !ev.data) {\n return;\n }\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\n return;\n }\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case \"GET\" /* MessageType.GET */:\n {\n returnValue = rawValue;\n }\n break;\n case \"SET\" /* MessageType.SET */:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case \"APPLY\" /* MessageType.APPLY */:\n {\n returnValue = rawValue.apply(parent, argumentList);\n }\n break;\n case \"CONSTRUCT\" /* MessageType.CONSTRUCT */:\n {\n const value = new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case \"ENDPOINT\" /* MessageType.ENDPOINT */:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case \"RELEASE\" /* MessageType.RELEASE */:\n {\n returnValue = undefined;\n }\n break;\n default:\n return;\n }\n }\n catch (value) {\n returnValue = { value, [throwMarker]: 0 };\n }\n Promise.resolve(returnValue)\n .catch((value) => {\n return { value, [throwMarker]: 0 };\n })\n .then((returnValue) => {\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n if (type === \"RELEASE\" /* MessageType.RELEASE */) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback);\n closeEndPoint(ep);\n if (finalizer in obj && typeof obj[finalizer] === \"function\") {\n obj[finalizer]();\n }\n }\n })\n .catch((error) => {\n // Send Serialization Error To Caller\n const [wireValue, transferables] = toWireValue({\n value: new TypeError(\"Unserializable return value\"),\n [throwMarker]: 0,\n });\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n });\n });\n if (ep.start) {\n ep.start();\n }\n }\n function isMessagePort(endpoint) {\n return endpoint.constructor.name === \"MessagePort\";\n }\n function closeEndPoint(endpoint) {\n if (isMessagePort(endpoint))\n endpoint.close();\n }\n function wrap(ep, target) {\n return createProxy(ep, [], target);\n }\n function throwIfProxyReleased(isReleased) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n }\n function releaseEndpoint(ep) {\n return requestResponseMessage(ep, {\n type: \"RELEASE\" /* MessageType.RELEASE */,\n }).then(() => {\n closeEndPoint(ep);\n });\n }\n const proxyCounter = new WeakMap();\n const proxyFinalizers = \"FinalizationRegistry\" in globalThis &&\n new FinalizationRegistry((ep) => {\n const newCount = (proxyCounter.get(ep) || 0) - 1;\n proxyCounter.set(ep, newCount);\n if (newCount === 0) {\n releaseEndpoint(ep);\n }\n });\n function registerProxy(proxy, ep) {\n const newCount = (proxyCounter.get(ep) || 0) + 1;\n proxyCounter.set(ep, newCount);\n if (proxyFinalizers) {\n proxyFinalizers.register(proxy, ep, proxy);\n }\n }\n function unregisterProxy(proxy) {\n if (proxyFinalizers) {\n proxyFinalizers.unregister(proxy);\n }\n }\n function createProxy(ep, path = [], target = function () { }) {\n let isProxyReleased = false;\n const proxy = new Proxy(target, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n unregisterProxy(proxy);\n releaseEndpoint(ep);\n isProxyReleased = true;\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, {\n type: \"GET\" /* MessageType.GET */,\n path: path.map((p) => p.toString()),\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously \u00AF\\_(\u30C4)_/\u00AF\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(ep, {\n type: \"SET\" /* MessageType.SET */,\n path: [...path, prop].map((p) => p.toString()),\n value,\n }, transferables).then(fromWireValue);\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if (last === createEndpoint) {\n return requestResponseMessage(ep, {\n type: \"ENDPOINT\" /* MessageType.ENDPOINT */,\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn\u2019t happen.\n if (last === \"bind\") {\n return createProxy(ep, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, {\n type: \"APPLY\" /* MessageType.APPLY */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, {\n type: \"CONSTRUCT\" /* MessageType.CONSTRUCT */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n });\n registerProxy(proxy, ep);\n return proxy;\n }\n function myFlat(arr) {\n return Array.prototype.concat.apply([], arr);\n }\n function processArguments(argumentList) {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n }\n const transferCache = new WeakMap();\n function transfer(obj, transfers) {\n transferCache.set(obj, transfers);\n return obj;\n }\n function proxy(obj) {\n return Object.assign(obj, { [proxyMarker]: true });\n }\n function toWireValue(value) {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: \"HANDLER\" /* WireValueType.HANDLER */,\n name,\n value: serializedValue,\n },\n transferables,\n ];\n }\n }\n return [\n {\n type: \"RAW\" /* WireValueType.RAW */,\n value,\n },\n transferCache.get(value) || [],\n ];\n }\n function fromWireValue(value) {\n switch (value.type) {\n case \"HANDLER\" /* WireValueType.HANDLER */:\n return transferHandlers.get(value.name).deserialize(value.value);\n case \"RAW\" /* WireValueType.RAW */:\n return value.value;\n }\n }\n function requestResponseMessage(ep, msg, transfers) {\n return new Promise((resolve) => {\n const id = generateUUID();\n ep.addEventListener(\"message\", function l(ev) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener(\"message\", l);\n resolve(ev.data);\n });\n if (ep.start) {\n ep.start();\n }\n ep.postMessage(Object.assign({ id }, msg), transfers);\n });\n }\n function generateUUID() {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n }\n\n /**\n * MatrixRenderer class is meant to be used within a Web Worker context,\n * using Comlink to facilitate communication between the main thread and the worker.\n * The MatrixRenderer class manages a matrix of dies, once an instance of MatrixRenderer is created,\n * it is exposed to the main thread using Comlink's `expose` method.\n * This setup is used in the wafer-map component to perform heavy computational duties\n */\n class MatrixRenderer {\n constructor() {\n this.dieMatrix = Uint8Array.from([]);\n }\n emptyMatrix() {\n this.dieMatrix = Uint8Array.from([]);\n }\n updateMatrix(data) {\n this.dieMatrix = Uint8Array.from(data);\n }\n }\n expose(MatrixRenderer);\n\n exports.MatrixRenderer = MatrixRenderer;\n\n return exports;\n\n})({});\n";
|
|
1
|
+
export declare const workerCode = "var MatrixRenderer = (function (exports) {\n 'use strict';\n\n /**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n const proxyMarker = Symbol(\"Comlink.proxy\");\n const createEndpoint = Symbol(\"Comlink.endpoint\");\n const releaseProxy = Symbol(\"Comlink.releaseProxy\");\n const finalizer = Symbol(\"Comlink.finalizer\");\n const throwMarker = Symbol(\"Comlink.thrown\");\n const isObject = (val) => (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n /**\n * Internal transfer handle to handle objects marked to proxy.\n */\n const proxyTransferHandler = {\n canHandle: (val) => isObject(val) && val[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return wrap(port);\n },\n };\n /**\n * Internal transfer handler to handle thrown exceptions.\n */\n const throwTransferHandler = {\n canHandle: (value) => isObject(value) && throwMarker in value,\n serialize({ value }) {\n let serialized;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n };\n }\n else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(new Error(serialized.value.message), serialized.value);\n }\n throw serialized.value;\n },\n };\n /**\n * Allows customizing the serialization of certain values.\n */\n const transferHandlers = new Map([\n [\"proxy\", proxyTransferHandler],\n [\"throw\", throwTransferHandler],\n ]);\n function isAllowedOrigin(allowedOrigins, origin) {\n for (const allowedOrigin of allowedOrigins) {\n if (origin === allowedOrigin || allowedOrigin === \"*\") {\n return true;\n }\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n return true;\n }\n }\n return false;\n }\n function expose(obj, ep = globalThis, allowedOrigins = [\"*\"]) {\n ep.addEventListener(\"message\", function callback(ev) {\n if (!ev || !ev.data) {\n return;\n }\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\n return;\n }\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case \"GET\" /* MessageType.GET */:\n {\n returnValue = rawValue;\n }\n break;\n case \"SET\" /* MessageType.SET */:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case \"APPLY\" /* MessageType.APPLY */:\n {\n returnValue = rawValue.apply(parent, argumentList);\n }\n break;\n case \"CONSTRUCT\" /* MessageType.CONSTRUCT */:\n {\n const value = new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case \"ENDPOINT\" /* MessageType.ENDPOINT */:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case \"RELEASE\" /* MessageType.RELEASE */:\n {\n returnValue = undefined;\n }\n break;\n default:\n return;\n }\n }\n catch (value) {\n returnValue = { value, [throwMarker]: 0 };\n }\n Promise.resolve(returnValue)\n .catch((value) => {\n return { value, [throwMarker]: 0 };\n })\n .then((returnValue) => {\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n if (type === \"RELEASE\" /* MessageType.RELEASE */) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback);\n closeEndPoint(ep);\n if (finalizer in obj && typeof obj[finalizer] === \"function\") {\n obj[finalizer]();\n }\n }\n })\n .catch((error) => {\n // Send Serialization Error To Caller\n const [wireValue, transferables] = toWireValue({\n value: new TypeError(\"Unserializable return value\"),\n [throwMarker]: 0,\n });\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n });\n });\n if (ep.start) {\n ep.start();\n }\n }\n function isMessagePort(endpoint) {\n return endpoint.constructor.name === \"MessagePort\";\n }\n function closeEndPoint(endpoint) {\n if (isMessagePort(endpoint))\n endpoint.close();\n }\n function wrap(ep, target) {\n return createProxy(ep, [], target);\n }\n function throwIfProxyReleased(isReleased) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n }\n function releaseEndpoint(ep) {\n return requestResponseMessage(ep, {\n type: \"RELEASE\" /* MessageType.RELEASE */,\n }).then(() => {\n closeEndPoint(ep);\n });\n }\n const proxyCounter = new WeakMap();\n const proxyFinalizers = \"FinalizationRegistry\" in globalThis &&\n new FinalizationRegistry((ep) => {\n const newCount = (proxyCounter.get(ep) || 0) - 1;\n proxyCounter.set(ep, newCount);\n if (newCount === 0) {\n releaseEndpoint(ep);\n }\n });\n function registerProxy(proxy, ep) {\n const newCount = (proxyCounter.get(ep) || 0) + 1;\n proxyCounter.set(ep, newCount);\n if (proxyFinalizers) {\n proxyFinalizers.register(proxy, ep, proxy);\n }\n }\n function unregisterProxy(proxy) {\n if (proxyFinalizers) {\n proxyFinalizers.unregister(proxy);\n }\n }\n function createProxy(ep, path = [], target = function () { }) {\n let isProxyReleased = false;\n const proxy = new Proxy(target, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n unregisterProxy(proxy);\n releaseEndpoint(ep);\n isProxyReleased = true;\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, {\n type: \"GET\" /* MessageType.GET */,\n path: path.map((p) => p.toString()),\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously \u00AF\\_(\u30C4)_/\u00AF\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(ep, {\n type: \"SET\" /* MessageType.SET */,\n path: [...path, prop].map((p) => p.toString()),\n value,\n }, transferables).then(fromWireValue);\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if (last === createEndpoint) {\n return requestResponseMessage(ep, {\n type: \"ENDPOINT\" /* MessageType.ENDPOINT */,\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn\u2019t happen.\n if (last === \"bind\") {\n return createProxy(ep, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, {\n type: \"APPLY\" /* MessageType.APPLY */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, {\n type: \"CONSTRUCT\" /* MessageType.CONSTRUCT */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n });\n registerProxy(proxy, ep);\n return proxy;\n }\n function myFlat(arr) {\n return Array.prototype.concat.apply([], arr);\n }\n function processArguments(argumentList) {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n }\n const transferCache = new WeakMap();\n function transfer(obj, transfers) {\n transferCache.set(obj, transfers);\n return obj;\n }\n function proxy(obj) {\n return Object.assign(obj, { [proxyMarker]: true });\n }\n function toWireValue(value) {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: \"HANDLER\" /* WireValueType.HANDLER */,\n name,\n value: serializedValue,\n },\n transferables,\n ];\n }\n }\n return [\n {\n type: \"RAW\" /* WireValueType.RAW */,\n value,\n },\n transferCache.get(value) || [],\n ];\n }\n function fromWireValue(value) {\n switch (value.type) {\n case \"HANDLER\" /* WireValueType.HANDLER */:\n return transferHandlers.get(value.name).deserialize(value.value);\n case \"RAW\" /* WireValueType.RAW */:\n return value.value;\n }\n }\n function requestResponseMessage(ep, msg, transfers) {\n return new Promise((resolve) => {\n const id = generateUUID();\n ep.addEventListener(\"message\", function l(ev) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener(\"message\", l);\n resolve(ev.data);\n });\n if (ep.start) {\n ep.start();\n }\n ep.postMessage(Object.assign({ id }, msg), transfers);\n });\n }\n function generateUUID() {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n }\n\n /**\n * MatrixRenderer class is meant to be used within a Web Worker context,\n * using Comlink to facilitate communication between the main thread and the worker.\n * The MatrixRenderer class manages a matrix of dies, once an instance of MatrixRenderer is created,\n * it is exposed to the main thread using Comlink's `expose` method.\n * This setup is used in the wafer-map component to perform heavy computational duties\n */\n class MatrixRenderer {\n constructor() {\n this.columnIndexes = Int32Array.from([]);\n this.rowIndexes = Int32Array.from([]);\n this.values = Float64Array.from([]);\n this.scaledColumnIndex = Float64Array.from([]);\n this.scaledRowIndex = Float64Array.from([]);\n this.columnIndexPositions = Int32Array.from([]);\n this.scaleX = 1;\n this.scaleY = 1;\n this.baseX = 1;\n this.baseY = 1;\n this.dieDimensions = { width: 1, height: 1 };\n this.transform = { k: 1, x: 0, y: 0 };\n this.smallestMarginPossible = 20;\n this.margin = {\n top: this.smallestMarginPossible,\n right: this.smallestMarginPossible,\n bottom: this.smallestMarginPossible,\n left: this.smallestMarginPossible\n };\n }\n calculateXScaledIndex(columnIndex) {\n return this.scaleX * columnIndex + this.baseX + this.margin.left;\n }\n calculateYScaledIndex(rowIndex) {\n return this.scaleY * rowIndex + this.baseY + this.margin.top;\n }\n setColumnIndexes(columnIndexes) {\n this.columnIndexes = columnIndexes;\n if (columnIndexes.length === 0 || this.columnIndexes[0] === undefined) {\n return;\n }\n const scaledColumnIndex = [\n this.calculateXScaledIndex(this.columnIndexes[0])\n ];\n const columnPositions = [0];\n let prev = this.columnIndexes[0];\n for (let i = 1; i < this.columnIndexes.length; i++) {\n const xIndex = this.columnIndexes[i];\n if (xIndex && xIndex !== prev) {\n const scaledX = this.calculateXScaledIndex(this.columnIndexes[i]);\n scaledColumnIndex.push(scaledX);\n columnPositions.push(i);\n prev = xIndex;\n }\n }\n this.scaledColumnIndex = Float64Array.from(scaledColumnIndex);\n this.columnIndexPositions = Int32Array.from(columnPositions);\n }\n setRowIndexes(rowIndexesBuffer) {\n this.rowIndexes = rowIndexesBuffer;\n this.scaledRowIndex = new Float64Array(this.rowIndexes.length);\n for (let i = 0; i < this.rowIndexes.length; i++) {\n this.scaledRowIndex[i] = this.calculateYScaledIndex(this.rowIndexes[i]);\n }\n }\n setMargin(margin) {\n this.margin = margin;\n }\n setCanvasCorners(topLeft, bottomRight) {\n this.topLeftCanvasCorner = topLeft;\n this.bottomRightCanvasCorner = bottomRight;\n }\n setDiesDimensions(data) {\n this.dieDimensions = { width: data.width, height: data.height };\n }\n setScaling(scaleX, scaleY) {\n this.scaleX = scaleX;\n this.scaleY = scaleY;\n }\n setBases(baseX, baseY) {\n this.baseX = baseX;\n this.baseY = baseY;\n }\n setTransform(transform) {\n this.transform = transform;\n }\n setCanvas(canvas) {\n this.canvas = canvas;\n this.context = canvas.getContext('2d');\n }\n getMatrix() {\n return {\n columnIndexes: this.columnIndexes,\n rowIndexes: this.rowIndexes,\n values: this.values\n };\n }\n emptyMatrix() {\n this.columnIndexes = Int32Array.from([]);\n this.rowIndexes = Int32Array.from([]);\n this.values = Float64Array.from([]);\n }\n scaleCanvas() {\n this.context.translate(this.transform.x, this.transform.y);\n this.context.scale(this.transform.k, this.transform.k);\n }\n updateMatrix(data) {\n this.columnIndexes = Int32Array.from(data.columnIndexes);\n this.rowIndexes = Int32Array.from(data.rowIndexes);\n this.values = Float64Array.from(data.values);\n }\n setCanvasDimensions(data) {\n this.canvas.width = data.width;\n this.canvas.height = data.height;\n }\n getCanvasDimensions() {\n return {\n width: this.canvas.width,\n height: this.canvas.height\n };\n }\n clearCanvas() {\n this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n drawWafer() {\n this.context.restore();\n this.context.save();\n this.clearCanvas();\n this.scaleCanvas();\n if (this.topLeftCanvasCorner === undefined\n || this.bottomRightCanvasCorner === undefined) {\n throw new Error('Canvas corners are not set');\n }\n for (let i = 0; i < this.scaledColumnIndex.length; i++) {\n const scaledX = this.scaledColumnIndex[i];\n if (!(scaledX >= this.topLeftCanvasCorner.x\n && scaledX < this.bottomRightCanvasCorner.x)) {\n continue;\n }\n // columnIndexPositions is used to get chunks to determine the start and end index of the column, it looks something like [0, 1, 4, 9, 12]\n // This means that the first column has a start index of 0 and an end index of 1, the second column has a start index of 1 and an end index of 4, and so on\n // scaledRowIndex is used when we reach the end of the columnIndexPositions, when columnIndexPositions is [0, 1, 4, 9, 12], scaledRowIndex is 13\n const columnEndIndex = this.columnIndexPositions[i + 1] !== undefined\n ? this.columnIndexPositions[i + 1]\n : this.scaledRowIndex.length;\n for (let columnStartIndex = this.columnIndexPositions[i]; columnStartIndex < columnEndIndex; columnStartIndex++) {\n const scaledY = this.scaledRowIndex[columnStartIndex];\n if (!(scaledY >= this.topLeftCanvasCorner.y\n && scaledY < this.bottomRightCanvasCorner.y)) {\n continue;\n }\n // Fill style is temporary green for all dies, will be replaced with a color based on the value of the die in a future implementation\n this.context.fillStyle = 'Green';\n this.context.fillRect(scaledX, scaledY, this.dieDimensions.width, this.dieDimensions.height);\n }\n }\n }\n }\n expose(MatrixRenderer);\n\n exports.MatrixRenderer = MatrixRenderer;\n\n return exports;\n\n})({});\n";
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// eslint-disable-next-line no-template-curly-in-string
|
|
2
|
-
export const workerCode = "var MatrixRenderer = (function (exports) {\n 'use strict';\n\n /**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n const proxyMarker = Symbol(\"Comlink.proxy\");\n const createEndpoint = Symbol(\"Comlink.endpoint\");\n const releaseProxy = Symbol(\"Comlink.releaseProxy\");\n const finalizer = Symbol(\"Comlink.finalizer\");\n const throwMarker = Symbol(\"Comlink.thrown\");\n const isObject = (val) => (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n /**\n * Internal transfer handle to handle objects marked to proxy.\n */\n const proxyTransferHandler = {\n canHandle: (val) => isObject(val) && val[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return wrap(port);\n },\n };\n /**\n * Internal transfer handler to handle thrown exceptions.\n */\n const throwTransferHandler = {\n canHandle: (value) => isObject(value) && throwMarker in value,\n serialize({ value }) {\n let serialized;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n };\n }\n else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(new Error(serialized.value.message), serialized.value);\n }\n throw serialized.value;\n },\n };\n /**\n * Allows customizing the serialization of certain values.\n */\n const transferHandlers = new Map([\n [\"proxy\", proxyTransferHandler],\n [\"throw\", throwTransferHandler],\n ]);\n function isAllowedOrigin(allowedOrigins, origin) {\n for (const allowedOrigin of allowedOrigins) {\n if (origin === allowedOrigin || allowedOrigin === \"*\") {\n return true;\n }\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n return true;\n }\n }\n return false;\n }\n function expose(obj, ep = globalThis, allowedOrigins = [\"*\"]) {\n ep.addEventListener(\"message\", function callback(ev) {\n if (!ev || !ev.data) {\n return;\n }\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\n return;\n }\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case \"GET\" /* MessageType.GET */:\n {\n returnValue = rawValue;\n }\n break;\n case \"SET\" /* MessageType.SET */:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case \"APPLY\" /* MessageType.APPLY */:\n {\n returnValue = rawValue.apply(parent, argumentList);\n }\n break;\n case \"CONSTRUCT\" /* MessageType.CONSTRUCT */:\n {\n const value = new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case \"ENDPOINT\" /* MessageType.ENDPOINT */:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case \"RELEASE\" /* MessageType.RELEASE */:\n {\n returnValue = undefined;\n }\n break;\n default:\n return;\n }\n }\n catch (value) {\n returnValue = { value, [throwMarker]: 0 };\n }\n Promise.resolve(returnValue)\n .catch((value) => {\n return { value, [throwMarker]: 0 };\n })\n .then((returnValue) => {\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n if (type === \"RELEASE\" /* MessageType.RELEASE */) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback);\n closeEndPoint(ep);\n if (finalizer in obj && typeof obj[finalizer] === \"function\") {\n obj[finalizer]();\n }\n }\n })\n .catch((error) => {\n // Send Serialization Error To Caller\n const [wireValue, transferables] = toWireValue({\n value: new TypeError(\"Unserializable return value\"),\n [throwMarker]: 0,\n });\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n });\n });\n if (ep.start) {\n ep.start();\n }\n }\n function isMessagePort(endpoint) {\n return endpoint.constructor.name === \"MessagePort\";\n }\n function closeEndPoint(endpoint) {\n if (isMessagePort(endpoint))\n endpoint.close();\n }\n function wrap(ep, target) {\n return createProxy(ep, [], target);\n }\n function throwIfProxyReleased(isReleased) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n }\n function releaseEndpoint(ep) {\n return requestResponseMessage(ep, {\n type: \"RELEASE\" /* MessageType.RELEASE */,\n }).then(() => {\n closeEndPoint(ep);\n });\n }\n const proxyCounter = new WeakMap();\n const proxyFinalizers = \"FinalizationRegistry\" in globalThis &&\n new FinalizationRegistry((ep) => {\n const newCount = (proxyCounter.get(ep) || 0) - 1;\n proxyCounter.set(ep, newCount);\n if (newCount === 0) {\n releaseEndpoint(ep);\n }\n });\n function registerProxy(proxy, ep) {\n const newCount = (proxyCounter.get(ep) || 0) + 1;\n proxyCounter.set(ep, newCount);\n if (proxyFinalizers) {\n proxyFinalizers.register(proxy, ep, proxy);\n }\n }\n function unregisterProxy(proxy) {\n if (proxyFinalizers) {\n proxyFinalizers.unregister(proxy);\n }\n }\n function createProxy(ep, path = [], target = function () { }) {\n let isProxyReleased = false;\n const proxy = new Proxy(target, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n unregisterProxy(proxy);\n releaseEndpoint(ep);\n isProxyReleased = true;\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, {\n type: \"GET\" /* MessageType.GET */,\n path: path.map((p) => p.toString()),\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(ep, {\n type: \"SET\" /* MessageType.SET */,\n path: [...path, prop].map((p) => p.toString()),\n value,\n }, transferables).then(fromWireValue);\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if (last === createEndpoint) {\n return requestResponseMessage(ep, {\n type: \"ENDPOINT\" /* MessageType.ENDPOINT */,\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn’t happen.\n if (last === \"bind\") {\n return createProxy(ep, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, {\n type: \"APPLY\" /* MessageType.APPLY */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, {\n type: \"CONSTRUCT\" /* MessageType.CONSTRUCT */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n });\n registerProxy(proxy, ep);\n return proxy;\n }\n function myFlat(arr) {\n return Array.prototype.concat.apply([], arr);\n }\n function processArguments(argumentList) {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n }\n const transferCache = new WeakMap();\n function transfer(obj, transfers) {\n transferCache.set(obj, transfers);\n return obj;\n }\n function proxy(obj) {\n return Object.assign(obj, { [proxyMarker]: true });\n }\n function toWireValue(value) {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: \"HANDLER\" /* WireValueType.HANDLER */,\n name,\n value: serializedValue,\n },\n transferables,\n ];\n }\n }\n return [\n {\n type: \"RAW\" /* WireValueType.RAW */,\n value,\n },\n transferCache.get(value) || [],\n ];\n }\n function fromWireValue(value) {\n switch (value.type) {\n case \"HANDLER\" /* WireValueType.HANDLER */:\n return transferHandlers.get(value.name).deserialize(value.value);\n case \"RAW\" /* WireValueType.RAW */:\n return value.value;\n }\n }\n function requestResponseMessage(ep, msg, transfers) {\n return new Promise((resolve) => {\n const id = generateUUID();\n ep.addEventListener(\"message\", function l(ev) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener(\"message\", l);\n resolve(ev.data);\n });\n if (ep.start) {\n ep.start();\n }\n ep.postMessage(Object.assign({ id }, msg), transfers);\n });\n }\n function generateUUID() {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n }\n\n /**\n * MatrixRenderer class is meant to be used within a Web Worker context,\n * using Comlink to facilitate communication between the main thread and the worker.\n * The MatrixRenderer class manages a matrix of dies, once an instance of MatrixRenderer is created,\n * it is exposed to the main thread using Comlink's `expose` method.\n * This setup is used in the wafer-map component to perform heavy computational duties\n */\n class MatrixRenderer {\n constructor() {\n this.dieMatrix = Uint8Array.from([]);\n }\n emptyMatrix() {\n this.dieMatrix = Uint8Array.from([]);\n }\n updateMatrix(data) {\n this.dieMatrix = Uint8Array.from(data);\n }\n }\n expose(MatrixRenderer);\n\n exports.MatrixRenderer = MatrixRenderer;\n\n return exports;\n\n})({});\n";
|
|
2
|
+
export const workerCode = "var MatrixRenderer = (function (exports) {\n 'use strict';\n\n /**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n const proxyMarker = Symbol(\"Comlink.proxy\");\n const createEndpoint = Symbol(\"Comlink.endpoint\");\n const releaseProxy = Symbol(\"Comlink.releaseProxy\");\n const finalizer = Symbol(\"Comlink.finalizer\");\n const throwMarker = Symbol(\"Comlink.thrown\");\n const isObject = (val) => (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n /**\n * Internal transfer handle to handle objects marked to proxy.\n */\n const proxyTransferHandler = {\n canHandle: (val) => isObject(val) && val[proxyMarker],\n serialize(obj) {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port1);\n return [port2, [port2]];\n },\n deserialize(port) {\n port.start();\n return wrap(port);\n },\n };\n /**\n * Internal transfer handler to handle thrown exceptions.\n */\n const throwTransferHandler = {\n canHandle: (value) => isObject(value) && throwMarker in value,\n serialize({ value }) {\n let serialized;\n if (value instanceof Error) {\n serialized = {\n isError: true,\n value: {\n message: value.message,\n name: value.name,\n stack: value.stack,\n },\n };\n }\n else {\n serialized = { isError: false, value };\n }\n return [serialized, []];\n },\n deserialize(serialized) {\n if (serialized.isError) {\n throw Object.assign(new Error(serialized.value.message), serialized.value);\n }\n throw serialized.value;\n },\n };\n /**\n * Allows customizing the serialization of certain values.\n */\n const transferHandlers = new Map([\n [\"proxy\", proxyTransferHandler],\n [\"throw\", throwTransferHandler],\n ]);\n function isAllowedOrigin(allowedOrigins, origin) {\n for (const allowedOrigin of allowedOrigins) {\n if (origin === allowedOrigin || allowedOrigin === \"*\") {\n return true;\n }\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n return true;\n }\n }\n return false;\n }\n function expose(obj, ep = globalThis, allowedOrigins = [\"*\"]) {\n ep.addEventListener(\"message\", function callback(ev) {\n if (!ev || !ev.data) {\n return;\n }\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\n return;\n }\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n let returnValue;\n try {\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n switch (type) {\n case \"GET\" /* MessageType.GET */:\n {\n returnValue = rawValue;\n }\n break;\n case \"SET\" /* MessageType.SET */:\n {\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n returnValue = true;\n }\n break;\n case \"APPLY\" /* MessageType.APPLY */:\n {\n returnValue = rawValue.apply(parent, argumentList);\n }\n break;\n case \"CONSTRUCT\" /* MessageType.CONSTRUCT */:\n {\n const value = new rawValue(...argumentList);\n returnValue = proxy(value);\n }\n break;\n case \"ENDPOINT\" /* MessageType.ENDPOINT */:\n {\n const { port1, port2 } = new MessageChannel();\n expose(obj, port2);\n returnValue = transfer(port1, [port1]);\n }\n break;\n case \"RELEASE\" /* MessageType.RELEASE */:\n {\n returnValue = undefined;\n }\n break;\n default:\n return;\n }\n }\n catch (value) {\n returnValue = { value, [throwMarker]: 0 };\n }\n Promise.resolve(returnValue)\n .catch((value) => {\n return { value, [throwMarker]: 0 };\n })\n .then((returnValue) => {\n const [wireValue, transferables] = toWireValue(returnValue);\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n if (type === \"RELEASE\" /* MessageType.RELEASE */) {\n // detach and deactive after sending release response above.\n ep.removeEventListener(\"message\", callback);\n closeEndPoint(ep);\n if (finalizer in obj && typeof obj[finalizer] === \"function\") {\n obj[finalizer]();\n }\n }\n })\n .catch((error) => {\n // Send Serialization Error To Caller\n const [wireValue, transferables] = toWireValue({\n value: new TypeError(\"Unserializable return value\"),\n [throwMarker]: 0,\n });\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n });\n });\n if (ep.start) {\n ep.start();\n }\n }\n function isMessagePort(endpoint) {\n return endpoint.constructor.name === \"MessagePort\";\n }\n function closeEndPoint(endpoint) {\n if (isMessagePort(endpoint))\n endpoint.close();\n }\n function wrap(ep, target) {\n return createProxy(ep, [], target);\n }\n function throwIfProxyReleased(isReleased) {\n if (isReleased) {\n throw new Error(\"Proxy has been released and is not useable\");\n }\n }\n function releaseEndpoint(ep) {\n return requestResponseMessage(ep, {\n type: \"RELEASE\" /* MessageType.RELEASE */,\n }).then(() => {\n closeEndPoint(ep);\n });\n }\n const proxyCounter = new WeakMap();\n const proxyFinalizers = \"FinalizationRegistry\" in globalThis &&\n new FinalizationRegistry((ep) => {\n const newCount = (proxyCounter.get(ep) || 0) - 1;\n proxyCounter.set(ep, newCount);\n if (newCount === 0) {\n releaseEndpoint(ep);\n }\n });\n function registerProxy(proxy, ep) {\n const newCount = (proxyCounter.get(ep) || 0) + 1;\n proxyCounter.set(ep, newCount);\n if (proxyFinalizers) {\n proxyFinalizers.register(proxy, ep, proxy);\n }\n }\n function unregisterProxy(proxy) {\n if (proxyFinalizers) {\n proxyFinalizers.unregister(proxy);\n }\n }\n function createProxy(ep, path = [], target = function () { }) {\n let isProxyReleased = false;\n const proxy = new Proxy(target, {\n get(_target, prop) {\n throwIfProxyReleased(isProxyReleased);\n if (prop === releaseProxy) {\n return () => {\n unregisterProxy(proxy);\n releaseEndpoint(ep);\n isProxyReleased = true;\n };\n }\n if (prop === \"then\") {\n if (path.length === 0) {\n return { then: () => proxy };\n }\n const r = requestResponseMessage(ep, {\n type: \"GET\" /* MessageType.GET */,\n path: path.map((p) => p.toString()),\n }).then(fromWireValue);\n return r.then.bind(r);\n }\n return createProxy(ep, [...path, prop]);\n },\n set(_target, prop, rawValue) {\n throwIfProxyReleased(isProxyReleased);\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n const [value, transferables] = toWireValue(rawValue);\n return requestResponseMessage(ep, {\n type: \"SET\" /* MessageType.SET */,\n path: [...path, prop].map((p) => p.toString()),\n value,\n }, transferables).then(fromWireValue);\n },\n apply(_target, _thisArg, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const last = path[path.length - 1];\n if (last === createEndpoint) {\n return requestResponseMessage(ep, {\n type: \"ENDPOINT\" /* MessageType.ENDPOINT */,\n }).then(fromWireValue);\n }\n // We just pretend that `bind()` didn’t happen.\n if (last === \"bind\") {\n return createProxy(ep, path.slice(0, -1));\n }\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, {\n type: \"APPLY\" /* MessageType.APPLY */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n construct(_target, rawArgumentList) {\n throwIfProxyReleased(isProxyReleased);\n const [argumentList, transferables] = processArguments(rawArgumentList);\n return requestResponseMessage(ep, {\n type: \"CONSTRUCT\" /* MessageType.CONSTRUCT */,\n path: path.map((p) => p.toString()),\n argumentList,\n }, transferables).then(fromWireValue);\n },\n });\n registerProxy(proxy, ep);\n return proxy;\n }\n function myFlat(arr) {\n return Array.prototype.concat.apply([], arr);\n }\n function processArguments(argumentList) {\n const processed = argumentList.map(toWireValue);\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n }\n const transferCache = new WeakMap();\n function transfer(obj, transfers) {\n transferCache.set(obj, transfers);\n return obj;\n }\n function proxy(obj) {\n return Object.assign(obj, { [proxyMarker]: true });\n }\n function toWireValue(value) {\n for (const [name, handler] of transferHandlers) {\n if (handler.canHandle(value)) {\n const [serializedValue, transferables] = handler.serialize(value);\n return [\n {\n type: \"HANDLER\" /* WireValueType.HANDLER */,\n name,\n value: serializedValue,\n },\n transferables,\n ];\n }\n }\n return [\n {\n type: \"RAW\" /* WireValueType.RAW */,\n value,\n },\n transferCache.get(value) || [],\n ];\n }\n function fromWireValue(value) {\n switch (value.type) {\n case \"HANDLER\" /* WireValueType.HANDLER */:\n return transferHandlers.get(value.name).deserialize(value.value);\n case \"RAW\" /* WireValueType.RAW */:\n return value.value;\n }\n }\n function requestResponseMessage(ep, msg, transfers) {\n return new Promise((resolve) => {\n const id = generateUUID();\n ep.addEventListener(\"message\", function l(ev) {\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\n return;\n }\n ep.removeEventListener(\"message\", l);\n resolve(ev.data);\n });\n if (ep.start) {\n ep.start();\n }\n ep.postMessage(Object.assign({ id }, msg), transfers);\n });\n }\n function generateUUID() {\n return new Array(4)\n .fill(0)\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n .join(\"-\");\n }\n\n /**\n * MatrixRenderer class is meant to be used within a Web Worker context,\n * using Comlink to facilitate communication between the main thread and the worker.\n * The MatrixRenderer class manages a matrix of dies, once an instance of MatrixRenderer is created,\n * it is exposed to the main thread using Comlink's `expose` method.\n * This setup is used in the wafer-map component to perform heavy computational duties\n */\n class MatrixRenderer {\n constructor() {\n this.columnIndexes = Int32Array.from([]);\n this.rowIndexes = Int32Array.from([]);\n this.values = Float64Array.from([]);\n this.scaledColumnIndex = Float64Array.from([]);\n this.scaledRowIndex = Float64Array.from([]);\n this.columnIndexPositions = Int32Array.from([]);\n this.scaleX = 1;\n this.scaleY = 1;\n this.baseX = 1;\n this.baseY = 1;\n this.dieDimensions = { width: 1, height: 1 };\n this.transform = { k: 1, x: 0, y: 0 };\n this.smallestMarginPossible = 20;\n this.margin = {\n top: this.smallestMarginPossible,\n right: this.smallestMarginPossible,\n bottom: this.smallestMarginPossible,\n left: this.smallestMarginPossible\n };\n }\n calculateXScaledIndex(columnIndex) {\n return this.scaleX * columnIndex + this.baseX + this.margin.left;\n }\n calculateYScaledIndex(rowIndex) {\n return this.scaleY * rowIndex + this.baseY + this.margin.top;\n }\n setColumnIndexes(columnIndexes) {\n this.columnIndexes = columnIndexes;\n if (columnIndexes.length === 0 || this.columnIndexes[0] === undefined) {\n return;\n }\n const scaledColumnIndex = [\n this.calculateXScaledIndex(this.columnIndexes[0])\n ];\n const columnPositions = [0];\n let prev = this.columnIndexes[0];\n for (let i = 1; i < this.columnIndexes.length; i++) {\n const xIndex = this.columnIndexes[i];\n if (xIndex && xIndex !== prev) {\n const scaledX = this.calculateXScaledIndex(this.columnIndexes[i]);\n scaledColumnIndex.push(scaledX);\n columnPositions.push(i);\n prev = xIndex;\n }\n }\n this.scaledColumnIndex = Float64Array.from(scaledColumnIndex);\n this.columnIndexPositions = Int32Array.from(columnPositions);\n }\n setRowIndexes(rowIndexesBuffer) {\n this.rowIndexes = rowIndexesBuffer;\n this.scaledRowIndex = new Float64Array(this.rowIndexes.length);\n for (let i = 0; i < this.rowIndexes.length; i++) {\n this.scaledRowIndex[i] = this.calculateYScaledIndex(this.rowIndexes[i]);\n }\n }\n setMargin(margin) {\n this.margin = margin;\n }\n setCanvasCorners(topLeft, bottomRight) {\n this.topLeftCanvasCorner = topLeft;\n this.bottomRightCanvasCorner = bottomRight;\n }\n setDiesDimensions(data) {\n this.dieDimensions = { width: data.width, height: data.height };\n }\n setScaling(scaleX, scaleY) {\n this.scaleX = scaleX;\n this.scaleY = scaleY;\n }\n setBases(baseX, baseY) {\n this.baseX = baseX;\n this.baseY = baseY;\n }\n setTransform(transform) {\n this.transform = transform;\n }\n setCanvas(canvas) {\n this.canvas = canvas;\n this.context = canvas.getContext('2d');\n }\n getMatrix() {\n return {\n columnIndexes: this.columnIndexes,\n rowIndexes: this.rowIndexes,\n values: this.values\n };\n }\n emptyMatrix() {\n this.columnIndexes = Int32Array.from([]);\n this.rowIndexes = Int32Array.from([]);\n this.values = Float64Array.from([]);\n }\n scaleCanvas() {\n this.context.translate(this.transform.x, this.transform.y);\n this.context.scale(this.transform.k, this.transform.k);\n }\n updateMatrix(data) {\n this.columnIndexes = Int32Array.from(data.columnIndexes);\n this.rowIndexes = Int32Array.from(data.rowIndexes);\n this.values = Float64Array.from(data.values);\n }\n setCanvasDimensions(data) {\n this.canvas.width = data.width;\n this.canvas.height = data.height;\n }\n getCanvasDimensions() {\n return {\n width: this.canvas.width,\n height: this.canvas.height\n };\n }\n clearCanvas() {\n this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);\n }\n drawWafer() {\n this.context.restore();\n this.context.save();\n this.clearCanvas();\n this.scaleCanvas();\n if (this.topLeftCanvasCorner === undefined\n || this.bottomRightCanvasCorner === undefined) {\n throw new Error('Canvas corners are not set');\n }\n for (let i = 0; i < this.scaledColumnIndex.length; i++) {\n const scaledX = this.scaledColumnIndex[i];\n if (!(scaledX >= this.topLeftCanvasCorner.x\n && scaledX < this.bottomRightCanvasCorner.x)) {\n continue;\n }\n // columnIndexPositions is used to get chunks to determine the start and end index of the column, it looks something like [0, 1, 4, 9, 12]\n // This means that the first column has a start index of 0 and an end index of 1, the second column has a start index of 1 and an end index of 4, and so on\n // scaledRowIndex is used when we reach the end of the columnIndexPositions, when columnIndexPositions is [0, 1, 4, 9, 12], scaledRowIndex is 13\n const columnEndIndex = this.columnIndexPositions[i + 1] !== undefined\n ? this.columnIndexPositions[i + 1]\n : this.scaledRowIndex.length;\n for (let columnStartIndex = this.columnIndexPositions[i]; columnStartIndex < columnEndIndex; columnStartIndex++) {\n const scaledY = this.scaledRowIndex[columnStartIndex];\n if (!(scaledY >= this.topLeftCanvasCorner.y\n && scaledY < this.bottomRightCanvasCorner.y)) {\n continue;\n }\n // Fill style is temporary green for all dies, will be replaced with a color based on the value of the die in a future implementation\n this.context.fillStyle = 'Green';\n this.context.fillRect(scaledX, scaledY, this.dieDimensions.width, this.dieDimensions.height);\n }\n }\n }\n }\n expose(MatrixRenderer);\n\n exports.MatrixRenderer = MatrixRenderer;\n\n return exports;\n\n})({});\n";
|
|
3
3
|
//# sourceMappingURL=matrix-renderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matrix-renderer.js","sourceRoot":"","sources":["../../../../src/wafer-map/workers/matrix-renderer.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,CAAC,MAAM,UAAU,GAAG,yhcAAyhc,CAAC","sourcesContent":["// eslint-disable-next-line no-template-curly-in-string\nexport const workerCode = \"var MatrixRenderer = (function (exports) {\\n 'use strict';\\n\\n /**\\n * @license\\n * Copyright 2019 Google LLC\\n * SPDX-License-Identifier: Apache-2.0\\n */\\n const proxyMarker = Symbol(\\\"Comlink.proxy\\\");\\n const createEndpoint = Symbol(\\\"Comlink.endpoint\\\");\\n const releaseProxy = Symbol(\\\"Comlink.releaseProxy\\\");\\n const finalizer = Symbol(\\\"Comlink.finalizer\\\");\\n const throwMarker = Symbol(\\\"Comlink.thrown\\\");\\n const isObject = (val) => (typeof val === \\\"object\\\" && val !== null) || typeof val === \\\"function\\\";\\n /**\\n * Internal transfer handle to handle objects marked to proxy.\\n */\\n const proxyTransferHandler = {\\n canHandle: (val) => isObject(val) && val[proxyMarker],\\n serialize(obj) {\\n const { port1, port2 } = new MessageChannel();\\n expose(obj, port1);\\n return [port2, [port2]];\\n },\\n deserialize(port) {\\n port.start();\\n return wrap(port);\\n },\\n };\\n /**\\n * Internal transfer handler to handle thrown exceptions.\\n */\\n const throwTransferHandler = {\\n canHandle: (value) => isObject(value) && throwMarker in value,\\n serialize({ value }) {\\n let serialized;\\n if (value instanceof Error) {\\n serialized = {\\n isError: true,\\n value: {\\n message: value.message,\\n name: value.name,\\n stack: value.stack,\\n },\\n };\\n }\\n else {\\n serialized = { isError: false, value };\\n }\\n return [serialized, []];\\n },\\n deserialize(serialized) {\\n if (serialized.isError) {\\n throw Object.assign(new Error(serialized.value.message), serialized.value);\\n }\\n throw serialized.value;\\n },\\n };\\n /**\\n * Allows customizing the serialization of certain values.\\n */\\n const transferHandlers = new Map([\\n [\\\"proxy\\\", proxyTransferHandler],\\n [\\\"throw\\\", throwTransferHandler],\\n ]);\\n function isAllowedOrigin(allowedOrigins, origin) {\\n for (const allowedOrigin of allowedOrigins) {\\n if (origin === allowedOrigin || allowedOrigin === \\\"*\\\") {\\n return true;\\n }\\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\\n return true;\\n }\\n }\\n return false;\\n }\\n function expose(obj, ep = globalThis, allowedOrigins = [\\\"*\\\"]) {\\n ep.addEventListener(\\\"message\\\", function callback(ev) {\\n if (!ev || !ev.data) {\\n return;\\n }\\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\\n return;\\n }\\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\\n let returnValue;\\n try {\\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\\n switch (type) {\\n case \\\"GET\\\" /* MessageType.GET */:\\n {\\n returnValue = rawValue;\\n }\\n break;\\n case \\\"SET\\\" /* MessageType.SET */:\\n {\\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\\n returnValue = true;\\n }\\n break;\\n case \\\"APPLY\\\" /* MessageType.APPLY */:\\n {\\n returnValue = rawValue.apply(parent, argumentList);\\n }\\n break;\\n case \\\"CONSTRUCT\\\" /* MessageType.CONSTRUCT */:\\n {\\n const value = new rawValue(...argumentList);\\n returnValue = proxy(value);\\n }\\n break;\\n case \\\"ENDPOINT\\\" /* MessageType.ENDPOINT */:\\n {\\n const { port1, port2 } = new MessageChannel();\\n expose(obj, port2);\\n returnValue = transfer(port1, [port1]);\\n }\\n break;\\n case \\\"RELEASE\\\" /* MessageType.RELEASE */:\\n {\\n returnValue = undefined;\\n }\\n break;\\n default:\\n return;\\n }\\n }\\n catch (value) {\\n returnValue = { value, [throwMarker]: 0 };\\n }\\n Promise.resolve(returnValue)\\n .catch((value) => {\\n return { value, [throwMarker]: 0 };\\n })\\n .then((returnValue) => {\\n const [wireValue, transferables] = toWireValue(returnValue);\\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\\n if (type === \\\"RELEASE\\\" /* MessageType.RELEASE */) {\\n // detach and deactive after sending release response above.\\n ep.removeEventListener(\\\"message\\\", callback);\\n closeEndPoint(ep);\\n if (finalizer in obj && typeof obj[finalizer] === \\\"function\\\") {\\n obj[finalizer]();\\n }\\n }\\n })\\n .catch((error) => {\\n // Send Serialization Error To Caller\\n const [wireValue, transferables] = toWireValue({\\n value: new TypeError(\\\"Unserializable return value\\\"),\\n [throwMarker]: 0,\\n });\\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\\n });\\n });\\n if (ep.start) {\\n ep.start();\\n }\\n }\\n function isMessagePort(endpoint) {\\n return endpoint.constructor.name === \\\"MessagePort\\\";\\n }\\n function closeEndPoint(endpoint) {\\n if (isMessagePort(endpoint))\\n endpoint.close();\\n }\\n function wrap(ep, target) {\\n return createProxy(ep, [], target);\\n }\\n function throwIfProxyReleased(isReleased) {\\n if (isReleased) {\\n throw new Error(\\\"Proxy has been released and is not useable\\\");\\n }\\n }\\n function releaseEndpoint(ep) {\\n return requestResponseMessage(ep, {\\n type: \\\"RELEASE\\\" /* MessageType.RELEASE */,\\n }).then(() => {\\n closeEndPoint(ep);\\n });\\n }\\n const proxyCounter = new WeakMap();\\n const proxyFinalizers = \\\"FinalizationRegistry\\\" in globalThis &&\\n new FinalizationRegistry((ep) => {\\n const newCount = (proxyCounter.get(ep) || 0) - 1;\\n proxyCounter.set(ep, newCount);\\n if (newCount === 0) {\\n releaseEndpoint(ep);\\n }\\n });\\n function registerProxy(proxy, ep) {\\n const newCount = (proxyCounter.get(ep) || 0) + 1;\\n proxyCounter.set(ep, newCount);\\n if (proxyFinalizers) {\\n proxyFinalizers.register(proxy, ep, proxy);\\n }\\n }\\n function unregisterProxy(proxy) {\\n if (proxyFinalizers) {\\n proxyFinalizers.unregister(proxy);\\n }\\n }\\n function createProxy(ep, path = [], target = function () { }) {\\n let isProxyReleased = false;\\n const proxy = new Proxy(target, {\\n get(_target, prop) {\\n throwIfProxyReleased(isProxyReleased);\\n if (prop === releaseProxy) {\\n return () => {\\n unregisterProxy(proxy);\\n releaseEndpoint(ep);\\n isProxyReleased = true;\\n };\\n }\\n if (prop === \\\"then\\\") {\\n if (path.length === 0) {\\n return { then: () => proxy };\\n }\\n const r = requestResponseMessage(ep, {\\n type: \\\"GET\\\" /* MessageType.GET */,\\n path: path.map((p) => p.toString()),\\n }).then(fromWireValue);\\n return r.then.bind(r);\\n }\\n return createProxy(ep, [...path, prop]);\\n },\\n set(_target, prop, rawValue) {\\n throwIfProxyReleased(isProxyReleased);\\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\\n // boolean. To show good will, we return true asynchronously ¯\\\\_(ツ)_/¯\\n const [value, transferables] = toWireValue(rawValue);\\n return requestResponseMessage(ep, {\\n type: \\\"SET\\\" /* MessageType.SET */,\\n path: [...path, prop].map((p) => p.toString()),\\n value,\\n }, transferables).then(fromWireValue);\\n },\\n apply(_target, _thisArg, rawArgumentList) {\\n throwIfProxyReleased(isProxyReleased);\\n const last = path[path.length - 1];\\n if (last === createEndpoint) {\\n return requestResponseMessage(ep, {\\n type: \\\"ENDPOINT\\\" /* MessageType.ENDPOINT */,\\n }).then(fromWireValue);\\n }\\n // We just pretend that `bind()` didn’t happen.\\n if (last === \\\"bind\\\") {\\n return createProxy(ep, path.slice(0, -1));\\n }\\n const [argumentList, transferables] = processArguments(rawArgumentList);\\n return requestResponseMessage(ep, {\\n type: \\\"APPLY\\\" /* MessageType.APPLY */,\\n path: path.map((p) => p.toString()),\\n argumentList,\\n }, transferables).then(fromWireValue);\\n },\\n construct(_target, rawArgumentList) {\\n throwIfProxyReleased(isProxyReleased);\\n const [argumentList, transferables] = processArguments(rawArgumentList);\\n return requestResponseMessage(ep, {\\n type: \\\"CONSTRUCT\\\" /* MessageType.CONSTRUCT */,\\n path: path.map((p) => p.toString()),\\n argumentList,\\n }, transferables).then(fromWireValue);\\n },\\n });\\n registerProxy(proxy, ep);\\n return proxy;\\n }\\n function myFlat(arr) {\\n return Array.prototype.concat.apply([], arr);\\n }\\n function processArguments(argumentList) {\\n const processed = argumentList.map(toWireValue);\\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\\n }\\n const transferCache = new WeakMap();\\n function transfer(obj, transfers) {\\n transferCache.set(obj, transfers);\\n return obj;\\n }\\n function proxy(obj) {\\n return Object.assign(obj, { [proxyMarker]: true });\\n }\\n function toWireValue(value) {\\n for (const [name, handler] of transferHandlers) {\\n if (handler.canHandle(value)) {\\n const [serializedValue, transferables] = handler.serialize(value);\\n return [\\n {\\n type: \\\"HANDLER\\\" /* WireValueType.HANDLER */,\\n name,\\n value: serializedValue,\\n },\\n transferables,\\n ];\\n }\\n }\\n return [\\n {\\n type: \\\"RAW\\\" /* WireValueType.RAW */,\\n value,\\n },\\n transferCache.get(value) || [],\\n ];\\n }\\n function fromWireValue(value) {\\n switch (value.type) {\\n case \\\"HANDLER\\\" /* WireValueType.HANDLER */:\\n return transferHandlers.get(value.name).deserialize(value.value);\\n case \\\"RAW\\\" /* WireValueType.RAW */:\\n return value.value;\\n }\\n }\\n function requestResponseMessage(ep, msg, transfers) {\\n return new Promise((resolve) => {\\n const id = generateUUID();\\n ep.addEventListener(\\\"message\\\", function l(ev) {\\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\\n return;\\n }\\n ep.removeEventListener(\\\"message\\\", l);\\n resolve(ev.data);\\n });\\n if (ep.start) {\\n ep.start();\\n }\\n ep.postMessage(Object.assign({ id }, msg), transfers);\\n });\\n }\\n function generateUUID() {\\n return new Array(4)\\n .fill(0)\\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\\n .join(\\\"-\\\");\\n }\\n\\n /**\\n * MatrixRenderer class is meant to be used within a Web Worker context,\\n * using Comlink to facilitate communication between the main thread and the worker.\\n * The MatrixRenderer class manages a matrix of dies, once an instance of MatrixRenderer is created,\\n * it is exposed to the main thread using Comlink's `expose` method.\\n * This setup is used in the wafer-map component to perform heavy computational duties\\n */\\n class MatrixRenderer {\\n constructor() {\\n this.dieMatrix = Uint8Array.from([]);\\n }\\n emptyMatrix() {\\n this.dieMatrix = Uint8Array.from([]);\\n }\\n updateMatrix(data) {\\n this.dieMatrix = Uint8Array.from(data);\\n }\\n }\\n expose(MatrixRenderer);\\n\\n exports.MatrixRenderer = MatrixRenderer;\\n\\n return exports;\\n\\n})({});\\n\";\n"]}
|
|
1
|
+
{"version":3,"file":"matrix-renderer.js","sourceRoot":"","sources":["../../../../src/wafer-map/workers/matrix-renderer.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,CAAC,MAAM,UAAU,GAAG,i1oBAAi1oB,CAAC","sourcesContent":["// eslint-disable-next-line no-template-curly-in-string\nexport const workerCode = \"var MatrixRenderer = (function (exports) {\\n 'use strict';\\n\\n /**\\n * @license\\n * Copyright 2019 Google LLC\\n * SPDX-License-Identifier: Apache-2.0\\n */\\n const proxyMarker = Symbol(\\\"Comlink.proxy\\\");\\n const createEndpoint = Symbol(\\\"Comlink.endpoint\\\");\\n const releaseProxy = Symbol(\\\"Comlink.releaseProxy\\\");\\n const finalizer = Symbol(\\\"Comlink.finalizer\\\");\\n const throwMarker = Symbol(\\\"Comlink.thrown\\\");\\n const isObject = (val) => (typeof val === \\\"object\\\" && val !== null) || typeof val === \\\"function\\\";\\n /**\\n * Internal transfer handle to handle objects marked to proxy.\\n */\\n const proxyTransferHandler = {\\n canHandle: (val) => isObject(val) && val[proxyMarker],\\n serialize(obj) {\\n const { port1, port2 } = new MessageChannel();\\n expose(obj, port1);\\n return [port2, [port2]];\\n },\\n deserialize(port) {\\n port.start();\\n return wrap(port);\\n },\\n };\\n /**\\n * Internal transfer handler to handle thrown exceptions.\\n */\\n const throwTransferHandler = {\\n canHandle: (value) => isObject(value) && throwMarker in value,\\n serialize({ value }) {\\n let serialized;\\n if (value instanceof Error) {\\n serialized = {\\n isError: true,\\n value: {\\n message: value.message,\\n name: value.name,\\n stack: value.stack,\\n },\\n };\\n }\\n else {\\n serialized = { isError: false, value };\\n }\\n return [serialized, []];\\n },\\n deserialize(serialized) {\\n if (serialized.isError) {\\n throw Object.assign(new Error(serialized.value.message), serialized.value);\\n }\\n throw serialized.value;\\n },\\n };\\n /**\\n * Allows customizing the serialization of certain values.\\n */\\n const transferHandlers = new Map([\\n [\\\"proxy\\\", proxyTransferHandler],\\n [\\\"throw\\\", throwTransferHandler],\\n ]);\\n function isAllowedOrigin(allowedOrigins, origin) {\\n for (const allowedOrigin of allowedOrigins) {\\n if (origin === allowedOrigin || allowedOrigin === \\\"*\\\") {\\n return true;\\n }\\n if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\\n return true;\\n }\\n }\\n return false;\\n }\\n function expose(obj, ep = globalThis, allowedOrigins = [\\\"*\\\"]) {\\n ep.addEventListener(\\\"message\\\", function callback(ev) {\\n if (!ev || !ev.data) {\\n return;\\n }\\n if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\\n console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\\n return;\\n }\\n const { id, type, path } = Object.assign({ path: [] }, ev.data);\\n const argumentList = (ev.data.argumentList || []).map(fromWireValue);\\n let returnValue;\\n try {\\n const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\\n const rawValue = path.reduce((obj, prop) => obj[prop], obj);\\n switch (type) {\\n case \\\"GET\\\" /* MessageType.GET */:\\n {\\n returnValue = rawValue;\\n }\\n break;\\n case \\\"SET\\\" /* MessageType.SET */:\\n {\\n parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\\n returnValue = true;\\n }\\n break;\\n case \\\"APPLY\\\" /* MessageType.APPLY */:\\n {\\n returnValue = rawValue.apply(parent, argumentList);\\n }\\n break;\\n case \\\"CONSTRUCT\\\" /* MessageType.CONSTRUCT */:\\n {\\n const value = new rawValue(...argumentList);\\n returnValue = proxy(value);\\n }\\n break;\\n case \\\"ENDPOINT\\\" /* MessageType.ENDPOINT */:\\n {\\n const { port1, port2 } = new MessageChannel();\\n expose(obj, port2);\\n returnValue = transfer(port1, [port1]);\\n }\\n break;\\n case \\\"RELEASE\\\" /* MessageType.RELEASE */:\\n {\\n returnValue = undefined;\\n }\\n break;\\n default:\\n return;\\n }\\n }\\n catch (value) {\\n returnValue = { value, [throwMarker]: 0 };\\n }\\n Promise.resolve(returnValue)\\n .catch((value) => {\\n return { value, [throwMarker]: 0 };\\n })\\n .then((returnValue) => {\\n const [wireValue, transferables] = toWireValue(returnValue);\\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\\n if (type === \\\"RELEASE\\\" /* MessageType.RELEASE */) {\\n // detach and deactive after sending release response above.\\n ep.removeEventListener(\\\"message\\\", callback);\\n closeEndPoint(ep);\\n if (finalizer in obj && typeof obj[finalizer] === \\\"function\\\") {\\n obj[finalizer]();\\n }\\n }\\n })\\n .catch((error) => {\\n // Send Serialization Error To Caller\\n const [wireValue, transferables] = toWireValue({\\n value: new TypeError(\\\"Unserializable return value\\\"),\\n [throwMarker]: 0,\\n });\\n ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\\n });\\n });\\n if (ep.start) {\\n ep.start();\\n }\\n }\\n function isMessagePort(endpoint) {\\n return endpoint.constructor.name === \\\"MessagePort\\\";\\n }\\n function closeEndPoint(endpoint) {\\n if (isMessagePort(endpoint))\\n endpoint.close();\\n }\\n function wrap(ep, target) {\\n return createProxy(ep, [], target);\\n }\\n function throwIfProxyReleased(isReleased) {\\n if (isReleased) {\\n throw new Error(\\\"Proxy has been released and is not useable\\\");\\n }\\n }\\n function releaseEndpoint(ep) {\\n return requestResponseMessage(ep, {\\n type: \\\"RELEASE\\\" /* MessageType.RELEASE */,\\n }).then(() => {\\n closeEndPoint(ep);\\n });\\n }\\n const proxyCounter = new WeakMap();\\n const proxyFinalizers = \\\"FinalizationRegistry\\\" in globalThis &&\\n new FinalizationRegistry((ep) => {\\n const newCount = (proxyCounter.get(ep) || 0) - 1;\\n proxyCounter.set(ep, newCount);\\n if (newCount === 0) {\\n releaseEndpoint(ep);\\n }\\n });\\n function registerProxy(proxy, ep) {\\n const newCount = (proxyCounter.get(ep) || 0) + 1;\\n proxyCounter.set(ep, newCount);\\n if (proxyFinalizers) {\\n proxyFinalizers.register(proxy, ep, proxy);\\n }\\n }\\n function unregisterProxy(proxy) {\\n if (proxyFinalizers) {\\n proxyFinalizers.unregister(proxy);\\n }\\n }\\n function createProxy(ep, path = [], target = function () { }) {\\n let isProxyReleased = false;\\n const proxy = new Proxy(target, {\\n get(_target, prop) {\\n throwIfProxyReleased(isProxyReleased);\\n if (prop === releaseProxy) {\\n return () => {\\n unregisterProxy(proxy);\\n releaseEndpoint(ep);\\n isProxyReleased = true;\\n };\\n }\\n if (prop === \\\"then\\\") {\\n if (path.length === 0) {\\n return { then: () => proxy };\\n }\\n const r = requestResponseMessage(ep, {\\n type: \\\"GET\\\" /* MessageType.GET */,\\n path: path.map((p) => p.toString()),\\n }).then(fromWireValue);\\n return r.then.bind(r);\\n }\\n return createProxy(ep, [...path, prop]);\\n },\\n set(_target, prop, rawValue) {\\n throwIfProxyReleased(isProxyReleased);\\n // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\\n // boolean. To show good will, we return true asynchronously ¯\\\\_(ツ)_/¯\\n const [value, transferables] = toWireValue(rawValue);\\n return requestResponseMessage(ep, {\\n type: \\\"SET\\\" /* MessageType.SET */,\\n path: [...path, prop].map((p) => p.toString()),\\n value,\\n }, transferables).then(fromWireValue);\\n },\\n apply(_target, _thisArg, rawArgumentList) {\\n throwIfProxyReleased(isProxyReleased);\\n const last = path[path.length - 1];\\n if (last === createEndpoint) {\\n return requestResponseMessage(ep, {\\n type: \\\"ENDPOINT\\\" /* MessageType.ENDPOINT */,\\n }).then(fromWireValue);\\n }\\n // We just pretend that `bind()` didn’t happen.\\n if (last === \\\"bind\\\") {\\n return createProxy(ep, path.slice(0, -1));\\n }\\n const [argumentList, transferables] = processArguments(rawArgumentList);\\n return requestResponseMessage(ep, {\\n type: \\\"APPLY\\\" /* MessageType.APPLY */,\\n path: path.map((p) => p.toString()),\\n argumentList,\\n }, transferables).then(fromWireValue);\\n },\\n construct(_target, rawArgumentList) {\\n throwIfProxyReleased(isProxyReleased);\\n const [argumentList, transferables] = processArguments(rawArgumentList);\\n return requestResponseMessage(ep, {\\n type: \\\"CONSTRUCT\\\" /* MessageType.CONSTRUCT */,\\n path: path.map((p) => p.toString()),\\n argumentList,\\n }, transferables).then(fromWireValue);\\n },\\n });\\n registerProxy(proxy, ep);\\n return proxy;\\n }\\n function myFlat(arr) {\\n return Array.prototype.concat.apply([], arr);\\n }\\n function processArguments(argumentList) {\\n const processed = argumentList.map(toWireValue);\\n return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\\n }\\n const transferCache = new WeakMap();\\n function transfer(obj, transfers) {\\n transferCache.set(obj, transfers);\\n return obj;\\n }\\n function proxy(obj) {\\n return Object.assign(obj, { [proxyMarker]: true });\\n }\\n function toWireValue(value) {\\n for (const [name, handler] of transferHandlers) {\\n if (handler.canHandle(value)) {\\n const [serializedValue, transferables] = handler.serialize(value);\\n return [\\n {\\n type: \\\"HANDLER\\\" /* WireValueType.HANDLER */,\\n name,\\n value: serializedValue,\\n },\\n transferables,\\n ];\\n }\\n }\\n return [\\n {\\n type: \\\"RAW\\\" /* WireValueType.RAW */,\\n value,\\n },\\n transferCache.get(value) || [],\\n ];\\n }\\n function fromWireValue(value) {\\n switch (value.type) {\\n case \\\"HANDLER\\\" /* WireValueType.HANDLER */:\\n return transferHandlers.get(value.name).deserialize(value.value);\\n case \\\"RAW\\\" /* WireValueType.RAW */:\\n return value.value;\\n }\\n }\\n function requestResponseMessage(ep, msg, transfers) {\\n return new Promise((resolve) => {\\n const id = generateUUID();\\n ep.addEventListener(\\\"message\\\", function l(ev) {\\n if (!ev.data || !ev.data.id || ev.data.id !== id) {\\n return;\\n }\\n ep.removeEventListener(\\\"message\\\", l);\\n resolve(ev.data);\\n });\\n if (ep.start) {\\n ep.start();\\n }\\n ep.postMessage(Object.assign({ id }, msg), transfers);\\n });\\n }\\n function generateUUID() {\\n return new Array(4)\\n .fill(0)\\n .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\\n .join(\\\"-\\\");\\n }\\n\\n /**\\n * MatrixRenderer class is meant to be used within a Web Worker context,\\n * using Comlink to facilitate communication between the main thread and the worker.\\n * The MatrixRenderer class manages a matrix of dies, once an instance of MatrixRenderer is created,\\n * it is exposed to the main thread using Comlink's `expose` method.\\n * This setup is used in the wafer-map component to perform heavy computational duties\\n */\\n class MatrixRenderer {\\n constructor() {\\n this.columnIndexes = Int32Array.from([]);\\n this.rowIndexes = Int32Array.from([]);\\n this.values = Float64Array.from([]);\\n this.scaledColumnIndex = Float64Array.from([]);\\n this.scaledRowIndex = Float64Array.from([]);\\n this.columnIndexPositions = Int32Array.from([]);\\n this.scaleX = 1;\\n this.scaleY = 1;\\n this.baseX = 1;\\n this.baseY = 1;\\n this.dieDimensions = { width: 1, height: 1 };\\n this.transform = { k: 1, x: 0, y: 0 };\\n this.smallestMarginPossible = 20;\\n this.margin = {\\n top: this.smallestMarginPossible,\\n right: this.smallestMarginPossible,\\n bottom: this.smallestMarginPossible,\\n left: this.smallestMarginPossible\\n };\\n }\\n calculateXScaledIndex(columnIndex) {\\n return this.scaleX * columnIndex + this.baseX + this.margin.left;\\n }\\n calculateYScaledIndex(rowIndex) {\\n return this.scaleY * rowIndex + this.baseY + this.margin.top;\\n }\\n setColumnIndexes(columnIndexes) {\\n this.columnIndexes = columnIndexes;\\n if (columnIndexes.length === 0 || this.columnIndexes[0] === undefined) {\\n return;\\n }\\n const scaledColumnIndex = [\\n this.calculateXScaledIndex(this.columnIndexes[0])\\n ];\\n const columnPositions = [0];\\n let prev = this.columnIndexes[0];\\n for (let i = 1; i < this.columnIndexes.length; i++) {\\n const xIndex = this.columnIndexes[i];\\n if (xIndex && xIndex !== prev) {\\n const scaledX = this.calculateXScaledIndex(this.columnIndexes[i]);\\n scaledColumnIndex.push(scaledX);\\n columnPositions.push(i);\\n prev = xIndex;\\n }\\n }\\n this.scaledColumnIndex = Float64Array.from(scaledColumnIndex);\\n this.columnIndexPositions = Int32Array.from(columnPositions);\\n }\\n setRowIndexes(rowIndexesBuffer) {\\n this.rowIndexes = rowIndexesBuffer;\\n this.scaledRowIndex = new Float64Array(this.rowIndexes.length);\\n for (let i = 0; i < this.rowIndexes.length; i++) {\\n this.scaledRowIndex[i] = this.calculateYScaledIndex(this.rowIndexes[i]);\\n }\\n }\\n setMargin(margin) {\\n this.margin = margin;\\n }\\n setCanvasCorners(topLeft, bottomRight) {\\n this.topLeftCanvasCorner = topLeft;\\n this.bottomRightCanvasCorner = bottomRight;\\n }\\n setDiesDimensions(data) {\\n this.dieDimensions = { width: data.width, height: data.height };\\n }\\n setScaling(scaleX, scaleY) {\\n this.scaleX = scaleX;\\n this.scaleY = scaleY;\\n }\\n setBases(baseX, baseY) {\\n this.baseX = baseX;\\n this.baseY = baseY;\\n }\\n setTransform(transform) {\\n this.transform = transform;\\n }\\n setCanvas(canvas) {\\n this.canvas = canvas;\\n this.context = canvas.getContext('2d');\\n }\\n getMatrix() {\\n return {\\n columnIndexes: this.columnIndexes,\\n rowIndexes: this.rowIndexes,\\n values: this.values\\n };\\n }\\n emptyMatrix() {\\n this.columnIndexes = Int32Array.from([]);\\n this.rowIndexes = Int32Array.from([]);\\n this.values = Float64Array.from([]);\\n }\\n scaleCanvas() {\\n this.context.translate(this.transform.x, this.transform.y);\\n this.context.scale(this.transform.k, this.transform.k);\\n }\\n updateMatrix(data) {\\n this.columnIndexes = Int32Array.from(data.columnIndexes);\\n this.rowIndexes = Int32Array.from(data.rowIndexes);\\n this.values = Float64Array.from(data.values);\\n }\\n setCanvasDimensions(data) {\\n this.canvas.width = data.width;\\n this.canvas.height = data.height;\\n }\\n getCanvasDimensions() {\\n return {\\n width: this.canvas.width,\\n height: this.canvas.height\\n };\\n }\\n clearCanvas() {\\n this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);\\n }\\n drawWafer() {\\n this.context.restore();\\n this.context.save();\\n this.clearCanvas();\\n this.scaleCanvas();\\n if (this.topLeftCanvasCorner === undefined\\n || this.bottomRightCanvasCorner === undefined) {\\n throw new Error('Canvas corners are not set');\\n }\\n for (let i = 0; i < this.scaledColumnIndex.length; i++) {\\n const scaledX = this.scaledColumnIndex[i];\\n if (!(scaledX >= this.topLeftCanvasCorner.x\\n && scaledX < this.bottomRightCanvasCorner.x)) {\\n continue;\\n }\\n // columnIndexPositions is used to get chunks to determine the start and end index of the column, it looks something like [0, 1, 4, 9, 12]\\n // This means that the first column has a start index of 0 and an end index of 1, the second column has a start index of 1 and an end index of 4, and so on\\n // scaledRowIndex is used when we reach the end of the columnIndexPositions, when columnIndexPositions is [0, 1, 4, 9, 12], scaledRowIndex is 13\\n const columnEndIndex = this.columnIndexPositions[i + 1] !== undefined\\n ? this.columnIndexPositions[i + 1]\\n : this.scaledRowIndex.length;\\n for (let columnStartIndex = this.columnIndexPositions[i]; columnStartIndex < columnEndIndex; columnStartIndex++) {\\n const scaledY = this.scaledRowIndex[columnStartIndex];\\n if (!(scaledY >= this.topLeftCanvasCorner.y\\n && scaledY < this.bottomRightCanvasCorner.y)) {\\n continue;\\n }\\n // Fill style is temporary green for all dies, will be replaced with a color based on the value of the die in a future implementation\\n this.context.fillStyle = 'Green';\\n this.context.fillRect(scaledX, scaledY, this.dieDimensions.width, this.dieDimensions.height);\\n }\\n }\\n }\\n }\\n expose(MatrixRenderer);\\n\\n exports.MatrixRenderer = MatrixRenderer;\\n\\n return exports;\\n\\n})({});\\n\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ni/nimble-components",
|
|
3
|
-
"version": "27.0.
|
|
3
|
+
"version": "27.0.1",
|
|
4
4
|
"description": "Styled web components for the NI Nimble Design System",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "npm run generate-icons && npm run generate-workers && npm run build-components && npm run bundle-components && npm run generate-scss && npm run build-storybook",
|
|
@@ -131,6 +131,7 @@
|
|
|
131
131
|
"@storybook/manager-api": "^8.0.4",
|
|
132
132
|
"@storybook/theming": "^8.0.4",
|
|
133
133
|
"@types/jasmine": "^5.1.4",
|
|
134
|
+
"@types/offscreencanvas": "^2019.7.3",
|
|
134
135
|
"@types/webpack-env": "^1.15.2",
|
|
135
136
|
"babel-loader": "^9.1.2",
|
|
136
137
|
"circular-dependency-plugin": "^5.2.0",
|