UNPKG

rcs-data

Version:

RCS消息数据结构

167 lines 7.78 kB
"use strict"; 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