rcs-data
Version:
RCS消息数据结构
167 lines • 7.78 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseJSON = exports.parseCPIM = void 0;
const Text_1 = require("./Text");
const File_1 = require("./File");
const cpim = require("../cpim");
const ImdnDemand_1 = require("./ImdnDemand");
const Suggestion_1 = require("./Suggestion");
const SuggestionResponse_1 = require("./SuggestionResponse");
const Card_1 = require("./Card");
const ImdnReply_1 = require("./ImdnReply");
const common_1 = require("../common");
const constants_1 = require("./constants");
const base64js = require('base64-js');
const debug = require('debug')('rcs:parser');
function setBasicFields(rcsmsg, cpimmsg, headers) {
rcsmsg.from = cpimmsg.from.value;
rcsmsg.to = cpimmsg.to.value;
if (headers && typeof headers === 'object') {
let { conversationId, contributionId } = headers;
rcsmsg.conversationId = conversationId;
rcsmsg.contributionId = contributionId;
}
}
function parseCPIM(raw, headers) {
const cpimmsg = cpim.parse(raw);
if (!cpimmsg)
throw Error('无法解析收到的内容');
const mime = cpimmsg.mime;
const ctype = mime.contentType;
const dateTime = cpimmsg.dateTime;
const messageId = cpimmsg.header(constants_1.IMDN_NS_URI, 'Message-ID');
debug(`解析的CPIM的内容类型为:${ctype.fulltype}`);
let rcsmsg;
if (ctype.fulltype === 'text/plain') {
let textmsg = new Text_1.Text(mime);
setBasicFields(textmsg, cpimmsg, headers);
rcsmsg = new ImdnDemand_1.ImdnDemand(textmsg, dateTime, messageId);
}
else if (ctype.fulltype === 'application/vnd.gsma.rcs-ft-http+xml') {
let filemsg = File_1.File.parse(mime.body);
setBasicFields(filemsg, cpimmsg, headers);
rcsmsg = new ImdnDemand_1.ImdnDemand(filemsg, dateTime, messageId);
}
else if (ctype.fulltype === 'application/vnd.gsma.botsuggestion.response.v1.0+json') {
let resp = SuggestionResponse_1.SuggestionResponse.parse(mime.body);
setBasicFields(resp, cpimmsg, headers);
rcsmsg = new ImdnDemand_1.ImdnDemand(resp, dateTime, messageId);
}
else if (ctype.fulltype === 'application/vnd.gsma.botmessage.v1.0+json') {
let card = (0, Card_1.parse)(mime.body);
setBasicFields(card, cpimmsg, headers);
rcsmsg = new ImdnDemand_1.ImdnDemand(card, dateTime, messageId);
}
else if (ctype.fulltype === 'message/imdn+xml') {
let imdnreply = (0, ImdnReply_1.parse)(mime.body);
imdnreply.from = cpimmsg.from.value;
imdnreply.to = cpimmsg.to.value;
imdnreply.dateTime = dateTime;
imdnreply.messageId = cpimmsg.header(constants_1.IMDN_NS_URI, 'Message-ID');
rcsmsg = imdnreply;
}
else if (ctype.fulltype === 'multipart/mixed') {
if (mime.body.length !== 2)
throw Error(`CPIM中的消息内容格式如果是multipart/mixed,只允许有2段内容(当前段数=${mime.body.length}),其中1段必须为外置建议列表`);
let msg, suglist;
for (let i = 0, l = mime.body.length; i < l; i++) {
let part = mime.body[i];
debug(`要求解析的CPIM多段内容的第${i}段内容类型为:${part.contentType.fulltype}`);
if (part.contentType.fulltype ===
'application/vnd.gsma.botsuggestion.v1.0+json') {
suglist = part;
}
else {
msg = part;
}
}
if (!msg || !suglist)
throw Error(`CPIM中的消息内容格式如果是multipart/mixed,只允许有2段内容,其中1段必须为外置建议列表`);
if (msg.contentType.fulltype === 'text/plain') {
let rcstext = new Text_1.Text(msg);
setBasicFields(rcstext, cpimmsg, headers);
let rcssugs = new Suggestion_1.SuggestionChiplist(suglist, new Text_1.Text(msg));
rcsmsg = new ImdnDemand_1.ImdnDemand(rcssugs, dateTime, messageId);
}
}
return rcsmsg;
}
exports.parseCPIM = parseCPIM;
function parseJSON(raw) {
let { conversationId, contributionId, messageId, dateTime, senderAddress, destinationAddress, messageList, deliveryInfoList, } = raw;
const checkStrField = (name, value) => {
if (!value || typeof value !== 'string' || value.length === 0)
throw Error(`输入字段[${name}]为空,或不是字符串类型`);
};
checkStrField('conversationId', conversationId);
checkStrField('contributionId', contributionId);
checkStrField('messageId', messageId);
checkStrField('senderAddress', senderAddress);
debug(`conversationId=${conversationId}`);
debug(`contributionId=${contributionId}`);
debug(`messageId=${messageId}`);
debug(`dateTime=${dateTime}`);
debug(`senderAddress=${senderAddress}`);
if (!messageList || !Array.isArray(messageList) || messageList.length === 0)
throw Error(`输入字段[messageList]为空,或不是数组类型`);
if (deliveryInfoList && !Array.isArray(deliveryInfoList))
throw Error('输入字段[deliveryInfoList]必须是数组');
let sugsFrame;
if (messageList.length === 2) {
let suglist = messageList[1];
let { contentType, contentText } = suglist;
if (contentType !== 'application/vnd.gsma.botsuggestion.v1.0+json')
throw Error(`messageList[1].contentType字段的值[${contentType}]错误,只能是[application/vnd.gsma.botsuggestion.v1.0+json]`);
let { suggestions } = contentText;
if (suggestions && Array.isArray(suggestions) && suggestions.length !== 0)
sugsFrame = (0, Suggestion_1.parseSuggestions)(suggestions);
}
let initialMsg;
let msgdata = messageList[0];
let { contentType, contentEncoding, contentText } = msgdata;
if (contentType === 'text/plain') {
if (contentEncoding && contentEncoding.toLowerCase() === 'base64') {
let decoder = new TextDecoder();
contentText = decoder.decode(base64js.toByteArray(contentText));
}
initialMsg = new Text_1.Text(contentText);
}
else if (contentType === 'application/vnd.gsma.rcs-ft-http') {
initialMsg = File_1.File.build(contentText);
}
else if (contentType === 'application/vnd.gsma.botmessage.v1.0+json') {
let { message } = contentText;
initialMsg = (0, Card_1.build)(message);
}
else {
throw Error(`不支持的内容类型[${contentType}]`);
}
initialMsg.conversationId = conversationId;
initialMsg.contributionId = contributionId;
initialMsg.from = senderAddress;
initialMsg.to = destinationAddress[0];
if (deliveryInfoList) {
deliveryInfoList.forEach((di) => {
let { status, destinationAddress, senderAddress, messageId, dateTime } = di;
if (['delivered'].includes(status)) {
let reply = new ImdnReply_1.ImdnReplyDelivery({ messageId, dateTime: new common_1.DateTime(dateTime) }, status, senderAddress, destinationAddress);
initialMsg.deliveryInfoList.push(reply);
}
else if (['displayed'].includes(status)) {
let reply = new ImdnReply_1.ImdnReplyDisplay({ messageId, dateTime: new common_1.DateTime(dateTime) }, status, senderAddress, destinationAddress);
initialMsg.deliveryInfoList.push(reply);
}
});
}
let suglist;
if (sugsFrame) {
suglist = new Suggestion_1.SuggestionChiplist(sugsFrame, initialMsg);
}
else {
suglist = initialMsg;
}
let imdn = new ImdnDemand_1.ImdnDemand(suglist, dateTime, messageId);
return imdn;
}
exports.parseJSON = parseJSON;
//# sourceMappingURL=Parser.js.map