@whisklabs/grpc
Version:
gRPC generator and http library for typescript
181 lines • 6.37 kB
JavaScript
/* 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