@eyevinn/cmcd
Version:
NPM library for Common Media Client Data (CTA-5004)
303 lines • 11.9 kB
JavaScript
"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