UNPKG

@lynx-js/web-core

Version:

This is an internal experimental package, do not use

83 lines 3.37 kB
import { TemplateSectionLabel, MagicHeader0, MagicHeader1, } from '../constants.js'; import { decode_style_info } from './wasm.js'; import { decodeBinaryMap } from '../common/decodeUtils.js'; export function decodeTemplate(buffer, transformVW, transformVH, transformREM) { if (buffer.length < 8) { throw new Error('Buffer too short for Magic Header'); } const view = new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength); const magic0 = view.getUint32(0, true); const magic1 = view.getUint32(4, true); if (magic0 !== MagicHeader0 || magic1 !== MagicHeader1) { throw new Error('Invalid Magic Header'); } let offset = 8; // Version if (buffer.length < offset + 4) { throw new Error('Unexpected EOF reading version'); } const version = view.getUint32(offset, true); offset += 4; if (version > 1) { throw new Error(`Unsupported version: ${version}`); } let config = {}; let styleInfo; let lepusCode = {}; let customSections; while (offset < buffer.length) { if (buffer.length < offset + 4) { break; // EOF or partial } const label = view.getUint32(offset, true); offset += 4; if (buffer.length < offset + 4) { throw new Error('Unexpected EOF reading section length'); } const length = view.getUint32(offset, true); offset += 4; if (buffer.length < offset + length) { throw new Error(`Unexpected EOF reading section content. Expected ${length} bytes.`); } const content = buffer.subarray(offset, offset + length); offset += length; switch (label) { case TemplateSectionLabel.Configurations: { const decoder = new TextDecoder('utf-16le'); const jsonString = decoder.decode(content); config = JSON.parse(jsonString); break; } case TemplateSectionLabel.StyleInfo: { const buffer = decode_style_info(content, config['isLazy'] === 'true' ? '' : undefined, // URL is not available in synchronous decode usually, or passed as arg? The user req says "uint8array as params decode directly". Assuming URL is empty or unneeded for sync server decode unless specified. config['enableCSSSelector'] === 'true', transformVW, transformVH, transformREM); styleInfo = buffer; break; } case TemplateSectionLabel.LepusCode: { lepusCode = decodeBinaryMap(content); break; } case TemplateSectionLabel.CustomSections: { const decoder = new TextDecoder('utf-16le'); customSections = JSON.parse(decoder.decode(content)); break; } case TemplateSectionLabel.Manifest: case TemplateSectionLabel.ElementTemplates: { // Ignore these sections for now break; } default: // Ignore unknown sections or throw? Worker throws. throw new Error(`Unknown section label: ${label}`); } } return { config, styleInfo, lepusCode, customSections, }; } //# sourceMappingURL=decode.js.map