UNPKG

aes70

Version:

A controller library for the AES70 protocol.

83 lines (65 loc) 2.06 kB
import { createType } from './createType.js'; export function OcaMultiMap(KeyType, ValueType) { const kencodedLength = KeyType.encodedLength; const kencodeTo = KeyType.encodeTo; const kdecodeFrom = KeyType.decodeFrom; const kdecodeLength = KeyType.decodeLength; const vencodedLength = ValueType.encodedLength; const vencodeTo = ValueType.encodeTo; const vdecodeFrom = ValueType.decodeFrom; const vdecodeLength = ValueType.decodeLength; return createType({ isConstantLength: false, encodedLength: function (value) { if (!(value instanceof Map || value instanceof WeakMap)) throw new TypeError('Expected Map or WeakMap'); let result = 2; value.forEach((set, key) => { result += kencodedLength(key) * set.size; set.forEach((value) => { result += vencodedLength(value); }); }); return result; }, encodeTo: function (dataView, pos, value) { const size_pos = pos; let size = 0; pos += 2; value.forEach((set, key) => { size += set.size; set.forEach((value) => { pos = kencodeTo(dataView, pos, key); pos = vencodeTo(dataView, pos, value); }); }); dataView.setUint16(size_pos, size); return pos; }, decodeFrom: function (dataView, pos) { const result = new Map(); const length = dataView.getUint16(pos); pos += 2; for (let i = 0; i < length; i++) { let key, value; [pos, key] = kdecodeFrom(dataView, pos); [pos, value] = vdecodeFrom(dataView, pos); let set = result.get(key); if (!set) { result.set(key, (set = new Set())); } set.add(value); } return [pos, result]; }, decodeLength: function (dataView, pos) { const length = dataView.getUint16(pos); pos += 2; for (let i = 0; i < length; i++) { pos = kdecodeLength(dataView, pos); pos = vdecodeLength(dataView, pos); } return pos; }, }); }