rcs-data
Version:
RCS消息数据结构
103 lines (61 loc) • 3.34 kB
Markdown
# 总体说明
实现符合`5G消息规范(RCS)`的消息对象数据结构。
# rcs
`rcs-data`只定义消息对象的数据结构,不执行数据处理相关的逻辑,例如:生成 ID。
## 消息结构
`RcsMsg`接口定义了消息对象的基本属性和方法。
`RcsMsgBase`类提供消息对象的最小实现。`rcs-data`中,所有消息对象记录的都是符合`mime`规范的内容,都包含 1 个`mime/Entity`实例。可以用`header`方法设置或读取消息头。因为,消息是可以嵌套的,消息的基本信息不一定用在自身一级,所以消息的基本信息没有记录在`mine`的头中。
消息对象可以分为携带消息内容的消息对象和用于补充信息其他消息的消息对象。携带消息内容的消息对象是`RcsMsgMono`类。携带其他消息的消息对象是`RcsMsgDecorator`,包括:递送报告请求(`ImdnDemand`),建议列表(`SuggestionChiplist`)和群发列表(`RecipientList`)。
一个完整的消息可能包含了多种消息对象,但是总有一个要发送的基础内容,`RcsMsgInitail`代表这类消息,包括:文本(`Text`),文件(`File`),卡片(`Card`/`CardCarousel`)和建议回复(`SuggestionResponse`)。
`ImndReply`代表递送报告回复。递送报告回复不会被“装饰”。
## 构造消息
`rcs-data`提供了用于构造消息对象的`Builder`类。构造消息对象前首先要生成`Builder`实例。
```ts
const builder = Builder(From)
.conversationId(ConversationId)
.contributionId(ContributionId)
.messageId(MessageId)
```
通过`builder`实例创建具体的消息对象。
构造文本消息
```ts
const rcsmsg = builder.text(to, content)
```
构造文件消息
```ts
const rcsmsg = builder.file(to, fileInfo, thumbnailInfo)
```
构造卡片消息
```ts
const rcsmsg = builder.card(to, cardFrame)
```
## 解析消息
`rcs-data`支持解析两类格式的消息生成消息对象,包括:CPIM,JSON。
`CPIM`对应的是`SIP`消息中的`body`部分。
```ts
const rcsmsg = Parser.parseCPIM(sipBody)
```
`JSON`对应的是从非`SIP`通道收发的消息。
```ts
let rcsmsg = Parser.parseJSON(jsonObject)
```
消息对象通常是嵌套的,`RcsMsg.contentType`对应的是最外层消息对象的类型(通常是`message/cpim`),如果需要确定基本消息内容的类型,通过`RcsMsg.initailContentType`进行判断,类型的值在`constants/Message_Content_Type`中有枚举定义。
## 输出消息
发送消息对象时要输出符合发送通道要求格式的内容。
SIP 通道发送时,因为需要分别处理消息头和消息体,所以分别返回`headerLines`和`bodyString`。`headerLines`加到 SIP 的消息头中,`bodyString`作为消息体。
```ts
let { headerLines, bodyString } = rcsmsg.output()
```
除了消息对象`mime`中携带的头信息,`headerLines`输出还会输出`From`,`To`,`Conversation-ID`,`Contribution-ID`头。请注意大小写。
非 SIP 通道发送时输出 JSON 格式的对象(没有序列化成字符串)。
```ts
let po = rcsmsg.outputPlainObject()
```
# common
`DateTime.value`返回`ISO8601`带时区格式的日期时间字符串,例如:2022-01-29T10:37:30.350+08:00。
# cpim
待补充
# mime
待补充
# 单元测试
待补充