@whisklabs/grpc
Version:
gRPC generator and http library for typescript
187 lines • 7.05 kB
JavaScript
"use strict";
/* eslint-disable @typescript-eslint/strict-boolean-expressions, @typescript-eslint/no-explicit-any */
Object.defineProperty(exports, "__esModule", { value: true });
exports.Default = exports.Decode = exports.Encode = void 0;
var typeguards_1 = require("@whisklabs/typeguards");
var constant_1 = require("./constant");
var default_1 = require("./default");
var packed_1 = require("./packed");
var read_1 = require("./read");
var write_1 = require("./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 };
}
var Encode = function (struct, obj) {
return EncodeHelper(new write_1.BufWrite(), struct, obj).get();
};
exports.Encode = Encode;
function EncodeHelper(buf, struct, obj) {
var f = GetStruct(struct).f;
if ((0, typeguards_1.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 = (0, typeguards_1.isText)(oneof) ? obj[oneof] : undefined;
var val = (0, typeguards_1.isObject)(one) && fieldName === one.oneof ? one.value : obj[fieldName];
if ((0, typeguards_1.isPresent)(val)) {
EncodeWrite(buf, item, tag, val);
}
}
}
return buf;
}
function EncodeWrite(buf, item, tag, val) {
if ((0, typeguards_1.isString)(item) && write_1.writeMap[item]) {
write_1.writeMap[item](buf, tag, val);
}
else if ((0, typeguards_1.isFunction)(item)) {
var enc = EncodeHelper(new write_1.BufWrite(), item, val);
(0, write_1.writeTag)(buf, tag, constant_1.Bytes);
(0, write_1.writeVarint)(buf, enc.buf.length);
buf.concat(enc.buf);
}
else if ((0, typeguards_1.isArray)(item)) {
if (item[0] === 'repeated' && (0, typeguards_1.isArray)(val)) {
if (packed_1.PACKED[item[1]]) {
(0, write_1.writePacked)(write_1.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' && (0, typeguards_1.isObject)(val)) {
for (var key in val) {
var value = val[key];
EncodeWrite(buf, (0, constant_1.MapStruct)(item), tag, { key: key, value: value });
}
}
else if (item[0] === 'wrapper') {
EncodeWrite(buf, (0, constant_1.WrapperStruct)(item[1]), tag, { value: val });
}
}
}
var Decode = function (struct, buffer) {
return DecodeHelper(new read_1.BufRead(buffer), struct);
};
exports.Decode = Decode;
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 || (0, typeguards_1.isPresent)(result[nameField])) {
continue;
}
if (oneof) {
if (!result[oneof]) {
result[oneof] = {
oneof: nameField,
value: GetDefault(item),
};
}
}
else {
var val = GetDefault(item);
if ((0, typeguards_1.isPresent)(val)) {
result[nameField] = val;
}
}
}
return result;
}
var Default = function (struct) { return DecodeDefault(struct); };
exports.Default = Default;
var GetDefault = function (item) {
return (0, typeguards_1.isString)(item)
? (0, default_1.getDefault)(item)
: (0, typeguards_1.isFunction)(item)
? DecodeDefault(item)
: item[0] === 'repeated'
? []
: item[0] === 'map'
? {}
: item[0] === 'wrapper'
? (0, default_1.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 = (0, read_1.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) {
(0, read_1.skip)(b, val);
}
}
return DecodeDefault(struct, result);
}
function DecodeRead(b, fieldName, result, path, item) {
if ((0, typeguards_1.isString)(item)) {
if (read_1.readMap[item]) {
result[fieldName] = (0, default_1.getDefault)(item, read_1.readMap[item](b));
}
}
else if ((0, typeguards_1.isFunction)(item)) {
result[fieldName] = DecodeHelper(b, item, {}, path, (0, read_1.uint32)(b) + b.pos);
}
else if ((0, typeguards_1.isArray)(item)) {
if (item[0] === 'repeated') {
if ((0, typeguards_1.isString)(item[1]) && packed_1.PACKED[item[1]]) {
result[fieldName] = (0, read_1.readPacked)(read_1.readMap[item[1]], b);
}
else {
var mm = result[fieldName];
var m = (0, typeguards_1.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 = (0, typeguards_1.isObject)(mm) ? mm : {};
result[fieldName] = m;
var o = DecodeHelper(b, (0, constant_1.MapStruct)(item), {}, path, (0, read_1.uint32)(b) + b.pos);
m[o.key] = o.value;
}
else if (item[0] === 'wrapper') {
var o = DecodeHelper(b, (0, constant_1.WrapperStruct)(item[1]), {}, path, (0, read_1.uint32)(b) + b.pos);
result[fieldName] = o.value;
}
}
}
//# sourceMappingURL=index.js.map