import type { GraphDocument2d } from './types'; import { copyExpressionPresentation } from '#lib/document/expression-presentation.js'; /** * Build the plain-data transfer object expected by Wasm and the render worker. * Svelte state can contain nested proxies, which the structured-clone algorithm * used by Worker.postMessage cannot clone. */ export function toTransferableDocument(document: GraphDocument2d): GraphDocument2d { const copy: GraphDocument2d = { viewport: { ...document.viewport }, expressions: document.expressions.map((expression) => { const result: GraphDocument2d['expressions'][number] = { id: expression.id, input_mode: expression.input_mode, source: expression.source, ...copyExpressionPresentation(expression), enabled: expression.enabled, color: expression.color }; if (expression.slider !== undefined) { const slider: NonNullable = {}; if (expression.slider.min !== undefined) { slider.min = expression.slider.min; } if (expression.slider.max !== undefined) { slider.max = expression.slider.max; } if (expression.slider.step !== undefined) { slider.step = expression.slider.step; } result.slider = slider; } return result; }) }; if (document.name !== undefined) { copy.name = document.name; } if (document.complex_mode !== undefined) { copy.complex_mode = document.complex_mode; } if (document.grid_cell_size !== undefined) { copy.grid_cell_size = document.grid_cell_size; } if (document.variable_overrides !== undefined) { copy.variable_overrides = { ...document.variable_overrides }; } return copy; }