UNPKG

molstar

Version:

A comprehensive macromolecular library.

168 lines 5.36 kB
/** * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info. * * Taken/adapted from DensityServer (https://github.com/dsehnal/DensityServer) * * @author David Sehnal <david.sehnal@gmail.com> */ import * as UTF8 from '../../../mol-io/common/utf8'; export var bool = { kind: 'bool' }; export var int = { kind: 'int' }; export var float = { kind: 'float' }; export var str = { kind: 'string' }; export function array(element) { return { kind: 'array', element: element }; } export function obj(schema) { return { kind: 'object', props: schema.map(function (s) { return ({ element: s[1], prop: s[0] }); }) }; } function byteCount(e, src) { var size = 0; switch (e.kind) { case 'bool': size += 1; break; case 'int': size += 4; break; case 'float': size += 8; break; case 'string': size += 4 + UTF8.utf8ByteCount(src); break; case 'array': { size += 4; // array length for (var _i = 0, src_1 = src; _i < src_1.length; _i++) { var x = src_1[_i]; size += byteCount(e.element, x); } break; } case 'object': { for (var _a = 0, _b = e.props; _a < _b.length; _a++) { var p = _b[_a]; size += byteCount(p.element, src[p.prop]); } break; } } return size; } function writeElement(e, buffer, src, offset) { switch (e.kind) { case 'bool': buffer.writeInt8(src ? 1 : 0, offset); offset += 1; break; case 'int': buffer.writeInt32LE(src | 0, offset); offset += 4; break; case 'float': buffer.writeDoubleLE(+src, offset); offset += 8; break; case 'string': { var val = '' + src; var size = UTF8.utf8ByteCount(val); buffer.writeInt32LE(size, offset); offset += 4; // str len var str_1 = new Uint8Array(size); UTF8.utf8Write(str_1, 0, val); for (var _i = 0, _a = str_1; _i < _a.length; _i++) { var b = _a[_i]; buffer.writeUInt8(b, offset); offset++; } break; } case 'array': { buffer.writeInt32LE(src.length, offset); offset += 4; // array length for (var _b = 0, src_2 = src; _b < src_2.length; _b++) { var x = src_2[_b]; offset = writeElement(e.element, buffer, x, offset); } break; } case 'object': { for (var _c = 0, _d = e.props; _c < _d.length; _c++) { var p = _d[_c]; offset = writeElement(p.element, buffer, src[p.prop], offset); } break; } } return offset; } function write(element, src) { var size = byteCount(element, src); var buffer = Buffer.alloc(size); writeElement(element, buffer, src, 0); return buffer; } export function encode(element, src) { return write(element, src); } function decodeElement(e, buffer, offset, target) { switch (e.kind) { case 'bool': target.value = !!buffer.readInt8(offset); offset += 1; break; case 'int': target.value = buffer.readInt32LE(offset); offset += 4; break; case 'float': target.value = buffer.readDoubleLE(offset); offset += 8; break; case 'string': { var size = buffer.readInt32LE(offset); offset += 4; // str len var str_2 = new Uint8Array(size); for (var i = 0; i < size; i++) { str_2[i] = buffer.readUInt8(offset); offset++; } target.value = UTF8.utf8Read(str_2, 0, size); break; } case 'array': { var array_1 = []; var count = buffer.readInt32LE(offset); var element = { value: void 0 }; offset += 4; for (var i = 0; i < count; i++) { offset = decodeElement(e.element, buffer, offset, element); array_1.push(element.value); } target.value = array_1; break; } case 'object': { var t = Object.create(null); var element = { value: void 0 }; for (var _i = 0, _a = e.props; _i < _a.length; _i++) { var p = _a[_i]; offset = decodeElement(p.element, buffer, offset, element); t[p.prop] = element.value; } target.value = t; break; } } return offset; } export function decode(element, buffer, offset) { var target = { value: void 0 }; decodeElement(element, buffer, offset | 0, target); return target.value; } //# sourceMappingURL=binary-schema.js.map