UNPKG

@eyevinn/cmcd

Version:

NPM library for Common Media Client Data (CTA-5004)

303 lines 11.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Payload = exports.createPayload = exports.CMCDVersion = exports.CMCDTopBitrate = exports.CMCDStartup = exports.CMCDStreamType = exports.CMCDSessionId = exports.CMCDStreamingFormat = exports.CMCDRequestedMaximumThroughput = exports.CMCDPlaybackRate = exports.CMCDObjectType = exports.CMCDNextRangeRequest = exports.CMCDNextObjectRequest = exports.CMCDMeasuredThroughput = exports.CMCDDeadline = exports.CMCDObjectDuration = exports.CMCDContentId = exports.CMCDBufferStarvation = exports.CMCDBufferLength = exports.CMCDEncodedBitrate = exports.CMCDDecimal = exports.CMCDInteger = exports.CMCDBoolean = exports.CMCDString = exports.CMCDHdr = exports.CMCDStreamTypeToken = exports.CMCDStreamingFormatToken = exports.CMCDObjectTypeToken = exports.CMCDKey = void 0; var CMCDKey; (function (CMCDKey) { CMCDKey["br"] = "br"; CMCDKey["bl"] = "bl"; CMCDKey["bs"] = "bs"; CMCDKey["cid"] = "cid"; CMCDKey["d"] = "d"; CMCDKey["dl"] = "dl"; CMCDKey["mtp"] = "mtp"; CMCDKey["nor"] = "nor"; CMCDKey["nrr"] = "nrr"; CMCDKey["ot"] = "ot"; CMCDKey["pr"] = "pr"; CMCDKey["rtp"] = "rtp"; CMCDKey["sf"] = "sf"; CMCDKey["sid"] = "sid"; CMCDKey["st"] = "st"; CMCDKey["su"] = "su"; CMCDKey["tb"] = "tb"; CMCDKey["v"] = "v"; })(CMCDKey = exports.CMCDKey || (exports.CMCDKey = {})); const CMCD_MAP = { "br": "encodedBitrate", "bl": "bufferLength", "bs": "bufferStarvation", "cid": "contentId", "d": "objectDuration", "dl": "deadline", "mtp": "measuredThroughput", "nor": "nextObjectRequest", "nrr": "nextRangeRequest", "ot": "objectType", "pr": "playbackRate", "rtp": "requestedMaximumThroughput", "sf": "streamingFormat", "sid": "sessionId", "st": "streamType", "su": "startup", "tb": "topBitrate", "v": "version", }; var CMCDObjectTypeToken; (function (CMCDObjectTypeToken) { CMCDObjectTypeToken["manifest"] = "m"; CMCDObjectTypeToken["audio"] = "a"; CMCDObjectTypeToken["video"] = "v"; CMCDObjectTypeToken["muxed"] = "av"; CMCDObjectTypeToken["init"] = "i"; CMCDObjectTypeToken["caption"] = "c"; CMCDObjectTypeToken["timedtrack"] = "tt"; CMCDObjectTypeToken["key"] = "k"; CMCDObjectTypeToken["other"] = "o"; })(CMCDObjectTypeToken = exports.CMCDObjectTypeToken || (exports.CMCDObjectTypeToken = {})); var CMCDStreamingFormatToken; (function (CMCDStreamingFormatToken) { CMCDStreamingFormatToken["mpd"] = "d"; CMCDStreamingFormatToken["hls"] = "h"; CMCDStreamingFormatToken["mss"] = "s"; CMCDStreamingFormatToken["other"] = "o"; })(CMCDStreamingFormatToken = exports.CMCDStreamingFormatToken || (exports.CMCDStreamingFormatToken = {})); var CMCDStreamTypeToken; (function (CMCDStreamTypeToken) { CMCDStreamTypeToken["vod"] = "v"; CMCDStreamTypeToken["live"] = "l"; })(CMCDStreamTypeToken = exports.CMCDStreamTypeToken || (exports.CMCDStreamTypeToken = {})); var CMCDHdr; (function (CMCDHdr) { CMCDHdr["object"] = "CMCD-Object"; CMCDHdr["request"] = "CMCD-Request"; CMCDHdr["status"] = "CMCD-Status"; CMCDHdr["session"] = "CMCD-Session"; })(CMCDHdr = exports.CMCDHdr || (exports.CMCDHdr = {})); class CMCDValue { constructor(key, header, value) { this._key = key; this._header = header; this._value = value; } get key() { return this._key.toString(); } get header() { return this._header; } get value() { return this._value; } toString() { return this.key + '=' + this.value.toString(); } } // Basic types class CMCDString extends CMCDValue { toString() { return this.key + '="' + this.value + '"'; } } exports.CMCDString = CMCDString; class CMCDBoolean extends CMCDValue { toString() { return (this.value === true ? this.key : ""); } } exports.CMCDBoolean = CMCDBoolean; class CMCDInteger extends CMCDValue { } exports.CMCDInteger = CMCDInteger; class CMCDDecimal extends CMCDValue { } exports.CMCDDecimal = CMCDDecimal; // CMCD Types class CMCDEncodedBitrate extends CMCDInteger { constructor(value) { super(CMCDKey.br, CMCDHdr.object, value); } } exports.CMCDEncodedBitrate = CMCDEncodedBitrate; class CMCDBufferLength extends CMCDInteger { constructor(value) { super(CMCDKey.bl, CMCDHdr.request, value); } } exports.CMCDBufferLength = CMCDBufferLength; class CMCDBufferStarvation extends CMCDBoolean { constructor(value) { super(CMCDKey.bs, CMCDHdr.status, value); } } exports.CMCDBufferStarvation = CMCDBufferStarvation; class CMCDContentId extends CMCDString { constructor(value) { super(CMCDKey.cid, CMCDHdr.session, value); } } exports.CMCDContentId = CMCDContentId; class CMCDObjectDuration extends CMCDInteger { constructor(value) { super(CMCDKey.d, CMCDHdr.object, value); } } exports.CMCDObjectDuration = CMCDObjectDuration; class CMCDDeadline extends CMCDInteger { constructor(value) { super(CMCDKey.dl, CMCDHdr.request, value); } } exports.CMCDDeadline = CMCDDeadline; class CMCDMeasuredThroughput extends CMCDInteger { constructor(value) { super(CMCDKey.mtp, CMCDHdr.request, value); } } exports.CMCDMeasuredThroughput = CMCDMeasuredThroughput; class CMCDNextObjectRequest extends CMCDString { constructor(value) { super(CMCDKey.nor, CMCDHdr.request, value); } toString() { const q = {}; q[this.key] = this.value; const p = new URLSearchParams(q); const v = p.toString().split("=")[1]; return this.key + "=" + `"${v}"`; } } exports.CMCDNextObjectRequest = CMCDNextObjectRequest; class CMCDNextRangeRequest extends CMCDString { constructor(value) { super(CMCDKey.nrr, CMCDHdr.request, value); } } exports.CMCDNextRangeRequest = CMCDNextRangeRequest; class CMCDObjectType extends CMCDValue { constructor(value) { super(CMCDKey.ot, CMCDHdr.object, value); } } exports.CMCDObjectType = CMCDObjectType; class CMCDPlaybackRate extends CMCDDecimal { constructor(value) { super(CMCDKey.pr, CMCDHdr.session, value); } } exports.CMCDPlaybackRate = CMCDPlaybackRate; class CMCDRequestedMaximumThroughput extends CMCDInteger { constructor(value) { super(CMCDKey.rtp, CMCDHdr.status, value); } } exports.CMCDRequestedMaximumThroughput = CMCDRequestedMaximumThroughput; class CMCDStreamingFormat extends CMCDValue { constructor(value) { super(CMCDKey.sf, CMCDHdr.session, value); } } exports.CMCDStreamingFormat = CMCDStreamingFormat; class CMCDSessionId extends CMCDString { constructor(value) { super(CMCDKey.sid, CMCDHdr.session, value); } } exports.CMCDSessionId = CMCDSessionId; class CMCDStreamType extends CMCDValue { constructor(value) { super(CMCDKey.st, CMCDHdr.session, value); } } exports.CMCDStreamType = CMCDStreamType; class CMCDStartup extends CMCDBoolean { constructor(value) { super(CMCDKey.su, CMCDHdr.request, value); } } exports.CMCDStartup = CMCDStartup; class CMCDTopBitrate extends CMCDInteger { constructor(value) { super(CMCDKey.tb, CMCDHdr.object, value); } } exports.CMCDTopBitrate = CMCDTopBitrate; class CMCDVersion extends CMCDInteger { constructor(value) { super(CMCDKey.v, CMCDHdr.session, value); } } exports.CMCDVersion = CMCDVersion; function strcmp(a, b) { if (a === b) { return 0; } else if (a > b) { return 1; } else if (a < b) { return -1; } } function create(ctor, v) { return v !== undefined ? new ctor(v) : undefined; } function createPayload(searchParams, override) { let values = []; const cmcdString = searchParams.get("CMCD"); if (cmcdString) { values = cmcdString.split(","); } let init = {}; if (override) { init = override; } values.forEach(kv => { const [k, v] = kv.split("="); if (init[CMCD_MAP[k]]) { // do not overwrite overrides return; } if (v) { if (v[0] === '"' && v[v.length - 1] === '"') { init[CMCD_MAP[k]] = v.substring(1, v.length - 1); } else if (v.match(/^[0-9\.]*$/)) { init[CMCD_MAP[k]] = Number(v); } else { init[CMCD_MAP[k]] = v; } } else { init[CMCD_MAP[k]] = true; } }); return new Payload(init); } exports.createPayload = createPayload; class Payload { constructor(v) { this._encodedBitrate = create(CMCDEncodedBitrate, v.encodedBitrate); this._bufferLength = create(CMCDBufferLength, v.bufferLength); this._bufferStarvation = create(CMCDBufferStarvation, v.bufferStarvation); this._contentId = create(CMCDContentId, v.contentId); this._objectDuration = create(CMCDObjectDuration, v.objectDuration); this._deadline = create(CMCDDeadline, v.deadline); this._measuredThroughput = create(CMCDMeasuredThroughput, v.measuredThroughput); this._nextObjectRequest = create(CMCDNextObjectRequest, v.nextObjectRequest); this._nextRangeRequest = create(CMCDNextRangeRequest, v.nextRangeRequest); this._objectType = create(CMCDObjectType, v.objectType); this._playbackRate = create(CMCDPlaybackRate, v.playbackRate); this._requestedMaximumThroughput = create(CMCDRequestedMaximumThroughput, v.requestedMaximumThroughput); this._streamingFormat = create(CMCDStreamingFormat, v.streamingFormat); this._sessionId = create(CMCDSessionId, v.sessionId); this._streamType = create(CMCDStreamType, v.streamType); this._startup = create(CMCDStartup, v.startup); this._topBitrate = create(CMCDTopBitrate, v.topBitrate); this._version = create(CMCDVersion, v.version); } get encodedBitrate() { return this._encodedBitrate.value; } get bufferLength() { return this._bufferLength.value; } get bufferStarvation() { return this._bufferStarvation.value; } get contentId() { return this._contentId.value; } get objectDuration() { return this._objectDuration.value; } get deadline() { return this._deadline.value; } get measuredThroughput() { return this._measuredThroughput.value; } get nextObjectRequest() { return this._nextObjectRequest.value; } get nextRangeRequest() { return this._nextRangeRequest.value; } get objectType() { return this._objectType.value; } get playbackRate() { return this._playbackRate.value; } get requestedMaximumThroughput() { return this._requestedMaximumThroughput.value; } get streamingFormat() { return this._streamingFormat.value; } get sessionId() { return this._sessionId.value; } get streamType() { return this._streamType.value; } get startup() { return this._startup.value; } get topBitrate() { return this._topBitrate.value; } get version() { return this._version.value; } get headers() { let hdrs = {}; Object.keys(CMCD_MAP).forEach(k => { const key = '_' + CMCD_MAP[k]; if (this[key]) { const header = this[key].header.toString(); if (!hdrs[header]) { hdrs[header] = []; } hdrs[header].push(this[key].toString()); } }); Object.keys(hdrs).forEach(k => { hdrs[k] = hdrs[k].sort((a, b) => strcmp(a, b)).join(','); }); return hdrs; } toString() { let kv = []; Object.keys(CMCD_MAP).sort((a, b) => strcmp(a, b)).forEach(k => { const key = '_' + CMCD_MAP[k]; if (this[key]) { kv.push(this[key].toString()); } }); if (kv.length > 0) { return new URLSearchParams({ CMCD: kv.join(",") }).toString(); } else { return ""; } } } exports.Payload = Payload; //# sourceMappingURL=index.js.map