diff --git a/package-lock.json b/package-lock.json index 4995d06d04..b43302f34c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -106,7 +106,8 @@ "source-map-explorer": "^2.5.3", "stylelint": "^16.20.0", "ts-jest": "^29.2.5", - "typescript": "^5.8.3" + "typescript": "^5.8.3", + "workerize-loader": "^2.0.2" }, "peerDependencies": { "monaco-yql-languages": ">=1.3.0", @@ -29475,6 +29476,19 @@ "workbox-core": "6.6.0" } }, + "node_modules/workerize-loader": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/workerize-loader/-/workerize-loader-2.0.2.tgz", + "integrity": "sha512-HoZ6XY4sHWxA2w0WpzgBwUiR3dv1oo7bS+oCwIpb6n54MclQ/7KXdXsVIChTCygyuHtVuGBO1+i3HzTt699UJQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0" + }, + "peerDependencies": { + "webpack": "*" + } + }, "node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", diff --git a/package.json b/package.json index d2e0fd9e39..e5c9c82fb3 100644 --- a/package.json +++ b/package.json @@ -169,7 +169,8 @@ "source-map-explorer": "^2.5.3", "stylelint": "^16.20.0", "ts-jest": "^29.2.5", - "typescript": "^5.8.3" + "typescript": "^5.8.3", + "workerize-loader": "^2.0.2" }, "peerDependencies": { "monaco-yql-languages": ">=1.3.0", diff --git a/src/components/Graph/BlockComponents/StageBlockComponent.tsx b/src/components/Graph/BlockComponents/StageBlockComponent.tsx index 3150130194..a6c4404c26 100644 --- a/src/components/Graph/BlockComponents/StageBlockComponent.tsx +++ b/src/components/Graph/BlockComponents/StageBlockComponent.tsx @@ -16,7 +16,7 @@ export const StageBlockComponent = ({className, block}: Props) => { ? block.operators.map((item) =>
{item}
) : block.name} {block.tables ? ( -
+
{i18n('label_tables')}: {block.tables.join(', ')}
diff --git a/src/components/Graph/GravityGraph.tsx b/src/components/Graph/GravityGraph.tsx index 64e7078519..1eef4609b2 100644 --- a/src/components/Graph/GravityGraph.tsx +++ b/src/components/Graph/GravityGraph.tsx @@ -3,6 +3,8 @@ import React from 'react'; import {GraphState} from '@gravity-ui/graph'; import type {HookGraphParams} from '@gravity-ui/graph/react'; import {GraphBlock, GraphCanvas, useGraph, useGraphEvent} from '@gravity-ui/graph/react'; +// @ts-ignore - workerize-loader syntax +import createWorker from 'workerize-loader!./treeLayout.worker'; import {cn} from '../../utils/cn'; @@ -66,25 +68,21 @@ export function GravityGraph({data, theme}: Props) { const {graph, start} = useGraph(config); React.useEffect(() => { - // Just in case, although mounting takes more time than calculation - const worker = new Worker(new URL('./treeLayout', import.meta.url)); - worker.postMessage({ - nodes: data.nodes, - links: data.links, - }); - - worker.onmessage = function (e) { - const {layout, edges} = e.data; - - graph.setEntities({ - blocks: layout, - connections: edges, + // Using workerize-loader to inline the worker and avoid CORS issues + const worker = createWorker(); + + // Call the exported function from the worker + worker + .calculateLayout(data.nodes, data.links) + .then((result: {layout: any; edges: any}) => { + graph.setEntities({ + blocks: result.layout, + connections: result.edges, + }); + }) + .catch((err: Error) => { + console.error('Worker error:', err); }); - }; - - worker.onerror = (err) => { - console.error(err); - }; return () => { worker.terminate(); diff --git a/src/components/Graph/treeLayout.ts b/src/components/Graph/treeLayout.worker.ts similarity index 99% rename from src/components/Graph/treeLayout.ts rename to src/components/Graph/treeLayout.worker.ts index df78f52aa9..d3739a88eb 100644 --- a/src/components/Graph/treeLayout.ts +++ b/src/components/Graph/treeLayout.worker.ts @@ -359,15 +359,15 @@ function calculateTreeEdges(layoutResult: ExtendedTBlock[], connections: TConnec return connectionPaths; } -onmessage = function (e) { - const {nodes, links} = e.data; +// Export function for workerize-loader +export function calculateLayout(nodes: any[], links: any[]) { const blocks = prepareBlocks(nodes); const connections = prepareConnections(links); const layout = calculateTreeLayout(blocks, connections); const edges = calculateTreeEdges(layout, connections); - postMessage({ + return { layout, edges, - }); -}; + }; +}