rcs-data
Version:
RCS消息数据结构
262 lines • 9.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.build = exports.parse = exports.CardImageAlignment = exports.CardOriententation = exports.CardMediaHeight = exports.CardWidth = exports.CardMedia = exports.CardContent = exports.CardCarouselLayout = exports.CardLayout = exports.CardCarouselFrame = exports.CardFrame = exports.CardCarousel = exports.Card = exports.CardBase = void 0;
const RcsMsgInitial_1 = require("./RcsMsgInitial");
const mime_1 = require("../mime");
const Suggestion_1 = require("./Suggestion");
const debug = require('debug')('rcs:card');
var CardWidth;
(function (CardWidth) {
CardWidth["SMALL"] = "SMALL_WIDTH";
CardWidth["MEDIUM"] = "MEDIUM_WIDTH";
})(CardWidth || (CardWidth = {}));
exports.CardWidth = CardWidth;
var CardMediaHeight;
(function (CardMediaHeight) {
CardMediaHeight["SHORT"] = "SHORT_HEIGHT";
CardMediaHeight["MEDIUM"] = "MEDIUM_HEIGHT";
CardMediaHeight["TALL"] = "TALL_HEIGHT";
})(CardMediaHeight || (CardMediaHeight = {}));
exports.CardMediaHeight = CardMediaHeight;
var CardOrientation;
(function (CardOrientation) {
CardOrientation["VERTICAL"] = "VERTICAL";
CardOrientation["HORIZONTAL"] = "HORIZONTAL";
})(CardOrientation || (CardOrientation = {}));
exports.CardOriententation = CardOrientation;
var CardImageAlignment;
(function (CardImageAlignment) {
CardImageAlignment["LEFT"] = "LEFT";
CardImageAlignment["RIGHT"] = "RIGHT";
})(CardImageAlignment || (CardImageAlignment = {}));
exports.CardImageAlignment = CardImageAlignment;
var FontSytle;
(function (FontSytle) {
FontSytle["italics"] = "italics";
FontSytle["bold"] = "bold";
FontSytle["underline"] = "underline";
})(FontSytle || (FontSytle = {}));
class CardLayout {
constructor(orientation, imageAlignment) {
this.cardOrientation = orientation;
this.imageAlignment = imageAlignment;
}
}
exports.CardLayout = CardLayout;
class CardCarouselLayout {
constructor(width = CardWidth.SMALL) {
this.cardWidth = width;
}
}
exports.CardCarouselLayout = CardCarouselLayout;
class CardMedia {
constructor(url, contentType, fileSize, height = CardMediaHeight.SHORT) {
this.mediaUrl = url;
this.mediaContentType = contentType;
this.mediaFileSize = fileSize;
this.height = height;
}
}
exports.CardMedia = CardMedia;
class CardContent {
constructor(media, title, description) {
this.media = media;
this.title = title;
this.description = description;
}
static build(media, title, description, suggestions) {
let cardContent = new CardContent(media, title, description);
if (suggestions) {
cardContent['suggestions'] = (0, Suggestion_1.parseSuggestions)(suggestions).suggestions;
}
return cardContent;
}
}
exports.CardContent = CardContent;
class CardFrame {
constructor(layout, content) {
this.layout = layout;
this.content = content;
}
get cardTypeName() {
return 'generalPurposeCard';
}
}
exports.CardFrame = CardFrame;
class CardCarouselFrame {
constructor(layout, content) {
this.layout = layout;
this.content = content || [];
}
appendContent(content) {
this.content.push(content);
}
get cardTypeName() {
return 'generalPurposeCardCarousel';
}
}
exports.CardCarouselFrame = CardCarouselFrame;
class CardBase extends RcsMsgInitial_1.RcsMsgInitial {
constructor(frame, typeName) {
let mime = (0, mime_1.factory)({
contentType: 'application/vnd.gsma.botmessage.v1.0+json',
body: () => {
let message = { message: { [typeName]: frame } };
let body = JSON.stringify(message, null, 1);
body = body.split('\n').join('\r\n');
mime.header('Content-Length', `${body.length}`);
return body;
},
});
super(mime);
this._frame = frame;
this._typeName = typeName;
}
get frame() {
return this._frame;
}
get cardTypeName() {
return this._typeName;
}
get content() {
return this._frame;
}
get messagePlainObject() {
let output = { message: {} };
output.message[this.cardTypeName] = this.frame;
return output;
}
}
exports.CardBase = CardBase;
class Card extends CardBase {
constructor(frame) {
super(frame, 'generalPurposeCard');
}
}
exports.Card = Card;
class CardCarousel extends CardBase {
constructor(frame) {
super(frame, 'generalPurposeCardCarousel');
}
}
exports.CardCarousel = CardCarousel;
class Builder {
constructor(root) {
this.root = root;
}
static of(message) {
let ins;
let { generalPurposeCard, generalPurposeCardCarousel } = message;
if (generalPurposeCard && typeof generalPurposeCard === 'object') {
ins = new CardBuilder(generalPurposeCard);
}
else if (generalPurposeCardCarousel &&
typeof generalPurposeCardCarousel === 'object') {
ins = new CardCarouselBuilder(generalPurposeCardCarousel);
}
else {
throw new TypeError(`数据格式错误,没有包含[generalPurposeCard/generalPurposeCardCarousel]字段`);
}
return ins;
}
buildLayout(data) {
if (!data || typeof data !== 'object')
throw new TypeError(`数据格式错误,没有包含[layout]字段或类型不是[object]`);
}
buildContent(data) {
if (!data)
throw new TypeError(`数据格式错误,没有包含[content]字段`);
}
buildMedia(data) {
if (!data)
throw new TypeError(`数据格式错误,没有包含[media]字段`);
let { mediaUrl, mediaContentType, mediaFileSize, height, thumbnailUrl, thumbnailContentType, thumbnailFileSize, contentDescription, } = data;
let media = new CardMedia(mediaUrl, mediaContentType, mediaFileSize, height);
media.thumbnailUrl = thumbnailUrl;
media.thumbnailContentType = thumbnailContentType;
media.thumbnailFileSize = thumbnailFileSize;
media.contentDescription = contentDescription;
return media;
}
}
class CardBuilder extends Builder {
constructor(root) {
super(root);
}
buildLayout(data) {
super.buildLayout(data);
let { cardOrientation, imageAlignment, titleFontStyle, descriptionFontStyle, style, } = data;
let layout = new CardLayout(cardOrientation, imageAlignment);
layout.titleFontStyle = titleFontStyle;
layout.descriptionFontStyle = descriptionFontStyle;
layout.style = style;
this.layout = layout;
}
buildContent(data) {
super.buildContent(data);
if (!data || typeof data !== 'object')
throw new TypeError(`数据格式错误,没有包含[content]字段或类型不是[object]`);
let { media, title, description, suggestions } = data;
let cardMedia = super.buildMedia(media);
this.content = CardContent.build(cardMedia, title, description, suggestions);
}
build() {
debug('开始解析单卡片');
this.buildLayout(this.root.layout);
this.buildContent(this.root.content);
return new Card(new CardFrame(this.layout, this.content));
}
}
class CardCarouselBuilder extends Builder {
constructor(root) {
super(root);
}
buildLayout(data) {
super.buildLayout(data);
let { cardWidth, titleFontStyle, descriptionFontStyle, style } = data;
let layout = new CardCarouselLayout(cardWidth);
layout.titleFontStyle = titleFontStyle;
layout.descriptionFontStyle = descriptionFontStyle;
layout.style = style;
this.layout = layout;
}
buildContent(data) {
super.buildContent(data);
if (!Array.isArray(data) || data.length === 0)
throw new TypeError(`数据格式错误,[content]字段不是[Array]类型或者长度为空`);
this.content = data.map((c) => {
let { media, title, description, suggestions } = c;
let cardMedia = super.buildMedia(media);
return CardContent.build(cardMedia, title, description, suggestions);
});
}
build() {
debug('开始解析多卡片');
this.buildLayout(this.root.layout);
this.buildContent(this.root.content);
let ins = new CardCarouselFrame(this.layout, this.content);
return new CardCarousel(ins);
}
}
function parse(raw) {
try {
let input = JSON.parse(raw);
let { message } = input;
if (!message || typeof message !== 'object') {
throw new TypeError(`数据格式错误,没有包含[message]字段或类型不是[object]`);
}
let ins = Builder.of(message).build();
return ins;
}
catch (e) {
debug(`[${e.message}] - ${raw}`);
throw Error('解析失败');
}
}
exports.parse = parse;
function build(input) {
let rcsmsg = Builder.of(input).build();
return rcsmsg;
}
exports.build = build;
//# sourceMappingURL=Card.js.map