stt-serde-mjs
Version:
STT serializer and deserializer for Douyu danmaku
63 lines (56 loc) • 1.89 kB
JavaScript
const regex = /[^/]+@=[^/]*\//g;
const regexArraySplitter = /[^/]+\//g;
/**
* A function to serialize a JSON into string
* @param records A JSON object to be serialized to string
* @return STT serialized string
*/
const serialize = (records) => {
if (records === null) {
return '';
}
if (typeof records === 'string') {
return records.replace(/@/g, '@A').replace(/\//g, '@S');
}
if (typeof records === 'number') {
return records.toString();
}
let serializedString = '';
if (Array.isArray(records)) {
return records.map(record => serialize(record).replace(/@/g, '@A').replace(/\//g, '@S') + '/').join('');
}
Object.entries(records).forEach(([key, value]) => {
serializedString = serializedString + serialize(key).replace(/@/g, '@A').replace(/\//g, '@S') + '@=' + serialize(value).replace(/@/g, '@A').replace(/\//g, '@S') + '/';
});
return serializedString;
};
/**
* A function to deserialized a string into JSON
* @param message A STT serialized string, usually received from Douyu danmaku server
* @return STT deserialized JSON representing of the message
*/
const deserialize = (message) => {
if (message === null) {
return null;
}
const record = {};
const entries = message.match(regex);
if (entries !== null) {
entries.forEach((entry) => {
const kvps = entry.split('@=');
const key = kvps[0].replace(/@S/g, '/').replace(/@A/g, '@');
const value = kvps[1].slice(0, -1).replace(/@S/g, '/').replace(/@A/g, '@');
record[deserialize(key)] = deserialize(value);
});
return record;
}
const items = message.match(regexArraySplitter);
if (items !== null) {
return items.map(item => deserialize(item.slice(0, -1).replace(/@S/g, '/').replace(/@A/g, '@')));
}
return message.replace(/@S/g, '/').replace(/@A/g, '@');
};
export {
serialize,
deserialize,
};