@devgrid/messagepack
Version:
Extandable MessagePack serializer
98 lines • 3.34 kB
JavaScript
import Long from 'long';
import Serializer from './serializer';
import { createError, getStdErrorId } from './errors';
export const registerCommonTypesFor = (s) => {
s.register(126, Error, (obj, buf) => {
buf.writeUInt16BE(getStdErrorId(obj));
s.encode(obj.name, buf);
s.encode(obj.stack, buf);
s.encode(obj.message, buf);
const customFields = Object.keys(obj).filter((key) => !['stack', 'message', 'name'].includes(key) && obj[key] !== undefined);
buf.writeUInt16BE(customFields.length);
for (const key of customFields) {
s.encode(key, buf);
s.encode(obj[key], buf);
}
}, (buf) => {
const id = buf.readUInt16BE();
const name = s.decode(buf);
const stack = s.decode(buf);
const message = s.decode(buf);
const error = createError(id, message, stack);
error.name = name;
const customFieldsCount = buf.readUInt16BE();
for (let i = 0; i < customFieldsCount; i++) {
const key = s.decode(buf);
const value = s.decode(buf);
error[key] = value;
}
return error;
});
s.register(125, Date, (obj, buf) => {
buf.writeUInt64BE(obj.getTime());
}, (buf) => new Date(buf.readUInt64BE().toNumber()));
s.register(124, Map, (obj, buf) => {
buf.writeUInt32BE(obj.size);
for (const [key, val] of obj.entries()) {
s.encode(key, buf);
s.encode(val, buf);
}
}, (buf) => {
const map = new Map();
const size = buf.readUInt32BE();
for (let i = 0; i < size; i++) {
const key = s.decode(buf);
const val = s.decode(buf);
map.set(key, val);
}
return map;
});
s.register(123, Set, (obj, buf) => {
buf.writeUInt32BE(obj.size);
for (const val of obj.values()) {
s.encode(val, buf);
}
}, (buf) => {
const set = new Set();
const size = buf.readUInt32BE();
for (let i = 0; i < size; i++) {
const val = s.decode(buf);
set.add(val);
}
return set;
});
s.register(121, RegExp, (obj, buf) => {
s.encode(obj.source, buf);
s.encode(obj.flags, buf);
}, (buf) => {
const source = s.decode(buf);
const flags = s.decode(buf);
return new RegExp(source, flags);
});
s.register(120, BigInt, (obj, buf) => {
const str = obj.toString();
s.encode(str, buf);
}, (buf) => {
const str = s.decode(buf);
return BigInt(str);
});
s.register(119, Long, (obj, buf) => {
buf.writeInt8(obj.unsigned ? 1 : 0);
if (obj.unsigned) {
buf.writeUInt64BE(obj);
}
else {
buf.writeInt64BE(obj);
}
}, (buf) => {
const unsigned = Boolean(buf.readInt8());
return unsigned ? buf.readUInt64BE() : buf.readInt64BE();
});
};
export { Serializer };
export const serializer = new Serializer();
registerCommonTypesFor(serializer);
export const encode = (obj) => serializer.encode(obj).toBuffer();
export const decode = (buf) => serializer.decode(buf);
export const tryDecode = (buf) => serializer.decoder.tryDecode(buf);
//# sourceMappingURL=index.js.map