1const CHANNEL = 'diagram.zip:renderer:v1'2const ENGINE = 'diagramsnet'3const VERSION = 'diagrams.net@29.6.1'4const BUILD = 'diagramsnet-29.6.1-client-unit-1'5const MAX_SOURCE_LENGTH = 524_2886const MAX_OUTPUT_LENGTH = 4_194_3047const RENDER_TIMEOUT = 20_00089let latest = 010let queue = Promise.resolve()1112function reply(origin, message) {13 parent.postMessage({ channel: CHANNEL, ...message }, origin)14}1516function allowedOrigin() {17 try { return document.referrer ? new URL(document.referrer).origin : null } catch { return null }18}1920async function renderMessage(message, origin, sequence) {21 if (sequence !== latest) return22 if (typeof message.source !== 'string' || message.source.length > MAX_SOURCE_LENGTH) throw new Error('Diagrams.net source must be a string no larger than 512 KB.')23 document.getElementById('LoadingComplete')?.remove()24 const graph = render({ xml: message.source, format: 'svg' })25 const deadline = Date.now() + RENDER_TIMEOUT26 while (!document.getElementById('LoadingComplete')) {27 if (sequence !== latest) return28 if (Date.now() >= deadline) throw new Error('Diagrams.net rendering timed out.')29 await new Promise(resolve => setTimeout(resolve, 10))30 }31 if (sequence !== latest) return32 const background = graph.background === mxConstants.NONE ? null : graph.background33 const svg = new XMLSerializer().serializeToString(graph.getSvg(background, 1, 0, false, null, true, null, null))34 if (svg.length > MAX_OUTPUT_LENGTH) throw new Error('Diagrams.net SVG output is too large.')35 reply(origin, { type: 'result', requestId: message.requestId, ok: true, svg, version: VERSION, build: BUILD, pipeline: [ENGINE] })36}3738window.addEventListener('message', event => {39 const message = event.data40 const origin = allowedOrigin()41 if (event.source !== parent || message?.channel !== CHANNEL || message?.type !== 'render' || message?.engine !== ENGINE || typeof message?.requestId !== 'string') return42 const sequence = ++latest43 queue = queue.then(async () => {44 if (sequence !== latest) return45 try { await renderMessage(message, origin ?? '*', sequence) }46 catch (error) { if (sequence === latest) reply(origin ?? '*', { type: 'result', requestId: message.requestId, ok: false, error: error instanceof Error ? error.message.slice(0, 500) : 'Diagrams.net rendering failed.' }) }47 })48})4950reply(allowedOrigin() ?? '*', { type: 'ready', engine: ENGINE, version: VERSION, build: BUILD })