UNPKG

rcs-data

Version:

RCS消息数据结构

262 lines 9.25 kB
"use strict"; 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