UNPKG

hbbtv-lib

Version:

Library for common functionality needed in HbbTV applications.

106 lines (99 loc) 4.36 kB
/* * Copyright: IRT 2019 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Utility to parse HbbTV-compliant user-agent strings. * * @module HbbTVUserAgentParser * * @example * var userAgentParser = require("hbbtv-lib/tools/HbbTVUserAgentParser"); * var userAgent = HbbTVUserAgentParser('User-Agent: HbbTV/1.2.1 (+PVR+DL; Sonic; 40VX700WDR; 1.32.455; 2.002; test reserved) BKit/445.27.1'); */ /** * Object representing the version of the HbbTV specification. * * @typedef {object} HbbTVVersion * @property {number} major * @property {number} minor * @property {number} micro */ /** * Object with individual fields of an HbbTV user agent string. * * Requirements for certain fields are defined in HbbTV 2 onwards, see section 7.3.2.4. * familyName is not included in HbbTV versions before 2.0. * * 'The "vendorName", "softwareVersion", "familyName" combination, along with "hardwareVersion" where * included, shall differ between terminals with significantly different implementations or performance.' * * @typedef {object} HbbTVUserAgent * @property {string} str a string with the HbbTV portion of the user agent string * @property {HbbTVVersion} version the version of the HbbTV specification the device thinks it complies to (due to ETSI rules, usually only differs in the minor part) * @property {Array<string>} options one or multiple HbbTV capability strings, see clause 10.2.4, e.g. DRM * @property {string} vendor shall reflect the consumer-facing make / brand of the terminal * @property {string} model should be representative of the consumer-facing model name to allow log messages to be matched up with user reported problems * @property {string} swVersion software version * @property {string} hwVersion optional hardware version * @property {string} familyName shall have the semantics defined in clause 7.3.3.2 of the OIPF DAE specification [1] * but shall additionally be chosen so as to be globally unique. This shall be achieved either by prefixing with a * reverse domain name of the organisation allocating the remaining portion of the familyName, or by using a * version 4 UUID as the familyName, formatted as a simple string (i.e. without any urn:uuid prefix) * @property {string} reserved for future extensions */ /** * Parses an HbbTV compliant user agent string into its individual fields. * * @param {string} userAgentString user agent string of an HbbTV TV. Applications can try to retrieve it from the navigator object, which is mandatory since 2.0, * or via an HTTP request. * * @returns {HbbTVUserAgent} an HbbTVUserAgent or null if ua does not include an HbbTV compliant user agent string. */ module.exports = function (ua) { var version = null; var fields = null; var str = null; try { if (!ua) { ua = navigator.userAgent; } var reg = /.*(HbbTV\/(\d\.\d\.\d)\s+\((.*)\)).*/g; var match = reg.exec(ua); str = match[1]; version = match[2].split('.'); fields = match[3].split(';'); fields[0] = fields[0].trim(); if (fields[0].length > 0) fields[0] = fields[0].substring(1); if (fields.length >= 6) return { str: str, version: { major: parseInt(version[0]), minor: parseInt(version[1]), micro: parseInt(version[2]) }, options: fields[0].length > 0 ? fields[0].split("+") : null, vendor: fields[1], model: fields[2], swVersion: fields[3], hwVersion: fields[4], familyName: fields.length == 7 ? fields[5] : null, reserved: fields[fields.length - 1] }; } catch (e) { } return null; };