UNPKG

@whisklabs/grpc

Version:

gRPC generator and http library for typescript

181 lines 6.37 kB
/* eslint-disable @typescript-eslint/strict-boolean-expressions, @typescript-eslint/no-explicit-any */ import { isArray, isFunction, isObject, isPresent, isString, isText } from '@whisklabs/typeguards'; import { Bytes, MapStruct, WrapperStruct } from './constant'; import { getDefault } from './default'; import { PACKED } from './packed'; import { BufRead, readMap, readPacked, skip, uint32 } from './read'; import { BufWrite, writeMap, writeMapRaw, writePacked, writeTag, writeVarint, } from './write'; function GetStruct(struct) { var st = struct; var s = st.s, f = st.f; if (s && f) { return { s: s, f: f }; } s = s || {}; f = f || struct(); for (var _i = 0, f_1 = f; _i < f_1.length; _i++) { var field = f_1[_i]; s[field[0]] = field; } st.f = f; st.s = s; return { s: s, f: f }; } export var Encode = function (struct, obj) { return EncodeHelper(new BufWrite(), struct, obj).get(); }; function EncodeHelper(buf, struct, obj) { var f = GetStruct(struct).f; if (isObject(obj)) { for (var _i = 0, f_2 = f; _i < f_2.length; _i++) { var _a = f_2[_i], tag = _a[0], fieldName = _a[1], item = _a[2], _ = _a[3], oneof = _a[4]; var one = isText(oneof) ? obj[oneof] : undefined; var val = isObject(one) && fieldName === one.oneof ? one.value : obj[fieldName]; if (isPresent(val)) { EncodeWrite(buf, item, tag, val); } } } return buf; } function EncodeWrite(buf, item, tag, val) { if (isString(item) && writeMap[item]) { writeMap[item](buf, tag, val); } else if (isFunction(item)) { var enc = EncodeHelper(new BufWrite(), item, val); writeTag(buf, tag, Bytes); writeVarint(buf, enc.buf.length); buf.concat(enc.buf); } else if (isArray(item)) { if (item[0] === 'repeated' && isArray(val)) { if (PACKED[item[1]]) { writePacked(writeMapRaw[item[1]], buf, tag, val); } else { for (var _i = 0, val_1 = val; _i < val_1.length; _i++) { var v = val_1[_i]; EncodeWrite(buf, item[1], tag, v); } } } else if (item[0] === 'map' && isObject(val)) { for (var key in val) { var value = val[key]; EncodeWrite(buf, MapStruct(item), tag, { key: key, value: value }); } } else if (item[0] === 'wrapper') { EncodeWrite(buf, WrapperStruct(item[1]), tag, { value: val }); } } } export var Decode = function (struct, buffer) { return DecodeHelper(new BufRead(buffer), struct); }; function DecodeDefault(struct, result) { if (result === void 0) { result = {}; } var f = GetStruct(struct).f; for (var _i = 0, f_3 = f; _i < f_3.length; _i++) { var field = f_3[_i]; var nameField = field[1], item = field[2], required = field[3], oneof = field[4]; if (required !== 1 || isPresent(result[nameField])) { continue; } if (oneof) { if (!result[oneof]) { result[oneof] = { oneof: nameField, value: GetDefault(item), }; } } else { var val = GetDefault(item); if (isPresent(val)) { result[nameField] = val; } } } return result; } export var Default = function (struct) { return DecodeDefault(struct); }; var GetDefault = function (item) { return isString(item) ? getDefault(item) : isFunction(item) ? DecodeDefault(item) : item[0] === 'repeated' ? [] : item[0] === 'map' ? {} : item[0] === 'wrapper' ? getDefault(item[1]) : undefined; }; function DecodeHelper(b, struct, result, path, end) { if (result === void 0) { result = {}; } if (path === void 0) { path = ''; } var s = GetStruct(struct).s; end = end || b.buf.length; b.path = path; while (b.pos < end) { var val = uint32(b); var tag = val >> 3; var startPos = b.pos; b.type = val & 0x7; if (s[tag]) { var _a = s[tag], id = _a[0], nameField = _a[1], item = _a[2], oneof = _a[4]; DecodeRead(b, nameField, result, "".concat(path ? "".concat(path, ".") : '').concat(nameField, "[").concat(id, "]"), item); if (oneof) { if (result[nameField]) { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment result[oneof] = { oneof: nameField, value: result[nameField] }; } delete result[nameField]; } } if (b.pos === startPos) { skip(b, val); } } return DecodeDefault(struct, result); } function DecodeRead(b, fieldName, result, path, item) { if (isString(item)) { if (readMap[item]) { result[fieldName] = getDefault(item, readMap[item](b)); } } else if (isFunction(item)) { result[fieldName] = DecodeHelper(b, item, {}, path, uint32(b) + b.pos); } else if (isArray(item)) { if (item[0] === 'repeated') { if (isString(item[1]) && PACKED[item[1]]) { result[fieldName] = readPacked(readMap[item[1]], b); } else { var mm = result[fieldName]; var m = isArray(mm) ? mm : []; result[fieldName] = m; var o = {}; DecodeRead(b, 'out', o, path, item[1]); m.push(o.out); } } else if (item[0] === 'map') { var mm = result[fieldName]; var m = isObject(mm) ? mm : {}; result[fieldName] = m; var o = DecodeHelper(b, MapStruct(item), {}, path, uint32(b) + b.pos); m[o.key] = o.value; } else if (item[0] === 'wrapper') { var o = DecodeHelper(b, WrapperStruct(item[1]), {}, path, uint32(b) + b.pos); result[fieldName] = o.value; } } } //# sourceMappingURL=index.js.map