From 5f38bbc64f17c098a6f376dd5e0010ff0b7481b2 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 29 Oct 2024 15:49:40 +0000 Subject: [PATCH] chore: Publish pr-fix-ci-fb-version --- .../core/Accessibility/index.md | 840 + .../core/Accessibility/schemas/index.md | 154 + .../core/Account/index.md | 167 + .../core/Advertising/index.md | 788 + .../core/Advertising/schemas/index.md | 53 + .../core/Authentication/index.md | 449 + .../core/Capabilities/index.md | 1757 ++ .../core/Capabilities/schemas/index.md | 121 + .../pr-fix-ci-fb-version/core/Device/index.md | 2115 ++ .../core/Discovery/index.md | 4222 +++ .../core/Discovery/schemas/index.md | 88 + .../core/Entertainment/schemas/index.md | 285 + .../core/Entity/schemas/index.md | 287 + .../core/Intents/schemas/index.md | 232 + .../core/Internal/index.md | 109 + .../core/Keyboard/index.md | 318 + .../core/Lifecycle/index.md | 899 + .../core/Lifecycle/schemas/index.md | 61 + .../core/Localization/index.md | 1623 ++ .../core/Localization/schemas/index.md | 79 + .../core/Metrics/index.md | 1624 ++ .../core/Parameters/index.md | 153 + .../core/Profile/index.md | 232 + .../core/SecondScreen/index.md | 572 + .../core/SecondScreen/schemas/index.md | 40 + .../core/SecureStorage/index.md | 510 + .../core/Types/schemas/index.md | 94 + apis/pr-fix-ci-fb-version/core/changelog.md | 254 + apis/pr-fix-ci-fb-version/core/index.md | 30 + .../discovery/Accessibility/schemas/index.md | 154 + .../discovery/Advertising/schemas/index.md | 53 + .../discovery/Capabilities/schemas/index.md | 121 + .../discovery/Content/index.md | 434 + .../discovery/Discovery/schemas/index.md | 88 + .../discovery/Entertainment/schemas/index.md | 285 + .../discovery/Entity/schemas/index.md | 287 + .../discovery/Intents/schemas/index.md | 232 + .../discovery/Lifecycle/schemas/index.md | 61 + .../discovery/Localization/schemas/index.md | 79 + .../discovery/SecondScreen/schemas/index.md | 40 + .../discovery/Types/schemas/index.md | 94 + .../discovery/changelog.md | 17 + apis/pr-fix-ci-fb-version/discovery/index.md | 30 + apis/pr-fix-ci-fb-version/index.md | 585 + .../manage/Accessibility/schemas/index.md | 154 + .../manage/Account/index.md | 135 + .../manage/AcknowledgeChallenge/index.md | 510 + .../manage/Advertising/index.md | 543 + .../manage/Advertising/schemas/index.md | 53 + .../manage/AudioDescriptions/index.md | 478 + .../manage/Capabilities/schemas/index.md | 121 + .../manage/ClosedCaptions/index.md | 6328 +++++ .../manage/Device/index.md | 672 + .../manage/Discovery/index.md | 305 + .../manage/Discovery/schemas/index.md | 88 + .../manage/Entertainment/schemas/index.md | 285 + .../manage/Entity/schemas/index.md | 287 + .../manage/HDMIInput/index.md | 1846 ++ .../manage/Intents/schemas/index.md | 232 + .../manage/Keyboard/index.md | 962 + .../manage/Lifecycle/schemas/index.md | 61 + .../manage/Localization/index.md | 2654 ++ .../manage/Localization/schemas/index.md | 79 + .../manage/Metrics/index.md | 137 + .../manage/PinChallenge/index.md | 541 + .../manage/Privacy/index.md | 4187 +++ .../manage/SecondScreen/schemas/index.md | 40 + .../manage/SecureStorage/index.md | 367 + .../manage/Types/schemas/index.md | 94 + .../manage/UserGrants/index.md | 849 + .../manage/VoiceGuidance/index.md | 807 + .../pr-fix-ci-fb-version/manage/Wifi/index.md | 551 + apis/pr-fix-ci-fb-version/manage/changelog.md | 127 + apis/pr-fix-ci-fb-version/manage/index.md | 30 + .../pr-fix-ci-fb-version/glossary/index.md | 84 + .../pr-fix-ci-fb-version/governance/index.md | 232 + .../images/governance/approval-track.png | Bin 0 -> 367150 bytes .../images/governance/branching.png | Bin 0 -> 274200 bytes .../images/governance/structure.png | Bin 0 -> 329869 bytes .../general/capabilities/image1.png | Bin 0 -> 14067 bytes .../general/capabilities/image2.png | Bin 0 -> 15714 bytes .../general/capabilities/image4.png | Bin 0 -> 22598 bytes .../capabilities/user-grants/image1.png | Bin 0 -> 16914 bytes .../capabilities/user-grants/image2.png | Bin 0 -> 23485 bytes .../capabilities/user-grants/image3.png | Bin 0 -> 29394 bytes .../capabilities/user-grants/image4.png | Bin 0 -> 18794 bytes .../capabilities/user-grants/image5.png | Bin 0 -> 25027 bytes .../capabilities/user-grants/image6.png | Bin 0 -> 32865 bytes .../capabilities/user-grants/image7.png | Bin 0 -> 45710 bytes .../intents/user-interest/media/image1.png | Bin 0 -> 14294 bytes .../intents/user-interest/media/image2.png | Bin 0 -> 14615 bytes .../intents/user-interest/media/image3.png | Bin 0 -> 16673 bytes .../intents/user-interest/media/image4.png | Bin 0 -> 15496 bytes .../discovery/user-interest/index.md | 369 + .../specifications/entities/channels/index.md | 65 + .../specifications/entities/index.md | 94 + .../specifications/entities/music/index.md | 82 + .../specifications/entities/programs/index.md | 108 + .../firebolt-core-open-rpc.json | 11249 ++++++++ .../firebolt-discovery-open-rpc.json | 2578 ++ .../firebolt-manage-open-rpc.json | 13660 +++++++++ .../specifications/firebolt-open-rpc.json | 21968 +++++++++++++++ .../firebolt-specification.json | 22910 ++++++++++++++++ .../general/capabilities/index.md | 668 + .../general/capabilities/user-grants/index.md | 601 + .../general/context-parameters/index.md | 311 + .../hardware/hdmi-input/index.md | 321 + .../intents/command-and-control/index.md | 992 + .../specifications/intents/index.md | 128 + .../specifications/intents/play/index.md | 274 + .../intents/user-interest/index.md | 23 + .../localization/language/index.md | 107 + .../app-passthrough-apis/index.md | 472 + .../style-guide-and-template/index.md | 99 + 114 files changed, 121634 insertions(+) create mode 100644 apis/pr-fix-ci-fb-version/core/Accessibility/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Accessibility/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Account/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Advertising/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Advertising/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Authentication/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Capabilities/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Capabilities/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Device/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Discovery/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Discovery/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Entertainment/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Entity/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Intents/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Internal/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Keyboard/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Lifecycle/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Lifecycle/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Localization/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Localization/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Metrics/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Parameters/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Profile/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/SecondScreen/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/SecondScreen/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/SecureStorage/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/Types/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/core/changelog.md create mode 100644 apis/pr-fix-ci-fb-version/core/index.md create mode 100644 apis/pr-fix-ci-fb-version/discovery/Accessibility/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/discovery/Advertising/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/discovery/Capabilities/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/discovery/Content/index.md create mode 100644 apis/pr-fix-ci-fb-version/discovery/Discovery/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/discovery/Entertainment/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/discovery/Entity/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/discovery/Intents/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/discovery/Lifecycle/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/discovery/Localization/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/discovery/SecondScreen/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/discovery/Types/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/discovery/changelog.md create mode 100644 apis/pr-fix-ci-fb-version/discovery/index.md create mode 100644 apis/pr-fix-ci-fb-version/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Accessibility/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Account/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/AcknowledgeChallenge/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Advertising/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Advertising/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/AudioDescriptions/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Capabilities/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/ClosedCaptions/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Device/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Discovery/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Discovery/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Entertainment/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Entity/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/HDMIInput/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Intents/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Keyboard/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Lifecycle/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Localization/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Localization/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Metrics/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/PinChallenge/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Privacy/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/SecondScreen/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/SecureStorage/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Types/schemas/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/UserGrants/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/VoiceGuidance/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/Wifi/index.md create mode 100644 apis/pr-fix-ci-fb-version/manage/changelog.md create mode 100644 apis/pr-fix-ci-fb-version/manage/index.md create mode 100644 requirements/pr-fix-ci-fb-version/glossary/index.md create mode 100644 requirements/pr-fix-ci-fb-version/governance/index.md create mode 100644 requirements/pr-fix-ci-fb-version/images/governance/approval-track.png create mode 100644 requirements/pr-fix-ci-fb-version/images/governance/branching.png create mode 100644 requirements/pr-fix-ci-fb-version/images/governance/structure.png create mode 100644 requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/image1.png create mode 100644 requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/image2.png create mode 100644 requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/image4.png create mode 100644 requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/user-grants/image1.png create mode 100644 requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/user-grants/image2.png create mode 100644 requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/user-grants/image3.png create mode 100644 requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/user-grants/image4.png create mode 100644 requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/user-grants/image5.png create mode 100644 requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/user-grants/image6.png create mode 100644 requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/user-grants/image7.png create mode 100644 requirements/pr-fix-ci-fb-version/images/specifications/intents/user-interest/media/image1.png create mode 100644 requirements/pr-fix-ci-fb-version/images/specifications/intents/user-interest/media/image2.png create mode 100644 requirements/pr-fix-ci-fb-version/images/specifications/intents/user-interest/media/image3.png create mode 100644 requirements/pr-fix-ci-fb-version/images/specifications/intents/user-interest/media/image4.png create mode 100644 requirements/pr-fix-ci-fb-version/specifications/discovery/user-interest/index.md create mode 100644 requirements/pr-fix-ci-fb-version/specifications/entities/channels/index.md create mode 100644 requirements/pr-fix-ci-fb-version/specifications/entities/index.md create mode 100644 requirements/pr-fix-ci-fb-version/specifications/entities/music/index.md create mode 100644 requirements/pr-fix-ci-fb-version/specifications/entities/programs/index.md create mode 100644 requirements/pr-fix-ci-fb-version/specifications/firebolt-core-open-rpc.json create mode 100644 requirements/pr-fix-ci-fb-version/specifications/firebolt-discovery-open-rpc.json create mode 100644 requirements/pr-fix-ci-fb-version/specifications/firebolt-manage-open-rpc.json create mode 100644 requirements/pr-fix-ci-fb-version/specifications/firebolt-open-rpc.json create mode 100644 requirements/pr-fix-ci-fb-version/specifications/firebolt-specification.json create mode 100644 requirements/pr-fix-ci-fb-version/specifications/general/capabilities/index.md create mode 100644 requirements/pr-fix-ci-fb-version/specifications/general/capabilities/user-grants/index.md create mode 100644 requirements/pr-fix-ci-fb-version/specifications/general/context-parameters/index.md create mode 100644 requirements/pr-fix-ci-fb-version/specifications/hardware/hdmi-input/index.md create mode 100644 requirements/pr-fix-ci-fb-version/specifications/intents/command-and-control/index.md create mode 100644 requirements/pr-fix-ci-fb-version/specifications/intents/index.md create mode 100644 requirements/pr-fix-ci-fb-version/specifications/intents/play/index.md create mode 100644 requirements/pr-fix-ci-fb-version/specifications/intents/user-interest/index.md create mode 100644 requirements/pr-fix-ci-fb-version/specifications/localization/language/index.md create mode 100644 requirements/pr-fix-ci-fb-version/specifications/openrpc-extensions/app-passthrough-apis/index.md create mode 100644 requirements/pr-fix-ci-fb-version/style-guide-and-template/index.md diff --git a/apis/pr-fix-ci-fb-version/core/Accessibility/index.md b/apis/pr-fix-ci-fb-version/core/Accessibility/index.md new file mode 100644 index 000000000..7f32768e1 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Accessibility/index.md @@ -0,0 +1,840 @@ +--- +title: Accessibility + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Accessibility Module + +--- + +Version Accessibility 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [audioDescriptionSettings](#audiodescriptionsettings) + - [closedCaptions](#closedcaptions) + - [closedCaptionsSettings](#closedcaptionssettings) + - [listen](#listen) + - [once](#once) + - [voiceGuidance](#voiceguidance) + - [voiceGuidanceSettings](#voiceguidancesettings) +- [Events](#events) + - [audioDescriptionSettingsChanged](#audiodescriptionsettingschanged) + - [closedCaptionsSettingsChanged](#closedcaptionssettingschanged) + - [voiceGuidanceSettingsChanged](#voiceguidancesettingschanged) +- [Types](#types) + - [AudioDescriptionSettings](#audiodescriptionsettings-1) + +## Usage + +To use the Accessibility module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Accessibility } from '@firebolt-js/sdk' +``` + +## Overview + +The `Accessibility` module provides access to the user/device settings for closed captioning and voice guidance. + +Apps **SHOULD** attempt o respect these settings, rather than manage and persist seprate settings, which would be different per-app. + +## Methods + +### audioDescriptionSettings + +Get the user's preferred audio description settings + +To get the value of `audioDescriptionSettings` call the method like this: + +```typescript +function audioDescriptionSettings(): Promise +``` + +Promise resolution: + +[AudioDescriptionSettings](#audiodescriptionsettings-1) + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:audiodescriptions | + +#### Examples + +Getting the audio description settings + +JavaScript: + +```javascript +import { Accessibility } from '@firebolt-js/sdk' + +let settings = await Accessibility.audioDescriptionSettings() +console.log(settings) +``` + +Value of `settings`: + +```javascript +{ + "enabled": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Accessibility.audioDescriptionSettings", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "enabled": true + } +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function audioDescriptionSettings( + callback: (value) => AudioDescriptionSettings, +): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Getting the audio description settings + +JavaScript: + +```javascript +import { Accessibility } from '@firebolt-js/sdk' + +let listenerId = await audioDescriptionSettings((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `settings`: + +```javascript +{ + "enabled": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Accessibility.onAudioDescriptionSettingsChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "enabled": true + } +} +``` + +
+ +--- + +### closedCaptions + +Get the user's preferred closed-captions settings + +```typescript +function closedCaptions(): Promise +``` + +Promise resolution: + +[ClosedCaptionsSettings](../Accessibility/schemas/#ClosedCaptionsSettings) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:closedcaptions | + +#### Examples + +Getting the closed captions settings + +JavaScript: + +```javascript +import { Accessibility } from '@firebolt-js/sdk' + +let closedCaptionsSettings = await Accessibility.closedCaptions() +console.log(closedCaptionsSettings) +``` + +Value of `closedCaptionsSettings`: + +```javascript +{ + "enabled": true, + "styles": { + "fontFamily": "monospaced_sanserif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Accessibility.closedCaptions", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "enabled": true, + "styles": { + "fontFamily": "monospaced_sanserif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": ["eng", "spa"] + } +} +``` + +
+ +--- + +### closedCaptionsSettings + +Get the user's preferred closed-captions settings + +To get the value of `closedCaptionsSettings` call the method like this: + +```typescript +function closedCaptionsSettings(): Promise +``` + +Promise resolution: + +[ClosedCaptionsSettings](../Accessibility/schemas/#ClosedCaptionsSettings) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:closedcaptions | + +#### Examples + +Getting the closed captions settings + +JavaScript: + +```javascript +import { Accessibility } from '@firebolt-js/sdk' + +let closedCaptionsSettings = await Accessibility.closedCaptionsSettings() +console.log(closedCaptionsSettings) +``` + +Value of `closedCaptionsSettings`: + +```javascript +{ + "enabled": true, + "styles": { + "fontFamily": "monospaced_sanserif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Accessibility.closedCaptionsSettings", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "enabled": true, + "styles": { + "fontFamily": "monospaced_sanserif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": ["eng", "spa"] + } +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function closedCaptionsSettings( + callback: (value) => ClosedCaptionsSettings, +): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Getting the closed captions settings + +JavaScript: + +```javascript +import { Accessibility } from '@firebolt-js/sdk' + +let listenerId = await closedCaptionsSettings((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `closedCaptionsSettings`: + +```javascript +{ + "enabled": true, + "styles": { + "fontFamily": "monospaced_sanserif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Accessibility.onClosedCaptionsSettingsChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "enabled": true, + "styles": { + "fontFamily": "monospaced_sanserif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": ["eng", "spa"] + } +} +``` + +
+ +--- + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ----------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Accessibility.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ----------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Accessibility.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ----------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Accessibility.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ----------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Accessibility.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### voiceGuidance + +Get the user's preferred voice guidance settings + +```typescript +function voiceGuidance(): Promise +``` + +Promise resolution: + +[VoiceGuidanceSettings](../Accessibility/schemas/#VoiceGuidanceSettings) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:voiceguidance | + +#### Examples + +Getting the voice guidance settings + +JavaScript: + +```javascript +import { Accessibility } from '@firebolt-js/sdk' + +let settings = await Accessibility.voiceGuidance() +console.log(settings) +``` + +Value of `settings`: + +```javascript +{ + "enabled": true, + "speed": 2 +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Accessibility.voiceGuidance", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "enabled": true, + "speed": 2 + } +} +``` + +
+ +--- + +### voiceGuidanceSettings + +Get the user's preferred voice guidance settings + +To get the value of `voiceGuidanceSettings` call the method like this: + +```typescript +function voiceGuidanceSettings(): Promise +``` + +Promise resolution: + +[VoiceGuidanceSettings](../Accessibility/schemas/#VoiceGuidanceSettings) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:voiceguidance | + +#### Examples + +Getting the voice guidance settings + +JavaScript: + +```javascript +import { Accessibility } from '@firebolt-js/sdk' + +let settings = await Accessibility.voiceGuidanceSettings() +console.log(settings) +``` + +Value of `settings`: + +```javascript +{ + "enabled": true, + "speed": 2 +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Accessibility.voiceGuidanceSettings", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "enabled": true, + "speed": 2 + } +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function voiceGuidanceSettings( + callback: (value) => VoiceGuidanceSettings, +): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Getting the voice guidance settings + +JavaScript: + +```javascript +import { Accessibility } from '@firebolt-js/sdk' + +let listenerId = await voiceGuidanceSettings((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `settings`: + +```javascript +{ + "enabled": true, + "speed": 2 +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Accessibility.onVoiceGuidanceSettingsChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "enabled": true, + "speed": 2 + } +} +``` + +
+ +--- + +## Events + +### audioDescriptionSettingsChanged + +See: [audioDescriptionSettings](#audiodescriptionsettings) + +### closedCaptionsSettingsChanged + +See: [closedCaptionsSettings](#closedcaptionssettings) + +### voiceGuidanceSettingsChanged + +See: [voiceGuidanceSettings](#voiceguidancesettings) + +## Types + +### AudioDescriptionSettings + +```typescript +type AudioDescriptionSettings = { + enabled: boolean // Whether or not audio descriptions should be enabled by default +} +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Accessibility/schemas/index.md b/apis/pr-fix-ci-fb-version/core/Accessibility/schemas/index.md new file mode 100644 index 000000000..bdbc84546 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Accessibility/schemas/index.md @@ -0,0 +1,154 @@ +--- +title: Accessibility + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Accessibility + +--- + +Version Accessibility 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [FontFamily](#fontfamily) + - [VoiceSpeed](#voicespeed) + - [VoiceGuidanceSettings](#voiceguidancesettings) + - [FontSize](#fontsize) + - [Color](#color) + - [FontEdge](#fontedge) + - [Opacity](#opacity) + - [HorizontalAlignment](#horizontalalignment) + - [VerticalAlignment](#verticalalignment) + - [ClosedCaptionsStyles](#closedcaptionsstyles) + - [ClosedCaptionsSettings](#closedcaptionssettings) + +## Overview + +undefined + +## Types + +### FontFamily + +```typescript + +``` + +--- + +### VoiceSpeed + +```typescript + +``` + +--- + +### VoiceGuidanceSettings + +```typescript +type VoiceGuidanceSettings = { + enabled: boolean // Whether or not voice guidance should be enabled by default + speed?: VoiceSpeed // The speed at which voice guidance speech will be read back to the user +} +``` + +See also: + +[VoiceSpeed](#voicespeed) + +--- + +### FontSize + +```typescript + +``` + +--- + +### Color + +```typescript + +``` + +--- + +### FontEdge + +```typescript + +``` + +--- + +### Opacity + +```typescript + +``` + +--- + +### HorizontalAlignment + +```typescript + +``` + +--- + +### VerticalAlignment + +```typescript + +``` + +--- + +### ClosedCaptionsStyles + +The default styles to use when displaying closed-captions + +```typescript +type ClosedCaptionsStyles = { + fontFamily?: string + fontSize?: number + fontColor?: string + fontEdge?: string + fontEdgeColor?: string + fontOpacity?: number + backgroundColor?: string + backgroundOpacity?: number + textAlign?: string + textAlignVertical?: string + windowColor?: string + windowOpacity?: number +} +``` + +--- + +### ClosedCaptionsSettings + +```typescript +type ClosedCaptionsSettings = { + enabled: boolean // Whether or not closed-captions should be enabled by default + styles?: ClosedCaptionsStyles // The default styles to use when displaying closed-captions + preferredLanguages?: string[] +} +``` + +See also: + +[ClosedCaptionsStyles](#closedcaptionsstyles) + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Account/index.md b/apis/pr-fix-ci-fb-version/core/Account/index.md new file mode 100644 index 000000000..f74a6fba1 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Account/index.md @@ -0,0 +1,167 @@ +--- +title: Account + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Account Module + +--- + +Version Account 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [id](#id) + - [uid](#uid) +- [Types](#types) + +## Usage + +To use the Account module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Account } from '@firebolt-js/sdk' +``` + +## Overview + +A module for querying about the device account. + +## Methods + +### id + +Get the platform back-office account identifier + +To get the value of `id` call the method like this: + +```typescript +function id(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------- | +| uses | xrn:firebolt:capability:account:id | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Account } from '@firebolt-js/sdk' + +let id = await Account.id() +console.log(id) +``` + +Value of `id`: + +```javascript +'123' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Account.id", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "123" +} +``` + +
+ +--- + +### uid + +Gets a unique id for the current app & account + +To get the value of `uid` call the method like this: + +```typescript +function uid(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:account:uid | + +#### Examples + +Getting the unique ID + +JavaScript: + +```javascript +import { Account } from '@firebolt-js/sdk' + +let uniqueId = await Account.uid() +console.log(uniqueId) +``` + +Value of `uniqueId`: + +```javascript +'ee6723b8-7ab3-462c-8d93-dbf61227998e' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Account.uid", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "ee6723b8-7ab3-462c-8d93-dbf61227998e" +} +``` + +
+ +--- + +## Types diff --git a/apis/pr-fix-ci-fb-version/core/Advertising/index.md b/apis/pr-fix-ci-fb-version/core/Advertising/index.md new file mode 100644 index 000000000..75b948228 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Advertising/index.md @@ -0,0 +1,788 @@ +--- +title: Advertising + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Advertising Module + +--- + +Version Advertising 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [advertisingId](#advertisingid) + - [appBundleId](#appbundleid) + - [config](#config) + - [deviceAttributes](#deviceattributes) + - [listen](#listen) + - [once](#once) + - [policy](#policy) +- [Events](#events) + - [policyChanged](#policychanged) +- [Types](#types) + - [AdConfigurationOptions](#adconfigurationoptions) + - [AdPolicy](#adpolicy) + - [AdvertisingIdOptions](#advertisingidoptions) + - [AdvertisingIdResult](#advertisingidresult) + +## Usage + +To use the Advertising module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Advertising } from '@firebolt-js/sdk' +``` + +## Overview + +A module for platform provided advertising settings and functionality. + +## Methods + +### advertisingId + +Get the IAB compliant identifier for advertising (IFA). It is recommended to use the IFA to manage advertising related activities while respecting the user's privacy settings. + +```typescript +function advertisingId( + options: AdvertisingIdOptions, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| --------- | ----------------------------------------------- | -------- | --------------------- | +| `options` | [`AdvertisingIdOptions`](#advertisingidoptions) | false | AdvertisingId options | + +Promise resolution: + +[AdvertisingIdResult](#advertisingidresult) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------- | +| uses | xrn:firebolt:capability:advertising:identifier | + +#### Examples + +Getting the advertising ID + +JavaScript: + +```javascript +import { Advertising } from '@firebolt-js/sdk' + +let advertisingId = await Advertising.advertisingId(null) +console.log(advertisingId) +``` + +Value of `advertisingId`: + +```javascript +{ + "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa_type": "sspid", + "lmt": "0" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Advertising.advertisingId", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa_type": "sspid", + "lmt": "0" + } +} +``` + +
+ +Getting the advertising ID with scope browse + +JavaScript: + +```javascript +import { Advertising } from '@firebolt-js/sdk' + +let advertisingId = await Advertising.advertisingId({ + scope: { type: 'browse', id: 'paidPlacement' }, +}) +console.log(advertisingId) +``` + +Value of `advertisingId`: + +```javascript +{ + "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa_type": "sspid", + "lmt": "0" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Advertising.advertisingId", + "params": { + "options": { + "scope": { + "type": "browse", + "id": "paidPlacement" + } + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa_type": "sspid", + "lmt": "0" + } +} +``` + +
+ +Getting the advertising ID with scope content + +JavaScript: + +```javascript +import { Advertising } from '@firebolt-js/sdk' + +let advertisingId = await Advertising.advertisingId({ + scope: { type: 'content', id: 'metadata:linear:station:123' }, +}) +console.log(advertisingId) +``` + +Value of `advertisingId`: + +```javascript +{ + "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa_type": "sspid", + "lmt": "0" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Advertising.advertisingId", + "params": { + "options": { + "scope": { + "type": "content", + "id": "metadata:linear:station:123" + } + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa_type": "idfa", + "lmt": "0" + } +} +``` + +
+ +--- + +### appBundleId + +Get the App's Bundle ID + +```typescript +function appBundleId(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------------- | +| uses | xrn:firebolt:capability:advertising:configuration | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Advertising } from '@firebolt-js/sdk' + +let appBundleId = await Advertising.appBundleId() +console.log(appBundleId) +``` + +Value of `appBundleId`: + +```javascript +'app.operator' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Advertising.appBundleId", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "app.operator" +} +``` + +
+ +--- + +### config + +Build configuration object for Ad Framework initialization + +```typescript +function config(options: AdConfigurationOptions): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| --------- | --------------------------------------------------- | -------- | --------------------- | +| `options` | [`AdConfigurationOptions`](#adconfigurationoptions) | true | Configuration options | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------------- | +| uses | xrn:firebolt:capability:advertising:configuration | + +#### Examples + +Initializing the Ad Framework + +JavaScript: + +```javascript +import { Advertising } from '@firebolt-js/sdk' + +let adFrameworkConfig = await Advertising.config({ + environment: 'prod', + authenticationEntity: 'MVPD', +}) +console.log(adFrameworkConfig) +``` + +Value of `adFrameworkConfig`: + +```javascript +{ + "adServerUrl": "https://demo.v.fwmrm.net/ad/p/1", + "adServerUrlTemplate": "https://demo.v.fwmrm.net/ad/p/1?flag=+sltp+exvt+slcb+emcr+amcb+aeti&prof=12345:caf_allinone_profile &nw=12345&mode=live&vdur=123&caid=a110523018&asnw=372464&csid=gmott_ios_tablet_watch_live_ESPNU&ssnw=372464&vip=198.205.92.1&resp=vmap1&metr=1031&pvrn=12345&vprn=12345&vcid=1X0Ce7L3xRWlTeNhc7br8Q%3D%3D", + "adNetworkId": "519178", + "adProfileId": "12345:caf_allinone_profile", + "adSiteSectionId": "caf_allinone_profile_section", + "adOptOut": true, + "privacyData": "ew0KICAicGR0IjogImdkcDp2MSIsDQogICJ1c19wcml2YWN5IjogIjEtTi0iLA0KICAibG10IjogIjEiIA0KfQ0K", + "ifaValue": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa": "ewogICJ2YWx1ZSI6ICIwMTIzNDU2Ny04OUFCLUNERUYtR0gwMS0yMzQ1Njc4OUFCQ0QiLAogICJpZmFfdHlwZSI6ICJzc3BpZCIsCiAgImxtdCI6ICIwIgp9Cg==", + "appName": "FutureToday", + "appBundleId": "FutureToday.comcast", + "distributorAppId": "1001", + "deviceAdAttributes": "ewogICJib0F0dHJpYnV0ZXNGb3JSZXZTaGFyZUlkIjogIjEyMzQiCn0=", + "coppa": 0, + "authenticationEntity": "60f72475281cfba3852413bd53e957f6" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Advertising.config", + "params": { + "options": { + "environment": "prod", + "authenticationEntity": "MVPD" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "adServerUrl": "https://demo.v.fwmrm.net/ad/p/1", + "adServerUrlTemplate": "https://demo.v.fwmrm.net/ad/p/1?flag=+sltp+exvt+slcb+emcr+amcb+aeti&prof=12345:caf_allinone_profile &nw=12345&mode=live&vdur=123&caid=a110523018&asnw=372464&csid=gmott_ios_tablet_watch_live_ESPNU&ssnw=372464&vip=198.205.92.1&resp=vmap1&metr=1031&pvrn=12345&vprn=12345&vcid=1X0Ce7L3xRWlTeNhc7br8Q%3D%3D", + "adNetworkId": "519178", + "adProfileId": "12345:caf_allinone_profile", + "adSiteSectionId": "caf_allinone_profile_section", + "adOptOut": true, + "privacyData": "ew0KICAicGR0IjogImdkcDp2MSIsDQogICJ1c19wcml2YWN5IjogIjEtTi0iLA0KICAibG10IjogIjEiIA0KfQ0K", + "ifaValue": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa": "ewogICJ2YWx1ZSI6ICIwMTIzNDU2Ny04OUFCLUNERUYtR0gwMS0yMzQ1Njc4OUFCQ0QiLAogICJpZmFfdHlwZSI6ICJzc3BpZCIsCiAgImxtdCI6ICIwIgp9Cg==", + "appName": "FutureToday", + "appBundleId": "FutureToday.comcast", + "distributorAppId": "1001", + "deviceAdAttributes": "ewogICJib0F0dHJpYnV0ZXNGb3JSZXZTaGFyZUlkIjogIjEyMzQiCn0=", + "coppa": 0, + "authenticationEntity": "60f72475281cfba3852413bd53e957f6" + } +} +``` + +
+ +--- + +### deviceAttributes + +Get the device advertising device attributes + +```typescript +function deviceAttributes(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------------- | +| uses | xrn:firebolt:capability:advertising:configuration | + +#### Examples + +Getting the device attributes + +JavaScript: + +```javascript +import { Advertising } from '@firebolt-js/sdk' + +let deviceAttributes = await Advertising.deviceAttributes() +console.log(deviceAttributes) +``` + +Value of `deviceAttributes`: + +```javascript +{ +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Advertising.deviceAttributes", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": {} +} +``` + +
+ +--- + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | --------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Advertising.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | --------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Advertising.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | --------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Advertising.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | --------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Advertising.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### policy + +Get the advertising privacy and playback policy + +To get the value of `policy` call the method like this: + +```typescript +function policy(): Promise +``` + +Promise resolution: + +[AdPolicy](#adpolicy) + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------ | +| uses | xrn:firebolt:capability:advertising:policy | + +#### Examples + +Getting the advertising policy settings + +JavaScript: + +```javascript +import { Advertising } from '@firebolt-js/sdk' + +let adPolicy = await Advertising.policy() +console.log(adPolicy) +``` + +Value of `adPolicy`: + +```javascript +{ + "skipRestriction": "adsUnwatched", + "limitAdTracking": false +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Advertising.policy", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "skipRestriction": "adsUnwatched", + "limitAdTracking": false + } +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function policy(callback: (value) => AdPolicy): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Getting the advertising policy settings + +JavaScript: + +```javascript +import { Advertising } from '@firebolt-js/sdk' + +let listenerId = await policy((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `adPolicy`: + +```javascript +{ + "skipRestriction": "adsUnwatched", + "limitAdTracking": false +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Advertising.onPolicyChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "skipRestriction": "adsUnwatched", + "limitAdTracking": false + } +} +``` + +
+ +--- + +## Events + +### policyChanged + +See: [policy](#policy) + +## Types + +### AdConfigurationOptions + +```typescript +type AdConfigurationOptions = { + coppa?: boolean // Whether or not the app requires US COPPA compliance. + environment?: 'prod' | 'test' // Whether the app is running in a production or test mode. + authenticationEntity?: string // The authentication provider, when it is separate entity than the app provider, e.g. an MVPD. +} +``` + +--- + +### AdPolicy + +Describes various ad playback enforcement rules that the app should follow. + +```typescript +type AdPolicy = { + skipRestriction?: SkipRestriction // The advertisement skip restriction. + limitAdTracking?: boolean +} +``` + +See also: + +[SkipRestriction](../Advertising/schemas/#SkipRestriction) + +--- + +### AdvertisingIdOptions + +```typescript +type AdvertisingIdOptions = { + scope?: object // Provides the options to send scope type and id to select desired advertising id +} +``` + +--- + +### AdvertisingIdResult + +```typescript +type AdvertisingIdResult = { + ifa: string // UUID conforming to IAB standard + ifa_type: string // source of the IFA as defined by IAB + lmt: '0' | '1' // boolean that if set to 1, user has requested ad tracking and measurement is disabled +} +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Advertising/schemas/index.md b/apis/pr-fix-ci-fb-version/core/Advertising/schemas/index.md new file mode 100644 index 000000000..da428fca4 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Advertising/schemas/index.md @@ -0,0 +1,53 @@ +--- +title: Advertising + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Advertising + +--- + +Version Advertising 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [SkipRestriction](#skiprestriction) + +## Overview + +undefined + +## Types + +### SkipRestriction + +The advertisement skip restriction. + +Applies to fast-forward/rewind (e.g. trick mode), seeking over an entire opportunity (e.g. jump), seeking out of what's currently playing, and "Skip this ad..." features. Seeking over multiple ad opportunities only requires playback of the _last_ opportunity, not all opportunities, preceding the seek destination. + +| Value | Description | +| ------------ | ------------------------------------------------------------------------------ | +| none | No fast-forward, jump, or skip restrictions | +| adsUnwatched | Restrict fast-forward, jump, and skip for unwatched ad opportunities only. | +| adsAll | Restrict fast-forward, jump, and skip for all ad opportunities | +| all | Restrict fast-forward, jump, and skip for all ad opportunities and all content | + +Namespace: `xrn:advertising:policy:skipRestriction:` + +```typescript +SkipRestriction: { + NONE: 'none', + ADS_UNWATCHED: 'adsUnwatched', + ADS_ALL: 'adsAll', + ALL: 'all', +}, + +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Authentication/index.md b/apis/pr-fix-ci-fb-version/core/Authentication/index.md new file mode 100644 index 000000000..6ae57a78d --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Authentication/index.md @@ -0,0 +1,449 @@ +--- +title: Authentication + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Authentication Module + +--- + +Version Authentication 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [device](#device) + - [root](#root) + - [session](#session) + - [token](#token) +- [Types](#types) + - [TokenType](#tokentype) + - [AuthenticationTokenResult](#authenticationtokenresult) + +## Usage + +To use the Authentication module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Authentication } from '@firebolt-js/sdk' +``` + +## Overview + +A module for acquiring authentication tokens. + +## Methods + +### device + +Get a device token scoped to the current app. + +```typescript +function device(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------ | +| uses | xrn:firebolt:capability:token:device | + +#### Examples + +Acquire a Firebolt device identity token + +JavaScript: + +```javascript +import { Authentication } from '@firebolt-js/sdk' + +let token = await Authentication.device() +console.log(token) +``` + +Value of `token`: + +```javascript +'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Authentication.device", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" +} +``` + +
+ +--- + +### root + +Get a root device token. + +```typescript +function root(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------- | +| uses | xrn:firebolt:capability:token:root | + +#### Examples + +Acquire a Firebolt root device identity token + +JavaScript: + +```javascript +import { Authentication } from '@firebolt-js/sdk' + +let token = await Authentication.root() +console.log(token) +``` + +Value of `token`: + +```javascript +'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Authentication.root", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" +} +``` + +
+ +--- + +### session + +Get a destributor session token. + +```typescript +function session(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:token:session | + +#### Examples + +Acquire a distributor session token + +JavaScript: + +```javascript +import { Authentication } from '@firebolt-js/sdk' + +let token = await Authentication.session() +console.log(token) +``` + +Value of `token`: + +```javascript +'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Authentication.session", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" +} +``` + +
+ +--- + +### token + +Get a specific `type` of authentication token + +```typescript +function token( + type: TokenType, + options: object, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| --------- | ------------------------- | -------- | -------------------------------------------------------------------------------- | +| `type` | [`TokenType`](#tokentype) | true | What type of token to get
values: `'platform' \| 'device' \| 'distributor'` | +| `options` | `object` | false | Additional options for acquiring the token. | + +Promise resolution: + +[AuthenticationTokenResult](#authenticationtokenresult) + +Capabilities: + +| Role | Capability | +| ---- | -------------------------------------- | +| uses | xrn:firebolt:capability:token:platform | + +#### Examples + +Acquire a Firebolt platform token + +JavaScript: + +```javascript +import { Authentication } from '@firebolt-js/sdk' + +let token = await Authentication.token('platform', null) +console.log(token) +``` + +Value of `token`: + +```javascript +{ + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "expires": "2022-04-23T18:25:43.511Z", + "type": "platform" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Authentication.token", + "params": { + "type": "platform" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "expires": "2022-04-23T18:25:43.511Z", + "type": "platform" + } +} +``` + +
+ +Acquire a Firebolt device identity token + +JavaScript: + +```javascript +import { Authentication } from '@firebolt-js/sdk' + +let token = await Authentication.token('device', null) +console.log(token) +``` + +Value of `token`: + +```javascript +{ + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "expires": "2022-04-23T18:25:43.511Z", + "type": "platform" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Authentication.token", + "params": { + "type": "device" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "expires": "2022-04-23T18:25:43.511Z", + "type": "device" + } +} +``` + +
+ +Acquire a Firebolt distributor token + +JavaScript: + +```javascript +import { Authentication } from '@firebolt-js/sdk' + +let token = await Authentication.token('distributor', { clientId: 'xyz' }) +console.log(token) +``` + +Value of `token`: + +```javascript +{ + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "expires": "2022-04-23T18:25:43.511Z", + "type": "platform" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Authentication.token", + "params": { + "type": "distributor", + "options": { + "clientId": "xyz" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "expires": "2022-04-23T18:25:43.511Z", + "type": "distributor", + "data": { + "tid": "EB00E9230AB2A35F57DB4EFDDC4908F6446D38F08F4FF0BD57FE6A61E21EEFD9", + "scope": "scope" + } + } +} +``` + +
+ +--- + +## Types + +### TokenType + +```typescript +TokenType: { + PLATFORM: 'platform', + DEVICE: 'device', + DISTRIBUTOR: 'distributor', +}, + +``` + +--- + +### AuthenticationTokenResult + +```typescript +type AuthenticationTokenResult = { + value: string + expires?: string + type?: string +} +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Capabilities/index.md b/apis/pr-fix-ci-fb-version/core/Capabilities/index.md new file mode 100644 index 000000000..fc0377bef --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Capabilities/index.md @@ -0,0 +1,1757 @@ +--- +title: Capabilities + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Capabilities Module + +--- + +Version Capabilities 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [available](#available) + - [granted](#granted) + - [info](#info) + - [listen](#listen) + - [once](#once) + - [permitted](#permitted) + - [request](#request) + - [supported](#supported) +- [Events](#events) + - [available](#available-1) + - [granted](#granted-1) + - [revoked](#revoked) + - [unavailable](#unavailable) +- [Types](#types) + - [CapabilityOption](#capabilityoption) + +## Usage + +To use the Capabilities module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' +``` + +## Overview + +The Capabilities module provides information about which discreet unit of functionality is enabled for the apps. + +## Methods + +### available + +Returns whether a capability is available now. + +```typescript +function available(capability: Capability): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------------ | --------------------------------------------------- | -------- | ---------------------------------------------------------------------- | +| `capability` | [`Capability`](../Capabilities/schemas/#Capability) | true |
pattern: ^xrn:firebolt:capability:([a-z0-9\-]+)((:[a-z0-9\-]+)?)$ | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------------- | +| uses | xrn:firebolt:capability:capabilities:info | + +#### Examples + +Device Token. + +JavaScript: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' + +let available = await Capabilities.available( + 'xrn:firebolt:capability:token:device', +) +console.log(available) +``` + +Value of `available`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Capabilities.available", + "params": { + "capability": "xrn:firebolt:capability:token:device" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Unavailable Platform token. + +JavaScript: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' + +let available = await Capabilities.available( + 'xrn:firebolt:capability:token:platform', +) +console.log(available) +``` + +Value of `available`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Capabilities.available", + "params": { + "capability": "xrn:firebolt:capability:token:platform" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### granted + +Returns whether the current App has a user grant for passed capability and role. + +```typescript +function granted( + capability: Capability, + options: CapabilityOption, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------------ | --------------------------------------------------- | -------- | ---------------------------------------------------------------------- | +| `capability` | [`Capability`](../Capabilities/schemas/#Capability) | true |
pattern: ^xrn:firebolt:capability:([a-z0-9\-]+)((:[a-z0-9\-]+)?)$ | +| `options` | [`CapabilityOption`](#capabilityoption) | false | Capability options | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------------- | +| uses | xrn:firebolt:capability:capabilities:info | + +#### Examples + +Default capabilities without grants. + +JavaScript: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' + +let granted = await Capabilities.granted( + 'xrn:firebolt:capability:input:keyboard', + null, +) +console.log(granted) +``` + +Value of `granted`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Capabilities.granted", + "params": { + "capability": "xrn:firebolt:capability:input:keyboard" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Get Postal code without grants. + +JavaScript: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' + +let granted = await Capabilities.granted( + 'xrn:firebolt:capability:localization:postal-code', + null, +) +console.log(granted) +``` + +Value of `granted`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Capabilities.granted", + "params": { + "capability": "xrn:firebolt:capability:localization:postal-code" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +Get Postal code with grants. + +JavaScript: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' + +let granted = await Capabilities.granted( + 'xrn:firebolt:capability:localization:postal-code', + null, +) +console.log(granted) +``` + +Value of `granted`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Capabilities.granted", + "params": { + "capability": "xrn:firebolt:capability:localization:postal-code" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### info + +Returns an array of CapabilityInfo objects for the passed in capabilities. + +```typescript +function info(capabilities: Capability[]): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| -------------- | -------------- | -------- | ---------------------------------------------------------------------- | +| `capabilities` | `Capability[]` | true |
pattern: ^xrn:firebolt:capability:([a-z0-9\-]+)((:[a-z0-9\-]+)?)$ | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------------- | +| uses | xrn:firebolt:capability:capabilities:info | + +#### Examples + +Default result + +JavaScript: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' + +let info = await Capabilities.info([ + 'xrn:firebolt:capability:device:model', + 'xrn:firebolt:capability:input:keyboard', + 'xrn:firebolt:capability:protocol:bluetoothle', + 'xrn:firebolt:capability:token:device', + 'xrn:firebolt:capability:token:platform', + 'xrn:firebolt:capability:protocol:moca', + 'xrn:firebolt:capability:wifi:scan', + 'xrn:firebolt:capability:localization:postal-code', + 'xrn:firebolt:capability:localization:locality', +]) +console.log(info) +``` + +Value of `info`: + +```javascript +;[ + { + capability: 'xrn:firebolt:capability:device:model', + supported: true, + available: true, + use: { + permitted: true, + granted: true, + }, + manage: { + permitted: true, + granted: true, + }, + provide: { + permitted: true, + granted: true, + }, + }, + { + capability: 'xrn:firebolt:capability:input:keyboard', + supported: true, + available: true, + use: { + permitted: true, + granted: true, + }, + manage: { + permitted: true, + granted: true, + }, + provide: { + permitted: true, + granted: true, + }, + }, + { + capability: 'xrn:firebolt:capability:protocol:bluetoothle', + supported: false, + available: false, + use: { + permitted: true, + granted: true, + }, + manage: { + permitted: true, + granted: true, + }, + provide: { + permitted: true, + granted: true, + }, + details: ['unsupported'], + }, + { + capability: 'xrn:firebolt:capability:token:device', + supported: true, + available: true, + use: { + permitted: true, + granted: true, + }, + manage: { + permitted: true, + granted: true, + }, + provide: { + permitted: true, + granted: true, + }, + }, + { + capability: 'xrn:firebolt:capability:token:platform', + supported: true, + available: false, + use: { + permitted: true, + granted: true, + }, + manage: { + permitted: true, + granted: true, + }, + provide: { + permitted: true, + granted: true, + }, + details: ['unavailable'], + }, + { + capability: 'xrn:firebolt:capability:protocol:moca', + supported: true, + available: false, + use: { + permitted: true, + granted: true, + }, + manage: { + permitted: true, + granted: true, + }, + provide: { + permitted: true, + granted: true, + }, + details: ['disabled', 'unavailable'], + }, + { + capability: 'xrn:firebolt:capability:wifi:scan', + supported: true, + available: true, + use: { + permitted: true, + granted: true, + }, + manage: { + permitted: true, + granted: true, + }, + provide: { + permitted: true, + granted: true, + }, + details: ['unpermitted'], + }, + { + capability: 'xrn:firebolt:capability:localization:postal-code', + supported: true, + available: true, + use: { + permitted: true, + granted: null, + }, + manage: { + permitted: true, + granted: true, + }, + provide: { + permitted: true, + granted: true, + }, + details: ['ungranted'], + }, + { + capability: 'xrn:firebolt:capability:localization:postal-code', + supported: true, + available: true, + use: { + permitted: true, + granted: true, + }, + manage: { + permitted: true, + granted: true, + }, + provide: { + permitted: true, + granted: true, + }, + details: ['ungranted'], + }, + { + capability: 'xrn:firebolt:capability:localization:locality', + supported: true, + available: true, + use: { + permitted: true, + granted: true, + }, + manage: { + permitted: true, + granted: true, + }, + provide: { + permitted: true, + granted: true, + }, + details: ['grantDenied', 'ungranted'], + }, +] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Capabilities.info", + "params": { + "capabilities": [ + "xrn:firebolt:capability:device:model", + "xrn:firebolt:capability:input:keyboard", + "xrn:firebolt:capability:protocol:bluetoothle", + "xrn:firebolt:capability:token:device", + "xrn:firebolt:capability:token:platform", + "xrn:firebolt:capability:protocol:moca", + "xrn:firebolt:capability:wifi:scan", + "xrn:firebolt:capability:localization:postal-code", + "xrn:firebolt:capability:localization:locality" + ] + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "capability": "xrn:firebolt:capability:device:model", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + }, + { + "capability": "xrn:firebolt:capability:input:keyboard", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + }, + { + "capability": "xrn:firebolt:capability:protocol:bluetoothle", + "supported": false, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": ["unsupported"] + }, + { + "capability": "xrn:firebolt:capability:token:device", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + }, + { + "capability": "xrn:firebolt:capability:token:platform", + "supported": true, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": ["unavailable"] + }, + { + "capability": "xrn:firebolt:capability:protocol:moca", + "supported": true, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": ["disabled", "unavailable"] + }, + { + "capability": "xrn:firebolt:capability:wifi:scan", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": ["unpermitted"] + }, + { + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": null + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": ["ungranted"] + }, + { + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": ["ungranted"] + }, + { + "capability": "xrn:firebolt:capability:localization:locality", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": ["grantDenied", "ungranted"] + } + ] +} +``` + +
+ +--- + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Capabilities.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Capabilities.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Capabilities.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Capabilities.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### permitted + +Returns whether the current App has permission to the passed capability and role. + +```typescript +function permitted( + capability: Capability, + options: CapabilityOption, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------------ | --------------------------------------------------- | -------- | ---------------------------------------------------------------------- | +| `capability` | [`Capability`](../Capabilities/schemas/#Capability) | true |
pattern: ^xrn:firebolt:capability:([a-z0-9\-]+)((:[a-z0-9\-]+)?)$ | +| `options` | [`CapabilityOption`](#capabilityoption) | false | Capability options | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------------- | +| uses | xrn:firebolt:capability:capabilities:info | + +#### Examples + +Keyboard + +JavaScript: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' + +let permitted = await Capabilities.permitted( + 'xrn:firebolt:capability:input:keyboard', + null, +) +console.log(permitted) +``` + +Value of `permitted`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Capabilities.permitted", + "params": { + "capability": "xrn:firebolt:capability:input:keyboard" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Keyboard incorrect manage role capability + +JavaScript: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' + +let permitted = await Capabilities.permitted( + 'xrn:firebolt:capability:input:keyboard', + { role: 'manage' }, +) +console.log(permitted) +``` + +Value of `permitted`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Capabilities.permitted", + "params": { + "capability": "xrn:firebolt:capability:input:keyboard", + "options": { + "role": "manage" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +Wifi scan not permitted capability + +JavaScript: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' + +let permitted = await Capabilities.permitted( + 'xrn:firebolt:capability:wifi:scan', + null, +) +console.log(permitted) +``` + +Value of `permitted`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Capabilities.permitted", + "params": { + "capability": "xrn:firebolt:capability:wifi:scan" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### request + +Requests grants for all capability/role combinations in the roles array. + +```typescript +function request(grants: Permission[]): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| -------- | -------------- | -------- | ----------- | +| `grants` | `Permission[]` | true | | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | -------------------------------------------- | +| uses | xrn:firebolt:capability:capabilities:request | + +#### Examples + +Default result + +JavaScript: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' + +let request = await Capabilities.request([ + { role: 'use', capability: 'xrn:firebolt:capability:commerce:purchase' }, +]) +console.log(request) +``` + +Value of `request`: + +```javascript +;[ + { + capability: 'xrn:firebolt:capability:commerce:purchase', + supported: true, + available: true, + use: { + permitted: true, + granted: true, + }, + manage: { + permitted: true, + granted: true, + }, + provide: { + permitted: true, + granted: true, + }, + }, +] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Capabilities.request", + "params": { + "grants": [ + { + "role": "use", + "capability": "xrn:firebolt:capability:commerce:purchase" + } + ] + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "capability": "xrn:firebolt:capability:commerce:purchase", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + } + ] +} +``` + +
+ +--- + +### supported + +Returns whether the platform supports the passed capability. + +```typescript +function supported(capability: Capability): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------------ | --------------------------------------------------- | -------- | ---------------------------------------------------------------------- | +| `capability` | [`Capability`](../Capabilities/schemas/#Capability) | true |
pattern: ^xrn:firebolt:capability:([a-z0-9\-]+)((:[a-z0-9\-]+)?)$ | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------------- | +| uses | xrn:firebolt:capability:capabilities:info | + +#### Examples + +Wifi scan supported capability + +JavaScript: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' + +let supported = await Capabilities.supported( + 'xrn:firebolt:capability:wifi:scan', +) +console.log(supported) +``` + +Value of `supported`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Capabilities.supported", + "params": { + "capability": "xrn:firebolt:capability:wifi:scan" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +BLE protocol unsupported capability + +JavaScript: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' + +let supported = await Capabilities.supported( + 'xrn:firebolt:capability:protocol:bluetoothle', +) +console.log(supported) +``` + +Value of `supported`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Capabilities.supported", + "params": { + "capability": "xrn:firebolt:capability:protocol:bluetoothle" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +## Events + +### available + +```typescript +function listen('available', capability: Capability, () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Parameters: + +| Param | Type | Required | Description | +| ------------ | --------------------------------------------------- | -------- | ---------------------------------------------------------------------- | +| `capability` | [`Capability`](../Capabilities/schemas/#Capability) | true |
pattern: ^xrn:firebolt:capability:([a-z0-9\-]+)((:[a-z0-9\-]+)?)$ | + +Event value: + +[CapabilityInfo](../Capabilities/schemas/#CapabilityInfo) + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------------- | +| uses | xrn:firebolt:capability:capabilities:info | + +#### Examples + +Platform token is available + +JavaScript: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' + +Capabilities.listen('available', (value) => { + console.log(value) +}) +``` + +Value of `value`: + +```javascript +{ + "capability": "xrn:firebolt:capability:token:platform", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unpermitted" + ] +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Capabilities.onAvailable", + "params": { + "capability": "xrn:firebolt:capability:token:platform", + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "capability": "xrn:firebolt:capability:token:platform", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": ["unpermitted"] + } +} +``` + +
+ +--- + +### granted + +```typescript +function listen('granted', role: Role, capability: Capability, () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Parameters: + +| Param | Type | Required | Description | +| ------------ | --------------------------------------------------- | -------- | ---------------------------------------------------------------------- | +| `role` | [`Role`](../Capabilities/schemas/#Role) | true |
values: `'use' \| 'manage' \| 'provide'` | +| `capability` | [`Capability`](../Capabilities/schemas/#Capability) | true |
pattern: ^xrn:firebolt:capability:([a-z0-9\-]+)((:[a-z0-9\-]+)?)$ | + +Event value: + +[CapabilityInfo](../Capabilities/schemas/#CapabilityInfo) + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------------- | +| uses | xrn:firebolt:capability:capabilities:info | + +#### Examples + +Postal code granted + +JavaScript: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' + +Capabilities.listen('granted', (value) => { + console.log(value) +}) +``` + +Value of `value`: + +```javascript +{ + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Capabilities.onGranted", + "params": { + "role": "use", + "capability": "xrn:firebolt:capability:localization:postal-code", + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + } +} +``` + +
+ +--- + +### revoked + +```typescript +function listen('revoked', role: Role, capability: Capability, () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Parameters: + +| Param | Type | Required | Description | +| ------------ | --------------------------------------------------- | -------- | ---------------------------------------------------------------------- | +| `role` | [`Role`](../Capabilities/schemas/#Role) | true |
values: `'use' \| 'manage' \| 'provide'` | +| `capability` | [`Capability`](../Capabilities/schemas/#Capability) | true |
pattern: ^xrn:firebolt:capability:([a-z0-9\-]+)((:[a-z0-9\-]+)?)$ | + +Event value: + +[CapabilityInfo](../Capabilities/schemas/#CapabilityInfo) + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------------- | +| uses | xrn:firebolt:capability:capabilities:info | + +#### Examples + +Postal code revoked + +JavaScript: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' + +Capabilities.listen('revoked', (value) => { + console.log(value) +}) +``` + +Value of `value`: + +```javascript +{ + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "grantDenied" + ] +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Capabilities.onRevoked", + "params": { + "role": "use", + "capability": "xrn:firebolt:capability:localization:postal-code", + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": ["grantDenied"] + } +} +``` + +
+ +--- + +### unavailable + +```typescript +function listen('unavailable', capability: Capability, () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Parameters: + +| Param | Type | Required | Description | +| ------------ | --------------------------------------------------- | -------- | ---------------------------------------------------------------------- | +| `capability` | [`Capability`](../Capabilities/schemas/#Capability) | true |
pattern: ^xrn:firebolt:capability:([a-z0-9\-]+)((:[a-z0-9\-]+)?)$ | + +Event value: + +[CapabilityInfo](../Capabilities/schemas/#CapabilityInfo) + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------------- | +| uses | xrn:firebolt:capability:capabilities:info | + +#### Examples + +Platform token is unavailable. + +JavaScript: + +```javascript +import { Capabilities } from '@firebolt-js/sdk' + +Capabilities.listen('unavailable', (value) => { + console.log(value) +}) +``` + +Value of `value`: + +```javascript +{ + "capability": "xrn:firebolt:capability:token:platform", + "supported": true, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unavailable" + ] +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Capabilities.onUnavailable", + "params": { + "capability": "xrn:firebolt:capability:token:platform", + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "capability": "xrn:firebolt:capability:token:platform", + "supported": true, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": ["unavailable"] + } +} +``` + +
+ +--- + +## Types + +### CapabilityOption + +```typescript +type CapabilityOption = { + role?: Role // Role provides access level for the app for a given capability. +} +``` + +See also: + +[Role](../Capabilities/schemas/#Role) + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Capabilities/schemas/index.md b/apis/pr-fix-ci-fb-version/core/Capabilities/schemas/index.md new file mode 100644 index 000000000..25916e83a --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Capabilities/schemas/index.md @@ -0,0 +1,121 @@ +--- +title: Capabilities + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Capabilities + +--- + +Version Capabilities 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [Role](#role) + - [DenyReason](#denyreason) + - [Capability](#capability) + - [CapPermissionStatus](#cappermissionstatus) + - [CapabilityInfo](#capabilityinfo) + - [Permission](#permission) + +## Overview + +undefined + +## Types + +### Role + +Role provides access level for the app for a given capability. + +```typescript +Role: { + USE: 'use', + MANAGE: 'manage', + PROVIDE: 'provide', +}, + +``` + +--- + +### DenyReason + +Reasons why a Capability might not be invokable + +```typescript +DenyReason: { + UNPERMITTED: 'unpermitted', + UNSUPPORTED: 'unsupported', + DISABLED: 'disabled', + UNAVAILABLE: 'unavailable', + GRANT_DENIED: 'grantDenied', + UNGRANTED: 'ungranted', +}, + +``` + +--- + +### Capability + +A Capability is a discrete unit of functionality that a Firebolt device might be able to perform. + +```typescript + +``` + +--- + +### CapPermissionStatus + +```typescript + +``` + +--- + +### CapabilityInfo + +```typescript +type CapabilityInfo = { + capability?: Capability // A Capability is a discrete unit of functionality that a Firebolt device might be able to perform. + supported: boolean // Provides info whether the capability is supported + available: boolean // Provides info whether the capability is available + use: object + manage: object + provide: object + details?: DenyReason[] // Reasons why a Capability might not be invokable +} +``` + +See also: + +[Capability](#capability) +[DenyReason](#denyreason) + +--- + +### Permission + +A capability combined with a Role, which an app may be permitted (by a distributor) or granted (by an end user). + +```typescript +type Permission = { + role?: Role // Role provides access level for the app for a given capability. + capability: Capability // A Capability is a discrete unit of functionality that a Firebolt device might be able to perform. +} +``` + +See also: + +[Role](#role) +[Capability](#capability) + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Device/index.md b/apis/pr-fix-ci-fb-version/core/Device/index.md new file mode 100644 index 000000000..9fd0e7730 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Device/index.md @@ -0,0 +1,2115 @@ +--- +title: Device + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Device Module + +--- + +Version Device 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [audio](#audio) + - [distributor](#distributor) + - [hdcp](#hdcp) + - [hdr](#hdr) + - [id](#id) + - [listen](#listen) + - [make](#make) + - [model](#model) + - [name](#name) + - [network](#network) + - [once](#once) + - [platform](#platform) + - [screenResolution](#screenresolution) + - [sku](#sku) + - [type](#type) + - [uid](#uid) + - [version](#version) + - [videoResolution](#videoresolution) +- [Events](#events) + - [audioChanged](#audiochanged) + - [deviceNameChanged](#devicenamechanged) + - [hdcpChanged](#hdcpchanged) + - [hdrChanged](#hdrchanged) + - [nameChanged](#namechanged) + - [networkChanged](#networkchanged) + - [screenResolutionChanged](#screenresolutionchanged) + - [videoResolutionChanged](#videoresolutionchanged) +- [Types](#types) + - [NetworkState](#networkstate) + - [NetworkType](#networktype) + - [HDRFormatMap](#hdrformatmap) + - [AudioProfiles](#audioprofiles) + - [Resolution](#resolution) + - [NetworkInfoResult](#networkinforesult) + - [DeviceVersion](#deviceversion) + - [HDCPVersionMap](#hdcpversionmap) + +## Usage + +To use the Device module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Device } from '@firebolt-js/sdk' +``` + +## Overview + +A module for querying about the device and it's capabilities. + +## Methods + +### audio + +Get the supported audio profiles for the connected devices. + +It is not recommended to use this API for visual badging on content within your app since this does not reflect the settings of the user. + +To get the value of `audio` call the method like this: + +```typescript +function audio(): Promise +``` + +Promise resolution: + +[AudioProfiles](#audioprofiles) + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:device:info | + +#### Examples + +Getting the supported audio profiles + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let supportedAudioProfiles = await Device.audio() +console.log(supportedAudioProfiles) +``` + +Value of `supportedAudioProfiles`: + +```javascript +{ + "stereo": true, + "dolbyDigital5.1": true, + "dolbyDigital5.1+": true, + "dolbyAtmos": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.audio", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "stereo": true, + "dolbyDigital5.1": true, + "dolbyDigital5.1+": true, + "dolbyAtmos": true + } +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function audio(callback: (value) => AudioProfiles): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Getting the supported audio profiles + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let listenerId = await audio((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `supportedAudioProfiles`: + +```javascript +{ + "stereo": true, + "dolbyDigital5.1": true, + "dolbyDigital5.1+": true, + "dolbyAtmos": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.onAudioChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "stereo": true, + "dolbyDigital5.1": true, + "dolbyDigital5.1+": true, + "dolbyAtmos": true + } +} +``` + +
+ +--- + +### distributor + +Get the name of the entity which is distributing the current device. There can be multiple distributors which distribute the same device model. + +To get the value of `distributor` call the method like this: + +```typescript +function distributor(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------ | +| uses | xrn:firebolt:capability:device:distributor | + +#### Examples + +Getting the distributor ID + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let distributorId = await Device.distributor() +console.log(distributorId) +``` + +Value of `distributorId`: + +```javascript +'Company' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.distributor", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Company" +} +``` + +
+ +--- + +### hdcp + +Get the negotiated HDCP profiles for a connected device. + +For devices that do not require additional connections (e.g. panels), `true` will be returned for all profiles. + +To get the value of `hdcp` call the method like this: + +```typescript +function hdcp(): Promise +``` + +Promise resolution: + +[HDCPVersionMap](#hdcpversionmap) + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:device:info | + +#### Examples + +Getting the negotiated HDCP versions + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let negotiatedHdcpVersions = await Device.hdcp() +console.log(negotiatedHdcpVersions) +``` + +Value of `negotiatedHdcpVersions`: + +```javascript +{ + "hdcp1.4": true, + "hdcp2.2": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.hdcp", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "hdcp1.4": true, + "hdcp2.2": true + } +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function hdcp(callback: (value) => HDCPVersionMap): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Getting the negotiated HDCP versions + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let listenerId = await hdcp((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `negotiatedHdcpVersions`: + +```javascript +{ + "hdcp1.4": true, + "hdcp2.2": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.onHdcpChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "hdcp1.4": true, + "hdcp2.2": true + } +} +``` + +
+ +--- + +### hdr + +Get the negotiated HDR formats for the connected display and device + +To get the value of `hdr` call the method like this: + +```typescript +function hdr(): Promise +``` + +Promise resolution: + +[HDRFormatMap](#hdrformatmap) + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:device:info | + +#### Examples + +Getting the negotiated HDR formats + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let negotiatedHdrFormats = await Device.hdr() +console.log(negotiatedHdrFormats) +``` + +Value of `negotiatedHdrFormats`: + +```javascript +{ + "hdr10": true, + "hdr10Plus": true, + "dolbyVision": true, + "hlg": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.hdr", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "hdr10": true, + "hdr10Plus": true, + "dolbyVision": true, + "hlg": true + } +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function hdr(callback: (value) => HDRFormatMap): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Getting the negotiated HDR formats + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let listenerId = await hdr((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `negotiatedHdrFormats`: + +```javascript +{ + "hdr10": true, + "hdr10Plus": true, + "dolbyVision": true, + "hlg": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.onHdrChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "hdr10": true, + "hdr10Plus": true, + "dolbyVision": true, + "hlg": true + } +} +``` + +
+ +--- + +### id + +Get the platform back-office device identifier + +To get the value of `id` call the method like this: + +```typescript +function id(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------- | +| uses | xrn:firebolt:capability:device:id | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let id = await Device.id() +console.log(id) +``` + +Value of `id`: + +```javascript +'123' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.id", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "123" +} +``` + +
+ +--- + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Device.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Device.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### make + +Get the manufacturer of the device model + +To get the value of `make` call the method like this: + +```typescript +function make(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:device:make | + +#### Examples + +Getting the device make + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let make = await Device.make() +console.log(make) +``` + +Value of `make`: + +```javascript +'Arris' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.make", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Arris" +} +``` + +
+ +--- + +### model + +Get the manufacturer designated model of the device + +To get the value of `model` call the method like this: + +```typescript +function model(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------ | +| uses | xrn:firebolt:capability:device:model | + +#### Examples + +Getting the device model + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let model = await Device.model() +console.log(model) +``` + +Value of `model`: + +```javascript +'xi6' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.model", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "xi6" +} +``` + +
+ +--- + +### name + +The human readable name of the device + +To get the value of `name` call the method like this: + +```typescript +function name(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:device:name | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let value = await Device.name() +console.log(value) +``` + +Value of `value`: + +```javascript +'Living Room' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.name", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Living Room" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let value = await Device.name() +console.log(value) +``` + +Value of `value`: + +```javascript +'Living Room' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.name", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Kitchen" +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function name(callback: (value) => string): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let listenerId = await name((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `value`: + +```javascript +'Living Room' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.onNameChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Living Room" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let listenerId = await name((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `value`: + +```javascript +'Living Room' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.onNameChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Kitchen" +} +``` + +
+ +--- + +### network + +Get the current network status and type + +To get the value of `network` call the method like this: + +```typescript +function network(): Promise +``` + +Promise resolution: + +[NetworkInfoResult](#networkinforesult) + +Capabilities: + +| Role | Capability | +| ---- | -------------------------------------- | +| uses | xrn:firebolt:capability:network:status | + +#### Examples + +Getting the network info + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let networkInfo = await Device.network() +console.log(networkInfo) +``` + +Value of `networkInfo`: + +```javascript +{ + "state": "connected", + "type": "wifi" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.network", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "state": "connected", + "type": "wifi" + } +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function network(callback: (value) => NetworkInfoResult): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Getting the network info + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let listenerId = await network((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `networkInfo`: + +```javascript +{ + "state": "connected", + "type": "wifi" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.onNetworkChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "state": "connected", + "type": "wifi" + } +} +``` + +
+ +--- + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Device.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Device.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### platform + +Get a platform identifier for the device. This API should be used to correlate metrics on the device only and cannot be guaranteed to have consistent responses across platforms. + +To get the value of `platform` call the method like this: + +```typescript +function platform(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:device:info | + +#### Examples + +Getting the platform ID + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let platformId = await Device.platform() +console.log(platformId) +``` + +Value of `platformId`: + +```javascript +'WPE' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.platform", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "WPE" +} +``` + +
+ +--- + +### screenResolution + +Get the resolution for the graphical surface of the app. + +The pairs returned will be of a [width, height] format and will correspond to the following values: + +NTSC Standard Definition (SD): [720, 480] + +PAL Standard Definition (SD): [720, 576] + +High Definition (HD): [1280, 720] + +Full HD (FHD): [1920, 1080] + +4K Ultra High Definition (UHD): [3840, 2160] + +**Deprecated:** Use non-Firebolt APIs specific to your platform, e.g. W3C APIs + +To get the value of `screenResolution` call the method like this: + +```typescript +function screenResolution(): Promise +``` + +Promise resolution: + +[Resolution](#resolution) + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:device:info | + +#### Examples + +Getting the screen resolution + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let screenResolution = await Device.screenResolution() +console.log(screenResolution) +``` + +Value of `screenResolution`: + +```javascript +;[1920, 1080] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.screenResolution", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [1920, 1080] +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function screenResolution(callback: (value) => Resolution): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Getting the screen resolution + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let listenerId = await screenResolution((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `screenResolution`: + +```javascript +;[1920, 1080] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.onScreenResolutionChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [1920, 1080] +} +``` + +
+ +--- + +### sku + +Get the device sku + +To get the value of `sku` call the method like this: + +```typescript +function sku(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------- | +| uses | xrn:firebolt:capability:device:sku | + +#### Examples + +Getting the device sku + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let sku = await Device.sku() +console.log(sku) +``` + +Value of `sku`: + +```javascript +'AX061AEI' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.sku", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "AX061AEI" +} +``` + +
+ +--- + +### type + +Get the device type + +To get the value of `type` call the method like this: + +```typescript +function type(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:device:info | + +#### Examples + +Getting the device type + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let deviceType = await Device.type() +console.log(deviceType) +``` + +Value of `deviceType`: + +```javascript +'STB' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.type", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "STB" +} +``` + +
+ +--- + +### uid + +Gets a unique id for the current app & device + +To get the value of `uid` call the method like this: + +```typescript +function uid(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------- | +| uses | xrn:firebolt:capability:device:uid | + +#### Examples + +Getting the unique ID + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let uniqueId = await Device.uid() +console.log(uniqueId) +``` + +Value of `uniqueId`: + +```javascript +'ee6723b8-7ab3-462c-8d93-dbf61227998e' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.uid", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "ee6723b8-7ab3-462c-8d93-dbf61227998e" +} +``` + +
+ +--- + +### version + +Get the SDK, OS and other version info + +To get the value of `version` call the method like this: + +```typescript +function version(): Promise +``` + +Promise resolution: + +[DeviceVersion](#deviceversion) + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:device:info | + +#### Examples + +Getting the os and sdk versions + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let versions = await Device.version() +console.log(versions) +``` + +Value of `versions`: + +```javascript +{ + "sdk": { + "major": 0, + "minor": 8, + "patch": 0, + "readable": "Firebolt JS SDK v0.8.0" + }, + "api": { + "major": 0, + "minor": 8, + "patch": 0, + "readable": "Firebolt API v0.8.0" + }, + "firmware": { + "major": 1, + "minor": 2, + "patch": 3, + "readable": "Device Firmware v1.2.3" + }, + "os": { + "major": 0, + "minor": 1, + "patch": 0, + "readable": "Firebolt OS v0.1.0" + }, + "debug": "Non-parsable build info for error logging only." +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.version", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "sdk": { + "major": 0, + "minor": 8, + "patch": 0, + "readable": "Firebolt JS SDK v0.8.0" + }, + "api": { + "major": 0, + "minor": 8, + "patch": 0, + "readable": "Firebolt API v0.8.0" + }, + "firmware": { + "major": 1, + "minor": 2, + "patch": 3, + "readable": "Device Firmware v1.2.3" + }, + "os": { + "major": 0, + "minor": 1, + "patch": 0, + "readable": "Firebolt OS v0.1.0" + }, + "debug": "Non-parsable build info for error logging only." + } +} +``` + +
+ +--- + +### videoResolution + +Get the maximum supported video resolution of the currently connected device and display. + +The pairs returned will be of a [width, height] format and will correspond to the following values: + +NTSC Standard Definition (SD): [720, 480] + +PAL Standard Definition (SD): [720, 576] + +High Definition (HD): [1280, 720] + +Full HD (FHD): [1920, 1080] + +4K Ultra High Definition (UHD): [3840, 2160] + +To get the value of `videoResolution` call the method like this: + +```typescript +function videoResolution(): Promise +``` + +Promise resolution: + +[Resolution](#resolution) + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:device:info | + +#### Examples + +Getting the video resolution + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let videoResolution = await Device.videoResolution() +console.log(videoResolution) +``` + +Value of `videoResolution`: + +```javascript +;[1920, 1080] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.videoResolution", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [1920, 1080] +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function videoResolution(callback: (value) => Resolution): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Getting the video resolution + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +let listenerId = await videoResolution((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `videoResolution`: + +```javascript +;[1920, 1080] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.onVideoResolutionChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [1920, 1080] +} +``` + +
+ +--- + +## Events + +### audioChanged + +See: [audio](#audio) + +### deviceNameChanged + +```typescript +function listen('deviceNameChanged', () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Event value: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:device:name | + +#### Examples + +Getting the device name + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/sdk' + +Device.listen('deviceNameChanged', (value) => { + console.log(value) +}) +``` + +Value of `value`: + +```javascript +'Living Room' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.onDeviceNameChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Living Room" +} +``` + +
+ +--- + +### hdcpChanged + +See: [hdcp](#hdcp) + +### hdrChanged + +See: [hdr](#hdr) + +### nameChanged + +See: [name](#name) + +### networkChanged + +See: [network](#network) + +### screenResolutionChanged + +See: [screenResolution](#screenresolution) + +### videoResolutionChanged + +See: [videoResolution](#videoresolution) + +## Types + +### NetworkState + +The type of network that is currently active + +```typescript +NetworkState: { + CONNECTED: 'connected', + DISCONNECTED: 'disconnected', +}, + +``` + +--- + +### NetworkType + +The type of network that is currently active + +```typescript +NetworkType: { + WIFI: 'wifi', + ETHERNET: 'ethernet', + HYBRID: 'hybrid', +}, + +``` + +--- + +### HDRFormatMap + +The type of HDR format + +```typescript +type HDRFormatMap = { + hdr10: boolean + hdr10Plus: boolean + dolbyVision: boolean + hlg: boolean +} +``` + +--- + +### AudioProfiles + +```typescript +type AudioProfiles = { + stereo: boolean + dolbyDigital5_1: boolean + dolbyDigital5_1_plus: boolean + dolbyAtmos: boolean +} +``` + +--- + +### Resolution + +```typescript +type Resolution = + | [ + 720, // undefined Width in pixels item + 480, // undefined Height in pixels item + ] + | [ + 720, // undefined Width in pixels item + 576, // undefined Height in pixels item + ] + | [ + 1280, // undefined Width in pixels item + 720, // undefined Height in pixels item + ] + | [ + 1920, // undefined Width in pixels item + 1080, // undefined Height in pixels item + ] + | [ + 3840, // undefined Width in pixels item + 2160, // undefined Height in pixels item + ] +``` + +--- + +### NetworkInfoResult + +```typescript +type NetworkInfoResult = { + state: NetworkState // The type of network that is currently active + type: NetworkType // The type of network that is currently active +} +``` + +See also: + +[NetworkState](#networkstate) +[NetworkType](#networktype) + +--- + +### DeviceVersion + +```typescript +type DeviceVersion = { + sdk?: SemanticVersion // The Firebolt SDK version + api: SemanticVersion // The latest Firebolt API version supported by the current device. + firmware: SemanticVersion // The firmware version as reported by the device + os: SemanticVersion // **Deprecated** Use `firmware`, instead. + debug?: string // Detailed version as a string, for debugging purposes +} +``` + +See also: + +[SemanticVersion](../Types/schemas/#SemanticVersion) + +--- + +### HDCPVersionMap + +The type of HDCP versions + +```typescript +type HDCPVersionMap = { + hdcp1_4: boolean + hdcp2_2: boolean +} +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Discovery/index.md b/apis/pr-fix-ci-fb-version/core/Discovery/index.md new file mode 100644 index 000000000..71aad423c --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Discovery/index.md @@ -0,0 +1,4222 @@ +--- +title: Discovery + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Discovery Module + +--- + +Version Discovery 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) + - [Localization](#localization) +- [Methods](#methods) + - [clearContentAccess](#clearcontentaccess) + - [contentAccess](#contentaccess) + - [entitlements](#entitlements) + - [entityInfo](#entityinfo) + - [launch](#launch) + - [listen](#listen) + - [once](#once) + - [policy](#policy) + - [provide](#provide) + - [purchasedContent](#purchasedcontent) + - [signIn](#signin) + - [signOut](#signout) + - [userInterest](#userinterest) + - [userInterestError](#userinteresterror) + - [userInterestResponse](#userinterestresponse) + - [watched](#watched) + - [watchNext](#watchnext) +- [Events](#events) + - [navigateTo](#navigateto) + - [policyChanged](#policychanged) + - [onRequestUserInterest](#onrequestuserinterest) +- [Provider Interfaces](#provider-interfaces) + - [UserInterestProvider](#userinterestprovider) +- [Types](#types) + - [DiscoveryPolicy](#discoverypolicy) + - [Availability](#availability) + - [UserInterestProviderParameters](#userinterestproviderparameters) + - [PurchasedContentParameters](#purchasedcontentparameters) + - [ContentAccessIdentifiers](#contentaccessidentifiers) + - [EntityInfoParameters](#entityinfoparameters) + - [EntityInfoFederatedRequest](#entityinfofederatedrequest) + - [PurchasedContentFederatedRequest](#purchasedcontentfederatedrequest) + +## Usage + +To use the Discovery module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Discovery } from '@firebolt-js/sdk' +``` + +## Overview + +Your App likely wants to integrate with the Platform's discovery capabilities. For example to add a "Watch Next" tile that links to your app from the platform's home screen. + +Getting access to this information requires to connect to lower level APIs made available by the platform. Since implementations differ between operators and platforms, the Firebolt SDK offers a Discovery module, that exposes a generic, agnostic interface to the developer. + +Under the hood, an underlaying transport layer will then take care of calling the right APIs for the actual platform implementation that your App is running on. + +The Discovery plugin is used to _send_ information to the Platform. + +### Localization + +Apps should provide all user-facing strings in the device's language, as specified by the Firebolt `Localization.language` property. + +Apps should provide prices in the same currency presented in the app. If multiple currencies are supported in the app, the app should provide prices in the user's current default currency. + +## Methods + +### clearContentAccess + +Clear both availabilities and entitlements from the subscriber. This is equivalent of calling `Discovery.contentAccess({ availabilities: [], entitlements: []})`. This is typically called when the user signs out of an account. + +```typescript +function clearContentAccess(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------------ | +| uses | xrn:firebolt:capability:discovery:content-access | + +#### Examples + +Clear subscriber's availabilities and entitlements + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let result = await Discovery.clearContentAccess() +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.clearContentAccess", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### contentAccess + +Inform the platform of what content the user can access either by discovering it or consuming it. Availabilities determine which content is discoverable to a user, while entitlements determine if the user can currently consume that content. Content can be available but not entitled, this means that user can see the content but when they try to open it they must gain an entitlement either through purchase or subscription upgrade. In case the access changed off-device, this API should be called any time the app comes to the foreground to refresh the access. This API should also be called any time the availabilities or entitlements change within the app for any reason. Typical reasons may include the user signing into an account or upgrading a subscription. Less common cases can cause availabilities to change, such as moving to a new service location. When availabilities or entitlements are removed from the subscriber (such as when the user signs out), then an empty array should be given. To clear both, use the Discovery.clearContentAccess convenience API. + +```typescript +function contentAccess(ids: ContentAccessIdentifiers): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ----- | ------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------- | +| `ids` | [`ContentAccessIdentifiers`](#contentaccessidentifiers) | true | A list of identifiers that represent content that is discoverable or consumable for the subscriber | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------------ | +| uses | xrn:firebolt:capability:discovery:content-access | + +#### Examples + +Update subscriber's availabilities + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let result = await Discovery.contentAccess({ + availabilities: [ + { + type: 'channel-lineup', + id: 'partner.com/availability/123', + startTime: '2021-04-23T18:25:43.511Z', + endTime: '2021-04-23T18:25:43.511Z', + }, + { + type: 'channel-lineup', + id: 'partner.com/availability/456', + startTime: '2021-04-23T18:25:43.511Z', + endTime: '2021-04-23T18:25:43.511Z', + }, + ], +}) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.contentAccess", + "params": { + "ids": { + "availabilities": [ + { + "type": "channel-lineup", + "id": "partner.com/availability/123", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + }, + { + "type": "channel-lineup", + "id": "partner.com/availability/456", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + } + ] + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Update subscriber's availabilities and entitlements + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let result = await Discovery.contentAccess({ + availabilities: [ + { + type: 'channel-lineup', + id: 'partner.com/availability/123', + startTime: '2021-04-23T18:25:43.511Z', + endTime: '2021-04-23T18:25:43.511Z', + }, + { + type: 'channel-lineup', + id: 'partner.com/availability/456', + startTime: '2021-04-23T18:25:43.511Z', + endTime: '2021-04-23T18:25:43.511Z', + }, + ], + entitlements: [ + { + entitlementId: '123', + startTime: '2025-01-01T00:00:00.000Z', + endTime: '2025-01-01T00:00:00.000Z', + }, + ], +}) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.contentAccess", + "params": { + "ids": { + "availabilities": [ + { + "type": "channel-lineup", + "id": "partner.com/availability/123", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + }, + { + "type": "channel-lineup", + "id": "partner.com/availability/456", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + } + ], + "entitlements": [ + { + "entitlementId": "123", + "startTime": "2025-01-01T00:00:00.000Z", + "endTime": "2025-01-01T00:00:00.000Z" + } + ] + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Update subscriber's entitlements + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let result = await Discovery.contentAccess({ + entitlements: [ + { + entitlementId: '123', + startTime: '2025-01-01T00:00:00.000Z', + endTime: '2025-01-01T00:00:00.000Z', + }, + ], +}) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.contentAccess", + "params": { + "ids": { + "entitlements": [ + { + "entitlementId": "123", + "startTime": "2025-01-01T00:00:00.000Z", + "endTime": "2025-01-01T00:00:00.000Z" + } + ] + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Clear a subscriber's entitlements + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let result = await Discovery.contentAccess({ entitlements: [] }) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.contentAccess", + "params": { + "ids": { + "entitlements": [] + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Clear a subscriber's availabilities + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let result = await Discovery.contentAccess({ availabilities: [] }) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.contentAccess", + "params": { + "ids": { + "availabilities": [] + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### entitlements + +Inform the platform of the users latest entitlements w/in this app. + +```typescript +function entitlements(entitlements: Entitlement[]): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| -------------- | --------------- | -------- | ---------------------------- | +| `entitlements` | `Entitlement[]` | true | Array of entitlement objects | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------------ | +| uses | xrn:firebolt:capability:discovery:content-access | + +#### Examples + +Update user's entitlements + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.entitlements([ + { + entitlementId: 'partner.com/entitlement/123', + startTime: '2021-04-23T18:25:43.511Z', + endTime: '2021-04-23T18:25:43.511Z', + }, + { + entitlementId: 'partner.com/entitlement/456', + startTime: '2021-04-23T18:25:43.511Z', + endTime: '2021-04-23T18:25:43.511Z', + }, +]) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.entitlements", + "params": { + "entitlements": [ + { + "entitlementId": "partner.com/entitlement/123", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + }, + { + "entitlementId": "partner.com/entitlement/456", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + } + ] + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### entityInfo + +Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow. Includes information about the program entity and its relevant associated entities, such as extras, previews, and, in the case of TV series, seasons and episodes. + +See the `EntityInfo` and `WayToWatch` data structures below for more information. + +The app only needs to implement Pull support for `entityInfo` at this time. + +To allow the platform to pull data, use `entityInfo(callback: Function)`: + +```typescript +function entityInfo( + callback: (parameters: EntityInfoParameters) => Promise, +): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------ | +| `callback` | `Function` | Yes | A callback for the platform to pull EntityInfoResult objects | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------------ | ---------------------- | -------- | --------------------------------------------------------------------------- | +| `parameters` | `EntityInfoParameters` | Yes | An object describing the platform's query for an `EntityInfoResult` object. | + +```typescript +type EntityInfoParameters = { + entityId: string + assetId?: string +} +``` + +Callback promise resolution: + +```typescript +type EntityInfoResult = { + expires: string + entity: EntityInfo // An EntityInfo object represents an "entity" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type. + related?: EntityInfo[] +} +``` + +See also: [EntityInfoResult](#entityinforesult-1) + +#### Examples + +Send entity info for a movie to the platform. + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.entityInfo(async (parameters) => { + console.log(parameters.entityId) + console.log(parameters.assetId) + return { + expires: '2025-01-01T00:00:00.000Z', + entity: { + identifiers: { + entityId: '345', + }, + entityType: 'program', + programType: 'movie', + title: 'Cool Runnings', + synopsis: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.', + releaseDate: '1993-01-01T00:00:00.000Z', + contentRatings: [ + { + scheme: 'US-Movie', + rating: 'PG', + }, + { + scheme: 'CA-Movie', + rating: 'G', + }, + ], + waysToWatch: [ + { + identifiers: { + assetId: '123', + }, + expires: '2025-01-01T00:00:00.000Z', + entitled: true, + entitledExpires: '2025-01-01T00:00:00.000Z', + offeringType: 'buy', + price: 2.99, + videoQuality: ['UHD'], + audioProfile: ['dolbyAtmos'], + audioLanguages: ['en'], + closedCaptions: ['en'], + subtitles: ['es'], + audioDescriptions: ['en'], + }, + ], + }, + } +}) +console.log(success) +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.onPullEntityInfo", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "correlationId": "xyz", + "parameters": { + "entityId": "345" + } + } +} +``` + +Push Request: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "method": "Discovery.entityInfo", + "params": { + "correlationId": "TBD", + "result": { + "expires": "2025-01-01T00:00:00.000Z", + "entity": { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": ["UHD"], + "audioProfile": ["dolbyAtmos"], + "audioLanguages": ["en"], + "closedCaptions": ["en"], + "subtitles": ["es"], + "audioDescriptions": ["en"] + } + ] + } + } + } +} +``` + +
+ +Send entity info for a movie with a trailer to the platform. + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.entityInfo(async (parameters) => { + console.log(parameters.entityId) + console.log(parameters.assetId) + return { + expires: '2025-01-01T00:00:00.000Z', + entity: { + identifiers: { + entityId: '345', + }, + entityType: 'program', + programType: 'movie', + title: 'Cool Runnings', + synopsis: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.', + releaseDate: '1993-01-01T00:00:00.000Z', + contentRatings: [ + { + scheme: 'US-Movie', + rating: 'PG', + }, + { + scheme: 'CA-Movie', + rating: 'G', + }, + ], + waysToWatch: [ + { + identifiers: { + assetId: '123', + }, + expires: '2025-01-01T00:00:00.000Z', + entitled: true, + entitledExpires: '2025-01-01T00:00:00.000Z', + offeringType: 'buy', + price: 2.99, + videoQuality: ['UHD'], + audioProfile: ['dolbyAtmos'], + audioLanguages: ['en'], + closedCaptions: ['en'], + subtitles: ['es'], + audioDescriptions: ['en'], + }, + ], + }, + related: [ + { + identifiers: { + entityId: '345', + }, + entityType: 'program', + programType: 'preview', + title: 'Cool Runnings Trailer', + waysToWatch: [ + { + identifiers: { + assetId: '123111', + entityId: '345', + }, + entitled: true, + videoQuality: ['HD'], + audioProfile: ['dolbyAtmos'], + audioLanguages: ['en'], + closedCaptions: ['en'], + }, + ], + }, + ], + } +}) +console.log(success) +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.onPullEntityInfo", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "correlationId": "xyz", + "parameters": { + "entityId": "345" + } + } +} +``` + +Push Request: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "method": "Discovery.entityInfo", + "params": { + "correlationId": "TBD", + "result": { + "expires": "2025-01-01T00:00:00.000Z", + "entity": { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": ["UHD"], + "audioProfile": ["dolbyAtmos"], + "audioLanguages": ["en"], + "closedCaptions": ["en"], + "subtitles": ["es"], + "audioDescriptions": ["en"] + } + ] + }, + "related": [ + { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "preview", + "title": "Cool Runnings Trailer", + "waysToWatch": [ + { + "identifiers": { + "assetId": "123111", + "entityId": "345" + }, + "entitled": true, + "videoQuality": ["HD"], + "audioProfile": ["dolbyAtmos"], + "audioLanguages": ["en"], + "closedCaptions": ["en"] + } + ] + } + ] + } + } +} +``` + +
+ +Send entity info for a TV Series with seasons and episodes to the platform. + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.entityInfo(async (parameters) => { + console.log(parameters.entityId) + console.log(parameters.assetId) + return { + expires: '2025-01-01T00:00:00.000Z', + entity: { + identifiers: { + entityId: '98765', + }, + entityType: 'program', + programType: 'series', + title: 'Perfect Strangers', + synopsis: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.', + releaseDate: '1986-01-01T00:00:00.000Z', + contentRatings: [ + { + scheme: 'US-TV', + rating: 'TV-PG', + }, + ], + }, + related: [ + { + identifiers: { + entityId: '111', + seriesId: '98765', + }, + entityType: 'program', + programType: 'season', + seasonNumber: 1, + title: 'Perfect Strangers Season 3', + contentRatings: [ + { + scheme: 'US-TV', + rating: 'TV-PG', + }, + ], + waysToWatch: [ + { + identifiers: { + assetId: '556', + entityId: '111', + seriesId: '98765', + }, + entitled: true, + offeringType: 'free', + videoQuality: ['SD'], + audioProfile: ['stereo'], + audioLanguages: ['en'], + closedCaptions: ['en'], + }, + ], + }, + { + identifiers: { + entityId: '111', + seriesId: '98765', + }, + entityType: 'program', + programType: 'episode', + seasonNumber: 1, + episodeNumber: 1, + title: "Knock Knock, Who's There?", + synopsis: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.', + releaseDate: '1986-03-25T00:00:00.000Z', + contentRatings: [ + { + scheme: 'US-TV', + rating: 'TV-PG', + }, + ], + waysToWatch: [ + { + identifiers: { + assetId: '556', + entityId: '111', + seriesId: '98765', + }, + entitled: true, + offeringType: 'free', + videoQuality: ['SD'], + audioProfile: ['stereo'], + audioLanguages: ['en'], + closedCaptions: ['en'], + }, + ], + }, + { + identifiers: { + entityId: '112', + seriesId: '98765', + }, + entityType: 'program', + programType: 'episode', + seasonNumber: 1, + episodeNumber: 2, + title: 'Picture This', + synopsis: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.', + releaseDate: '1986-04-01T00:00:00.000Z', + contentRatings: [ + { + scheme: 'US-TV', + rating: 'TV-PG', + }, + ], + waysToWatch: [ + { + identifiers: { + assetId: '557', + entityId: '112', + seriesId: '98765', + }, + entitled: true, + offeringType: 'free', + videoQuality: ['SD'], + audioProfile: ['stereo'], + audioLanguages: ['en'], + closedCaptions: ['en'], + }, + ], + }, + ], + } +}) +console.log(success) +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.onPullEntityInfo", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "correlationId": "xyz", + "parameters": { + "entityId": "345" + } + } +} +``` + +Push Request: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "method": "Discovery.entityInfo", + "params": { + "correlationId": "TBD", + "result": { + "expires": "2025-01-01T00:00:00.000Z", + "entity": { + "identifiers": { + "entityId": "98765" + }, + "entityType": "program", + "programType": "series", + "title": "Perfect Strangers", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1986-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ] + }, + "related": [ + { + "identifiers": { + "entityId": "111", + "seriesId": "98765" + }, + "entityType": "program", + "programType": "season", + "seasonNumber": 1, + "title": "Perfect Strangers Season 3", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "556", + "entityId": "111", + "seriesId": "98765" + }, + "entitled": true, + "offeringType": "free", + "videoQuality": ["SD"], + "audioProfile": ["stereo"], + "audioLanguages": ["en"], + "closedCaptions": ["en"] + } + ] + }, + { + "identifiers": { + "entityId": "111", + "seriesId": "98765" + }, + "entityType": "program", + "programType": "episode", + "seasonNumber": 1, + "episodeNumber": 1, + "title": "Knock Knock, Who's There?", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1986-03-25T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "556", + "entityId": "111", + "seriesId": "98765" + }, + "entitled": true, + "offeringType": "free", + "videoQuality": ["SD"], + "audioProfile": ["stereo"], + "audioLanguages": ["en"], + "closedCaptions": ["en"] + } + ] + }, + { + "identifiers": { + "entityId": "112", + "seriesId": "98765" + }, + "entityType": "program", + "programType": "episode", + "seasonNumber": 1, + "episodeNumber": 2, + "title": "Picture This", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1986-04-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "557", + "entityId": "112", + "seriesId": "98765" + }, + "entitled": true, + "offeringType": "free", + "videoQuality": ["SD"], + "audioProfile": ["stereo"], + "audioLanguages": ["en"], + "closedCaptions": ["en"] + } + ] + } + ] + } + } +} +``` + +
+ +To push data to the platform, e.g. during app launch, use `entityInfo(result: EntityInfoResult)`: + +```typescript +function entityInfo(result: EntityInfoResult): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| -------- | ------------------ | -------- | --------------------------------------------------- | +| `result` | `EntityInfoResult` | Yes | The `EntityInfoResult` data to push to the platform | + +```typescript +type EntityInfoResult = { + expires: string + entity: EntityInfo // An EntityInfo object represents an "entity" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type. + related?: EntityInfo[] +} +``` + +See also: [EntityInfo](#entityinfo-1) + +Promise resolution: + +| Type | Summary | +| --------- | -------------------------------------- | +| `boolean` | Whether or not the push was successful | + +#### Examples + +Send entity info for a movie to the platform. + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.entityInfo({ + expires: '2025-01-01T00:00:00.000Z', + entity: { + identifiers: { + entityId: '345', + }, + entityType: 'program', + programType: 'movie', + title: 'Cool Runnings', + synopsis: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.', + releaseDate: '1993-01-01T00:00:00.000Z', + contentRatings: [ + { + scheme: 'US-Movie', + rating: 'PG', + }, + { + scheme: 'CA-Movie', + rating: 'G', + }, + ], + waysToWatch: [ + { + identifiers: { + assetId: '123', + }, + expires: '2025-01-01T00:00:00.000Z', + entitled: true, + entitledExpires: '2025-01-01T00:00:00.000Z', + offeringType: 'buy', + price: 2.99, + videoQuality: ['UHD'], + audioProfile: ['dolbyAtmos'], + audioLanguages: ['en'], + closedCaptions: ['en'], + subtitles: ['es'], + audioDescriptions: ['en'], + }, + ], + }, +}) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.entityInfo", + "params": { + "correlationId": null, + "result": { + "expires": "2025-01-01T00:00:00.000Z", + "entity": { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": ["UHD"], + "audioProfile": ["dolbyAtmos"], + "audioLanguages": ["en"], + "closedCaptions": ["en"], + "subtitles": ["es"], + "audioDescriptions": ["en"] + } + ] + } + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Send entity info for a movie with a trailer to the platform. + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.entityInfo({ + expires: '2025-01-01T00:00:00.000Z', + entity: { + identifiers: { + entityId: '345', + }, + entityType: 'program', + programType: 'movie', + title: 'Cool Runnings', + synopsis: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.', + releaseDate: '1993-01-01T00:00:00.000Z', + contentRatings: [ + { + scheme: 'US-Movie', + rating: 'PG', + }, + { + scheme: 'CA-Movie', + rating: 'G', + }, + ], + waysToWatch: [ + { + identifiers: { + assetId: '123', + }, + expires: '2025-01-01T00:00:00.000Z', + entitled: true, + entitledExpires: '2025-01-01T00:00:00.000Z', + offeringType: 'buy', + price: 2.99, + videoQuality: ['UHD'], + audioProfile: ['dolbyAtmos'], + audioLanguages: ['en'], + closedCaptions: ['en'], + subtitles: ['es'], + audioDescriptions: ['en'], + }, + ], + }, + related: [ + { + identifiers: { + entityId: '345', + }, + entityType: 'program', + programType: 'preview', + title: 'Cool Runnings Trailer', + waysToWatch: [ + { + identifiers: { + assetId: '123111', + entityId: '345', + }, + entitled: true, + videoQuality: ['HD'], + audioProfile: ['dolbyAtmos'], + audioLanguages: ['en'], + closedCaptions: ['en'], + }, + ], + }, + ], +}) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.entityInfo", + "params": { + "correlationId": null, + "result": { + "expires": "2025-01-01T00:00:00.000Z", + "entity": { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": ["UHD"], + "audioProfile": ["dolbyAtmos"], + "audioLanguages": ["en"], + "closedCaptions": ["en"], + "subtitles": ["es"], + "audioDescriptions": ["en"] + } + ] + }, + "related": [ + { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "preview", + "title": "Cool Runnings Trailer", + "waysToWatch": [ + { + "identifiers": { + "assetId": "123111", + "entityId": "345" + }, + "entitled": true, + "videoQuality": ["HD"], + "audioProfile": ["dolbyAtmos"], + "audioLanguages": ["en"], + "closedCaptions": ["en"] + } + ] + } + ] + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Send entity info for a TV Series with seasons and episodes to the platform. + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.entityInfo({ + expires: '2025-01-01T00:00:00.000Z', + entity: { + identifiers: { + entityId: '98765', + }, + entityType: 'program', + programType: 'series', + title: 'Perfect Strangers', + synopsis: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.', + releaseDate: '1986-01-01T00:00:00.000Z', + contentRatings: [ + { + scheme: 'US-TV', + rating: 'TV-PG', + }, + ], + }, + related: [ + { + identifiers: { + entityId: '111', + seriesId: '98765', + }, + entityType: 'program', + programType: 'season', + seasonNumber: 1, + title: 'Perfect Strangers Season 3', + contentRatings: [ + { + scheme: 'US-TV', + rating: 'TV-PG', + }, + ], + waysToWatch: [ + { + identifiers: { + assetId: '556', + entityId: '111', + seriesId: '98765', + }, + entitled: true, + offeringType: 'free', + videoQuality: ['SD'], + audioProfile: ['stereo'], + audioLanguages: ['en'], + closedCaptions: ['en'], + }, + ], + }, + { + identifiers: { + entityId: '111', + seriesId: '98765', + }, + entityType: 'program', + programType: 'episode', + seasonNumber: 1, + episodeNumber: 1, + title: "Knock Knock, Who's There?", + synopsis: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.', + releaseDate: '1986-03-25T00:00:00.000Z', + contentRatings: [ + { + scheme: 'US-TV', + rating: 'TV-PG', + }, + ], + waysToWatch: [ + { + identifiers: { + assetId: '556', + entityId: '111', + seriesId: '98765', + }, + entitled: true, + offeringType: 'free', + videoQuality: ['SD'], + audioProfile: ['stereo'], + audioLanguages: ['en'], + closedCaptions: ['en'], + }, + ], + }, + { + identifiers: { + entityId: '112', + seriesId: '98765', + }, + entityType: 'program', + programType: 'episode', + seasonNumber: 1, + episodeNumber: 2, + title: 'Picture This', + synopsis: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.', + releaseDate: '1986-04-01T00:00:00.000Z', + contentRatings: [ + { + scheme: 'US-TV', + rating: 'TV-PG', + }, + ], + waysToWatch: [ + { + identifiers: { + assetId: '557', + entityId: '112', + seriesId: '98765', + }, + entitled: true, + offeringType: 'free', + videoQuality: ['SD'], + audioProfile: ['stereo'], + audioLanguages: ['en'], + closedCaptions: ['en'], + }, + ], + }, + ], +}) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.entityInfo", + "params": { + "correlationId": null, + "result": { + "expires": "2025-01-01T00:00:00.000Z", + "entity": { + "identifiers": { + "entityId": "98765" + }, + "entityType": "program", + "programType": "series", + "title": "Perfect Strangers", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1986-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ] + }, + "related": [ + { + "identifiers": { + "entityId": "111", + "seriesId": "98765" + }, + "entityType": "program", + "programType": "season", + "seasonNumber": 1, + "title": "Perfect Strangers Season 3", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "556", + "entityId": "111", + "seriesId": "98765" + }, + "entitled": true, + "offeringType": "free", + "videoQuality": ["SD"], + "audioProfile": ["stereo"], + "audioLanguages": ["en"], + "closedCaptions": ["en"] + } + ] + }, + { + "identifiers": { + "entityId": "111", + "seriesId": "98765" + }, + "entityType": "program", + "programType": "episode", + "seasonNumber": 1, + "episodeNumber": 1, + "title": "Knock Knock, Who's There?", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1986-03-25T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "556", + "entityId": "111", + "seriesId": "98765" + }, + "entitled": true, + "offeringType": "free", + "videoQuality": ["SD"], + "audioProfile": ["stereo"], + "audioLanguages": ["en"], + "closedCaptions": ["en"] + } + ] + }, + { + "identifiers": { + "entityId": "112", + "seriesId": "98765" + }, + "entityType": "program", + "programType": "episode", + "seasonNumber": 1, + "episodeNumber": 2, + "title": "Picture This", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1986-04-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "557", + "entityId": "112", + "seriesId": "98765" + }, + "entitled": true, + "offeringType": "free", + "videoQuality": ["SD"], + "audioProfile": ["stereo"], + "audioLanguages": ["en"], + "closedCaptions": ["en"] + } + ] + } + ] + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### launch + +Launch or foreground the specified app, and optionally instructs it to navigate to the specified user action. +For the Primary Experience, the appId can be any one of: + +- xrn:firebolt:application-type:main + +- xrn:firebolt:application-type:settings + +```typescript +function launch(appId: string, intent: NavigationIntent): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| -------- | ---------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------- | +| `appId` | `string` | true | The durable app Id of the app to launch | +| `intent` | [`NavigationIntent`](../Intents/schemas/#NavigationIntent) | false | An optional `NavigationIntent` with details about what part of the app to show first, and context around how/why it was launched | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------- | +| uses | xrn:firebolt:capability:lifecycle:launch | + +#### Examples + +Launch the 'Foo' app to it's home screen. + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.launch('foo', { + action: 'home', + context: { source: 'voice' }, +}) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.launch", + "params": { + "appId": "foo", + "intent": { + "action": "home", + "context": { + "source": "voice" + } + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Launch the 'Foo' app to it's own page for a specific entity. + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.launch('foo', { + action: 'entity', + data: { + entityType: 'program', + programType: 'movie', + entityId: 'example-movie-id', + }, + context: { + source: 'voice', + }, +}) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.launch", + "params": { + "appId": "foo", + "intent": { + "action": "entity", + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "example-movie-id" + }, + "context": { + "source": "voice" + } + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Launch the 'Foo' app to a fullscreen playback experience for a specific entity. + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.launch('foo', { + action: 'playback', + data: { + entityType: 'program', + programType: 'movie', + entityId: 'example-movie-id', + }, + context: { + source: 'voice', + }, +}) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.launch", + "params": { + "appId": "foo", + "intent": { + "action": "playback", + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "example-movie-id" + }, + "context": { + "source": "voice" + } + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Launch the Aggregated Experience to a global page for a specific entity. + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.launch('xrn:firebolt:application-type:main', { + action: 'entity', + data: { + entityType: 'program', + programType: 'movie', + entityId: 'example-movie-id', + }, + context: { + source: 'voice', + }, +}) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.launch", + "params": { + "appId": "xrn:firebolt:application-type:main", + "intent": { + "action": "entity", + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "example-movie-id" + }, + "context": { + "source": "voice" + } + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Launch the Aggregated Experience to a global page for the company / partner with the ID 'foo'. + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.launch('xrn:firebolt:application-type:main', { + action: 'section', + data: { + sectionName: 'company:foo', + }, + context: { + source: 'voice', + }, +}) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.launch", + "params": { + "appId": "xrn:firebolt:application-type:main", + "intent": { + "action": "section", + "data": { + "sectionName": "company:foo" + }, + "context": { + "source": "voice" + } + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Launch the Aggregated Experience to it's home screen, as if the Home remote button was pressed. + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.launch('xrn:firebolt:application-type:main', { + action: 'home', + context: { + source: 'voice', + }, +}) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.launch", + "params": { + "appId": "xrn:firebolt:application-type:main", + "intent": { + "action": "home", + "context": { + "source": "voice" + } + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Launch the Aggregated Experience to it's search screen. + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.launch('xrn:firebolt:application-type:main', { + action: 'search', + context: { + source: 'voice', + }, +}) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.launch", + "params": { + "appId": "xrn:firebolt:application-type:main", + "intent": { + "action": "search", + "context": { + "source": "voice" + } + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Launch the Aggregated Experience to it's settings screen. + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.launch('xrn:firebolt:application-type:settings', { + action: 'section', + data: { + sectionName: 'settings', + }, + context: { + source: 'voice', + }, +}) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.launch", + "params": { + "appId": "xrn:firebolt:application-type:settings", + "intent": { + "action": "section", + "data": { + "sectionName": "settings" + }, + "context": { + "source": "voice" + } + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Launch the Aggregated Experience to it's linear/epg guide. + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.launch('xrn:firebolt:application-type:main', { + action: 'section', + data: { + sectionName: 'guide', + }, + context: { + source: 'voice', + }, +}) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.launch", + "params": { + "appId": "xrn:firebolt:application-type:main", + "intent": { + "action": "section", + "data": { + "sectionName": "guide" + }, + "context": { + "source": "voice" + } + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Launch the Aggregated Experience to the App Store details page for a specific app with the ID 'foo'. + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.launch('xrn:firebolt:application-type:main ', { + action: 'section', + data: { + sectionName: 'app:foo', + }, + context: { + source: 'voice', + }, +}) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.launch", + "params": { + "appId": "xrn:firebolt:application-type:main ", + "intent": { + "action": "section", + "data": { + "sectionName": "app:foo" + }, + "context": { + "source": "voice" + } + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Discovery.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Discovery.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Discovery.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Discovery.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### policy + +get the discovery policy + +To get the value of `policy` call the method like this: + +```typescript +function policy(): Promise +``` + +Promise resolution: + +[DiscoveryPolicy](#discoverypolicy) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------- | +| uses | xrn:firebolt:capability:discovery:policy | + +#### Examples + +Getting the discovery policy + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let policy = await Discovery.policy() +console.log(policy) +``` + +Value of `policy`: + +```javascript +{ + "enableRecommendations": true, + "shareWatchHistory": true, + "rememberWatchedPrograms": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.policy", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "enableRecommendations": true, + "shareWatchHistory": true, + "rememberWatchedPrograms": true + } +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function policy(callback: (value) => DiscoveryPolicy): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Getting the discovery policy + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let listenerId = await policy((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `policy`: + +```javascript +{ + "enableRecommendations": true, + "shareWatchHistory": true, + "rememberWatchedPrograms": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.onPolicyChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "enableRecommendations": true, + "shareWatchHistory": true, + "rememberWatchedPrograms": true + } +} +``` + +
+ +--- + +### provide + +To provide a specific capability to the platform. See [Provider Interfaces](#provider-interfaces) for a list of interfaces available to provide in this module. + +```typescript +provide(capability: string, provider: any): void +``` + +Parameters: + +| Param | Type | Required | Summary | +| ------------ | -------- | -------- | -------------------------------------------- | +| `capability` | `string` | Yes | The capability that is being provided. | +| `provider` | `any` | Yes | An implementation of the required interface. | + +See [Provider Interfaces](#provider-interfaces) for each capabilities interface definition. + +### purchasedContent + +Return content purchased by the user, such as rentals and electronic sell through purchases. + +The app should return the user's 100 most recent purchases in `entries`. The total count of purchases must be provided in `count`. If `count` is greater than the total number of `entries`, the UI may provide a link into the app to see the complete purchase list. + +The `EntityInfo` object returned is not required to have `waysToWatch` populated, but it is recommended that it do so in case the UI wants to surface additional information on the purchases screen. + +The app should implement both Push and Pull methods for `purchasedContent`. + +The app should actively push `purchasedContent` when: + +- The app becomes Active. +- When the state of the purchasedContent set has changed. +- The app goes into Inactive or Background state, if there is a chance a change event has been missed. + +To allow the platform to pull data, use `purchasedContent(callback: Function)`: + +```typescript +function purchasedContent( + callback: ( + parameters: PurchasedContentParameters, + ) => Promise, +): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------ | +| `callback` | `Function` | Yes | A callback for the platform to pull PurchasedContentResult objects | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------------ | ---------------------------- | -------- | --------------------------------------------------------------------------------- | +| `parameters` | `PurchasedContentParameters` | Yes | An object describing the platform's query for an `PurchasedContentResult` object. | + +```typescript +type PurchasedContentParameters = { + limit: number + offeringType?: OfferingType // The offering type of the WayToWatch. + programType?: ProgramType // In the case of a program `entityType`, specifies the program type. +} +``` + +Callback promise resolution: + +```typescript +type PurchasedContentResult = { + expires: string + totalCount: number + entries: EntityInfo[] +} +``` + +See also: [PurchasedContentResult](#purchasedcontentresult-1) + +#### Examples + +Inform the platform of the user's purchased content + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.purchasedContent(async (parameters) => { + console.log(parameters.entityId) + console.log(parameters.assetId) + return { + totalCount: 10, + expires: '2025-01-01T00:00:00.000Z', + entries: [ + { + identifiers: { + entityId: '345', + }, + entityType: 'program', + programType: 'movie', + title: 'Cool Runnings', + synopsis: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.', + releaseDate: '1993-01-01T00:00:00.000Z', + contentRatings: [ + { + scheme: 'US-Movie', + rating: 'PG', + }, + { + scheme: 'CA-Movie', + rating: 'G', + }, + ], + waysToWatch: [ + { + identifiers: { + assetId: '123', + }, + expires: '2025-01-01T00:00:00.000Z', + entitled: true, + entitledExpires: '2025-01-01T00:00:00.000Z', + offeringType: 'buy', + price: 2.99, + videoQuality: ['UHD'], + audioProfile: ['dolbyAtmos'], + audioLanguages: ['en'], + closedCaptions: ['en'], + subtitles: ['es'], + audioDescriptions: ['en'], + }, + ], + }, + ], + } +}) +console.log(success) +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.onPullPurchasedContent", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "correlationId": "xyz", + "parameters": { + "limit": 100 + } + } +} +``` + +Push Request: + +```json +{ + "jsonrpc": "2.0", + "id": 2, + "method": "Discovery.purchasedContent", + "params": { + "correlationId": "TBD", + "result": { + "totalCount": 10, + "expires": "2025-01-01T00:00:00.000Z", + "entries": [ + { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": ["UHD"], + "audioProfile": ["dolbyAtmos"], + "audioLanguages": ["en"], + "closedCaptions": ["en"], + "subtitles": ["es"], + "audioDescriptions": ["en"] + } + ] + } + ] + } + } +} +``` + +
+ +To push data to the platform, e.g. during app launch, use `purchasedContent(result: PurchasedContentResult)`: + +```typescript +function purchasedContent(result: PurchasedContentResult): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| -------- | ------------------------ | -------- | --------------------------------------------------------- | +| `result` | `PurchasedContentResult` | Yes | The `PurchasedContentResult` data to push to the platform | + +```typescript +type PurchasedContentResult = { + expires: string + totalCount: number + entries: EntityInfo[] +} +``` + +See also: [PurchasedContent](#purchasedcontent-1) + +Promise resolution: + +| Type | Summary | +| --------- | -------------------------------------- | +| `boolean` | Whether or not the push was successful | + +#### Examples + +Inform the platform of the user's purchased content + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.purchasedContent({ + totalCount: 10, + expires: '2025-01-01T00:00:00.000Z', + entries: [ + { + identifiers: { + entityId: '345', + }, + entityType: 'program', + programType: 'movie', + title: 'Cool Runnings', + synopsis: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.', + releaseDate: '1993-01-01T00:00:00.000Z', + contentRatings: [ + { + scheme: 'US-Movie', + rating: 'PG', + }, + { + scheme: 'CA-Movie', + rating: 'G', + }, + ], + waysToWatch: [ + { + identifiers: { + assetId: '123', + }, + expires: '2025-01-01T00:00:00.000Z', + entitled: true, + entitledExpires: '2025-01-01T00:00:00.000Z', + offeringType: 'buy', + price: 2.99, + videoQuality: ['UHD'], + audioProfile: ['dolbyAtmos'], + audioLanguages: ['en'], + closedCaptions: ['en'], + subtitles: ['es'], + audioDescriptions: ['en'], + }, + ], + }, + ], +}) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.purchasedContent", + "params": { + "correlationId": null, + "result": { + "totalCount": 10, + "expires": "2025-01-01T00:00:00.000Z", + "entries": [ + { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": ["UHD"], + "audioProfile": ["dolbyAtmos"], + "audioLanguages": ["en"], + "closedCaptions": ["en"], + "subtitles": ["es"], + "audioDescriptions": ["en"] + } + ] + } + ] + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### signIn + +Inform the platform that your user is signed in, for increased visibility in search & discovery. Sign-in state is used separately from what content can be access through entitlements and availabilities. Sign-in state may be used when deciding whether to choose this app to handle a user intent. For instance, if the user tries to launch something generic like playing music from an artist, only a signed-in app will be chosen. If the user wants to tune to a channel, only a signed-in app will be chosen to handle that intent. While signIn can optionally include entitlements as those typically change at signIn time, it is recommended to make a separate call to Discovery.contentAccess for entitlements. signIn is not only for when a user explicitly enters login credentials. If an app does not require any credentials from the user to consume content, such as in a free app, then the app should call signIn immediately on launch. + +```typescript +function signIn(entitlements: Entitlement[]): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| -------------- | --------------- | -------- | ------------------------------------------------------------------------------------------------------- | +| `entitlements` | `Entitlement[]` | false | Optional array of Entitlements, in case of a different user account, or a long time since last sign-in. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------------ | +| uses | xrn:firebolt:capability:discovery:sign-in-status | + +#### Examples + +Send signIn metric + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.signIn(null) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.signIn", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Send signIn notification with entitlements + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.signIn([ + { + entitlementId: '123', + startTime: '2025-01-01T00:00:00.000Z', + endTime: '2025-01-01T00:00:00.000Z', + }, +]) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.signIn", + "params": { + "entitlements": [ + { + "entitlementId": "123", + "startTime": "2025-01-01T00:00:00.000Z", + "endTime": "2025-01-01T00:00:00.000Z" + } + ] + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### signOut + +Inform the platform that your user has signed out. See `Discovery.signIn` for more details on how the sign-in state is used.signOut will NOT clear entitlements, the app should make a separate call to Discovery.clearContentAccess. Apps should also call signOut when a login token has expired and the user is now in a signed-out state. + +```typescript +function signOut(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------------ | +| uses | xrn:firebolt:capability:discovery:sign-in-status | + +#### Examples + +Send signOut notification + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.signOut() +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.signOut", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### userInterest + +Send an entity that the user has expressed interest in to the platform. + +```typescript +function userInterest( + type: InterestType, + reason: InterestReason, + entity: EntityDetails, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| -------- | -------------------------------------------------------- | -------- | ------------------------------------------------------ | +| `type` | [`InterestType`](../Discovery/schemas/#InterestType) | true |
values: `'interest' \| 'disinterest'` | +| `reason` | [`InterestReason`](../Discovery/schemas/#InterestReason) | true |
values: `'playlist' \| 'reaction' \| 'recording'` | +| `entity` | [`EntityDetails`](../Entity/schemas/#EntityDetails) | true | | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| -------- | ------------------------------------------ | +| provides | xrn:firebolt:capability:discovery:interest | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let result = await Discovery.userInterest('interest', 'playlist', { + identifiers: { + entityId: '345', + entityType: 'program', + programType: 'movie', + }, + info: {}, +}) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.userInterest", + "params": { + "type": "interest", + "reason": "playlist", + "entity": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": {} + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### userInterestError + +_This is an private RPC method._ + +Internal API for .onRequestUserInterest Provider to send back error. + +Parameters: + +| Param | Type | Required | Description | +| --------------- | -------- | -------- | ----------- | +| `correlationId` | `string` | true | | +| `error` | `object` | true | | + +Result: + +Capabilities: + +| Role | Capability | +| -------- | ------------------------------------------ | +| provides | xrn:firebolt:capability:discovery:interest | + +#### Examples + +Example 1 + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.userInterestError", + "params": { + "correlationId": "123", + "error": { + "code": 1, + "message": "Error" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +### userInterestResponse + +_This is an private RPC method._ + +Internal API for .onRequestUserInterest Provider to send back response. + +Parameters: + +| Param | Type | Required | Description | +| --------------- | --------------------------------------------------- | -------- | ----------- | +| `correlationId` | `string` | true | | +| `result` | [`EntityDetails`](../Entity/schemas/#EntityDetails) | true | | + +Result: + +Capabilities: + +| Role | Capability | +| -------- | ------------------------------------------ | +| provides | xrn:firebolt:capability:discovery:interest | + +#### Examples + +Example + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.userInterestResponse", + "params": { + "correlationId": "123", + "result": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +### watched + +Notify the platform that content was partially or completely watched + +```typescript +function watched( + entityId: string, + progress: number, + completed: boolean, + watchedOn: string, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ----------- | --------- | -------- | ---------------------------------------------------------------------------------------------------------------------- | +| `entityId` | `string` | true | The entity Id of the watched content. | +| `progress` | `number` | false | How much of the content has been watched (percentage as (0-0.999) for VOD, number of seconds for live)
minumum: 0 | +| `completed` | `boolean` | false | Whether or not this viewing is considered "complete," per the app's definition thereof | +| `watchedOn` | `string` | false | Date/Time the content was watched, ISO 8601 Date/Time
format: date-time | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------------- | +| uses | xrn:firebolt:capability:discovery:watched | + +#### Examples + +Notifying the platform of watched content + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.watched( + 'partner.com/entity/123', + 0.95, + true, + '2021-04-23T18:25:43.511Z', +) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.watched", + "params": { + "entityId": "partner.com/entity/123", + "progress": 0.95, + "completed": true, + "watchedOn": "2021-04-23T18:25:43.511Z" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### watchNext + +Suggest a call-to-action for this app on the platform home screen + +```typescript +function watchNext( + title: LocalizedString, + identifiers: ContentIdentifiers, + expires: string, + images: object, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------------- | -------------------------------------------------------------------- | -------- | -------------------------------------------------------------------------------------- | +| `title` | [`LocalizedString`](../Types/schemas/#LocalizedString) | true | The title of this call to action | +| `identifiers` | [`ContentIdentifiers`](../Entertainment/schemas/#ContentIdentifiers) | true | A set of content identifiers for this call to action | +| `expires` | `string` | false | When this call to action should no longer be presented to users
format: date-time | +| `images` | `object` | false | A set of images for this call to action | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | -------------------------------------------- | +| uses | xrn:firebolt:capability:discovery:watch-next | + +#### Examples + +Suggest a watch-next tile for the home screen + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.watchNext( + 'A Cool Show', + { + entityId: 'partner.com/entity/123', + }, + '2021-04-23T18:25:43.511Z', + { + '3x4': { + 'en-US': 'https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg', + es: 'https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg', + }, + '16x9': { + en: 'https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg', + }, + }, +) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.watchNext", + "params": { + "title": "A Cool Show", + "identifiers": { + "entityId": "partner.com/entity/123" + }, + "expires": "2021-04-23T18:25:43.511Z", + "images": { + "3x4": { + "en-US": "https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg", + "es": "https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg" + }, + "16x9": { + "en": "https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg" + } + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Suggest a watch-next tile for the home screen + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +let success = await Discovery.watchNext( + 'A Fantastic Show', + { entityId: 'partner.com/entity/456' }, + null, + null, +) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.watchNext", + "params": { + "title": "A Fantastic Show", + "identifiers": { + "entityId": "partner.com/entity/456" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +## Events + +### navigateTo + +```typescript +function listen('navigateTo', () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Event value: + +[NavigationIntent](../Intents/schemas/#NavigationIntent) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------------- | +| uses | xrn:firebolt:capability:discovery:navigate-to | + +#### Examples + +Listening for `navigateTo` events + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +Discovery.listen('navigateTo', (value) => { + console.log(value) +}) +``` + +Value of `value`: + +```javascript +{ + "action": "search", + "data": { + "query": "a cool show" + }, + "context": { + "campaign": "unknown", + "source": "voice" + } +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.onNavigateTo", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "action": "search", + "data": { + "query": "a cool show" + }, + "context": { + "campaign": "unknown", + "source": "voice" + } + } +} +``` + +
+ +--- + +### policyChanged + +See: [policy](#policy) + +### onRequestUserInterest + +_This is an private RPC method._ + +Provide information about the entity currently displayed or selected on the screen. + +Parameters: + +| Param | Type | Required | Description | +| -------- | --------- | -------- | ----------- | +| `listen` | `boolean` | true | | + +Result: + +Capabilities: + +| Role | Capability | +| -------- | ------------------------------------------ | +| provides | xrn:firebolt:capability:discovery:interest | + +#### Examples + +Default Example + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.onRequestUserInterest", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "correlationId": "xyz", + "parameters": { + "type": "interest", + "reason": "playlist" + } + } +} +``` + +--- + +## Provider Interfaces + +### UserInterestProvider + +The provider interface for the `xrn:firebolt:capability:discovery:interest` capability. + +```typescript +interface UserInterestProvider { + userInterest( + parameters: UserInterestProviderParameters, + session: ProviderSession, + ): Promise +} +``` + +Usage: + +```typescript +Discovery.provide('xrn:firebolt:capability:discovery:interest', provider: UserInterestProvider | object) +``` + +#### Examples + +**Register your app to provide the `xrn:firebolt:capability:discovery:interest` capability.** + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +class MyUserInterestProvider { + async userInterest(parameters, session) { + return { + identifiers: { + entityId: '345', + entityType: 'program', + programType: 'movie', + }, + info: { + title: 'Cool Runnings', + synopsis: + 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.', + releaseDate: '1993-01-01T00:00:00.000Z', + contentRatings: [ + { + scheme: 'US-Movie', + rating: 'PG', + }, + { + scheme: 'CA-Movie', + rating: 'G', + }, + ], + }, + } + } +} + +Discovery.provide( + 'xrn:firebolt:capability:discovery:interest', + new MyUserInterestProvider(), +) +``` + +
+ JSON-RPC + +**Register to recieve each provider API** + +Request: + +```json +{ + "id": 1, + "method": "Discovery.onRequestUserInterest", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "id": 1, + "result": { + "listening": true, + "event": "Discovery.onRequestUserInterest" + } +} +``` + +**Asynchronous event to initiate userInterest()** + +Event Response: + +```json +{ + "id": 1, + "result": { + "correlationId": undefined, + "parameters": { + "type": "interest", + "reason": "playlist" + } + } +} +``` + +**App initiated response to event** + +Request: + +```json +{ + "id": 2, + "method": "Discovery.userInterestResponse", + "params": { + "correlationId": undefined, + "result": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + } +} +``` + +Response: + +```json +{ + "id": 2, + "result": true +} +``` + +
+ +## Types + +### DiscoveryPolicy + +```typescript +type DiscoveryPolicy = { + enableRecommendations: boolean // Whether or not to the user has enabled history-based recommendations + shareWatchHistory: boolean // Whether or not the user has enabled app watch history data to be shared with the platform + rememberWatchedPrograms: boolean // Whether or not the user has enabled watch history +} +``` + +--- + +### Availability + +```typescript +type Availability = { + type: 'channel-lineup' | 'program-lineup' + id: string + catalogId?: string + startTime?: string + endTime?: string +} +``` + +--- + +### UserInterestProviderParameters + +```typescript +type UserInterestProviderParameters = { + type: InterestType + reason: InterestReason +} +``` + +See also: + +[InterestType](../Discovery/schemas/#InterestType) +[InterestReason](../Discovery/schemas/#InterestReason) + +--- + +### PurchasedContentParameters + +```typescript +type PurchasedContentParameters = { + limit: number + offeringType?: OfferingType // The offering type of the WayToWatch. + programType?: ProgramType // In the case of a program `entityType`, specifies the program type. +} +``` + +See also: + +[OfferingType](../Entertainment/schemas/#OfferingType) +[ProgramType](../Entertainment/schemas/#ProgramType) + +--- + +### ContentAccessIdentifiers + +```typescript +type ContentAccessIdentifiers = { + availabilities?: Availability[] // A list of identifiers that represent what content is discoverable for the subscriber. Excluding availabilities will cause no change to the availabilities that are stored for this subscriber. Providing an empty array will clear the subscriber's availabilities + entitlements?: Entitlement[] // A list of identifiers that represent what content is consumable for the subscriber. Excluding entitlements will cause no change to the entitlements that are stored for this subscriber. Providing an empty array will clear the subscriber's entitlements +} +``` + +See also: + +[Availability](#availability) +[Entitlement](../Entertainment/schemas/#Entitlement) + +--- + +### EntityInfoParameters + +```typescript +type EntityInfoParameters = { + entityId: string + assetId?: string +} +``` + +--- + +### EntityInfoFederatedRequest + +```typescript +type EntityInfoFederatedRequest = { + parameters: EntityInfoParameters + correlationId: string +} +``` + +See also: + +[FederatedRequest](#federatedrequest) +[EntityInfoParameters](#entityinfoparameters) + +--- + +### PurchasedContentFederatedRequest + +```typescript +type PurchasedContentFederatedRequest = { + parameters: PurchasedContentParameters + correlationId: string +} +``` + +See also: + +[FederatedRequest](#federatedrequest) +[PurchasedContentParameters](#purchasedcontentparameters) + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Discovery/schemas/index.md b/apis/pr-fix-ci-fb-version/core/Discovery/schemas/index.md new file mode 100644 index 000000000..b5685ffd4 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Discovery/schemas/index.md @@ -0,0 +1,88 @@ +--- +title: Discovery + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Discovery + +--- + +Version Discovery 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [InterestType](#interesttype) + - [InterestReason](#interestreason) + - [EntityInfoResult](#entityinforesult) + - [PurchasedContentResult](#purchasedcontentresult) + +## Overview + +undefined + +## Types + +### InterestType + +```typescript +InterestType: { + INTEREST: 'interest', + DISINTEREST: 'disinterest', +}, + +``` + +--- + +### InterestReason + +```typescript +InterestReason: { + PLAYLIST: 'playlist', + REACTION: 'reaction', + RECORDING: 'recording', +}, + +``` + +--- + +### EntityInfoResult + +The result for an `entityInfo()` push or pull. + +```typescript +type EntityInfoResult = { + expires: string + entity: EntityInfo // An EntityInfo object represents an "entity" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type. + related?: EntityInfo[] // An EntityInfo object represents an "entity" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type. +} +``` + +See also: + +[EntityInfo](../Entertainment/schemas/#EntityInfo) + +--- + +### PurchasedContentResult + +```typescript +type PurchasedContentResult = { + expires: string + totalCount: number + entries: EntityInfo[] // An EntityInfo object represents an "entity" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type. +} +``` + +See also: + +[EntityInfo](../Entertainment/schemas/#EntityInfo) + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Entertainment/schemas/index.md b/apis/pr-fix-ci-fb-version/core/Entertainment/schemas/index.md new file mode 100644 index 000000000..e02d4180a --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Entertainment/schemas/index.md @@ -0,0 +1,285 @@ +--- +title: Entertainment + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Entertainment + +--- + +Version Entertainment 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [OfferingType](#offeringtype) + - [MusicType](#musictype) + - [ProgramType](#programtype) + - [ContentRating](#contentrating) +- [United States](#united-states) +- [Canada](#canada) + - [ContentIdentifiers](#contentidentifiers) + - [Entitlement](#entitlement) + - [WayToWatch](#waytowatch) + - [EntityInfo](#entityinfo) + +## Overview + +undefined + +## Types + +### OfferingType + +The offering type of the WayToWatch. + +```typescript +OfferingType: { + FREE: 'free', + SUBSCRIBE: 'subscribe', + BUY: 'buy', + RENT: 'rent', +}, + +``` + +--- + +### MusicType + +In the case of a music `entityType`, specifies the type of music entity. + +```typescript +MusicType: { + SONG: 'song', + ALBUM: 'album', +}, + +``` + +--- + +### ProgramType + +In the case of a program `entityType`, specifies the program type. + +```typescript +ProgramType: { + MOVIE: 'movie', + EPISODE: 'episode', + SEASON: 'season', + SERIES: 'series', + OTHER: 'other', + PREVIEW: 'preview', + EXTRA: 'extra', + CONCERT: 'concert', + SPORTING_EVENT: 'sportingEvent', + ADVERTISEMENT: 'advertisement', + MUSIC_VIDEO: 'musicVideo', + MINISODE: 'minisode', +}, + +``` + +--- + +### ContentRating + +A ContentRating represents an age or content based of an entity. Supported rating schemes and associated types are below. + +## United States + +`US-Movie` (MPAA): + +Ratings: `NR`, `G`, `PG`, `PG13`, `R`, `NC17` + +Advisories: `AT`, `BN`, `SL`, `SS`, `N`, `V` + +`US-TV` (Vchip): + +Ratings: `TVY`, `TVY7`, `TVG`, `TVPG`, `TV14`, `TVMA` + +Advisories: `FV`, `D`, `L`, `S`, `V` + +## Canada + +`CA-Movie` (OFRB): + +Ratings: `G`, `PG`, `14A`, `18A`, `R`, `E` + +`CA-TV` (AGVOT) + +Ratings: `E`, `C`, `C8`, `G`, `PG`, `14+`, `18+` + +Advisories: `C`, `C8`, `G`, `PG`, `14+`, `18+` + +`CA-Movie-Fr` (Canadian French language movies): + +Ratings: `G`, `8+`, `13+`, `16+`, `18+` + +`CA-TV-Fr` (Canadian French language TV): + +Ratings: `G`, `8+`, `13+`, `16+`, `18+` + +```typescript +type ContentRating = { + scheme: + | 'CA-Movie' + | 'CA-TV' + | 'CA-Movie-Fr' + | 'CA-TV-Fr' + | 'US-Movie' + | 'US-TV' // The rating scheme. + rating: string // The content rating. + advisories?: string[] // Optional list of subratings or content advisories. +} +``` + +--- + +### ContentIdentifiers + +The ContentIdentifiers object is how the app identifies an entity or asset to +the Firebolt platform. These ids are used to look up metadata and deep link into +the app. + +Apps do not need to provide all ids. They only need to provide the minimum +required to target a playable stream or an entity detail screen via a deep link. +If an id isn't needed to get to those pages, it doesn't need to be included. + +```typescript +type ContentIdentifiers = { + assetId?: string // Identifies a particular playable asset. For example, the HD version of a particular movie separate from the UHD version. + entityId?: string // Identifies an entity, such as a Movie, TV Series or TV Episode. + seasonId?: string // The TV Season for a TV Episode. + seriesId?: string // The TV Series for a TV Episode or TV Season. + appContentData?: string // App-specific content identifiers. +} +``` + +--- + +### Entitlement + +```typescript +type Entitlement = { + entitlementId: string + startTime?: string + endTime?: string +} +``` + +--- + +### WayToWatch + +A WayToWatch describes a way to watch a video program. It may describe a single +streamable asset or a set of streamable assets. For example, an app provider may +describe HD, SD, and UHD assets as individual WayToWatch objects or rolled into +a single WayToWatch. + +If the WayToWatch represents a single streamable asset, the provided +ContentIdentifiers must be sufficient to play back the specific asset when sent +via a playback intent or deep link. If the WayToWatch represents multiple +streamable assets, the provided ContentIdentifiers must be sufficient to +playback one of the assets represented with no user action. In this scenario, +the app SHOULD choose the best asset for the user based on their device and +settings. The ContentIdentifiers MUST also be sufficient for navigating the user +to the appropriate entity or detail screen via an entity intent. + +The app should set the `entitled` property to indicate if the user can watch, or +not watch, the asset without making a purchase. If the entitlement is known to +expire at a certain time (e.g., a rental), the app should also provide the +`entitledExpires` property. If the entitlement is not expired, the UI will use +the `entitled` property to display watchable assets to the user, adjust how +assets are presented to the user, and how intents into the app are generated. +For example, the the Aggregated Experience could render a "Watch" button for an +entitled asset versus a "Subscribe" button for an non-entitled asset. + +The app should set the `offeringType` to define how the content may be +authorized. The UI will use this to adjust how content is presented to the user. + +A single WayToWatch cannot represent streamable assets available via multiple +purchase paths. If, for example, an asset has both Buy, Rent and Subscription +availability, the three different entitlement paths MUST be represented as +multiple WayToWatch objects. + +`price` should be populated for WayToWatch objects with `buy` or `rent` +`offeringType`. If the WayToWatch represents a set of assets with various price +points, the `price` provided must be the lowest available price. + +```typescript +type WayToWatch = { + identifiers: ContentIdentifiers // The ContentIdentifiers object is how the app identifies an entity or asset to + expires?: string // Time when the WayToWatch is no longer available. + entitled?: boolean // Specify if the user is entitled to watch the entity. + entitledExpires?: string // Time when the entity is no longer entitled. + offeringType?: OfferingType // The offering type of the WayToWatch. + hasAds?: boolean // True if the streamable asset contains ads. + price?: number // For "buy" and "rent" WayToWatch, the price to buy or rent in the user's preferred currency. + videoQuality?: 'SD' | 'HD' | 'UHD'[] // List of the video qualities available via the WayToWatch. + audioProfile: AudioProfile[] // List of the audio types available via the WayToWatch. + audioLanguages?: string[] // List of audio track languages available on the WayToWatch. The first is considered the primary language. Languages are expressed as ISO 639 1/2 codes. + closedCaptions?: string[] // List of languages for which closed captions are available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes. + subtitles?: string[] // List of languages for which subtitles are available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes. + audioDescriptions?: string[] // List of languages for which audio descriptions (DVD) as available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes. +} +``` + +See also: + +[ContentIdentifiers](#contentidentifiers) +[OfferingType](#offeringtype) +[AudioProfile](../Types/schemas/#AudioProfile) + +--- + +### EntityInfo + +An EntityInfo object represents an "entity" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type. + +Additionally, EntityInfo objects must specify a properly formed +ContentIdentifiers object, `entityType`, and `title`. The app should provide +the `synopsis` property for a good user experience if the content +metadata is not available another way. + +The ContentIdentifiers must be sufficient for navigating the user to the +appropriate entity or detail screen via a `detail` intent or deep link. + +EntityInfo objects must provide at least one WayToWatch object when returned as +part of an `entityInfo` method and a streamable asset is available to the user. +It is optional for the `purchasedContent` method, but recommended because the UI +may use those data. + +```typescript +type EntityInfo = { + identifiers: ContentIdentifiers // The ContentIdentifiers object is how the app identifies an entity or asset to + title: string // Title of the entity. + entityType: 'program' | 'music' // The type of the entity, e.g. `program` or `music`. + programType?: ProgramType // In the case of a program `entityType`, specifies the program type. + musicType?: MusicType // In the case of a music `entityType`, specifies the type of music entity. + synopsis?: string // Short description of the entity. + seasonNumber?: number // For TV seasons, the season number. For TV episodes, the season that the episode belongs to. + seasonCount?: number // For TV series, seasons, and episodes, the total number of seasons. + episodeNumber?: number // For TV episodes, the episode number. + episodeCount?: number // For TV seasons and episodes, the total number of episodes in the current season. + releaseDate?: string // The date that the program or entity was released or first aired. + contentRatings?: ContentRating[] // A ContentRating represents an age or content based of an entity. Supported rating schemes and associated types are below. + waysToWatch?: WayToWatch[] // A WayToWatch describes a way to watch a video program. It may describe a single +} +``` + +See also: + +[ContentIdentifiers](#contentidentifiers) +[ProgramType](#programtype) +[MusicType](#musictype) +[ContentRating](#contentrating) +[WayToWatch](#waytowatch) + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Entity/schemas/index.md b/apis/pr-fix-ci-fb-version/core/Entity/schemas/index.md new file mode 100644 index 000000000..7d717f1ce --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Entity/schemas/index.md @@ -0,0 +1,287 @@ +--- +title: Entity + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Entity + +--- + +Version Entity 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [MovieEntity](#movieentity) + - [Metadata](#metadata) + - [MusicEntity](#musicentity) + - [ChannelEntity](#channelentity) + - [UntypedEntity](#untypedentity) + - [PlaylistEntity](#playlistentity) + - [TVEpisodeEntity](#tvepisodeentity) + - [TVSeasonEntity](#tvseasonentity) + - [TVSeriesEntity](#tvseriesentity) + - [AdditionalEntity](#additionalentity) + - [ProgramEntity](#programentity) + - [Entity](#entity) + - [EntityDetails](#entitydetails) + - [PlayableEntity](#playableentity) + +## Overview + +undefined + +## Types + +### MovieEntity + +A Firebolt compliant representation of a Movie entity. + +```typescript +type MovieEntity = { + entityType: 'program' + programType: 'movie' + entityId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### Metadata + +```typescript +type Metadata = { + title?: string // Title of the entity. + synopsis?: string // Short description of the entity. + seasonNumber?: number // For TV seasons, the season number. For TV episodes, the season that the episode belongs to. + seasonCount?: number // For TV series, seasons, and episodes, the total number of seasons. + episodeNumber?: number // For TV episodes, the episode number. + episodeCount?: number // For TV seasons and episodes, the total number of episodes in the current season. + releaseDate?: string // The date that the program or entity was released or first aired. + contentRatings?: ContentRating[] // A ContentRating represents an age or content based of an entity. Supported rating schemes and associated types are below. +} +``` + +See also: + +[ContentRating](../Entertainment/schemas/#ContentRating) + +--- + +### MusicEntity + +```typescript +type MusicEntity = { + entityType: 'music' + musicType: MusicType // In the case of a music `entityType`, specifies the type of music entity. + entityId: string +} +``` + +See also: + +[MusicType](../Entertainment/schemas/#MusicType) + +--- + +### ChannelEntity + +```typescript +type ChannelEntity = { + entityType: 'channel' + channelType: 'streaming' | 'overTheAir' + entityId: string // ID of the channel, in the target App's scope. + appContentData?: string +} +``` + +--- + +### UntypedEntity + +```typescript +type UntypedEntity = { + entityId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### PlaylistEntity + +A Firebolt compliant representation of a Playlist entity. + +```typescript +type PlaylistEntity = { + entityType: 'playlist' + entityId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### TVEpisodeEntity + +A Firebolt compliant representation of a TV Episode entity. + +```typescript +type TVEpisodeEntity = { + entityType: 'program' + programType: 'episode' + entityId: string + seriesId: string + seasonId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### TVSeasonEntity + +A Firebolt compliant representation of a TV Season entity. + +```typescript +type TVSeasonEntity = { + entityType: 'program' + programType: 'season' + entityId: string + seriesId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### TVSeriesEntity + +A Firebolt compliant representation of a TV Series entity. + +```typescript +type TVSeriesEntity = { + entityType: 'program' + programType: 'series' + entityId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### AdditionalEntity + +A Firebolt compliant representation of the remaining program entity types. + +```typescript +type AdditionalEntity = { + entityType: 'program' + programType: + | 'concert' + | 'sportingEvent' + | 'preview' + | 'other' + | 'advertisement' + | 'musicVideo' + | 'minisode' + | 'extra' + entityId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### ProgramEntity + +```typescript +type ProgramEntity = + | MovieEntity + | TVEpisodeEntity + | TVSeasonEntity + | TVSeriesEntity + | AdditionalEntity +``` + +See also: + +[MovieEntity](#movieentity) +[TVEpisodeEntity](#tvepisodeentity) +[TVSeasonEntity](#tvseasonentity) +[TVSeriesEntity](#tvseriesentity) +[AdditionalEntity](#additionalentity) + +--- + +### Entity + +```typescript + +``` + +See also: + +[ProgramEntity](#programentity) +[MusicEntity](#musicentity) +[ChannelEntity](#channelentity) +[UntypedEntity](#untypedentity) +[PlaylistEntity](#playlistentity) + +--- + +### EntityDetails + +```typescript +type EntityDetails = { + identifiers: + | ProgramEntity + | MusicEntity + | ChannelEntity + | UntypedEntity + | PlaylistEntity + info?: Metadata + waysToWatch?: WayToWatch[] // A WayToWatch describes a way to watch a video program. It may describe a single +} +``` + +See also: + +[Metadata](#metadata) +[WayToWatch](../Entertainment/schemas/#WayToWatch) + +--- + +### PlayableEntity + +```typescript +type PlayableEntity = + | MovieEntity + | TVEpisodeEntity + | PlaylistEntity + | MusicEntity + | AdditionalEntity +``` + +See also: + +[MovieEntity](#movieentity) +[TVEpisodeEntity](#tvepisodeentity) +[PlaylistEntity](#playlistentity) +[MusicEntity](#musicentity) +[AdditionalEntity](#additionalentity) + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Intents/schemas/index.md b/apis/pr-fix-ci-fb-version/core/Intents/schemas/index.md new file mode 100644 index 000000000..9d275e5b2 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Intents/schemas/index.md @@ -0,0 +1,232 @@ +--- +title: Intents + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Intents + +--- + +Version Intents 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [Intent](#intent) + - [IntentProperties](#intentproperties) + - [EntityIntent](#entityintent) + - [PlaybackIntent](#playbackintent) + - [SearchIntent](#searchintent) + - [SectionIntent](#sectionintent) + - [TuneIntent](#tuneintent) + - [PlayEntityIntent](#playentityintent) + - [PlayQueryIntent](#playqueryintent) + - [HomeIntent](#homeintent) + - [LaunchIntent](#launchintent) + - [NavigationIntent](#navigationintent) + +## Overview + +undefined + +## Types + +### Intent + +A Firebolt compliant representation of a user intention. + +```typescript + +``` + +--- + +### IntentProperties + +```typescript + +``` + +--- + +### EntityIntent + +A Firebolt compliant representation of a user intention to navigate an app to a specific entity page, and bring that app to the foreground if needed. + +```typescript +type EntityIntent = { + action: 'entity' + data: + | ProgramEntity + | MusicEntity + | ChannelEntity + | UntypedEntity + | PlaylistEntity + context: object +} +``` + +--- + +### PlaybackIntent + +A Firebolt compliant representation of a user intention to navigate an app to a the video player for a specific, playable entity, and bring that app to the foreground if needed. + +```typescript +type PlaybackIntent = { + action: 'playback' + data: PlayableEntity + context: object +} +``` + +See also: + +[PlayableEntity](../Entity/schemas/#PlayableEntity) + +--- + +### SearchIntent + +A Firebolt compliant representation of a user intention to navigate an app to it's search UI with a search term populated, and bring that app to the foreground if needed. + +```typescript +type SearchIntent = { + action: 'search' + data?: object + context: object +} +``` + +--- + +### SectionIntent + +A Firebolt compliant representation of a user intention to navigate an app to a section not covered by `home`, `entity`, `player`, or `search`, and bring that app to the foreground if needed. + +```typescript +type SectionIntent = { + action: 'section' + data: object + context: object +} +``` + +--- + +### TuneIntent + +A Firebolt compliant representation of a user intention to 'tune' to a traditional over-the-air broadcast, or an OTT Stream from an OTT or vMVPD App. + +```typescript +type TuneIntent = { + action: 'tune' + data: object + context: object +} +``` + +See also: + +[ChannelEntity](../Entity/schemas/#ChannelEntity) + +--- + +### PlayEntityIntent + +A Firebolt compliant representation of a user intention to navigate an app to a the video player for a specific, playable entity, and bring that app to the foreground if needed. + +```typescript +type PlayEntityIntent = { + action: 'play-entity' + data: object + context: object +} +``` + +See also: + +[PlayableEntity](../Entity/schemas/#PlayableEntity) + +--- + +### PlayQueryIntent + +A Firebolt compliant representation of a user intention to navigate an app to a the video player for an abstract query to be searched for and played by the app. + +```typescript +type PlayQueryIntent = { + action: 'play-query' + data: object + context: object +} +``` + +See also: + +[ProgramType](../Entertainment/schemas/#ProgramType) +[MusicType](../Entertainment/schemas/#MusicType) + +--- + +### HomeIntent + +A Firebolt compliant representation of a user intention to navigate an app to it's home screen, and bring that app to the foreground if needed. + +```typescript +type HomeIntent = { + action: 'home' + context: object +} +``` + +--- + +### LaunchIntent + +A Firebolt compliant representation of a user intention to launch an app. + +```typescript +type LaunchIntent = { + action: 'launch' + context: object +} +``` + +--- + +### NavigationIntent + +A Firebolt compliant representation of a user intention to navigate to a specific place in an app. + +```typescript +type NavigationIntent = + | HomeIntent + | LaunchIntent + | EntityIntent + | PlaybackIntent + | SearchIntent + | SectionIntent + | TuneIntent + | PlayEntityIntent + | PlayQueryIntent +``` + +See also: + +[HomeIntent](#homeintent) +[LaunchIntent](#launchintent) +[EntityIntent](#entityintent) +[PlaybackIntent](#playbackintent) +[SearchIntent](#searchintent) +[SectionIntent](#sectionintent) +[TuneIntent](#tuneintent) +[PlayEntityIntent](#playentityintent) +[PlayQueryIntent](#playqueryintent) + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Internal/index.md b/apis/pr-fix-ci-fb-version/core/Internal/index.md new file mode 100644 index 000000000..9474f800f --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Internal/index.md @@ -0,0 +1,109 @@ +--- +title: Internal + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Internal Module + +--- + +Version Internal 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Methods](#methods) + - [initialize](#initialize) +- [Types](#types) + - [InitializeResult](#initializeresult) + +## Overview + +Internal methods for SDK / FEE integration + +## Methods + +### initialize + +_This is an private RPC method._ + +Initialize the SDK / FEE session. + +Parameters: + +| Param | Type | Required | Description | +| --------- | ------------------------------------------------------ | -------- | -------------------------------- | +| `version` | [`SemanticVersion`](../Types/schemas/#SemanticVersion) | true | The semantic version of the SDK. | + +Result: + +[InitializeResult](#initializeresult) + +Capabilities: + +| Role | Capability | +| ---- | -------------------------------------------- | +| uses | xrn:firebolt:capability:lifecycle:initialize | + +#### Examples + +Default Example + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Internal.initialize", + "params": { + "version": { + "major": 1, + "minor": 0, + "patch": 0, + "readable": "Firebolt SDK 1.0.0" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "version": { + "major": 1, + "minor": 0, + "patch": 0, + "readable": "Firebolt FEE 1.0.0" + } + } +} +``` + +--- + +## Types + +### InitializeResult + +```typescript +type InitializeResult = { + version: SemanticVersion // The semantic version of the FEE. +} +``` + +See also: + +[SemanticVersion](../Types/schemas/#SemanticVersion) + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Keyboard/index.md b/apis/pr-fix-ci-fb-version/core/Keyboard/index.md new file mode 100644 index 000000000..52419fe26 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Keyboard/index.md @@ -0,0 +1,318 @@ +--- +title: Keyboard + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Keyboard Module + +--- + +Version Keyboard 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [email](#email) + - [password](#password) + - [standard](#standard) +- [Types](#types) + - [EmailUsage](#emailusage) + +## Usage + +To use the Keyboard module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Keyboard } from '@firebolt-js/sdk' +``` + +## Overview + +Methods for prompting users to enter text with task-oriented UX + +## Methods + +### email + +Prompt the user for their email address with a simplified list of choices. + +```typescript +function email(type: EmailUsage, message: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| --------- | --------------------------- | -------- | --------------------------------------------------------------------------------------------- | +| `type` | [`EmailUsage`](#emailusage) | true | Why the email is being requested, e.g. sign on or sign up
values: `'signIn' \| 'signUp'` | +| `message` | `string` | false | The message to display while prompting | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | -------------------------------------- | +| uses | xrn:firebolt:capability:input:keyboard | + +#### Examples + +Prompt the user to select or type an email address + +JavaScript: + +```javascript +import { Keyboard } from '@firebolt-js/sdk' + +let email = await Keyboard.email( + 'signIn', + 'Enter your email to sign into this app', +) +console.log(email) +``` + +Value of `email`: + +```javascript +'user@domain.com' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Keyboard.email", + "params": { + "type": "signIn", + "message": "Enter your email to sign into this app" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "user@domain.com" +} +``` + +
+ +Prompt the user to type an email address to sign up + +JavaScript: + +```javascript +import { Keyboard } from '@firebolt-js/sdk' + +let email = await Keyboard.email( + 'signUp', + 'Enter your email to sign up for this app', +) +console.log(email) +``` + +Value of `email`: + +```javascript +'user@domain.com' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Keyboard.email", + "params": { + "type": "signUp", + "message": "Enter your email to sign up for this app" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "user@domain.com" +} +``` + +
+ +--- + +### password + +Show the password entry keyboard, with typing obfuscated from visibility + +```typescript +function password(message: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| --------- | -------- | -------- | -------------------------------------- | +| `message` | `string` | false | The message to display while prompting | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | -------------------------------------- | +| uses | xrn:firebolt:capability:input:keyboard | + +#### Examples + +Prompt the user to enter their password + +JavaScript: + +```javascript +import { Keyboard } from '@firebolt-js/sdk' + +let value = await Keyboard.password('Enter your password') +console.log(value) +``` + +Value of `value`: + +```javascript +'abc123' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Keyboard.password", + "params": { + "message": "Enter your password" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "abc123" +} +``` + +
+ +--- + +### standard + +Show the standard platform keyboard, and return the submitted value + +```typescript +function standard(message: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| --------- | -------- | -------- | -------------------------------------- | +| `message` | `string` | true | The message to display while prompting | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | -------------------------------------- | +| uses | xrn:firebolt:capability:input:keyboard | + +#### Examples + +Prompt the user for an arbitrary string + +JavaScript: + +```javascript +import { Keyboard } from '@firebolt-js/sdk' + +let value = await Keyboard.standard( + "Enter the name you'd like to associate with this device", +) +console.log(value) +``` + +Value of `value`: + +```javascript +'Living Room' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Keyboard.standard", + "params": { + "message": "Enter the name you'd like to associate with this device" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Living Room" +} +``` + +
+ +--- + +## Types + +### EmailUsage + +```typescript +EmailUsage: { + SIGN_IN: 'signIn', + SIGN_UP: 'signUp', +}, + +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Lifecycle/index.md b/apis/pr-fix-ci-fb-version/core/Lifecycle/index.md new file mode 100644 index 000000000..1604441ab --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Lifecycle/index.md @@ -0,0 +1,899 @@ +--- +title: Lifecycle + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Lifecycle Module + +--- + +Version Lifecycle 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [close](#close) + - [finished](#finished) + - [listen](#listen) + - [once](#once) + - [ready](#ready) + - [state](#state) +- [Events](#events) + - [background](#background) + - [foreground](#foreground) + - [inactive](#inactive) + - [suspended](#suspended) + - [unloading](#unloading) +- [Types](#types) + - [LifecycleEvent](#lifecycleevent) + +## Usage + +To use the Lifecycle module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Lifecycle } from '@firebolt-js/sdk' +``` + +## Overview + +Methods and events for responding to lifecycle changes in your app + +## Methods + +### close + +Request that the platform move your app out of focus + +```typescript +function close(reason: CloseReason): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| -------- | -------------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------- | +| `reason` | [`CloseReason`](../Lifecycle/schemas/#CloseReason) | true | The reason the app is requesting to be closed
values: `'remoteButton' \| 'userExit' \| 'done' \| 'error'` | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:lifecycle:state | + +#### Examples + +Close the app when the user presses back on the app home screen + +JavaScript: + +```javascript +import { Lifecycle } from '@firebolt-js/sdk' + +let success = await Lifecycle.close('remoteButton') +console.log(success) +``` + +Value of `success`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Lifecycle.close", + "params": { + "reason": "remoteButton" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Close the app when the user selects an exit menu item + +JavaScript: + +```javascript +import { Lifecycle } from '@firebolt-js/sdk' + +let success = await Lifecycle.close('userExit') +console.log(success) +``` + +Value of `success`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Lifecycle.close", + "params": { + "reason": "userExit" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### finished + +Notify the platform that the app is done unloading + +```typescript +function finished(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:lifecycle:state | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Lifecycle } from '@firebolt-js/sdk' + +let results = await Lifecycle.finished() +console.log(results) +``` + +Value of `results`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Lifecycle.finished", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Lifecycle.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Lifecycle.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Lifecycle.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Lifecycle.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### ready + +Notify the platform that the app is ready + +```typescript +function ready(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:lifecycle:ready | + +#### Examples + +Let the platform know that your app is ready + +JavaScript: + +```javascript +import { Lifecycle } from '@firebolt-js/sdk' + +let result = await Lifecycle.ready() +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Lifecycle.ready", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### state + +Get the current state of the app. This function is **synchronous**. + +```typescript +function state(): Promise +``` + +Promise resolution: + +[LifecycleState](../Lifecycle/schemas/#LifecycleState) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:lifecycle:state | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Lifecycle } from '@firebolt-js/sdk' + +const state = Lifecycle.state() +console.log(state) +``` + +Value of `state`: + +```javascript +'foreground' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Lifecycle.state", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "foreground" +} +``` + +
+ +--- + +## Events + +### background + +```typescript +function listen('background', () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Event value: + +[LifecycleEvent](#lifecycleevent) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:lifecycle:state | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Lifecycle } from '@firebolt-js/sdk' + +Lifecycle.listen('background', (value) => { + console.log(value) +}) +``` + +Value of `value`: + +```javascript +{ + "state": "background", + "previous": "foreground" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Lifecycle.onBackground", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "state": "background", + "previous": "foreground" + } +} +``` + +
+ +--- + +### foreground + +```typescript +function listen('foreground', () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Event value: + +[LifecycleEvent](#lifecycleevent) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:lifecycle:state | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Lifecycle } from '@firebolt-js/sdk' + +Lifecycle.listen('foreground', (value) => { + console.log(value) +}) +``` + +Value of `value`: + +```javascript +{ + "state": "foreground", + "previous": "inactive" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Lifecycle.onForeground", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "state": "foreground", + "previous": "inactive" + } +} +``` + +
+ +Move to foreground via remote branded buton + +JavaScript: + +```javascript +import { Lifecycle } from '@firebolt-js/sdk' + +Lifecycle.listen('foreground', (value) => { + console.log(value) +}) +``` + +Value of `value`: + +```javascript +{ + "state": "foreground", + "previous": "inactive" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Lifecycle.onForeground", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "state": "foreground", + "previous": "inactive", + "source": "remote" + } +} +``` + +
+ +--- + +### inactive + +```typescript +function listen('inactive', () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Event value: + +[LifecycleEvent](#lifecycleevent) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:lifecycle:state | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Lifecycle } from '@firebolt-js/sdk' + +Lifecycle.listen('inactive', (value) => { + console.log(value) +}) +``` + +Value of `value`: + +```javascript +{ + "state": "inactive", + "previous": "initializing" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Lifecycle.onInactive", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "state": "inactive", + "previous": "initializing" + } +} +``` + +
+ +--- + +### suspended + +```typescript +function listen('suspended', () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Event value: + +[LifecycleEvent](#lifecycleevent) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:lifecycle:state | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Lifecycle } from '@firebolt-js/sdk' + +Lifecycle.listen('suspended', (value) => { + console.log(value) +}) +``` + +Value of `value`: + +```javascript +{ + "state": "suspended", + "previous": "inactive" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Lifecycle.onSuspended", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "state": "suspended", + "previous": "inactive" + } +} +``` + +
+ +--- + +### unloading + +```typescript +function listen('unloading', () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Event value: + +[LifecycleEvent](#lifecycleevent) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:lifecycle:state | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Lifecycle } from '@firebolt-js/sdk' + +Lifecycle.listen('unloading', (value) => { + console.log(value) +}) +``` + +Value of `value`: + +```javascript +{ + "state": "unloading", + "previous": "inactive" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Lifecycle.onUnloading", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "state": "unloading", + "previous": "inactive" + } +} +``` + +
+ +--- + +## Types + +### LifecycleEvent + +A an object describing the previous and current states + +```typescript +type LifecycleEvent = { + state: LifecycleState // The application lifecycle state + previous: LifecycleState // The application lifecycle state + source?: 'voice' | 'remote' // The source of the lifecycle change. +} +``` + +See also: + +[LifecycleState](../Lifecycle/schemas/#LifecycleState) + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Lifecycle/schemas/index.md b/apis/pr-fix-ci-fb-version/core/Lifecycle/schemas/index.md new file mode 100644 index 000000000..ebae3d4ac --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Lifecycle/schemas/index.md @@ -0,0 +1,61 @@ +--- +title: Lifecycle + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Lifecycle + +--- + +Version Lifecycle 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [CloseReason](#closereason) + - [LifecycleState](#lifecyclestate) + +## Overview + +undefined + +## Types + +### CloseReason + +The application close reason + +```typescript +CloseReason: { + REMOTE_BUTTON: 'remoteButton', + USER_EXIT: 'userExit', + DONE: 'done', + ERROR: 'error', +}, + +``` + +--- + +### LifecycleState + +The application lifecycle state + +```typescript +LifecycleState: { + INITIALIZING: 'initializing', + INACTIVE: 'inactive', + FOREGROUND: 'foreground', + BACKGROUND: 'background', + UNLOADING: 'unloading', + SUSPENDED: 'suspended', +}, + +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Localization/index.md b/apis/pr-fix-ci-fb-version/core/Localization/index.md new file mode 100644 index 000000000..fdaa89810 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Localization/index.md @@ -0,0 +1,1623 @@ +--- +title: Localization + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Localization Module + +--- + +Version Localization 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [additionalInfo](#additionalinfo) + - [countryCode](#countrycode) + - [language](#language) + - [latlon](#latlon) + - [listen](#listen) + - [locale](#locale) + - [locality](#locality) + - [once](#once) + - [postalCode](#postalcode) + - [preferredAudioLanguages](#preferredaudiolanguages) +- [Events](#events) + - [countryCodeChanged](#countrycodechanged) + - [languageChanged](#languagechanged) + - [localeChanged](#localechanged) + - [localityChanged](#localitychanged) + - [postalCodeChanged](#postalcodechanged) + - [preferredAudioLanguagesChanged](#preferredaudiolanguageschanged) +- [Types](#types) + - [LatLon](#latlon-1) + +## Usage + +To use the Localization module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Localization } from '@firebolt-js/sdk' +``` + +## Overview + +Methods for accessessing location and language preferences + +## Methods + +### additionalInfo + +Get any platform-specific localization information + +```typescript +function additionalInfo(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:localization:additional-info | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let info = await Localization.additionalInfo() +console.log(info) +``` + +Value of `info`: + +```javascript +{ +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.additionalInfo", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": {} +} +``` + +
+ +--- + +### countryCode + +Get the ISO 3166-1 alpha-2 code for the country device is located in + +To get the value of `countryCode` call the method like this: + +```typescript +function countryCode(): Promise +``` + +Promise resolution: + +[CountryCode](../Localization/schemas/#CountryCode) + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------------- | +| uses | xrn:firebolt:capability:localization:country-code | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let code = await Localization.countryCode() +console.log(code) +``` + +Value of `code`: + +```javascript +'US' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.countryCode", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "US" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let code = await Localization.countryCode() +console.log(code) +``` + +Value of `code`: + +```javascript +'US' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.countryCode", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "UK" +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function countryCode(callback: (value) => CountryCode): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let listenerId = await countryCode((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `code`: + +```javascript +'US' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onCountryCodeChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "US" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let listenerId = await countryCode((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `code`: + +```javascript +'US' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onCountryCodeChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "UK" +} +``` + +
+ +--- + +### language + +Get the ISO 639 1/2 code for the preferred language + +To get the value of `language` call the method like this: + +```typescript +function language(): Promise +``` + +Promise resolution: + +[Language](../Localization/schemas/#Language) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------------- | +| uses | xrn:firebolt:capability:localization:language | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let lang = await Localization.language() +console.log(lang) +``` + +Value of `lang`: + +```javascript +'en' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.language", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "en" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let lang = await Localization.language() +console.log(lang) +``` + +Value of `lang`: + +```javascript +'en' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.language", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "es" +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function language(callback: (value) => Language): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let listenerId = await language((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `lang`: + +```javascript +'en' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onLanguageChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "en" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let listenerId = await language((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `lang`: + +```javascript +'en' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onLanguageChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "es" +} +``` + +
+ +--- + +### latlon + +Get the approximate latitude and longitude coordinates of the device location + +```typescript +function latlon(): Promise +``` + +Promise resolution: + +[LatLon](#latlon-1) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------------- | +| uses | xrn:firebolt:capability:localization:location | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let latlong = await Localization.latlon() +console.log(latlong) +``` + +Value of `latlong`: + +```javascript +;[39.9549, 75.1699] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.latlon", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [39.9549, 75.1699] +} +``` + +
+ +--- + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Localization.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Localization.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### locale + +Get the _full_ BCP 47 code, including script, region, variant, etc., for the preferred langauage/locale + +To get the value of `locale` call the method like this: + +```typescript +function locale(): Promise +``` + +Promise resolution: + +[Locale](../Localization/schemas/#Locale) + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------- | +| uses | xrn:firebolt:capability:localization:locale | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let locale = await Localization.locale() +console.log(locale) +``` + +Value of `locale`: + +```javascript +'en-US' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.locale", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "en-US" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let locale = await Localization.locale() +console.log(locale) +``` + +Value of `locale`: + +```javascript +'en-US' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.locale", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "es-US" +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function locale(callback: (value) => Locale): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let listenerId = await locale((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `locale`: + +```javascript +'en-US' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onLocaleChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "en-US" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let listenerId = await locale((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `locale`: + +```javascript +'en-US' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onLocaleChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "es-US" +} +``` + +
+ +--- + +### locality + +Get the locality/city the device is located in + +To get the value of `locality` call the method like this: + +```typescript +function locality(): Promise +``` + +Promise resolution: + +[Locality](../Localization/schemas/#Locality) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------------- | +| uses | xrn:firebolt:capability:localization:locality | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let locality = await Localization.locality() +console.log(locality) +``` + +Value of `locality`: + +```javascript +'Philadelphia' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.locality", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Philadelphia" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let locality = await Localization.locality() +console.log(locality) +``` + +Value of `locality`: + +```javascript +'Philadelphia' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.locality", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Rockville" +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function locality(callback: (value) => Locality): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let listenerId = await locality((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `locality`: + +```javascript +'Philadelphia' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onLocalityChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Philadelphia" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let listenerId = await locality((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `locality`: + +```javascript +'Philadelphia' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onLocalityChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Rockville" +} +``` + +
+ +--- + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Localization.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Localization.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### postalCode + +Get the postal code the device is located in + +To get the value of `postalCode` call the method like this: + +```typescript +function postalCode(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------------ | +| uses | xrn:firebolt:capability:localization:postal-code | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let postalCode = await Localization.postalCode() +console.log(postalCode) +``` + +Value of `postalCode`: + +```javascript +'19103' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.postalCode", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "19103" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let postalCode = await Localization.postalCode() +console.log(postalCode) +``` + +Value of `postalCode`: + +```javascript +'19103' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.postalCode", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "20850" +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function postalCode(callback: (value) => string): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let listenerId = await postalCode((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `postalCode`: + +```javascript +'19103' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onPostalCodeChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "19103" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let listenerId = await postalCode((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `postalCode`: + +```javascript +'19103' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onPostalCodeChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "20850" +} +``` + +
+ +--- + +### preferredAudioLanguages + +A prioritized list of ISO 639 1/2 codes for the preferred audio languages on this device. + +To get the value of `preferredAudioLanguages` call the method like this: + +```typescript +function preferredAudioLanguages(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------------- | +| uses | xrn:firebolt:capability:localization:language | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let languages = await Localization.preferredAudioLanguages() +console.log(languages) +``` + +Value of `languages`: + +```javascript +;['spa', 'eng'] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.preferredAudioLanguages", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": ["spa", "eng"] +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let languages = await Localization.preferredAudioLanguages() +console.log(languages) +``` + +Value of `languages`: + +```javascript +;['spa', 'eng'] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.preferredAudioLanguages", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": ["eng", "spa"] +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function preferredAudioLanguages( + callback: (value) => ISO639_2Language[], +): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let listenerId = await preferredAudioLanguages((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `languages`: + +```javascript +;['spa', 'eng'] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onPreferredAudioLanguagesChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": ["spa", "eng"] +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/sdk' + +let listenerId = await preferredAudioLanguages((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `languages`: + +```javascript +;['spa', 'eng'] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onPreferredAudioLanguagesChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": ["eng", "spa"] +} +``` + +
+ +--- + +## Events + +### countryCodeChanged + +See: [countryCode](#countrycode) + +### languageChanged + +See: [language](#language) + +### localeChanged + +See: [locale](#locale) + +### localityChanged + +See: [locality](#locality) + +### postalCodeChanged + +See: [postalCode](#postalcode) + +### preferredAudioLanguagesChanged + +See: [preferredAudioLanguages](#preferredaudiolanguages) + +## Types + +### LatLon + +```typescript +type LatLon = [ + number, // undefined item + number, // undefined item +] +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Localization/schemas/index.md b/apis/pr-fix-ci-fb-version/core/Localization/schemas/index.md new file mode 100644 index 000000000..53268719e --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Localization/schemas/index.md @@ -0,0 +1,79 @@ +--- +title: Localization + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Localization + +--- + +Version Localization 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [ISO639_2Language](#isolanguage) + - [Locality](#locality) + - [CountryCode](#countrycode) + - [Language](#language) + - [Locale](#locale) + - [TimeZone](#timezone) + +## Overview + +undefined + +## Types + +### ISO639_2Language + +```typescript + +``` + +--- + +### Locality + +```typescript + +``` + +--- + +### CountryCode + +```typescript + +``` + +--- + +### Language + +```typescript + +``` + +--- + +### Locale + +```typescript + +``` + +--- + +### TimeZone + +```typescript + +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Metrics/index.md b/apis/pr-fix-ci-fb-version/core/Metrics/index.md new file mode 100644 index 000000000..e7bcb7193 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Metrics/index.md @@ -0,0 +1,1624 @@ +--- +title: Metrics + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Metrics Module + +--- + +Version Metrics 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [action](#action) + - [appInfo](#appinfo) + - [error](#error) + - [mediaEnded](#mediaended) + - [mediaLoadStart](#medialoadstart) + - [mediaPause](#mediapause) + - [mediaPlay](#mediaplay) + - [mediaPlaying](#mediaplaying) + - [mediaProgress](#mediaprogress) + - [mediaRateChange](#mediaratechange) + - [mediaRenditionChange](#mediarenditionchange) + - [mediaSeeked](#mediaseeked) + - [mediaSeeking](#mediaseeking) + - [mediaWaiting](#mediawaiting) + - [page](#page) + - [ready](#ready) + - [signIn](#signin) + - [signOut](#signout) + - [startContent](#startcontent) + - [stopContent](#stopcontent) +- [Types](#types) + - [ErrorType](#errortype) + - [MediaPosition](#mediaposition) + +## Usage + +To use the Metrics module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Metrics } from '@firebolt-js/sdk' +``` + +## Overview + +Methods for sending metrics + +## Methods + +### action + +Inform the platform of something not covered by other Metrics APIs. + +```typescript +function action( + category: string, + type: string, + parameters: FlatMap, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------------ | -------------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------- | +| `category` | `string` | true | The category of action being logged. Must be 'user' for user-initated actions or 'app' for all other actions
values: `'user' \| 'app'` | +| `type` | `string` | true | A short, indexible identifier for the action, e.g. 'SignIn Prompt Displayed'
maxLength: 256 | +| `parameters` | [`FlatMap`](../Types/schemas/#FlatMap) | false | | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:metrics:general | + +#### Examples + +Send foo action + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.action('user', 'The user did foo', null) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.action", + "params": { + "category": "user", + "type": "The user did foo" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### appInfo + +Inform the platform about an app's build info. + +```typescript +function appInfo(build: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | -------- | -------- | -------------------------------- | +| `build` | `string` | true | The build / version of this app. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:metrics:general | + +#### Examples + +Send appInfo metric + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let result = await Metrics.appInfo('1.2.2') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.appInfo", + "params": { + "build": "1.2.2" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### error + +Inform the platform of an error that has occured in your app. + +```typescript +function error( + type: ErrorType, + code: string, + description: string, + visible: boolean, + parameters: FlatMap, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------------- | -------------------------------------- | -------- | -------------------------------------------------------------------------------------------------- | +| `type` | [`ErrorType`](#errortype) | true | The type of error
values: `'network' \| 'media' \| 'restriction' \| 'entitlement' \| 'other'` | +| `code` | `string` | true | an app-specific error code | +| `description` | `string` | true | A short description of the error | +| `visible` | `boolean` | true | Whether or not this error was visible to the user. | +| `parameters` | [`FlatMap`](../Types/schemas/#FlatMap) | false | Optional additional parameters to be logged with the error | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:metrics:general | + +#### Examples + +Send error metric + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.error( + 'media', + 'MEDIA-STALLED', + 'playback stalled', + true, + null, +) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.error", + "params": { + "type": "media", + "code": "MEDIA-STALLED", + "description": "playback stalled", + "visible": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### mediaEnded + +Called when playback has stopped because the end of the media was reached. + +```typescript +function mediaEnded(entityId: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ---------- | -------- | -------- | -------------------------- | +| `entityId` | `string` | true | The entityId of the media. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:metrics:media | + +#### Examples + +Send ended metric. + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.mediaEnded('345') +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.mediaEnded", + "params": { + "entityId": "345" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### mediaLoadStart + +Called when setting the URL of a media asset to play, in order to infer load time. + +```typescript +function mediaLoadStart(entityId: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ---------- | -------- | -------- | -------------------------- | +| `entityId` | `string` | true | The entityId of the media. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:metrics:media | + +#### Examples + +Send loadstart metric. + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.mediaLoadStart('345') +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.mediaLoadStart", + "params": { + "entityId": "345" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### mediaPause + +Called when media playback will pause due to an intentional pause operation. + +```typescript +function mediaPause(entityId: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ---------- | -------- | -------- | -------------------------- | +| `entityId` | `string` | true | The entityId of the media. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:metrics:media | + +#### Examples + +Send pause metric. + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.mediaPause('345') +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.mediaPause", + "params": { + "entityId": "345" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### mediaPlay + +Called when media playback should start due to autoplay, user-initiated play, or unpausing. + +```typescript +function mediaPlay(entityId: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ---------- | -------- | -------- | -------------------------- | +| `entityId` | `string` | true | The entityId of the media. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:metrics:media | + +#### Examples + +Send play metric. + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.mediaPlay('345') +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.mediaPlay", + "params": { + "entityId": "345" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### mediaPlaying + +Called when media playback actually starts due to autoplay, user-initiated play, unpausing, or recovering from a buffering interuption. + +```typescript +function mediaPlaying(entityId: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ---------- | -------- | -------- | -------------------------- | +| `entityId` | `string` | true | The entityId of the media. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:metrics:media | + +#### Examples + +Send playing metric. + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.mediaPlaying('345') +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.mediaPlaying", + "params": { + "entityId": "345" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### mediaProgress + +Called every 60 seconds as media playback progresses. + +```typescript +function mediaProgress( + entityId: string, + progress: MediaPosition, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ---------- | --------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `entityId` | `string` | true | The entityId of the media. | +| `progress` | [`MediaPosition`](#mediaposition) | true | Progress of playback, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:metrics:media | + +#### Examples + +Send progress metric. + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.mediaProgress('345', 0.75) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.mediaProgress", + "params": { + "entityId": "345", + "progress": 0.75 + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### mediaRateChange + +Called when the playback rate of media is changed. + +```typescript +function mediaRateChange(entityId: string, rate: number): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ---------- | -------- | -------- | -------------------------- | +| `entityId` | `string` | true | The entityId of the media. | +| `rate` | `number` | true | The new playback rate. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:metrics:media | + +#### Examples + +Send ratechange metric. + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.mediaRateChange('345', 2) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.mediaRateChange", + "params": { + "entityId": "345", + "rate": 2 + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### mediaRenditionChange + +Called when the playback rendition (e.g. bitrate, dimensions, profile, etc) is changed. + +```typescript +function mediaRenditionChange( + entityId: string, + bitrate: number, + width: number, + height: number, + profile: string, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ---------- | -------- | -------- | ------------------------------------------------- | +| `entityId` | `string` | true | The entityId of the media. | +| `bitrate` | `number` | true | The new bitrate in kbps. | +| `width` | `number` | true | The new resolution width. | +| `height` | `number` | true | The new resolution height. | +| `profile` | `string` | false | A description of the new profile, e.g. 'HDR' etc. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:metrics:media | + +#### Examples + +Send renditionchange metric. + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.mediaRenditionChange( + '345', + 5000, + 1920, + 1080, + 'HDR+', +) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.mediaRenditionChange", + "params": { + "entityId": "345", + "bitrate": 5000, + "width": 1920, + "height": 1080, + "profile": "HDR+" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### mediaSeeked + +Called when a seek is completed during media playback. + +```typescript +function mediaSeeked( + entityId: string, + position: MediaPosition, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ---------- | --------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `entityId` | `string` | true | The entityId of the media. | +| `position` | [`MediaPosition`](#mediaposition) | true | Resulting position of the seek operation, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:metrics:media | + +#### Examples + +Send seeked metric. + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.mediaSeeked('345', 0.51) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.mediaSeeked", + "params": { + "entityId": "345", + "position": 0.51 + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### mediaSeeking + +Called when a seek is initiated during media playback. + +```typescript +function mediaSeeking(entityId: string, target: MediaPosition): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ---------- | --------------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `entityId` | `string` | true | The entityId of the media. | +| `target` | [`MediaPosition`](#mediaposition) | true | Target destination of the seek, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:metrics:media | + +#### Examples + +Send seeking metric. + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.mediaSeeking('345', 0.5) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.mediaSeeking", + "params": { + "entityId": "345", + "target": 0.5 + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### mediaWaiting + +Called when media playback will halt due to a network, buffer, or other unintentional constraint. + +```typescript +function mediaWaiting(entityId: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ---------- | -------- | -------- | -------------------------- | +| `entityId` | `string` | true | The entityId of the media. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:metrics:media | + +#### Examples + +Send waiting metric. + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.mediaWaiting('345') +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.mediaWaiting", + "params": { + "entityId": "345" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### page + +Inform the platform that your user has navigated to a page or view. + +```typescript +function page(pageId: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| -------- | -------- | -------- | ----------------------- | +| `pageId` | `string` | true | Page ID of the content. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:metrics:general | + +#### Examples + +Send page metric + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.page('xyz') +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.page", + "params": { + "pageId": "xyz" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Send startContent metric w/ entity + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.page('home') +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.page", + "params": { + "pageId": "home" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### ready + +_This is an private RPC method._ + +Inform the platform that your app is minimally usable. This method is called automatically by `Lifecycle.ready()` + +Result: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:metrics:general | + +#### Examples + +Send ready metric + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.ready", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +--- + +### signIn + +_This is an private RPC method._ + +Log a sign in event, called by Discovery.signIn(). + +Result: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:metrics:general | + +#### Examples + +Send signIn metric + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.signIn", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +Send signIn metric with entitlements + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.signIn", + "params": { + "entitlements": [ + { + "entitlementId": "123", + "startTime": "2025-01-01T00:00:00.000Z", + "endTime": "2025-01-01T00:00:00.000Z" + } + ] + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +--- + +### signOut + +_This is an private RPC method._ + +Log a sign out event, called by Discovery.signOut(). + +Result: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:metrics:general | + +#### Examples + +Send signOut metric + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.signOut", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +--- + +### startContent + +Inform the platform that your user has started content. + +```typescript +function startContent(entityId: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ---------- | -------- | -------- | ---------------------------------- | +| `entityId` | `string` | false | Optional entity ID of the content. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:metrics:general | + +#### Examples + +Send startContent metric + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.startContent(null) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.startContent", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Send startContent metric w/ entity + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.startContent('abc') +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.startContent", + "params": { + "entityId": "abc" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +### stopContent + +Inform the platform that your user has stopped content. + +```typescript +function stopContent(entityId: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ---------- | -------- | -------- | ---------------------------------- | +| `entityId` | `string` | false | Optional entity ID of the content. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:metrics:general | + +#### Examples + +Send stopContent metric + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.stopContent(null) +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.stopContent", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Send stopContent metric w/ entity + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/sdk' + +let success = await Metrics.stopContent('abc') +console.log(success) +``` + +Value of `success`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.stopContent", + "params": { + "entityId": "abc" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +--- + +## Types + +### ErrorType + +```typescript +ErrorType: { + NETWORK: 'network', + MEDIA: 'media', + RESTRICTION: 'restriction', + ENTITLEMENT: 'entitlement', + OTHER: 'other', +}, + +``` + +--- + +### MediaPosition + +Represents a position inside playback content, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration. + +```typescript +type MediaPosition = void | number | number +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Parameters/index.md b/apis/pr-fix-ci-fb-version/core/Parameters/index.md new file mode 100644 index 000000000..817e57b5e --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Parameters/index.md @@ -0,0 +1,153 @@ +--- +title: Parameters + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Parameters Module + +--- + +Version Parameters 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [initialization](#initialization) +- [Types](#types) + - [AppInitialization](#appinitialization) + +## Usage + +To use the Parameters module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Parameters } from '@firebolt-js/sdk' +``` + +## Overview + +Methods for getting initialization parameters for an app cold launch. + +## Methods + +### initialization + +Returns any initialization parameters for the app, e.g. initialial `NavigationIntent`. + +```typescript +function initialization(): Promise +``` + +Promise resolution: + +[AppInitialization](#appinitialization) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:lifecycle:state | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Parameters } from '@firebolt-js/sdk' + +let init = await Parameters.initialization() +console.log(init) +``` + +Value of `init`: + +```javascript +{ + "lmt": 0, + "us_privacy": "1-Y-", + "discovery": { + "navigateTo": { + "action": "entity", + "data": { + "entityId": "abc", + "entityType": "program", + "programType": "movie" + }, + "context": { + "source": "voice" + } + } + } +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Parameters.initialization", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "lmt": 0, + "us_privacy": "1-Y-", + "discovery": { + "navigateTo": { + "action": "entity", + "data": { + "entityId": "abc", + "entityType": "program", + "programType": "movie" + }, + "context": { + "source": "voice" + } + } + } + } +} +``` + +
+ +--- + +## Types + +### AppInitialization + +```typescript +type AppInitialization = { + us_privacy?: string // The IAB US Privacy string. + lmt?: number // The IAB limit ad tracking opt out value. + discovery?: object + secondScreen?: object +} +``` + +See also: + +[NavigationIntent](../Intents/schemas/#NavigationIntent) +[SecondScreenEvent](../SecondScreen/schemas/#SecondScreenEvent) + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Profile/index.md b/apis/pr-fix-ci-fb-version/core/Profile/index.md new file mode 100644 index 000000000..3dd71505c --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Profile/index.md @@ -0,0 +1,232 @@ +--- +title: Profile + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Profile Module + +--- + +Version Profile 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [approveContentRating](#approvecontentrating) + - [approvePurchase](#approvepurchase) + - [flags](#flags) +- [Types](#types) + +## Usage + +To use the Profile module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Profile } from '@firebolt-js/sdk' +``` + +## Overview + +Methods for getting information about the current user/account profile + +## Methods + +### approveContentRating + +Verifies that the current profile should have access to mature/adult content. + +```typescript +function approveContentRating(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------- | +| uses | xrn:firebolt:capability:approve:content | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Profile } from '@firebolt-js/sdk' + +let allow = await Profile.approveContentRating() +console.log(allow) +``` + +Value of `allow`: + +```javascript +false +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Profile.approveContentRating", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### approvePurchase + +Verifies that the current profile should have access to making purchases. + +```typescript +function approvePurchase(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------- | +| uses | xrn:firebolt:capability:approve:purchase | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Profile } from '@firebolt-js/sdk' + +let allow = await Profile.approvePurchase() +console.log(allow) +``` + +Value of `allow`: + +```javascript +false +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Profile.approvePurchase", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### flags + +Get a map of profile flags for the current session. + +```typescript +function flags(): Promise +``` + +Promise resolution: + +[FlatMap](../Types/schemas/#FlatMap) + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:profile:flags | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Profile } from '@firebolt-js/sdk' + +let flags = await Profile.flags() +console.log(flags) +``` + +Value of `flags`: + +```javascript +{ + "userExperience": "1000" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Profile.flags", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "userExperience": "1000" + } +} +``` + +
+ +--- + +## Types diff --git a/apis/pr-fix-ci-fb-version/core/SecondScreen/index.md b/apis/pr-fix-ci-fb-version/core/SecondScreen/index.md new file mode 100644 index 000000000..f2fc16bc6 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/SecondScreen/index.md @@ -0,0 +1,572 @@ +--- +title: SecondScreen + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# SecondScreen Module + +--- + +Version SecondScreen 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [device](#device) + - [friendlyName](#friendlyname) + - [listen](#listen) + - [once](#once) + - [protocols](#protocols) +- [Events](#events) + - [closeRequest](#closerequest) + - [friendlyNameChanged](#friendlynamechanged) + - [launchRequest](#launchrequest) +- [Types](#types) + +## Usage + +To use the SecondScreen module, you can import it into your project from the Firebolt SDK: + +```javascript +import { SecondScreen } from '@firebolt-js/sdk' +``` + +## Overview + +Methods for communicating with second screen devices + +## Methods + +### device + +Get the broadcasted id for the device + +```typescript +function device(type: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------ | -------- | -------- | ----------------------------------------------- | +| `type` | `string` | false | The type of second screen protocol, e.g. "dial" | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:protocol:dial | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { SecondScreen } from '@firebolt-js/sdk' + +let deviceId = await SecondScreen.device(null) +console.log(deviceId) +``` + +Value of `deviceId`: + +```javascript +'device-id' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecondScreen.device", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "device-id" +} +``` + +
+ +--- + +### friendlyName + +Get the broadcasted friendly name for the device + +To get the value of `friendlyName` call the method like this: + +```typescript +function friendlyName(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:protocol:dial | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { SecondScreen } from '@firebolt-js/sdk' + +let friendlyName = await SecondScreen.friendlyName() +console.log(friendlyName) +``` + +Value of `friendlyName`: + +```javascript +'Living Room' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecondScreen.friendlyName", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Living Room" +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function friendlyName(callback: (value) => string): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { SecondScreen } from '@firebolt-js/sdk' + +let listenerId = await friendlyName((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `friendlyName`: + +```javascript +'Living Room' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecondScreen.onFriendlyNameChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Living Room" +} +``` + +
+ +--- + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `SecondScreen.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `SecondScreen.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `SecondScreen.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `SecondScreen.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### protocols + +Get the supported second screen discovery protocols + +```typescript +function protocols(): Promise +``` + +Promise resolution: + +[BooleanMap](../Types/schemas/#BooleanMap) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------------- | +| uses | xrn:firebolt:capability:secondscreen:protocol | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { SecondScreen } from '@firebolt-js/sdk' + +let protocols = await SecondScreen.protocols() +console.log(protocols) +``` + +Value of `protocols`: + +```javascript +{ + "dial1.7": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecondScreen.protocols", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "dial1.7": true + } +} +``` + +
+ +--- + +## Events + +### closeRequest + +```typescript +function listen('closeRequest', () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Event value: + +[SecondScreenEvent](../SecondScreen/schemas/#SecondScreenEvent) + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:protocol:dial | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { SecondScreen } from '@firebolt-js/sdk' + +SecondScreen.listen('closeRequest', (closeRequestEvent) => { + console.log(closeRequestEvent) +}) +``` + +Value of `closeRequestEvent`: + +```javascript +{ + "type": "dial", + "version": "1.7" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecondScreen.onCloseRequest", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "type": "dial", + "version": "1.7" + } +} +``` + +
+ +--- + +### friendlyNameChanged + +See: [friendlyName](#friendlyname) + +### launchRequest + +```typescript +function listen('launchRequest', () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Event value: + +[SecondScreenEvent](../SecondScreen/schemas/#SecondScreenEvent) + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:protocol:dial | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { SecondScreen } from '@firebolt-js/sdk' + +SecondScreen.listen('launchRequest', (launchRequestEvent) => { + console.log(launchRequestEvent) +}) +``` + +Value of `launchRequestEvent`: + +```javascript +{ + "type": "dial", + "version": "1.7", + "data": "{\"code\":\"AQDPQZiQcb3KQ7gY7yy5tHTMbbkGHR9Zjp-KL53H3eKBZIeAt7O9UKYPu6B21l2UZVmIqkFXDXBmXvK4g2e3EgZtjMNmKPsTltgnRl95DImtOXjSpWtTjSaOkW4w1kZKUTwLKdwVWTzBVH8ERHorvLU6vCGOVHxXt65LNwdl5HKRweShVC1V9QsyvRnQS61ov0UclmrH_xZML2Bt-Q-rZFjey5MjwupIb4x4f53XUJMhjHpDHoIUKrjpdPDQvK2a\",\"friendlyName\":\"Operator_TX061AEI\",\"UDN\":\"608fef11-2800-482a-962b-23a6690c93c1\"}" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecondScreen.onLaunchRequest", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "type": "dial", + "version": "1.7", + "data": "{\"code\":\"AQDPQZiQcb3KQ7gY7yy5tHTMbbkGHR9Zjp-KL53H3eKBZIeAt7O9UKYPu6B21l2UZVmIqkFXDXBmXvK4g2e3EgZtjMNmKPsTltgnRl95DImtOXjSpWtTjSaOkW4w1kZKUTwLKdwVWTzBVH8ERHorvLU6vCGOVHxXt65LNwdl5HKRweShVC1V9QsyvRnQS61ov0UclmrH_xZML2Bt-Q-rZFjey5MjwupIb4x4f53XUJMhjHpDHoIUKrjpdPDQvK2a\",\"friendlyName\":\"Operator_TX061AEI\",\"UDN\":\"608fef11-2800-482a-962b-23a6690c93c1\"}" + } +} +``` + +
+ +--- + +## Types diff --git a/apis/pr-fix-ci-fb-version/core/SecondScreen/schemas/index.md b/apis/pr-fix-ci-fb-version/core/SecondScreen/schemas/index.md new file mode 100644 index 000000000..60953e3ae --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/SecondScreen/schemas/index.md @@ -0,0 +1,40 @@ +--- +title: SecondScreen + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# SecondScreen + +--- + +Version SecondScreen 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [SecondScreenEvent](#secondscreenevent) + +## Overview + +undefined + +## Types + +### SecondScreenEvent + +An a message notification from a second screen device + +```typescript +type SecondScreenEvent = { + type: 'dial' + version?: string + data?: string +} +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/core/SecureStorage/index.md b/apis/pr-fix-ci-fb-version/core/SecureStorage/index.md new file mode 100644 index 000000000..43754b03d --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/SecureStorage/index.md @@ -0,0 +1,510 @@ +--- +title: SecureStorage + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# SecureStorage Module + +--- + +Version SecureStorage 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [clear](#clear) + - [get](#get) + - [remove](#remove) + - [set](#set) +- [Types](#types) + - [StorageScope](#storagescope) + - [StorageOptions](#storageoptions) + +## Usage + +To use the SecureStorage module, you can import it into your project from the Firebolt SDK: + +```javascript +import { SecureStorage } from '@firebolt-js/sdk' +``` + +## Overview + +A module for storing and retrieving secure data owned by the app + +## Methods + +### clear + +Clears all the secure data values + +```typescript +function clear(scope: StorageScope): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ------------------------------- | -------- | --------------------------------------------------------------- | +| `scope` | [`StorageScope`](#storagescope) | true | The scope of the key/value
values: `'device' \| 'account'` | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | -------------------------------------- | +| uses | xrn:firebolt:capability:storage:secure | + +#### Examples + +Clears all the data values of storage + +JavaScript: + +```javascript +import { SecureStorage } from '@firebolt-js/sdk' + +let success = await SecureStorage.clear('account') +console.log(success) +``` + +Value of `success`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecureStorage.clear", + "params": { + "scope": "account" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### get + +Get stored value by key + +```typescript +function get(scope: StorageScope, key: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ------------------------------- | -------- | --------------------------------------------------------------- | +| `scope` | [`StorageScope`](#storagescope) | true | The scope of the key/value
values: `'device' \| 'account'` | +| `key` | `string` | true | Key to get | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | -------------------------------------- | +| uses | xrn:firebolt:capability:storage:secure | + +#### Examples + +Successfully retrieve a refresh token with key authRefreshToken + +JavaScript: + +```javascript +import { SecureStorage } from '@firebolt-js/sdk' + +let value = await SecureStorage.get('device', 'authRefreshToken') +console.log(value) +``` + +Value of `value`: + +```javascript +'VGhpcyBub3QgYSByZWFsIHRva2VuLgo=' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecureStorage.get", + "params": { + "scope": "device", + "key": "authRefreshToken" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" +} +``` + +
+ +Attempt to retrieve a key with no value set + +JavaScript: + +```javascript +import { SecureStorage } from '@firebolt-js/sdk' + +let value = await SecureStorage.get('account', 'authRefreshToken') +console.log(value) +``` + +Value of `value`: + +```javascript +'VGhpcyBub3QgYSByZWFsIHRva2VuLgo=' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecureStorage.get", + "params": { + "scope": "account", + "key": "authRefreshToken" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### remove + +Remove a secure data value + +```typescript +function remove(scope: StorageScope, key: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ------------------------------- | -------- | -------------------------------------------------------------- | +| `scope` | [`StorageScope`](#storagescope) | true | The scope of the data key
values: `'device' \| 'account'` | +| `key` | `string` | true | Key to remove | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | -------------------------------------- | +| uses | xrn:firebolt:capability:storage:secure | + +#### Examples + +Remove the value with key authRefreshToken for device + +JavaScript: + +```javascript +import { SecureStorage } from '@firebolt-js/sdk' + +let success = await SecureStorage.remove('device', 'authRefreshToken') +console.log(success) +``` + +Value of `success`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecureStorage.remove", + "params": { + "scope": "device", + "key": "authRefreshToken" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Remove the value with key authRefreshToken for account + +JavaScript: + +```javascript +import { SecureStorage } from '@firebolt-js/sdk' + +let success = await SecureStorage.remove('account', 'authRefreshToken') +console.log(success) +``` + +Value of `success`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecureStorage.remove", + "params": { + "scope": "account", + "key": "authRefreshToken" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### set + +Set or update a secure data value + +```typescript +function set( + scope: StorageScope, + key: string, + value: string, + options: StorageOptions, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| --------- | ----------------------------------- | -------- | -------------------------------------------------------------- | +| `scope` | [`StorageScope`](#storagescope) | true | The scope of the data key
values: `'device' \| 'account'` | +| `key` | `string` | true | Key to set | +| `value` | `string` | true | Value to set | +| `options` | [`StorageOptions`](#storageoptions) | false | Optional parameters to set | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | -------------------------------------- | +| uses | xrn:firebolt:capability:storage:secure | + +#### Examples + +Set a refresh token with name authRefreshToken with optional paramter + +JavaScript: + +```javascript +import { SecureStorage } from '@firebolt-js/sdk' + +let success = await SecureStorage.set( + 'device', + 'authRefreshToken', + 'VGhpcyBub3QgYSByZWFsIHRva2VuLgo=', + { ttl: 600 }, +) +console.log(success) +``` + +Value of `success`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecureStorage.set", + "params": { + "scope": "device", + "key": "authRefreshToken", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=", + "options": { + "ttl": 600 + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Set a refresh token with name authRefreshToken without optional parameter + +JavaScript: + +```javascript +import { SecureStorage } from '@firebolt-js/sdk' + +let success = await SecureStorage.set( + 'account', + 'authRefreshToken', + 'VGhpcyBub3QgYSByZWFsIHRva2VuLgo=', + null, +) +console.log(success) +``` + +Value of `success`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecureStorage.set", + "params": { + "scope": "account", + "key": "authRefreshToken", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +## Types + +### StorageScope + +The scope of the data + +```typescript +StorageScope: { + DEVICE: 'device', + ACCOUNT: 'account', +}, + +``` + +--- + +### StorageOptions + +```typescript +type StorageOptions = { + ttl: number // Seconds from set time before the data expires and is removed +} +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/core/Types/schemas/index.md b/apis/pr-fix-ci-fb-version/core/Types/schemas/index.md new file mode 100644 index 000000000..d1d3c6520 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/Types/schemas/index.md @@ -0,0 +1,94 @@ +--- +title: Types + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +# Types + +--- + +Version Types 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [AudioProfile](#audioprofile) + - [SemanticVersion](#semanticversion) + - [LocalizedString](#localizedstring) + - [FlatMap](#flatmap) + - [BooleanMap](#booleanmap) + - [Timeout](#timeout) + +## Overview + +undefined + +## Types + +### AudioProfile + +```typescript +AudioProfile: { + STEREO: 'stereo', + DOLBY_DIGITAL_5_1: 'dolbyDigital5.1', + DOLBY_DIGITAL_5_1_PLUS: 'dolbyDigital5.1+', + DOLBY_ATMOS: 'dolbyAtmos', +}, + +``` + +--- + +### SemanticVersion + +```typescript +type SemanticVersion = { + major: number + minor: number + patch: number + readable: string +} +``` + +--- + +### LocalizedString + +Localized string supports either a simple `string` or a Map of language codes to strings. When using a simple `string`, the current preferred langauge from `Localization.langauge()` is assumed. + +```typescript +type LocalizedString = string | object +``` + +--- + +### FlatMap + +```typescript + +``` + +--- + +### BooleanMap + +```typescript +type BooleanMap = {} +``` + +--- + +### Timeout + +Defines the timeout in seconds. If the threshold for timeout is passed for any operation without a result it will throw an error. + +```typescript + +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/core/changelog.md b/apis/pr-fix-ci-fb-version/core/changelog.md new file mode 100644 index 000000000..593902de0 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/changelog.md @@ -0,0 +1,254 @@ +--- +title: Change Log + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- +# [1.4.0](https://github.com/rdkcentral/firebolt-apis/compare/v1.3.0...v1.4.0) (2024-23-09) + +### Minor Fixes + +* **Spec and Doc fixes** + * ([#302](https://github.com/rdkcentral/firebolt-apis/issues/302)) ([6010a85](https://github.com/rdkcentral/firebolt-apis/commit/6010a85e9883480aba71378391f5b6223645fb28)) + * Modified BooleanMap to enum for Device module. hdr(), hdcp() audio(), screenResolution(), and videoResolution() now have defined enums as result. + * Method descriptions have been updated for advertisingId(), hdcp(), hdr(), audio(), screenResolution(), and videoResolution(). + * Advertising.policy() now has associated with single capability - xrn:firebolt:capability:advertising:policy. + * Only enabled is the required field now for both ClosedCaptionsSettings and VoiceGuidanceSettings. + * ([#304](https://github.com/rdkcentral/firebolt-apis/issues/304)) ([191664b](https://github.com/rdkcentral/firebolt-apis/commit/191664b18355cca130d783f850727caf058e116a)) + * Search Intent now has suggested entities. + * Method descriptions have been updated for distributor(), platform(), model(), make(), and progress(). + * Localization.additionalInfo() now accepts number and boolean type additional properties along with string. + * SecondScreen.protocol() got new capability - xrn:firebolt:capability:secondscreen:protocol. +* Added individual sdk openrpcs to the doc specification ([#311](https://github.com/rdkcentral/firebolt-apis/issues/311)) ([ace1d64](https://github.com/rdkcentral/firebolt-apis/commit/ace1d644cac114c457a739a4e4cdfe8990a96fc8)) + +# [1.3.0](https://github.com/rdkcentral/firebolt-apis/compare/v1.2.0...v1.3.0) (2024-08-12) + +### Features + +* Add Metrics.appInfo API ([#294](https://github.com/rdkcentral/firebolt-apis/issues/294)) ([47264b5](https://github.com/rdkcentral/firebolt-apis/commit/47264b5c5c71fd117a52ca50f2e57315932905ad)) +* CPP App-Passthrough Logic ([#286](https://github.com/rdkcentral/firebolt-apis/issues/286)) ([4eb84ee](https://github.com/rdkcentral/firebolt-apis/commit/4eb84ee08c463915e3b13afec6603541ea0b1ae4)) +* OpenRPC version upgraded to 3.1.0 ([#298](https://github.com/rdkcentral/firebolt-apis/issues/298)) ([16b3305](https://github.com/rdkcentral/firebolt-apis/commit/16b3305201624acf904c98d8c414b9756d42aaa7)) + +# [1.2.0](https://github.com/rdkcentral/firebolt-apis/compare/v1.1.0...v1.2.0) (2024-06-14) + +### Bug Fixes + +* Add PlaylistEntity to EntityIntent ([9769d6d](https://github.com/rdkcentral/firebolt-apis/commit/9769d6d7d43f1d61dfcda16ba4806175c5cf7658)) +* Remove x-alternatives that don't exist ([#278](https://github.com/rdkcentral/firebolt-apis/issues/278)) ([e38ad5a](https://github.com/rdkcentral/firebolt-apis/commit/e38ad5a508fccb5c724cf0f03cbd67ad4a28378c)) +* Removed sdk as required field from Device.version ([#231](https://github.com/rdkcentral/firebolt-apis/issues/231)) ([ef3de3e](https://github.com/rdkcentral/firebolt-apis/commit/ef3de3e68619c6f666dd1d751b0acc25f6438122)) + +### Features + +* [Command and Control Intents](https://github.com/rdkcentral/firebolt-apis/blob/main/requirements/specifications/intents/command-and-control.md) ([#251](https://github.com/rdkcentral/firebolt-apis/issues/251)) ([c8f8dae](https://github.com/rdkcentral/firebolt-apis/commit/c8f8dae5a9a0f14a3815c04df5a55763823d4898)) +* [User Interest](https://github.com/rdkcentral/firebolt-apis/blob/main/requirements/specifications/discovery/user-interest.md) ([#170](https://github.com/rdkcentral/firebolt-apis/issues/170)) ([48a1094](https://github.com/rdkcentral/firebolt-apis/commit/48a1094aaab6418f09db662dbc81f090a34f32ed)) + +# [1.1.0](https://github.com/rdkcentral/firebolt-apis/compare/v1.0.0...v1.1.0) (2024-02-09) + +### Bug Fixes + +* Add Music to Playable entities ([#225](https://github.com/rdkcentral/firebolt-apis/issues/225)) ([22c9b71](https://github.com/rdkcentral/firebolt-apis/commit/22c9b71d3c0ee98d32585d1b365afabf8e64d6ed)) +* Modified account:uid to SHOULD ([#224](https://github.com/rdkcentral/firebolt-apis/issues/224)) ([70c8b24](https://github.com/rdkcentral/firebolt-apis/commit/70c8b24decfcbff2c32fb1b0d21290afc00a8432)) + +# [1.0.0](https://github.com/rdkcentral/firebolt-apis/compare/v0.17.1...v1.0.0) (2023-11-03) + +Upgraded to 1.0 at part of RDK6 release. This API is still compatibile with 0.x versions. + +### Bug Fixes + +* Updated Discovery.launch example with xrn:firebolt: application-type ([#187](https://github.com/rdkcentral/firebolt-apis/issues/187)) ([4dbbab3](https://github.com/rdkcentral/firebolt-apis/commit/4dbbab3d9fa68c0e5185ca72fd0170bae8a30139)) + +### Features + +* Added scope parameter for advertisingId ([#188](https://github.com/rdkcentral/firebolt-apis/issues/188)) +* Play Intent ([#151](https://github.com/rdkcentral/firebolt-apis/issues/151)) ([d1ddf3f](https://github.com/rdkcentral/firebolt-apis/commit/d1ddf3fb3b1f758315686ad2f6dc57c2b270f33a)) + +# [0.17.1](https://github.com/rdkcentral/firebolt-apis/compare/v0.17.0...v0.17.1) (2023-09-15) + +### Bug Fixes + +fix: Add enumerated values for fontFamily/fontEdge (#181) + +# [0.17.0](https://github.com/rdkcentral/firebolt-apis/compare/v0.16.0...v0.17.0) (2023-09-07) + +### Bug Fixes + +* fix: Using 3 letter ISO639 language codes ([#173](https://github.com/rdkcentral/firebolt-apis/issues/173)) + +# [0.15.0](https://github.com/rdkcentral/firebolt-apis/compare/v0.14.0...v0.15.0) (2023-07-31) + +### Bug Fixes + +* Rename Advisory "Committee" to "Board" ([#135](https://github.com/rdkcentral/firebolt-apis/issues/135)) ([ef410c4](https://github.com/rdkcentral/firebolt-apis/commit/ef410c43bbb32414c3aa1d11b43093565cc90edf)) +* window fix from firebolt-openrpc 2.0.3 ([8c06dd1](https://github.com/rdkcentral/firebolt-apis/commit/8c06dd1432822719f5634e2877b36efdf02a4809)) + +### Features + +* **Nullable CC Styles** Added support to set and get null in ClosedCaptions style fields ([#150](https://github.com/rdkcentral/firebolt-apis/issues/150)) ([9c511e4](https://github.com/rdkcentral/firebolt-apis/commit/9c511e4fddebcdf5dfc04e9e8e31f98ab7eef680)) +* **Window CC Styles** Added windowColor and windowOpacity to closedCaptions style ([#145](https://github.com/rdkcentral/firebolt-apis/issues/145)) ([f65b901](https://github.com/rdkcentral/firebolt-apis/commit/f65b9019bda22400df9b9634c332e720db38118d)) +* **Audio Descriptions** Audio Description and Preferred Audio Languages Settings ([#45](https://github.com/rdkcentral/firebolt-apis/issues/45)) ([58f6ea1](https://github.com/rdkcentral/firebolt-apis/commit/58f6ea1dde7a819883eb3da24f879b6a9ecc9a41)) + +# [0.14.0](https://github.com/rdkcentral/firebolt-apis/compare/v0.13.0...v0.14.0) (2023-06-22) + +### Bug Fixes + +* **VoiceGuidance** Change voice guidance limits to 0.5 and 2 ([#137](https://github.com/rdkcentral/firebolt-apis/issues/137)) ([b8f1944](https://github.com/rdkcentral/firebolt-apis/commit/b8f19449efd808639599b162aba61c08ec089c41)) + +### Features + +* **Capabilities** Allow granted in capability.info and capability.granted to be null ([#134](https://github.com/rdkcentral/firebolt-apis/issues/134)) ([c5c31ee](https://github.com/rdkcentral/firebolt-apis/commit/c5c31ee3c744ec018a57232d2e7b1caf41158ed6)) + +# [0.13.0](https://github.com/rdkcentral/firebolt-apis/compare/v0.12.0...v0.13.0) (2023-06-09) + +### Bug Fixes + +* Point to `firebolt-openrpc` 2.0.1 ([c57cb21](https://github.com/rdkcentral/firebolt-apis/commit/c57cb218343fd058e2e6e676d52d9d0c904ad9a8)) + +### Features + +* Add SecureStorage.clear method. ([#127](https://github.com/rdkcentral/firebolt-apis/issues/127)) ([4422c79](https://github.com/rdkcentral/firebolt-apis/commit/4422c79122fc35e7b35180254be52bf33c64ab5b)) + + +# [0.12.0](https://github.com/rdkcentral/firebolt-apis/compare/v0.11.0...v0.12.0) (2023-05-18) + +### Bug Fixes + +* The `title` and `identifiers` parameters are now required for `Discovery.watchNext()` ([#124](https://github.com/rdkcentral/firebolt-core-sdk/issues/124)) ([96d7b2b](https://github.com/rdkcentral/firebolt-core-sdk/commit/96d7b2bb7464d6044346440d37feecba9dbc7899)) +* Fixed handling of context parameters for `Capabilities.listen()`. + +# [0.11.0](https://github.com/rdkcentral/firebolt-core-sdk/compare/v0.10.0...v0.11.0) (2023-05-01) + + +### Bug Fixes + +* Change doc examples to https ([#79](https://github.com/rdkcentral/firebolt-core-sdk/issues/79)) ([0da43e6](https://github.com/rdkcentral/firebolt-core-sdk/commit/0da43e666842bb75d20f9585c0d1f3f0236388ee)) +* Updated secure storage spec to allow null as result value ([#84](https://github.com/rdkcentral/firebolt-core-sdk/issues/84)) ([7ed1fed](https://github.com/rdkcentral/firebolt-core-sdk/commit/7ed1fed9ab9f5d84927c4e31c2816e15da0d6f44)) + + +# [0.10.0](https://github.com/rdkcentral/firebolt-core-sdk/compare/v0.9.0...v0.10.0) (2023-02-06) + + +### Bug Fixes + +* Capability module needs capability tags ([#71](https://github.com/rdkcentral/firebolt-core-sdk/issues/71)) ([6f0af1b](https://github.com/rdkcentral/firebolt-core-sdk/commit/6f0af1b9712faab137b1652ea337d5f284196ad4)) +* Change doc examples to https ([#79](https://github.com/rdkcentral/firebolt-core-sdk/issues/79)) ([c7047af](https://github.com/rdkcentral/firebolt-core-sdk/commit/c7047af9f3fa47e8cd7d252c3bbd321fa8f3d125)) +* FIRESDK-31 returned response from Lifecycle.ready method ([#81](https://github.com/rdkcentral/firebolt-core-sdk/issues/81)) ([efc740f](https://github.com/rdkcentral/firebolt-core-sdk/commit/efc740f7899897981cc840f12efe30f3e9543be4)) +* Updated openrpc version to 1.8.0-next.2 ([#85](https://github.com/rdkcentral/firebolt-core-sdk/issues/85)) ([b988c41](https://github.com/rdkcentral/firebolt-core-sdk/commit/b988c4159b154f8c041b766f794618250448bce0)) +* Updated secure storage spec to allow null as result value ([#84](https://github.com/rdkcentral/firebolt-core-sdk/issues/84)) ([4117ad7](https://github.com/rdkcentral/firebolt-core-sdk/commit/4117ad79322c8a3decd59f5ad52d5dfe6cf2f2a4)) +* Use new openrpc template code with bug fixes ([#69](https://github.com/rdkcentral/firebolt-core-sdk/issues/69)) ([9fed6fc](https://github.com/rdkcentral/firebolt-core-sdk/commit/9fed6fcb71b9914e91674f5e80f7d61673cc66fe)) +* Word publish scripts ([#78](https://github.com/rdkcentral/firebolt-core-sdk/issues/78)) ([a3846e0](https://github.com/rdkcentral/firebolt-core-sdk/commit/a3846e0db22e1221547ad97a019aba3850c51f6a)) + + +### Features + +* Add content-access api, deprecate entitlements, remove availabi… ([#83](https://github.com/rdkcentral/firebolt-core-sdk/issues/83)) ([f3c8017](https://github.com/rdkcentral/firebolt-core-sdk/commit/f3c8017eb391119e47d810426fdae4b11d8e0c38)) +* Add Secure Storage module ([#77](https://github.com/rdkcentral/firebolt-core-sdk/issues/77)) ([f62e4ae](https://github.com/rdkcentral/firebolt-core-sdk/commit/f62e4aeb9325df00c6a2484cf3aaa0b756bd8113)) +* New Capabilities API ([#63](https://github.com/rdkcentral/firebolt-core-sdk/issues/63)) ([0ba5ef5](https://github.com/rdkcentral/firebolt-core-sdk/commit/0ba5ef5e030ce740e40fd5ad30ca5cfd100cf32e)) +* Trigger ([607825b](https://github.com/rdkcentral/firebolt-core-sdk/commit/607825bd5547c74a8a7707f751446ab0e069d9f9)) +* Turn on dryRun ([dcddc60](https://github.com/rdkcentral/firebolt-core-sdk/commit/dcddc6068f91505d97457ed04eb8e2996dab9278)) + + +# 0.9.0 + +### Features + +* Adding Availabilities API ([#65](https://github.com/rdkcentral/firebolt-core-sdk/issues/65)) ([ec940dd](https://github.com/rdkcentral/firebolt-core-sdk/commit/ec940dd1a7a6865f18d64ada69793c87556a172e)) +* Tagging Capabilities ([e3b6ee2](https://github.com/rdkcentral/firebolt-core-sdk/commit/e3b6ee2475fbd9157a40bc92490c06df135ebc34)) + +### Bug Fixes + +* Don't ignore source files when publishing to npm [skip ci] ([cb26ff2](https://github.com/rdkcentral/firebolt-core-sdk/commit/cb26ff2e09416613c5557e76966eccbe0ec66d54)) +* Build SDK before npm publish ([#64](https://github.com/rdkcentral/firebolt-core-sdk/issues/64)) ([f221fa3](https://github.com/rdkcentral/firebolt-core-sdk/commit/f221fa34e24e29e86487b1ec98468b64f495d134)) +* **Lifecycle:** lifecycle state api returns correct state in all circumstances ([31e405c](https://github.com/rdkcentral/firebolt-core-sdk/commit/31e405c124d29a3e87294dc4b356ff8df9972af8)) + +# 0.8.1 + +- Added Device.version().firmware to surface the underlying hardware firmware version +- Added Device.version().api to surface the latest Firebolt API supported by this device +- Deprecated Device.version().os which does not have a formal specification. Use `firmware` instead. + +# 0.8.0 + +- Tune Intents are now supported in `navigateTo` events +- Added TypeScript declarations for Settings and Events +- Fixed/Removed test-enabling code from SDK +- Fixed bug where the SDK would initialize itself even when not being used + +# 0.7.0 + +- Removed all `bigint` types from TypeScript declarations, in favor of `number`, since bigint is not widely supported across browsers. This changes impacts: + - Device.screenResolution + - Device.videoResolution + - Discovery.purchasedContent + - Metrics.mediaProgress + - Metrics.mediaSeeking + - Metrics.mediaSeeked + - Parameters.initialization + +To upgrade to 0.7.0 simply change the type of any Firebolt Promise resolutions from `bigint` to `number`, e.g.: + +```typescript +const res:[bigint, bigint] = await Device.screenResolution() +``` + +Should become: + +```typescript +const res:[number, number] = await Device.screenResolution() +``` + +# 0.6.2 + +- Fixed incompatibility with Jest 26 due to [jest/issues/10565](https://github.com/facebook/jest/issues/10565) + + +# 0.6.1 + +- Changed Firebolt build to use `.mjs` extension +- Firebolt builds are now pure ES6 modules, not bundled with Webpack +- Added `types` path to package.json +- Fixed TypeScript declarations for `FlatMap` and `BooleanMap` +- Added TypeScript return type declarations for `listen` and `once` (all modules) +- Added TypeScript declaration for `clear` method (all modules) +- Changed `{}` return type to `void` for listener callbacks + +# 0.6.0 + +- Added support for [rdkcentral/mock-firebolt](https://github.com/rdkcentral/mock-firebolt/) via a WebSocket transport layer +- Deprecated Accessibility.closedCaptions and voiceGuidance, created properties for Accessibility.closedCaptionsSettings and voiceGuidanceSettings, which support subscribers +- Deprecated Device.listen('deviceNameChanged'), added support for subscribing to Device.name() +- Added support for subscribing to property changes: Device.audio, hdcp, hdr, name, network, screenResolution, videoResolution, Advertising.policy, Discovery.policy, Localization.language +- Added proper TypeScript declarations for Discovery.entityInfo and Discovery.purchasedContent +- Fixed race condition w/ Transport Layer initialization + +# 0.5.2 + +- Added Parameters modules +- Fixed typo in Advertising.config example result for docs/Mock +- Updated Metrics.error signature to include `type` as first parameter +- Created window.__firebolt.testHarness handshake (for Mock TL only) +- Added `LocalizedString` type for localized string dictionaries +- Updated `Discovery.watchNext` to use `LocalizedString` for `title` and each property of `images` +- Added `OfferingType` and `ProgramType` parameters to `Discovery.purchasedContent` + +# 0.5.1 + +- Cleaned up errors in various Mock responses +- Methods that call private Metrics APIs, e.g. Lifecycle.ready, now do so **after** promise resolution + +# 0.5.0 + +- Updated TS declarations (.d.ts) to detect which event is being passed to `.listen()` methods +- Updated all `listen()` and `once()` methods to return a `Promise` +- Renamed `verifyContentRating` and `verifyPurchase` to `approveContentRating` and `approvePurchase` respectively +- Added `Profile.flags()` for distributor-specific profile flags +- Added optional `source` field to all `LifecycleEvents` +- Complete rewrite of `Metrics` APIs (see docs) +- Added `policyChanged` events to `Discovery` and `Advertising` +- Fixed duplicate RPC `listen` calls when listening to an event in slightly different ways, e.g. `once()` vs `listen()` +- Added Account, Authentication, Keyboard, Profile, SecondScreen modules +- Added Federated Search APIs to Discovery +- Added TypeScript/Intellisense declarations file +- Fixed spelling error on Accessibility module name +- Moved the `coppa` parameter for `Advertising.confg()` into the `options` object, and made it optional +- Final version of `Advertising.policy().skipRestriction` semantics diff --git a/apis/pr-fix-ci-fb-version/core/index.md b/apis/pr-fix-ci-fb-version/core/index.md new file mode 100644 index 000000000..22ac4ced9 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/core/index.md @@ -0,0 +1,30 @@ +--- +title: Firebolt Core SDK + +version: pr-fix-ci-fb-version +layout: default +sdk: core +--- + +[![semantic-release: conventional](https://img.shields.io/badge/semantic--release-conventional-e10079?logo=semantic-release)](https://github.com/semantic-release/semantic-release) + +# Firebolt Core SDK +The primary Firebolt SDK for building Firebolt compliant apps. + +## Usage +To install, run: + +``` +npm install @firebolt-js/sdk +``` + +To use the package, import one of it's modules, e.g.: + +```js +import { Lifecycle } from '@firebolt-js/sdk' +``` + +## Contributing +The Firebolt Core SDK is built using the Firebolt OpenRPC toolset: + +See [Firebolt OpenRPC](https://www.github.com/rdkcentral/firebolt-openrpc/), for more info. diff --git a/apis/pr-fix-ci-fb-version/discovery/Accessibility/schemas/index.md b/apis/pr-fix-ci-fb-version/discovery/Accessibility/schemas/index.md new file mode 100644 index 000000000..63445487c --- /dev/null +++ b/apis/pr-fix-ci-fb-version/discovery/Accessibility/schemas/index.md @@ -0,0 +1,154 @@ +--- +title: Accessibility + +version: pr-fix-ci-fb-version +layout: default +sdk: discovery +--- + +# Accessibility + +--- + +Version Accessibility 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [FontFamily](#fontfamily) + - [VoiceSpeed](#voicespeed) + - [VoiceGuidanceSettings](#voiceguidancesettings) + - [FontSize](#fontsize) + - [Color](#color) + - [FontEdge](#fontedge) + - [Opacity](#opacity) + - [HorizontalAlignment](#horizontalalignment) + - [VerticalAlignment](#verticalalignment) + - [ClosedCaptionsStyles](#closedcaptionsstyles) + - [ClosedCaptionsSettings](#closedcaptionssettings) + +## Overview + +undefined + +## Types + +### FontFamily + +```typescript + +``` + +--- + +### VoiceSpeed + +```typescript + +``` + +--- + +### VoiceGuidanceSettings + +```typescript +type VoiceGuidanceSettings = { + enabled: boolean // Whether or not voice guidance should be enabled by default + speed?: VoiceSpeed // The speed at which voice guidance speech will be read back to the user +} +``` + +See also: + +[VoiceSpeed](#voicespeed) + +--- + +### FontSize + +```typescript + +``` + +--- + +### Color + +```typescript + +``` + +--- + +### FontEdge + +```typescript + +``` + +--- + +### Opacity + +```typescript + +``` + +--- + +### HorizontalAlignment + +```typescript + +``` + +--- + +### VerticalAlignment + +```typescript + +``` + +--- + +### ClosedCaptionsStyles + +The default styles to use when displaying closed-captions + +```typescript +type ClosedCaptionsStyles = { + fontFamily?: string + fontSize?: number + fontColor?: string + fontEdge?: string + fontEdgeColor?: string + fontOpacity?: number + backgroundColor?: string + backgroundOpacity?: number + textAlign?: string + textAlignVertical?: string + windowColor?: string + windowOpacity?: number +} +``` + +--- + +### ClosedCaptionsSettings + +```typescript +type ClosedCaptionsSettings = { + enabled: boolean // Whether or not closed-captions should be enabled by default + styles?: ClosedCaptionsStyles // The default styles to use when displaying closed-captions + preferredLanguages?: string[] +} +``` + +See also: + +[ClosedCaptionsStyles](#closedcaptionsstyles) + +--- diff --git a/apis/pr-fix-ci-fb-version/discovery/Advertising/schemas/index.md b/apis/pr-fix-ci-fb-version/discovery/Advertising/schemas/index.md new file mode 100644 index 000000000..ef0126879 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/discovery/Advertising/schemas/index.md @@ -0,0 +1,53 @@ +--- +title: Advertising + +version: pr-fix-ci-fb-version +layout: default +sdk: discovery +--- + +# Advertising + +--- + +Version Advertising 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [SkipRestriction](#skiprestriction) + +## Overview + +undefined + +## Types + +### SkipRestriction + +The advertisement skip restriction. + +Applies to fast-forward/rewind (e.g. trick mode), seeking over an entire opportunity (e.g. jump), seeking out of what's currently playing, and "Skip this ad..." features. Seeking over multiple ad opportunities only requires playback of the _last_ opportunity, not all opportunities, preceding the seek destination. + +| Value | Description | +| ------------ | ------------------------------------------------------------------------------ | +| none | No fast-forward, jump, or skip restrictions | +| adsUnwatched | Restrict fast-forward, jump, and skip for unwatched ad opportunities only. | +| adsAll | Restrict fast-forward, jump, and skip for all ad opportunities | +| all | Restrict fast-forward, jump, and skip for all ad opportunities and all content | + +Namespace: `xrn:advertising:policy:skipRestriction:` + +```typescript +SkipRestriction: { + NONE: 'none', + ADS_UNWATCHED: 'adsUnwatched', + ADS_ALL: 'adsAll', + ALL: 'all', +}, + +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/discovery/Capabilities/schemas/index.md b/apis/pr-fix-ci-fb-version/discovery/Capabilities/schemas/index.md new file mode 100644 index 000000000..194b71637 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/discovery/Capabilities/schemas/index.md @@ -0,0 +1,121 @@ +--- +title: Capabilities + +version: pr-fix-ci-fb-version +layout: default +sdk: discovery +--- + +# Capabilities + +--- + +Version Capabilities 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [Role](#role) + - [DenyReason](#denyreason) + - [Capability](#capability) + - [CapPermissionStatus](#cappermissionstatus) + - [CapabilityInfo](#capabilityinfo) + - [Permission](#permission) + +## Overview + +undefined + +## Types + +### Role + +Role provides access level for the app for a given capability. + +```typescript +Role: { + USE: 'use', + MANAGE: 'manage', + PROVIDE: 'provide', +}, + +``` + +--- + +### DenyReason + +Reasons why a Capability might not be invokable + +```typescript +DenyReason: { + UNPERMITTED: 'unpermitted', + UNSUPPORTED: 'unsupported', + DISABLED: 'disabled', + UNAVAILABLE: 'unavailable', + GRANT_DENIED: 'grantDenied', + UNGRANTED: 'ungranted', +}, + +``` + +--- + +### Capability + +A Capability is a discrete unit of functionality that a Firebolt device might be able to perform. + +```typescript + +``` + +--- + +### CapPermissionStatus + +```typescript + +``` + +--- + +### CapabilityInfo + +```typescript +type CapabilityInfo = { + capability?: Capability // A Capability is a discrete unit of functionality that a Firebolt device might be able to perform. + supported: boolean // Provides info whether the capability is supported + available: boolean // Provides info whether the capability is available + use: object + manage: object + provide: object + details?: DenyReason[] // Reasons why a Capability might not be invokable +} +``` + +See also: + +[Capability](#capability) +[DenyReason](#denyreason) + +--- + +### Permission + +A capability combined with a Role, which an app may be permitted (by a distributor) or granted (by an end user). + +```typescript +type Permission = { + role?: Role // Role provides access level for the app for a given capability. + capability: Capability // A Capability is a discrete unit of functionality that a Firebolt device might be able to perform. +} +``` + +See also: + +[Role](#role) +[Capability](#capability) + +--- diff --git a/apis/pr-fix-ci-fb-version/discovery/Content/index.md b/apis/pr-fix-ci-fb-version/discovery/Content/index.md new file mode 100644 index 000000000..83166ad9c --- /dev/null +++ b/apis/pr-fix-ci-fb-version/discovery/Content/index.md @@ -0,0 +1,434 @@ +--- +title: Content + +version: pr-fix-ci-fb-version +layout: default +sdk: discovery +--- + +# Content Module + +--- + +Version Content 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [listen](#listen) + - [once](#once) + - [requestUserInterest](#requestuserinterest) +- [Events](#events) + - [userInterest](#userinterest) +- [Types](#types) + - [InterestResult](#interestresult) + - [InterestEvent](#interestevent) + +## Usage + +To use the Content module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Content } from '@firebolt-js/discovery-sdk' +``` + +## Overview + +undefined + +## Methods + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ----------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Content.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ----------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Content.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ----------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Content.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ----------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Content.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### requestUserInterest + +Provide information about the entity currently displayed or selected on the screen. + +```typescript +function requestUserInterest( + type: InterestType, + reason: InterestReason, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| -------- | -------------------------------------------------------- | -------- | ------------------------------------------------------ | +| `type` | [`InterestType`](../Discovery/schemas/#InterestType) | true |
values: `'interest' \| 'disinterest'` | +| `reason` | [`InterestReason`](../Discovery/schemas/#InterestReason) | true |
values: `'playlist' \| 'reaction' \| 'recording'` | + +Promise resolution: + +[InterestResult](#interestresult) + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------ | +| uses | xrn:firebolt:capability:discovery:interest | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Content } from '@firebolt-js/discovery-sdk' + +let interest = await Content.requestUserInterest('interest', 'playlist') +console.log(interest) +``` + +Value of `interest`: + +```javascript +{ + "appId": "cool-app", + "entity": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Content.requestUserInterest", + "params": { + "type": "interest", + "reason": "playlist" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "appId": "cool-app", + "entity": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + } +} +``` + +
+ +--- + +## Events + +### userInterest + +```typescript +function listen('userInterest', () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Event value: + +[InterestEvent](#interestevent) + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------ | +| uses | xrn:firebolt:capability:discovery:interest | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Content } from '@firebolt-js/discovery-sdk' + +Content.listen('userInterest', (interest) => { + console.log(interest) +}) +``` + +Value of `interest`: + +```javascript +{ + "appId": "cool-app", + "type": "interest", + "reason": "playlist", + "entity": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Content.onUserInterest", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "appId": "cool-app", + "type": "interest", + "reason": "playlist", + "entity": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + } +} +``` + +
+ +--- + +## Types + +### InterestResult + +```typescript +type InterestResult = { + appId: string + entity: EntityDetails +} +``` + +See also: + +[EntityDetails](../Entity/schemas/#EntityDetails) + +--- + +### InterestEvent + +```typescript +type InterestEvent = { + appId: string + type: InterestType + reason: InterestReason + entity: EntityDetails +} +``` + +See also: + +[InterestType](../Discovery/schemas/#InterestType) +[InterestReason](../Discovery/schemas/#InterestReason) +[EntityDetails](../Entity/schemas/#EntityDetails) + +--- diff --git a/apis/pr-fix-ci-fb-version/discovery/Discovery/schemas/index.md b/apis/pr-fix-ci-fb-version/discovery/Discovery/schemas/index.md new file mode 100644 index 000000000..c5b314adb --- /dev/null +++ b/apis/pr-fix-ci-fb-version/discovery/Discovery/schemas/index.md @@ -0,0 +1,88 @@ +--- +title: Discovery + +version: pr-fix-ci-fb-version +layout: default +sdk: discovery +--- + +# Discovery + +--- + +Version Discovery 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [InterestType](#interesttype) + - [InterestReason](#interestreason) + - [EntityInfoResult](#entityinforesult) + - [PurchasedContentResult](#purchasedcontentresult) + +## Overview + +undefined + +## Types + +### InterestType + +```typescript +InterestType: { + INTEREST: 'interest', + DISINTEREST: 'disinterest', +}, + +``` + +--- + +### InterestReason + +```typescript +InterestReason: { + PLAYLIST: 'playlist', + REACTION: 'reaction', + RECORDING: 'recording', +}, + +``` + +--- + +### EntityInfoResult + +The result for an `entityInfo()` push or pull. + +```typescript +type EntityInfoResult = { + expires: string + entity: EntityInfo // An EntityInfo object represents an "entity" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type. + related?: EntityInfo[] // An EntityInfo object represents an "entity" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type. +} +``` + +See also: + +[EntityInfo](../Entertainment/schemas/#EntityInfo) + +--- + +### PurchasedContentResult + +```typescript +type PurchasedContentResult = { + expires: string + totalCount: number + entries: EntityInfo[] // An EntityInfo object represents an "entity" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type. +} +``` + +See also: + +[EntityInfo](../Entertainment/schemas/#EntityInfo) + +--- diff --git a/apis/pr-fix-ci-fb-version/discovery/Entertainment/schemas/index.md b/apis/pr-fix-ci-fb-version/discovery/Entertainment/schemas/index.md new file mode 100644 index 000000000..7f022b666 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/discovery/Entertainment/schemas/index.md @@ -0,0 +1,285 @@ +--- +title: Entertainment + +version: pr-fix-ci-fb-version +layout: default +sdk: discovery +--- + +# Entertainment + +--- + +Version Entertainment 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [OfferingType](#offeringtype) + - [MusicType](#musictype) + - [ProgramType](#programtype) + - [ContentRating](#contentrating) +- [United States](#united-states) +- [Canada](#canada) + - [ContentIdentifiers](#contentidentifiers) + - [Entitlement](#entitlement) + - [WayToWatch](#waytowatch) + - [EntityInfo](#entityinfo) + +## Overview + +undefined + +## Types + +### OfferingType + +The offering type of the WayToWatch. + +```typescript +OfferingType: { + FREE: 'free', + SUBSCRIBE: 'subscribe', + BUY: 'buy', + RENT: 'rent', +}, + +``` + +--- + +### MusicType + +In the case of a music `entityType`, specifies the type of music entity. + +```typescript +MusicType: { + SONG: 'song', + ALBUM: 'album', +}, + +``` + +--- + +### ProgramType + +In the case of a program `entityType`, specifies the program type. + +```typescript +ProgramType: { + MOVIE: 'movie', + EPISODE: 'episode', + SEASON: 'season', + SERIES: 'series', + OTHER: 'other', + PREVIEW: 'preview', + EXTRA: 'extra', + CONCERT: 'concert', + SPORTING_EVENT: 'sportingEvent', + ADVERTISEMENT: 'advertisement', + MUSIC_VIDEO: 'musicVideo', + MINISODE: 'minisode', +}, + +``` + +--- + +### ContentRating + +A ContentRating represents an age or content based of an entity. Supported rating schemes and associated types are below. + +## United States + +`US-Movie` (MPAA): + +Ratings: `NR`, `G`, `PG`, `PG13`, `R`, `NC17` + +Advisories: `AT`, `BN`, `SL`, `SS`, `N`, `V` + +`US-TV` (Vchip): + +Ratings: `TVY`, `TVY7`, `TVG`, `TVPG`, `TV14`, `TVMA` + +Advisories: `FV`, `D`, `L`, `S`, `V` + +## Canada + +`CA-Movie` (OFRB): + +Ratings: `G`, `PG`, `14A`, `18A`, `R`, `E` + +`CA-TV` (AGVOT) + +Ratings: `E`, `C`, `C8`, `G`, `PG`, `14+`, `18+` + +Advisories: `C`, `C8`, `G`, `PG`, `14+`, `18+` + +`CA-Movie-Fr` (Canadian French language movies): + +Ratings: `G`, `8+`, `13+`, `16+`, `18+` + +`CA-TV-Fr` (Canadian French language TV): + +Ratings: `G`, `8+`, `13+`, `16+`, `18+` + +```typescript +type ContentRating = { + scheme: + | 'CA-Movie' + | 'CA-TV' + | 'CA-Movie-Fr' + | 'CA-TV-Fr' + | 'US-Movie' + | 'US-TV' // The rating scheme. + rating: string // The content rating. + advisories?: string[] // Optional list of subratings or content advisories. +} +``` + +--- + +### ContentIdentifiers + +The ContentIdentifiers object is how the app identifies an entity or asset to +the Firebolt platform. These ids are used to look up metadata and deep link into +the app. + +Apps do not need to provide all ids. They only need to provide the minimum +required to target a playable stream or an entity detail screen via a deep link. +If an id isn't needed to get to those pages, it doesn't need to be included. + +```typescript +type ContentIdentifiers = { + assetId?: string // Identifies a particular playable asset. For example, the HD version of a particular movie separate from the UHD version. + entityId?: string // Identifies an entity, such as a Movie, TV Series or TV Episode. + seasonId?: string // The TV Season for a TV Episode. + seriesId?: string // The TV Series for a TV Episode or TV Season. + appContentData?: string // App-specific content identifiers. +} +``` + +--- + +### Entitlement + +```typescript +type Entitlement = { + entitlementId: string + startTime?: string + endTime?: string +} +``` + +--- + +### WayToWatch + +A WayToWatch describes a way to watch a video program. It may describe a single +streamable asset or a set of streamable assets. For example, an app provider may +describe HD, SD, and UHD assets as individual WayToWatch objects or rolled into +a single WayToWatch. + +If the WayToWatch represents a single streamable asset, the provided +ContentIdentifiers must be sufficient to play back the specific asset when sent +via a playback intent or deep link. If the WayToWatch represents multiple +streamable assets, the provided ContentIdentifiers must be sufficient to +playback one of the assets represented with no user action. In this scenario, +the app SHOULD choose the best asset for the user based on their device and +settings. The ContentIdentifiers MUST also be sufficient for navigating the user +to the appropriate entity or detail screen via an entity intent. + +The app should set the `entitled` property to indicate if the user can watch, or +not watch, the asset without making a purchase. If the entitlement is known to +expire at a certain time (e.g., a rental), the app should also provide the +`entitledExpires` property. If the entitlement is not expired, the UI will use +the `entitled` property to display watchable assets to the user, adjust how +assets are presented to the user, and how intents into the app are generated. +For example, the the Aggregated Experience could render a "Watch" button for an +entitled asset versus a "Subscribe" button for an non-entitled asset. + +The app should set the `offeringType` to define how the content may be +authorized. The UI will use this to adjust how content is presented to the user. + +A single WayToWatch cannot represent streamable assets available via multiple +purchase paths. If, for example, an asset has both Buy, Rent and Subscription +availability, the three different entitlement paths MUST be represented as +multiple WayToWatch objects. + +`price` should be populated for WayToWatch objects with `buy` or `rent` +`offeringType`. If the WayToWatch represents a set of assets with various price +points, the `price` provided must be the lowest available price. + +```typescript +type WayToWatch = { + identifiers: ContentIdentifiers // The ContentIdentifiers object is how the app identifies an entity or asset to + expires?: string // Time when the WayToWatch is no longer available. + entitled?: boolean // Specify if the user is entitled to watch the entity. + entitledExpires?: string // Time when the entity is no longer entitled. + offeringType?: OfferingType // The offering type of the WayToWatch. + hasAds?: boolean // True if the streamable asset contains ads. + price?: number // For "buy" and "rent" WayToWatch, the price to buy or rent in the user's preferred currency. + videoQuality?: 'SD' | 'HD' | 'UHD'[] // List of the video qualities available via the WayToWatch. + audioProfile: AudioProfile[] // List of the audio types available via the WayToWatch. + audioLanguages?: string[] // List of audio track languages available on the WayToWatch. The first is considered the primary language. Languages are expressed as ISO 639 1/2 codes. + closedCaptions?: string[] // List of languages for which closed captions are available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes. + subtitles?: string[] // List of languages for which subtitles are available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes. + audioDescriptions?: string[] // List of languages for which audio descriptions (DVD) as available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes. +} +``` + +See also: + +[ContentIdentifiers](#contentidentifiers) +[OfferingType](#offeringtype) +[AudioProfile](../Types/schemas/#AudioProfile) + +--- + +### EntityInfo + +An EntityInfo object represents an "entity" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type. + +Additionally, EntityInfo objects must specify a properly formed +ContentIdentifiers object, `entityType`, and `title`. The app should provide +the `synopsis` property for a good user experience if the content +metadata is not available another way. + +The ContentIdentifiers must be sufficient for navigating the user to the +appropriate entity or detail screen via a `detail` intent or deep link. + +EntityInfo objects must provide at least one WayToWatch object when returned as +part of an `entityInfo` method and a streamable asset is available to the user. +It is optional for the `purchasedContent` method, but recommended because the UI +may use those data. + +```typescript +type EntityInfo = { + identifiers: ContentIdentifiers // The ContentIdentifiers object is how the app identifies an entity or asset to + title: string // Title of the entity. + entityType: 'program' | 'music' // The type of the entity, e.g. `program` or `music`. + programType?: ProgramType // In the case of a program `entityType`, specifies the program type. + musicType?: MusicType // In the case of a music `entityType`, specifies the type of music entity. + synopsis?: string // Short description of the entity. + seasonNumber?: number // For TV seasons, the season number. For TV episodes, the season that the episode belongs to. + seasonCount?: number // For TV series, seasons, and episodes, the total number of seasons. + episodeNumber?: number // For TV episodes, the episode number. + episodeCount?: number // For TV seasons and episodes, the total number of episodes in the current season. + releaseDate?: string // The date that the program or entity was released or first aired. + contentRatings?: ContentRating[] // A ContentRating represents an age or content based of an entity. Supported rating schemes and associated types are below. + waysToWatch?: WayToWatch[] // A WayToWatch describes a way to watch a video program. It may describe a single +} +``` + +See also: + +[ContentIdentifiers](#contentidentifiers) +[ProgramType](#programtype) +[MusicType](#musictype) +[ContentRating](#contentrating) +[WayToWatch](#waytowatch) + +--- diff --git a/apis/pr-fix-ci-fb-version/discovery/Entity/schemas/index.md b/apis/pr-fix-ci-fb-version/discovery/Entity/schemas/index.md new file mode 100644 index 000000000..bdb1e431c --- /dev/null +++ b/apis/pr-fix-ci-fb-version/discovery/Entity/schemas/index.md @@ -0,0 +1,287 @@ +--- +title: Entity + +version: pr-fix-ci-fb-version +layout: default +sdk: discovery +--- + +# Entity + +--- + +Version Entity 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [MovieEntity](#movieentity) + - [Metadata](#metadata) + - [MusicEntity](#musicentity) + - [ChannelEntity](#channelentity) + - [UntypedEntity](#untypedentity) + - [PlaylistEntity](#playlistentity) + - [TVEpisodeEntity](#tvepisodeentity) + - [TVSeasonEntity](#tvseasonentity) + - [TVSeriesEntity](#tvseriesentity) + - [AdditionalEntity](#additionalentity) + - [ProgramEntity](#programentity) + - [Entity](#entity) + - [EntityDetails](#entitydetails) + - [PlayableEntity](#playableentity) + +## Overview + +undefined + +## Types + +### MovieEntity + +A Firebolt compliant representation of a Movie entity. + +```typescript +type MovieEntity = { + entityType: 'program' + programType: 'movie' + entityId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### Metadata + +```typescript +type Metadata = { + title?: string // Title of the entity. + synopsis?: string // Short description of the entity. + seasonNumber?: number // For TV seasons, the season number. For TV episodes, the season that the episode belongs to. + seasonCount?: number // For TV series, seasons, and episodes, the total number of seasons. + episodeNumber?: number // For TV episodes, the episode number. + episodeCount?: number // For TV seasons and episodes, the total number of episodes in the current season. + releaseDate?: string // The date that the program or entity was released or first aired. + contentRatings?: ContentRating[] // A ContentRating represents an age or content based of an entity. Supported rating schemes and associated types are below. +} +``` + +See also: + +[ContentRating](../Entertainment/schemas/#ContentRating) + +--- + +### MusicEntity + +```typescript +type MusicEntity = { + entityType: 'music' + musicType: MusicType // In the case of a music `entityType`, specifies the type of music entity. + entityId: string +} +``` + +See also: + +[MusicType](../Entertainment/schemas/#MusicType) + +--- + +### ChannelEntity + +```typescript +type ChannelEntity = { + entityType: 'channel' + channelType: 'streaming' | 'overTheAir' + entityId: string // ID of the channel, in the target App's scope. + appContentData?: string +} +``` + +--- + +### UntypedEntity + +```typescript +type UntypedEntity = { + entityId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### PlaylistEntity + +A Firebolt compliant representation of a Playlist entity. + +```typescript +type PlaylistEntity = { + entityType: 'playlist' + entityId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### TVEpisodeEntity + +A Firebolt compliant representation of a TV Episode entity. + +```typescript +type TVEpisodeEntity = { + entityType: 'program' + programType: 'episode' + entityId: string + seriesId: string + seasonId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### TVSeasonEntity + +A Firebolt compliant representation of a TV Season entity. + +```typescript +type TVSeasonEntity = { + entityType: 'program' + programType: 'season' + entityId: string + seriesId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### TVSeriesEntity + +A Firebolt compliant representation of a TV Series entity. + +```typescript +type TVSeriesEntity = { + entityType: 'program' + programType: 'series' + entityId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### AdditionalEntity + +A Firebolt compliant representation of the remaining program entity types. + +```typescript +type AdditionalEntity = { + entityType: 'program' + programType: + | 'concert' + | 'sportingEvent' + | 'preview' + | 'other' + | 'advertisement' + | 'musicVideo' + | 'minisode' + | 'extra' + entityId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### ProgramEntity + +```typescript +type ProgramEntity = + | MovieEntity + | TVEpisodeEntity + | TVSeasonEntity + | TVSeriesEntity + | AdditionalEntity +``` + +See also: + +[MovieEntity](#movieentity) +[TVEpisodeEntity](#tvepisodeentity) +[TVSeasonEntity](#tvseasonentity) +[TVSeriesEntity](#tvseriesentity) +[AdditionalEntity](#additionalentity) + +--- + +### Entity + +```typescript + +``` + +See also: + +[ProgramEntity](#programentity) +[MusicEntity](#musicentity) +[ChannelEntity](#channelentity) +[UntypedEntity](#untypedentity) +[PlaylistEntity](#playlistentity) + +--- + +### EntityDetails + +```typescript +type EntityDetails = { + identifiers: + | ProgramEntity + | MusicEntity + | ChannelEntity + | UntypedEntity + | PlaylistEntity + info?: Metadata + waysToWatch?: WayToWatch[] // A WayToWatch describes a way to watch a video program. It may describe a single +} +``` + +See also: + +[Metadata](#metadata) +[WayToWatch](../Entertainment/schemas/#WayToWatch) + +--- + +### PlayableEntity + +```typescript +type PlayableEntity = + | MovieEntity + | TVEpisodeEntity + | PlaylistEntity + | MusicEntity + | AdditionalEntity +``` + +See also: + +[MovieEntity](#movieentity) +[TVEpisodeEntity](#tvepisodeentity) +[PlaylistEntity](#playlistentity) +[MusicEntity](#musicentity) +[AdditionalEntity](#additionalentity) + +--- diff --git a/apis/pr-fix-ci-fb-version/discovery/Intents/schemas/index.md b/apis/pr-fix-ci-fb-version/discovery/Intents/schemas/index.md new file mode 100644 index 000000000..8dca857ef --- /dev/null +++ b/apis/pr-fix-ci-fb-version/discovery/Intents/schemas/index.md @@ -0,0 +1,232 @@ +--- +title: Intents + +version: pr-fix-ci-fb-version +layout: default +sdk: discovery +--- + +# Intents + +--- + +Version Intents 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [Intent](#intent) + - [IntentProperties](#intentproperties) + - [EntityIntent](#entityintent) + - [PlaybackIntent](#playbackintent) + - [SearchIntent](#searchintent) + - [SectionIntent](#sectionintent) + - [TuneIntent](#tuneintent) + - [PlayEntityIntent](#playentityintent) + - [PlayQueryIntent](#playqueryintent) + - [HomeIntent](#homeintent) + - [LaunchIntent](#launchintent) + - [NavigationIntent](#navigationintent) + +## Overview + +undefined + +## Types + +### Intent + +A Firebolt compliant representation of a user intention. + +```typescript + +``` + +--- + +### IntentProperties + +```typescript + +``` + +--- + +### EntityIntent + +A Firebolt compliant representation of a user intention to navigate an app to a specific entity page, and bring that app to the foreground if needed. + +```typescript +type EntityIntent = { + action: 'entity' + data: + | ProgramEntity + | MusicEntity + | ChannelEntity + | UntypedEntity + | PlaylistEntity + context: object +} +``` + +--- + +### PlaybackIntent + +A Firebolt compliant representation of a user intention to navigate an app to a the video player for a specific, playable entity, and bring that app to the foreground if needed. + +```typescript +type PlaybackIntent = { + action: 'playback' + data: PlayableEntity + context: object +} +``` + +See also: + +[PlayableEntity](../Entity/schemas/#PlayableEntity) + +--- + +### SearchIntent + +A Firebolt compliant representation of a user intention to navigate an app to it's search UI with a search term populated, and bring that app to the foreground if needed. + +```typescript +type SearchIntent = { + action: 'search' + data?: object + context: object +} +``` + +--- + +### SectionIntent + +A Firebolt compliant representation of a user intention to navigate an app to a section not covered by `home`, `entity`, `player`, or `search`, and bring that app to the foreground if needed. + +```typescript +type SectionIntent = { + action: 'section' + data: object + context: object +} +``` + +--- + +### TuneIntent + +A Firebolt compliant representation of a user intention to 'tune' to a traditional over-the-air broadcast, or an OTT Stream from an OTT or vMVPD App. + +```typescript +type TuneIntent = { + action: 'tune' + data: object + context: object +} +``` + +See also: + +[ChannelEntity](../Entity/schemas/#ChannelEntity) + +--- + +### PlayEntityIntent + +A Firebolt compliant representation of a user intention to navigate an app to a the video player for a specific, playable entity, and bring that app to the foreground if needed. + +```typescript +type PlayEntityIntent = { + action: 'play-entity' + data: object + context: object +} +``` + +See also: + +[PlayableEntity](../Entity/schemas/#PlayableEntity) + +--- + +### PlayQueryIntent + +A Firebolt compliant representation of a user intention to navigate an app to a the video player for an abstract query to be searched for and played by the app. + +```typescript +type PlayQueryIntent = { + action: 'play-query' + data: object + context: object +} +``` + +See also: + +[ProgramType](../Entertainment/schemas/#ProgramType) +[MusicType](../Entertainment/schemas/#MusicType) + +--- + +### HomeIntent + +A Firebolt compliant representation of a user intention to navigate an app to it's home screen, and bring that app to the foreground if needed. + +```typescript +type HomeIntent = { + action: 'home' + context: object +} +``` + +--- + +### LaunchIntent + +A Firebolt compliant representation of a user intention to launch an app. + +```typescript +type LaunchIntent = { + action: 'launch' + context: object +} +``` + +--- + +### NavigationIntent + +A Firebolt compliant representation of a user intention to navigate to a specific place in an app. + +```typescript +type NavigationIntent = + | HomeIntent + | LaunchIntent + | EntityIntent + | PlaybackIntent + | SearchIntent + | SectionIntent + | TuneIntent + | PlayEntityIntent + | PlayQueryIntent +``` + +See also: + +[HomeIntent](#homeintent) +[LaunchIntent](#launchintent) +[EntityIntent](#entityintent) +[PlaybackIntent](#playbackintent) +[SearchIntent](#searchintent) +[SectionIntent](#sectionintent) +[TuneIntent](#tuneintent) +[PlayEntityIntent](#playentityintent) +[PlayQueryIntent](#playqueryintent) + +--- diff --git a/apis/pr-fix-ci-fb-version/discovery/Lifecycle/schemas/index.md b/apis/pr-fix-ci-fb-version/discovery/Lifecycle/schemas/index.md new file mode 100644 index 000000000..9ea1a7138 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/discovery/Lifecycle/schemas/index.md @@ -0,0 +1,61 @@ +--- +title: Lifecycle + +version: pr-fix-ci-fb-version +layout: default +sdk: discovery +--- + +# Lifecycle + +--- + +Version Lifecycle 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [CloseReason](#closereason) + - [LifecycleState](#lifecyclestate) + +## Overview + +undefined + +## Types + +### CloseReason + +The application close reason + +```typescript +CloseReason: { + REMOTE_BUTTON: 'remoteButton', + USER_EXIT: 'userExit', + DONE: 'done', + ERROR: 'error', +}, + +``` + +--- + +### LifecycleState + +The application lifecycle state + +```typescript +LifecycleState: { + INITIALIZING: 'initializing', + INACTIVE: 'inactive', + FOREGROUND: 'foreground', + BACKGROUND: 'background', + UNLOADING: 'unloading', + SUSPENDED: 'suspended', +}, + +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/discovery/Localization/schemas/index.md b/apis/pr-fix-ci-fb-version/discovery/Localization/schemas/index.md new file mode 100644 index 000000000..aa74989fd --- /dev/null +++ b/apis/pr-fix-ci-fb-version/discovery/Localization/schemas/index.md @@ -0,0 +1,79 @@ +--- +title: Localization + +version: pr-fix-ci-fb-version +layout: default +sdk: discovery +--- + +# Localization + +--- + +Version Localization 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [ISO639_2Language](#isolanguage) + - [Locality](#locality) + - [CountryCode](#countrycode) + - [Language](#language) + - [Locale](#locale) + - [TimeZone](#timezone) + +## Overview + +undefined + +## Types + +### ISO639_2Language + +```typescript + +``` + +--- + +### Locality + +```typescript + +``` + +--- + +### CountryCode + +```typescript + +``` + +--- + +### Language + +```typescript + +``` + +--- + +### Locale + +```typescript + +``` + +--- + +### TimeZone + +```typescript + +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/discovery/SecondScreen/schemas/index.md b/apis/pr-fix-ci-fb-version/discovery/SecondScreen/schemas/index.md new file mode 100644 index 000000000..5d1dc9ff4 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/discovery/SecondScreen/schemas/index.md @@ -0,0 +1,40 @@ +--- +title: SecondScreen + +version: pr-fix-ci-fb-version +layout: default +sdk: discovery +--- + +# SecondScreen + +--- + +Version SecondScreen 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [SecondScreenEvent](#secondscreenevent) + +## Overview + +undefined + +## Types + +### SecondScreenEvent + +An a message notification from a second screen device + +```typescript +type SecondScreenEvent = { + type: 'dial' + version?: string + data?: string +} +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/discovery/Types/schemas/index.md b/apis/pr-fix-ci-fb-version/discovery/Types/schemas/index.md new file mode 100644 index 000000000..be5a7d302 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/discovery/Types/schemas/index.md @@ -0,0 +1,94 @@ +--- +title: Types + +version: pr-fix-ci-fb-version +layout: default +sdk: discovery +--- + +# Types + +--- + +Version Types 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [AudioProfile](#audioprofile) + - [SemanticVersion](#semanticversion) + - [LocalizedString](#localizedstring) + - [FlatMap](#flatmap) + - [BooleanMap](#booleanmap) + - [Timeout](#timeout) + +## Overview + +undefined + +## Types + +### AudioProfile + +```typescript +AudioProfile: { + STEREO: 'stereo', + DOLBY_DIGITAL_5_1: 'dolbyDigital5.1', + DOLBY_DIGITAL_5_1_PLUS: 'dolbyDigital5.1+', + DOLBY_ATMOS: 'dolbyAtmos', +}, + +``` + +--- + +### SemanticVersion + +```typescript +type SemanticVersion = { + major: number + minor: number + patch: number + readable: string +} +``` + +--- + +### LocalizedString + +Localized string supports either a simple `string` or a Map of language codes to strings. When using a simple `string`, the current preferred langauge from `Localization.langauge()` is assumed. + +```typescript +type LocalizedString = string | object +``` + +--- + +### FlatMap + +```typescript + +``` + +--- + +### BooleanMap + +```typescript +type BooleanMap = {} +``` + +--- + +### Timeout + +Defines the timeout in seconds. If the threshold for timeout is passed for any operation without a result it will throw an error. + +```typescript + +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/discovery/changelog.md b/apis/pr-fix-ci-fb-version/discovery/changelog.md new file mode 100644 index 000000000..0b0ca3b30 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/discovery/changelog.md @@ -0,0 +1,17 @@ +--- +title: Change Log + +version: pr-fix-ci-fb-version +layout: default +sdk: discovery +--- +# [1.4.0](https://github.com/rdkcentral/firebolt-apis/compare/v1.3.0...v1.4.0) (2024-23-09) + +# [1.3.0](https://github.com/rdkcentral/firebolt-apis/compare/v1.2.0...v1.3.0) (2024-08-12) + +# [1.2.0](https://github.com/rdkcentral/firebolt-apis/compare/v1.1.0...v1.2.0) (2024-06-14) + +### Features + +* Introduced Discovery SDK for first-party aggregated experiences to connect with third-party apps. +* [User Interest](https://github.com/rdkcentral/firebolt-apis/blob/main/requirements/specifications/discovery/user-interest.md) ([#170](https://github.com/rdkcentral/firebolt-apis/issues/170)) ([48a1094](https://github.com/rdkcentral/firebolt-apis/commit/48a1094aaab6418f09db662dbc81f090a34f32ed)) diff --git a/apis/pr-fix-ci-fb-version/discovery/index.md b/apis/pr-fix-ci-fb-version/discovery/index.md new file mode 100644 index 000000000..6e8d90985 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/discovery/index.md @@ -0,0 +1,30 @@ +--- +title: Firebolt Discovery SDK + +version: pr-fix-ci-fb-version +layout: default +sdk: discovery +--- + +[![semantic-release: conventional](https://img.shields.io/badge/semantic--release-conventional-e10079?logo=semantic-release)](https://github.com/semantic-release/semantic-release) + +# Firebolt Discovery SDK +For building Firebolt compliant apps for discovering first-party content on Firebolt devices. + +## Usage +To install, run: + +``` +npm install @firebolt-js/discovery-sdk +``` + +To use the package, import one of it's modules, e.g.: + +```js +import { Content } from '@firebolt-js/discovery-sdk' +``` + +## Contributing +The Firebolt SDKs are built using the Firebolt OpenRPC toolset: + +See [Firebolt OpenRPC](https://www.github.com/rdkcentral/firebolt-openrpc/), for more info. diff --git a/apis/pr-fix-ci-fb-version/index.md b/apis/pr-fix-ci-fb-version/index.md new file mode 100644 index 000000000..005b9fb23 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/index.md @@ -0,0 +1,585 @@ +--- +title: Firebolt APIs + +layout: default +--- + +[![semantic-release: conventional](https://img.shields.io/badge/semantic--release-conventional-e10079?logo=semantic-release)](https://github.com/semantic-release/semantic-release) + +# Firebolt APIs +Firebolt APIs are defined by [OpenRPC schemas](https://spec.open-rpc.org). + +The schemas are used to generate SDK and Documentation artifacts. + +### `xrn:firebolt:capability:accessibility:audiodescriptions` + +| Uses | +| ---- | +| [Accessibility.audioDescriptionSettings](./core/Accessibility/#audiodescriptionsettings)
[Accessibility.onAudioDescriptionSettingsChanged](./core/Accessibility/#audiodescriptionsettingschanged)
[AudioDescriptions.enabled](./manage/AudioDescriptions/#enabled)
[AudioDescriptions.onEnabledChanged](./manage/AudioDescriptions/#enabledchanged) | + + + +| Manages | +| ------- | +| [AudioDescriptions.setEnabled](./manage/AudioDescriptions/#setenabled) | + + +### `xrn:firebolt:capability:accessibility:closedcaptions` + +| Uses | +| ---- | +| [Accessibility.closedCaptions](./core/Accessibility/#closedcaptions)
[Accessibility.closedCaptionsSettings](./core/Accessibility/#closedcaptionssettings)
[Accessibility.onClosedCaptionsSettingsChanged](./core/Accessibility/#closedcaptionssettingschanged)
[ClosedCaptions.enabled](./manage/ClosedCaptions/#enabled)
[ClosedCaptions.fontFamily](./manage/ClosedCaptions/#fontfamily)
[ClosedCaptions.fontSize](./manage/ClosedCaptions/#fontsize)
[ClosedCaptions.fontColor](./manage/ClosedCaptions/#fontcolor)
[ClosedCaptions.fontEdge](./manage/ClosedCaptions/#fontedge)
[ClosedCaptions.fontEdgeColor](./manage/ClosedCaptions/#fontedgecolor)
[ClosedCaptions.fontOpacity](./manage/ClosedCaptions/#fontopacity)
[ClosedCaptions.backgroundColor](./manage/ClosedCaptions/#backgroundcolor)
[ClosedCaptions.backgroundOpacity](./manage/ClosedCaptions/#backgroundopacity)
[ClosedCaptions.textAlign](./manage/ClosedCaptions/#textalign)
[ClosedCaptions.textAlignVertical](./manage/ClosedCaptions/#textalignvertical)
[ClosedCaptions.windowColor](./manage/ClosedCaptions/#windowcolor)
[ClosedCaptions.windowOpacity](./manage/ClosedCaptions/#windowopacity)
[ClosedCaptions.preferredLanguages](./manage/ClosedCaptions/#preferredlanguages)
[ClosedCaptions.onEnabledChanged](./manage/ClosedCaptions/#enabledchanged)
[ClosedCaptions.onFontFamilyChanged](./manage/ClosedCaptions/#fontfamilychanged)
[ClosedCaptions.onFontSizeChanged](./manage/ClosedCaptions/#fontsizechanged)
[ClosedCaptions.onFontColorChanged](./manage/ClosedCaptions/#fontcolorchanged)
[ClosedCaptions.onFontEdgeChanged](./manage/ClosedCaptions/#fontedgechanged)
[ClosedCaptions.onFontEdgeColorChanged](./manage/ClosedCaptions/#fontedgecolorchanged)
[ClosedCaptions.onFontOpacityChanged](./manage/ClosedCaptions/#fontopacitychanged)
[ClosedCaptions.onBackgroundColorChanged](./manage/ClosedCaptions/#backgroundcolorchanged)
[ClosedCaptions.onBackgroundOpacityChanged](./manage/ClosedCaptions/#backgroundopacitychanged)
[ClosedCaptions.onTextAlignChanged](./manage/ClosedCaptions/#textalignchanged)
[ClosedCaptions.onTextAlignVerticalChanged](./manage/ClosedCaptions/#textalignverticalchanged)
[ClosedCaptions.onWindowColorChanged](./manage/ClosedCaptions/#windowcolorchanged)
[ClosedCaptions.onWindowOpacityChanged](./manage/ClosedCaptions/#windowopacitychanged)
[ClosedCaptions.onPreferredLanguagesChanged](./manage/ClosedCaptions/#preferredlanguageschanged) | + + + +| Manages | +| ------- | +| [ClosedCaptions.setEnabled](./manage/ClosedCaptions/#setenabled)
[ClosedCaptions.setFontFamily](./manage/ClosedCaptions/#setfontfamily)
[ClosedCaptions.setFontSize](./manage/ClosedCaptions/#setfontsize)
[ClosedCaptions.setFontColor](./manage/ClosedCaptions/#setfontcolor)
[ClosedCaptions.setFontEdge](./manage/ClosedCaptions/#setfontedge)
[ClosedCaptions.setFontEdgeColor](./manage/ClosedCaptions/#setfontedgecolor)
[ClosedCaptions.setFontOpacity](./manage/ClosedCaptions/#setfontopacity)
[ClosedCaptions.setBackgroundColor](./manage/ClosedCaptions/#setbackgroundcolor)
[ClosedCaptions.setBackgroundOpacity](./manage/ClosedCaptions/#setbackgroundopacity)
[ClosedCaptions.setTextAlign](./manage/ClosedCaptions/#settextalign)
[ClosedCaptions.setTextAlignVertical](./manage/ClosedCaptions/#settextalignvertical)
[ClosedCaptions.setWindowColor](./manage/ClosedCaptions/#setwindowcolor)
[ClosedCaptions.setWindowOpacity](./manage/ClosedCaptions/#setwindowopacity)
[ClosedCaptions.setPreferredLanguages](./manage/ClosedCaptions/#setpreferredlanguages) | + + +### `xrn:firebolt:capability:accessibility:voiceguidance` + +| Uses | +| ---- | +| [Accessibility.voiceGuidance](./core/Accessibility/#voiceguidance)
[Accessibility.voiceGuidanceSettings](./core/Accessibility/#voiceguidancesettings)
[Accessibility.onVoiceGuidanceSettingsChanged](./core/Accessibility/#voiceguidancesettingschanged)
[VoiceGuidance.enabled](./manage/VoiceGuidance/#enabled)
[VoiceGuidance.speed](./manage/VoiceGuidance/#speed)
[VoiceGuidance.onEnabledChanged](./manage/VoiceGuidance/#enabledchanged)
[VoiceGuidance.onSpeedChanged](./manage/VoiceGuidance/#speedchanged) | + + + +| Manages | +| ------- | +| [VoiceGuidance.setEnabled](./manage/VoiceGuidance/#setenabled)
[VoiceGuidance.setSpeed](./manage/VoiceGuidance/#setspeed) | + + +### `xrn:firebolt:capability:account:id` + +| Uses | +| ---- | +| [Account.id](./core/Account/#id) | + + + +| Manages | +| ------- | +| [Device.provision](./manage/Device/#provision) | + + +### `xrn:firebolt:capability:account:uid` + +| Uses | +| ---- | +| [Account.uid](./core/Account/#uid) | + + +### `xrn:firebolt:capability:advertising:configuration` + +| Uses | +| ---- | +| [Advertising.config](./core/Advertising/#config)
[Advertising.deviceAttributes](./core/Advertising/#deviceattributes)
[Advertising.appBundleId](./core/Advertising/#appbundleid) | + + + +| Manages | +| ------- | +| [Advertising.skipRestriction](./manage/Advertising/#skiprestriction)
[Advertising.onSkipRestrictionChanged](./manage/Advertising/#skiprestrictionchanged)
[Advertising.setSkipRestriction](./manage/Advertising/#setskiprestriction) | + + +### `xrn:firebolt:capability:advertising:identifier` + +| Uses | +| ---- | +| [Advertising.advertisingId](./core/Advertising/#advertisingid) | + + + +| Manages | +| ------- | +| [Advertising.resetIdentifier](./manage/Advertising/#resetidentifier) | + + +### `xrn:firebolt:capability:advertising:policy` + +| Uses | +| ---- | +| [Advertising.policy](./core/Advertising/#policy)
[Advertising.onPolicyChanged](./core/Advertising/#policychanged) | + + +### `xrn:firebolt:capability:approve:content` + +| Uses | +| ---- | +| [Profile.approveContentRating](./core/Profile/#approvecontentrating) | + + +### `xrn:firebolt:capability:approve:purchase` + +| Uses | +| ---- | +| [Profile.approvePurchase](./core/Profile/#approvepurchase) | + + +### `xrn:firebolt:capability:capabilities:info` + +| Uses | +| ---- | +| [Capabilities.supported](./core/Capabilities/#supported)
[Capabilities.available](./core/Capabilities/#available)
[Capabilities.permitted](./core/Capabilities/#permitted)
[Capabilities.granted](./core/Capabilities/#granted)
[Capabilities.info](./core/Capabilities/#info)
[Capabilities.onAvailable](./core/Capabilities/#available)
[Capabilities.onUnavailable](./core/Capabilities/#unavailable)
[Capabilities.onGranted](./core/Capabilities/#granted)
[Capabilities.onRevoked](./core/Capabilities/#revoked) | + + +### `xrn:firebolt:capability:capabilities:request` + +| Uses | +| ---- | +| [Capabilities.request](./core/Capabilities/#request) | + + +### `xrn:firebolt:capability:device:distributor` + +| Uses | +| ---- | +| [Device.distributor](./core/Device/#distributor) | + + + +| Manages | +| ------- | +| [Device.provision](./manage/Device/#provision) | + + +### `xrn:firebolt:capability:device:id` + +| Uses | +| ---- | +| [Device.id](./core/Device/#id) | + + + +| Manages | +| ------- | +| [Device.provision](./manage/Device/#provision) | + + +### `xrn:firebolt:capability:device:info` + +| Uses | +| ---- | +| [Device.platform](./core/Device/#platform)
[Device.type](./core/Device/#type)
[Device.version](./core/Device/#version)
[Device.hdcp](./core/Device/#hdcp)
[Device.hdr](./core/Device/#hdr)
[Device.audio](./core/Device/#audio)
[Device.screenResolution](./core/Device/#screenresolution)
[Device.videoResolution](./core/Device/#videoresolution)
[Device.onHdcpChanged](./core/Device/#hdcpchanged)
[Device.onHdrChanged](./core/Device/#hdrchanged)
[Device.onAudioChanged](./core/Device/#audiochanged)
[Device.onScreenResolutionChanged](./core/Device/#screenresolutionchanged)
[Device.onVideoResolutionChanged](./core/Device/#videoresolutionchanged) | + + +### `xrn:firebolt:capability:device:make` + +| Uses | +| ---- | +| [Device.make](./core/Device/#make) | + + +### `xrn:firebolt:capability:device:model` + +| Uses | +| ---- | +| [Device.model](./core/Device/#model) | + + +### `xrn:firebolt:capability:device:name` + +| Uses | +| ---- | +| [Device.name](./core/Device/#name)
[Device.onDeviceNameChanged](./core/Device/#devicenamechanged)
[Device.onNameChanged](./core/Device/#namechanged) | + + + +| Manages | +| ------- | +| [Device.setName](./manage/Device/#setname) | + + +### `xrn:firebolt:capability:device:sku` + +| Uses | +| ---- | +| [Device.sku](./core/Device/#sku) | + + +### `xrn:firebolt:capability:device:uid` + +| Uses | +| ---- | +| [Device.uid](./core/Device/#uid) | + + +### `xrn:firebolt:capability:discovery:content-access` + +| Uses | +| ---- | +| [Discovery.entitlements](./core/Discovery/#entitlements)
[Discovery.contentAccess](./core/Discovery/#contentaccess)
[Discovery.clearContentAccess](./core/Discovery/#clearcontentaccess) | + + +### `xrn:firebolt:capability:discovery:entity-info` + +| Provides | +| -------- | +| [Discovery.entityInfo](./core/Discovery/#entityinfo)
[Discovery.onPullEntityInfo](./core/Discovery/#pullentityinfo) | + + +### `xrn:firebolt:capability:discovery:interest` + +| Uses | +| ---- | +| [Content.requestUserInterest](./manage/Content/#requestuserinterest)
[Content.onUserInterest](./manage/Content/#userinterest) | + + + +| Provides | +| -------- | +| [Discovery.userInterest](./core/Discovery/#userinterest)
[Discovery.onRequestUserInterest](./core/Discovery/#requestuserinterest)
[Discovery.userInterestResponse](./core/Discovery/#userinterestresponse)
[Discovery.userInterestError](./core/Discovery/#userinteresterror) | + + +### `xrn:firebolt:capability:discovery:navigate-to` + +| Uses | +| ---- | +| [Discovery.onNavigateTo](./core/Discovery/#navigateto) | + + +### `xrn:firebolt:capability:discovery:policy` + +| Uses | +| ---- | +| [Discovery.policy](./core/Discovery/#policy)
[Discovery.onPolicyChanged](./core/Discovery/#policychanged) | + + +### `xrn:firebolt:capability:discovery:purchased-content` + +| Provides | +| -------- | +| [Discovery.purchasedContent](./core/Discovery/#purchasedcontent)
[Discovery.onPullPurchasedContent](./core/Discovery/#pullpurchasedcontent) | + + +### `xrn:firebolt:capability:discovery:sign-in-status` + +| Uses | +| ---- | +| [Discovery.signIn](./core/Discovery/#signin)
[Discovery.signOut](./core/Discovery/#signout) | + + + +| Manages | +| ------- | +| [Discovery.onSignIn](./manage/Discovery/#signin)
[Discovery.onSignOut](./manage/Discovery/#signout) | + + +### `xrn:firebolt:capability:discovery:watch-next` + +| Uses | +| ---- | +| [Discovery.watchNext](./core/Discovery/#watchnext) | + + +### `xrn:firebolt:capability:discovery:watched` + +| Uses | +| ---- | +| [Discovery.watched](./core/Discovery/#watched) | + + +### `xrn:firebolt:capability:grants:state` + +| Uses | +| ---- | +| [UserGrants.app](./manage/UserGrants/#app)
[UserGrants.device](./manage/UserGrants/#device)
[UserGrants.capability](./manage/UserGrants/#capability) | + + + +| Manages | +| ------- | +| [UserGrants.grant](./manage/UserGrants/#grant)
[UserGrants.deny](./manage/UserGrants/#deny)
[UserGrants.clear](./manage/UserGrants/#clear)
[UserGrants.request](./manage/UserGrants/#request) | + + +### `xrn:firebolt:capability:input:keyboard` + +| Uses | +| ---- | +| [Keyboard.email](./core/Keyboard/#email)
[Keyboard.password](./core/Keyboard/#password)
[Keyboard.standard](./core/Keyboard/#standard) | + + + +| Provides | +| -------- | +| [Keyboard.onRequestStandard](./manage/Keyboard/#requeststandard)
[Keyboard.onRequestPassword](./manage/Keyboard/#requestpassword)
[Keyboard.onRequestEmail](./manage/Keyboard/#requestemail)
[Keyboard.standardFocus](./manage/Keyboard/#standardfocus)
[Keyboard.passwordFocus](./manage/Keyboard/#passwordfocus)
[Keyboard.emailFocus](./manage/Keyboard/#emailfocus)
[Keyboard.standardResponse](./manage/Keyboard/#standardresponse)
[Keyboard.standardError](./manage/Keyboard/#standarderror)
[Keyboard.passwordResponse](./manage/Keyboard/#passwordresponse)
[Keyboard.passwordError](./manage/Keyboard/#passworderror)
[Keyboard.emailResponse](./manage/Keyboard/#emailresponse)
[Keyboard.emailError](./manage/Keyboard/#emailerror) | + + +### `xrn:firebolt:capability:inputs:hdmi` + +| Uses | +| ---- | +| [HDMIInput.ports](./manage/HDMIInput/#ports)
[HDMIInput.port](./manage/HDMIInput/#port)
[HDMIInput.onConnectionChanged](./manage/HDMIInput/#connectionchanged)
[HDMIInput.onSignalChanged](./manage/HDMIInput/#signalchanged)
[HDMIInput.lowLatencyMode](./manage/HDMIInput/#lowlatencymode)
[HDMIInput.onAutoLowLatencyModeSignalChanged](./manage/HDMIInput/#autolowlatencymodesignalchanged)
[HDMIInput.autoLowLatencyModeCapable](./manage/HDMIInput/#autolowlatencymodecapable)
[HDMIInput.edidVersion](./manage/HDMIInput/#edidversion)
[HDMIInput.onLowLatencyModeChanged](./manage/HDMIInput/#lowlatencymodechanged)
[HDMIInput.onAutoLowLatencyModeCapableChanged](./manage/HDMIInput/#autolowlatencymodecapablechanged)
[HDMIInput.onEdidVersionChanged](./manage/HDMIInput/#edidversionchanged) | + + + +| Manages | +| ------- | +| [HDMIInput.open](./manage/HDMIInput/#open)
[HDMIInput.close](./manage/HDMIInput/#close)
[HDMIInput.setLowLatencyMode](./manage/HDMIInput/#setlowlatencymode)
[HDMIInput.setAutoLowLatencyModeCapable](./manage/HDMIInput/#setautolowlatencymodecapable)
[HDMIInput.setEdidVersion](./manage/HDMIInput/#setedidversion) | + + +### `xrn:firebolt:capability:lifecycle:initialize` + +| Uses | +| ---- | +| [Internal.initialize](./core/Internal/#initialize) | + + +### `xrn:firebolt:capability:lifecycle:launch` + +| Uses | +| ---- | +| [Discovery.launch](./core/Discovery/#launch) | + + +### `xrn:firebolt:capability:lifecycle:ready` + +| Uses | +| ---- | +| [Lifecycle.ready](./core/Lifecycle/#ready) | + + +### `xrn:firebolt:capability:lifecycle:state` + +| Uses | +| ---- | +| [Lifecycle.close](./core/Lifecycle/#close)
[Lifecycle.finished](./core/Lifecycle/#finished)
[Lifecycle.state](./core/Lifecycle/#state)
[Lifecycle.onInactive](./core/Lifecycle/#inactive)
[Lifecycle.onForeground](./core/Lifecycle/#foreground)
[Lifecycle.onBackground](./core/Lifecycle/#background)
[Lifecycle.onSuspended](./core/Lifecycle/#suspended)
[Lifecycle.onUnloading](./core/Lifecycle/#unloading)
[Parameters.initialization](./core/Parameters/#initialization) | + + +### `xrn:firebolt:capability:localization:additional-info` + +| Uses | +| ---- | +| [Localization.additionalInfo](./core/Localization/#additionalinfo) | + + + +| Manages | +| ------- | +| [Localization.addAdditionalInfo](./manage/Localization/#addadditionalinfo)
[Localization.removeAdditionalInfo](./manage/Localization/#removeadditionalinfo) | + + +### `xrn:firebolt:capability:localization:country-code` + +| Uses | +| ---- | +| [Localization.countryCode](./core/Localization/#countrycode)
[Localization.onCountryCodeChanged](./core/Localization/#countrycodechanged) | + + + +| Manages | +| ------- | +| [Localization.setCountryCode](./manage/Localization/#setcountrycode) | + + +### `xrn:firebolt:capability:localization:language` + +| Uses | +| ---- | +| [Localization.language](./core/Localization/#language)
[Localization.preferredAudioLanguages](./core/Localization/#preferredaudiolanguages)
[Localization.onLanguageChanged](./core/Localization/#languagechanged)
[Localization.onPreferredAudioLanguagesChanged](./core/Localization/#preferredaudiolanguageschanged) | + + + +| Manages | +| ------- | +| [Localization.setLanguage](./manage/Localization/#setlanguage)
[Localization.setPreferredAudioLanguages](./manage/Localization/#setpreferredaudiolanguages) | + + +### `xrn:firebolt:capability:localization:locale` + +| Uses | +| ---- | +| [Localization.locale](./core/Localization/#locale)
[Localization.onLocaleChanged](./core/Localization/#localechanged) | + + + +| Manages | +| ------- | +| [Localization.setLocale](./manage/Localization/#setlocale) | + + +### `xrn:firebolt:capability:localization:locality` + +| Uses | +| ---- | +| [Localization.locality](./core/Localization/#locality)
[Localization.onLocalityChanged](./core/Localization/#localitychanged) | + + + +| Manages | +| ------- | +| [Localization.setLocality](./manage/Localization/#setlocality) | + + +### `xrn:firebolt:capability:localization:location` + +| Uses | +| ---- | +| [Localization.latlon](./core/Localization/#latlon) | + + +### `xrn:firebolt:capability:localization:postal-code` + +| Uses | +| ---- | +| [Localization.postalCode](./core/Localization/#postalcode)
[Localization.onPostalCodeChanged](./core/Localization/#postalcodechanged) | + + + +| Manages | +| ------- | +| [Localization.setPostalCode](./manage/Localization/#setpostalcode) | + + +### `xrn:firebolt:capability:localization:time-zone` + +| Uses | +| ---- | +| [Localization.timeZone](./manage/Localization/#timezone)
[Localization.onTimeZoneChanged](./manage/Localization/#timezonechanged) | + + + +| Manages | +| ------- | +| [Localization.setTimeZone](./manage/Localization/#settimezone) | + + +### `xrn:firebolt:capability:metrics:distributor` + +| Uses | +| ---- | +| [Metrics.event](./manage/Metrics/#event) | + + +### `xrn:firebolt:capability:metrics:general` + +| Uses | +| ---- | +| [Metrics.ready](./core/Metrics/#ready)
[Metrics.signIn](./core/Metrics/#signin)
[Metrics.signOut](./core/Metrics/#signout)
[Metrics.startContent](./core/Metrics/#startcontent)
[Metrics.stopContent](./core/Metrics/#stopcontent)
[Metrics.page](./core/Metrics/#page)
[Metrics.action](./core/Metrics/#action)
[Metrics.error](./core/Metrics/#error)
[Metrics.appInfo](./core/Metrics/#appinfo) | + + +### `xrn:firebolt:capability:metrics:media` + +| Uses | +| ---- | +| [Metrics.mediaLoadStart](./core/Metrics/#medialoadstart)
[Metrics.mediaPlay](./core/Metrics/#mediaplay)
[Metrics.mediaPlaying](./core/Metrics/#mediaplaying)
[Metrics.mediaPause](./core/Metrics/#mediapause)
[Metrics.mediaWaiting](./core/Metrics/#mediawaiting)
[Metrics.mediaProgress](./core/Metrics/#mediaprogress)
[Metrics.mediaSeeking](./core/Metrics/#mediaseeking)
[Metrics.mediaSeeked](./core/Metrics/#mediaseeked)
[Metrics.mediaRateChange](./core/Metrics/#mediaratechange)
[Metrics.mediaRenditionChange](./core/Metrics/#mediarenditionchange)
[Metrics.mediaEnded](./core/Metrics/#mediaended) | + + +### `xrn:firebolt:capability:network:status` + +| Uses | +| ---- | +| [Device.network](./core/Device/#network)
[Device.onNetworkChanged](./core/Device/#networkchanged) | + + +### `xrn:firebolt:capability:privacy:settings` + +| Uses | +| ---- | +| [Privacy.allowResumePoints](./manage/Privacy/#allowresumepoints)
[Privacy.allowUnentitledResumePoints](./manage/Privacy/#allowunentitledresumepoints)
[Privacy.allowWatchHistory](./manage/Privacy/#allowwatchhistory)
[Privacy.allowProductAnalytics](./manage/Privacy/#allowproductanalytics)
[Privacy.allowPersonalization](./manage/Privacy/#allowpersonalization)
[Privacy.allowUnentitledPersonalization](./manage/Privacy/#allowunentitledpersonalization)
[Privacy.allowRemoteDiagnostics](./manage/Privacy/#allowremotediagnostics)
[Privacy.allowPrimaryContentAdTargeting](./manage/Privacy/#allowprimarycontentadtargeting)
[Privacy.allowPrimaryBrowseAdTargeting](./manage/Privacy/#allowprimarybrowseadtargeting)
[Privacy.allowAppContentAdTargeting](./manage/Privacy/#allowappcontentadtargeting)
[Privacy.allowACRCollection](./manage/Privacy/#allowacrcollection)
[Privacy.allowCameraAnalytics](./manage/Privacy/#allowcameraanalytics)
[Privacy.settings](./manage/Privacy/#settings)
[Privacy.onAllowResumePointsChanged](./manage/Privacy/#allowresumepointschanged)
[Privacy.onAllowUnentitledResumePointsChanged](./manage/Privacy/#allowunentitledresumepointschanged)
[Privacy.onAllowWatchHistoryChanged](./manage/Privacy/#allowwatchhistorychanged)
[Privacy.onAllowProductAnalyticsChanged](./manage/Privacy/#allowproductanalyticschanged)
[Privacy.onAllowPersonalizationChanged](./manage/Privacy/#allowpersonalizationchanged)
[Privacy.onAllowUnentitledPersonalizationChanged](./manage/Privacy/#allowunentitledpersonalizationchanged)
[Privacy.onAllowRemoteDiagnosticsChanged](./manage/Privacy/#allowremotediagnosticschanged)
[Privacy.onAllowPrimaryContentAdTargetingChanged](./manage/Privacy/#allowprimarycontentadtargetingchanged)
[Privacy.onAllowPrimaryBrowseAdTargetingChanged](./manage/Privacy/#allowprimarybrowseadtargetingchanged)
[Privacy.onAllowAppContentAdTargetingChanged](./manage/Privacy/#allowappcontentadtargetingchanged)
[Privacy.onAllowACRCollectionChanged](./manage/Privacy/#allowacrcollectionchanged)
[Privacy.onAllowCameraAnalyticsChanged](./manage/Privacy/#allowcameraanalyticschanged) | + + + +| Manages | +| ------- | +| [Privacy.setAllowResumePoints](./manage/Privacy/#setallowresumepoints)
[Privacy.setAllowUnentitledResumePoints](./manage/Privacy/#setallowunentitledresumepoints)
[Privacy.setAllowWatchHistory](./manage/Privacy/#setallowwatchhistory)
[Privacy.setAllowProductAnalytics](./manage/Privacy/#setallowproductanalytics)
[Privacy.setAllowPersonalization](./manage/Privacy/#setallowpersonalization)
[Privacy.setAllowUnentitledPersonalization](./manage/Privacy/#setallowunentitledpersonalization)
[Privacy.setAllowRemoteDiagnostics](./manage/Privacy/#setallowremotediagnostics)
[Privacy.setAllowPrimaryContentAdTargeting](./manage/Privacy/#setallowprimarycontentadtargeting)
[Privacy.setAllowPrimaryBrowseAdTargeting](./manage/Privacy/#setallowprimarybrowseadtargeting)
[Privacy.setAllowAppContentAdTargeting](./manage/Privacy/#setallowappcontentadtargeting)
[Privacy.setAllowACRCollection](./manage/Privacy/#setallowacrcollection)
[Privacy.setAllowCameraAnalytics](./manage/Privacy/#setallowcameraanalytics) | + + +### `xrn:firebolt:capability:profile:flags` + +| Uses | +| ---- | +| [Profile.flags](./core/Profile/#flags) | + + +### `xrn:firebolt:capability:protocol:dial` + +| Uses | +| ---- | +| [SecondScreen.device](./core/SecondScreen/#device)
[SecondScreen.friendlyName](./core/SecondScreen/#friendlyname)
[SecondScreen.onLaunchRequest](./core/SecondScreen/#launchrequest)
[SecondScreen.onCloseRequest](./core/SecondScreen/#closerequest)
[SecondScreen.onFriendlyNameChanged](./core/SecondScreen/#friendlynamechanged) | + + +### `xrn:firebolt:capability:protocol:wifi` + +| Uses | +| ---- | +| [Wifi.scan](./manage/Wifi/#scan)
[Wifi.connect](./manage/Wifi/#connect)
[Wifi.disconnect](./manage/Wifi/#disconnect)
[Wifi.wps](./manage/Wifi/#wps) | + + +### `xrn:firebolt:capability:rpc:discover` + +| Uses | +| ---- | +| [rpc.discover](./manage/rpc/#discover) | + + +### `xrn:firebolt:capability:secondscreen:protocol` + +| Uses | +| ---- | +| [SecondScreen.protocols](./core/SecondScreen/#protocols) | + + +### `xrn:firebolt:capability:storage:secure` + +| Uses | +| ---- | +| [SecureStorage.get](./core/SecureStorage/#get)
[SecureStorage.set](./core/SecureStorage/#set)
[SecureStorage.remove](./core/SecureStorage/#remove)
[SecureStorage.clear](./core/SecureStorage/#clear) | + + + +| Manages | +| ------- | +| [SecureStorage.setForApp](./manage/SecureStorage/#setforapp)
[SecureStorage.removeForApp](./manage/SecureStorage/#removeforapp)
[SecureStorage.clearForApp](./manage/SecureStorage/#clearforapp) | + + +### `xrn:firebolt:capability:token:account` + +| Manages | +| ------- | +| [Account.session](./manage/Account/#session) | + + +### `xrn:firebolt:capability:token:device` + +| Uses | +| ---- | +| [Authentication.device](./core/Authentication/#device) | + + +### `xrn:firebolt:capability:token:platform` + +| Uses | +| ---- | +| [Authentication.token](./core/Authentication/#token) | + + +### `xrn:firebolt:capability:token:root` + +| Uses | +| ---- | +| [Authentication.root](./core/Authentication/#root) | + + +### `xrn:firebolt:capability:token:session` + +| Uses | +| ---- | +| [Authentication.session](./core/Authentication/#session) | + + +### `xrn:firebolt:capability:usergrant:acknowledgechallenge` + +| Provides | +| -------- | +| [AcknowledgeChallenge.onRequestChallenge](./manage/AcknowledgeChallenge/#requestchallenge)
[AcknowledgeChallenge.challengeFocus](./manage/AcknowledgeChallenge/#challengefocus)
[AcknowledgeChallenge.challengeResponse](./manage/AcknowledgeChallenge/#challengeresponse)
[AcknowledgeChallenge.challengeError](./manage/AcknowledgeChallenge/#challengeerror) | + + +### `xrn:firebolt:capability:usergrant:pinchallenge` + +| Provides | +| -------- | +| [PinChallenge.onRequestChallenge](./manage/PinChallenge/#requestchallenge)
[PinChallenge.challengeFocus](./manage/PinChallenge/#challengefocus)
[PinChallenge.challengeResponse](./manage/PinChallenge/#challengeresponse)
[PinChallenge.challengeError](./manage/PinChallenge/#challengeerror) | + + diff --git a/apis/pr-fix-ci-fb-version/manage/Accessibility/schemas/index.md b/apis/pr-fix-ci-fb-version/manage/Accessibility/schemas/index.md new file mode 100644 index 000000000..3773060e4 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Accessibility/schemas/index.md @@ -0,0 +1,154 @@ +--- +title: Accessibility + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Accessibility + +--- + +Version Accessibility 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [FontFamily](#fontfamily) + - [VoiceSpeed](#voicespeed) + - [VoiceGuidanceSettings](#voiceguidancesettings) + - [FontSize](#fontsize) + - [Color](#color) + - [FontEdge](#fontedge) + - [Opacity](#opacity) + - [HorizontalAlignment](#horizontalalignment) + - [VerticalAlignment](#verticalalignment) + - [ClosedCaptionsStyles](#closedcaptionsstyles) + - [ClosedCaptionsSettings](#closedcaptionssettings) + +## Overview + +undefined + +## Types + +### FontFamily + +```typescript + +``` + +--- + +### VoiceSpeed + +```typescript + +``` + +--- + +### VoiceGuidanceSettings + +```typescript +type VoiceGuidanceSettings = { + enabled: boolean // Whether or not voice guidance should be enabled by default + speed?: VoiceSpeed // The speed at which voice guidance speech will be read back to the user +} +``` + +See also: + +[VoiceSpeed](#voicespeed) + +--- + +### FontSize + +```typescript + +``` + +--- + +### Color + +```typescript + +``` + +--- + +### FontEdge + +```typescript + +``` + +--- + +### Opacity + +```typescript + +``` + +--- + +### HorizontalAlignment + +```typescript + +``` + +--- + +### VerticalAlignment + +```typescript + +``` + +--- + +### ClosedCaptionsStyles + +The default styles to use when displaying closed-captions + +```typescript +type ClosedCaptionsStyles = { + fontFamily?: string + fontSize?: number + fontColor?: string + fontEdge?: string + fontEdgeColor?: string + fontOpacity?: number + backgroundColor?: string + backgroundOpacity?: number + textAlign?: string + textAlignVertical?: string + windowColor?: string + windowOpacity?: number +} +``` + +--- + +### ClosedCaptionsSettings + +```typescript +type ClosedCaptionsSettings = { + enabled: boolean // Whether or not closed-captions should be enabled by default + styles?: ClosedCaptionsStyles // The default styles to use when displaying closed-captions + preferredLanguages?: string[] +} +``` + +See also: + +[ClosedCaptionsStyles](#closedcaptionsstyles) + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/Account/index.md b/apis/pr-fix-ci-fb-version/manage/Account/index.md new file mode 100644 index 000000000..127f50572 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Account/index.md @@ -0,0 +1,135 @@ +--- +title: Account + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Account Module + +--- + +Version Account 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [session](#session) +- [Types](#types) + - [Token](#token) + - [Expiry](#expiry) + +## Usage + +To use the Account module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Account } from '@firebolt-js/manage-sdk' +``` + +## Overview + +A module for querying about the device account. + +## Methods + +### session + +Used by a distributor to push Session token to firebolt. + +```typescript +function session(token: Token, expiresIn: Expiry): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ----------- | ------------------- | -------- | --------------- | +| `token` | [`Token`](#token) | true | | +| `expiresIn` | [`Expiry`](#expiry) | true |
minumum: 1 | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ------- | ------------------------------------- | +| manages | xrn:firebolt:capability:token:account | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Account } from '@firebolt-js/manage-sdk' + +let result = await Account.session( + 'RmlyZWJvbHQgTWFuYWdlIFNESyBSb2NrcyEhIQ==', + 84000, +) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Account.session", + "params": { + "token": "RmlyZWJvbHQgTWFuYWdlIFNESyBSb2NrcyEhIQ==", + "expiresIn": 84000 + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +## Types + +### Token + +Encoded token provided by the Distributor for Device Authentication. + +```typescript + +``` + +--- + +### Expiry + +Number of secs before the token expires + +```typescript + +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/AcknowledgeChallenge/index.md b/apis/pr-fix-ci-fb-version/manage/AcknowledgeChallenge/index.md new file mode 100644 index 000000000..f45dcba95 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/AcknowledgeChallenge/index.md @@ -0,0 +1,510 @@ +--- +title: AcknowledgeChallenge + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# AcknowledgeChallenge Module + +--- + +Version AcknowledgeChallenge 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [challengeError](#challengeerror) + - [challengeFocus](#challengefocus) + - [challengeResponse](#challengeresponse) + - [provide](#provide) +- [Events](#events) + - [onRequestChallenge](#onrequestchallenge) +- [Provider Interfaces](#provider-interfaces) + - [ChallengeProvider](#challengeprovider) +- [Types](#types) + - [GrantResult](#grantresult) + - [ChallengeRequestor](#challengerequestor) + - [Challenge](#challenge) + - [ChallengeProviderRequest](#challengeproviderrequest) + +## Usage + +To use the AcknowledgeChallenge module, you can import it into your project from the Firebolt SDK: + +```javascript +import { AcknowledgeChallenge } from '@firebolt-js/manage-sdk' +``` + +## Overview + +A module for registering as a provider for a user grant in which the user confirms access to a capability + +## Methods + +### challengeError + +_This is an private RPC method._ + +Internal API for Challenge Provider to send back error. + +Parameters: + +| Param | Type | Required | Description | +| --------------- | -------- | -------- | ----------- | +| `correlationId` | `string` | true | | +| `error` | `object` | true | | + +Result: + +Capabilities: + +| Role | Capability | +| -------- | ------------------------------------------------------ | +| provides | xrn:firebolt:capability:usergrant:acknowledgechallenge | + +#### Examples + +Example 1 + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "AcknowledgeChallenge.challengeError", + "params": { + "correlationId": "123", + "error": { + "code": 1, + "message": "Error" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +### challengeFocus + +_This is an private RPC method._ + +Internal API for Challenge Provider to request focus for UX purposes. + +Result: + +Capabilities: + +| Role | Capability | +| -------- | ------------------------------------------------------ | +| provides | xrn:firebolt:capability:usergrant:acknowledgechallenge | + +#### Examples + +Example + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "AcknowledgeChallenge.challengeFocus", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +### challengeResponse + +_This is an private RPC method._ + +Internal API for Challenge Provider to send back response. + +Parameters: + +| Param | Type | Required | Description | +| --------------- | ----------------------------- | -------- | ----------- | +| `correlationId` | `string` | true | | +| `result` | [`GrantResult`](#grantresult) | true | | + +Result: + +Capabilities: + +| Role | Capability | +| -------- | ------------------------------------------------------ | +| provides | xrn:firebolt:capability:usergrant:acknowledgechallenge | + +#### Examples + +Example #1 + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "AcknowledgeChallenge.challengeResponse", + "params": { + "correlationId": "123", + "result": { + "granted": true + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +Example #2 + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "AcknowledgeChallenge.challengeResponse", + "params": { + "correlationId": "123", + "result": { + "granted": false + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +Example #3 + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "AcknowledgeChallenge.challengeResponse", + "params": { + "correlationId": "123", + "result": { + "granted": null + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +### provide + +To provide a specific capability to the platform. See [Provider Interfaces](#provider-interfaces) for a list of interfaces available to provide in this module. + +```typescript +provide(capability: string, provider: any): void +``` + +Parameters: + +| Param | Type | Required | Summary | +| ------------ | -------- | -------- | -------------------------------------------- | +| `capability` | `string` | Yes | The capability that is being provided. | +| `provider` | `any` | Yes | An implementation of the required interface. | + +See [Provider Interfaces](#provider-interfaces) for each capabilities interface definition. + +## Events + +### onRequestChallenge + +_This is an private RPC method._ + +Registers as a provider for when the user should be challenged in order to confirm access to a capability + +Parameters: + +| Param | Type | Required | Description | +| -------- | --------- | -------- | ----------- | +| `listen` | `boolean` | true | | + +Result: + +[ChallengeProviderRequest](#challengeproviderrequest) + +Capabilities: + +| Role | Capability | +| -------- | ------------------------------------------------------ | +| provides | xrn:firebolt:capability:usergrant:acknowledgechallenge | + +#### Examples + +Default Example + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "AcknowledgeChallenge.onRequestChallenge", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "correlationId": "abc", + "parameters": { + "capability": "xrn:firebolt:capability:localization::postal-code", + "requestor": { + "id": "ReferenceApp", + "name": "Firebolt Reference App" + } + } + } +} +``` + +--- + +## Provider Interfaces + +### ChallengeProvider + +The provider interface for the `xrn:firebolt:capability:usergrant:acknowledgechallenge` capability. + +```typescript + +``` + +Usage: + +```typescript +AcknowledgeChallenge.provide('xrn:firebolt:capability:usergrant:acknowledgechallenge', provider: ChallengeProvider | object) +``` + +#### Examples + +**Register your app to provide the `xrn:firebolt:capability:usergrant:acknowledgechallenge` capability.** + +```javascript +import { AcknowledgeChallenge } from '@firebolt-js/manage-sdk' + +class MyChallengeProvider { + async challenge(parameters, session) { + return { + granted: true, + } + } +} + +AcknowledgeChallenge.provide( + 'xrn:firebolt:capability:usergrant:acknowledgechallenge', + new MyChallengeProvider(), +) +``` + +
+ JSON-RPC + +**Register to recieve each provider API** + +Request: + +```json +{ + "id": 1, + "method": "AcknowledgeChallenge.onRequestChallenge", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "id": 1, + "result": { + "listening": true, + "event": "AcknowledgeChallenge.onRequestChallenge" + } +} +``` + +**Asynchronous event to initiate challenge()** + +Event Response: + +```json +{ + "id": 1, + "result": { + "correlationId": undefined, + "parameters": { + "capability": "xrn:firebolt:capability:localization::postal-code", + "requestor": { + "id": "ReferenceApp", + "name": "Firebolt Reference App" + } + } + } +} +``` + +**App initiated response to event** + +Request: + +```json +{ + "id": 2, + "method": "AcknowledgeChallenge.challengeResponse", + "params": { + "correlationId": undefined, + "result": { + "granted": true + } + } +} +``` + +Response: + +```json +{ + "id": 2, + "result": true +} +``` + +
+ +## Types + +### GrantResult + +```typescript +type GrantResult = { + granted: boolean +} +``` + +--- + +### ChallengeRequestor + +```typescript +type ChallengeRequestor = { + id: string // The id of the app that requested the challenge + name: string // The name of the app that requested the challenge +} +``` + +--- + +### Challenge + +```typescript +type Challenge = { + capability: string // The capability that is being requested by the user to approve + requestor: ChallengeRequestor // The identity of which app is requesting access to this capability +} +``` + +See also: + +[ChallengeRequestor](#challengerequestor) + +--- + +### ChallengeProviderRequest + +```typescript +type ChallengeProviderRequest = { + parameters: Challenge // The result of the provider response. + correlationId: string // The id that was passed in to the event that triggered a provider method to be called +} +``` + +See also: + +[ProviderRequest](../Types/schemas/#ProviderRequest) +[Challenge](#challenge-1) + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/Advertising/index.md b/apis/pr-fix-ci-fb-version/manage/Advertising/index.md new file mode 100644 index 000000000..851253cc4 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Advertising/index.md @@ -0,0 +1,543 @@ +--- +title: Advertising + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Advertising Module + +--- + +Version Advertising 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [listen](#listen) + - [once](#once) + - [resetIdentifier](#resetidentifier) + - [skipRestriction](#skiprestriction) +- [Events](#events) + - [skipRestrictionChanged](#skiprestrictionchanged) +- [Types](#types) + +## Usage + +To use the Advertising module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Advertising } from '@firebolt-js/manage-sdk' +``` + +## Overview + +A module for platform provided advertising settings and functionality. + +## Methods + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | --------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Advertising.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | --------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Advertising.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | --------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Advertising.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | --------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Advertising.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### resetIdentifier + +Resets a user's identifier in the ad platform so that the advertising id that apps get will be a new value + +```typescript +function resetIdentifier(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ------- | ---------------------------------------------- | +| manages | xrn:firebolt:capability:advertising:identifier | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Advertising } from '@firebolt-js/manage-sdk' + +let result = await Advertising.resetIdentifier() +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Advertising.resetIdentifier", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### skipRestriction + +Set the value for AdPolicy.skipRestriction + +To get the value of `skipRestriction` call the method like this: + +```typescript +function skipRestriction(): Promise +``` + +Promise resolution: + +[SkipRestriction](../Advertising/schemas/#SkipRestriction) + +Capabilities: + +| Role | Capability | +| ------- | ------------------------------------------------- | +| manages | xrn:firebolt:capability:advertising:configuration | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Advertising } from '@firebolt-js/manage-sdk' + +let result = await Advertising.skipRestriction() +console.log(result) +``` + +Value of `result`: + +```javascript +'none' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Advertising.skipRestriction", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "none" +} +``` + +
+ +Additional Example + +JavaScript: + +```javascript +import { Advertising } from '@firebolt-js/manage-sdk' + +let result = await Advertising.skipRestriction() +console.log(result) +``` + +Value of `result`: + +```javascript +'none' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Advertising.skipRestriction", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "all" +} +``` + +
+ +--- + +To set the value of `skipRestriction` call the method like this: + +```typescript +function skipRestriction(value: SkipRestriction): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ------------------------------------------------------------ | -------- | ------------------------------------------------------------ | +| `value` | [`SkipRestriction`](../Advertising/schemas/#SkipRestriction) | true |
values: `'none' \| 'adsUnwatched' \| 'adsAll' \| 'all'` | + +Promise resolution: + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Advertising } from '@firebolt-js/manage-sdk' + +let result = await Advertising.skipRestriction('none') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Advertising.setSkipRestriction", + "params": { + "value": "none" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Additional Example + +JavaScript: + +```javascript +import { Advertising } from '@firebolt-js/manage-sdk' + +let result = await Advertising.skipRestriction('all') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Advertising.setSkipRestriction", + "params": { + "value": "all" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function skipRestriction(callback: (value) => SkipRestriction): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Advertising } from '@firebolt-js/manage-sdk' + +let listenerId = await skipRestriction((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `result`: + +```javascript +'none' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Advertising.onSkipRestrictionChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "none" +} +``` + +
+ +Additional Example + +JavaScript: + +```javascript +import { Advertising } from '@firebolt-js/manage-sdk' + +let listenerId = await skipRestriction((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `result`: + +```javascript +'none' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Advertising.onSkipRestrictionChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "all" +} +``` + +
+ +--- + +## Events + +### skipRestrictionChanged + +See: [skipRestriction](#skiprestriction) + +## Types diff --git a/apis/pr-fix-ci-fb-version/manage/Advertising/schemas/index.md b/apis/pr-fix-ci-fb-version/manage/Advertising/schemas/index.md new file mode 100644 index 000000000..228d3f29a --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Advertising/schemas/index.md @@ -0,0 +1,53 @@ +--- +title: Advertising + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Advertising + +--- + +Version Advertising 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [SkipRestriction](#skiprestriction) + +## Overview + +undefined + +## Types + +### SkipRestriction + +The advertisement skip restriction. + +Applies to fast-forward/rewind (e.g. trick mode), seeking over an entire opportunity (e.g. jump), seeking out of what's currently playing, and "Skip this ad..." features. Seeking over multiple ad opportunities only requires playback of the _last_ opportunity, not all opportunities, preceding the seek destination. + +| Value | Description | +| ------------ | ------------------------------------------------------------------------------ | +| none | No fast-forward, jump, or skip restrictions | +| adsUnwatched | Restrict fast-forward, jump, and skip for unwatched ad opportunities only. | +| adsAll | Restrict fast-forward, jump, and skip for all ad opportunities | +| all | Restrict fast-forward, jump, and skip for all ad opportunities and all content | + +Namespace: `xrn:advertising:policy:skipRestriction:` + +```typescript +SkipRestriction: { + NONE: 'none', + ADS_UNWATCHED: 'adsUnwatched', + ADS_ALL: 'adsAll', + ALL: 'all', +}, + +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/AudioDescriptions/index.md b/apis/pr-fix-ci-fb-version/manage/AudioDescriptions/index.md new file mode 100644 index 000000000..3b75f942b --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/AudioDescriptions/index.md @@ -0,0 +1,478 @@ +--- +title: AudioDescriptions + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# AudioDescriptions Module + +--- + +Version AudioDescriptions 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [enabled](#enabled) + - [listen](#listen) + - [once](#once) +- [Events](#events) + - [enabledChanged](#enabledchanged) +- [Types](#types) + +## Usage + +To use the AudioDescriptions module, you can import it into your project from the Firebolt SDK: + +```javascript +import { AudioDescriptions } from '@firebolt-js/manage-sdk' +``` + +## Overview + +A module for managing audio-description Settings. + +## Methods + +### enabled + +Whether or not audio-descriptions are enabled. + +To get the value of `enabled` call the method like this: + +```typescript +function enabled(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:audiodescriptions | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { AudioDescriptions } from '@firebolt-js/manage-sdk' + +let enabled = await AudioDescriptions.enabled() +console.log(enabled) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "AudioDescriptions.enabled", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { AudioDescriptions } from '@firebolt-js/manage-sdk' + +let enabled = await AudioDescriptions.enabled() +console.log(enabled) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "AudioDescriptions.enabled", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `enabled` call the method like this: + +```typescript +function enabled(value: boolean): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------- | -------- | ----------- | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { AudioDescriptions } from '@firebolt-js/manage-sdk' + +let result = await AudioDescriptions.enabled(true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "AudioDescriptions.setEnabled", + "params": { + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { AudioDescriptions } from '@firebolt-js/manage-sdk' + +let result = await AudioDescriptions.enabled(false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "AudioDescriptions.setEnabled", + "params": { + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function enabled(callback: (value) => boolean): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { AudioDescriptions } from '@firebolt-js/manage-sdk' + +let listenerId = await enabled((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "AudioDescriptions.onEnabledChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { AudioDescriptions } from '@firebolt-js/manage-sdk' + +let listenerId = await enabled((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "AudioDescriptions.onEnabledChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | --------------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `AudioDescriptions.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | --------------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `AudioDescriptions.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | --------------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `AudioDescriptions.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | --------------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `AudioDescriptions.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +## Events + +### enabledChanged + +See: [enabled](#enabled) + +## Types diff --git a/apis/pr-fix-ci-fb-version/manage/Capabilities/schemas/index.md b/apis/pr-fix-ci-fb-version/manage/Capabilities/schemas/index.md new file mode 100644 index 000000000..5dce8e63e --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Capabilities/schemas/index.md @@ -0,0 +1,121 @@ +--- +title: Capabilities + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Capabilities + +--- + +Version Capabilities 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [Role](#role) + - [DenyReason](#denyreason) + - [Capability](#capability) + - [CapPermissionStatus](#cappermissionstatus) + - [CapabilityInfo](#capabilityinfo) + - [Permission](#permission) + +## Overview + +undefined + +## Types + +### Role + +Role provides access level for the app for a given capability. + +```typescript +Role: { + USE: 'use', + MANAGE: 'manage', + PROVIDE: 'provide', +}, + +``` + +--- + +### DenyReason + +Reasons why a Capability might not be invokable + +```typescript +DenyReason: { + UNPERMITTED: 'unpermitted', + UNSUPPORTED: 'unsupported', + DISABLED: 'disabled', + UNAVAILABLE: 'unavailable', + GRANT_DENIED: 'grantDenied', + UNGRANTED: 'ungranted', +}, + +``` + +--- + +### Capability + +A Capability is a discrete unit of functionality that a Firebolt device might be able to perform. + +```typescript + +``` + +--- + +### CapPermissionStatus + +```typescript + +``` + +--- + +### CapabilityInfo + +```typescript +type CapabilityInfo = { + capability?: Capability // A Capability is a discrete unit of functionality that a Firebolt device might be able to perform. + supported: boolean // Provides info whether the capability is supported + available: boolean // Provides info whether the capability is available + use: object + manage: object + provide: object + details?: DenyReason[] // Reasons why a Capability might not be invokable +} +``` + +See also: + +[Capability](#capability) +[DenyReason](#denyreason) + +--- + +### Permission + +A capability combined with a Role, which an app may be permitted (by a distributor) or granted (by an end user). + +```typescript +type Permission = { + role?: Role // Role provides access level for the app for a given capability. + capability: Capability // A Capability is a discrete unit of functionality that a Firebolt device might be able to perform. +} +``` + +See also: + +[Role](#role) +[Capability](#capability) + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/ClosedCaptions/index.md b/apis/pr-fix-ci-fb-version/manage/ClosedCaptions/index.md new file mode 100644 index 000000000..a9e359c6c --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/ClosedCaptions/index.md @@ -0,0 +1,6328 @@ +--- +title: ClosedCaptions + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# ClosedCaptions Module + +--- + +Version ClosedCaptions 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [backgroundColor](#backgroundcolor) + - [backgroundOpacity](#backgroundopacity) + - [enabled](#enabled) + - [fontColor](#fontcolor) + - [fontEdge](#fontedge) + - [fontEdgeColor](#fontedgecolor) + - [fontFamily](#fontfamily) + - [fontOpacity](#fontopacity) + - [fontSize](#fontsize) + - [listen](#listen) + - [once](#once) + - [preferredLanguages](#preferredlanguages) + - [textAlign](#textalign) + - [textAlignVertical](#textalignvertical) + - [windowColor](#windowcolor) + - [windowOpacity](#windowopacity) +- [Events](#events) + - [backgroundColorChanged](#backgroundcolorchanged) + - [backgroundOpacityChanged](#backgroundopacitychanged) + - [enabledChanged](#enabledchanged) + - [fontColorChanged](#fontcolorchanged) + - [fontEdgeChanged](#fontedgechanged) + - [fontEdgeColorChanged](#fontedgecolorchanged) + - [fontFamilyChanged](#fontfamilychanged) + - [fontOpacityChanged](#fontopacitychanged) + - [fontSizeChanged](#fontsizechanged) + - [preferredLanguagesChanged](#preferredlanguageschanged) + - [textAlignChanged](#textalignchanged) + - [textAlignVerticalChanged](#textalignverticalchanged) + - [windowColorChanged](#windowcolorchanged) + - [windowOpacityChanged](#windowopacitychanged) +- [Types](#types) + +## Usage + +To use the ClosedCaptions module, you can import it into your project from the Firebolt SDK: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' +``` + +## Overview + +A module for managing closed-captions Settings. + +## Methods + +### backgroundColor + +The preferred background color for displaying closed-captions, . + +To get the value of `backgroundColor` call the method like this: + +```typescript +function backgroundColor(): Promise +``` + +Promise resolution: + +[Color](../Accessibility/schemas/#Color) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:closedcaptions | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let color = await ClosedCaptions.backgroundColor() +console.log(color) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.backgroundColor", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "#000000" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let color = await ClosedCaptions.backgroundColor() +console.log(color) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.backgroundColor", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "#ffffff" +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let color = await ClosedCaptions.backgroundColor() +console.log(color) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.backgroundColor", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To set the value of `backgroundColor` call the method like this: + +```typescript +function backgroundColor(value: Color): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ------------------------------------------ | -------- | ----------- | +| `value` | [`Color`](../Accessibility/schemas/#Color) | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.backgroundColor('#000000') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setBackgroundColor", + "params": { + "value": "#000000" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.backgroundColor('#ffffff') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setBackgroundColor", + "params": { + "value": "#ffffff" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.backgroundColor(null) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setBackgroundColor", + "params": { + "value": null + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function backgroundColor(callback: (value) => Color): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await backgroundColor((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onBackgroundColorChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "#000000" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await backgroundColor((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onBackgroundColorChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "#ffffff" +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await backgroundColor((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onBackgroundColorChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### backgroundOpacity + +The preferred opacity for displaying closed-captions backgrounds. + +To get the value of `backgroundOpacity` call the method like this: + +```typescript +function backgroundOpacity(): Promise +``` + +Promise resolution: + +[Opacity](../Accessibility/schemas/#Opacity) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:closedcaptions | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let opacity = await ClosedCaptions.backgroundOpacity() +console.log(opacity) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.backgroundOpacity", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 99 +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let opacity = await ClosedCaptions.backgroundOpacity() +console.log(opacity) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.backgroundOpacity", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 100 +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let opacity = await ClosedCaptions.backgroundOpacity() +console.log(opacity) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.backgroundOpacity", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To set the value of `backgroundOpacity` call the method like this: + +```typescript +function backgroundOpacity(value: Opacity): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ---------------------------------------------- | -------- | ----------- | +| `value` | [`Opacity`](../Accessibility/schemas/#Opacity) | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.backgroundOpacity(99) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setBackgroundOpacity", + "params": { + "value": 99 + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.backgroundOpacity(100) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setBackgroundOpacity", + "params": { + "value": 100 + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.backgroundOpacity(null) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setBackgroundOpacity", + "params": { + "value": null + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function backgroundOpacity(callback: (value) => Opacity): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await backgroundOpacity((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onBackgroundOpacityChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 99 +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await backgroundOpacity((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onBackgroundOpacityChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 100 +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await backgroundOpacity((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onBackgroundOpacityChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### enabled + +Whether or not closed-captions are enabled. + +To get the value of `enabled` call the method like this: + +```typescript +function enabled(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:closedcaptions | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let enabled = await ClosedCaptions.enabled() +console.log(enabled) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.enabled", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let enabled = await ClosedCaptions.enabled() +console.log(enabled) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.enabled", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `enabled` call the method like this: + +```typescript +function enabled(value: boolean): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------- | -------- | ----------- | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.enabled(true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setEnabled", + "params": { + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.enabled(false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setEnabled", + "params": { + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function enabled(callback: (value) => boolean): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await enabled((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onEnabledChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await enabled((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onEnabledChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### fontColor + +The preferred font color for displaying closed-captions. + +To get the value of `fontColor` call the method like this: + +```typescript +function fontColor(): Promise +``` + +Promise resolution: + +[Color](../Accessibility/schemas/#Color) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:closedcaptions | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let color = await ClosedCaptions.fontColor() +console.log(color) +``` + +Value of `color`: + +```javascript +'#ffffff' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontColor", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "#ffffff" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let color = await ClosedCaptions.fontColor() +console.log(color) +``` + +Value of `color`: + +```javascript +'#ffffff' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontColor", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "#000000" +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let color = await ClosedCaptions.fontColor() +console.log(color) +``` + +Value of `color`: + +```javascript +'#ffffff' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontColor", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To set the value of `fontColor` call the method like this: + +```typescript +function fontColor(value: Color): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ------------------------------------------ | -------- | ----------- | +| `value` | [`Color`](../Accessibility/schemas/#Color) | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontColor('#ffffff') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontColor", + "params": { + "value": "#ffffff" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontColor('#000000') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontColor", + "params": { + "value": "#000000" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontColor(null) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontColor", + "params": { + "value": null + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function fontColor(callback: (value) => Color): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontColor((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `color`: + +```javascript +'#ffffff' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontColorChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "#ffffff" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontColor((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `color`: + +```javascript +'#ffffff' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontColorChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "#000000" +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontColor((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `color`: + +```javascript +'#ffffff' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontColorChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### fontEdge + +The preferred font edge style for displaying closed-captions. + +To get the value of `fontEdge` call the method like this: + +```typescript +function fontEdge(): Promise +``` + +Promise resolution: + +[FontEdge](../Accessibility/schemas/#FontEdge) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:closedcaptions | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let edge = await ClosedCaptions.fontEdge() +console.log(edge) +``` + +Value of `edge`: + +```javascript +'none' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontEdge", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "none" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let edge = await ClosedCaptions.fontEdge() +console.log(edge) +``` + +Value of `edge`: + +```javascript +'none' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontEdge", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "uniform" +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let edge = await ClosedCaptions.fontEdge() +console.log(edge) +``` + +Value of `edge`: + +```javascript +'none' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontEdge", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To set the value of `fontEdge` call the method like this: + +```typescript +function fontEdge(value: FontEdge): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ------------------------------------------------ | -------- | ----------- | +| `value` | [`FontEdge`](../Accessibility/schemas/#FontEdge) | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontEdge('none') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontEdge", + "params": { + "value": "none" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontEdge('uniform') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontEdge", + "params": { + "value": "uniform" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontEdge(null) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontEdge", + "params": { + "value": null + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function fontEdge(callback: (value) => FontEdge): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontEdge((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `edge`: + +```javascript +'none' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontEdgeChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "none" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontEdge((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `edge`: + +```javascript +'none' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontEdgeChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "uniform" +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontEdge((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `edge`: + +```javascript +'none' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontEdgeChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### fontEdgeColor + +The preferred font edge color for displaying closed-captions. + +To get the value of `fontEdgeColor` call the method like this: + +```typescript +function fontEdgeColor(): Promise +``` + +Promise resolution: + +[Color](../Accessibility/schemas/#Color) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:closedcaptions | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let color = await ClosedCaptions.fontEdgeColor() +console.log(color) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontEdgeColor", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "#000000" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let color = await ClosedCaptions.fontEdgeColor() +console.log(color) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontEdgeColor", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "#ffffff" +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let color = await ClosedCaptions.fontEdgeColor() +console.log(color) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontEdgeColor", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To set the value of `fontEdgeColor` call the method like this: + +```typescript +function fontEdgeColor(value: Color): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ------------------------------------------ | -------- | ----------- | +| `value` | [`Color`](../Accessibility/schemas/#Color) | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontEdgeColor('#000000') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontEdgeColor", + "params": { + "value": "#000000" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontEdgeColor('#ffffff') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontEdgeColor", + "params": { + "value": "#ffffff" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontEdgeColor(null) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontEdgeColor", + "params": { + "value": null + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function fontEdgeColor(callback: (value) => Color): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontEdgeColor((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontEdgeColorChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "#000000" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontEdgeColor((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontEdgeColorChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "#ffffff" +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontEdgeColor((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontEdgeColorChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### fontFamily + +The preferred font family for displaying closed-captions. + +To get the value of `fontFamily` call the method like this: + +```typescript +function fontFamily(): Promise +``` + +Promise resolution: + +[FontFamily](../Accessibility/schemas/#FontFamily) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:closedcaptions | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let family = await ClosedCaptions.fontFamily() +console.log(family) +``` + +Value of `family`: + +```javascript +'monospaced_sanserif' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontFamily", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "monospaced_sanserif" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let family = await ClosedCaptions.fontFamily() +console.log(family) +``` + +Value of `family`: + +```javascript +'monospaced_sanserif' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontFamily", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "cursive" +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let family = await ClosedCaptions.fontFamily() +console.log(family) +``` + +Value of `family`: + +```javascript +'monospaced_sanserif' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontFamily", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To set the value of `fontFamily` call the method like this: + +```typescript +function fontFamily(value: FontFamily): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ---------------------------------------------------- | -------- | ----------- | +| `value` | [`FontFamily`](../Accessibility/schemas/#FontFamily) | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontFamily('monospaced_sanserif') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontFamily", + "params": { + "value": "monospaced_sanserif" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontFamily('cursive') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontFamily", + "params": { + "value": "cursive" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontFamily(null) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontFamily", + "params": { + "value": null + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function fontFamily(callback: (value) => FontFamily): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontFamily((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `family`: + +```javascript +'monospaced_sanserif' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontFamilyChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "monospaced_sanserif" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontFamily((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `family`: + +```javascript +'monospaced_sanserif' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontFamilyChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "cursive" +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontFamily((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `family`: + +```javascript +'monospaced_sanserif' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontFamilyChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### fontOpacity + +The preferred opacity for displaying closed-captions characters. + +To get the value of `fontOpacity` call the method like this: + +```typescript +function fontOpacity(): Promise +``` + +Promise resolution: + +[Opacity](../Accessibility/schemas/#Opacity) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:closedcaptions | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let opacity = await ClosedCaptions.fontOpacity() +console.log(opacity) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontOpacity", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 99 +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let opacity = await ClosedCaptions.fontOpacity() +console.log(opacity) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontOpacity", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 100 +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let opacity = await ClosedCaptions.fontOpacity() +console.log(opacity) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontOpacity", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To set the value of `fontOpacity` call the method like this: + +```typescript +function fontOpacity(value: Opacity): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ---------------------------------------------- | -------- | ----------- | +| `value` | [`Opacity`](../Accessibility/schemas/#Opacity) | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontOpacity(99) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontOpacity", + "params": { + "value": 99 + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontOpacity(100) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontOpacity", + "params": { + "value": 100 + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontOpacity(null) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontOpacity", + "params": { + "value": null + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function fontOpacity(callback: (value) => Opacity): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontOpacity((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontOpacityChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 99 +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontOpacity((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontOpacityChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 100 +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontOpacity((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontOpacityChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### fontSize + +The preferred font size for displaying closed-captions. + +To get the value of `fontSize` call the method like this: + +```typescript +function fontSize(): Promise +``` + +Promise resolution: + +[FontSize](../Accessibility/schemas/#FontSize) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:closedcaptions | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let size = await ClosedCaptions.fontSize() +console.log(size) +``` + +Value of `size`: + +```javascript +1 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontSize", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 1 +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let size = await ClosedCaptions.fontSize() +console.log(size) +``` + +Value of `size`: + +```javascript +1 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontSize", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 1 +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let size = await ClosedCaptions.fontSize() +console.log(size) +``` + +Value of `size`: + +```javascript +1 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.fontSize", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To set the value of `fontSize` call the method like this: + +```typescript +function fontSize(value: FontSize): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ------------------------------------------------ | -------- | ----------- | +| `value` | [`FontSize`](../Accessibility/schemas/#FontSize) | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontSize(1) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontSize", + "params": { + "value": 1 + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontSize(1) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontSize", + "params": { + "value": 1 + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.fontSize(null) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setFontSize", + "params": { + "value": null + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function fontSize(callback: (value) => FontSize): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontSize((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `size`: + +```javascript +1 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontSizeChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 1 +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontSize((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `size`: + +```javascript +1 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontSizeChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 1 +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await fontSize((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `size`: + +```javascript +1 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onFontSizeChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------------ | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `ClosedCaptions.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------------ | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `ClosedCaptions.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------------ | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `ClosedCaptions.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------------ | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `ClosedCaptions.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### preferredLanguages + +A prioritized list of ISO 639-2/B codes for the preferred closed captions languages on this device. + +To get the value of `preferredLanguages` call the method like this: + +```typescript +function preferredLanguages(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:closedcaptions | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let languages = await ClosedCaptions.preferredLanguages() +console.log(languages) +``` + +Value of `languages`: + +```javascript +;['spa', 'eng'] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.preferredLanguages", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": ["spa", "eng"] +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let languages = await ClosedCaptions.preferredLanguages() +console.log(languages) +``` + +Value of `languages`: + +```javascript +;['spa', 'eng'] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.preferredLanguages", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": ["eng", "spa"] +} +``` + +
+ +--- + +To set the value of `preferredLanguages` call the method like this: + +```typescript +function preferredLanguages(value: ISO639_2Language[]): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | -------------------- | -------- | ---------------------------------------------------------------- | +| `value` | `ISO639_2Language[]` | true | the preferred closed captions languages
pattern: ^[a-z]{3}$ | + +Promise resolution: + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.preferredLanguages(['spa', 'eng']) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setPreferredLanguages", + "params": { + "value": ["spa", "eng"] + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.preferredLanguages(['eng', 'spa']) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setPreferredLanguages", + "params": { + "value": ["eng", "spa"] + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function preferredLanguages( + callback: (value) => ISO639_2Language[], +): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await preferredLanguages((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `languages`: + +```javascript +;['spa', 'eng'] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onPreferredLanguagesChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": ["spa", "eng"] +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await preferredLanguages((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `languages`: + +```javascript +;['spa', 'eng'] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onPreferredLanguagesChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": ["eng", "spa"] +} +``` + +
+ +--- + +### textAlign + +The preferred horizontal alignment for displaying closed-captions characters. + +To get the value of `textAlign` call the method like this: + +```typescript +function textAlign(): Promise +``` + +Promise resolution: + +[HorizontalAlignment](../Accessibility/schemas/#HorizontalAlignment) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:closedcaptions | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let alignment = await ClosedCaptions.textAlign() +console.log(alignment) +``` + +Value of `alignment`: + +```javascript +'center' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.textAlign", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "center" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let alignment = await ClosedCaptions.textAlign() +console.log(alignment) +``` + +Value of `alignment`: + +```javascript +'center' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.textAlign", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "left" +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let alignment = await ClosedCaptions.textAlign() +console.log(alignment) +``` + +Value of `alignment`: + +```javascript +'center' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.textAlign", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To set the value of `textAlign` call the method like this: + +```typescript +function textAlign(value: HorizontalAlignment): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ---------------------------------------------------------------------- | -------- | ----------- | +| `value` | [`HorizontalAlignment`](../Accessibility/schemas/#HorizontalAlignment) | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.textAlign('center') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setTextAlign", + "params": { + "value": "center" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.textAlign('left') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setTextAlign", + "params": { + "value": "left" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.textAlign(null) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setTextAlign", + "params": { + "value": null + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function textAlign(callback: (value) => HorizontalAlignment): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await textAlign((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `alignment`: + +```javascript +'center' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onTextAlignChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "center" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await textAlign((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `alignment`: + +```javascript +'center' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onTextAlignChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "left" +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await textAlign((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `alignment`: + +```javascript +'center' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onTextAlignChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### textAlignVertical + +The preferred horizontal alignment for displaying closed-captions characters. + +To get the value of `textAlignVertical` call the method like this: + +```typescript +function textAlignVertical(): Promise +``` + +Promise resolution: + +[VerticalAlignment](../Accessibility/schemas/#VerticalAlignment) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:closedcaptions | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let alignment = await ClosedCaptions.textAlignVertical() +console.log(alignment) +``` + +Value of `alignment`: + +```javascript +'middle' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.textAlignVertical", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "middle" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let alignment = await ClosedCaptions.textAlignVertical() +console.log(alignment) +``` + +Value of `alignment`: + +```javascript +'middle' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.textAlignVertical", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "top" +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let alignment = await ClosedCaptions.textAlignVertical() +console.log(alignment) +``` + +Value of `alignment`: + +```javascript +'middle' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.textAlignVertical", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To set the value of `textAlignVertical` call the method like this: + +```typescript +function textAlignVertical(value: VerticalAlignment): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ------------------------------------------------------------------ | -------- | ----------- | +| `value` | [`VerticalAlignment`](../Accessibility/schemas/#VerticalAlignment) | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.textAlignVertical('middle') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setTextAlignVertical", + "params": { + "value": "middle" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.textAlignVertical('top') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setTextAlignVertical", + "params": { + "value": "top" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.textAlignVertical(null) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setTextAlignVertical", + "params": { + "value": null + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function textAlignVertical( + callback: (value) => VerticalAlignment, +): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await textAlignVertical((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `alignment`: + +```javascript +'middle' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onTextAlignVerticalChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "middle" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await textAlignVertical((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `alignment`: + +```javascript +'middle' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onTextAlignVerticalChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "top" +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await textAlignVertical((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `alignment`: + +```javascript +'middle' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onTextAlignVerticalChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### windowColor + +The preferred window color for displaying closed-captions, . + +To get the value of `windowColor` call the method like this: + +```typescript +function windowColor(): Promise +``` + +Promise resolution: + +[Color](../Accessibility/schemas/#Color) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:closedcaptions | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let color = await ClosedCaptions.windowColor() +console.log(color) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.windowColor", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "#000000" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let color = await ClosedCaptions.windowColor() +console.log(color) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.windowColor", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "white" +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let color = await ClosedCaptions.windowColor() +console.log(color) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.windowColor", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To set the value of `windowColor` call the method like this: + +```typescript +function windowColor(value: Color): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ------------------------------------------ | -------- | ----------- | +| `value` | [`Color`](../Accessibility/schemas/#Color) | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.windowColor('#000000') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setWindowColor", + "params": { + "value": "#000000" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.windowColor('white') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setWindowColor", + "params": { + "value": "white" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.windowColor(null) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setWindowColor", + "params": { + "value": null + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function windowColor(callback: (value) => Color): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await windowColor((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onWindowColorChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "#000000" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await windowColor((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onWindowColorChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "white" +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await windowColor((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `color`: + +```javascript +'#000000' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onWindowColorChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### windowOpacity + +The preferred window opacity for displaying closed-captions backgrounds. + +To get the value of `windowOpacity` call the method like this: + +```typescript +function windowOpacity(): Promise +``` + +Promise resolution: + +[Opacity](../Accessibility/schemas/#Opacity) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:closedcaptions | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let opacity = await ClosedCaptions.windowOpacity() +console.log(opacity) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.windowOpacity", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 99 +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let opacity = await ClosedCaptions.windowOpacity() +console.log(opacity) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.windowOpacity", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 100 +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let opacity = await ClosedCaptions.windowOpacity() +console.log(opacity) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.windowOpacity", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To set the value of `windowOpacity` call the method like this: + +```typescript +function windowOpacity(value: Opacity): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ---------------------------------------------- | -------- | ----------- | +| `value` | [`Opacity`](../Accessibility/schemas/#Opacity) | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.windowOpacity(99) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setWindowOpacity", + "params": { + "value": 99 + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.windowOpacity(100) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setWindowOpacity", + "params": { + "value": 100 + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let result = await ClosedCaptions.windowOpacity(null) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.setWindowOpacity", + "params": { + "value": null + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function windowOpacity(callback: (value) => Opacity): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await windowOpacity((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onWindowOpacityChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 99 +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await windowOpacity((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onWindowOpacityChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 100 +} +``` + +
+ +Default example #3 + +JavaScript: + +```javascript +import { ClosedCaptions } from '@firebolt-js/manage-sdk' + +let listenerId = await windowOpacity((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `opacity`: + +```javascript +99 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "ClosedCaptions.onWindowOpacityChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +## Events + +### backgroundColorChanged + +See: [backgroundColor](#backgroundcolor) + +### backgroundOpacityChanged + +See: [backgroundOpacity](#backgroundopacity) + +### enabledChanged + +See: [enabled](#enabled) + +### fontColorChanged + +See: [fontColor](#fontcolor) + +### fontEdgeChanged + +See: [fontEdge](#fontedge) + +### fontEdgeColorChanged + +See: [fontEdgeColor](#fontedgecolor) + +### fontFamilyChanged + +See: [fontFamily](#fontfamily) + +### fontOpacityChanged + +See: [fontOpacity](#fontopacity) + +### fontSizeChanged + +See: [fontSize](#fontsize) + +### preferredLanguagesChanged + +See: [preferredLanguages](#preferredlanguages) + +### textAlignChanged + +See: [textAlign](#textalign) + +### textAlignVerticalChanged + +See: [textAlignVertical](#textalignvertical) + +### windowColorChanged + +See: [windowColor](#windowcolor) + +### windowOpacityChanged + +See: [windowOpacity](#windowopacity) + +## Types diff --git a/apis/pr-fix-ci-fb-version/manage/Device/index.md b/apis/pr-fix-ci-fb-version/manage/Device/index.md new file mode 100644 index 000000000..52e05f0e8 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Device/index.md @@ -0,0 +1,672 @@ +--- +title: Device + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Device Module + +--- + +Version Device 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [listen](#listen) + - [name](#name) + - [once](#once) + - [provision](#provision) +- [Events](#events) + - [deviceNameChanged](#devicenamechanged) + - [nameChanged](#namechanged) +- [Types](#types) + +## Usage + +To use the Device module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Device } from '@firebolt-js/manage-sdk' +``` + +## Overview + +A module for querying about the device and it's capabilities. + +## Methods + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Device.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Device.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### name + +The human readable name of the device + +To get the value of `name` call the method like this: + +```typescript +function name(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:device:name | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/manage-sdk' + +let value = await Device.name() +console.log(value) +``` + +Value of `value`: + +```javascript +'Living Room' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.name", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Living Room" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/manage-sdk' + +let value = await Device.name() +console.log(value) +``` + +Value of `value`: + +```javascript +'Living Room' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.name", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Kitchen" +} +``` + +
+ +--- + +To set the value of `name` call the method like this: + +```typescript +function name(value: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | -------- | -------- | ------------------------ | +| `value` | `string` | true | the device friendly-name | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/manage-sdk' + +let result = await Device.name('Living Room') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.setName", + "params": { + "value": "Living Room" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/manage-sdk' + +let result = await Device.name('Kitchen') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.setName", + "params": { + "value": "Kitchen" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function name(callback: (value) => string): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/manage-sdk' + +let listenerId = await name((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `value`: + +```javascript +'Living Room' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.onNameChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Living Room" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/manage-sdk' + +let listenerId = await name((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `value`: + +```javascript +'Living Room' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.onNameChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Kitchen" +} +``` + +
+ +--- + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Device.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Device.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### provision + +Used by a distributor to push provision info to firebolt. + +```typescript +function provision( + accountId: string, + deviceId: string, + distributorId: string, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| --------------- | -------- | -------- | ----------------------------------------------------------------------- | +| `accountId` | `string` | true | The id of the account that is device is attached to in the back office. | +| `deviceId` | `string` | true | The id of the device in the back office. | +| `distributorId` | `string` | false | The id of the distributor in the back office. | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ------- | ----------------------------------------------------------------------------------------------------------------------- | +| manages | xrn:firebolt:capability:account:id
xrn:firebolt:capability:device:id
xrn:firebolt:capability:device:distributor | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/manage-sdk' + +let result = await Device.provision('12345678910', '987654321111', null) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.provision", + "params": { + "accountId": "12345678910", + "deviceId": "987654321111" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +With distributor id + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/manage-sdk' + +let result = await Device.provision( + '12345678910', + '987654321111', + 'global_partner', +) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.provision", + "params": { + "accountId": "12345678910", + "deviceId": "987654321111", + "distributorId": "global_partner" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +## Events + +### deviceNameChanged + +```typescript +function listen('deviceNameChanged', () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Event value: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:device:name | + +#### Examples + +Getting the device name + +JavaScript: + +```javascript +import { Device } from '@firebolt-js/manage-sdk' + +Device.listen('deviceNameChanged', (value) => { + console.log(value) +}) +``` + +Value of `value`: + +```javascript +'Living Room' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Device.onDeviceNameChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Living Room" +} +``` + +
+ +--- + +### nameChanged + +See: [name](#name) + +## Types diff --git a/apis/pr-fix-ci-fb-version/manage/Discovery/index.md b/apis/pr-fix-ci-fb-version/manage/Discovery/index.md new file mode 100644 index 000000000..f48851855 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Discovery/index.md @@ -0,0 +1,305 @@ +--- +title: Discovery + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Discovery Module + +--- + +Version Discovery 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) + - [Localization](#localization) +- [Methods](#methods) + - [listen](#listen) + - [once](#once) +- [Events](#events) + - [signIn](#signin) + - [signOut](#signout) +- [Types](#types) + +## Usage + +To use the Discovery module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Discovery } from '@firebolt-js/manage-sdk' +``` + +## Overview + +Your App likely wants to integrate with the Platform's discovery capabilities. For example to add a "Watch Next" tile that links to your app from the platform's home screen. + +Getting access to this information requires to connect to lower level APIs made available by the platform. Since implementations differ between operators and platforms, the Firebolt SDK offers a Discovery module, that exposes a generic, agnostic interface to the developer. + +Under the hood, an underlaying transport layer will then take care of calling the right APIs for the actual platform implementation that your App is running on. + +The Discovery plugin is used to _send_ information to the Platform. + +### Localization + +Apps should provide all user-facing strings in the device's language, as specified by the Firebolt `Localization.language` property. + +Apps should provide prices in the same currency presented in the app. If multiple currencies are supported in the app, the app should provide prices in the user's current default currency. + +## Methods + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Discovery.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Discovery.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Discovery.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Discovery.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +## Events + +### signIn + +```typescript +function listen('signIn', () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Event value: + +Capabilities: + +| Role | Capability | +| ------- | ------------------------------------------------ | +| manages | xrn:firebolt:capability:discovery:sign-in-status | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/manage-sdk' + +Discovery.listen('signIn', (event) => { + console.log(event) +}) +``` + +Value of `event`: + +```javascript +{ + "appId": "firecert" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.onSignIn", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "appId": "firecert" + } +} +``` + +
+ +--- + +### signOut + +```typescript +function listen('signOut', () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Event value: + +Capabilities: + +| Role | Capability | +| ------- | ------------------------------------------------ | +| manages | xrn:firebolt:capability:discovery:sign-in-status | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Discovery } from '@firebolt-js/manage-sdk' + +Discovery.listen('signOut', (event) => { + console.log(event) +}) +``` + +Value of `event`: + +```javascript +{ + "appId": "firecert" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Discovery.onSignOut", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "appId": "firecert" + } +} +``` + +
+ +--- + +## Types diff --git a/apis/pr-fix-ci-fb-version/manage/Discovery/schemas/index.md b/apis/pr-fix-ci-fb-version/manage/Discovery/schemas/index.md new file mode 100644 index 000000000..3946fc794 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Discovery/schemas/index.md @@ -0,0 +1,88 @@ +--- +title: Discovery + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Discovery + +--- + +Version Discovery 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [InterestType](#interesttype) + - [InterestReason](#interestreason) + - [EntityInfoResult](#entityinforesult) + - [PurchasedContentResult](#purchasedcontentresult) + +## Overview + +undefined + +## Types + +### InterestType + +```typescript +InterestType: { + INTEREST: 'interest', + DISINTEREST: 'disinterest', +}, + +``` + +--- + +### InterestReason + +```typescript +InterestReason: { + PLAYLIST: 'playlist', + REACTION: 'reaction', + RECORDING: 'recording', +}, + +``` + +--- + +### EntityInfoResult + +The result for an `entityInfo()` push or pull. + +```typescript +type EntityInfoResult = { + expires: string + entity: EntityInfo // An EntityInfo object represents an "entity" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type. + related?: EntityInfo[] // An EntityInfo object represents an "entity" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type. +} +``` + +See also: + +[EntityInfo](../Entertainment/schemas/#EntityInfo) + +--- + +### PurchasedContentResult + +```typescript +type PurchasedContentResult = { + expires: string + totalCount: number + entries: EntityInfo[] // An EntityInfo object represents an "entity" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type. +} +``` + +See also: + +[EntityInfo](../Entertainment/schemas/#EntityInfo) + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/Entertainment/schemas/index.md b/apis/pr-fix-ci-fb-version/manage/Entertainment/schemas/index.md new file mode 100644 index 000000000..32325f62f --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Entertainment/schemas/index.md @@ -0,0 +1,285 @@ +--- +title: Entertainment + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Entertainment + +--- + +Version Entertainment 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [OfferingType](#offeringtype) + - [MusicType](#musictype) + - [ProgramType](#programtype) + - [ContentRating](#contentrating) +- [United States](#united-states) +- [Canada](#canada) + - [ContentIdentifiers](#contentidentifiers) + - [Entitlement](#entitlement) + - [WayToWatch](#waytowatch) + - [EntityInfo](#entityinfo) + +## Overview + +undefined + +## Types + +### OfferingType + +The offering type of the WayToWatch. + +```typescript +OfferingType: { + FREE: 'free', + SUBSCRIBE: 'subscribe', + BUY: 'buy', + RENT: 'rent', +}, + +``` + +--- + +### MusicType + +In the case of a music `entityType`, specifies the type of music entity. + +```typescript +MusicType: { + SONG: 'song', + ALBUM: 'album', +}, + +``` + +--- + +### ProgramType + +In the case of a program `entityType`, specifies the program type. + +```typescript +ProgramType: { + MOVIE: 'movie', + EPISODE: 'episode', + SEASON: 'season', + SERIES: 'series', + OTHER: 'other', + PREVIEW: 'preview', + EXTRA: 'extra', + CONCERT: 'concert', + SPORTING_EVENT: 'sportingEvent', + ADVERTISEMENT: 'advertisement', + MUSIC_VIDEO: 'musicVideo', + MINISODE: 'minisode', +}, + +``` + +--- + +### ContentRating + +A ContentRating represents an age or content based of an entity. Supported rating schemes and associated types are below. + +## United States + +`US-Movie` (MPAA): + +Ratings: `NR`, `G`, `PG`, `PG13`, `R`, `NC17` + +Advisories: `AT`, `BN`, `SL`, `SS`, `N`, `V` + +`US-TV` (Vchip): + +Ratings: `TVY`, `TVY7`, `TVG`, `TVPG`, `TV14`, `TVMA` + +Advisories: `FV`, `D`, `L`, `S`, `V` + +## Canada + +`CA-Movie` (OFRB): + +Ratings: `G`, `PG`, `14A`, `18A`, `R`, `E` + +`CA-TV` (AGVOT) + +Ratings: `E`, `C`, `C8`, `G`, `PG`, `14+`, `18+` + +Advisories: `C`, `C8`, `G`, `PG`, `14+`, `18+` + +`CA-Movie-Fr` (Canadian French language movies): + +Ratings: `G`, `8+`, `13+`, `16+`, `18+` + +`CA-TV-Fr` (Canadian French language TV): + +Ratings: `G`, `8+`, `13+`, `16+`, `18+` + +```typescript +type ContentRating = { + scheme: + | 'CA-Movie' + | 'CA-TV' + | 'CA-Movie-Fr' + | 'CA-TV-Fr' + | 'US-Movie' + | 'US-TV' // The rating scheme. + rating: string // The content rating. + advisories?: string[] // Optional list of subratings or content advisories. +} +``` + +--- + +### ContentIdentifiers + +The ContentIdentifiers object is how the app identifies an entity or asset to +the Firebolt platform. These ids are used to look up metadata and deep link into +the app. + +Apps do not need to provide all ids. They only need to provide the minimum +required to target a playable stream or an entity detail screen via a deep link. +If an id isn't needed to get to those pages, it doesn't need to be included. + +```typescript +type ContentIdentifiers = { + assetId?: string // Identifies a particular playable asset. For example, the HD version of a particular movie separate from the UHD version. + entityId?: string // Identifies an entity, such as a Movie, TV Series or TV Episode. + seasonId?: string // The TV Season for a TV Episode. + seriesId?: string // The TV Series for a TV Episode or TV Season. + appContentData?: string // App-specific content identifiers. +} +``` + +--- + +### Entitlement + +```typescript +type Entitlement = { + entitlementId: string + startTime?: string + endTime?: string +} +``` + +--- + +### WayToWatch + +A WayToWatch describes a way to watch a video program. It may describe a single +streamable asset or a set of streamable assets. For example, an app provider may +describe HD, SD, and UHD assets as individual WayToWatch objects or rolled into +a single WayToWatch. + +If the WayToWatch represents a single streamable asset, the provided +ContentIdentifiers must be sufficient to play back the specific asset when sent +via a playback intent or deep link. If the WayToWatch represents multiple +streamable assets, the provided ContentIdentifiers must be sufficient to +playback one of the assets represented with no user action. In this scenario, +the app SHOULD choose the best asset for the user based on their device and +settings. The ContentIdentifiers MUST also be sufficient for navigating the user +to the appropriate entity or detail screen via an entity intent. + +The app should set the `entitled` property to indicate if the user can watch, or +not watch, the asset without making a purchase. If the entitlement is known to +expire at a certain time (e.g., a rental), the app should also provide the +`entitledExpires` property. If the entitlement is not expired, the UI will use +the `entitled` property to display watchable assets to the user, adjust how +assets are presented to the user, and how intents into the app are generated. +For example, the the Aggregated Experience could render a "Watch" button for an +entitled asset versus a "Subscribe" button for an non-entitled asset. + +The app should set the `offeringType` to define how the content may be +authorized. The UI will use this to adjust how content is presented to the user. + +A single WayToWatch cannot represent streamable assets available via multiple +purchase paths. If, for example, an asset has both Buy, Rent and Subscription +availability, the three different entitlement paths MUST be represented as +multiple WayToWatch objects. + +`price` should be populated for WayToWatch objects with `buy` or `rent` +`offeringType`. If the WayToWatch represents a set of assets with various price +points, the `price` provided must be the lowest available price. + +```typescript +type WayToWatch = { + identifiers: ContentIdentifiers // The ContentIdentifiers object is how the app identifies an entity or asset to + expires?: string // Time when the WayToWatch is no longer available. + entitled?: boolean // Specify if the user is entitled to watch the entity. + entitledExpires?: string // Time when the entity is no longer entitled. + offeringType?: OfferingType // The offering type of the WayToWatch. + hasAds?: boolean // True if the streamable asset contains ads. + price?: number // For "buy" and "rent" WayToWatch, the price to buy or rent in the user's preferred currency. + videoQuality?: 'SD' | 'HD' | 'UHD'[] // List of the video qualities available via the WayToWatch. + audioProfile: AudioProfile[] // List of the audio types available via the WayToWatch. + audioLanguages?: string[] // List of audio track languages available on the WayToWatch. The first is considered the primary language. Languages are expressed as ISO 639 1/2 codes. + closedCaptions?: string[] // List of languages for which closed captions are available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes. + subtitles?: string[] // List of languages for which subtitles are available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes. + audioDescriptions?: string[] // List of languages for which audio descriptions (DVD) as available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes. +} +``` + +See also: + +[ContentIdentifiers](#contentidentifiers) +[OfferingType](#offeringtype) +[AudioProfile](../Types/schemas/#AudioProfile) + +--- + +### EntityInfo + +An EntityInfo object represents an "entity" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type. + +Additionally, EntityInfo objects must specify a properly formed +ContentIdentifiers object, `entityType`, and `title`. The app should provide +the `synopsis` property for a good user experience if the content +metadata is not available another way. + +The ContentIdentifiers must be sufficient for navigating the user to the +appropriate entity or detail screen via a `detail` intent or deep link. + +EntityInfo objects must provide at least one WayToWatch object when returned as +part of an `entityInfo` method and a streamable asset is available to the user. +It is optional for the `purchasedContent` method, but recommended because the UI +may use those data. + +```typescript +type EntityInfo = { + identifiers: ContentIdentifiers // The ContentIdentifiers object is how the app identifies an entity or asset to + title: string // Title of the entity. + entityType: 'program' | 'music' // The type of the entity, e.g. `program` or `music`. + programType?: ProgramType // In the case of a program `entityType`, specifies the program type. + musicType?: MusicType // In the case of a music `entityType`, specifies the type of music entity. + synopsis?: string // Short description of the entity. + seasonNumber?: number // For TV seasons, the season number. For TV episodes, the season that the episode belongs to. + seasonCount?: number // For TV series, seasons, and episodes, the total number of seasons. + episodeNumber?: number // For TV episodes, the episode number. + episodeCount?: number // For TV seasons and episodes, the total number of episodes in the current season. + releaseDate?: string // The date that the program or entity was released or first aired. + contentRatings?: ContentRating[] // A ContentRating represents an age or content based of an entity. Supported rating schemes and associated types are below. + waysToWatch?: WayToWatch[] // A WayToWatch describes a way to watch a video program. It may describe a single +} +``` + +See also: + +[ContentIdentifiers](#contentidentifiers) +[ProgramType](#programtype) +[MusicType](#musictype) +[ContentRating](#contentrating) +[WayToWatch](#waytowatch) + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/Entity/schemas/index.md b/apis/pr-fix-ci-fb-version/manage/Entity/schemas/index.md new file mode 100644 index 000000000..9a1af262b --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Entity/schemas/index.md @@ -0,0 +1,287 @@ +--- +title: Entity + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Entity + +--- + +Version Entity 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [MovieEntity](#movieentity) + - [Metadata](#metadata) + - [MusicEntity](#musicentity) + - [ChannelEntity](#channelentity) + - [UntypedEntity](#untypedentity) + - [PlaylistEntity](#playlistentity) + - [TVEpisodeEntity](#tvepisodeentity) + - [TVSeasonEntity](#tvseasonentity) + - [TVSeriesEntity](#tvseriesentity) + - [AdditionalEntity](#additionalentity) + - [ProgramEntity](#programentity) + - [Entity](#entity) + - [EntityDetails](#entitydetails) + - [PlayableEntity](#playableentity) + +## Overview + +undefined + +## Types + +### MovieEntity + +A Firebolt compliant representation of a Movie entity. + +```typescript +type MovieEntity = { + entityType: 'program' + programType: 'movie' + entityId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### Metadata + +```typescript +type Metadata = { + title?: string // Title of the entity. + synopsis?: string // Short description of the entity. + seasonNumber?: number // For TV seasons, the season number. For TV episodes, the season that the episode belongs to. + seasonCount?: number // For TV series, seasons, and episodes, the total number of seasons. + episodeNumber?: number // For TV episodes, the episode number. + episodeCount?: number // For TV seasons and episodes, the total number of episodes in the current season. + releaseDate?: string // The date that the program or entity was released or first aired. + contentRatings?: ContentRating[] // A ContentRating represents an age or content based of an entity. Supported rating schemes and associated types are below. +} +``` + +See also: + +[ContentRating](../Entertainment/schemas/#ContentRating) + +--- + +### MusicEntity + +```typescript +type MusicEntity = { + entityType: 'music' + musicType: MusicType // In the case of a music `entityType`, specifies the type of music entity. + entityId: string +} +``` + +See also: + +[MusicType](../Entertainment/schemas/#MusicType) + +--- + +### ChannelEntity + +```typescript +type ChannelEntity = { + entityType: 'channel' + channelType: 'streaming' | 'overTheAir' + entityId: string // ID of the channel, in the target App's scope. + appContentData?: string +} +``` + +--- + +### UntypedEntity + +```typescript +type UntypedEntity = { + entityId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### PlaylistEntity + +A Firebolt compliant representation of a Playlist entity. + +```typescript +type PlaylistEntity = { + entityType: 'playlist' + entityId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### TVEpisodeEntity + +A Firebolt compliant representation of a TV Episode entity. + +```typescript +type TVEpisodeEntity = { + entityType: 'program' + programType: 'episode' + entityId: string + seriesId: string + seasonId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### TVSeasonEntity + +A Firebolt compliant representation of a TV Season entity. + +```typescript +type TVSeasonEntity = { + entityType: 'program' + programType: 'season' + entityId: string + seriesId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### TVSeriesEntity + +A Firebolt compliant representation of a TV Series entity. + +```typescript +type TVSeriesEntity = { + entityType: 'program' + programType: 'series' + entityId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### AdditionalEntity + +A Firebolt compliant representation of the remaining program entity types. + +```typescript +type AdditionalEntity = { + entityType: 'program' + programType: + | 'concert' + | 'sportingEvent' + | 'preview' + | 'other' + | 'advertisement' + | 'musicVideo' + | 'minisode' + | 'extra' + entityId: string + assetId?: string + appContentData?: string +} +``` + +--- + +### ProgramEntity + +```typescript +type ProgramEntity = + | MovieEntity + | TVEpisodeEntity + | TVSeasonEntity + | TVSeriesEntity + | AdditionalEntity +``` + +See also: + +[MovieEntity](#movieentity) +[TVEpisodeEntity](#tvepisodeentity) +[TVSeasonEntity](#tvseasonentity) +[TVSeriesEntity](#tvseriesentity) +[AdditionalEntity](#additionalentity) + +--- + +### Entity + +```typescript + +``` + +See also: + +[ProgramEntity](#programentity) +[MusicEntity](#musicentity) +[ChannelEntity](#channelentity) +[UntypedEntity](#untypedentity) +[PlaylistEntity](#playlistentity) + +--- + +### EntityDetails + +```typescript +type EntityDetails = { + identifiers: + | ProgramEntity + | MusicEntity + | ChannelEntity + | UntypedEntity + | PlaylistEntity + info?: Metadata + waysToWatch?: WayToWatch[] // A WayToWatch describes a way to watch a video program. It may describe a single +} +``` + +See also: + +[Metadata](#metadata) +[WayToWatch](../Entertainment/schemas/#WayToWatch) + +--- + +### PlayableEntity + +```typescript +type PlayableEntity = + | MovieEntity + | TVEpisodeEntity + | PlaylistEntity + | MusicEntity + | AdditionalEntity +``` + +See also: + +[MovieEntity](#movieentity) +[TVEpisodeEntity](#tvepisodeentity) +[PlaylistEntity](#playlistentity) +[MusicEntity](#musicentity) +[AdditionalEntity](#additionalentity) + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/HDMIInput/index.md b/apis/pr-fix-ci-fb-version/manage/HDMIInput/index.md new file mode 100644 index 000000000..067dec3c9 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/HDMIInput/index.md @@ -0,0 +1,1846 @@ +--- +title: HDMIInput + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# HDMIInput Module + +--- + +Version HDMIInput 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [autoLowLatencyModeCapable](#autolowlatencymodecapable) + - [close](#close) + - [edidVersion](#edidversion) + - [listen](#listen) + - [lowLatencyMode](#lowlatencymode) + - [once](#once) + - [open](#open) + - [port](#port) + - [ports](#ports) +- [Events](#events) + - [autoLowLatencyModeCapableChanged](#autolowlatencymodecapablechanged) + - [autoLowLatencyModeSignalChanged](#autolowlatencymodesignalchanged) + - [connectionChanged](#connectionchanged) + - [edidVersionChanged](#edidversionchanged) + - [lowLatencyModeChanged](#lowlatencymodechanged) + - [signalChanged](#signalchanged) +- [Types](#types) + - [EDIDVersion](#edidversion-1) + - [HDMISignalStatus](#hdmisignalstatus) + - [HDMIPortId](#hdmiportid) + - [SignalChangedInfo](#signalchangedinfo) + - [AutoLowLatencyModeSignalChangedInfo](#autolowlatencymodesignalchangedinfo) + - [HDMIInputPort](#hdmiinputport) + - [AutoLowLatencyModeCapableChangedInfo](#autolowlatencymodecapablechangedinfo) + - [ConnectionChangedInfo](#connectionchangedinfo) + +## Usage + +To use the HDMIInput module, you can import it into your project from the Firebolt SDK: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' +``` + +## Overview + +Methods for managing HDMI inputs on an HDMI sink device. + +## Methods + +### autoLowLatencyModeCapable + +Property for each port auto low latency mode setting. + +To get the value of `autoLowLatencyModeCapable` call the method like this: + +```typescript +function autoLowLatencyModeCapable(port: HDMIPortId): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------ | --------------------------- | -------- | -------------------------- | +| `port` | [`HDMIPortId`](#hdmiportid) | true |
pattern: ^HDMI[0-9]+$ | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:inputs:hdmi | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let enabled = await HDMIInput.autoLowLatencyModeCapable('HDMI1') +console.log(enabled) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.autoLowLatencyModeCapable", + "params": { + "port": "HDMI1" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let enabled = await HDMIInput.autoLowLatencyModeCapable('HDMI1') +console.log(enabled) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.autoLowLatencyModeCapable", + "params": { + "port": "HDMI1" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `autoLowLatencyModeCapable` call the method like this: + +```typescript +function autoLowLatencyModeCapable( + port: HDMIPortId, + value: boolean, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------------------------- | -------- | -------------------------- | +| `port` | [`HDMIPortId`](#hdmiportid) | true |
pattern: ^HDMI[0-9]+$ | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let result = await HDMIInput.autoLowLatencyModeCapable('HDMI1', true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.setAutoLowLatencyModeCapable", + "params": { + "port": "HDMI1", + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let result = await HDMIInput.autoLowLatencyModeCapable('HDMI1', false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.setAutoLowLatencyModeCapable", + "params": { + "port": "HDMI1", + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function autoLowLatencyModeCapable( + callback: (value) => AutoLowLatencyModeCapableChangedInfo, +): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let listenerId = await autoLowLatencyModeCapable((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `data`: + +```javascript +{ + "port": "HDMI1", + "enabled": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.onAutoLowLatencyModeCapableChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "port": "HDMI1", + "enabled": true + } +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let listenerId = await autoLowLatencyModeCapable((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `data`: + +```javascript +{ + "port": "HDMI1", + "enabled": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.onAutoLowLatencyModeCapableChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "port": "HDMI1", + "enabled": false + } +} +``` + +
+ +--- + +### close + +Closes the given HDMI Port if it is the current active source for HDMI Input. If there was no active source, then there would no action taken on the device. + +```typescript +function close(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ------- | ----------------------------------- | +| manages | xrn:firebolt:capability:inputs:hdmi | + +#### Examples + +Default Example for stop + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let port = await HDMIInput.close() +console.log(port) +``` + +Value of `port`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.close", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### edidVersion + +Property for each port's active EDID version. + +To get the value of `edidVersion` call the method like this: + +```typescript +function edidVersion(port: HDMIPortId): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------ | --------------------------- | -------- | -------------------------- | +| `port` | [`HDMIPortId`](#hdmiportid) | true |
pattern: ^HDMI[0-9]+$ | + +Promise resolution: + +[EDIDVersion](#edidversion-1) + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:inputs:hdmi | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let edidVersion = await HDMIInput.edidVersion('HDMI1') +console.log(edidVersion) +``` + +Value of `edidVersion`: + +```javascript +'2.0' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.edidVersion", + "params": { + "port": "HDMI1" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "2.0" +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let edidVersion = await HDMIInput.edidVersion('HDMI1') +console.log(edidVersion) +``` + +Value of `edidVersion`: + +```javascript +'2.0' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.edidVersion", + "params": { + "port": "HDMI1" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "1.4" +} +``` + +
+ +--- + +To set the value of `edidVersion` call the method like this: + +```typescript +function edidVersion(port: HDMIPortId, value: EDIDVersion): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ------------------------------- | -------- | ------------------------------------------ | +| `port` | [`HDMIPortId`](#hdmiportid) | true |
pattern: ^HDMI[0-9]+$ | +| `value` | [`EDIDVersion`](#edidversion-1) | true |
values: `'1.4' \| '2.0' \| 'unknown'` | + +Promise resolution: + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let result = await HDMIInput.edidVersion('HDMI1', '2.0') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.setEdidVersion", + "params": { + "port": "HDMI1", + "value": "2.0" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let result = await HDMIInput.edidVersion('HDMI1', '1.4') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.setEdidVersion", + "params": { + "port": "HDMI1", + "value": "1.4" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function edidVersion( + port: HDMIPortId, + callback: (value) => EDIDVersion, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------ | --------------------------- | -------- | -------------------------- | +| `port` | [`HDMIPortId`](#hdmiportid) | true |
pattern: ^HDMI[0-9]+$ | + +Promise resolution: + +``` +number +``` + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let listenerId = await edidVersion((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `edidVersion`: + +```javascript +'2.0' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.onEdidVersionChanged", + "params": { + "port": "HDMI1", + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "2.0" +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let listenerId = await edidVersion((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `edidVersion`: + +```javascript +'2.0' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.onEdidVersionChanged", + "params": { + "port": "HDMI1", + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "1.4" +} +``` + +
+ +--- + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `HDMIInput.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `HDMIInput.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### lowLatencyMode + +Property for the low latency mode setting. + +To get the value of `lowLatencyMode` call the method like this: + +```typescript +function lowLatencyMode(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:inputs:hdmi | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let enabled = await HDMIInput.lowLatencyMode() +console.log(enabled) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.lowLatencyMode", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let enabled = await HDMIInput.lowLatencyMode() +console.log(enabled) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.lowLatencyMode", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `lowLatencyMode` call the method like this: + +```typescript +function lowLatencyMode(value: boolean): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------- | -------- | ----------- | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let result = await HDMIInput.lowLatencyMode(true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.setLowLatencyMode", + "params": { + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let result = await HDMIInput.lowLatencyMode(false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.setLowLatencyMode", + "params": { + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function lowLatencyMode(callback: (value) => boolean): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let listenerId = await lowLatencyMode((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.onLowLatencyModeChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let listenerId = await lowLatencyMode((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.onLowLatencyModeChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `HDMIInput.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `HDMIInput.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### open + +Opens the HDMI Port allowing it to be the active source device. Incase there is a different HDMI portId already set as the active source, this call would stop the older portId before opening the given portId. + +```typescript +function open(portId: HDMIPortId): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| -------- | --------------------------- | -------- | -------------------------- | +| `portId` | [`HDMIPortId`](#hdmiportid) | true |
pattern: ^HDMI[0-9]+$ | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ------- | ----------------------------------- | +| manages | xrn:firebolt:capability:inputs:hdmi | + +#### Examples + +Default Example for open + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let port = await HDMIInput.open('HDMI1') +console.log(port) +``` + +Value of `port`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.open", + "params": { + "portId": "HDMI1" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### port + +Retrieve a specific HDMI input port. + +```typescript +function port(portId: HDMIPortId): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| -------- | --------------------------- | -------- | -------------------------- | +| `portId` | [`HDMIPortId`](#hdmiportid) | true |
pattern: ^HDMI[0-9]+$ | + +Promise resolution: + +[HDMIInputPort](#hdmiinputport) + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:inputs:hdmi | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let port = await HDMIInput.port('HDMI1') +console.log(port) +``` + +Value of `port`: + +```javascript +{ + "port": "HDMI1", + "connected": true, + "signal": "stable", + "arcCapable": true, + "arcConnected": true, + "edidVersion": "2.0", + "autoLowLatencyModeCapable": true, + "autoLowLatencyModeSignalled": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.port", + "params": { + "portId": "HDMI1" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "port": "HDMI1", + "connected": true, + "signal": "stable", + "arcCapable": true, + "arcConnected": true, + "edidVersion": "2.0", + "autoLowLatencyModeCapable": true, + "autoLowLatencyModeSignalled": true + } +} +``` + +
+ +--- + +### ports + +Retrieve a list of HDMI input ports. + +```typescript +function ports(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:inputs:hdmi | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +let ports = await HDMIInput.ports() +console.log(ports) +``` + +Value of `ports`: + +```javascript +;[ + { + port: 'HDMI1', + connected: true, + signal: 'stable', + arcCapable: true, + arcConnected: true, + edidVersion: '2.0', + autoLowLatencyModeCapable: true, + autoLowLatencyModeSignalled: true, + }, +] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.ports", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "port": "HDMI1", + "connected": true, + "signal": "stable", + "arcCapable": true, + "arcConnected": true, + "edidVersion": "2.0", + "autoLowLatencyModeCapable": true, + "autoLowLatencyModeSignalled": true + } + ] +} +``` + +
+ +--- + +## Events + +### autoLowLatencyModeCapableChanged + +See: [autoLowLatencyModeCapable](#autolowlatencymodecapable) + +### autoLowLatencyModeSignalChanged + +```typescript +function listen('autoLowLatencyModeSignalChanged', () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Event value: + +[AutoLowLatencyModeSignalChangedInfo](#autolowlatencymodesignalchangedinfo) + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:inputs:hdmi | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +HDMIInput.listen('autoLowLatencyModeSignalChanged', (info) => { + console.log(info) +}) +``` + +Value of `info`: + +```javascript +{ + "port": "HDMI1", + "autoLowLatencyModeSignalled": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.onAutoLowLatencyModeSignalChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "port": "HDMI1", + "autoLowLatencyModeSignalled": true + } +} +``` + +
+ +--- + +### connectionChanged + +```typescript +function listen('connectionChanged', () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Event value: + +[ConnectionChangedInfo](#connectionchangedinfo) + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:inputs:hdmi | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +HDMIInput.listen('connectionChanged', (info) => { + console.log(info) +}) +``` + +Value of `info`: + +```javascript +{ + "port": "HDMI1", + "connected": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.onConnectionChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "port": "HDMI1", + "connected": true + } +} +``` + +
+ +--- + +### edidVersionChanged + +See: [edidVersion](#edidversion) + +### lowLatencyModeChanged + +See: [lowLatencyMode](#lowlatencymode) + +### signalChanged + +```typescript +function listen('signalChanged', () => void): Promise +``` + +See also: [listen()](#listen), [once()](#listen), [clear()](#listen). + +Event value: + +[SignalChangedInfo](#signalchangedinfo) + +Capabilities: + +| Role | Capability | +| ---- | ----------------------------------- | +| uses | xrn:firebolt:capability:inputs:hdmi | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { HDMIInput } from '@firebolt-js/manage-sdk' + +HDMIInput.listen('signalChanged', (info) => { + console.log(info) +}) +``` + +Value of `info`: + +```javascript +{ + "port": "HDMI1", + "signal": "stable" +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "HDMIInput.onSignalChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "port": "HDMI1", + "signal": "stable" + } +} +``` + +
+ +--- + +## Types + +### EDIDVersion + +```typescript +EDIDVersion: { + V1_4: '1.4', + V2_0: '2.0', + UNKNOWN: 'unknown', +}, + +``` + +--- + +### HDMISignalStatus + +```typescript +HDMISignalStatus: { + NONE: 'none', + STABLE: 'stable', + UNSTABLE: 'unstable', + UNSUPPORTED: 'unsupported', + UNKNOWN: 'unknown', +}, + +``` + +--- + +### HDMIPortId + +```typescript + +``` + +--- + +### SignalChangedInfo + +```typescript +type SignalChangedInfo = { + port: HDMIPortId + signal: HDMISignalStatus +} +``` + +See also: + +[HDMIPortId](#hdmiportid) +[HDMISignalStatus](#hdmisignalstatus) + +--- + +### AutoLowLatencyModeSignalChangedInfo + +```typescript +type AutoLowLatencyModeSignalChangedInfo = { + port?: HDMIPortId + autoLowLatencyModeSignalled?: boolean +} +``` + +See also: + +[HDMIPortId](#hdmiportid) + +--- + +### HDMIInputPort + +```typescript +type HDMIInputPort = { + port: HDMIPortId + connected: boolean + signal: HDMISignalStatus + arcCapable: boolean + arcConnected: boolean + edidVersion: EDIDVersion + autoLowLatencyModeCapable: boolean + autoLowLatencyModeSignalled: boolean +} +``` + +See also: + +[HDMIPortId](#hdmiportid) +[HDMISignalStatus](#hdmisignalstatus) +[EDIDVersion](#edidversion-1) + +--- + +### AutoLowLatencyModeCapableChangedInfo + +```typescript +type AutoLowLatencyModeCapableChangedInfo = { + port: HDMIPortId + enabled: boolean +} +``` + +See also: + +[HDMIPortId](#hdmiportid) + +--- + +### ConnectionChangedInfo + +```typescript +type ConnectionChangedInfo = { + port?: HDMIPortId + connected?: boolean +} +``` + +See also: + +[HDMIPortId](#hdmiportid) + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/Intents/schemas/index.md b/apis/pr-fix-ci-fb-version/manage/Intents/schemas/index.md new file mode 100644 index 000000000..6141b6991 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Intents/schemas/index.md @@ -0,0 +1,232 @@ +--- +title: Intents + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Intents + +--- + +Version Intents 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [Intent](#intent) + - [IntentProperties](#intentproperties) + - [EntityIntent](#entityintent) + - [PlaybackIntent](#playbackintent) + - [SearchIntent](#searchintent) + - [SectionIntent](#sectionintent) + - [TuneIntent](#tuneintent) + - [PlayEntityIntent](#playentityintent) + - [PlayQueryIntent](#playqueryintent) + - [HomeIntent](#homeintent) + - [LaunchIntent](#launchintent) + - [NavigationIntent](#navigationintent) + +## Overview + +undefined + +## Types + +### Intent + +A Firebolt compliant representation of a user intention. + +```typescript + +``` + +--- + +### IntentProperties + +```typescript + +``` + +--- + +### EntityIntent + +A Firebolt compliant representation of a user intention to navigate an app to a specific entity page, and bring that app to the foreground if needed. + +```typescript +type EntityIntent = { + action: 'entity' + data: + | ProgramEntity + | MusicEntity + | ChannelEntity + | UntypedEntity + | PlaylistEntity + context: object +} +``` + +--- + +### PlaybackIntent + +A Firebolt compliant representation of a user intention to navigate an app to a the video player for a specific, playable entity, and bring that app to the foreground if needed. + +```typescript +type PlaybackIntent = { + action: 'playback' + data: PlayableEntity + context: object +} +``` + +See also: + +[PlayableEntity](../Entity/schemas/#PlayableEntity) + +--- + +### SearchIntent + +A Firebolt compliant representation of a user intention to navigate an app to it's search UI with a search term populated, and bring that app to the foreground if needed. + +```typescript +type SearchIntent = { + action: 'search' + data?: object + context: object +} +``` + +--- + +### SectionIntent + +A Firebolt compliant representation of a user intention to navigate an app to a section not covered by `home`, `entity`, `player`, or `search`, and bring that app to the foreground if needed. + +```typescript +type SectionIntent = { + action: 'section' + data: object + context: object +} +``` + +--- + +### TuneIntent + +A Firebolt compliant representation of a user intention to 'tune' to a traditional over-the-air broadcast, or an OTT Stream from an OTT or vMVPD App. + +```typescript +type TuneIntent = { + action: 'tune' + data: object + context: object +} +``` + +See also: + +[ChannelEntity](../Entity/schemas/#ChannelEntity) + +--- + +### PlayEntityIntent + +A Firebolt compliant representation of a user intention to navigate an app to a the video player for a specific, playable entity, and bring that app to the foreground if needed. + +```typescript +type PlayEntityIntent = { + action: 'play-entity' + data: object + context: object +} +``` + +See also: + +[PlayableEntity](../Entity/schemas/#PlayableEntity) + +--- + +### PlayQueryIntent + +A Firebolt compliant representation of a user intention to navigate an app to a the video player for an abstract query to be searched for and played by the app. + +```typescript +type PlayQueryIntent = { + action: 'play-query' + data: object + context: object +} +``` + +See also: + +[ProgramType](../Entertainment/schemas/#ProgramType) +[MusicType](../Entertainment/schemas/#MusicType) + +--- + +### HomeIntent + +A Firebolt compliant representation of a user intention to navigate an app to it's home screen, and bring that app to the foreground if needed. + +```typescript +type HomeIntent = { + action: 'home' + context: object +} +``` + +--- + +### LaunchIntent + +A Firebolt compliant representation of a user intention to launch an app. + +```typescript +type LaunchIntent = { + action: 'launch' + context: object +} +``` + +--- + +### NavigationIntent + +A Firebolt compliant representation of a user intention to navigate to a specific place in an app. + +```typescript +type NavigationIntent = + | HomeIntent + | LaunchIntent + | EntityIntent + | PlaybackIntent + | SearchIntent + | SectionIntent + | TuneIntent + | PlayEntityIntent + | PlayQueryIntent +``` + +See also: + +[HomeIntent](#homeintent) +[LaunchIntent](#launchintent) +[EntityIntent](#entityintent) +[PlaybackIntent](#playbackintent) +[SearchIntent](#searchintent) +[SectionIntent](#sectionintent) +[TuneIntent](#tuneintent) +[PlayEntityIntent](#playentityintent) +[PlayQueryIntent](#playqueryintent) + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/Keyboard/index.md b/apis/pr-fix-ci-fb-version/manage/Keyboard/index.md new file mode 100644 index 000000000..2493ea5c4 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Keyboard/index.md @@ -0,0 +1,962 @@ +--- +title: Keyboard + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Keyboard Module + +--- + +Version Keyboard 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [emailError](#emailerror) + - [emailFocus](#emailfocus) + - [emailResponse](#emailresponse) + - [passwordError](#passworderror) + - [passwordFocus](#passwordfocus) + - [passwordResponse](#passwordresponse) + - [provide](#provide) + - [standardError](#standarderror) + - [standardFocus](#standardfocus) + - [standardResponse](#standardresponse) +- [Events](#events) + - [onRequestEmail](#onrequestemail) + - [onRequestPassword](#onrequestpassword) + - [onRequestStandard](#onrequeststandard) +- [Provider Interfaces](#provider-interfaces) + - [KeyboardInputProvider](#keyboardinputprovider) +- [Types](#types) + - [KeyboardParameters](#keyboardparameters) + - [KeyboardProviderRequest](#keyboardproviderrequest) + +## Usage + +To use the Keyboard module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Keyboard } from '@firebolt-js/manage-sdk' +``` + +## Overview + +Methods for prompting users to enter text with task-oriented UX + +## Methods + +### emailError + +_This is an private RPC method._ + +Internal API for Email Provider to send back error. + +Parameters: + +| Param | Type | Required | Description | +| --------------- | -------- | -------- | ----------- | +| `correlationId` | `string` | true | | +| `error` | `object` | true | | + +Result: + +Capabilities: + +| Role | Capability | +| -------- | -------------------------------------- | +| provides | xrn:firebolt:capability:input:keyboard | + +#### Examples + +Example 1 + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Keyboard.emailError", + "params": { + "correlationId": "123", + "error": { + "code": 1, + "message": "Error" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +### emailFocus + +_This is an private RPC method._ + +Internal API for Email Provider to request focus for UX purposes. + +Result: + +Capabilities: + +| Role | Capability | +| -------- | -------------------------------------- | +| provides | xrn:firebolt:capability:input:keyboard | + +#### Examples + +Example + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Keyboard.emailFocus", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +### emailResponse + +_This is an private RPC method._ + +Internal API for Email Provider to send back response. + +Parameters: + +| Param | Type | Required | Description | +| --------------- | -------- | -------- | ----------- | +| `correlationId` | `string` | true | | +| `result` | `string` | true | | + +Result: + +Capabilities: + +| Role | Capability | +| -------- | -------------------------------------- | +| provides | xrn:firebolt:capability:input:keyboard | + +#### Examples + +Example + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Keyboard.emailResponse", + "params": { + "correlationId": "123", + "result": "email@address.com" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +### passwordError + +_This is an private RPC method._ + +Internal API for Password Provider to send back error. + +Parameters: + +| Param | Type | Required | Description | +| --------------- | -------- | -------- | ----------- | +| `correlationId` | `string` | true | | +| `error` | `object` | true | | + +Result: + +Capabilities: + +| Role | Capability | +| -------- | -------------------------------------- | +| provides | xrn:firebolt:capability:input:keyboard | + +#### Examples + +Example 1 + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Keyboard.passwordError", + "params": { + "correlationId": "123", + "error": { + "code": 1, + "message": "Error" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +### passwordFocus + +_This is an private RPC method._ + +Internal API for Password Provider to request focus for UX purposes. + +Result: + +Capabilities: + +| Role | Capability | +| -------- | -------------------------------------- | +| provides | xrn:firebolt:capability:input:keyboard | + +#### Examples + +Example + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Keyboard.passwordFocus", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +### passwordResponse + +_This is an private RPC method._ + +Internal API for Password Provider to send back response. + +Parameters: + +| Param | Type | Required | Description | +| --------------- | -------- | -------- | ----------- | +| `correlationId` | `string` | true | | +| `result` | `string` | true | | + +Result: + +Capabilities: + +| Role | Capability | +| -------- | -------------------------------------- | +| provides | xrn:firebolt:capability:input:keyboard | + +#### Examples + +Example + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Keyboard.passwordResponse", + "params": { + "correlationId": "123", + "result": "password" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +### provide + +To provide a specific capability to the platform. See [Provider Interfaces](#provider-interfaces) for a list of interfaces available to provide in this module. + +```typescript +provide(capability: string, provider: any): void +``` + +Parameters: + +| Param | Type | Required | Summary | +| ------------ | -------- | -------- | -------------------------------------------- | +| `capability` | `string` | Yes | The capability that is being provided. | +| `provider` | `any` | Yes | An implementation of the required interface. | + +See [Provider Interfaces](#provider-interfaces) for each capabilities interface definition. + +### standardError + +_This is an private RPC method._ + +Internal API for Standard Provider to send back error. + +Parameters: + +| Param | Type | Required | Description | +| --------------- | -------- | -------- | ----------- | +| `correlationId` | `string` | true | | +| `error` | `object` | true | | + +Result: + +Capabilities: + +| Role | Capability | +| -------- | -------------------------------------- | +| provides | xrn:firebolt:capability:input:keyboard | + +#### Examples + +Example 1 + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Keyboard.standardError", + "params": { + "correlationId": "123", + "error": { + "code": 1, + "message": "Error" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +### standardFocus + +_This is an private RPC method._ + +Internal API for Standard Provider to request focus for UX purposes. + +Result: + +Capabilities: + +| Role | Capability | +| -------- | -------------------------------------- | +| provides | xrn:firebolt:capability:input:keyboard | + +#### Examples + +Example + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Keyboard.standardFocus", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +### standardResponse + +_This is an private RPC method._ + +Internal API for Standard Provider to send back response. + +Parameters: + +| Param | Type | Required | Description | +| --------------- | -------- | -------- | ----------- | +| `correlationId` | `string` | true | | +| `result` | `string` | true | | + +Result: + +Capabilities: + +| Role | Capability | +| -------- | -------------------------------------- | +| provides | xrn:firebolt:capability:input:keyboard | + +#### Examples + +Example + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Keyboard.standardResponse", + "params": { + "correlationId": "123", + "result": "username" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +## Events + +### onRequestEmail + +_This is an private RPC method._ + +Registers as a provider for when the user should be shown a keyboard optimized for email address entry. + +Parameters: + +| Param | Type | Required | Description | +| -------- | --------- | -------- | ----------- | +| `listen` | `boolean` | true | | + +Result: + +[KeyboardProviderRequest](#keyboardproviderrequest) + +Capabilities: + +| Role | Capability | +| -------- | -------------------------------------- | +| provides | xrn:firebolt:capability:input:keyboard | + +#### Examples + +Default Example + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Keyboard.onRequestEmail", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "correlationId": "abc", + "parameters": { + "message": "Enter your user name." + } + } +} +``` + +--- + +### onRequestPassword + +_This is an private RPC method._ + +Registers as a provider for when the user should be shown a password keyboard, with dots for each character entered. + +Parameters: + +| Param | Type | Required | Description | +| -------- | --------- | -------- | ----------- | +| `listen` | `boolean` | true | | + +Result: + +[KeyboardProviderRequest](#keyboardproviderrequest) + +Capabilities: + +| Role | Capability | +| -------- | -------------------------------------- | +| provides | xrn:firebolt:capability:input:keyboard | + +#### Examples + +Default Example + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Keyboard.onRequestPassword", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "correlationId": "abc", + "parameters": { + "message": "Enter your user name." + } + } +} +``` + +--- + +### onRequestStandard + +_This is an private RPC method._ + +Registers as a provider for when the user should be shown a standard keyboard. + +Parameters: + +| Param | Type | Required | Description | +| -------- | --------- | -------- | ----------- | +| `listen` | `boolean` | true | | + +Result: + +[KeyboardProviderRequest](#keyboardproviderrequest) + +Capabilities: + +| Role | Capability | +| -------- | -------------------------------------- | +| provides | xrn:firebolt:capability:input:keyboard | + +#### Examples + +Default Example + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Keyboard.onRequestStandard", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "correlationId": "abc", + "parameters": { + "message": "Enter your user name." + } + } +} +``` + +--- + +## Provider Interfaces + +### KeyboardInputProvider + +The provider interface for the `xrn:firebolt:capability:input:keyboard` capability. + +```typescript + +``` + +Usage: + +```typescript +Keyboard.provide('xrn:firebolt:capability:input:keyboard', provider: KeyboardInputProvider | object) +``` + +#### Examples + +**Register your app to provide the `xrn:firebolt:capability:input:keyboard` capability.** + +```javascript +import { Keyboard } from '@firebolt-js/manage-sdk' + +class MyKeyboardInputProvider { + async standard(parameters, session) { + return 'username' + } + + async password(parameters, session) { + return 'password' + } + + async email(parameters, session) { + return 'email@address.com' + } +} + +Keyboard.provide( + 'xrn:firebolt:capability:input:keyboard', + new MyKeyboardInputProvider(), +) +``` + +
+ JSON-RPC + +**Register to recieve each provider API** + +Request: + +```json + +{ + "id": 1, + "method": "Keyboard.onRequestStandard", + "params": { + "listen": true + } +} + +{ + "id": 2, + "method": "Keyboard.onRequestPassword", + "params": { + "listen": true + } +} + +{ + "id": 3, + "method": "Keyboard.onRequestEmail", + "params": { + "listen": true + } +} + +``` + +Response: + +```json + +{ + "id": 1, + "result": { + "listening": true, + "event": "Keyboard.onRequestStandard" + } + +} + +{ + "id": 2, + "result": { + "listening": true, + "event": "Keyboard.onRequestPassword" + } + +} + +{ + "id": 3, + "result": { + "listening": true, + "event": "Keyboard.onRequestEmail" + } + +} + +``` + +**Asynchronous event to initiate standard()** + +Event Response: + +```json +{ + "id": 1, + "result": { + "correlationId": undefined, + "parameters": { + "message": "Enter your user name." + } + } +} +``` + +**App initiated response to event** + +Request: + +```json +{ + "id": 4, + "method": "Keyboard.standardResponse", + "params": { + "correlationId": undefined, + "result": "username" + } +} +``` + +Response: + +```json +{ + "id": 4, + "result": true +} +``` + +**Asynchronous event to initiate password()** + +Event Response: + +```json +{ + "id": 2, + "result": { + "correlationId": undefined, + "parameters": { + "message": "Enter your user name." + } + } +} +``` + +**App initiated response to event** + +Request: + +```json +{ + "id": 5, + "method": "Keyboard.passwordResponse", + "params": { + "correlationId": undefined, + "result": "password" + } +} +``` + +Response: + +```json +{ + "id": 5, + "result": true +} +``` + +**Asynchronous event to initiate email()** + +Event Response: + +```json +{ + "id": 3, + "result": { + "correlationId": undefined, + "parameters": { + "message": "Enter your user name." + } + } +} +``` + +**App initiated response to event** + +Request: + +```json +{ + "id": 6, + "method": "Keyboard.emailResponse", + "params": { + "correlationId": undefined, + "result": "email@address.com" + } +} +``` + +Response: + +```json +{ + "id": 6, + "result": true +} +``` + +
+ +## Types + +### KeyboardParameters + +```typescript +type KeyboardParameters = { + message: string // The message to display to the user so the user knows what they are entering +} +``` + +--- + +### KeyboardProviderRequest + +```typescript +type KeyboardProviderRequest = { + correlationId: string // An id to correlate the provider response with this request + parameters: KeyboardParameters // The request to start a keyboard session +} +``` + +See also: + +[KeyboardParameters](#keyboardparameters) + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/Lifecycle/schemas/index.md b/apis/pr-fix-ci-fb-version/manage/Lifecycle/schemas/index.md new file mode 100644 index 000000000..e9e828795 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Lifecycle/schemas/index.md @@ -0,0 +1,61 @@ +--- +title: Lifecycle + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Lifecycle + +--- + +Version Lifecycle 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [CloseReason](#closereason) + - [LifecycleState](#lifecyclestate) + +## Overview + +undefined + +## Types + +### CloseReason + +The application close reason + +```typescript +CloseReason: { + REMOTE_BUTTON: 'remoteButton', + USER_EXIT: 'userExit', + DONE: 'done', + ERROR: 'error', +}, + +``` + +--- + +### LifecycleState + +The application lifecycle state + +```typescript +LifecycleState: { + INITIALIZING: 'initializing', + INACTIVE: 'inactive', + FOREGROUND: 'foreground', + BACKGROUND: 'background', + UNLOADING: 'unloading', + SUSPENDED: 'suspended', +}, + +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/Localization/index.md b/apis/pr-fix-ci-fb-version/manage/Localization/index.md new file mode 100644 index 000000000..4171898e0 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Localization/index.md @@ -0,0 +1,2654 @@ +--- +title: Localization + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Localization Module + +--- + +Version Localization 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [addAdditionalInfo](#addadditionalinfo) + - [additionalInfo](#additionalinfo) + - [countryCode](#countrycode) + - [language](#language) + - [listen](#listen) + - [locale](#locale) + - [locality](#locality) + - [once](#once) + - [postalCode](#postalcode) + - [preferredAudioLanguages](#preferredaudiolanguages) + - [removeAdditionalInfo](#removeadditionalinfo) + - [timeZone](#timezone) +- [Events](#events) + - [countryCodeChanged](#countrycodechanged) + - [languageChanged](#languagechanged) + - [localeChanged](#localechanged) + - [localityChanged](#localitychanged) + - [postalCodeChanged](#postalcodechanged) + - [preferredAudioLanguagesChanged](#preferredaudiolanguageschanged) + - [timeZoneChanged](#timezonechanged) +- [Types](#types) + +## Usage + +To use the Localization module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' +``` + +## Overview + +Methods for accessessing location and language preferences + +## Methods + +### addAdditionalInfo + +Add any platform-specific localization information in key/value pair + +```typescript +function addAdditionalInfo(key: string, value: number): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | -------- | -------- | ---------------------------------------------------------------------------- | +| `key` | `string` | true | Key to add additionalInfo | +| `value` | `number` | true | Value to be set for additionalInfo. Value can be a number, string or boolean | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ------- | ---------------------------------------------------- | +| manages | xrn:firebolt:capability:localization:additional-info | + +#### Examples + +Add an additionalInfo for localization + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.addAdditionalInfo('defaultKey', 'defaultValue=') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.addAdditionalInfo", + "params": { + "key": "defaultKey", + "value": "defaultValue=" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### additionalInfo + +Get any platform-specific localization information + +```typescript +function additionalInfo(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------------- | +| uses | xrn:firebolt:capability:localization:additional-info | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let info = await Localization.additionalInfo() +console.log(info) +``` + +Value of `info`: + +```javascript +{ +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.additionalInfo", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": {} +} +``` + +
+ +--- + +### countryCode + +Get the ISO 3166-1 alpha-2 code for the country device is located in + +To get the value of `countryCode` call the method like this: + +```typescript +function countryCode(): Promise +``` + +Promise resolution: + +[CountryCode](../Localization/schemas/#CountryCode) + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------------- | +| uses | xrn:firebolt:capability:localization:country-code | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let code = await Localization.countryCode() +console.log(code) +``` + +Value of `code`: + +```javascript +'US' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.countryCode", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "US" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let code = await Localization.countryCode() +console.log(code) +``` + +Value of `code`: + +```javascript +'US' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.countryCode", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "UK" +} +``` + +
+ +--- + +To set the value of `countryCode` call the method like this: + +```typescript +function countryCode(value: CountryCode): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ----------------------------------------------------- | -------- | ------------------------------------------------ | +| `value` | [`CountryCode`](../Localization/schemas/#CountryCode) | true | the device country code
pattern: ^[A-Z]{2}$ | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.countryCode('US') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.setCountryCode", + "params": { + "value": "US" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.countryCode('UK') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.setCountryCode", + "params": { + "value": "UK" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function countryCode(callback: (value) => CountryCode): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let listenerId = await countryCode((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `code`: + +```javascript +'US' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onCountryCodeChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "US" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let listenerId = await countryCode((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `code`: + +```javascript +'US' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onCountryCodeChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "UK" +} +``` + +
+ +--- + +### language + +Get the ISO 639 1/2 code for the preferred language + +To get the value of `language` call the method like this: + +```typescript +function language(): Promise +``` + +Promise resolution: + +[Language](../Localization/schemas/#Language) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------------- | +| uses | xrn:firebolt:capability:localization:language | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let lang = await Localization.language() +console.log(lang) +``` + +Value of `lang`: + +```javascript +'en' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.language", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "en" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let lang = await Localization.language() +console.log(lang) +``` + +Value of `lang`: + +```javascript +'en' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.language", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "es" +} +``` + +
+ +--- + +To set the value of `language` call the method like this: + +```typescript +function language(value: Language): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ----------------------------------------------- | -------- | ----------------------------------------------- | +| `value` | [`Language`](../Localization/schemas/#Language) | true | the device language
pattern: ^[A-Za-z]{2}$ | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.language('en') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.setLanguage", + "params": { + "value": "en" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.language('es') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.setLanguage", + "params": { + "value": "es" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function language(callback: (value) => Language): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let listenerId = await language((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `lang`: + +```javascript +'en' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onLanguageChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "en" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let listenerId = await language((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `lang`: + +```javascript +'en' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onLanguageChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "es" +} +``` + +
+ +--- + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Localization.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Localization.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### locale + +Get the _full_ BCP 47 code, including script, region, variant, etc., for the preferred langauage/locale + +To get the value of `locale` call the method like this: + +```typescript +function locale(): Promise +``` + +Promise resolution: + +[Locale](../Localization/schemas/#Locale) + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------- | +| uses | xrn:firebolt:capability:localization:locale | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let locale = await Localization.locale() +console.log(locale) +``` + +Value of `locale`: + +```javascript +'en-US' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.locale", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "en-US" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let locale = await Localization.locale() +console.log(locale) +``` + +Value of `locale`: + +```javascript +'en-US' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.locale", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "es-US" +} +``` + +
+ +--- + +To set the value of `locale` call the method like this: + +```typescript +function locale(value: Locale): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ------------------------------------------- | -------- | ------------------------------------------------------------ | +| `value` | [`Locale`](../Localization/schemas/#Locale) | true | the device locale
pattern: ^[a-zA-Z]+([a-zA-Z0-9\-]\*)$ | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.locale('en-US') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.setLocale", + "params": { + "value": "en-US" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.locale('es-US') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.setLocale", + "params": { + "value": "es-US" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function locale(callback: (value) => Locale): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let listenerId = await locale((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `locale`: + +```javascript +'en-US' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onLocaleChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "en-US" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let listenerId = await locale((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `locale`: + +```javascript +'en-US' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onLocaleChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "es-US" +} +``` + +
+ +--- + +### locality + +Get the locality/city the device is located in + +To get the value of `locality` call the method like this: + +```typescript +function locality(): Promise +``` + +Promise resolution: + +[Locality](../Localization/schemas/#Locality) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------------- | +| uses | xrn:firebolt:capability:localization:locality | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let locality = await Localization.locality() +console.log(locality) +``` + +Value of `locality`: + +```javascript +'Philadelphia' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.locality", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Philadelphia" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let locality = await Localization.locality() +console.log(locality) +``` + +Value of `locality`: + +```javascript +'Philadelphia' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.locality", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Rockville" +} +``` + +
+ +--- + +To set the value of `locality` call the method like this: + +```typescript +function locality(value: Locality): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ----------------------------------------------- | -------- | --------------- | +| `value` | [`Locality`](../Localization/schemas/#Locality) | true | the device city | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.locality('Philadelphia') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.setLocality", + "params": { + "value": "Philadelphia" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.locality('Rockville') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.setLocality", + "params": { + "value": "Rockville" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function locality(callback: (value) => Locality): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let listenerId = await locality((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `locality`: + +```javascript +'Philadelphia' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onLocalityChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Philadelphia" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let listenerId = await locality((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `locality`: + +```javascript +'Philadelphia' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onLocalityChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "Rockville" +} +``` + +
+ +--- + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Localization.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ---------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Localization.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### postalCode + +Get the postal code the device is located in + +To get the value of `postalCode` call the method like this: + +```typescript +function postalCode(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------------ | +| uses | xrn:firebolt:capability:localization:postal-code | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let postalCode = await Localization.postalCode() +console.log(postalCode) +``` + +Value of `postalCode`: + +```javascript +'19103' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.postalCode", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "19103" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let postalCode = await Localization.postalCode() +console.log(postalCode) +``` + +Value of `postalCode`: + +```javascript +'19103' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.postalCode", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "20850" +} +``` + +
+ +--- + +To set the value of `postalCode` call the method like this: + +```typescript +function postalCode(value: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | -------- | -------- | ---------------------- | +| `value` | `string` | true | the device postal code | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.postalCode('19103') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.setPostalCode", + "params": { + "value": "19103" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.postalCode('20850') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.setPostalCode", + "params": { + "value": "20850" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function postalCode(callback: (value) => string): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let listenerId = await postalCode((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `postalCode`: + +```javascript +'19103' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onPostalCodeChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "19103" +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let listenerId = await postalCode((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `postalCode`: + +```javascript +'19103' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onPostalCodeChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "20850" +} +``` + +
+ +--- + +### preferredAudioLanguages + +A prioritized list of ISO 639 1/2 codes for the preferred audio languages on this device. + +To get the value of `preferredAudioLanguages` call the method like this: + +```typescript +function preferredAudioLanguages(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------------- | +| uses | xrn:firebolt:capability:localization:language | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let languages = await Localization.preferredAudioLanguages() +console.log(languages) +``` + +Value of `languages`: + +```javascript +;['spa', 'eng'] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.preferredAudioLanguages", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": ["spa", "eng"] +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let languages = await Localization.preferredAudioLanguages() +console.log(languages) +``` + +Value of `languages`: + +```javascript +;['spa', 'eng'] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.preferredAudioLanguages", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": ["eng", "spa"] +} +``` + +
+ +--- + +To set the value of `preferredAudioLanguages` call the method like this: + +```typescript +function preferredAudioLanguages(value: ISO639_2Language[]): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | -------------------- | -------- | ------------------------------------------------------ | +| `value` | `ISO639_2Language[]` | true | the preferred audio languages
pattern: ^[a-z]{3}$ | + +Promise resolution: + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.preferredAudioLanguages(['spa', 'eng']) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.setPreferredAudioLanguages", + "params": { + "value": ["spa", "eng"] + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.preferredAudioLanguages(['eng', 'spa']) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.setPreferredAudioLanguages", + "params": { + "value": ["eng", "spa"] + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function preferredAudioLanguages( + callback: (value) => ISO639_2Language[], +): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let listenerId = await preferredAudioLanguages((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `languages`: + +```javascript +;['spa', 'eng'] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onPreferredAudioLanguagesChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": ["spa", "eng"] +} +``` + +
+ +Default Example #2 + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let listenerId = await preferredAudioLanguages((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `languages`: + +```javascript +;['spa', 'eng'] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onPreferredAudioLanguagesChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": ["eng", "spa"] +} +``` + +
+ +--- + +### removeAdditionalInfo + +Remove any platform-specific localization information from map + +```typescript +function removeAdditionalInfo(key: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ----- | -------- | -------- | ---------------------------- | +| `key` | `string` | true | Key to remove additionalInfo | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ------- | ---------------------------------------------------- | +| manages | xrn:firebolt:capability:localization:additional-info | + +#### Examples + +Remove an additionalInfo for localization + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.removeAdditionalInfo('defaultKey') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.removeAdditionalInfo", + "params": { + "key": "defaultKey" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### timeZone + +Set the IANA timezone for the device + +To get the value of `timeZone` call the method like this: + +```typescript +function timeZone(): Promise +``` + +Promise resolution: + +[TimeZone](../Localization/schemas/#TimeZone) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------------- | +| uses | xrn:firebolt:capability:localization:time-zone | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.timeZone() +console.log(result) +``` + +Value of `result`: + +```javascript +'America/New_York' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.timeZone", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "America/New_York" +} +``` + +
+ +Additional Example + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.timeZone() +console.log(result) +``` + +Value of `result`: + +```javascript +'America/New_York' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.timeZone", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "America/Los_Angeles" +} +``` + +
+ +--- + +To set the value of `timeZone` call the method like this: + +```typescript +function timeZone(value: TimeZone): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ----------------------------------------------- | -------- | ----------------------------------- | +| `value` | [`TimeZone`](../Localization/schemas/#TimeZone) | true |
pattern: ^[-+_/ A-Za-z 0-9]\*$ | + +Promise resolution: + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.timeZone('America/New_York') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.setTimeZone", + "params": { + "value": "America/New_York" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Additional Example + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let result = await Localization.timeZone('America/Los_Angeles') +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.setTimeZone", + "params": { + "value": "America/Los_Angeles" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function timeZone(callback: (value) => TimeZone): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let listenerId = await timeZone((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `result`: + +```javascript +'America/New_York' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onTimeZoneChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "America/New_York" +} +``` + +
+ +Additional Example + +JavaScript: + +```javascript +import { Localization } from '@firebolt-js/manage-sdk' + +let listenerId = await timeZone((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `result`: + +```javascript +'America/New_York' +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Localization.onTimeZoneChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": "America/Los_Angeles" +} +``` + +
+ +--- + +## Events + +### countryCodeChanged + +See: [countryCode](#countrycode) + +### languageChanged + +See: [language](#language) + +### localeChanged + +See: [locale](#locale) + +### localityChanged + +See: [locality](#locality) + +### postalCodeChanged + +See: [postalCode](#postalcode) + +### preferredAudioLanguagesChanged + +See: [preferredAudioLanguages](#preferredaudiolanguages) + +### timeZoneChanged + +See: [timeZone](#timezone) + +## Types diff --git a/apis/pr-fix-ci-fb-version/manage/Localization/schemas/index.md b/apis/pr-fix-ci-fb-version/manage/Localization/schemas/index.md new file mode 100644 index 000000000..00191c4be --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Localization/schemas/index.md @@ -0,0 +1,79 @@ +--- +title: Localization + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Localization + +--- + +Version Localization 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [ISO639_2Language](#isolanguage) + - [Locality](#locality) + - [CountryCode](#countrycode) + - [Language](#language) + - [Locale](#locale) + - [TimeZone](#timezone) + +## Overview + +undefined + +## Types + +### ISO639_2Language + +```typescript + +``` + +--- + +### Locality + +```typescript + +``` + +--- + +### CountryCode + +```typescript + +``` + +--- + +### Language + +```typescript + +``` + +--- + +### Locale + +```typescript + +``` + +--- + +### TimeZone + +```typescript + +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/Metrics/index.md b/apis/pr-fix-ci-fb-version/manage/Metrics/index.md new file mode 100644 index 000000000..e2d9d3eaa --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Metrics/index.md @@ -0,0 +1,137 @@ +--- +title: Metrics + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Metrics Module + +--- + +Version Metrics 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [event](#event) +- [Types](#types) + - [EventObjectPrimitives](#eventobjectprimitives) + - [EventObject](#eventobject) + +## Usage + +To use the Metrics module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Metrics } from '@firebolt-js/manage-sdk' +``` + +## Overview + +Methods for sending metrics + +## Methods + +### event + +Inform the platform of 1st party distributor metrics. + +```typescript +function event(schema: string, data: EventObject): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| -------- | ------------------------------- | -------- | -------------------------------------------------- | +| `schema` | `string` | true | The schema URI of the metric type
format: uri | +| `data` | [`EventObject`](#eventobject-1) | true | A JSON payload conforming the the provided schema | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------------- | +| uses | xrn:firebolt:capability:metrics:distributor | + +#### Examples + +Send foo event + +JavaScript: + +```javascript +import { Metrics } from '@firebolt-js/manage-sdk' + +let results = await Metrics.event('http://meta.rdkcentral.com/some/schema', { + foo: 'foo', +}) +console.log(results) +``` + +Value of `results`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Metrics.event", + "params": { + "schema": "http://meta.rdkcentral.com/some/schema", + "data": { + "foo": "foo" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +## Types + +### EventObjectPrimitives + +```typescript +type EventObjectPrimitives = string | number | number | boolean | null +``` + +--- + +### EventObject + +```typescript +type EventObject = {} +``` + +See also: + +[EventObjectPrimitives](#eventobjectprimitives) +[EventObject](#eventobject-1) + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/PinChallenge/index.md b/apis/pr-fix-ci-fb-version/manage/PinChallenge/index.md new file mode 100644 index 000000000..c62038036 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/PinChallenge/index.md @@ -0,0 +1,541 @@ +--- +title: PinChallenge + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# PinChallenge Module + +--- + +Version PinChallenge 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [challengeError](#challengeerror) + - [challengeFocus](#challengefocus) + - [challengeResponse](#challengeresponse) + - [provide](#provide) +- [Events](#events) + - [onRequestChallenge](#onrequestchallenge) +- [Provider Interfaces](#provider-interfaces) + - [ChallengeProvider](#challengeprovider) +- [Types](#types) + - [ResultReason](#resultreason) + - [ChallengeRequestor](#challengerequestor) + - [PinChallengeResult](#pinchallengeresult) + - [PinChallenge](#pinchallenge) + - [PinChallengeProviderRequest](#pinchallengeproviderrequest) + +## Usage + +To use the PinChallenge module, you can import it into your project from the Firebolt SDK: + +```javascript +import { PinChallenge } from '@firebolt-js/manage-sdk' +``` + +## Overview + +A module for registering as a provider for a user grant in which the user is prompted for a pin for access to a capability + +## Methods + +### challengeError + +_This is an private RPC method._ + +Internal API for Challenge Provider to send back error. + +Parameters: + +| Param | Type | Required | Description | +| --------------- | -------- | -------- | ----------- | +| `correlationId` | `string` | true | | +| `error` | `object` | true | | + +Result: + +Capabilities: + +| Role | Capability | +| -------- | ---------------------------------------------- | +| provides | xrn:firebolt:capability:usergrant:pinchallenge | + +#### Examples + +Example 1 + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "PinChallenge.challengeError", + "params": { + "correlationId": "123", + "error": { + "code": 1, + "message": "Error" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +### challengeFocus + +_This is an private RPC method._ + +Internal API for Challenge Provider to request focus for UX purposes. + +Result: + +Capabilities: + +| Role | Capability | +| -------- | ---------------------------------------------- | +| provides | xrn:firebolt:capability:usergrant:pinchallenge | + +#### Examples + +Example + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "PinChallenge.challengeFocus", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +### challengeResponse + +_This is an private RPC method._ + +Internal API for Challenge Provider to send back response. + +Parameters: + +| Param | Type | Required | Description | +| --------------- | ------------------------------------------- | -------- | ----------- | +| `correlationId` | `string` | true | | +| `result` | [`PinChallengeResult`](#pinchallengeresult) | true | | + +Result: + +Capabilities: + +| Role | Capability | +| -------- | ---------------------------------------------- | +| provides | xrn:firebolt:capability:usergrant:pinchallenge | + +#### Examples + +Example #1 + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "PinChallenge.challengeResponse", + "params": { + "correlationId": "123", + "result": { + "granted": true, + "reason": "correctPin" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +Example #2 + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "PinChallenge.challengeResponse", + "params": { + "correlationId": "123", + "result": { + "granted": false, + "reason": "exceededPinFailures" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +Example #3 + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "PinChallenge.challengeResponse", + "params": { + "correlationId": "123", + "result": { + "granted": null, + "reason": "cancelled" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +--- + +### provide + +To provide a specific capability to the platform. See [Provider Interfaces](#provider-interfaces) for a list of interfaces available to provide in this module. + +```typescript +provide(capability: string, provider: any): void +``` + +Parameters: + +| Param | Type | Required | Summary | +| ------------ | -------- | -------- | -------------------------------------------- | +| `capability` | `string` | Yes | The capability that is being provided. | +| `provider` | `any` | Yes | An implementation of the required interface. | + +See [Provider Interfaces](#provider-interfaces) for each capabilities interface definition. + +## Events + +### onRequestChallenge + +_This is an private RPC method._ + +Registers as a provider for when the user should be challenged in order to confirm access to a capability through a pin prompt + +Parameters: + +| Param | Type | Required | Description | +| -------- | --------- | -------- | ----------- | +| `listen` | `boolean` | true | | + +Result: + +[PinChallengeProviderRequest](#pinchallengeproviderrequest) + +Capabilities: + +| Role | Capability | +| -------- | ---------------------------------------------- | +| provides | xrn:firebolt:capability:usergrant:pinchallenge | + +#### Examples + +Default Example + +JSON-RPC: + +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "PinChallenge.onRequestChallenge", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "correlationId": "abc", + "parameters": { + "capability": "xrn:firebolt:capability:commerce::purchase", + "requestor": { + "id": "ReferenceApp", + "name": "Firebolt Reference App" + }, + "pinSpace": "purchase" + } + } +} +``` + +--- + +## Provider Interfaces + +### ChallengeProvider + +The provider interface for the `xrn:firebolt:capability:usergrant:pinchallenge` capability. + +```typescript + +``` + +Usage: + +```typescript +PinChallenge.provide('xrn:firebolt:capability:usergrant:pinchallenge', provider: ChallengeProvider | object) +``` + +#### Examples + +**Register your app to provide the `xrn:firebolt:capability:usergrant:pinchallenge` capability.** + +```javascript +import { PinChallenge } from '@firebolt-js/manage-sdk' + +class MyChallengeProvider { + async challenge(parameters, session) { + return { + granted: true, + reason: 'correctPin', + } + } +} + +PinChallenge.provide( + 'xrn:firebolt:capability:usergrant:pinchallenge', + new MyChallengeProvider(), +) +``` + +
+ JSON-RPC + +**Register to recieve each provider API** + +Request: + +```json +{ + "id": 1, + "method": "PinChallenge.onRequestChallenge", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "id": 1, + "result": { + "listening": true, + "event": "PinChallenge.onRequestChallenge" + } +} +``` + +**Asynchronous event to initiate challenge()** + +Event Response: + +```json +{ + "id": 1, + "result": { + "correlationId": undefined, + "parameters": { + "capability": "xrn:firebolt:capability:commerce::purchase", + "requestor": { + "id": "ReferenceApp", + "name": "Firebolt Reference App" + }, + "pinSpace": "purchase" + } + } +} +``` + +**App initiated response to event** + +Request: + +```json +{ + "id": 2, + "method": "PinChallenge.challengeResponse", + "params": { + "correlationId": undefined, + "result": { + "granted": true, + "reason": "correctPin" + } + } +} +``` + +Response: + +```json +{ + "id": 2, + "result": true +} +``` + +
+ +## Types + +### ResultReason + +The reason for the result of challenging the user + +```typescript +ResultReason: { + NO_PIN_REQUIRED: 'noPinRequired', + NO_PIN_REQUIRED_WINDOW: 'noPinRequiredWindow', + EXCEEDED_PIN_FAILURES: 'exceededPinFailures', + CORRECT_PIN: 'correctPin', + CANCELLED: 'cancelled', +}, + +``` + +--- + +### ChallengeRequestor + +```typescript +type ChallengeRequestor = { + id: string // The id of the app that requested the challenge + name: string // The name of the app that requested the challenge +} +``` + +--- + +### PinChallengeResult + +```typescript +type PinChallengeResult = { + granted: boolean + reason: ResultReason // The reason for the result of challenging the user +} +``` + +See also: + +[ResultReason](#resultreason) + +--- + +### PinChallenge + +```typescript +type PinChallenge = { + pinSpace: 'purchase' | 'content' // The pin space that this challenge is for + capability?: string // The capability that is gated by a pin challenge + requestor: ChallengeRequestor // The identity of which app is requesting access to this capability +} +``` + +See also: + +[ChallengeRequestor](#challengerequestor) + +--- + +### PinChallengeProviderRequest + +```typescript +type PinChallengeProviderRequest = { + parameters: PinChallenge // The result of the provider response. + correlationId: string // The id that was passed in to the event that triggered a provider method to be called +} +``` + +See also: + +[ProviderRequest](../Types/schemas/#ProviderRequest) +[PinChallenge](#pinchallenge-1) + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/Privacy/index.md b/apis/pr-fix-ci-fb-version/manage/Privacy/index.md new file mode 100644 index 000000000..1bac4f513 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Privacy/index.md @@ -0,0 +1,4187 @@ +--- +title: Privacy + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Privacy Module + +--- + +Version Privacy 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [allowACRCollection](#allowacrcollection) + - [allowAppContentAdTargeting](#allowappcontentadtargeting) + - [allowCameraAnalytics](#allowcameraanalytics) + - [allowPersonalization](#allowpersonalization) + - [allowPrimaryBrowseAdTargeting](#allowprimarybrowseadtargeting) + - [allowPrimaryContentAdTargeting](#allowprimarycontentadtargeting) + - [allowProductAnalytics](#allowproductanalytics) + - [allowRemoteDiagnostics](#allowremotediagnostics) + - [allowResumePoints](#allowresumepoints) + - [allowUnentitledPersonalization](#allowunentitledpersonalization) + - [allowUnentitledResumePoints](#allowunentitledresumepoints) + - [allowWatchHistory](#allowwatchhistory) + - [listen](#listen) + - [once](#once) + - [settings](#settings) +- [Events](#events) + - [allowACRCollectionChanged](#allowacrcollectionchanged) + - [allowAppContentAdTargetingChanged](#allowappcontentadtargetingchanged) + - [allowCameraAnalyticsChanged](#allowcameraanalyticschanged) + - [allowPersonalizationChanged](#allowpersonalizationchanged) + - [allowPrimaryBrowseAdTargetingChanged](#allowprimarybrowseadtargetingchanged) + - [allowPrimaryContentAdTargetingChanged](#allowprimarycontentadtargetingchanged) + - [allowProductAnalyticsChanged](#allowproductanalyticschanged) + - [allowRemoteDiagnosticsChanged](#allowremotediagnosticschanged) + - [allowResumePointsChanged](#allowresumepointschanged) + - [allowUnentitledPersonalizationChanged](#allowunentitledpersonalizationchanged) + - [allowUnentitledResumePointsChanged](#allowunentitledresumepointschanged) + - [allowWatchHistoryChanged](#allowwatchhistorychanged) +- [Types](#types) + - [PrivacySettings](#privacysettings) + +## Usage + +To use the Privacy module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' +``` + +## Overview + +A module for managing device settings. + +## Methods + +### allowACRCollection + +Whether the user allows their automatic content recognition data to be collected + +To get the value of `allowACRCollection` call the method like this: + +```typescript +function allowACRCollection(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------- | +| uses | xrn:firebolt:capability:privacy:settings | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowACRCollection() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowACRCollection", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowACRCollection() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowACRCollection", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `allowACRCollection` call the method like this: + +```typescript +function allowACRCollection(value: boolean): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------- | -------- | ----------- | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowACRCollection(true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowACRCollection", + "params": { + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowACRCollection(false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowACRCollection", + "params": { + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function allowACRCollection(callback: (value) => boolean): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowACRCollection((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowACRCollectionChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowACRCollection((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowACRCollectionChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### allowAppContentAdTargeting + +Whether the user allows ads to be targeted to the user while watching content in apps + +To get the value of `allowAppContentAdTargeting` call the method like this: + +```typescript +function allowAppContentAdTargeting(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------- | +| uses | xrn:firebolt:capability:privacy:settings | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowAppContentAdTargeting() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowAppContentAdTargeting", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowAppContentAdTargeting() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowAppContentAdTargeting", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `allowAppContentAdTargeting` call the method like this: + +```typescript +function allowAppContentAdTargeting(value: boolean): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------- | -------- | ----------- | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowAppContentAdTargeting(true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowAppContentAdTargeting", + "params": { + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowAppContentAdTargeting(false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowAppContentAdTargeting", + "params": { + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function allowAppContentAdTargeting( + callback: (value) => boolean, +): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowAppContentAdTargeting((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowAppContentAdTargetingChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowAppContentAdTargeting((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowAppContentAdTargetingChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### allowCameraAnalytics + +Whether the user allows data from their camera to be used for Product Analytics + +To get the value of `allowCameraAnalytics` call the method like this: + +```typescript +function allowCameraAnalytics(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------- | +| uses | xrn:firebolt:capability:privacy:settings | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowCameraAnalytics() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowCameraAnalytics", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowCameraAnalytics() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowCameraAnalytics", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `allowCameraAnalytics` call the method like this: + +```typescript +function allowCameraAnalytics(value: boolean): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------- | -------- | ----------- | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowCameraAnalytics(true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowCameraAnalytics", + "params": { + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowCameraAnalytics(false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowCameraAnalytics", + "params": { + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function allowCameraAnalytics(callback: (value) => boolean): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowCameraAnalytics((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowCameraAnalyticsChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowCameraAnalytics((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowCameraAnalyticsChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### allowPersonalization + +Whether the user allows their usage data to be used for personalization and recommendations + +To get the value of `allowPersonalization` call the method like this: + +```typescript +function allowPersonalization(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------- | +| uses | xrn:firebolt:capability:privacy:settings | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowPersonalization() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowPersonalization", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowPersonalization() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowPersonalization", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `allowPersonalization` call the method like this: + +```typescript +function allowPersonalization(value: boolean): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------- | -------- | ----------- | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowPersonalization(true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowPersonalization", + "params": { + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowPersonalization(false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowPersonalization", + "params": { + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function allowPersonalization(callback: (value) => boolean): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowPersonalization((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowPersonalizationChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowPersonalization((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowPersonalizationChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### allowPrimaryBrowseAdTargeting + +Whether the user allows ads to be targeted to the user while browsing in the primary experience + +To get the value of `allowPrimaryBrowseAdTargeting` call the method like this: + +```typescript +function allowPrimaryBrowseAdTargeting(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------- | +| uses | xrn:firebolt:capability:privacy:settings | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowPrimaryBrowseAdTargeting() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowPrimaryBrowseAdTargeting", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowPrimaryBrowseAdTargeting() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowPrimaryBrowseAdTargeting", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `allowPrimaryBrowseAdTargeting` call the method like this: + +```typescript +function allowPrimaryBrowseAdTargeting(value: boolean): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------- | -------- | ----------- | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowPrimaryBrowseAdTargeting(true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowPrimaryBrowseAdTargeting", + "params": { + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowPrimaryBrowseAdTargeting(false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowPrimaryBrowseAdTargeting", + "params": { + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function allowPrimaryBrowseAdTargeting( + callback: (value) => boolean, +): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowPrimaryBrowseAdTargeting((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowPrimaryBrowseAdTargetingChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowPrimaryBrowseAdTargeting((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowPrimaryBrowseAdTargetingChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### allowPrimaryContentAdTargeting + +Whether the user allows ads to be targeted to the user while watching content in the primary experience + +To get the value of `allowPrimaryContentAdTargeting` call the method like this: + +```typescript +function allowPrimaryContentAdTargeting(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------- | +| uses | xrn:firebolt:capability:privacy:settings | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowPrimaryContentAdTargeting() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowPrimaryContentAdTargeting", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowPrimaryContentAdTargeting() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowPrimaryContentAdTargeting", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `allowPrimaryContentAdTargeting` call the method like this: + +```typescript +function allowPrimaryContentAdTargeting(value: boolean): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------- | -------- | ----------- | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowPrimaryContentAdTargeting(true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowPrimaryContentAdTargeting", + "params": { + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowPrimaryContentAdTargeting(false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowPrimaryContentAdTargeting", + "params": { + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function allowPrimaryContentAdTargeting( + callback: (value) => boolean, +): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowPrimaryContentAdTargeting((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowPrimaryContentAdTargetingChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowPrimaryContentAdTargeting((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowPrimaryContentAdTargetingChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### allowProductAnalytics + +Whether the user allows their usage data can be used for analytics about the product + +To get the value of `allowProductAnalytics` call the method like this: + +```typescript +function allowProductAnalytics(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------- | +| uses | xrn:firebolt:capability:privacy:settings | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowProductAnalytics() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowProductAnalytics", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowProductAnalytics() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowProductAnalytics", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `allowProductAnalytics` call the method like this: + +```typescript +function allowProductAnalytics(value: boolean): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------- | -------- | ----------- | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowProductAnalytics(true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowProductAnalytics", + "params": { + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowProductAnalytics(false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowProductAnalytics", + "params": { + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function allowProductAnalytics(callback: (value) => boolean): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowProductAnalytics((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowProductAnalyticsChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowProductAnalytics((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowProductAnalyticsChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### allowRemoteDiagnostics + +Whether the user allows their personal data to be included in diagnostic telemetry. This also allows whether device logs can be remotely accessed from the client device + +To get the value of `allowRemoteDiagnostics` call the method like this: + +```typescript +function allowRemoteDiagnostics(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------- | +| uses | xrn:firebolt:capability:privacy:settings | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowRemoteDiagnostics() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowRemoteDiagnostics", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowRemoteDiagnostics() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowRemoteDiagnostics", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `allowRemoteDiagnostics` call the method like this: + +```typescript +function allowRemoteDiagnostics(value: boolean): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------- | -------- | ----------- | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowRemoteDiagnostics(true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowRemoteDiagnostics", + "params": { + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowRemoteDiagnostics(false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowRemoteDiagnostics", + "params": { + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function allowRemoteDiagnostics(callback: (value) => boolean): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowRemoteDiagnostics((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowRemoteDiagnosticsChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowRemoteDiagnostics((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowRemoteDiagnosticsChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### allowResumePoints + +Whether the user allows resume points for content to show in the main experience + +To get the value of `allowResumePoints` call the method like this: + +```typescript +function allowResumePoints(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------- | +| uses | xrn:firebolt:capability:privacy:settings | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowResumePoints() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowResumePoints", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowResumePoints() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowResumePoints", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `allowResumePoints` call the method like this: + +```typescript +function allowResumePoints(value: boolean): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------- | -------- | ----------- | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowResumePoints(true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowResumePoints", + "params": { + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowResumePoints(false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowResumePoints", + "params": { + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function allowResumePoints(callback: (value) => boolean): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowResumePoints((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowResumePointsChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowResumePoints((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowResumePointsChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### allowUnentitledPersonalization + +Whether the user allows their usage data to be used for personalization and recommendations for unentitled content + +To get the value of `allowUnentitledPersonalization` call the method like this: + +```typescript +function allowUnentitledPersonalization(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------- | +| uses | xrn:firebolt:capability:privacy:settings | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowUnentitledPersonalization() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowUnentitledPersonalization", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowUnentitledPersonalization() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowUnentitledPersonalization", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `allowUnentitledPersonalization` call the method like this: + +```typescript +function allowUnentitledPersonalization(value: boolean): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------- | -------- | ----------- | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowUnentitledPersonalization(true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowUnentitledPersonalization", + "params": { + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowUnentitledPersonalization(false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowUnentitledPersonalization", + "params": { + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function allowUnentitledPersonalization( + callback: (value) => boolean, +): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowUnentitledPersonalization((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowUnentitledPersonalizationChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowUnentitledPersonalization((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowUnentitledPersonalizationChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### allowUnentitledResumePoints + +Whether the user allows resume points for content from unentitled providers to show in the main experience + +To get the value of `allowUnentitledResumePoints` call the method like this: + +```typescript +function allowUnentitledResumePoints(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------- | +| uses | xrn:firebolt:capability:privacy:settings | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowUnentitledResumePoints() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowUnentitledResumePoints", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowUnentitledResumePoints() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowUnentitledResumePoints", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `allowUnentitledResumePoints` call the method like this: + +```typescript +function allowUnentitledResumePoints(value: boolean): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------- | -------- | ----------- | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowUnentitledResumePoints(true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowUnentitledResumePoints", + "params": { + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowUnentitledResumePoints(false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowUnentitledResumePoints", + "params": { + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function allowUnentitledResumePoints( + callback: (value) => boolean, +): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowUnentitledResumePoints((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowUnentitledResumePointsChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowUnentitledResumePoints((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowUnentitledResumePointsChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### allowWatchHistory + +Whether the user allows their watch history from all sources to show in the main experience + +To get the value of `allowWatchHistory` call the method like this: + +```typescript +function allowWatchHistory(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------- | +| uses | xrn:firebolt:capability:privacy:settings | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowWatchHistory() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowWatchHistory", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let allow = await Privacy.allowWatchHistory() +console.log(allow) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.allowWatchHistory", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `allowWatchHistory` call the method like this: + +```typescript +function allowWatchHistory(value: boolean): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------- | -------- | ----------- | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowWatchHistory(true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowWatchHistory", + "params": { + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let result = await Privacy.allowWatchHistory(false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.setAllowWatchHistory", + "params": { + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function allowWatchHistory(callback: (value) => boolean): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowWatchHistory((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowWatchHistoryChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let listenerId = await allowWatchHistory((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `allow`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.onAllowWatchHistoryChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ----------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Privacy.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ----------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Privacy.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ----------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Privacy.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ----------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `Privacy.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### settings + +Gets the allowed value for all privacy settings + +```typescript +function settings(): Promise +``` + +Promise resolution: + +[PrivacySettings](#privacysettings) + +Capabilities: + +| Role | Capability | +| ---- | ---------------------------------------- | +| uses | xrn:firebolt:capability:privacy:settings | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { Privacy } from '@firebolt-js/manage-sdk' + +let settings = await Privacy.settings() +console.log(settings) +``` + +Value of `settings`: + +```javascript +{ + "allowACRCollection": true, + "allowResumePoints": false, + "allowAppContentAdTargeting": false, + "allowCameraAnalytics": true, + "allowPersonalization": true, + "allowPrimaryBrowseAdTargeting": false, + "allowPrimaryContentAdTargeting": false, + "allowProductAnalytics": true, + "allowRemoteDiagnostics": true, + "allowUnentitledPersonalization": true, + "allowUnentitledResumePoints": false, + "allowWatchHistory": true +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Privacy.settings", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "allowACRCollection": true, + "allowResumePoints": false, + "allowAppContentAdTargeting": false, + "allowCameraAnalytics": true, + "allowPersonalization": true, + "allowPrimaryBrowseAdTargeting": false, + "allowPrimaryContentAdTargeting": false, + "allowProductAnalytics": true, + "allowRemoteDiagnostics": true, + "allowUnentitledPersonalization": true, + "allowUnentitledResumePoints": false, + "allowWatchHistory": true + } +} +``` + +
+ +--- + +## Events + +### allowACRCollectionChanged + +See: [allowACRCollection](#allowacrcollection) + +### allowAppContentAdTargetingChanged + +See: [allowAppContentAdTargeting](#allowappcontentadtargeting) + +### allowCameraAnalyticsChanged + +See: [allowCameraAnalytics](#allowcameraanalytics) + +### allowPersonalizationChanged + +See: [allowPersonalization](#allowpersonalization) + +### allowPrimaryBrowseAdTargetingChanged + +See: [allowPrimaryBrowseAdTargeting](#allowprimarybrowseadtargeting) + +### allowPrimaryContentAdTargetingChanged + +See: [allowPrimaryContentAdTargeting](#allowprimarycontentadtargeting) + +### allowProductAnalyticsChanged + +See: [allowProductAnalytics](#allowproductanalytics) + +### allowRemoteDiagnosticsChanged + +See: [allowRemoteDiagnostics](#allowremotediagnostics) + +### allowResumePointsChanged + +See: [allowResumePoints](#allowresumepoints) + +### allowUnentitledPersonalizationChanged + +See: [allowUnentitledPersonalization](#allowunentitledpersonalization) + +### allowUnentitledResumePointsChanged + +See: [allowUnentitledResumePoints](#allowunentitledresumepoints) + +### allowWatchHistoryChanged + +See: [allowWatchHistory](#allowwatchhistory) + +## Types + +### PrivacySettings + +```typescript +type PrivacySettings = { + allowACRCollection: boolean + allowResumePoints: boolean + allowAppContentAdTargeting: boolean + allowCameraAnalytics: boolean + allowPersonalization: boolean + allowPrimaryBrowseAdTargeting: boolean + allowPrimaryContentAdTargeting: boolean + allowProductAnalytics: boolean + allowRemoteDiagnostics: boolean + allowUnentitledPersonalization: boolean + allowUnentitledResumePoints: boolean + allowWatchHistory: boolean +} +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/SecondScreen/schemas/index.md b/apis/pr-fix-ci-fb-version/manage/SecondScreen/schemas/index.md new file mode 100644 index 000000000..f82c0186e --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/SecondScreen/schemas/index.md @@ -0,0 +1,40 @@ +--- +title: SecondScreen + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# SecondScreen + +--- + +Version SecondScreen 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [SecondScreenEvent](#secondscreenevent) + +## Overview + +undefined + +## Types + +### SecondScreenEvent + +An a message notification from a second screen device + +```typescript +type SecondScreenEvent = { + type: 'dial' + version?: string + data?: string +} +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/SecureStorage/index.md b/apis/pr-fix-ci-fb-version/manage/SecureStorage/index.md new file mode 100644 index 000000000..76874c88d --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/SecureStorage/index.md @@ -0,0 +1,367 @@ +--- +title: SecureStorage + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# SecureStorage Module + +--- + +Version SecureStorage 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [clearForApp](#clearforapp) + - [removeForApp](#removeforapp) + - [setForApp](#setforapp) +- [Types](#types) + - [StorageScope](#storagescope) + - [StorageOptions](#storageoptions) + +## Usage + +To use the SecureStorage module, you can import it into your project from the Firebolt SDK: + +```javascript +import { SecureStorage } from '@firebolt-js/manage-sdk' +``` + +## Overview + +A module for storing and retrieving secure data owned by the app + +## Methods + +### clearForApp + +Clears all the secure data values for a specific app + +```typescript +function clearForApp(appId: string, scope: StorageScope): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ------------------------------- | -------- | --------------------------------------------------------------- | +| `appId` | `string` | true | appId for which values are removed | +| `scope` | [`StorageScope`](#storagescope) | true | The scope of the key/value
values: `'device' \| 'account'` | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ------- | -------------------------------------- | +| manages | xrn:firebolt:capability:storage:secure | + +#### Examples + +Clears all the secure data values for appId foo + +JavaScript: + +```javascript +import { SecureStorage } from '@firebolt-js/manage-sdk' + +let success = await SecureStorage.clearForApp('foo', 'account') +console.log(success) +``` + +Value of `success`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecureStorage.clearForApp", + "params": { + "appId": "foo", + "scope": "account" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### removeForApp + +Removes single data value for a specific app. + +```typescript +function removeForApp( + appId: string, + scope: StorageScope, + key: string, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | ------------------------------- | -------- | --------------------------------------------------------------- | +| `appId` | `string` | true | appId for which values are removed | +| `scope` | [`StorageScope`](#storagescope) | true | The scope of the key/value
values: `'device' \| 'account'` | +| `key` | `string` | true | Key to remove | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ------- | -------------------------------------- | +| manages | xrn:firebolt:capability:storage:secure | + +#### Examples + +Removes authRefreshToken for appId foo + +JavaScript: + +```javascript +import { SecureStorage } from '@firebolt-js/manage-sdk' + +let success = await SecureStorage.removeForApp( + 'foo', + 'account', + 'authRefreshToken', +) +console.log(success) +``` + +Value of `success`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecureStorage.removeForApp", + "params": { + "appId": "foo", + "scope": "account", + "key": "authRefreshToken" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### setForApp + +Set or update a secure data value for a specific app. + +```typescript +function setForApp( + appId: string, + scope: StorageScope, + key: string, + value: string, + options: StorageOptions, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| --------- | ----------------------------------- | -------- | -------------------------------------------------------------- | +| `appId` | `string` | true | appId for which value is being set | +| `scope` | [`StorageScope`](#storagescope) | true | The scope of the data key
values: `'device' \| 'account'` | +| `key` | `string` | true | Key to set | +| `value` | `string` | true | Value to set | +| `options` | [`StorageOptions`](#storageoptions) | false | Optional parameters to set | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ------- | -------------------------------------- | +| manages | xrn:firebolt:capability:storage:secure | + +#### Examples + +Set a refresh token with name authRefreshToken with optional parameter for appId foo + +JavaScript: + +```javascript +import { SecureStorage } from '@firebolt-js/manage-sdk' + +let success = await SecureStorage.setForApp( + 'foo', + 'device', + 'authRefreshToken', + 'VGhpcyBub3QgYSByZWFsIHRva2VuLgo=', + { + ttl: 600, + }, +) +console.log(success) +``` + +Value of `success`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecureStorage.setForApp", + "params": { + "appId": "foo", + "scope": "device", + "key": "authRefreshToken", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=", + "options": { + "ttl": 600 + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Set a refresh token with name authRefreshToken without optional parameter for appId foo + +JavaScript: + +```javascript +import { SecureStorage } from '@firebolt-js/manage-sdk' + +let success = await SecureStorage.setForApp( + 'foo', + 'account', + 'authRefreshToken', + 'VGhpcyBub3QgYSByZWFsIHRva2VuLgo=', + null, +) +console.log(success) +``` + +Value of `success`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "SecureStorage.setForApp", + "params": { + "appId": "foo", + "scope": "account", + "key": "authRefreshToken", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +## Types + +### StorageScope + +The scope of the data + +```typescript +StorageScope: { + DEVICE: 'device', + ACCOUNT: 'account', +}, + +``` + +--- + +### StorageOptions + +```typescript +type StorageOptions = { + ttl: number // Seconds from set time before the data expires and is removed +} +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/Types/schemas/index.md b/apis/pr-fix-ci-fb-version/manage/Types/schemas/index.md new file mode 100644 index 000000000..dc756bf30 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Types/schemas/index.md @@ -0,0 +1,94 @@ +--- +title: Types + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Types + +--- + +Version Types 0.0.0-unknown.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Overview](#overview) +- [Types](#types) + - [AudioProfile](#audioprofile) + - [SemanticVersion](#semanticversion) + - [LocalizedString](#localizedstring) + - [FlatMap](#flatmap) + - [BooleanMap](#booleanmap) + - [Timeout](#timeout) + +## Overview + +undefined + +## Types + +### AudioProfile + +```typescript +AudioProfile: { + STEREO: 'stereo', + DOLBY_DIGITAL_5_1: 'dolbyDigital5.1', + DOLBY_DIGITAL_5_1_PLUS: 'dolbyDigital5.1+', + DOLBY_ATMOS: 'dolbyAtmos', +}, + +``` + +--- + +### SemanticVersion + +```typescript +type SemanticVersion = { + major: number + minor: number + patch: number + readable: string +} +``` + +--- + +### LocalizedString + +Localized string supports either a simple `string` or a Map of language codes to strings. When using a simple `string`, the current preferred langauge from `Localization.langauge()` is assumed. + +```typescript +type LocalizedString = string | object +``` + +--- + +### FlatMap + +```typescript + +``` + +--- + +### BooleanMap + +```typescript +type BooleanMap = {} +``` + +--- + +### Timeout + +Defines the timeout in seconds. If the threshold for timeout is passed for any operation without a result it will throw an error. + +```typescript + +``` + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/UserGrants/index.md b/apis/pr-fix-ci-fb-version/manage/UserGrants/index.md new file mode 100644 index 000000000..5a328fa48 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/UserGrants/index.md @@ -0,0 +1,849 @@ +--- +title: UserGrants + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# UserGrants Module + +--- + +Version UserGrants 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [app](#app) + - [capability](#capability) + - [clear](#clear) + - [deny](#deny) + - [device](#device) + - [grant](#grant) + - [request](#request) +- [Types](#types) + - [GrantState](#grantstate) + - [GrantModificationOptions](#grantmodificationoptions) + - [RequestOptions](#requestoptions) + - [AppInfo](#appinfo) + - [GrantInfo](#grantinfo) + +## Usage + +To use the UserGrants module, you can import it into your project from the Firebolt SDK: + +```javascript +import { UserGrants } from '@firebolt-js/manage-sdk' +``` + +## Overview + +A module for managing grants given by the user + +## Methods + +### app + +Get all granted and denied user grants for the given app + +```typescript +function app(appId: string): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | -------- | -------- | ----------- | +| `appId` | `string` | true | | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------ | +| uses | xrn:firebolt:capability:grants:state | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { UserGrants } from '@firebolt-js/manage-sdk' + +let info = await UserGrants.app('certapp') +console.log(info) +``` + +Value of `info`: + +```javascript +;[ + { + app: { + id: 'certapp', + title: 'Firebolt Certification', + }, + state: 'granted', + capability: 'xrn:firebolt:capability:data:app-usage', + role: 'use', + lifespan: 'seconds', + expires: '2022-12-14T20:20:39+00:00', + }, + { + app: { + id: 'certapp', + title: 'Firebolt Certification', + }, + state: 'denied', + capability: 'xrn:firebolt:capability:localization:postal-code', + role: 'use', + lifespan: 'appActive', + }, +] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "UserGrants.app", + "params": { + "appId": "certapp" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "app": { + "id": "certapp", + "title": "Firebolt Certification" + }, + "state": "granted", + "capability": "xrn:firebolt:capability:data:app-usage", + "role": "use", + "lifespan": "seconds", + "expires": "2022-12-14T20:20:39+00:00" + }, + { + "app": { + "id": "certapp", + "title": "Firebolt Certification" + }, + "state": "denied", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "appActive" + } + ] +} +``` + +
+ +--- + +### capability + +Get all granted and denied user grants for the given capability + +```typescript +function capability(capability: Capability): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------------ | --------------------------------------------------- | -------- | ---------------------------------------------------------------------- | +| `capability` | [`Capability`](../Capabilities/schemas/#Capability) | true |
pattern: ^xrn:firebolt:capability:([a-z0-9\-]+)((:[a-z0-9\-]+)?)$ | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------ | +| uses | xrn:firebolt:capability:grants:state | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { UserGrants } from '@firebolt-js/manage-sdk' + +let info = await UserGrants.capability( + 'xrn:firebolt:capability:localization:postal-code', +) +console.log(info) +``` + +Value of `info`: + +```javascript +;[ + { + state: 'granted', + capability: 'xrn:firebolt:capability:localization:postal-code', + role: 'use', + lifespan: 'powerActive', + }, +] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "UserGrants.capability", + "params": { + "capability": "xrn:firebolt:capability:localization:postal-code" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "state": "granted", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "powerActive" + } + ] +} +``` + +
+ +--- + +### clear + +Clears the grant for a given capability, to a specific app if appropriate. Calling this results in a persisted Denied Grant that lasts for the duration of the Grant Policy lifespan. + +```typescript +function clear( + role: Role, + capability: Capability, + options: GrantModificationOptions, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------------ | ------------------------------------------------------- | -------- | ---------------------------------------------------------------------- | +| `role` | [`Role`](../Capabilities/schemas/#Role) | true |
values: `'use' \| 'manage' \| 'provide'` | +| `capability` | [`Capability`](../Capabilities/schemas/#Capability) | true |
pattern: ^xrn:firebolt:capability:([a-z0-9\-]+)((:[a-z0-9\-]+)?)$ | +| `options` | [`GrantModificationOptions`](#grantmodificationoptions) | false | | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ------- | ------------------------------------ | +| manages | xrn:firebolt:capability:grants:state | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { UserGrants } from '@firebolt-js/manage-sdk' + +let result = await UserGrants.clear( + 'use', + 'xrn:firebolt:capability:localization:postal-code', + { appId: 'certapp' }, +) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "UserGrants.clear", + "params": { + "role": "use", + "capability": "xrn:firebolt:capability:localization:postal-code", + "options": { + "appId": "certapp" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### deny + +Denies a given capability, to a specific app if appropriate. Calling this results in a persisted Denied Grant that lasts for the duration of the Grant Policy lifespan. + +```typescript +function deny( + role: Role, + capability: Capability, + options: GrantModificationOptions, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------------ | ------------------------------------------------------- | -------- | ---------------------------------------------------------------------- | +| `role` | [`Role`](../Capabilities/schemas/#Role) | true |
values: `'use' \| 'manage' \| 'provide'` | +| `capability` | [`Capability`](../Capabilities/schemas/#Capability) | true |
pattern: ^xrn:firebolt:capability:([a-z0-9\-]+)((:[a-z0-9\-]+)?)$ | +| `options` | [`GrantModificationOptions`](#grantmodificationoptions) | false | | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ------- | ------------------------------------ | +| manages | xrn:firebolt:capability:grants:state | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { UserGrants } from '@firebolt-js/manage-sdk' + +let result = await UserGrants.deny( + 'use', + 'xrn:firebolt:capability:localization:postal-code', + { appId: 'certapp' }, +) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "UserGrants.deny", + "params": { + "role": "use", + "capability": "xrn:firebolt:capability:localization:postal-code", + "options": { + "appId": "certapp" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### device + +Get all granted and denied user grants for the device + +```typescript +function device(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------ | +| uses | xrn:firebolt:capability:grants:state | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { UserGrants } from '@firebolt-js/manage-sdk' + +let info = await UserGrants.device() +console.log(info) +``` + +Value of `info`: + +```javascript +;[ + { + state: 'granted', + capability: 'xrn:firebolt:capability:localization:postal-code', + role: 'use', + lifespan: 'powerActive', + }, +] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "UserGrants.device", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "state": "granted", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "powerActive" + } + ] +} +``` + +
+ +--- + +### grant + +Grants a given capability to a specific app, if appropriate. Calling this results in a persisted active grant that lasts for the duration of the grant policy lifespan. + +```typescript +function grant( + role: Role, + capability: Capability, + options: GrantModificationOptions, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------------ | ------------------------------------------------------- | -------- | ---------------------------------------------------------------------- | +| `role` | [`Role`](../Capabilities/schemas/#Role) | true |
values: `'use' \| 'manage' \| 'provide'` | +| `capability` | [`Capability`](../Capabilities/schemas/#Capability) | true |
pattern: ^xrn:firebolt:capability:([a-z0-9\-]+)((:[a-z0-9\-]+)?)$ | +| `options` | [`GrantModificationOptions`](#grantmodificationoptions) | false | | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ------- | ------------------------------------ | +| manages | xrn:firebolt:capability:grants:state | + +#### Examples + +Default Example + +JavaScript: + +```javascript +import { UserGrants } from '@firebolt-js/manage-sdk' + +let result = await UserGrants.grant( + 'use', + 'xrn:firebolt:capability:localization:postal-code', + { appId: 'certapp' }, +) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "UserGrants.grant", + "params": { + "role": "use", + "capability": "xrn:firebolt:capability:localization:postal-code", + "options": { + "appId": "certapp" + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### request + +Requests Firebolt to carry out a set of user grants for a given application such that the user grant provider is notified or an existing user grant is reused. + +```typescript +function request( + appId: string, + permissions: Permission[], + options: RequestOptions, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------------- | ----------------------------------- | -------- | --------------- | +| `appId` | `string` | true | | +| `permissions` | `Permission[]` | true | | +| `options` | [`RequestOptions`](#requestoptions) | false | Request options | + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ------- | ------------------------------------ | +| manages | xrn:firebolt:capability:grants:state | + +#### Examples + +Default result #1 + +JavaScript: + +```javascript +import { UserGrants } from '@firebolt-js/manage-sdk' + +let info = await UserGrants.request( + 'certapp', + [ + { + role: 'use', + capability: 'xrn:firebolt:capability:localization:postal-code', + }, + ], + null, +) +console.log(info) +``` + +Value of `info`: + +```javascript +;[ + { + app: { + id: 'certapp', + title: 'Certification App', + }, + state: 'granted', + capability: 'xrn:firebolt:capability:localization:postal-code', + role: 'use', + lifespan: 'powerActive', + }, +] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "UserGrants.request", + "params": { + "appId": "certapp", + "permissions": [ + { + "role": "use", + "capability": "xrn:firebolt:capability:localization:postal-code" + } + ] + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "app": { + "id": "certapp", + "title": "Certification App" + }, + "state": "granted", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "powerActive" + } + ] +} +``` + +
+ +Default result #2 + +JavaScript: + +```javascript +import { UserGrants } from '@firebolt-js/manage-sdk' + +let info = await UserGrants.request( + 'certapp', + [ + { + role: 'use', + capability: 'xrn:firebolt:capability:localization:postal-code', + }, + ], + { + force: true, + }, +) +console.log(info) +``` + +Value of `info`: + +```javascript +;[ + { + app: { + id: 'certapp', + title: 'Certification App', + }, + state: 'granted', + capability: 'xrn:firebolt:capability:localization:postal-code', + role: 'use', + lifespan: 'powerActive', + }, +] +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "UserGrants.request", + "params": { + "appId": "certapp", + "permissions": [ + { + "role": "use", + "capability": "xrn:firebolt:capability:localization:postal-code" + } + ], + "options": { + "force": true + } + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": [ + { + "app": { + "id": "certapp", + "title": "Certification App" + }, + "state": "granted", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "powerActive" + } + ] +} +``` + +
+ +--- + +## Types + +### GrantState + +The state the grant is in + +```typescript +GrantState: { + GRANTED: 'granted', + DENIED: 'denied', +}, + +``` + +--- + +### GrantModificationOptions + +Options when modifying any grant + +```typescript +type GrantModificationOptions = { + appId?: string +} +``` + +--- + +### RequestOptions + +```typescript +type RequestOptions = { + force?: boolean // Whether to force for user grant even if the previous decision stored +} +``` + +--- + +### AppInfo + +Information about an app that a grant was for + +```typescript +type AppInfo = { + id: string + title?: string +} +``` + +--- + +### GrantInfo + +Information about a grant given by a user + +```typescript +type GrantInfo = { + app?: AppInfo // Information about an app that a grant was for + state: GrantState // The state the grant is in + capability: Capability // A Capability is a discrete unit of functionality that a Firebolt device might be able to perform. + role: Role // Role provides access level for the app for a given capability. + lifespan: 'once' | 'forever' | 'appActive' | 'powerActive' | 'seconds' + expires?: string +} +``` + +See also: + +[AppInfo](#appinfo) +[GrantState](#grantstate) +[Capability](../Capabilities/schemas/#Capability) +[Role](../Capabilities/schemas/#Role) + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/VoiceGuidance/index.md b/apis/pr-fix-ci-fb-version/manage/VoiceGuidance/index.md new file mode 100644 index 000000000..5ec117c70 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/VoiceGuidance/index.md @@ -0,0 +1,807 @@ +--- +title: VoiceGuidance + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# VoiceGuidance Module + +--- + +Version VoiceGuidance 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [enabled](#enabled) + - [listen](#listen) + - [once](#once) + - [speed](#speed) +- [Events](#events) + - [enabledChanged](#enabledchanged) + - [speedChanged](#speedchanged) +- [Types](#types) + +## Usage + +To use the VoiceGuidance module, you can import it into your project from the Firebolt SDK: + +```javascript +import { VoiceGuidance } from '@firebolt-js/manage-sdk' +``` + +## Overview + +A module for managing voice-guidance Settings. + +## Methods + +### enabled + +Whether or not voice-guidance is enabled. + +To get the value of `enabled` call the method like this: + +```typescript +function enabled(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:voiceguidance | + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { VoiceGuidance } from '@firebolt-js/manage-sdk' + +let enabled = await VoiceGuidance.enabled() +console.log(enabled) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "VoiceGuidance.enabled", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { VoiceGuidance } from '@firebolt-js/manage-sdk' + +let enabled = await VoiceGuidance.enabled() +console.log(enabled) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "VoiceGuidance.enabled", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +To set the value of `enabled` call the method like this: + +```typescript +function enabled(value: boolean): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------- | --------- | -------- | ----------- | +| `value` | `boolean` | true | | + +Promise resolution: + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { VoiceGuidance } from '@firebolt-js/manage-sdk' + +let result = await VoiceGuidance.enabled(true) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "VoiceGuidance.setEnabled", + "params": { + "value": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { VoiceGuidance } from '@firebolt-js/manage-sdk' + +let result = await VoiceGuidance.enabled(false) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "VoiceGuidance.setEnabled", + "params": { + "value": false + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function enabled(callback: (value) => boolean): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Default example #1 + +JavaScript: + +```javascript +import { VoiceGuidance } from '@firebolt-js/manage-sdk' + +let listenerId = await enabled((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "VoiceGuidance.onEnabledChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": true +} +``` + +
+ +Default example #2 + +JavaScript: + +```javascript +import { VoiceGuidance } from '@firebolt-js/manage-sdk' + +let listenerId = await enabled((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `enabled`: + +```javascript +true +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "VoiceGuidance.onEnabledChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": false +} +``` + +
+ +--- + +### listen + +To listen to a specific event pass the event name as the first parameter: + +```typescript +listen(event: string, callback: (data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ----------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `VoiceGuidance.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to all events from this module pass only a callback, without specifying an event name: + +```typescript +listen(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ----------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `VoiceGuidance.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### once + +To listen to a single instance of a specific event pass the event name as the first parameter: + +```typescript +once(event: string, callback: (data: any) => void): Promise +``` + +The `once` method will only pass the next instance of this event, and then dicard the listener you provided. + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------ | +| `event` | `string` | Yes | The event to listen for, see [Events](#events). | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. | + +Promise resolution: + +| Type | Description | +| -------- | ----------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `VoiceGuidance.clear(id)` | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------ | ----- | -------- | ------------------------------------------------------------------------------ | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: + +```typescript +once(callback: (event: string, data: any) => void): Promise +``` + +Parameters: + +| Param | Type | Required | Summary | +| ---------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------ | +| _callback_ | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](#events). | + +Callback parameters: + +| Param | Type | Required | Summary | +| ------- | -------- | -------- | ------------------------------------------------------------------------------ | +| `event` | `string` | Yes | The event that has occured listen for, see [Events](#events). | +| `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](#events). | + +Promise resolution: + +| Type | Description | +| -------- | ----------------------------------------------------------------------------------------------------- | +| `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `VoiceGuidance.clear(id)` | + +See [Listening for events](../../docs/listening-for-events/) for more information and examples. + +### speed + +The speed at which voice guidance speech will be read back to the user. + +To get the value of `speed` call the method like this: + +```typescript +function speed(): Promise +``` + +Promise resolution: + +[VoiceSpeed](../Accessibility/schemas/#VoiceSpeed) + +Capabilities: + +| Role | Capability | +| ---- | --------------------------------------------------- | +| uses | xrn:firebolt:capability:accessibility:voiceguidance | + +#### Examples + +Voice guidance speed to 1 + +JavaScript: + +```javascript +import { VoiceGuidance } from '@firebolt-js/manage-sdk' + +let speed = await VoiceGuidance.speed() +console.log(speed) +``` + +Value of `speed`: + +```javascript +1 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "VoiceGuidance.speed", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 1 +} +``` + +
+ +Voice guidance speed to 2 + +JavaScript: + +```javascript +import { VoiceGuidance } from '@firebolt-js/manage-sdk' + +let speed = await VoiceGuidance.speed() +console.log(speed) +``` + +Value of `speed`: + +```javascript +1 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "VoiceGuidance.speed", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 2 +} +``` + +
+ +--- + +To set the value of `speed` call the method like this: + +```typescript +function speed(value: VoiceSpeed): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ---------- | ---------------------------------------------------- | -------- | ----------------- | +| `value` | [`VoiceSpeed`](../Accessibility/schemas/#VoiceSpeed) | true |
minumum: 0.5 | +| maximum: 2 | + +Promise resolution: + +#### Examples + +Voice guidance speed to 1 + +JavaScript: + +```javascript +import { VoiceGuidance } from '@firebolt-js/manage-sdk' + +let result = await VoiceGuidance.speed(1) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "VoiceGuidance.setSpeed", + "params": { + "value": 1 + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +Voice guidance speed to 2 + +JavaScript: + +```javascript +import { VoiceGuidance } from '@firebolt-js/manage-sdk' + +let result = await VoiceGuidance.speed(2) +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "VoiceGuidance.setSpeed", + "params": { + "value": 2 + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +To subscribe to notifications when the value changes, call the method like this: + +```typescript +function speed(callback: (value) => VoiceSpeed): Promise +``` + +Promise resolution: + +``` +number +``` + +#### Examples + +Voice guidance speed to 1 + +JavaScript: + +```javascript +import { VoiceGuidance } from '@firebolt-js/manage-sdk' + +let listenerId = await speed((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `speed`: + +```javascript +1 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "VoiceGuidance.onSpeedChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 1 +} +``` + +
+ +Voice guidance speed to 2 + +JavaScript: + +```javascript +import { VoiceGuidance } from '@firebolt-js/manage-sdk' + +let listenerId = await speed((value) => { + console.log(value) +}) +console.log(listenerId) +``` + +Value of `speed`: + +```javascript +1 +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "VoiceGuidance.onSpeedChanged", + "params": { + "listen": true + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": 2 +} +``` + +
+ +--- + +## Events + +### enabledChanged + +See: [enabled](#enabled) + +### speedChanged + +See: [speed](#speed) + +## Types diff --git a/apis/pr-fix-ci-fb-version/manage/Wifi/index.md b/apis/pr-fix-ci-fb-version/manage/Wifi/index.md new file mode 100644 index 000000000..3b26b8c04 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/Wifi/index.md @@ -0,0 +1,551 @@ +--- +title: Wifi + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +# Wifi Module + +--- + +Version Wifi 1.5.0-fix-ci-fb-version.0 + +## Table of Contents + +- [Table of Contents](#table-of-contents) +- [Usage](#usage) +- [Overview](#overview) +- [Methods](#methods) + - [connect](#connect) + - [disconnect](#disconnect) + - [scan](#scan) + - [wps](#wps) +- [Types](#types) + - [WifiSecurityMode](#wifisecuritymode) + - [WPSSecurityPin](#wpssecuritypin) + - [WifiSignalStrength](#wifisignalstrength) + - [WifiFrequency](#wififrequency) + - [AccessPoint](#accesspoint) + - [AccessPointList](#accesspointlist) + +## Usage + +To use the Wifi module, you can import it into your project from the Firebolt SDK: + +```javascript +import { Wifi } from '@firebolt-js/manage-sdk' +``` + +## Overview + +A module for providing support for Wifi. + +## Methods + +### connect + +Connect the device to the specified SSID. + +```typescript +function connect( + ssid: string, + passphrase: string, + security: WifiSecurityMode, +): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------------ | --------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `ssid` | `string` | false | | +| `passphrase` | `string` | false | | +| `security` | [`WifiSecurityMode`](#wifisecuritymode) | false |
values: `'none' \| 'wep64' \| 'wep128' \| 'wpaPskTkip' \| 'wpaPskAes' \| 'wpa2PskTkip' \| 'wpa2PskAes' \| 'wpaEnterpriseTkip' \| 'wpaEnterpriseAes' \| 'wpa2EnterpriseTkip' \| 'wpa2EnterpriseAes' \| 'wpa2Psk' \| 'wpa2Enterprise' \| 'wpa3PskAes' \| 'wpa3Sae'` | + +Promise resolution: + +[AccessPoint](#accesspoint) + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:protocol:wifi | + +#### Examples + +Connect to a wpa2Psk Wifi with password + +JavaScript: + +```javascript +import { Wifi } from '@firebolt-js/manage-sdk' + +let connectedWifi = await Wifi.connect('DND', 'gargoyle', 'wpa2Psk') +console.log(connectedWifi) +``` + +Value of `connectedWifi`: + +```javascript +{ + "ssid": "DND", + "security": "wpa2Psk", + "signalStrength": -70, + "frequency": 2.4 +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Wifi.connect", + "params": { + "ssid": "DND", + "passphrase": "gargoyle", + "security": "wpa2Psk" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "ssid": "DND", + "security": "wpa2Psk", + "signalStrength": -70, + "frequency": 2.4 + } +} +``` + +
+ +Connect to a WPA2 PSK Wifi with password + +JavaScript: + +```javascript +import { Wifi } from '@firebolt-js/manage-sdk' + +let connectedWifi = await Wifi.connect('Guardian WIFI', '', 'none') +console.log(connectedWifi) +``` + +Value of `connectedWifi`: + +```javascript +{ + "ssid": "DND", + "security": "wpa2Psk", + "signalStrength": -70, + "frequency": 2.4 +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Wifi.connect", + "params": { + "ssid": "Guardian WIFI", + "passphrase": "", + "security": "none" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "ssid": "Guardian WIFI", + "security": "none", + "signalStrength": -70, + "frequency": 2.4 + } +} +``` + +
+ +--- + +### disconnect + +Disconnect the device if connected via WIFI. + +```typescript +function disconnect(): Promise +``` + +Promise resolution: + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:protocol:wifi | + +#### Examples + +Disconnect + +JavaScript: + +```javascript +import { Wifi } from '@firebolt-js/manage-sdk' + +let result = await Wifi.disconnect() +console.log(result) +``` + +Value of `result`: + +```javascript +null +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Wifi.disconnect", + "params": {} +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": null +} +``` + +
+ +--- + +### scan + +Scan available wifi networks in the location. + +```typescript +function scan(timeout: Timeout): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ------------- | -------------------------------------- | -------- | --------------- | +| `timeout` | [`Timeout`](../Types/schemas/#Timeout) | false |
minumum: 0 | +| maximum: 9999 | + +Promise resolution: + +[AccessPointList](#accesspointlist) + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:protocol:wifi | + +#### Examples + +Successful Wifi List + +JavaScript: + +```javascript +import { Wifi } from '@firebolt-js/manage-sdk' + +let list = await Wifi.scan(30) +console.log(list) +``` + +Value of `list`: + +```javascript +{ + "list": [ + { + "ssid": "DND", + "security": "wpa2Psk", + "signalStrength": -70, + "frequency": 2.4 + }, + { + "ssid": "Fortnite", + "security": "WPA2_ENTERPRISE_AES", + "signalStrength": -70, + "frequency": 5 + }, + { + "ssid": "Guardian", + "security": "none", + "signalStrength": -70, + "frequency": 2.4 + } + ] +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Wifi.scan", + "params": { + "timeout": 30 + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "list": [ + { + "ssid": "DND", + "security": "wpa2Psk", + "signalStrength": -70, + "frequency": 2.4 + }, + { + "ssid": "Fortnite", + "security": "WPA2_ENTERPRISE_AES", + "signalStrength": -70, + "frequency": 5 + }, + { + "ssid": "Guardian", + "security": "none", + "signalStrength": -70, + "frequency": 2.4 + } + ] + } +} +``` + +
+ +--- + +### wps + +Connect to WPS + +```typescript +function wps(security: WPSSecurityPin): Promise +``` + +Parameters: + +| Param | Type | Required | Description | +| ---------- | ----------------------------------- | -------- | --------------------------------------------------------- | +| `security` | [`WPSSecurityPin`](#wpssecuritypin) | false |
values: `'pushButton' \| 'pin' \| 'manufacturerPin'` | + +Promise resolution: + +[AccessPoint](#accesspoint) + +Capabilities: + +| Role | Capability | +| ---- | ------------------------------------- | +| uses | xrn:firebolt:capability:protocol:wifi | + +#### Examples + +Connect to a WPS Wifi router + +JavaScript: + +```javascript +import { Wifi } from '@firebolt-js/manage-sdk' + +let connectedWifi = await Wifi.wps('pushButton') +console.log(connectedWifi) +``` + +Value of `connectedWifi`: + +```javascript +{ + "ssid": "DND", + "security": "wpa2Psk", + "signalStrength": -70, + "frequency": 2.4 +} +``` + +
+JSON-RPC: +Request: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "method": "Wifi.wps", + "params": { + "security": "pushButton" + } +} +``` + +Response: + +```json +{ + "jsonrpc": "2.0", + "id": 1, + "result": { + "ssid": "DND", + "security": "wpa2Psk", + "signalStrength": -70, + "frequency": 2.4 + } +} +``` + +
+ +--- + +## Types + +### WifiSecurityMode + +Security Mode supported for Wifi + +```typescript +WifiSecurityMode: { + NONE: 'none', + WEP_64: 'wep64', + WEP_128: 'wep128', + WPA_PSK_TKIP: 'wpaPskTkip', + WPA_PSK_AES: 'wpaPskAes', + WPA_2PSK_TKIP: 'wpa2PskTkip', + WPA_2PSK_AES: 'wpa2PskAes', + WPA_ENTERPRISE_TKIP: 'wpaEnterpriseTkip', + WPA_ENTERPRISE_AES: 'wpaEnterpriseAes', + WPA_2ENTERPRISE_TKIP: 'wpa2EnterpriseTkip', + WPA_2ENTERPRISE_AES: 'wpa2EnterpriseAes', + WPA_2PSK: 'wpa2Psk', + WPA_2ENTERPRISE: 'wpa2Enterprise', + WPA_3PSK_AES: 'wpa3PskAes', + WPA_3SAE: 'wpa3Sae', +}, + +``` + +--- + +### WPSSecurityPin + +Security pin type for WPS(Wifi Protected Setup). + +```typescript +WPSSecurityPin: { + PUSH_BUTTON: 'pushButton', + PIN: 'pin', + MANUFACTURER_PIN: 'manufacturerPin', +}, + +``` + +--- + +### WifiSignalStrength + +Strength of Wifi signal, value is negative based on RSSI specification. + +```typescript + +``` + +--- + +### WifiFrequency + +Wifi Frequency in Ghz, example 2.4Ghz and 5Ghz. + +```typescript + +``` + +--- + +### AccessPoint + +Properties of a scanned wifi list item. + +```typescript +type AccessPoint = { + ssid?: string // Name of the wifi. + securityMode?: WifiSecurityMode // Security Mode supported for Wifi + signalStrength?: WifiSignalStrength // Strength of Wifi signal, value is negative based on RSSI specification. + frequency?: WifiFrequency // Wifi Frequency in Ghz, example 2.4Ghz and 5Ghz. +} +``` + +See also: + +[WifiSecurityMode](#wifisecuritymode) +[WifiSignalStrength](#wifisignalstrength) +[WifiFrequency](#wififrequency) + +--- + +### AccessPointList + +List of scanned Wifi networks available near the device. + +```typescript +type AccessPointList = { + list?: AccessPoint[] // Properties of a scanned wifi list item. +} +``` + +See also: + +[AccessPoint](#accesspoint) + +--- diff --git a/apis/pr-fix-ci-fb-version/manage/changelog.md b/apis/pr-fix-ci-fb-version/manage/changelog.md new file mode 100644 index 000000000..4474fff36 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/changelog.md @@ -0,0 +1,127 @@ +--- +title: Change Log + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- +# [1.4.0](https://github.com/rdkcentral/firebolt-apis/compare/v1.3.0...v1.4.0) (2024-23-09) + +# [1.3.0](https://github.com/rdkcentral/firebolt-apis/compare/v1.2.0...v1.3.0) (2024-08-12) + +# [1.2.0](https://github.com/rdkcentral/firebolt-apis/compare/v1.1.0...v1.2.0) (2024-06-14) + +# [1.1.0](https://github.com/rdkcentral/firebolt-apis/compare/v1.0.0...v1.1.0) (2024-02-09) + +### Bug Fixes + +* Modified account:uid to SHOULD ([#224](https://github.com/rdkcentral/firebolt-apis/issues/224)) ([70c8b24](https://github.com/rdkcentral/firebolt-apis/commit/70c8b24decfcbff2c32fb1b0d21290afc00a8432)) + +### Features + +* HDMI Low Latency Mode ([#156](https://github.com/rdkcentral/firebolt-apis/issues/156)) ([06d3624](https://github.com/rdkcentral/firebolt-apis/commit/06d3624b69ee0529d4c1a1c78a15dbfdf54c8b16)) + +# [1.0.0](https://github.com/rdkcentral/firebolt-apis/compare/v0.17.1...v1.0.0) (2023-11-03) + +Upgraded to 1.0 at part of RDK6 release. This API is still compatibile with 0.x versions. + +### Bug Fixes + + * Account.session params to be mandatory ([#196](https://github.com/rdkcentral/firebolt-apis/issues/196)) ([fc5c638](https://github.com/rdkcentral/firebolt-apis/commit/fc5c63886d9b4eb30b32c1edc75f0f6afe80a827)) + * CI looking for legacy 0.x version ([923d02a](https://github.com/rdkcentral/firebolt-apis/commit/923d02ae96716a5272c5507e864f366012824642)) + * Permission schema with Capability as required ([74d9de9](https://github.com/rdkcentral/firebolt-apis/commit/74d9de9b125baffb415e11ba3888c1c464cf5b12)) + * Provider error ([#202](https://github.com/rdkcentral/firebolt-apis/issues/202)) ([4666a5e](https://github.com/rdkcentral/firebolt-apis/commit/4666a5ee56846f14dd1ba79dab82891505b5a2ec)) + * schemas version upgraded to 2.0.0-next.1 ([#199](https://github.com/rdkcentral/firebolt-apis/issues/199)) ([b0fb8cf](https://github.com/rdkcentral/firebolt-apis/commit/b0fb8cfbda6bbef055000dc9911f344ab9ee8771)) + * Update schemas & 1.0.0 version! ([#200](https://github.com/rdkcentral/firebolt-apis/issues/200)) ([ea29f33](https://github.com/rdkcentral/firebolt-apis/commit/ea29f3323a22ffa36904bdc6cf6e76a31fa8cb76)) + * Updated metrics:distributor capability to could ([#185](https://github.com/rdkcentral/firebolt-apis/issues/185)) ([9ca2206](https://github.com/rdkcentral/firebolt-apis/commit/9ca2206a2dca7149dcf93df3d303806d136785ed)) + +### Features + +* Added optional parameter 'force' in usergrants.request ([#186](https://github.com/rdkcentral/firebolt-apis/issues/186)) ([31801ca](https://github.com/rdkcentral/firebolt-apis/commit/31801caec6bea0e8b295ea6a9ec54ca1d8e08d16)) + +# [0.17.1](https://github.com/rdkcentral/firebolt-apis/compare/v0.17.0...v0.17.1) (2023-09-15) + +### Bug Fixes + +fix: Add enumerated values for fontFamily/fontEdge (#181) + +# [0.17.0](https://github.com/rdkcentral/firebolt-apis/compare/v0.16.0...v0.17.0) (2023-09-07) + +### Bug Fixes + +* fix: Using 3 letter ISO639 language codes ([#173](https://github.com/rdkcentral/firebolt-apis/issues/173)) + +# [0.16.0](https://github.com/rdkcentral/firebolt-apis/compare/v0.15.0...v0.16.0) (2023-08-14) + +### Features + +* Added Manage APIs for `windlowColor` and `windowOpacity` ([#157](https://github.com/rdkcentral/firebolt-apis/issues/157)) ([f508358](https://github.com/rdkcentral/firebolt-apis/commit/f508358aeb2f58bb3893bbfaf09e2340fcadac8f)) + +# [0.15.0](https://github.com/rdkcentral/firebolt-apis/compare/v0.14.0...v0.15.0) (2023-07-31) + +### Bug Fixes + +* Rename Advisory "Committee" to "Board" ([#135](https://github.com/rdkcentral/firebolt-apis/issues/135)) ([ef410c4](https://github.com/rdkcentral/firebolt-apis/commit/ef410c43bbb32414c3aa1d11b43093565cc90edf)) +* window fix from firebolt-openrpc 2.0.3 ([8c06dd1](https://github.com/rdkcentral/firebolt-apis/commit/8c06dd1432822719f5634e2877b36efdf02a4809)) + +### Features + +* **Nullable CC Styles** Added support to set and get null in ClosedCaptions style fields ([#150](https://github.com/rdkcentral/firebolt-apis/issues/150)) ([9c511e4](https://github.com/rdkcentral/firebolt-apis/commit/9c511e4fddebcdf5dfc04e9e8e31f98ab7eef680)) +* **Window CC Styles** Added windowColor and windowOpacity to closedCaptions style ([#145](https://github.com/rdkcentral/firebolt-apis/issues/145)) ([f65b901](https://github.com/rdkcentral/firebolt-apis/commit/f65b9019bda22400df9b9634c332e720db38118d)) +* **Audio Descriptions** Audio Description and Preferred Audio Languages Settings ([#45](https://github.com/rdkcentral/firebolt-apis/issues/45)) ([58f6ea1](https://github.com/rdkcentral/firebolt-apis/commit/58f6ea1dde7a819883eb3da24f879b6a9ecc9a41)) + +# [0.14.0](https://github.com/rdkcentral/firebolt-apis/compare/v0.13.0...v0.14.0) (2023-06-22) + +### Bug Fixes + +* **Advertising:** put resetAdvertisingIdentifier back in manage sdk ([ce92ae7](https://github.com/rdkcentral/firebolt-apis/commit/ce92ae7bfff58fa1d3e4bee78c88d5edf0266473)) +* * **VoiceGuidance** Change voice guidance limits to 0.5 and 2 ([#137](https://github.com/rdkcentral/firebolt-apis/issues/137)) ([b8f1944](https://github.com/rdkcentral/firebolt-apis/commit/b8f19449efd808639599b162aba61c08ec089c41)) + +### Features + +* **Discovery** Add an event when apps call signIn or signOut ([#133](https://github.com/rdkcentral/firebolt-apis/issues/133)) ([8ba2515](https://github.com/rdkcentral/firebolt-apis/commit/8ba2515948c433ccc38662f223f5fb399cf34841)) + +# [0.13.0](https://github.com/rdkcentral/firebolt-apis/compare/v0.12.0...v0.13.0) (2023-06-09) + +### Bug Fixes + +* Grant providers should allow null responses for deferred challenges ([#128](https://github.com/rdkcentral/firebolt-apis/issues/128)) ([0ddd11a](https://github.com/rdkcentral/firebolt-apis/commit/0ddd11af282aed85112fb739993ae58cfc1c4910)) +* Point to `firebolt-openrpc` 2.0.1 ([c57cb21](https://github.com/rdkcentral/firebolt-apis/commit/c57cb218343fd058e2e6e676d52d9d0c904ad9a8)) +* Added Changelog note about accessory removal ([02e81c0](https://github.com/rdkcentral/firebolt-apis/commit/02e81c0f0233862e2d2386989943a840eddc5b6a)) + +### Features + +* Add SecureStorage.setForApp, removeForApp, .clearForApp methods. ([#127](https://github.com/rdkcentral/firebolt-apis/issues/127)) ([4422c79](https://github.com/rdkcentral/firebolt-apis/commit/4422c79122fc35e7b35180254be52bf33c64ab5b)) + +# [0.12.0](https://github.com/rdkcentral/firebolt-apis/compare/v0.11.0...v0.12.0) (2023-05-18) + +### Bug Fixes + +* Updated `Advertising.resetIdentifier` capability ([47e730c](https://github.com/rdkcentral/firebolt-core-sdk/commit/47e730c4572ca2b8b9fdc3b2062121ef802914aa)) +* Removed `Accessory` module, which was not finished or ready for release ([6bcbb3f](https://github.com/rdkcentral/firebolt-apis/commit/6bcbb3fa347cb412e0d973beb6ecff7fe966607a)) + +### Features + +* Add the `Advertising.skipRestriction` API and included in Manage SDK ([#122](https://github.com/rdkcentral/firebolt-core-sdk/issues/122)) ([da9d75f](https://github.com/rdkcentral/firebolt-core-sdk/commit/da9d75f8c29bf04674e3de692874888796665a9a)) + + +# [0.11.0](https://github.com/rdkcentral/firebolt-core-sdk/compare/v0.10.0...v0.11.0) (2023-05-01) + +This is the first release of the Firebolt Manage SDK, which is used by first party, or trusted, apps to manage a Firebolt device. + +### Features + +* Accessory module +* Account module +* AcknowledgeChallenge module +* Advertising module +* ClosedCaptions module +* Device module +* Keyboard module +* Localization module +* Metrics module +* PinChallenge module +* Privacy module +* UserGrants module +* VoiceGuidance module +* Wifi module diff --git a/apis/pr-fix-ci-fb-version/manage/index.md b/apis/pr-fix-ci-fb-version/manage/index.md new file mode 100644 index 000000000..fa8eb1ca8 --- /dev/null +++ b/apis/pr-fix-ci-fb-version/manage/index.md @@ -0,0 +1,30 @@ +--- +title: Firebolt Manage SDK + +version: pr-fix-ci-fb-version +layout: default +sdk: manage +--- + +[![semantic-release: conventional](https://img.shields.io/badge/semantic--release-conventional-e10079?logo=semantic-release)](https://github.com/semantic-release/semantic-release) + +# Firebolt Manage SDK +For building Firebolt compliant apps that manage Firebolt devices. + +## Usage +To install, run: + +``` +npm install @firebolt-js/manage-sdk +``` + +To use the package, import one of it's modules, e.g.: + +```js +import { Privacy } from '@firebolt-js/manage-sdk' +``` + +## Contributing +The Firebolt SDKs are built using the Firebolt OpenRPC toolset: + +See [Firebolt OpenRPC](https://www.github.com/rdkcentral/firebolt-openrpc/), for more info. diff --git a/requirements/pr-fix-ci-fb-version/glossary/index.md b/requirements/pr-fix-ci-fb-version/glossary/index.md new file mode 100644 index 000000000..6ad8cb661 --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/glossary/index.md @@ -0,0 +1,84 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: Glossary +category: requirements +--- +# Glossary + +Document Status: Working Draft + +| Contributor | Organization | +| -------------- | -------------- | +| Jeremy LaCivita | Comcast | + +## 1. Overview +This document describes various terms used as part of Firebolt APIs, e.g. method names or parameters, and how they are used by Firebolt, for consistency. + +The terms are this document are commonly used across multiple modules. However, new APIs should be deferential to all existing APIs, not just words listed here. + +The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**NOT RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in [BCP 14](https://www.rfc-editor.org/rfc/rfc2119.txt) [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here. + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. Firebolt Terms](#3-firebolt-terms) + - [3.1. app](#31-app) + - [3.2. available](#32-available) + - [3.3. availability](#33-availability) + - [3.4. capability](#34-capability) + - [3.5. closed captions](#35-closed-captions) + - [3.6. content](#36-content) + - [3.7. entitlement](#37-entitlement) + - [3.8. granted](#38-granted) + - [3.9. lifecycle](#39-lifecycle) + - [3.10. media](#310-media) + - [3.11. permitted](#311-permitted) + - [3.12. policy](#312-policy) + - [3.13. user grant](#313-user-grant) + - [3.14. supported](#314-supported) + +## 3. Firebolt Terms + +### 3.1. app +noun. - A Firebolt app. Any component that calls [Firebolt APIs](https://github.com/rdkcentral/firebolt-apis), either directly, or by running inside of a container that calls Firebolt APIs, is a Firebolt app. + +### 3.2. available +adj. - Used in the context of a [capability](#34-capability) to denote that the capability *could* be leveraged now if it is [permitted](#311-permitted) and either [granted](#38-granted) or is not gated by a [user grant](#313-user-grant). Available capabilities are, by definition, [supported](#314-supported). + +### 3.3. availability +noun. - Used in the context of [content](#36-content) to denote that the content *could* be consumed if either the device has an [entitlement](#37-entitlement) to the content, or the content does not require any entitlement. + +### 3.4. capability +noun. - A discrete unit of functionality that a Firebolt device might be able to perform. It is granular enough to enable appropriate access controls across all Firebolt Apps, but useful enough to be a meaningful functional unit that an App might care about. + +### 3.5. closed captions +noun. - Closed Captions are text tracks rendered over or near [content](#36-content) with the intention of making the audio track of the content more accessible, for example to deaf or hard-of-hearing individuals. + +### 3.6. content +noun. - Content consumed on Firebolt platforms, e.g. video, games, music, etc. + +### 3.7. entitlement +noun. - Used in the context of [content](#36-content) to denote that the device or user has acquired the *right* to consume the content. Content may also have [availability](#33-availability) requirements for consumption, e.g. a user may have pre-orded a piece of content, and therefor have an entitlement to it, that becomes available in the future. + +### 3.8. granted +adj. - Used in the context of a [capability](#34-capability) to denote that the capability has been granted to an app by the user. Capabilities that are gated by [user grant](#313-user-grant) cannot be leveraged by any app w/out being granted. + +### 3.9. lifecycle +noun. - Used to describe the life, from being loaded to unloaded, of a Firebolt [app](#31-app). The app lifecycle has many states that inform the app how it is being percieved and how it should behave. + +### 3.10. media +noun. - [Content](#36-content) that that plays back over time without requiring interaction from the user, e.g. video or music. Media must have a start-time, or a duration, or both. + +### 3.11. permitted +adj. - Used in the context of a [capability](#34-capability) to denote that the capability has been permitted to an app by the distributor of the device. + +### 3.12. policy +noun. - A group of user, device, and/or distributor settings that affect a particular domain, e.g. Advertising. + +### 3.13. user grant +noun. - A secure process in which a user of a device grants an app on the device access to a capability. + +### 3.14. supported +adj. - Used in the context of a [capability](#34-capability) to denote that the capability *could* be leveraged at some point on this device, because the distributor offers it as part of this device's feature set. Leveraging a capability also requires that it is [available](#32-available), [permitted](#311-permitted), and either [granted](#38-granted) or is not gated by a [user grant](#313-user-grant). diff --git a/requirements/pr-fix-ci-fb-version/governance/index.md b/requirements/pr-fix-ci-fb-version/governance/index.md new file mode 100644 index 000000000..ea85bec3d --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/governance/index.md @@ -0,0 +1,232 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: Requirements Governance +category: requirements +--- +# Requirements Governance +This document outlines the governance model for the Firebolt® Open-Source Project, including the structure of an Advisory Board and Working Groups, as well as the process used to codify Requirements Specifications and Architectural Decision Records. + +## 1. Overview +The Firebolt Open-Source Project is governed by an Advisory Board that creates and delegates work to Working Groups, which then create proposals for Requirements Specifications and Architectural Decision Records. + +![Governance Structure](../images/governance/structure.png) + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. Goals](#3-goals) +- [4. Governance](#4-governance) + - [4.1. Scope](#41-scope) + - [4.2. Firebolt Version](#42-firebolt-version) + - [4.3. Advisory Board](#43-advisory-board) + - [4.4. Advisory Board Members](#44-advisory-board-members) + - [4.5. Working Group](#45-working-group) + - [4.6. Requirements Specification](#46-requirements-specification) + - [4.7. Architectural Decision Record](#47-architectural-decision-record) + - [4.8. Approval Stages](#48-approval-stages) + - [4.8.1. Draft](#481-draft) + - [4.8.2. Working Draft](#482-working-draft) + - [4.8.3. Candidate Specification](#483-candidate-specification) + - [4.8.4. Candidate Specification Draft](#484-candidate-specification-draft) + - [4.8.5. Proposed Specification](#485-proposed-specification) + - [4.8.6. Specification](#486-specification) + - [4.9. Requirements Repository](#49-requirements-repository) + - [4.10. Requirements Repository Branching](#410-requirements-repository-branching) + - [4.11. Sanctioned Forks](#411-sanctioned-forks) + - [4.12. Release Versions](#412-release-versions) + +## 3. Goals +The goal of the Firebolt Open-Source Project is to provide a Distributor-configurable set of integration APIs and functional requirements for those APIs so that Apps can integrate with the APIs once and run their app on every Firebolt platform (regardless of distributor) consistently. + +Specifically, Firebolt provides: + + - Write Apps once, run on all Firebolt distributors + - Discovery and launching of Apps + - Detection of, and access control for, Firebolt APIs and features + - Discovery of app content and metrics once discovered + - Platform integration APIs, (e.g. captions, media info, etc.) + - Device and account management + - Integration APIs for broader eco-system integrations +(e.g. user experience, advertising, voice, etc.) + +While enabling Distributors to: + + - Provide differentiating Discovery and Settings experiences + - Configure Firebolt features to meet their business needs + - Configure Firebolt user privacy & opt-in settings + - Decide which set of optional Firebolt features to support + - Negotiate access to features and APIs with each app + +## 4. Governance +The Firebolt Open-Source Project is governed by an Advisory Board. The purpose of the Advisory Board is to ensure that each major, minor, and patch version of the Firebolt Requirements is aligned with the goals of the Firebolt Open-Source Project. + +The Firebolt Requirements are the collection of all Requirements Specifications and all Architectural Decision Records that are ratified by the Advisory Board (and contained in this repository). + +### 4.1. Scope +This document describes the governance model for the following components: + + - Firebolt RPC APIs & SDKs + - Firebolt Media Pipeline (aka Rialto) + - Firebolt API Reference Implementation (Ripple) + +### 4.2. Firebolt Version +A Firebolt Version is a snapshot of the Firebolt Requirements that has been ratified as an official release of the requirements. Note that the requirements are decoupled from any implementation of those requirements, and iterations to the requirements will occur with input from any teams implementing them. + +Firebolt Versions **MUST** follow Semantic Versioning. + +### 4.3. Advisory Board +The Advisory Board oversees all aspects of Firebolt Requirements Governance. + +Advisory Board decisions should aim to be unanimous whenever possible, but in cases of deadlock, may be decided by simple majority. + +The Advisory Board is responsible for: + + - Prioritization of Working Groups needed + - Creation of balanced Working Groups with relevant subject matter experts + - Solicitation of peer review by SMEs that are not from the working group + - Ratification of requirements into the official Firebolt Requirements + - Determination of when to tag a new minor version release of the Firebolt Requirements + - Determination of when to tag a new major version release of the Firebolt Requirements + - Determination of when a sanctioned fork is warranted + +### 4.4. Advisory Board Members +The Firebolt Advisory Board is currently being formed and will be published soon. + +Contact the `rdkcentral/firebolt-apis` maintainer, [Jeremy LaCivita](https://github.com/jlacivita), to submit proposals to the Advisory Board. + +### 4.5. Working Group +Working Groups build consensus on requirements for Firebolt features or architectural solutions. They should ideally be three to five individuals spanning technical and product experts. Further recommendations on working group composition are left to the Advisory Board. + +As new features are prioritized, Working Groups should be formed to gather and document requirements for those features. Working groups may be self-forming or selected by the Advisory Board, but all working groups must have their membership reviewed and approved by the board to ensure that they are well balanced. + +The Advisory Board **MAY** appoint a Working Group Chair or instruct the Working Group to select a chair amongst themselves. + +The Working Group Chair is responsible for driving consensus and reporting back to the Advisory Board + +### 4.6. Requirements Specification +A Requirements Specification includes all details necessary for multiple, disassociated teams to build a consistent implementation of a feature, including API signatures, validation, and functionality, as well as functional and behavioral requirements of the feature that are not directly exposed by an API. + +Requirements and APIs may be targeted towards traditional 3rd party apps, as well as more foundational 1st party apps. + +The level of detail in an acceptable Requirements Specification should be such that any App should run consistently on any implementation of the feature that is based on the Specification. + +Requirements Specifications are written using the [IETF Best Common Practice 14](https://www.rfc-editor.org/rfc/rfc2119.txt) and should include the following at the end of the Overview: + +The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**NOT RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in [BCP 14](https://www.rfc-editor.org/rfc/rfc2119.txt) [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here. + +Requirements Specification move through several [stages](#48-approval-stages) from being a draft, to being an official versioned requirements specification. + +### 4.7. Architectural Decision Record +An Architectural Decision Record includes all details necessary to ensure that Firebolt Requirements are fulfilled with an architecturally sound design. This is often used in cases where listing out explicit requirements, e.g. performance or operational requirements, is not possible or realistic, e.g. Requiring use of a well-known open source component to fulfill some aspect of the platform, or requiring adherence to a high level modular breakdown of concerns to keep platform maintenance manageable. + +Since ADRs included in the Firebolt Requirements **MUST** be adhered to, not every architectural decision made in order to fulfill the Firebolt Requirements needs to have a formal ADR in the Firebolt Requirements repository. It is up to the Advisory Board which ADRs warrent a formal inclusion in the Firebolt Requirements. + +ADRs move through the same [stages](#48-approval-stages) as Requirements Specifications. + +### 4.8. Approval Stages +Requirements specifications and ADRs are written by working groups and go through several stages of approval before becoming official requirements documents. + +![Approval Track](../images/governance/approval-track.png) + +#### 4.8.1. Draft +This is any first draft of a requirements specification submitted by an individual or individuals to a Working Group. + +Artifacts: + + - A markdown document, ready to be presented to the Working Group + +Note that a Draft **MUST** not be committed to any public location, e.g. the Requirements Repository, because it has not yet been reviewed by the Working Group and could mistakenly contain sensative, private information related to a specific Firebolt distributor. + +#### 4.8.2. Working Draft +A version of the requirements specification that is approved by the Working Group for feedback and review by individuals not on the Working Group. Individuals are selected for review at the discretion of the Working Group. Working drafts may or may not satisfy all requirements of the feature and should not be used for derivative works. + +Artifacts: + + - Markdown specification in a named feature branch of the Requirements Repository + - Working Group members identified + - Working Group progress is being tracked via GitHub project in the Requirements Repository + +#### 4.8.3. Candidate Specification +A version of the requirements specification that is approved by the Working Group for proof-of-concept implementations and peer-review by the larger Community. Candidate Specifications have been through significant review by the Working Group and are ready for feedback from the larger community. + +Once this is published to the peer group for review, they’ll have two weeks to add their comments, make amendments requests, etc. + +Artifacts: + + - Markdown specification in a named feature branch of the Requirements Repository + - Domain experts for peer-review identified and notified + - Repeat process for any C.S. Drafts that are formalized into the C.S. (see below) + - JSON-Schema API changes outlined by the document are in the OpenRPC schemas + +#### 4.8.4. Candidate Specification Draft +A fork of the current Candidate Specification that has changes requested, but not yet approved, by the Working Group. + +Artifacts: + + - A Pull Request into the feature branch containing in-progress changes + - Previous Candidate Specification does not include changes until approved by W.G. + +#### 4.8.5. Proposed Specification +A version of the requirements specification that is considered, by the Working Group, to be the final Candidate Specification, and has been submitted to the Advisory Board for final approval. This version may be used for experimental implementations and final peer-review by the larger community. + +Artifacts: + + - Markdown specification merged into the #proposed branch of the Requirements Repository + - A Pull Request into the #next branch of Requirements Repository + - JSON-Schema API changes outlined by the document are in the OpenRPC schemas + - Unit tests for any API changes + +#### 4.8.6. Specification +An official versioned stage of the requirements specification that is done and will not change until a future version is created. This version may be used for official production implementations. + +Artifacts: + + - Markdown specification merged into the #main branch of the Requirements Repository + - Spec Review notes and green light from implementation teams of all member organizations with a vested interest in the specification + - Status tracking link for any Open Source implementations of the spec, if appropriate + +### 4.9. Requirements Repository +A public GitHub repository used to manage the progress of a requirements specification. Requirements Specification **MUST** live in their own repository, and not along side of the code that is implementing them. + +The Requirements Repository **MUST** be located at: + +[https://github.com/rdkcentral/firebolt-apis](https://github.com/rdkcentral/firebolt-apis) + +### 4.10. Requirements Repository Branching +The Requirements Repository **MUST** have the following branches: + +| Branch | Purpose | +| ------ | ------- | +| main | For officially approved specifications that have been released under a version. | +| next | For all approved specifications, even those that have not been released under a version. | +| proposed | An experimental branch containing all proposed specifications. | + +Working Drafts and Candidate Specification Drafts **MUST** be housed in a named feature branch in the Requirements Repository (see below). + +Branches are merged based on the approval process: + +![Branching](../images/governance/branching.png) + +### 4.11. Sanctioned Forks +From time to time an organization with access to the Requirements Repository may want to spearhead a new feature without going through the formal approval process. + +In this case the member may submit a request to the Approval Board for a sanctioned fork inside the Requirements Repository, so that research and development can be done on the feature. + +The Approval Board **MAY** grant or deny the request for a sanctioned fork. + +After the R&D is complete, the forking organization **MUST** submit the resulting requirements to the formal process and work to have them approved. + +The organization requesting the fork **MUST** be willing to migrate to the approved APIs, which may be different than the API in the fork. + +The Advisory Board, and selected Working Group, **SHOULD** be willing to avoid unnecessary changes to make migration as easy as possible, without sacrificing the integrity of the Firebolt Open-Source Project’s goals. + +### 4.12. Release Versions +The Advisory Board has ownership of when to do major, minor, and patch releases of the Firebolt Requirements. + +Releases **MUST** follow Semantic Versioning. + +Approved changes are all housed in the next branch until the Advisory Board decides that the next branch warrants an officially released version of the requirements. + +If a feature that requires a major version increment, i.e. a breaking change, is proposed, the Advisory Board may decide to keep it unapproved so that any features requiring a minor version change can be pushed through the process. Management of this is the responsibility of the Advisory Board. diff --git a/requirements/pr-fix-ci-fb-version/images/governance/approval-track.png b/requirements/pr-fix-ci-fb-version/images/governance/approval-track.png new file mode 100644 index 0000000000000000000000000000000000000000..696954781e27acd2840f9fb98062e98097106e3d GIT binary patch literal 367150 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
c#~JI@Rfxz1BZlPKuZb%gb?5ApX<2zTY00nz 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%0A0h1A5y%r}i~qKO?#(|{ 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�S@2@KnZw7o-3 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 LZpUaxF8us&dkc-% literal 0 HcmV?d00001 diff --git a/requirements/pr-fix-ci-fb-version/images/governance/structure.png b/requirements/pr-fix-ci-fb-version/images/governance/structure.png new file mode 100644 index 0000000000000000000000000000000000000000..32bb2763aa69bd02109a6c741d731d78c146fbf9 GIT binary patch literal 329869 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�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 Hq=co?^A->@1%5Z!cXUF&0Y0`hEPcRyLEAC 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

b9DkO3ybCu!JEM>Buo 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 BQ#Akp literal 0 HcmV?d00001 diff --git a/requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/image1.png b/requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..049fc70bfc801a22ca4f9f290982cfaa7af30e49 GIT binary patch literal 14067 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 literal 0 HcmV?d00001 diff --git a/requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/image2.png b/requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/image2.png new file mode 100644 index 0000000000000000000000000000000000000000..7c0c10f7c9b0eeca22d2fc67a1f42f2ab1d1102a GIT binary patch literal 15714 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 literal 0 HcmV?d00001 diff --git a/requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/image4.png b/requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/image4.png new file mode 100644 index 0000000000000000000000000000000000000000..641c268472ba949afca8d0a585f0dd8bbd3632d6 GIT binary patch literal 22598 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 t)yP7{yrGO;fVFW{XPBA7Xg^5fM;>j z>zi*5#{@K}j3ph_6QiZSCq2e>)OoQw_%VRicNF+_T*oFRxAPAI&Z50$)9WzH_R36T2&=Xlmlndjp=& zA~8z$et_EOEL#W%shFS$W|6b5jhaoIa1Wv($pu=0_{<3Ah)?FPxmjbQwOpI?_#%p+ zVtmaVlhWU>pfuH|A47leOiV%KUB27r zlQ4Mu|N9U4EK}Yb+GWt@@^3yomY;FQopG1Fa6T5^p+4}Rf{~$-(Y^zQ`wUIaA27E# uaM0r5fjx$X7KVmj7OznMr$R9Ha)592|6L)oq+e-8TPKg7wXHhp8UG(p_rHSx literal 0 HcmV?d00001 diff --git a/requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/user-grants/image3.png b/requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/user-grants/image3.png new file mode 100644 index 0000000000000000000000000000000000000000..96d73b0ab490f6e8ea76136d11c964cd25493021 GIT binary patch literal 29394 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

+&C%v+v_F=#xuCtivh8T&v?8lsg$Nh{&+?sN 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 BU5fw! literal 0 HcmV?d00001 diff --git a/requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/user-grants/image5.png b/requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/user-grants/image5.png new file mode 100644 index 0000000000000000000000000000000000000000..26c583d2d3d7b8f2bec9c3dd9dfeafeb76af3c00 GIT binary patch literal 25027 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 literal 0 HcmV?d00001 diff --git a/requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/user-grants/image6.png b/requirements/pr-fix-ci-fb-version/images/specifications/general/capabilities/user-grants/image6.png new file mode 100644 index 0000000000000000000000000000000000000000..4761e5ea43f86552bea08db32369004b4e99a139 GIT binary patch literal 32865 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 Orx$chbjr1^-2N|1(hz(A literal 0 HcmV?d00001 diff --git a/requirements/pr-fix-ci-fb-version/images/specifications/intents/user-interest/media/image1.png b/requirements/pr-fix-ci-fb-version/images/specifications/intents/user-interest/media/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..b0171a9a4ca0e95d45314ce3ce84ff6669623e19 GIT binary patch literal 14294 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 literal 0 HcmV?d00001 diff --git a/requirements/pr-fix-ci-fb-version/images/specifications/intents/user-interest/media/image2.png b/requirements/pr-fix-ci-fb-version/images/specifications/intents/user-interest/media/image2.png new file mode 100644 index 0000000000000000000000000000000000000000..94102a60fa1d79eab4760418b07643dae07bd5b0 GIT binary patch literal 14615 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 literal 0 HcmV?d00001 diff --git a/requirements/pr-fix-ci-fb-version/images/specifications/intents/user-interest/media/image4.png b/requirements/pr-fix-ci-fb-version/images/specifications/intents/user-interest/media/image4.png new file mode 100644 index 0000000000000000000000000000000000000000..6a15fe0c612806675309696195d47143ed946315 GIT binary patch literal 15496 zcmch;cQo9=_b`kQM1rVE)K#OmAXZ<&B1-gCB4KqRdT+5L`s&e%-evWkM8YC^T_qA0 zVHeRm&q}`E-*cXGp7*?ez3-mme9pad+uWJCGxyGj)X`GCbL+t^JUqNRYTzfjcz8G9 zcz6U{BsXvvDzB7&+=tLsQBx5Q?_)gK`AZ@k%xVSJ)x^W|r=c&H()z#JU@$u5qQcq9M$jHdX#>V;id24H{xw*NY zpWnN8?^07!!^0yI5)&PqoK{wU@9rJ+_VzhDJNx+fZvWYxo|!EuDCp?yTKu`x)YNo% zc(}5%A|@ubwY9arft{V5A08f#j*eDQQ7J7gH8L`?x3}Nk-l?vsJv%#_o14qX$jHzC zkd&O#-QBIPudk%6JTf}g+SdN92MM*YSz2E4^zz!-*+HRDt82f%_4WsaMFJJnU%C6u zFD%9-zCSxZFD)ytsj1P>HO1&0@wR64x&-oR{rtZ$y3UyO`RT0*ayzO)-1pGwQjYwzmT(1F-nU3s})y|TYT z_FQG8UO_Fcf_$(3Y+p@|U%h>E)z)&g^y{j&>Z&OJ3LbM+QF_u)cQP_^6d8VwUirQ7 zMP#eln`)<; zb8Sg`|oRN=UnR!fX-0$^`wBD=6rsj81(Q6x< zvp>+IQwu{Ab4x4he|Gk!=YL@~|NLD3y|cT&@*A^`*;@FuI)Pf;+}`<<>3a`1;qWar zRG;9zBVq#M0MgfBh&vwMz0B)Bd^OLoWE_&%Lrqhec$Jj=F0rV;hgu*Wo)m}L6GeTW z+0E=oE9&Wv?YHJPUy@N$)>_`BBeU#nBT#(#mj7{kL!Wa}u{f!hab2TYhQ#LJs?#H_ zj3WEgDTx){5d_gJGNQ;Z8OaWz;d>a+*i-+!x~}=rKYx*>n>IqyK%bzKmCOo z*ZZhdLR$ILt#6nh0+e|V>-jaFqe61{O;Ff(NnfH0Q|{RH^PZ-Z81<$bn!t)k`4~o$ ziXK7dM0afNkj^zkQyEC)@d%Vnv^v#=z4~0qy&<5cf6dRmcz9~_HjB`(M3*5^A4f9) z9_i_#>VrxY>k6pxGK|nXs2?PMe1BfCKcNtTuQ@7Z=P8K8W``NB{SOEqD%Q-DFm0O6 z^rQn4R}ER;80%Yc+nlP>90Zd6qg+=2PbyZpqe49TNqtN9LZmT)y(%M8cFTH=aRG9R z&x~*_0iahcj*f!Uh*}+8WU|3S>Xf#|Ctl7^7vg7MTR`54nQ{F-LBbjN>KtI zSbNfW+c#kem)5s3ttpb0YO*cSq%8)h`gZ|kKp3rNm zL`CX8*H~NDmtCLIYCm4gv`;z(HSnU_4KJ+vq_`VA+^v*z#^hE})B}5(uG-=-NM1mF!15Q8q11T8JmjTp z?|PYkvvjq4sL3pFIC^#i9b};@Ir^fuHYA>us$P6xN=>@W{IDglt|(Z&6}YZOzEj89 z<3({N;jHk1wLGvjTDD&4y-=d)!7eDF#F&&=bOB9yI7Kw&roD#B9GUxONgwz@r!cs- zHM}Aat?AeHmK91^%O&kKO3r@4qvF;mOzd4R+zgja$qx4b5Zk#ogq@Fn+a5p0Y&T>^ zJUX zLbk*u;t5WcnU;p;;B_QLzz1#lSaenl3QGCBo#)hv-MoN&%DjcGb#OswhQVWwEk7rK z8WO@T%Lep)aVTztRP<7pooYF(OIj*XFB*{6nxt`q%c~k}2zW)_I8jJ_$U&Rf;RgS) zy~!#Lt$`?wEvjfso~1EP{yLW-K|xL2JdiyzE!KP$1d>fIAL`;f0zAc1JQ-T*iaG+_ zzrzYeB#=t}NIJw!0?+<##ye8A*?>S<-3p`%4Eu9j%p9lrkKO>;x-k(-8omyehH-Fb z4||VANL8KN4bBMUuny`NBA@F{j(I=8VxLAosDHSj>1XD`eRc4zysl|6D3}EG)azqp zPg~P&&WDfTu|-?0(Swh51-5@oekmXFA>{#8bt9_YQ{Rv=Zyz-jUb}z#ead_s#!piA z{ZPE)^Tc;DKown?9`cPnU8cjP&7C(Ot(e=9Ag@*8TSTLbzuibsn?Bw3c0=QB9k|Ig z?;Jaiomp>hOV`hw`?l%7GzDd%X}yEU0DWa6JHj_bD)OCY@5;#o;`Lxhh252mIVc+_keeh<@$t5MC#p&0q^WvAS&GyVY8}+sR z(x~^2WK5XI6!-)}F(You`H(W&rik^+LggdIUq3hi>n(KaEydqj4j~eEMD>9Difv8+ zU+;0olDo1mE6N$DTt-ooj&c|p#Po^iB}46b1pHZE$AZ*K*SPQYke8=bg+yXF)=kB1 zmL_qMfT`vjP2Olq3`@H#;wzR= zT*19Yo!ByAdhY>cu)&N*lycoTGNU}u$uMzHdQ5VwZ|y|LPFQ|o@akUekO2#TX9YOHJ#J_$3Ne1FtN{L$z*|^Ai=2BYYlf6#o>|udK=U)-R(#bsz|gskKom1K z9di}Kj0uipI-l5P1I%+WWdO+}7a3{NMRTObDDtCqt( z`rEoahqDxs-n3*gZYLyHI>8?+v{#9YJ;@+1vgMCjbd_(O0vW{))8jfr$tx&k6yp%4 zs1p!ScH~!cruV}+DIM&GW$|pwNOa9Zn$CL|^Hk0y_Kjh#C{zE@C`-<$k*D>Ij1Oi=Pz;Rb#^*|inwZ<^ ziFVMSe#4F@Ty7=J5&mMz+0cI_+-G$7ou|Y%%HL8Ft^oa&=Tlu>zRe zS8Uu)XP-5CRoE_;G-K$E)Qeex;BWjmD_9HHJfgpS(Cdyk7ob%v-)4j%KU52V&S zlgP{Rrx$`CphPDwM~IbQferzNN7eGzd$>;jhXn>*EyL<&$wKX^>uo*rCAP&yJE_3X zh)%#feRmvT3Ax8o?LM+$Ceb}(%A2yaIF0=|8NZ^zPdr|6f9k>jpr7=2yBCY0vbqYj zA+ELIhYYNkb`%eu5+E=Xjk~H80=gF`e`(mo(JyV#FZC0tAoE|^rQIH3E~uthmbC<* z1>F2gP$2V%)pPgHjlnp}K;wSC-bRFlk{7$4TgoiJC_7BzD`I8O*S;cwke6ZYQ;;S4 zht1oMg8cGdJ=zPF=yygGC6>zTxzp_cdxCUsn~^E!4-8RHnYmPcOk=@QVJl8fo|=<2 z9|SbXA#KLLARH#htmyDUzDJtK8@*};v^S)wjI~tVP39Z|=phoTZc8nRPO+sGht9C?dJsG(W&=?&19P|BgCbjC6TlZ7Vnu1J!UimI1>HVMo_p(z|H zo#-*fWtX!sOi`5W4*@oLL)*aQp7j1qnucB;)ku2Le19vOh?(c_L1RPse)&@`x`gLD zdZDt`b@v5R;v}WBtcERTgKv*KUl|EP-%_?E0A$~eQVwlB=GE`);IG+|oU@8lK3Lcwfr1XazNSK$yY03jRqz#TQ3|(#*{Z(Pk23@1lr^}w+R-=Yf5^6GL*U^9z9m(=D!*f0yrH6 zFTw3_y7|cZ(h1|-k3XFv4|loGzT(ai$}^e(X?M#^SWr-2Lo9(yo!5I>0pGTqH!Ubq zmli{Y*-&^CMAs-RCDFi883b;ETW(tVYcP3fV3n5Ue|+ryI9bHQF;^WYx0qc=7iqJg z)aj7j(ZLZWF!?lIYpuM-o)|C*;zLe)_Apejc~?A6|4IgVbT<>S!bE1!a)iKokYWE! z(jbP#s_dP=r8UB^ALSPsdZ7(3nMle~7d(yNFwe4yo3z|XK7fw+JH9Y}V^wn84mEJ1 zbuqLSeOPQ{`7&SB)P|^EJp}H6f~yx{$eYE{8qX4#@Bj<%Hf69}e3@O8nS&W&vIM<; z=3YsYE%`>HSVph4d4^9WLKHM4l)5|v7)Hw#nZk!fw4l~?D!u!aq!8h`_i=KC1{Q3K2?~{N-+QC)i<}L0`acsunQQbDl{2> zMsYkxeu%wi#YAP2(a~Nl=Psl%d>9u5APZPZ*iu$#%YP1lD9;TZhGFlvsT|Tp{2mRX zMA%nq7R8BEx;i@)vr!8bI=(M{NTad$>%rRd)Jm7%KYok~6*lA-X3s3sByK;3Q~OCD zy{~NT6ou*c?W*(`^EhzHu@)*JgY??9ejIviS@%`c;;&sRJ?Yt;5T2UcC$+b(LFBVJ zmb}U7Y#p$<0ieGbn;4Sj+YG6Keyeyw26^4Rwbxo6zcQAB8W?Nou=??1a&*=rk#WHs zOHcbFq{X7xGfZ~D+2w=U(R*x-Cq5lc^_YHnLq1&k1C&d26f^}ImE#cYzZTt-cslO! zm>~r^tcc`QKoa5sl*mj-NF8qc{jRTssxtq0%egVHfE;;42Wovez-vXsOhGAHpEud! zB=I>MEoV6imb?>>V1~gxZ{jknI#PZP*+0Kz-+tsu&5S4@+=Czd2aR@ZT>ljLOO_i% zcKEoqbo6QVl)gjR`S{<=EmQLaVANPZTgk{`2U7zdFfqE0?wNU@vE{=}*?_CSdp4fq zBL{uwx2%b53;u?FT;mpBy39S3%HB5%v7B|qla;^n|Jy=d#}nT%qccXf`GmRZOv4vE z%4_sDn%9-7B8h#KBULJ*Q_3b1TDy`9jP**k{&weJA5a$gcGTvewmv~zW-Ll#{y(1HH=cNqUz>gdz^S0>Nuo+nZ!-Ny z$><@F`fo;zQa}>b*>M_RyT*f{g9+JTJfHiO|EEusZu$JrHHf4S<);#YO)G|jpzFsD z8^L4t$O#kLwo&_kmVg8){Z0%V%rouh68i0{P_b2CP!e9HZ-{Qx|3@`_&#m$)#UH-t z&CxL0WEpi&nyOiTY5mVP6aH&7*_$EnnKY&9mqQKArrT#!%qDe1vRm%@vHzPQ^mJxp zM2PREvk3*WXH0V=)3QXdp>*qe@A`6K-GBb1bi*GxEa$e}0yr`@cpfCgGDtF;WlOLa zuT?*u)4x~tcfK%?pdPpBt+*L)3uBZdRRb^q!t9(D`~M~ru2FbEH^r@gPNLXcw2|4& z;;`0m9kTjgJ7YmLJEiUIlSEC(b={hdbtvoO`6d!}Izkl50E*Uh2{$pV zH|fBK@S+tn17`adAoF zyQ^#fjzA)X zUX<&9u<}~)0nz|Av#TT4d;0vVV!fCJnY8{qSiR#sY7)ync6b^Bj}hbiAuc2B_iDfL zeNKN|Z0s#f?d;%lr2EkO7a+fo_r zJweXB&3z(2|77`r$3jm2tsZe5zXR3@M3R{df%e*>ZQ+dUDK2X5)bfc3fRjPnCwjhx z9{K$oo}K^-{kcD*>>RWSuW|!^HdBhFkEnsA)bQ!XdLRb3PO$D0!$vw7qHdp$QNF`T zX|pcHTHvjF>v}mX3@r+>18^4Gp`0#-l?Oa2L$RYan%)17e=Ky8Bg9PaIUEhZ(>H~L9 zzdJypeM@O}m3!CPf4XnBtUX7B2Q-K@9z#(iC5X1D?5r6vM@nYDP zyR$7a-JbUaWCxuG5Cvi-zuynqtrJvft8v;jNU1qX^WL)p$qjbMIL6f=f?FEtjT-E{_d{#Jf=uu+3*s&2|Bjd)>S*d=flE{v=X4v3l=Mkg6^)Au9YF75&Dj zz4#)Ftk1WvlmoqoW(?LU*Xy3FPm$epb&FZ-_;fC#WCmy`@}+6<)%B6?kp&LSRzCem z_GO(+3m_|ww!d6mfysPxn6fpNMU}#DF5EwPa#C^*8r%5j7Mnqm41L{aVy5~Lt~Cg@ zK0eo|X+Pxk+-so^wz*f6(4Q~~7wYVp;A{&1Y=NxMtjGww{FoaVrP~NEba^b{r7{t7 zSdUf{>9@LNug#YsFj)76^GvFO{x?R+hL^0*VMgx*H%=$_?@r_jvE~4Y+F2Hb#Bc;j z?V}Wj6hSmljf@!fkYiJ@Q$c>OWH_@5Meoa^n>E0P?y^;`vYXB+96jBQu2zK}0hAXL z<^%m=+%xpw3_WmrB9lYQoXvikZQG$ z!c)?Ov_`i0DR_xK)6+*iCP!DxG!Us*0;{>bHEQpM9>e5jm7%QxVAz@;aH24zSCr(1X_jdSe{{%btFm<<_gwU?3wg47d@X}V zvZpqJp{fE+fk3>RdQ4&uZ~*TvbKhhT67MHDk@5Xg)SDyjGcakO+ZC)BXdYL495&$ z?*x6&1p_~+!+?Pik{2pSc9c7Il?d2zoZS47!-~|mU!75YK+IEchB|Txy_@t3fND;# zYer$Q(o3*sNNF3MtI zYIuJ7y{|-tQ7blf79OUY!FyFXjuuHB;C*FNy4g_u2=Xa!D73q1?AI^i$hgYQjqlb> z5{Xf7?2!tC?-ibCfPs~JiEZ7-{Jy`Hfp<>aPe3Z6*zhsbgSY%IX1gD|noUf`k3_k- ztT*4YVA6VxAcuL7p0vNbbwXVN7pk**E*3LA&t5K6+rP6GA@)p_9iT0%C#zASi^|eh zyUi+d{O3o<*;`23PUx?fnC4%V?16mq~F;V$@u9?+|< zoy%C^J3){*pm?8^;~O7Z+b$}Eha|D!hyV~2fzF)4*R1m@M|pxyDwVQ>jb#B*egd&j;I4|zJ!bI-lo z=T{0VF$l~+0ukb)T|uZry4iI>H*bPw6_9>X9M%{p1%{)_jR;Uc0ZSgxwfAqBWlV1H zl7hv^QR<2o4rZv=q&1~|Qo@Y$Ks3^nkiT&!QFj-0q9b)FNs{}4tc6Zn&I#34(aGX# ztWd@f_!y+qvPhrFsM=U?{W~jkKNPNR%teuIO9Wu2fIX$86g|ZyF8J5l{@($Byj}2l zcX;XH@1#Y4(4P)&iy96|SbZqmB%jSL_dKl!dj3l&80%lda=vjO`bG)Y$ue5?H-|eG zQ!dM0?UzrAn$A8SUDARK2|*6wAM!3nF$e3%HC=w~r)RP!N+b|w9DVEezO;YMC4#D+ zH~c*7^tcc9b6n{6%n(DA92rg@kz(e>rjKT4aupN_x{RY+nx>}Czeft7hMngHVzOuD zsDdiw>?TRq4-)R3FgT#+)aCBr*iIA&RtY+f%OBJah+nqs<{5B8Q!o2Yu*;;96G&H1 z6%djTAZus8whl=%auZGv!Xree|Elkoih3>_*KLs3 zNT(VI;YHLp>upg^ZbA#{R0}*W*CjoH6*{p4pl@^lP&^iHIj&wDHxX#pBc%VEuI06B zC=tvKCyzyT{DFXzqIpua>xwFrsdl}$rh@*dViexr>HhfABLtyx8T#NPf9XHYSM2Ll zEnx|ZVI9!A8*=UUn}xbS1!eXXYc|E}g%b8z)I;dz-ZQWNh@hMt!%t?wIg}7~8`L3} zxI0SPceL^pjO!pi;KolgCf0{kdW5XdHzDwbvTSmlDKO5UxS0PKq$!st7o=Ac|34%o zspL8+WVnza!L`Int<=+Fh?1NZQvGhJAo_KgM?2~nVIe-CLRT9YBFbJt*3zXvyNG>A zFct!zG%k&&rnb;99;s-B_i7aVvQfPYzX_`($PGHbAP7iKWYaMK&xX&B|07T73xc=+ z6{I>Zobo-P;s6Txt=&JN|KYjqTyyy{UoMI!G<=`Eg7ieVjCI@5ixS^g0U6bQZM#0wx3*3Pd&h+;i!?d<_2R6m+#IIrU|PzPEQV!Azq61_d*h z9CJ_}N`#Pu0Km5!VY?R=?fLLzojZqqfZk20A>p{W1_dC5;u`l3+n6ilNOeUGWrKbl zxB?)nE8$RJ>Y${6d7ZZDT3^31j8O~=|1JhX@aoMe7Z3-4A<^O2~h*?i+-x5CZFarInt8cWoZ z;TcdqoE9g*+8`=o^K-1*vBjhcq^2dza7^`;*@Aj>?W6Aq1LVk^Iwu7^x~ivY=*4mp z-)`!9QF+M*wh6=}jcy<+q?+F%pUX}*-~VK+y*1AnLiY;wg$ALE3TfmwX@{n8TzWIz zU_r?3jf`3M@iX8x93S;7`Uf5+O50@yR#OeEQX^1nx9|$gMxyutESIL!G=Qt}<`r+18_^dP3a=KO|VJ6QQ_P`Boe0xIcQo`#rmSy;^n{ zoRup%^KHAFHo^O$U^}sXppYBBZApz;dXD(3uU)~nAARFSTU*)WOg-G6a%vBo(rd)@ zFm{PJeg}amH3LA;JxP3}ekfvi=CWMJ9X?$n`&SUpiviM7RnL-AMC}DaUr!E^#5m&y z@)(xIO_34CI=#eHpMywHt^Sdf(ds*Cj_^snW2c@zPy;rKCiCT4y_QzF%<~AM_=qQI z&@EgX5?k@nWy-hTYp`=Rzi505w=l*-7H_Ozk`y?K|&3RrU)A&!Li z+!pL2xLc%~lp-U(*3N+&E{sNY!FRvLgD88P_4*Gc(z`@$zppn~e##ON6W4@gWr^6Z za=hb8QH7KQGBiq@nb8|cG~x@;x-D^udMfCb@fT{PS&#xsn&D~ifmidxm4x3tWp;oQ-nT+L<0T>rz&@GSlK>LY$e zVvKV2W24pMWig~R(X*m+HY4{80XOSA`kEGg?@)noS1OkG zt=p53eo%Wu*McZ^tt}>h$1ew{aco1T@Sqz8aJp&Jqs=xMn6D!qQMpbdCE4C6X)wEf{*%aNsIzS&xpyXU(Mo+K@ATYUmtCR8dza*ko`_TLA` z9XD(R2j9;%O_H08y$GCn*9w=6slW~oP8_rf>IA*;@i~UMhG=cfPh+X@H+kyh(bkPG z=Qwo>2(_}=%`4xk&5zlb!`wUrGD6HD+C5d<#k#nD- z#|C)u60WyzIn2}9s`VN`ft6AWRsd5HSZ7rBG}r_4#H8rk`yLPj)Q)yU&2NVmVWvjk zGOl(@ovC{;-p6Z5?ovpXz}jpq){5%_4UHe3h#q{*QDjP`^0^8+ZCZU&r$JcXE5G^K z`&m|Q^Rp`|=21Ggs1$65ZQ#JHwe-uWi+khv{XAVr+H7EMb~U@56t3Me$S>m69VzRH zw0keGbHVNUK)HZC)CxXnp4rAc$G~WMC7)dZI9%LztwVZ@=;2)G!;5_U2YS}sQyAbD zh3}m+r8f`tyz-$#cLwQNGTwK2ggL89N>cz7pYXVc?#3LTzfbbHlAE}oYUMfJ$*fFG zxQfy)=Y6|`vwG<-D56Hxky2Kx{hn9~QnuJ&V(aertAUk}j#K#FBYAq9Y`bM@w|;f2 zQEf1e;zOJ^vd`Wfv78ZfrZl9z$6V$4Aj`nTs6$GxLvO9WBCu?65cJwUc&dBf|0F~bCC}^ zF8~ARk39{zutHTYkIu5q4>7)8rs>Mn9t$jPQ^H&Tj&~9%M{nE9Op^{)V_Xj&zz7pm zmM-B5-Fl7oz+5rOfe<)r26&!D)a|&j0C%ir%}DN>X!(j`VLS`a#zkh;q6+|Ke&SK$ z@!{M0NZig;oJ{K$-E0R>=YFj5A1Fj6~1E<$-;0e2Vr22R$uCEROlOlw14<^z*M+frv+hJGqCC?gnk8^6(|7R5u0Z90Q7`!j0H=csiaQc}qgDIEP3ZjuN^l~#1o@}Np zFVJB^bv50^l-*Js=aLVFbF^U?*sKZC#39I9#FZ&5#zXilvD%MtIa2{4>if#rbX|^S9u2zJ3Ed& z?Nb5-$dzSJTN@Aw)Ues&c9>R=z@FwIFPaf$a4T{W`c1i-BM9q9MXHg(R2=z|l(y!e zblbE!Y%+;2Mbb1aNgJ}LkW6^nWD(S7lbU`LG}fSI!zANac){&d&RMkW<%@%nlbP6L)VXbRcy$|>Vv}-E9&5fY(~}+ zPAMlX-tg^GR6@q>ts*%?W}Uv`NeW*+dbhDQ!elwnm~yqCgbc5i!^r z980Nt!*HsaRV=*#J)o0bjLZ4>GEKn^dvHoo8oC4vvCN(0<*Myhi=780@}?G_a<4ov zhnw54E)sqW@eV;@@YodR-QvLP5|I)wW-3s`7hO5d+=~I{A@5+Ct}FQDF2E%BgN;*%oF#*=Z@r(YIOA$TPR&l!=S6SeA`wF%8`;wf_C1PWb_mJ+`!d#T z8$z_O7!iGBu-|@LO3R8bI@gun&0#iH0yH#yuV=+xZYav0;tu#7e3pFUJ427zVj3;G)d!{9p+)`$)HQun@(oP(TIxGm0^*g8Fz44@QB3h|$1-vR-NJ&PNt z+%}3u+))c+5jZ{P$alv_&N!1 zNE}!eEbKeCUfeSJWmj0~G-Sb!W0+d$GZ5+;Q$a?mO*=$BAc5Q^xv!ChAv#|;;+%>9 z&4w1o(eI`_BZEz3;F0+V?^C)3MeVZ*IkKbC$qYCb?bGar?d(KX|MrMO_~B-1i>2Sa z$FNFxJ{iC&CI{3hFL(J?9RxJWIY}nmd@Cydn2@z_>NtEqc1zfj6aAKhu8T(q{oTN* zdu!?VI8CI24Ny4c6TUwj{CbH4y|#@@S`PhejwryYYMhVZBZ@^59nr}{1zW}ic6{2xu3Hu(N#Xj+1VVvZ~oT$u06m$ zCTJ(+r=-PnK6?d6*F{gjrV%{=%88pn&9HroGAA6#BHPC!gFw2}wSwWE-bISJS|F|f zvP?DBmHHMZ|9iXAn{A3*^&QvqO*l~nJxQ6kA4&Q}qJ#;(1G;IVcQFEMw16v*jDG0L z=xbMe3+Xxzgez1bYu4dI+g}g{Q@{k zem7d;<-#j_k@02m+r2%iBxRDVq>!cr5jEo4YvI}O^rqi1^tU|f#E*M-K^w80X!)yU zd6&h@fkkZb+~SohrfqI<;gon=r$-gps!KStzr6O+hvN>;Eg+=);_hnA<>dFf$8jsf zU%|+yhq5>yDF((U14Hh>CLRbvrxNn_=npa8uTbhtu}N@6JwmyQ8`(iIJECw(UHN8s zaLeY-aNvTf#4C^+yCc5`ZG{IOu2?7j6g*768hm(9op10x>3vq^5CNA1Yis}v?$-_T zz^InvR3Gv_kOVkBxL@~Qj`*OfUq2Mm&5!O%1H@d$Nc(E!CI?lypm6&s7x0D9-!P;D zxXM-Sy4r7i>2k#r0W#FQ`*S?rbzdZj)0P=Zcv7*ma|8_%gxw~J#Z3f7ZjP?w(hu=3 zc{tLqOGs1IY+an3=L)O6Af(PnQ(s0|7Tce}W~|+vq+z~`bk|*R`^2uZ)bH`(@cg{Z zJn}Gxb@RtkaqD*kD4Y>YiHBpU1Dh&e985~<;4?(cNq8rpsOl`-%b?1Sm1DBo>4KM1{UcyG4#xg`oO zHz*l6lR$&R*!i5K#8a%}M${ts(asL{#~FOl3|#bj{X7qAq23$BF$CJB!B0B+X{Ch2 zj<|daacke{T(NR0VadD$yB!WCQ3EDAmH%8g8VPiw!I`9XH}OwTX00nej=UDOUlo78 zCcn@cc-CfWiSK>~Mo2~gig-gg))n@NWzaspt5%VcB;5mN$ZNobKlZU?aRGG#rRX}2 z`330IJKx=WOYtZY23I2nMG#PrHECDOjm!my!SO&5pcV|^YNHLeu@KLV*vyMm7m zZzDm-uefI{p|?)7fBmWEHs_ZXtwt&B802K&uTvYXzc*eNeGYu;T$xYm-laT%;3j_X>xrzT5 zjKu#Z1W5cB>|6N@zCNM-%VU;z`!8Ca>a8WiOlH z4Y&PU8^0Z{jGhiizU-`c9+bkVDq!IAPta@QboDB_uHAmejS)HwTR8VW>bFJsQ@4@T z8byZXGNjj4dFW$)3rC}blo@bm^fz8@wp5T8dhaC8ff&BFN9Gp>#<|dv^hCL)?9`yX zp`2+97g3aaxznEl(gtYDJ3?e~D-Ht&CEw9dit?KnH)>hig&A09#NDL^L`!jthGR>g zC#l>ZxlebLxai?%`b~%}lWVv}$N$zx8n--SesX<(#TNkL3Ksf1tWY~_u?ln5AKCh6 zERql9!i;Z0lJY=ag#K+@HvrwslqcpTan=KYcU0A`L>k;$mZ;yw!tpawPXbDsIdKnu znUPSlK|MWW5DDr0NNBcO3Yw`x@8$75Z9urT?`c87Om_|jlTUZJUw7j@oahw!lQOtZ z2e{^w(-jKYq02Pye4v07Ms=iSG;O_ie_i5y$GNIl_w7V*z!)(Q7FDte4DWI;8%E`Oe^_;x{8L=At_Ooqy|8h-Z6kBrDKKJM`K zsGpza!tVSe^SJTlP4n+a%a0YPl?r^=?R0Aa9(l*Khc4BK;kXt!TE(`rE~$Jvt)0(;90Td_Rb-=M9Z}vih1Wig#o_wBwD@-!N;H-$RD#)!j zFFtW{9DV16egl$Yfzy;kVDuqSryh^a2Y!e(6g0CHO!@ z-;e%8s+Yh62L;VFSqlkfH|2)RO*ev1s#BdEhBPPuzT61u#gw`=fV=FC1*uU(>qww% zpuO0$Pc(^xB{VlT{}ciUCkiKB%$I)H}&kdYxSW-4my|4>+AqWop@cGT}VuF3?V}5HM}% z_eu8L_f|`TBXOWpbo*XZINXDjVmMsiLoG{d*9sX_Tch)vy6J@4cUPh0B7>ks8tr!@ zs1Q?CKmyYb5kL#NVYIquIQR=1I8Q!rznbj{(joPBrX{X_44Yr|Nno@DK)>MnTN}WV^{i@k8`Y04jB_q>Mpc~?yS`rY^7}-0x=mM*Jy9+_I~OaBiY{#%o2|MIK42mp z!1j-N`*Df#841H_=f%E_zP5Du+&0u;?QpPiW8QwAosdg&q6#ZK`?fv0h5tDR@!yL* zf~?RsK=a+>tNK*bDi_ z+Pem9&}jH8`ZjLZyhDdgMdjX`>!(P(3Qzs9ODO^5CB8cw@LyWoje4?DWpGPPqiI%9+q?`oH&^ z_|?8(zk#gf#h1yniBfhRyAx81*(6Zn*r&z*mb*;F^Mg7#x`mUklNSpg&IGn zAG=L(`dju~S-R+-AW;s9rfG1qy^y=YApImUPBsPrb;|?EO<>>MFhG_1&^uFdzJsgM zGm9wz)^#LO@J3%)^G-(biuP9mg2mD#q@OAn^H(=2bJ_tZmu!?n%P5=?x;OxR+++9lE=xGUQv;wW6fP+^^NG+t^hx8qX#;D2lKidBP z{(BO7MZquBwg=fvX~!w&^iVeTfWGvw23omU<34zz!lI%A!cqbvkMu<(fx?nNabZ4T nVW6<^im|Hk|H0tw0=2jC{eNaiCb~jjcTY`O>q#}}#hd>HK}D$a literal 0 HcmV?d00001 diff --git a/requirements/pr-fix-ci-fb-version/specifications/discovery/user-interest/index.md b/requirements/pr-fix-ci-fb-version/specifications/discovery/user-interest/index.md new file mode 100644 index 000000000..e43d482fc --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/discovery/user-interest/index.md @@ -0,0 +1,369 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: User Interest +category: requirements +type: specification +--- +# User Interest + +Document Status: Candidate Specification + +See [Firebolt Requirements Governance](../../../governance) for more info. + +| Contributor | Organization | +| -------------- | -------------- | +| Eugene Chung | Comcast | +| Tim Dibben | Sky | +| Mike Horwitz | Comcast | +| Jeremy LaCivita | Comcast | + +## 1. Overview + +In additional to traditional discovery APIs such as Watch History and +Watch Next, Firebolt provides a more abstract API that facilitates +impromptu content discovery connections between first-party Aggregated +Experiences and third-party Apps. + +The User Interest Capability enables Apps to provide meta-data on +content that the user has expressed an interest in to Aggregated +Experience Apps that have been given access to use this Capability. + +This allows for open ended design of Aggregated Experience App features +that present App-specific content to re-engage the user with the content +inside the originating App. + +While the functionality and UX is left to the Aggregated Experience App, +typically designed by each Firebolt Distributor, the Firebolt API +enables events to register user interest and pass entity meta-data: + +![Diagram Description automatically +generated](../../../../requirements/images/specifications/intents/user-interest/media/image1.png) + +Which generally enables Aggregated Experiences to present that entity +meta-data in some way that leads to re-launching the original App at a +later point, using a `navigateTo` notification: + +![Diagram Description automatically +generated](../../../../requirements/images/specifications/intents/user-interest/media/image2.png) + +This is just one example of what an Aggregated Experience App might do +with the User Interest API. + +Note that this API **SHOULD NOT** be used to implement Watch History or +Watch Next features. These concepts are much more fundamental to +Firebolt and have explicit APIs so that Firebolt Distributors can keep +track of which apps are using them separately. + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. User Interest Flows](#3-user-interest-flows) + - [3.1. User Interest from an in-app UX](#31-user-interest-from-an-in-app-ux) + - [3.2. User Interest from a platform UX](#32-user-interest-from-a-platform-ux) + - [User Interest Errors](#user-interest-errors) + - [3.3. Upstream User Interest Intent](#33-upstream-user-interest-intent) + - [3.4. User Interest Bulk Updates](#34-user-interest-bulk-updates) +- [4. Core SDK APIs](#4-core-sdk-apis) + - [4.1. InterestType](#41-interesttype) + - [4.2. InterestReason](#42-interestreason) + - [4.3. Discovery.userInterest](#43-discoveryuserinterest) + - [4.4. Discovery Interest Provider](#44-discovery-interest-provider) + - [4.5. InterestIntent](#45-interestintent) +- [5. Discovery SDK APIs](#5-discovery-sdk-apis) + - [5.1. Interest Types](#51-interest-types) + - [5.2. Content.requestUserInterest](#52-contentrequestuserinterest) + - [5.3. Content.onUserInterest](#53-contentonuserinterest) + + +## 3. User Interest Flows +### 3.1. User Interest from an in-app UX + +Some Apps will have a built-in user interface for users to express +interest in content from the App. This could be a "Favorite" button, +an in-app "My List" button, etc. + +If the App wants to leverage any additional exposure from the device's +Aggregated Experience, it can wire up its own UI to the Firebolt User +Interest API, in addition to any in-app features that it's already +invoking. + +By calling the `Discovery.userInterest` method with the relevant entity +meta-data, the device's Aggregated Experience will be notified of the +user's interest in that entity: + +```typescript +Discovery.userInterest(type: InterestType, reason: InterestReason, entity: EntityDetails) +``` + +The `type` parameter denotes the directionality of the interest: + +- `interest` +- `disinterest` + +The `reason` parameter denotes why or how the user has expressed interest: + +| Reason | Description | +| ------ | ----------- | +| `playlist` | Interested in adding to a list | +| `reaction` | Interested in submitting a reaction, e.g. like or dislike | +| `recording` | Interest in scheduling a recording | +| `share` | Interest in sharing the content on social media | + +**NOTE**: We can remove some of these (not `playlist`) these are here for now to illustrate the purpose for the reason paramater. + +An app **MUST** `provide` the `xrn:firebolt:capability:discovery:interest` +capability in order to call `Discovery.userInterest`. + +When this method is called with a valid `EntityDetails`, the platform +**MUST** dispatch a `Content.onUserInterest` notification to all Apps +that have registered for it (typically Aggregated Experience Apps) with +information about the app, interest type, and the entity. + +The `Content.onUserInterest` event has a result type of `Interest`: + +| property | type | description | +|---------|------|-------------| +| appId | string | The id of the app that pushed the user interest. | +| type | `InterestType` | the type of interest. | +| reason | `InterestReason` | the reason for the interest | +| entity | `EntityDetails` | The entity the user expressed interest in. | + +An Aggregated Experience can register for the `Content.onUserInterest` +notification, and it will receive notifications when an `EntityDetails` is +returned from the active App after a `Discovery.userInterest` call is +fulfilled. + +An app **MUST** have permissions to `use` the +`xrn:firebolt:capability:discovery:interest` capability in order to +listen to the `Content.onUserInterest` notification. + +If the result is not a valid entity, i.e. does not match +the [EntityDetails](../../entities/) schema, then no `Content.onUserInterest` +notification will be dispatched. + +The `Discovery.userInterest` method **SHOULD NOT** be used in place of more +specific Discovery methods, e.g. `Discovery.watchNext` or +`Discovery.watched`. These methods facilitate specific UX flows that may +have separate legal opt-outs for each user. + +The `Discovery.userInterest` method **SHOULD NOT** be called unless the user +is activating a UI element in the app, or in a second screen experience +that is communicating with the app, that implies interest of some kind. + +### 3.2. User Interest from a platform UX + +Firebolt platforms may provide a platform UX, e.g. voice or and RCU, to +express user interest in content from an active App. To facilitate this +Apps will need to be told about the user's expressed interest in their +content. + +First, the Aggregated Experience (or some app with this +capability) detects that the user is interested in something. In this +picture the interest is triggered by an RCU button, but how this occurs +is outside the scope of this document. When this happens, the Aggregated +Experience app calls `Content.requestUserInterest()`, which will trigger the +platform to identify the best [Provider Candidate](../../openrpc-extensions/app-passthrough-apis#5-provider-candidates) +and call that app's `userInterest` method via the Provider RPC method: +`Discovery.onRequestUserInterest`. + +![](../../../../requirements/images/specifications/intents/user-interest/media/image3.png) + +Next, the provider app receives and responds to the request with an +EntityDetails, which is returned as the result to the pending +`Content.requestUserInterest` method: + +![](../../../../requirements/images/specifications/intents/user-interest/media/image4.png) + +Once an App's callback is invoked, that app will have `interestTimeout` +milliseconds to return a value or throw an error. Values returned after +that time **MUST** be ignored. The timeout value is stored in the +device's configuration manifest. + +To be notified when a user expresses interest in the currently displayed +content, an App **MUST** provide the +`xrn:firebolt:capability:discovery:interest` capability by enabling the +`Discovery.onRequestUserInterest` notification. + +If there is a valid entity to return, then the method registered by the +App **MUST** return the currently displayed entity meta-data. + +If there is no valid entity to return, then the method **MUST** throw an +exception. + +If the provider app returns a valid `EntityDetails` before the timeout, +then, the returned value **MUST** be used. + +If there is no app registered the an error **MUST** be returned. + +#### User Interest Errors +An app is expected return either a valid result or an appriate error. + +If neither happens before `interestTimeout` expires then the platform **MUST** return a Provider timed-out error: + +```json +{ + "id": 1, + "error": { + "code": -50400, + "message": "Provider timed-out", + "data": { + "capability": "xrn:firebolt:capability:discovery:interest", + } + } +} +``` + +If an app recieves a request for user interest when there is nothing appropriate to return, e.g. nothing selected or presented that maps to an Entity, then the app **SHOULD** return an error with a valid JSON-RPC error response, e.g.: + +```json +{ + "id": 1, + "error": { + "code": -40400, + "message": "No entities currently presented." + } +} +``` + +The platform API Gateway **MUST** append, or overwrite, the `data.capability` value to any errors returned by the app, e.g.: + +```json +{ + "id": 1, + "error": { + "code": -40400, + "message": "No entities currently presented.", + "data": { + "capability": "xrn:firebolt:capability:discovery:interest", + } + } +} +``` + +### 3.3. Upstream User Interest Intent +In some cases, e.g. a voice assistant, some upstream component will inform +the platform that the user is interested in whatever is currently being presented. + +To do this, the upstream system **MUST** send a `Interest` intent, which describes the type of and reason for the interest. + +```json +{ + "action": "interest", + "data": { + "type": "interest", + "reason": "playlist" + } +} +``` + +When a Firebolt platform receives this intent, it **SHOULD** initiate the platform's [user interest flow](#4-user-interest-from-a-platform-ux). + +### 3.4. User Interest Bulk Updates + +Sending bulk interest updates, e.g. Entities the user expressed interest +in on a different platform, is not supported. + +## 4. Core SDK APIs + +The following APIs are exposed by the Firebolt Core SDK as part of the +`Discovery` module. + +### 4.1. InterestType +This is an enum with the following values: + +- `"interest"` +- `"disinterest"` + +### 4.2. InterestReason +This is an enum with the following values: + +| Reason | Description | +| ------ | ----------- | +| `playlist` | Interested in adding to a list | +| `reaction` | Interested in submitting a reaction, e.g. like or dislike | +| `recording` | Interest in scheduling a recording | +| `share` | Interest in sharing the content on social media | + +### 4.3. Discovery.userInterest + +This is a push API that allows Apps to push entities that the user has +expressed interest in to the platform. + +To push an entity that the user is interested in pass an `EntityDetails` +object to the method: + +```typescript +Discovery.userInterest(type: InterestType, reason: InterestReason, entity: EntityDetails): Promise +``` + +### 4.4. Discovery Interest Provider +To respond to requests for the current entity, because the user has +expressed interest in some way that the platform manages, register a +provider: + +```typescript +interface IDiscoveryInterestProvider { + function userInterest(type: InterestType, reason: InterestReason): Promise +} + +Discovery.provide("xrn:firbolt:capability:discovery:interest", IDiscoveryInterestProvider) +``` + +### 4.5. InterestIntent + +An `InterestIntent` denotes that the user has expressed interest in the +currently displayed and/or selected content: + +```typescript +type InterestIntent { + action: "interest" + data: { + type: "interest" | "disinterest", + reason: "playlist" | "reaction" | "recording" + }, + context: { + source: "rcu" | "voice" + } +} +``` + +## 5. Discovery SDK APIs + +The following APIs are exposed by the Firebolt Discovery SDK as part of the +`Content` module. + +### 5.1. Interest Types +This type stores the various attributes of an Interest response or event: + +```typescript +type InterestType = "interest" | "disinterest" +type InterestReason = "playlist" | "reaction" | "recording" | "share" + +type Interest { + appId: string + entity: EntityDetails + type?: InterestType + reason?: InterestReason +} +``` + +### 5.2. Content.requestUserInterest +This method triggers the corresponding Discovery provider API for the +provider app. + +```typescript +Content.requestUserInterest(type: InterestType, reason: InterestReason): Promise +``` + +### 5.3. Content.onUserInterest + +This notification allows Aggregated Experience Apps to be informed when +a user expresses interest in some Content, and the content resolves to a +valid Entity from some App. + +`Content.listen('userInterest', Interest => void): Promise` + +The callback will be passed an `Interest` object with +the appId, type, reason, and information about the entity that the user expressed interest in. diff --git a/requirements/pr-fix-ci-fb-version/specifications/entities/channels/index.md b/requirements/pr-fix-ci-fb-version/specifications/entities/channels/index.md new file mode 100644 index 000000000..244602c14 --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/entities/channels/index.md @@ -0,0 +1,65 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: Channel Entities +category: requirements +type: specification +--- +# Channel Entities + +Document Status: Proposed Specification + +See [Firebolt Requirements Governance](../../../governance) for more info. + +| Contributor | Organization | +| --------------- | ------------ | +| Jeremy LaCivita | Comcast | + +## 1. Overview +TBD... + +The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL +NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**NOT +RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be +interpreted as described in [BCP +14](https://www.rfc-editor.org/rfc/rfc2119.txt) [RFC2119] [RFC8174] when, and +only when, they appear in all capitals, as shown here. + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. Channel Entities](#3-channel-entities) + + +## 3. Channel Entities +Every Channel Entity **MUST** be an [Entity](../index#3-entities). + +Every Channel Entity **MUST** have a `const` property named `entityType`, which +**MUST** have the value `"channel"`. + +Every Channel Entity **MUST** have a `string` property named `channelType`, +whose value **MUST** be one of: + + - `"streaming"` + - `"broadcast"` + +An example Channel Entity: + +```json +{ + "entityType": "channel", + "channelType": "streaming", + "entityId": "streaming/xyz" +} +``` + +Another example Channel Entity: + +```json +{ + "entityType": "channel", + "channelType": "broadcast", + "entityId": "broadcast/xyz" +} +``` diff --git a/requirements/pr-fix-ci-fb-version/specifications/entities/index.md b/requirements/pr-fix-ci-fb-version/specifications/entities/index.md new file mode 100644 index 000000000..a1c4003d5 --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/entities/index.md @@ -0,0 +1,94 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: Firebolt Entities +category: requirements +type: specification +--- +# Firebolt Entities + +Document Status: Proposed Specification + +See [Firebolt Requirements Governance](../../governance) for more info. + +## 1. Overview +Entities are object which identify a piece of content that an end-user may +consume within an app. + +Firebolt uses Entities or Entity Ids as parameters and/or results of +content-centric Firebolt APIs that an App may interact with. + +The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL +NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**NOT +RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be +interpreted as described in [BCP +14](https://www.rfc-editor.org/rfc/rfc2119.txt) [RFC2119] [RFC8174] when, and +only when, they appear in all capitals, as shown here. + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. Entities](#3-entities) +- [4. Playlist Entities](#4-playlist-entities) +- [5. Entity Specifications](#5-entity-specifications) + +## 3. Entities +Every Entity **MUST** be of type `object`. + +Every Entity object **MUST** have a `string` property named `entityId`, which +identifies the entity. The scope of entity identifiers **SHOULD** be defined by +the app providing or receiving the Entity, so that the App may work across +Firebolt distrubutions without mapping IDs from a distributor space to the +App's space. + +Every Entity object **MAY** have a `string` property named `assetId`, which +disambiguates the asset from the entity, if needed. The scope of asset +identifiers **SHOULD** be defined by the app providing or receiving the Entity, +so that the App may work across Firebolt distrubutions without mapping IDs from +a distributor space to the App's space. + +Every Entity object **MAY** have a `string` property named `appContentData`, +limited to 256 characters, which provides additional information useful for +targeting that Entity, e.g. a deeplink path. + +An example Entity: + +```json +{ + "entityId": "entity/abc" +} +``` + +Another example Entity: + +```json +{ + "entityId": "entity/abc", + "assetId": "asset/123", + "appContentData": "xyz" +} +``` + +Firebolt platforms **MUST NOT** infer anything from the values of these fields, +although back-office systems operated by Firebolt distributors may. + +## 4. Playlist Entities +A playlist is a type of entity that points to a list of other entities. + +Since entity IDs are in the target app's scope, it is up to each app to know +what to do with the contents of a given playlist. + + +```json +{ + "entityType": "playlist", + "entityId": "playlist/xyz" +} +``` + +## 5. Entity Specifications + +- [Program Entities](./programs) +- [Channel Entities](./channels) +- [Music Entities](./music) \ No newline at end of file diff --git a/requirements/pr-fix-ci-fb-version/specifications/entities/music/index.md b/requirements/pr-fix-ci-fb-version/specifications/entities/music/index.md new file mode 100644 index 000000000..8b574b2b7 --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/entities/music/index.md @@ -0,0 +1,82 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: Music Entities +category: requirements +type: specification +--- +# Music Entities + +Document Status: Proposed Specification + +See [Firebolt Requirements Governance](../../../governance) for more info. + +| Contributor | Organization | +| --------------- | ------------ | +| Jeremy LaCivita | Comcast | +| Liz Sheffield | Comcast | + +## 1. Overview +TBD... + +The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL +NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**NOT +RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be +interpreted as described in [BCP +14](https://www.rfc-editor.org/rfc/rfc2119.txt) [RFC2119] [RFC8174] when, and +only when, they appear in all capitals, as shown here. + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. Music Entities](#3-music-entities) + - [3.1. Optional Music Entity Properties](#31-optional-music-entity-properties) + + +## 3. Music Entities +Every Music Entity **MUST** be an [Entity](../index#3-entities). + +Every Music Entity **MUST** have a `const` property named `entityType`, which +**MUST** have the value `"music"`. + +Every Music Entity **MUST** have a `string` property named `musicType`, whose +value **MUST** be one of: + + - `"song"` + - `"album"` + +An example Music Entity: + +```json +{ + "entityType": "music", + "musicType": "song", + "entityId": "song/xyz" +} +``` + +Another example Music Entity: + +```json +{ + "entityType": "music", + "musicType": "album", + "entityId": "album/xyz" +} +``` + +### 3.1. Optional Music Entity Properties +A Music Entity **MAY** have a `string` property named `albumId` if its +musicType is `song`, otherwise the entity **MUST NOT** have this property. + +An example Music Entity: + +```json +{ + "entityType": "music", + "musicType": "song", + "entityId": "song/xyz", + "albumId": "album/xyz" +} +``` diff --git a/requirements/pr-fix-ci-fb-version/specifications/entities/programs/index.md b/requirements/pr-fix-ci-fb-version/specifications/entities/programs/index.md new file mode 100644 index 000000000..4c486b4bf --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/entities/programs/index.md @@ -0,0 +1,108 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: Program Entities +category: requirements +type: specification +--- +# Program Entities + +Document Status: Proposed Specification + +See [Firebolt Requirements Governance](../../../governance) for more info. + +| Contributor | Organization | +| --------------- | ------------ | +| Seth Kelly | Comcast | +| Jeremy LaCivita | Comcast | + +## 1. Overview +TBD... + +The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL +NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**NOT +RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be +interpreted as described in [BCP +14](https://www.rfc-editor.org/rfc/rfc2119.txt) [RFC2119] [RFC8174] when, and +only when, they appear in all capitals, as shown here. + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. Program Entities](#3-program-entities) + - [3.1. Optional TV Entity Properties](#31-optional-tv-entity-properties) + + +## 3. Program Entities +Every Program Entity **MUST** be an [Entity](../index#3-entities). + +Every Program Entity **MUST** have a `const` property named `entityType`, which +**MUST** have the value `"program"`. + +Every Program Entity **MUST** have a `string` property named `programType`, +whose value **MUST** be one of: + + - `"movie"` + - `"episode"` + - `"season"` + - `"series"` + - `"other"` + - `"preview"` + - `"extra"` + - `"concert"` + - `"sportingEvent"` + - `"advertisement"` + - `"musicVideo"` + - `"minisode"` + +An example Program Entity: + +```json +{ + "entityType": "program", + "programType": "movie", + "entityId": "entity/abc" +} +``` + +Another example Entity: + +```json +{ + "entityType": "program", + "programType": "episode", + "entityId": "entity/xyz" +} +``` + +### 3.1. Optional TV Entity Properties +A Program Entity **MAY** have a `string` property named `seasonId` if its +programType is `episode`, otherwise the entity **MUST NOT** have this property. + +A Program Entity **MAY** have a `string` property named `seriesId` if its +programType is either `episode` or `season`, otherwise the entity **MUST NOT** +have this property. + +An example TV Program Entity: + +```json +{ + "entityType": "program", + "programType": "episode", + "entityId": "entity/def", + "seriesId": "entity/hij", + "seasonId": "entity/klm" +} +``` + +Another example TV Program Entity: + +```json +{ + "entityType": "program", + "programType": "season", + "entityId": "entity/klm", + "seriesId": "entity/hij" +} +``` diff --git a/requirements/pr-fix-ci-fb-version/specifications/firebolt-core-open-rpc.json b/requirements/pr-fix-ci-fb-version/specifications/firebolt-core-open-rpc.json new file mode 100644 index 000000000..be3ceb6a4 --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/firebolt-core-open-rpc.json @@ -0,0 +1,11249 @@ +{ + "openrpc": "1.2.4", + "info": { + "title": "Firebolt Core SDK", + "version": "1.5.0-fix-ci-fb-version.0", + "x-module-descriptions": { + "Internal": "Internal methods for SDK / FEE integration", + "Accessibility": "The `Accessibility` module provides access to the user/device settings for closed captioning and voice guidance.\n\nApps **SHOULD** attempt o respect these settings, rather than manage and persist seprate settings, which would be different per-app.", + "Account": "A module for querying about the device account.", + "Advertising": "A module for platform provided advertising settings and functionality.", + "Authentication": "A module for acquiring authentication tokens.", + "Capabilities": "The Capabilities module provides information about which discreet unit of functionality is enabled for the apps.", + "Device": "A module for querying about the device and it's capabilities.", + "Discovery": "Your App likely wants to integrate with the Platform's discovery capabilities. For example to add a \"Watch Next\" tile that links to your app from the platform's home screen.\n\nGetting access to this information requires to connect to lower level APIs made available by the platform. Since implementations differ between operators and platforms, the Firebolt SDK offers a Discovery module, that exposes a generic, agnostic interface to the developer.\n\nUnder the hood, an underlaying transport layer will then take care of calling the right APIs for the actual platform implementation that your App is running on.\n\nThe Discovery plugin is used to _send_ information to the Platform.\n\n### Localization\nApps should provide all user-facing strings in the device's language, as specified by the Firebolt `Localization.language` property.\n\nApps should provide prices in the same currency presented in the app. If multiple currencies are supported in the app, the app should provide prices in the user's current default currency.", + "Keyboard": "Methods for prompting users to enter text with task-oriented UX", + "Lifecycle": "Methods and events for responding to lifecycle changes in your app", + "Localization": "Methods for accessessing location and language preferences", + "Metrics": "Methods for sending metrics", + "Parameters": "Methods for getting initialization parameters for an app cold launch.", + "Profile": "Methods for getting information about the current user/account profile", + "SecondScreen": "Methods for communicating with second screen devices", + "SecureStorage": "A module for storing and retrieving secure data owned by the app" + } + }, + "methods": [ + { + "name": "Accessibility.closedCaptions", + "summary": "Get the user's preferred closed-captions settings", + "params": [], + "tags": [ + { + "name": "deprecated", + "x-alternative": "Accessibility.closedCaptionsSettings()", + "x-since": "0.6.0" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "closedCaptionsSettings", + "summary": "the closed captions settings", + "schema": { + "$ref": "#/x-schemas/Accessibility/ClosedCaptionsSettings" + } + }, + "examples": [ + { + "name": "Getting the closed captions settings", + "params": [], + "result": { + "name": "settings", + "value": { + "enabled": true, + "styles": { + "fontFamily": "monospaced_sanserif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] + } + } + } + ] + }, + { + "name": "Accessibility.closedCaptionsSettings", + "summary": "Get the user's preferred closed-captions settings", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "closedCaptionsSettings", + "summary": "the closed captions settings", + "schema": { + "$ref": "#/x-schemas/Accessibility/ClosedCaptionsSettings" + } + }, + "examples": [ + { + "name": "Getting the closed captions settings", + "params": [], + "result": { + "name": "settings", + "value": { + "enabled": true, + "styles": { + "fontFamily": "monospaced_sanserif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] + } + } + } + ] + }, + { + "name": "Accessibility.voiceGuidance", + "summary": "Get the user's preferred voice guidance settings", + "params": [], + "tags": [ + { + "name": "deprecated", + "x-alternative": "Accessibility.voiceGuidanceSettings()", + "x-since": "0.6.0" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "result": { + "name": "settings", + "summary": "the voice guidance settings", + "schema": { + "$ref": "#/x-schemas/Accessibility/VoiceGuidanceSettings" + } + }, + "examples": [ + { + "name": "Getting the voice guidance settings", + "params": [], + "result": { + "name": "Default Result", + "value": { + "enabled": true, + "speed": 2 + } + } + } + ] + }, + { + "name": "Accessibility.voiceGuidanceSettings", + "summary": "Get the user's preferred voice guidance settings", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "result": { + "name": "settings", + "summary": "the voice guidance settings", + "schema": { + "$ref": "#/x-schemas/Accessibility/VoiceGuidanceSettings" + } + }, + "examples": [ + { + "name": "Getting the voice guidance settings", + "params": [], + "result": { + "name": "Default Result", + "value": { + "enabled": true, + "speed": 2 + } + } + } + ] + }, + { + "name": "Accessibility.audioDescriptionSettings", + "summary": "Get the user's preferred audio description settings", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:audiodescriptions" + ] + } + ], + "result": { + "name": "settings", + "summary": "the audio description settings", + "schema": { + "$ref": "#/components/schemas/AudioDescriptionSettings" + } + }, + "examples": [ + { + "name": "Getting the audio description settings", + "params": [], + "result": { + "name": "Default Result", + "value": { + "enabled": true + } + } + } + ] + }, + { + "name": "Accessibility.onClosedCaptionsSettingsChanged", + "summary": "Get the user's preferred closed-captions settings", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Accessibility.closedCaptionsSettings" + }, + { + "name": "event", + "x-alternative": "closedCaptionsSettings" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "closedCaptionsSettings", + "summary": "the closed captions settings", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/ClosedCaptionsSettings" + } + ] + } + }, + "examples": [ + { + "name": "Getting the closed captions settings", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "settings", + "value": { + "enabled": true, + "styles": { + "fontFamily": "monospaced_sanserif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] + } + } + } + ] + }, + { + "name": "Accessibility.onVoiceGuidanceSettingsChanged", + "summary": "Get the user's preferred voice guidance settings", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Accessibility.voiceGuidanceSettings" + }, + { + "name": "event", + "x-alternative": "voiceGuidanceSettings" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "result": { + "name": "settings", + "summary": "the voice guidance settings", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/VoiceGuidanceSettings" + } + ] + } + }, + "examples": [ + { + "name": "Getting the voice guidance settings", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "enabled": true, + "speed": 2 + } + } + } + ] + }, + { + "name": "Accessibility.onAudioDescriptionSettingsChanged", + "summary": "Get the user's preferred audio description settings", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Accessibility.audioDescriptionSettings" + }, + { + "name": "event", + "x-alternative": "audioDescriptionSettings" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:audiodescriptions" + ] + } + ], + "result": { + "name": "settings", + "summary": "the audio description settings", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/AudioDescriptionSettings" + } + ] + } + }, + "examples": [ + { + "name": "Getting the audio description settings", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "enabled": true + } + } + } + ] + }, + { + "name": "Account.id", + "summary": "Get the platform back-office account identifier", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:account:id" + ] + } + ], + "result": { + "name": "id", + "summary": "the id", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "123" + } + } + ] + }, + { + "name": "Account.uid", + "summary": "Gets a unique id for the current app & account", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:account:uid" + ] + } + ], + "result": { + "name": "uniqueId", + "summary": "a unique ID", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the unique ID", + "params": [], + "result": { + "name": "Default Result", + "value": "ee6723b8-7ab3-462c-8d93-dbf61227998e" + } + } + ] + }, + { + "name": "Advertising.config", + "summary": "Build configuration object for Ad Framework initialization", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "params": [ + { + "name": "options", + "summary": "Configuration options", + "required": true, + "schema": { + "$ref": "#/components/schemas/AdConfigurationOptions" + } + } + ], + "result": { + "name": "adFrameworkConfig", + "summary": "the ad framework config", + "schema": { + "type": "object", + "description": "An opaque object represneting the AdConfiguration" + } + }, + "examples": [ + { + "name": "Initializing the Ad Framework", + "params": [ + { + "name": "options", + "value": { + "environment": "prod", + "authenticationEntity": "MVPD" + } + } + ], + "result": { + "name": "Default Result", + "value": { + "adServerUrl": "https://demo.v.fwmrm.net/ad/p/1", + "adServerUrlTemplate": "https://demo.v.fwmrm.net/ad/p/1?flag=+sltp+exvt+slcb+emcr+amcb+aeti&prof=12345:caf_allinone_profile &nw=12345&mode=live&vdur=123&caid=a110523018&asnw=372464&csid=gmott_ios_tablet_watch_live_ESPNU&ssnw=372464&vip=198.205.92.1&resp=vmap1&metr=1031&pvrn=12345&vprn=12345&vcid=1X0Ce7L3xRWlTeNhc7br8Q%3D%3D", + "adNetworkId": "519178", + "adProfileId": "12345:caf_allinone_profile", + "adSiteSectionId": "caf_allinone_profile_section", + "adOptOut": true, + "privacyData": "ew0KICAicGR0IjogImdkcDp2MSIsDQogICJ1c19wcml2YWN5IjogIjEtTi0iLA0KICAibG10IjogIjEiIA0KfQ0K", + "ifaValue": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa": "ewogICJ2YWx1ZSI6ICIwMTIzNDU2Ny04OUFCLUNERUYtR0gwMS0yMzQ1Njc4OUFCQ0QiLAogICJpZmFfdHlwZSI6ICJzc3BpZCIsCiAgImxtdCI6ICIwIgp9Cg==", + "appName": "FutureToday", + "appBundleId": "FutureToday.comcast", + "distributorAppId": "1001", + "deviceAdAttributes": "ewogICJib0F0dHJpYnV0ZXNGb3JSZXZTaGFyZUlkIjogIjEyMzQiCn0=", + "coppa": 0, + "authenticationEntity": "60f72475281cfba3852413bd53e957f6" + } + } + } + ] + }, + { + "name": "Advertising.policy", + "summary": "Get the advertising privacy and playback policy", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:policy" + ] + } + ], + "result": { + "name": "adPolicy", + "summary": "the ad policy", + "schema": { + "$ref": "#/components/schemas/AdPolicy" + } + }, + "examples": [ + { + "name": "Getting the advertising policy settings", + "params": [], + "result": { + "name": "Default Result", + "value": { + "skipRestriction": "adsUnwatched", + "limitAdTracking": false + } + } + } + ] + }, + { + "name": "Advertising.advertisingId", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:identifier" + ] + } + ], + "summary": "Get the IAB compliant identifier for advertising (IFA). It is recommended to use the IFA to manage advertising related activities while respecting the user's privacy settings.", + "params": [ + { + "name": "options", + "summary": "AdvertisingId options", + "required": false, + "schema": { + "$ref": "#/components/schemas/AdvertisingIdOptions" + } + } + ], + "result": { + "name": "advertisingId", + "summary": "the advertising ID", + "schema": { + "$ref": "#/components/schemas/AdvertisingIdResult" + } + }, + "examples": [ + { + "name": "Getting the advertising ID", + "params": [], + "result": { + "name": "Default Result", + "value": { + "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa_type": "sspid", + "lmt": "0" + } + } + }, + { + "name": "Getting the advertising ID with scope browse", + "params": [ + { + "name": "options", + "value": { + "scope": { + "type": "browse", + "id": "paidPlacement" + } + } + } + ], + "result": { + "name": "Default Result", + "value": { + "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa_type": "sspid", + "lmt": "0" + } + } + }, + { + "name": "Getting the advertising ID with scope content", + "params": [ + { + "name": "options", + "value": { + "scope": { + "type": "content", + "id": "metadata:linear:station:123" + } + } + } + ], + "result": { + "name": "Default Result", + "value": { + "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa_type": "idfa", + "lmt": "0" + } + } + } + ] + }, + { + "name": "Advertising.deviceAttributes", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "summary": "Get the device advertising device attributes", + "params": [], + "result": { + "name": "deviceAttributes", + "summary": "the device attributes", + "schema": { + "type": "object" + } + }, + "examples": [ + { + "name": "Getting the device attributes", + "params": [], + "result": { + "name": "Default Result", + "value": {} + } + } + ] + }, + { + "name": "Advertising.appBundleId", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "summary": "Get the App's Bundle ID", + "params": [], + "result": { + "name": "appBundleId", + "summary": "the app bundle ID", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "app.operator" + } + } + ] + }, + { + "name": "Advertising.onPolicyChanged", + "summary": "Get the advertising privacy and playback policy", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Advertising.policy" + }, + { + "name": "event", + "x-alternative": "policy" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:policy" + ] + } + ], + "result": { + "name": "adPolicy", + "summary": "the ad policy", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/AdPolicy" + } + ] + } + }, + "examples": [ + { + "name": "Getting the advertising policy settings", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "skipRestriction": "adsUnwatched", + "limitAdTracking": false + } + } + } + ] + }, + { + "name": "Authentication.token", + "summary": "Get a specific `type` of authentication token", + "tags": [ + { + "name": "deprecated", + "x-alternative": "Authentication module has individual methods for each token type.", + "x-since": "0.9.0" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:token:platform" + ] + } + ], + "params": [ + { + "name": "type", + "summary": "What type of token to get", + "schema": { + "$ref": "#/components/schemas/TokenType" + }, + "required": true + }, + { + "name": "options", + "summary": "Additional options for acquiring the token.", + "schema": { + "type": "object" + }, + "required": false + } + ], + "result": { + "name": "token", + "summary": "the token value, type, and expiration", + "schema": { + "$ref": "#/components/schemas/AuthenticationTokenResult" + } + }, + "examples": [ + { + "name": "Acquire a Firebolt platform token", + "params": [ + { + "name": "type", + "value": "platform" + } + ], + "result": { + "name": "token", + "value": { + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "expires": "2022-04-23T18:25:43.511Z", + "type": "platform" + } + } + }, + { + "name": "Acquire a Firebolt device identity token", + "params": [ + { + "name": "type", + "value": "device" + } + ], + "result": { + "name": "token", + "value": { + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "expires": "2022-04-23T18:25:43.511Z", + "type": "device" + } + } + }, + { + "name": "Acquire a Firebolt distributor token", + "params": [ + { + "name": "type", + "value": "distributor" + }, + { + "name": "options", + "value": { + "clientId": "xyz" + } + } + ], + "result": { + "name": "token", + "value": { + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "expires": "2022-04-23T18:25:43.511Z", + "type": "distributor", + "data": { + "tid": "EB00E9230AB2A35F57DB4EFDDC4908F6446D38F08F4FF0BD57FE6A61E21EEFD9", + "scope": "scope" + } + } + } + } + ] + }, + { + "name": "Authentication.device", + "summary": "Get a device token scoped to the current app.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:token:device" + ] + } + ], + "params": [], + "result": { + "name": "token", + "summary": "the token value and expiration", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Acquire a Firebolt device identity token", + "params": [], + "result": { + "name": "token", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + } + ] + }, + { + "name": "Authentication.session", + "summary": "Get a destributor session token.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:token:session" + ] + } + ], + "params": [], + "result": { + "name": "token", + "summary": "the token value", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Acquire a distributor session token", + "params": [], + "result": { + "name": "token", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + } + ] + }, + { + "name": "Authentication.root", + "summary": "Get a root device token.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:token:root" + ] + } + ], + "params": [], + "result": { + "name": "token", + "summary": "the token value", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Acquire a Firebolt root device identity token", + "params": [], + "result": { + "name": "token", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + } + ] + }, + { + "name": "Capabilities.supported", + "summary": "Returns whether the platform supports the passed capability.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + } + ], + "result": { + "name": "supported", + "summary": "Whether or not capability is supported in device.", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Wifi scan supported capability", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:wifi:scan" + } + ], + "result": { + "name": "Default Result", + "value": true + } + }, + { + "name": "BLE protocol unsupported capability", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:protocol:bluetoothle" + } + ], + "result": { + "name": "Default Result", + "value": false + } + } + ] + }, + { + "name": "Capabilities.available", + "summary": "Returns whether a capability is available now.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + } + ], + "result": { + "name": "available", + "summary": "Whether or not capability is available now.", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Device Token.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:token:device" + } + ], + "result": { + "name": "Default Result", + "value": true + } + }, + { + "name": "Unavailable Platform token.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:token:platform" + } + ], + "result": { + "name": "Default Result", + "value": false + } + } + ] + }, + { + "name": "Capabilities.permitted", + "summary": "Returns whether the current App has permission to the passed capability and role.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "options", + "summary": "Capability options", + "schema": { + "$ref": "#/components/schemas/CapabilityOption" + } + } + ], + "result": { + "name": "permitted", + "summary": "Whether or not app is permitted for the given capability and the role", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Keyboard", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:input:keyboard" + } + ], + "result": { + "name": "Default Result", + "value": true + } + }, + { + "name": "Keyboard incorrect manage role capability", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:input:keyboard" + }, + { + "name": "options", + "value": { + "role": "manage" + } + } + ], + "result": { + "name": "Default Result", + "value": false + } + }, + { + "name": "Wifi scan not permitted capability", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:wifi:scan" + } + ], + "result": { + "name": "Default Result", + "value": false + } + } + ] + }, + { + "name": "Capabilities.granted", + "summary": "Returns whether the current App has a user grant for passed capability and role.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "options", + "summary": "Capability options", + "schema": { + "$ref": "#/components/schemas/CapabilityOption" + } + } + ], + "result": { + "name": "granted", + "summary": "Whether or not app is granted to use the given capability and the role", + "schema": { + "oneOf": [ + { + "type": "boolean" + }, + { + "const": null + } + ] + } + }, + "examples": [ + { + "name": "Default capabilities without grants.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:input:keyboard" + } + ], + "result": { + "name": "Default Result", + "value": true + } + }, + { + "name": "Get Postal code without grants.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + } + ], + "result": { + "name": "Default Result", + "value": false + } + }, + { + "name": "Get Postal code with grants.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Capabilities.info", + "summary": "Returns an array of CapabilityInfo objects for the passed in capabilities.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "params": [ + { + "name": "capabilities", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "minItems": 1 + } + } + ], + "result": { + "name": "info", + "summary": "Returns an array of CapabilityInfo objects for the passed in capabilities.", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + }, + "minItems": 1 + } + }, + "examples": [ + { + "name": "Default result", + "params": [ + { + "name": "capabilities", + "value": [ + "xrn:firebolt:capability:device:model", + "xrn:firebolt:capability:input:keyboard", + "xrn:firebolt:capability:protocol:bluetoothle", + "xrn:firebolt:capability:token:device", + "xrn:firebolt:capability:token:platform", + "xrn:firebolt:capability:protocol:moca", + "xrn:firebolt:capability:wifi:scan", + "xrn:firebolt:capability:localization:postal-code", + "xrn:firebolt:capability:localization:locality" + ] + } + ], + "result": { + "name": "Default Result", + "value": [ + { + "capability": "xrn:firebolt:capability:device:model", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + }, + { + "capability": "xrn:firebolt:capability:input:keyboard", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + }, + { + "capability": "xrn:firebolt:capability:protocol:bluetoothle", + "supported": false, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unsupported" + ] + }, + { + "capability": "xrn:firebolt:capability:token:device", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + }, + { + "capability": "xrn:firebolt:capability:token:platform", + "supported": true, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unavailable" + ] + }, + { + "capability": "xrn:firebolt:capability:protocol:moca", + "supported": true, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "disabled", + "unavailable" + ] + }, + { + "capability": "xrn:firebolt:capability:wifi:scan", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unpermitted" + ] + }, + { + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": null + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "ungranted" + ] + }, + { + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "ungranted" + ] + }, + { + "capability": "xrn:firebolt:capability:localization:locality", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "grantDenied", + "ungranted" + ] + } + ] + } + } + ] + }, + { + "name": "Capabilities.request", + "summary": "Requests grants for all capability/role combinations in the roles array.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:request" + ] + } + ], + "params": [ + { + "name": "grants", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/Permission" + }, + "minItems": 1 + } + } + ], + "result": { + "name": "request", + "summary": "Returns an array of CapabilityInfo objects for the passed in capabilities.", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + }, + "minItems": 1 + } + }, + "examples": [ + { + "name": "Default result", + "params": [ + { + "name": "grants", + "value": [ + { + "role": "use", + "capability": "xrn:firebolt:capability:commerce:purchase" + } + ] + } + ], + "result": { + "name": "Default Result", + "value": [ + { + "capability": "xrn:firebolt:capability:commerce:purchase", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + } + ] + } + } + ] + }, + { + "name": "Capabilities.onAvailable", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "summary": "Listens for all App permitted capabilities to become available.", + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "Provides the capability info.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + } + ] + } + }, + "examples": [ + { + "name": "Platform token is available", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:token:platform" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default result", + "value": { + "capability": "xrn:firebolt:capability:token:platform", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unpermitted" + ] + } + } + } + ] + }, + { + "name": "Capabilities.onUnavailable", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "summary": "Listens for all App permitted capabilities to become unavailable.", + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "Provides the capability info.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + } + ] + } + }, + "examples": [ + { + "name": "Platform token is unavailable.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:token:platform" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "capability": "xrn:firebolt:capability:token:platform", + "supported": true, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unavailable" + ] + } + } + } + ] + }, + { + "name": "Capabilities.onGranted", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "summary": "Listens for all App permitted capabilities to become granted.", + "params": [ + { + "name": "role", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Role" + } + }, + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "Provides the capability info.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + } + ] + } + }, + "examples": [ + { + "name": "Postal code granted", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + } + } + } + ] + }, + { + "name": "Capabilities.onRevoked", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "summary": "Listens for all App permitted capabilities to become revoked.", + "params": [ + { + "name": "role", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Role" + } + }, + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "Provides the capability info.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + } + ] + } + }, + "examples": [ + { + "name": "Postal code revoked", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "grantDenied" + ] + } + } + } + ] + }, + { + "name": "Device.id", + "summary": "Get the platform back-office device identifier", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:id" + ] + } + ], + "result": { + "name": "id", + "summary": "the id", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "123" + } + } + ] + }, + { + "name": "Device.distributor", + "summary": "Get the name of the entity which is distributing the current device. There can be multiple distributors which distribute the same device model.", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:distributor" + ] + } + ], + "result": { + "name": "distributorId", + "summary": "the distributor ID", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the distributor ID", + "params": [], + "result": { + "name": "Default Result", + "value": "Company" + } + } + ] + }, + { + "name": "Device.platform", + "summary": "Get a platform identifier for the device. This API should be used to correlate metrics on the device only and cannot be guaranteed to have consistent responses across platforms.", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "platformId", + "summary": "the platform ID", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the platform ID", + "params": [], + "result": { + "name": "Default Result", + "value": "WPE" + } + } + ] + }, + { + "name": "Device.uid", + "summary": "Gets a unique id for the current app & device", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:uid" + ] + } + ], + "result": { + "name": "uniqueId", + "summary": "a unique ID", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the unique ID", + "params": [], + "result": { + "name": "Default Result", + "value": "ee6723b8-7ab3-462c-8d93-dbf61227998e" + } + } + ] + }, + { + "name": "Device.type", + "summary": "Get the device type", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "deviceType", + "summary": "the device type", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the device type", + "params": [], + "result": { + "name": "Default Result", + "value": "STB" + } + } + ] + }, + { + "name": "Device.model", + "summary": "Get the manufacturer designated model of the device", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:model" + ] + } + ], + "result": { + "name": "model", + "summary": "the device model", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the device model", + "params": [], + "result": { + "name": "Default Result", + "value": "xi6" + } + } + ] + }, + { + "name": "Device.sku", + "summary": "Get the device sku", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:sku" + ] + } + ], + "result": { + "name": "sku", + "summary": "the device sku", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the device sku", + "params": [], + "result": { + "name": "Default Result", + "value": "AX061AEI" + } + } + ] + }, + { + "name": "Device.make", + "summary": "Get the manufacturer of the device model", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:make" + ] + } + ], + "result": { + "name": "make", + "summary": "the device make", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the device make", + "params": [], + "result": { + "name": "Default Result", + "value": "Arris" + } + } + ] + }, + { + "name": "Device.version", + "summary": "Get the SDK, OS and other version info", + "params": [], + "tags": [ + { + "name": "exclude-from-sdk" + }, + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "versions", + "summary": "the versions", + "schema": { + "$ref": "#/components/schemas/DeviceVersion" + } + }, + "examples": [ + { + "name": "Getting the os and sdk versions", + "params": [], + "result": { + "name": "Default Result", + "value": { + "sdk": { + "major": 0, + "minor": 8, + "patch": 0, + "readable": "Firebolt JS SDK v0.8.0" + }, + "api": { + "major": 0, + "minor": 8, + "patch": 0, + "readable": "Firebolt API v0.8.0" + }, + "firmware": { + "major": 1, + "minor": 2, + "patch": 3, + "readable": "Device Firmware v1.2.3" + }, + "os": { + "major": 0, + "minor": 1, + "patch": 0, + "readable": "Firebolt OS v0.1.0" + }, + "debug": "Non-parsable build info for error logging only." + } + } + } + ] + }, + { + "name": "Device.hdcp", + "summary": "Get the negotiated HDCP profiles for a connected device. \n\n For devices that do not require additional connections (e.g. panels), `true` will be returned for all profiles.", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "negotiatedHdcpVersions", + "summary": "the negotiated HDCP versions", + "schema": { + "$ref": "#/components/schemas/HDCPVersionMap" + } + }, + "examples": [ + { + "name": "Getting the negotiated HDCP versions", + "params": [], + "result": { + "name": "Default Result", + "value": { + "hdcp1.4": true, + "hdcp2.2": true + } + } + } + ] + }, + { + "name": "Device.hdr", + "summary": "Get the negotiated HDR formats for the connected display and device", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "negotiatedHdrFormats", + "summary": "the negotiated HDR formats", + "schema": { + "$ref": "#/components/schemas/HDRFormatMap" + } + }, + "examples": [ + { + "name": "Getting the negotiated HDR formats", + "params": [], + "result": { + "name": "Default Result", + "value": { + "hdr10": true, + "hdr10Plus": true, + "dolbyVision": true, + "hlg": true + } + } + } + ] + }, + { + "name": "Device.audio", + "summary": "Get the supported audio profiles for the connected devices. \n\n It is not recommended to use this API for visual badging on content within your app since this does not reflect the settings of the user.", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "supportedAudioProfiles", + "summary": "the supported audio profiles", + "schema": { + "$ref": "#/components/schemas/AudioProfiles" + } + }, + "examples": [ + { + "name": "Getting the supported audio profiles", + "params": [], + "result": { + "name": "Default Result", + "value": { + "stereo": true, + "dolbyDigital5.1": true, + "dolbyDigital5.1+": true, + "dolbyAtmos": true + } + } + } + ] + }, + { + "name": "Device.screenResolution", + "summary": "Get the resolution for the graphical surface of the app. \n\nThe pairs returned will be of a [width, height] format and will correspond to the following values: \n\nNTSC Standard Definition (SD): [720, 480] \n\nPAL Standard Definition (SD): [720, 576] \n\nHigh Definition (HD): [1280, 720] \n\nFull HD (FHD): [1920, 1080]\n\n4K Ultra High Definition (UHD): [3840, 2160] \n\n**Deprecated:** Use non-Firebolt APIs specific to your platform, e.g. W3C APIs", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + }, + { + "name": "deprecated", + "x-alternative": "Use non-Firebolt APIs specific to your platform, e.g. W3C APIs", + "x-since": "1.4.0" + } + ], + "result": { + "name": "screenResolution", + "summary": "the resolution", + "schema": { + "$ref": "#/components/schemas/Resolution" + } + }, + "examples": [ + { + "name": "Getting the screen resolution", + "params": [], + "result": { + "name": "Default Result", + "value": [ + 1920, + 1080 + ] + } + } + ] + }, + { + "name": "Device.videoResolution", + "summary": "Get the maximum supported video resolution of the currently connected device and display. \n\nThe pairs returned will be of a [width, height] format and will correspond to the following values: \n\nNTSC Standard Definition (SD): [720, 480] \n\nPAL Standard Definition (SD): [720, 576] \n\nHigh Definition (HD): [1280, 720] \n\nFull HD (FHD): [1920, 1080]\n\n4K Ultra High Definition (UHD): [3840, 2160]", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "videoResolution", + "summary": "the resolution", + "schema": { + "$ref": "#/components/schemas/Resolution" + } + }, + "examples": [ + { + "name": "Getting the video resolution", + "params": [], + "result": { + "name": "Default Result", + "value": [ + 1920, + 1080 + ] + } + } + ] + }, + { + "name": "Device.name", + "summary": "The human readable name of the device", + "params": [], + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:name" + ] + } + ], + "result": { + "name": "value", + "summary": "the device friendly-name", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "Living Room" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "Kitchen" + } + } + ] + }, + { + "name": "Device.onDeviceNameChanged", + "tags": [ + { + "name": "event" + }, + { + "name": "deprecated", + "x-since": "0.6.0", + "x-alternative": "Device.name()" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:name" + ] + } + ], + "summary": "Get the human readable name of the device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "the device friendly-name", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "string" + } + ] + } + }, + "examples": [ + { + "name": "Getting the device name", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Living Room" + } + } + ] + }, + { + "name": "Device.network", + "summary": "Get the current network status and type", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:network:status" + ] + } + ], + "result": { + "name": "networkInfo", + "summary": "the status and type", + "schema": { + "$ref": "#/components/schemas/NetworkInfoResult" + } + }, + "examples": [ + { + "name": "Getting the network info", + "params": [], + "result": { + "name": "Default Result", + "value": { + "state": "connected", + "type": "wifi" + } + } + } + ] + }, + { + "name": "Device.onNameChanged", + "summary": "The human readable name of the device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.name" + }, + { + "name": "event", + "x-alternative": "name" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:name" + ] + } + ], + "result": { + "name": "value", + "summary": "the device friendly-name", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "string" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Living Room" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Kitchen" + } + } + ] + }, + { + "name": "Device.onHdcpChanged", + "summary": "Get the negotiated HDCP profiles for a connected device. \n\n For devices that do not require additional connections (e.g. panels), `true` will be returned for all profiles.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.hdcp" + }, + { + "name": "event", + "x-alternative": "hdcp" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "negotiatedHdcpVersions", + "summary": "the negotiated HDCP versions", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/HDCPVersionMap" + } + ] + } + }, + "examples": [ + { + "name": "Getting the negotiated HDCP versions", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "hdcp1.4": true, + "hdcp2.2": true + } + } + } + ] + }, + { + "name": "Device.onHdrChanged", + "summary": "Get the negotiated HDR formats for the connected display and device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.hdr" + }, + { + "name": "event", + "x-alternative": "hdr" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "negotiatedHdrFormats", + "summary": "the negotiated HDR formats", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/HDRFormatMap" + } + ] + } + }, + "examples": [ + { + "name": "Getting the negotiated HDR formats", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "hdr10": true, + "hdr10Plus": true, + "dolbyVision": true, + "hlg": true + } + } + } + ] + }, + { + "name": "Device.onAudioChanged", + "summary": "Get the supported audio profiles for the connected devices. \n\n It is not recommended to use this API for visual badging on content within your app since this does not reflect the settings of the user.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.audio" + }, + { + "name": "event", + "x-alternative": "audio" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "supportedAudioProfiles", + "summary": "the supported audio profiles", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/AudioProfiles" + } + ] + } + }, + "examples": [ + { + "name": "Getting the supported audio profiles", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "stereo": true, + "dolbyDigital5.1": true, + "dolbyDigital5.1+": true, + "dolbyAtmos": true + } + } + } + ] + }, + { + "name": "Device.onScreenResolutionChanged", + "summary": "Get the resolution for the graphical surface of the app. \n\nThe pairs returned will be of a [width, height] format and will correspond to the following values: \n\nNTSC Standard Definition (SD): [720, 480] \n\nPAL Standard Definition (SD): [720, 576] \n\nHigh Definition (HD): [1280, 720] \n\nFull HD (FHD): [1920, 1080]\n\n4K Ultra High Definition (UHD): [3840, 2160] \n\n**Deprecated:** Use non-Firebolt APIs specific to your platform, e.g. W3C APIs", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.screenResolution" + }, + { + "name": "event", + "x-alternative": "screenResolution" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + }, + { + "name": "deprecated", + "x-alternative": "Use non-Firebolt APIs specific to your platform, e.g. W3C APIs", + "x-since": "1.4.0" + } + ], + "result": { + "name": "screenResolution", + "summary": "the resolution", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/Resolution" + } + ] + } + }, + "examples": [ + { + "name": "Getting the screen resolution", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + 1920, + 1080 + ] + } + } + ] + }, + { + "name": "Device.onVideoResolutionChanged", + "summary": "Get the maximum supported video resolution of the currently connected device and display. \n\nThe pairs returned will be of a [width, height] format and will correspond to the following values: \n\nNTSC Standard Definition (SD): [720, 480] \n\nPAL Standard Definition (SD): [720, 576] \n\nHigh Definition (HD): [1280, 720] \n\nFull HD (FHD): [1920, 1080]\n\n4K Ultra High Definition (UHD): [3840, 2160]", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.videoResolution" + }, + { + "name": "event", + "x-alternative": "videoResolution" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "videoResolution", + "summary": "the resolution", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/Resolution" + } + ] + } + }, + "examples": [ + { + "name": "Getting the video resolution", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + 1920, + 1080 + ] + } + } + ] + }, + { + "name": "Device.onNetworkChanged", + "summary": "Get the current network status and type", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.network" + }, + { + "name": "event", + "x-alternative": "network" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:network:status" + ] + } + ], + "result": { + "name": "networkInfo", + "summary": "the status and type", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/NetworkInfoResult" + } + ] + } + }, + "examples": [ + { + "name": "Getting the network info", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "connected", + "type": "wifi" + } + } + } + ] + }, + { + "name": "Discovery.policy", + "summary": "get the discovery policy", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:policy" + ] + } + ], + "result": { + "name": "policy", + "summary": "discovery policy opt-in/outs", + "schema": { + "$ref": "#/components/schemas/DiscoveryPolicy" + } + }, + "examples": [ + { + "name": "Getting the discovery policy", + "params": [], + "result": { + "name": "Default Result", + "value": { + "enableRecommendations": true, + "shareWatchHistory": true, + "rememberWatchedPrograms": true + } + } + } + ] + }, + { + "name": "Discovery.entityInfo", + "tags": [ + { + "name": "polymorphic-pull" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:entity-info" + }, + { + "name": "deprecated" + } + ], + "summary": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow.", + "description": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow. Includes information about the program entity and its relevant associated entities, such as extras, previews, and, in the case of TV series, seasons and episodes.\n\nSee the `EntityInfo` and `WayToWatch` data structures below for more information.\n\nThe app only needs to implement Pull support for `entityInfo` at this time.", + "params": [ + { + "name": "correlationId", + "required": true, + "schema": { + "type": [ + "string", + "null" + ] + } + }, + { + "name": "result", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/EntityInfoResult" + }, + "summary": "The entityInfo data." + } + ], + "result": { + "name": "success", + "summary": "True if the push operation is successful", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send entity info for a movie to the platform.", + "params": [ + { + "name": "correlationId", + "value": null + }, + { + "name": "result", + "value": { + "expires": "2025-01-01T00:00:00.000Z", + "entity": { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": [ + "UHD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ], + "subtitles": [ + "es" + ], + "audioDescriptions": [ + "en" + ] + } + ] + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send entity info for a movie with a trailer to the platform.", + "params": [ + { + "name": "correlationId", + "value": null + }, + { + "name": "result", + "value": { + "expires": "2025-01-01T00:00:00.000Z", + "entity": { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": [ + "UHD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ], + "subtitles": [ + "es" + ], + "audioDescriptions": [ + "en" + ] + } + ] + }, + "related": [ + { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "preview", + "title": "Cool Runnings Trailer", + "waysToWatch": [ + { + "identifiers": { + "assetId": "123111", + "entityId": "345" + }, + "entitled": true, + "videoQuality": [ + "HD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ] + } + ] + } + ] + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send entity info for a TV Series with seasons and episodes to the platform.", + "params": [ + { + "name": "correlationId", + "value": null + }, + { + "name": "result", + "value": { + "expires": "2025-01-01T00:00:00.000Z", + "entity": { + "identifiers": { + "entityId": "98765" + }, + "entityType": "program", + "programType": "series", + "title": "Perfect Strangers", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1986-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ] + }, + "related": [ + { + "identifiers": { + "entityId": "111", + "seriesId": "98765" + }, + "entityType": "program", + "programType": "season", + "seasonNumber": 1, + "title": "Perfect Strangers Season 3", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "556", + "entityId": "111", + "seriesId": "98765" + }, + "entitled": true, + "offeringType": "free", + "videoQuality": [ + "SD" + ], + "audioProfile": [ + "stereo" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ] + } + ] + }, + { + "identifiers": { + "entityId": "111", + "seriesId": "98765" + }, + "entityType": "program", + "programType": "episode", + "seasonNumber": 1, + "episodeNumber": 1, + "title": "Knock Knock, Who's There?", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1986-03-25T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "556", + "entityId": "111", + "seriesId": "98765" + }, + "entitled": true, + "offeringType": "free", + "videoQuality": [ + "SD" + ], + "audioProfile": [ + "stereo" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ] + } + ] + }, + { + "identifiers": { + "entityId": "112", + "seriesId": "98765" + }, + "entityType": "program", + "programType": "episode", + "seasonNumber": 1, + "episodeNumber": 2, + "title": "Picture This", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1986-04-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "557", + "entityId": "112", + "seriesId": "98765" + }, + "entitled": true, + "offeringType": "free", + "videoQuality": [ + "SD" + ], + "audioProfile": [ + "stereo" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ] + } + ] + } + ] + } + } + ], + "result": { + "name": "result", + "value": true + } + } + ] + }, + { + "name": "Discovery.purchasedContent", + "tags": [ + { + "name": "polymorphic-pull" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:purchased-content" + }, + { + "name": "deprecated" + } + ], + "summary": "Provide a list of purchased content for the authenticated account, such as rentals and electronic sell through purchases.", + "params": [ + { + "name": "correlationId", + "required": true, + "schema": { + "type": [ + "string", + "null" + ] + } + }, + { + "name": "result", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/PurchasedContentResult" + }, + "summary": "The data for the purchasedContent" + } + ], + "result": { + "name": "success", + "summary": "True if the push operation is successful", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Inform the platform of the user's purchased content", + "params": [ + { + "name": "correlationId", + "value": null + }, + { + "name": "result", + "value": { + "totalCount": 10, + "expires": "2025-01-01T00:00:00.000Z", + "entries": [ + { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": [ + "UHD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ], + "subtitles": [ + "es" + ], + "audioDescriptions": [ + "en" + ] + } + ] + } + ] + } + } + ], + "result": { + "name": "success", + "value": true + } + } + ], + "description": "Return content purchased by the user, such as rentals and electronic sell through purchases.\n\nThe app should return the user's 100 most recent purchases in `entries`. The total count of purchases must be provided in `count`. If `count` is greater than the total number of `entries`, the UI may provide a link into the app to see the complete purchase list.\n\nThe `EntityInfo` object returned is not required to have `waysToWatch` populated, but it is recommended that it do so in case the UI wants to surface additional information on the purchases screen.\n\nThe app should implement both Push and Pull methods for `purchasedContent`.\n\nThe app should actively push `purchasedContent` when:\n\n* The app becomes Active.\n* When the state of the purchasedContent set has changed.\n* The app goes into Inactive or Background state, if there is a chance a change event has been missed." + }, + { + "name": "Discovery.watched", + "summary": "Notify the platform that content was partially or completely watched", + "tags": [ + { + "name": "polymorphic-reducer" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:watched" + ] + } + ], + "params": [ + { + "name": "entityId", + "required": true, + "schema": { + "type": "string" + }, + "summary": "The entity Id of the watched content." + }, + { + "name": "progress", + "summary": "How much of the content has been watched (percentage as (0-0.999) for VOD, number of seconds for live)", + "schema": { + "type": "number", + "minimum": 0 + } + }, + { + "name": "completed", + "summary": "Whether or not this viewing is considered \"complete,\" per the app's definition thereof", + "schema": { + "type": "boolean" + } + }, + { + "name": "watchedOn", + "summary": "Date/Time the content was watched, ISO 8601 Date/Time", + "schema": { + "type": "string", + "format": "date-time" + } + } + ], + "result": { + "name": "success", + "summary": "whether the call was successful or not", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Notifying the platform of watched content", + "params": [ + { + "name": "entityId", + "value": "partner.com/entity/123" + }, + { + "name": "progress", + "value": 0.95 + }, + { + "name": "completed", + "value": true + }, + { + "name": "watchedOn", + "value": "2021-04-23T18:25:43.511Z" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.watchNext", + "summary": "Suggest a call-to-action for this app on the platform home screen", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:watch-next" + ] + } + ], + "params": [ + { + "name": "title", + "summary": "The title of this call to action", + "schema": { + "$ref": "#/x-schemas/Types/LocalizedString" + }, + "required": true + }, + { + "name": "identifiers", + "summary": "A set of content identifiers for this call to action", + "schema": { + "$ref": "#/x-schemas/Entertainment/ContentIdentifiers" + }, + "required": true + }, + { + "name": "expires", + "summary": "When this call to action should no longer be presented to users", + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "images", + "summary": "A set of images for this call to action", + "schema": { + "type": "object", + "patternProperties": { + "^.*$": { + "$ref": "#/x-schemas/Types/LocalizedString" + } + } + } + } + ], + "result": { + "name": "success", + "summary": "whether the call was successful or not", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Suggest a watch-next tile for the home screen", + "params": [ + { + "name": "title", + "value": "A Cool Show" + }, + { + "name": "identifiers", + "value": { + "entityId": "partner.com/entity/123" + } + }, + { + "name": "expires", + "value": "2021-04-23T18:25:43.511Z" + }, + { + "name": "images", + "value": { + "3x4": { + "en-US": "https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg", + "es": "https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg" + }, + "16x9": { + "en": "https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Suggest a watch-next tile for the home screen", + "params": [ + { + "name": "title", + "value": "A Fantastic Show" + }, + { + "name": "identifiers", + "value": { + "entityId": "partner.com/entity/456" + } + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.entitlements", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:content-access" + ] + }, + { + "name": "deprecated", + "x-since": "0.10.0", + "x-alternative": "Discovery.contentAccess()" + } + ], + "summary": "Inform the platform of the users latest entitlements w/in this app.", + "params": [ + { + "name": "entitlements", + "summary": "Array of entitlement objects", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/Entitlement" + } + }, + "required": true + } + ], + "result": { + "name": "success", + "summary": "whether the call was successful or not", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Update user's entitlements", + "params": [ + { + "name": "entitlements", + "value": [ + { + "entitlementId": "partner.com/entitlement/123", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + }, + { + "entitlementId": "partner.com/entitlement/456", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + } + ] + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.contentAccess", + "summary": "Inform the platform of what content the user can access either by discovering it or consuming it. Availabilities determine which content is discoverable to a user, while entitlements determine if the user can currently consume that content. Content can be available but not entitled, this means that user can see the content but when they try to open it they must gain an entitlement either through purchase or subscription upgrade. In case the access changed off-device, this API should be called any time the app comes to the foreground to refresh the access. This API should also be called any time the availabilities or entitlements change within the app for any reason. Typical reasons may include the user signing into an account or upgrading a subscription. Less common cases can cause availabilities to change, such as moving to a new service location. When availabilities or entitlements are removed from the subscriber (such as when the user signs out), then an empty array should be given. To clear both, use the Discovery.clearContentAccess convenience API.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:content-access" + ] + } + ], + "params": [ + { + "name": "ids", + "summary": "A list of identifiers that represent content that is discoverable or consumable for the subscriber", + "schema": { + "$ref": "#/components/schemas/ContentAccessIdentifiers" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Update subscriber's availabilities", + "params": [ + { + "name": "ids", + "value": { + "availabilities": [ + { + "type": "channel-lineup", + "id": "partner.com/availability/123", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + }, + { + "type": "channel-lineup", + "id": "partner.com/availability/456", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + } + ] + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Update subscriber's availabilities and entitlements", + "params": [ + { + "name": "ids", + "value": { + "availabilities": [ + { + "type": "channel-lineup", + "id": "partner.com/availability/123", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + }, + { + "type": "channel-lineup", + "id": "partner.com/availability/456", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + } + ], + "entitlements": [ + { + "entitlementId": "123", + "startTime": "2025-01-01T00:00:00.000Z", + "endTime": "2025-01-01T00:00:00.000Z" + } + ] + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Update subscriber's entitlements", + "params": [ + { + "name": "ids", + "value": { + "entitlements": [ + { + "entitlementId": "123", + "startTime": "2025-01-01T00:00:00.000Z", + "endTime": "2025-01-01T00:00:00.000Z" + } + ] + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Clear a subscriber's entitlements", + "params": [ + { + "name": "ids", + "value": { + "entitlements": [] + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Clear a subscriber's availabilities", + "params": [ + { + "name": "ids", + "value": { + "availabilities": [] + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Discovery.clearContentAccess", + "summary": "Clear both availabilities and entitlements from the subscriber. This is equivalent of calling `Discovery.contentAccess({ availabilities: [], entitlements: []})`. This is typically called when the user signs out of an account.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:content-access" + ] + } + ], + "params": [], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Clear subscriber's availabilities and entitlements", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Discovery.launch", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:launch" + ] + } + ], + "summary": "Launch or foreground the specified app, and optionally instructs it to navigate to the specified user action. \n For the Primary Experience, the appId can be any one of: \n\n - xrn:firebolt:application-type:main \n\n - xrn:firebolt:application-type:settings", + "params": [ + { + "name": "appId", + "required": true, + "summary": "The durable app Id of the app to launch", + "schema": { + "type": "string" + } + }, + { + "name": "intent", + "required": false, + "summary": "An optional `NavigationIntent` with details about what part of the app to show first, and context around how/why it was launched", + "schema": { + "$ref": "#/x-schemas/Intents/NavigationIntent" + } + } + ], + "result": { + "name": "success", + "summary": "whether the call was successful or not", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Launch the 'Foo' app to it's home screen.", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "intent", + "value": { + "action": "home", + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the 'Foo' app to it's own page for a specific entity.", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "intent", + "value": { + "action": "entity", + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "example-movie-id" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the 'Foo' app to a fullscreen playback experience for a specific entity.", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "intent", + "value": { + "action": "playback", + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "example-movie-id" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to a global page for a specific entity.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main" + }, + { + "name": "intent", + "value": { + "action": "entity", + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "example-movie-id" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to a global page for the company / partner with the ID 'foo'.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main" + }, + { + "name": "intent", + "value": { + "action": "section", + "data": { + "sectionName": "company:foo" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to it's home screen, as if the Home remote button was pressed.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main" + }, + { + "name": "intent", + "value": { + "action": "home", + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to it's search screen.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main" + }, + { + "name": "intent", + "value": { + "action": "search", + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to it's settings screen.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:settings" + }, + { + "name": "intent", + "value": { + "action": "section", + "data": { + "sectionName": "settings" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to it's linear/epg guide.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main" + }, + { + "name": "intent", + "value": { + "action": "section", + "data": { + "sectionName": "guide" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to the App Store details page for a specific app with the ID 'foo'.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main " + }, + { + "name": "intent", + "value": { + "action": "section", + "data": { + "sectionName": "app:foo" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.onNavigateTo", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:navigate-to" + ] + } + ], + "summary": "listen to `navigateTo` events", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "An object describing where in the app the user intends to navigate to", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Intents/NavigationIntent" + } + ] + } + }, + "examples": [ + { + "name": "Listening for `navigateTo` events", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "event", + "value": { + "action": "search", + "data": { + "query": "a cool show" + }, + "context": { + "campaign": "unknown", + "source": "voice" + } + } + } + } + ] + }, + { + "name": "Discovery.signIn", + "tags": [ + { + "name": "calls-metrics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:sign-in-status" + ] + } + ], + "summary": "Inform the platform that your user is signed in, for increased visibility in search & discovery. Sign-in state is used separately from what content can be access through entitlements and availabilities. Sign-in state may be used when deciding whether to choose this app to handle a user intent. For instance, if the user tries to launch something generic like playing music from an artist, only a signed-in app will be chosen. If the user wants to tune to a channel, only a signed-in app will be chosen to handle that intent. While signIn can optionally include entitlements as those typically change at signIn time, it is recommended to make a separate call to Discovery.contentAccess for entitlements. signIn is not only for when a user explicitly enters login credentials. If an app does not require any credentials from the user to consume content, such as in a free app, then the app should call signIn immediately on launch.", + "params": [ + { + "name": "entitlements", + "summary": "Optional array of Entitlements, in case of a different user account, or a long time since last sign-in.", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/Entitlement" + } + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send signIn metric", + "params": [], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send signIn notification with entitlements", + "params": [ + { + "name": "entitlements", + "value": [ + { + "entitlementId": "123", + "startTime": "2025-01-01T00:00:00.000Z", + "endTime": "2025-01-01T00:00:00.000Z" + } + ] + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.signOut", + "tags": [ + { + "name": "calls-metrics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:sign-in-status" + ] + } + ], + "summary": "Inform the platform that your user has signed out. See `Discovery.signIn` for more details on how the sign-in state is used.signOut will NOT clear entitlements, the app should make a separate call to Discovery.clearContentAccess. Apps should also call signOut when a login token has expired and the user is now in a signed-out state.", + "params": [], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send signOut notification", + "params": [], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.userInterest", + "summary": "Send an entity that the user has expressed interest in to the platform.", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest" + } + ], + "params": [ + { + "name": "type", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/InterestType" + } + }, + { + "name": "reason", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/InterestReason" + } + }, + { + "name": "entity", + "required": true, + "schema": { + "$ref": "#/x-schemas/Entity/EntityDetails" + } + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "type", + "value": "interest" + }, + { + "name": "reason", + "value": "playlist" + }, + { + "name": "entity", + "value": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": {} + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Discovery.onRequestUserInterest", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response-name": "entity", + "x-response": { + "$ref": "#/x-schemas/Entity/EntityDetails", + "examples": [ + { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + ] + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest" + } + ], + "summary": "Provide information about the entity currently displayed or selected on the screen.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "request", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "object", + "required": [ + "correlationId", + "parameters" + ], + "properties": { + "correlationId": { + "type": "string" + }, + "parameters": { + "$ref": "#/components/schemas/UserInterestProviderParameters" + } + }, + "additionalProperties": false + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "request", + "value": { + "correlationId": "xyz", + "parameters": { + "type": "interest", + "reason": "playlist" + } + } + } + } + ] + }, + { + "name": "Discovery.onPolicyChanged", + "summary": "get the discovery policy", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Discovery.policy" + }, + { + "name": "event", + "x-alternative": "policy" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:policy" + ] + } + ], + "result": { + "name": "policy", + "summary": "discovery policy opt-in/outs", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/DiscoveryPolicy" + } + ] + } + }, + "examples": [ + { + "name": "Getting the discovery policy", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "enableRecommendations": true, + "shareWatchHistory": true, + "rememberWatchedPrograms": true + } + } + } + ] + }, + { + "name": "Discovery.onPullEntityInfo", + "tags": [ + { + "name": "polymorphic-pull-event" + }, + { + "name": "event", + "x-pulls-for": "entityInfo" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:entity-info" + }, + { + "name": "deprecated" + } + ], + "summary": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow.", + "description": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow. Includes information about the program entity and its relevant associated entities, such as extras, previews, and, in the case of TV series, seasons and episodes.\n\nSee the `EntityInfo` and `WayToWatch` data structures below for more information.\n\nThe app only needs to implement Pull support for `entityInfo` at this time.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "request", + "summary": "A EntityInfoFederatedRequest object.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/EntityInfoFederatedRequest" + } + ] + } + }, + "examples": [ + { + "name": "Send entity info for a movie to the platform.", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": { + "correlationId": "xyz", + "parameters": { + "entityId": "345" + } + } + } + }, + { + "name": "Send entity info for a movie with a trailer to the platform.", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": { + "correlationId": "xyz", + "parameters": { + "entityId": "345" + } + } + } + }, + { + "name": "Send entity info for a TV Series with seasons and episodes to the platform.", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": { + "correlationId": "xyz", + "parameters": { + "entityId": "345" + } + } + } + } + ] + }, + { + "name": "Discovery.onPullPurchasedContent", + "tags": [ + { + "name": "polymorphic-pull-event" + }, + { + "name": "event", + "x-pulls-for": "purchasedContent" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:purchased-content" + }, + { + "name": "deprecated" + } + ], + "summary": "Provide a list of purchased content for the authenticated account, such as rentals and electronic sell through purchases.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "request", + "summary": "A PurchasedContentFederatedRequest object.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/PurchasedContentFederatedRequest" + } + ] + } + }, + "examples": [ + { + "name": "Inform the platform of the user's purchased content", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": { + "correlationId": "xyz", + "parameters": { + "limit": 100 + } + } + } + } + ], + "description": "Return content purchased by the user, such as rentals and electronic sell through purchases.\n\nThe app should return the user's 100 most recent purchases in `entries`. The total count of purchases must be provided in `count`. If `count` is greater than the total number of `entries`, the UI may provide a link into the app to see the complete purchase list.\n\nThe `EntityInfo` object returned is not required to have `waysToWatch` populated, but it is recommended that it do so in case the UI wants to surface additional information on the purchases screen.\n\nThe app should implement both Push and Pull methods for `purchasedContent`.\n\nThe app should actively push `purchasedContent` when:\n\n* The app becomes Active.\n* When the state of the purchasedContent set has changed.\n* The app goes into Inactive or Background state, if there is a chance a change event has been missed." + }, + { + "name": "Discovery.userInterestResponse", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest", + "x-response-for": "Discovery.onRequestUserInterest" + } + ], + "summary": "Internal API for .onRequestUserInterest Provider to send back response.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "$ref": "#/x-schemas/Entity/EntityDetails", + "examples": [ + { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + ] + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Discovery.userInterestError", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest", + "x-error-for": "Discovery.onRequestUserInterest" + } + ], + "summary": "Internal API for .onRequestUserInterest Provider to send back error.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Internal.initialize", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:initialize" + ] + } + ], + "summary": "Initialize the SDK / FEE session.", + "description": "A single version of the Firebolt SDK is compiled into each app. When an app starts up, the SDK **MUST** call this method as soon as possible and **before** any other JSON-RPC methods are sent.", + "params": [ + { + "name": "version", + "required": true, + "schema": { + "$ref": "#/x-schemas/Types/SemanticVersion" + }, + "summary": "The semantic version of the SDK." + } + ], + "result": { + "name": "session", + "summary": "Info about the SDK/FEE session", + "schema": { + "$ref": "#/components/schemas/InitializeResult" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "version", + "value": { + "major": 1, + "minor": 0, + "patch": 0, + "readable": "Firebolt SDK 1.0.0" + } + } + ], + "result": { + "name": "Default Result", + "value": { + "version": { + "major": 1, + "minor": 0, + "patch": 0, + "readable": "Firebolt FEE 1.0.0" + } + } + } + } + ] + }, + { + "name": "Keyboard.email", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Keyboard.onRequestEmail", + "x-uses": [ + "xrn:firebolt:capability:input:keyboard" + ], + "x-allow-focus": true + } + ], + "summary": "Prompt the user for their email address with a simplified list of choices.", + "params": [ + { + "name": "type", + "summary": "Why the email is being requested, e.g. sign on or sign up", + "required": true, + "schema": { + "$ref": "#/components/schemas/EmailUsage" + } + }, + { + "name": "message", + "summary": "The message to display while prompting", + "required": false, + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "email", + "summary": "the selected or entered email", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Prompt the user to select or type an email address", + "params": [ + { + "name": "type", + "value": "signIn" + }, + { + "name": "message", + "value": "Enter your email to sign into this app" + } + ], + "result": { + "name": "Default Result", + "value": "user@domain.com" + } + }, + { + "name": "Prompt the user to type an email address to sign up", + "params": [ + { + "name": "type", + "value": "signUp" + }, + { + "name": "message", + "value": "Enter your email to sign up for this app" + } + ], + "result": { + "name": "Default Result", + "value": "user@domain.com" + } + } + ] + }, + { + "name": "Keyboard.password", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Keyboard.onRequestPassword", + "x-uses": [ + "xrn:firebolt:capability:input:keyboard" + ], + "x-allow-focus": true + } + ], + "summary": "Show the password entry keyboard, with typing obfuscated from visibility", + "params": [ + { + "name": "message", + "summary": "The message to display while prompting", + "required": false, + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "value", + "summary": "the selected or entered password", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Prompt the user to enter their password", + "params": [ + { + "name": "message", + "value": "Enter your password" + } + ], + "result": { + "name": "Default Result", + "value": "abc123" + } + } + ] + }, + { + "name": "Keyboard.standard", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Keyboard.onRequestStandard", + "x-uses": [ + "xrn:firebolt:capability:input:keyboard" + ], + "x-allow-focus": true + } + ], + "summary": "Show the standard platform keyboard, and return the submitted value", + "params": [ + { + "name": "message", + "summary": "The message to display while prompting", + "required": true, + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "value", + "summary": "the selected or entered text", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Prompt the user for an arbitrary string", + "params": [ + { + "name": "message", + "value": "Enter the name you'd like to associate with this device" + } + ], + "result": { + "name": "Default Result", + "value": "Living Room" + } + } + ] + }, + { + "name": "Lifecycle.ready", + "tags": [ + { + "name": "calls-metrics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:ready" + ] + }, + { + "name": "exclude-from-sdk" + } + ], + "summary": "Notify the platform that the app is ready", + "params": [], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Let the platform know that your app is ready", + "params": [], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Lifecycle.close", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Request that the platform move your app out of focus", + "params": [ + { + "name": "reason", + "summary": "The reason the app is requesting to be closed", + "required": true, + "schema": { + "$ref": "#/x-schemas/Lifecycle/CloseReason" + } + } + ], + "result": { + "name": "success", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Close the app when the user presses back on the app home screen", + "params": [ + { + "name": "reason", + "value": "remoteButton" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Close the app when the user selects an exit menu item", + "params": [ + { + "name": "reason", + "value": "userExit" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Lifecycle.finished", + "tags": [ + { + "name": "exclude-from-sdk" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Notify the platform that the app is done unloading", + "params": [], + "result": { + "name": "results", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Lifecycle.state", + "summary": "Get the current state of the app. This function is **synchronous**.", + "tags": [ + { + "name": "synchronous" + }, + { + "name": "exclude-from-sdk" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "params": [], + "result": { + "name": "state", + "summary": "the current state of the app.", + "schema": { + "$ref": "#/x-schemas/Lifecycle/LifecycleState" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "foreground" + } + } + ] + }, + { + "name": "Lifecycle.onInactive", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the inactive event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/LifecycleEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "inactive", + "previous": "initializing" + } + } + } + ] + }, + { + "name": "Lifecycle.onForeground", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the foreground event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/LifecycleEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "foreground", + "previous": "inactive" + } + } + }, + { + "name": "Move to foreground via remote branded buton", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "value", + "value": { + "state": "foreground", + "previous": "inactive", + "source": "remote" + } + } + } + ] + }, + { + "name": "Lifecycle.onBackground", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the background event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/LifecycleEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "background", + "previous": "foreground" + } + } + } + ] + }, + { + "name": "Lifecycle.onSuspended", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the suspended event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/LifecycleEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "suspended", + "previous": "inactive" + } + } + } + ] + }, + { + "name": "Lifecycle.onUnloading", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the unloading event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/LifecycleEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "unloading", + "previous": "inactive" + } + } + } + ] + }, + { + "name": "Localization.locality", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:locality" + ] + }, + { + "name": "property" + } + ], + "summary": "Get the locality/city the device is located in", + "params": [], + "result": { + "name": "locality", + "summary": "the device city", + "schema": { + "$ref": "#/x-schemas/Localization/Locality" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "Philadelphia" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "Rockville" + } + } + ] + }, + { + "name": "Localization.postalCode", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:postal-code" + ] + } + ], + "summary": "Get the postal code the device is located in", + "params": [], + "result": { + "name": "postalCode", + "summary": "the device postal code", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "19103" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "20850" + } + } + ] + }, + { + "name": "Localization.countryCode", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:country-code" + ] + } + ], + "summary": "Get the ISO 3166-1 alpha-2 code for the country device is located in", + "params": [], + "result": { + "name": "code", + "summary": "the device country code", + "schema": { + "$ref": "#/x-schemas/Localization/CountryCode" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "US" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "UK" + } + } + ] + }, + { + "name": "Localization.language", + "summary": "Get the ISO 639 1/2 code for the preferred language", + "params": [], + "tags": [ + { + "name": "deprecated", + "x-since": "0.17.0", + "x-alternative": "Localization.locale" + }, + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "lang", + "summary": "the device language", + "schema": { + "$ref": "#/x-schemas/Localization/Language" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "en" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "es" + } + } + ] + }, + { + "name": "Localization.preferredAudioLanguages", + "summary": "A prioritized list of ISO 639 1/2 codes for the preferred audio languages on this device.", + "params": [], + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "languages", + "summary": "the preferred audio languages", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": [ + "spa", + "eng" + ] + } + }, + { + "name": "Default Example #2", + "params": [], + "result": { + "name": "Default Result", + "value": [ + "eng", + "spa" + ] + } + } + ] + }, + { + "name": "Localization.locale", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:locale" + ] + } + ], + "summary": "Get the *full* BCP 47 code, including script, region, variant, etc., for the preferred langauage/locale", + "params": [], + "result": { + "name": "locale", + "summary": "the device locale", + "schema": { + "$ref": "#/x-schemas/Localization/Locale" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "en-US" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "es-US" + } + } + ] + }, + { + "name": "Localization.latlon", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:location" + ] + } + ], + "summary": "Get the approximate latitude and longitude coordinates of the device location", + "params": [], + "result": { + "name": "latlong", + "summary": "lat/long tuple", + "schema": { + "$ref": "#/components/schemas/LatLon" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": [ + 39.9549, + 75.1699 + ] + } + } + ] + }, + { + "name": "Localization.additionalInfo", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:additional-info" + ] + } + ], + "summary": "Get any platform-specific localization information", + "params": [], + "result": { + "name": "info", + "summary": "the additional info", + "schema": { + "type": "object", + "additionalProperties": { + "type": [ + "number", + "string", + "boolean" + ], + "maxLength": 1024 + }, + "maxProperties": 32 + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "info", + "value": {} + } + } + ] + }, + { + "name": "Localization.onLocalityChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.locality" + }, + { + "name": "event", + "x-alternative": "locality" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:locality" + ] + } + ], + "summary": "Get the locality/city the device is located in", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "locality", + "summary": "the device city", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/Locality" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Philadelphia" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Rockville" + } + } + ] + }, + { + "name": "Localization.onPostalCodeChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.postalCode" + }, + { + "name": "event", + "x-alternative": "postalCode" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:postal-code" + ] + } + ], + "summary": "Get the postal code the device is located in", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "postalCode", + "summary": "the device postal code", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "string" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "19103" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "20850" + } + } + ] + }, + { + "name": "Localization.onCountryCodeChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.countryCode" + }, + { + "name": "event", + "x-alternative": "countryCode" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:country-code" + ] + } + ], + "summary": "Get the ISO 3166-1 alpha-2 code for the country device is located in", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "code", + "summary": "the device country code", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/CountryCode" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "US" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "UK" + } + } + ] + }, + { + "name": "Localization.onLanguageChanged", + "summary": "Get the ISO 639 1/2 code for the preferred language", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.language" + }, + { + "name": "event", + "x-alternative": "language" + }, + { + "name": "deprecated", + "x-since": "0.17.0", + "x-alternative": "Localization.locale" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "lang", + "summary": "the device language", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/Language" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "en" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "es" + } + } + ] + }, + { + "name": "Localization.onPreferredAudioLanguagesChanged", + "summary": "A prioritized list of ISO 639 1/2 codes for the preferred audio languages on this device.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.preferredAudioLanguages" + }, + { + "name": "event", + "x-alternative": "preferredAudioLanguages" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "languages", + "summary": "the preferred audio languages", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + "spa", + "eng" + ] + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + "eng", + "spa" + ] + } + } + ] + }, + { + "name": "Localization.onLocaleChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.locale" + }, + { + "name": "event", + "x-alternative": "locale" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:locale" + ] + } + ], + "summary": "Get the *full* BCP 47 code, including script, region, variant, etc., for the preferred langauage/locale", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "locale", + "summary": "the device locale", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/Locale" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "en-US" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "es-US" + } + } + ] + }, + { + "name": "Metrics.ready", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform that your app is minimally usable. This method is called automatically by `Lifecycle.ready()`", + "params": [], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send ready metric", + "params": [], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.signIn", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Log a sign in event, called by Discovery.signIn().", + "params": [], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send signIn metric", + "params": [], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send signIn metric with entitlements", + "params": [ + { + "name": "entitlements", + "value": [ + { + "entitlementId": "123", + "startTime": "2025-01-01T00:00:00.000Z", + "endTime": "2025-01-01T00:00:00.000Z" + } + ] + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.signOut", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Log a sign out event, called by Discovery.signOut().", + "params": [], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send signOut metric", + "params": [], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.startContent", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform that your user has started content.", + "params": [ + { + "name": "entityId", + "summary": "Optional entity ID of the content.", + "schema": { + "type": "string" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send startContent metric", + "params": [], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send startContent metric w/ entity", + "params": [ + { + "name": "entityId", + "value": "abc" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.stopContent", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform that your user has stopped content.", + "params": [ + { + "name": "entityId", + "summary": "Optional entity ID of the content.", + "schema": { + "type": "string" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send stopContent metric", + "params": [], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send stopContent metric w/ entity", + "params": [ + { + "name": "entityId", + "value": "abc" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.page", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform that your user has navigated to a page or view.", + "params": [ + { + "name": "pageId", + "summary": "Page ID of the content.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send page metric", + "params": [ + { + "name": "pageId", + "value": "xyz" + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send startContent metric w/ entity", + "params": [ + { + "name": "pageId", + "value": "home" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.action", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform of something not covered by other Metrics APIs.", + "params": [ + { + "name": "category", + "summary": "The category of action being logged. Must be 'user' for user-initated actions or 'app' for all other actions", + "schema": { + "type": "string", + "enum": [ + "user", + "app" + ] + }, + "required": true + }, + { + "name": "type", + "summary": "A short, indexible identifier for the action, e.g. 'SignIn Prompt Displayed'", + "schema": { + "type": "string", + "maxLength": 256 + }, + "required": true + }, + { + "name": "parameters", + "schema": { + "$ref": "#/x-schemas/Types/FlatMap" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send foo action", + "params": [ + { + "name": "category", + "value": "user" + }, + { + "name": "type", + "value": "The user did foo" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.error", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform of an error that has occured in your app.", + "params": [ + { + "name": "type", + "summary": "The type of error", + "schema": { + "$ref": "#/components/schemas/ErrorType" + }, + "required": true + }, + { + "name": "code", + "summary": "an app-specific error code", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "description", + "summary": "A short description of the error", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "visible", + "summary": "Whether or not this error was visible to the user.", + "schema": { + "type": "boolean" + }, + "required": true + }, + { + "name": "parameters", + "summary": "Optional additional parameters to be logged with the error", + "schema": { + "$ref": "#/x-schemas/Types/FlatMap" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send error metric", + "params": [ + { + "name": "type", + "value": "media" + }, + { + "name": "code", + "value": "MEDIA-STALLED" + }, + { + "name": "description", + "value": "playback stalled" + }, + { + "name": "visible", + "value": true + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaLoadStart", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when setting the URL of a media asset to play, in order to infer load time.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send loadstart metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaPlay", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when media playback should start due to autoplay, user-initiated play, or unpausing.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send play metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaPlaying", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when media playback actually starts due to autoplay, user-initiated play, unpausing, or recovering from a buffering interuption.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send playing metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaPause", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when media playback will pause due to an intentional pause operation.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send pause metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaWaiting", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when media playback will halt due to a network, buffer, or other unintentional constraint.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send waiting metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaProgress", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called every 60 seconds as media playback progresses.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "progress", + "summary": "Progress of playback, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration.", + "schema": { + "$ref": "#/components/schemas/MediaPosition" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send progress metric.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "progress", + "value": 0.75 + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaSeeking", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when a seek is initiated during media playback.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "target", + "summary": "Target destination of the seek, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration.", + "schema": { + "$ref": "#/components/schemas/MediaPosition" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send seeking metric.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "target", + "value": 0.5 + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaSeeked", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when a seek is completed during media playback.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "position", + "summary": "Resulting position of the seek operation, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration.", + "schema": { + "$ref": "#/components/schemas/MediaPosition" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send seeked metric.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "position", + "value": 0.51 + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaRateChange", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when the playback rate of media is changed.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "rate", + "summary": "The new playback rate.", + "schema": { + "type": "number" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send ratechange metric.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "rate", + "value": 2 + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaRenditionChange", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when the playback rendition (e.g. bitrate, dimensions, profile, etc) is changed.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "bitrate", + "summary": "The new bitrate in kbps.", + "schema": { + "type": "number" + }, + "required": true + }, + { + "name": "width", + "summary": "The new resolution width.", + "schema": { + "type": "number" + }, + "required": true + }, + { + "name": "height", + "summary": "The new resolution height.", + "schema": { + "type": "number" + }, + "required": true + }, + { + "name": "profile", + "summary": "A description of the new profile, e.g. 'HDR' etc.", + "schema": { + "type": "string" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send renditionchange metric.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "bitrate", + "value": 5000 + }, + { + "name": "width", + "value": 1920 + }, + { + "name": "height", + "value": 1080 + }, + { + "name": "profile", + "value": "HDR+" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaEnded", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when playback has stopped because the end of the media was reached.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send ended metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.appInfo", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform about an app's build info.", + "params": [ + { + "name": "build", + "summary": "The build / version of this app.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Send appInfo metric", + "params": [ + { + "name": "build", + "value": "1.2.2" + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Parameters.initialization", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Returns any initialization parameters for the app, e.g. initialial `NavigationIntent`.", + "params": [], + "result": { + "name": "init", + "summary": "The initialization parameters.", + "schema": { + "$ref": "#/components/schemas/AppInitialization" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "init", + "value": { + "lmt": 0, + "us_privacy": "1-Y-", + "discovery": { + "navigateTo": { + "action": "entity", + "data": { + "entityId": "abc", + "entityType": "program", + "programType": "movie" + }, + "context": { + "source": "voice" + } + } + } + } + } + } + ] + }, + { + "name": "Profile.approveContentRating", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:approve:content" + ] + } + ], + "summary": "Verifies that the current profile should have access to mature/adult content.", + "params": [], + "result": { + "name": "allow", + "summary": "Whether or not to allow access", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Profile.approvePurchase", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:approve:purchase" + ] + } + ], + "summary": "Verifies that the current profile should have access to making purchases.", + "params": [], + "result": { + "name": "allow", + "summary": "Whether or not to allow access", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Profile.flags", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:profile:flags" + ] + } + ], + "summary": "Get a map of profile flags for the current session.", + "params": [], + "result": { + "name": "flags", + "summary": "The profile flags.", + "schema": { + "$ref": "#/x-schemas/Types/FlatMap" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "flags", + "value": { + "userExperience": "1000" + } + } + } + ] + }, + { + "name": "SecondScreen.protocols", + "summary": "Get the supported second screen discovery protocols", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:secondscreen:protocol" + ] + } + ], + "params": [], + "result": { + "name": "protocols", + "summary": "the supported protocols", + "schema": { + "$ref": "#/x-schemas/Types/BooleanMap" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": { + "dial1.7": true + } + } + } + ] + }, + { + "name": "SecondScreen.device", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "summary": "Get the broadcasted id for the device", + "params": [ + { + "name": "type", + "summary": "The type of second screen protocol, e.g. \"dial\"", + "required": false, + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "deviceId", + "summary": "the device id", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "device-id" + } + } + ] + }, + { + "name": "SecondScreen.friendlyName", + "summary": "Get the broadcasted friendly name for the device", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "result": { + "name": "friendlyName", + "summary": "the device friendly-name", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "friendlyName", + "value": "Living Room" + } + } + ] + }, + { + "name": "SecondScreen.onLaunchRequest", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "summary": "Listen to the launchRequest event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "launchRequestEvent", + "summary": "Dispatched when a second screen device on the local network has requested this app to be launched", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/SecondScreen/SecondScreenEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "type": "dial", + "version": "1.7", + "data": "{\"code\":\"AQDPQZiQcb3KQ7gY7yy5tHTMbbkGHR9Zjp-KL53H3eKBZIeAt7O9UKYPu6B21l2UZVmIqkFXDXBmXvK4g2e3EgZtjMNmKPsTltgnRl95DImtOXjSpWtTjSaOkW4w1kZKUTwLKdwVWTzBVH8ERHorvLU6vCGOVHxXt65LNwdl5HKRweShVC1V9QsyvRnQS61ov0UclmrH_xZML2Bt-Q-rZFjey5MjwupIb4x4f53XUJMhjHpDHoIUKrjpdPDQvK2a\",\"friendlyName\":\"Operator_TX061AEI\",\"UDN\":\"608fef11-2800-482a-962b-23a6690c93c1\"}" + } + } + } + ] + }, + { + "name": "SecondScreen.onCloseRequest", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "summary": "Listen to the closeRequest event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "closeRequestEvent", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/SecondScreen/SecondScreenEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "type": "dial", + "version": "1.7" + } + } + } + ] + }, + { + "name": "SecondScreen.onFriendlyNameChanged", + "summary": "Get the broadcasted friendly name for the device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "SecondScreen.friendlyName" + }, + { + "name": "event", + "x-alternative": "friendlyName" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "result": { + "name": "friendlyName", + "summary": "the device friendly-name", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "string" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "friendlyName", + "value": "Living Room" + } + } + ] + }, + { + "name": "SecureStorage.get", + "summary": "Get stored value by key", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "scope", + "summary": "The scope of the key/value", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + }, + { + "name": "key", + "summary": "Key to get", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "value", + "summary": "The retrieved value, if found.", + "schema": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "examples": [ + { + "name": "Successfully retrieve a refresh token with key authRefreshToken", + "params": [ + { + "name": "scope", + "value": "device" + }, + { + "name": "key", + "value": "authRefreshToken" + } + ], + "result": { + "name": "value", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + } + }, + { + "name": "Attempt to retrieve a key with no value set", + "params": [ + { + "name": "scope", + "value": "account" + }, + { + "name": "key", + "value": "authRefreshToken" + } + ], + "result": { + "name": "value", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.set", + "summary": "Set or update a secure data value", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "scope", + "summary": "The scope of the data key", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + }, + { + "name": "key", + "summary": "Key to set", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "value", + "summary": "Value to set", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "options", + "summary": "Optional parameters to set", + "schema": { + "$ref": "#/components/schemas/StorageOptions" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Set a refresh token with name authRefreshToken with optional paramter", + "params": [ + { + "name": "scope", + "value": "device" + }, + { + "name": "key", + "value": "authRefreshToken" + }, + { + "name": "value", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + }, + { + "name": "options", + "value": { + "ttl": 600 + } + } + ], + "result": { + "name": "defaultResult", + "value": null + } + }, + { + "name": "Set a refresh token with name authRefreshToken without optional parameter", + "params": [ + { + "name": "scope", + "value": "account" + }, + { + "name": "key", + "value": "authRefreshToken" + }, + { + "name": "value", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.remove", + "summary": "Remove a secure data value", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "scope", + "summary": "The scope of the data key", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + }, + { + "name": "key", + "summary": "Key to remove", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "summary": "", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Remove the value with key authRefreshToken for device", + "params": [ + { + "name": "scope", + "value": "device" + }, + { + "name": "key", + "value": "authRefreshToken" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + }, + { + "name": "Remove the value with key authRefreshToken for account", + "params": [ + { + "name": "scope", + "value": "account" + }, + { + "name": "key", + "value": "authRefreshToken" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.clear", + "summary": "Clears all the secure data values", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "scope", + "summary": "The scope of the key/value", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + } + ], + "result": { + "name": "success", + "summary": "", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Clears all the data values of storage", + "params": [ + { + "name": "scope", + "value": "account" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + } + ], + "components": { + "schemas": { + "InitializeResult": { + "title": "InitializeResult", + "type": "object", + "required": [ + "version" + ], + "properties": { + "version": { + "$ref": "#/x-schemas/Types/SemanticVersion", + "description": "The semantic version of the FEE." + } + }, + "additionalProperties": false + }, + "AudioDescriptionSettings": { + "title": "AudioDescriptionSettings", + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether or not audio descriptions should be enabled by default" + } + } + }, + "ChallengeRequestor": { + "title": "ChallengeRequestor", + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "string", + "description": "The id of the app that requested the challenge" + }, + "name": { + "type": "string", + "description": "The name of the app that requested the challenge" + } + } + }, + "Challenge": { + "title": "Challenge", + "type": "object", + "required": [ + "capability", + "requestor" + ], + "properties": { + "capability": { + "type": "string", + "description": "The capability that is being requested by the user to approve" + }, + "requestor": { + "description": "The identity of which app is requesting access to this capability", + "$ref": "#/components/schemas/ChallengeRequestor" + } + } + }, + "AdPolicy": { + "title": "AdPolicy", + "description": "Describes various ad playback enforcement rules that the app should follow.", + "type": "object", + "properties": { + "skipRestriction": { + "$ref": "#/x-schemas/Advertising/SkipRestriction" + }, + "limitAdTracking": { + "type": "boolean" + } + } + }, + "AdConfigurationOptions": { + "title": "AdConfigurationOptions", + "type": "object", + "properties": { + "coppa": { + "type": "boolean", + "description": "Whether or not the app requires US COPPA compliance." + }, + "environment": { + "type": "string", + "enum": [ + "prod", + "test" + ], + "default": "prod", + "description": "Whether the app is running in a production or test mode." + }, + "authenticationEntity": { + "type": "string", + "description": "The authentication provider, when it is separate entity than the app provider, e.g. an MVPD." + } + } + }, + "AdvertisingIdOptions": { + "title": "AdvertisingIdOptions", + "type": "object", + "properties": { + "scope": { + "type": "object", + "description": "Provides the options to send scope type and id to select desired advertising id", + "required": [ + "type", + "id" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "browse", + "content" + ], + "default": "browse", + "description": "The scope type, which will determine where to show advertisement" + }, + "id": { + "type": "string", + "description": "A value that identifies a specific scope within the scope type" + } + } + } + } + }, + "AdvertisingIdResult": { + "title": "AdvertisingIdResult", + "type": "object", + "properties": { + "ifa": { + "type": "string", + "description": "UUID conforming to IAB standard" + }, + "ifa_type": { + "type": "string", + "description": "source of the IFA as defined by IAB" + }, + "lmt": { + "type": "string", + "enum": [ + "0", + "1" + ], + "description": "boolean that if set to 1, user has requested ad tracking and measurement is disabled" + } + }, + "required": [ + "ifa", + "ifa_type", + "lmt" + ] + }, + "TokenType": { + "title": "TokenType", + "type": "string", + "enum": [ + "platform", + "device", + "distributor" + ] + }, + "AuthenticationTokenResult": { + "title": "AuthenticationTokenResult", + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "expires": { + "type": "string", + "format": "date-time" + }, + "type": { + "type": "string" + } + }, + "required": [ + "value" + ] + }, + "CapabilityOption": { + "title": "CapabilityOption", + "type": "object", + "properties": { + "role": { + "$ref": "#/x-schemas/Capabilities/Role", + "description": "Which role of the capability to check the state of, default will be 'use'", + "default": "use" + } + } + }, + "Resolution": { + "oneOf": [ + { + "type": "array", + "items": [ + { + "type": "integer", + "const": 720, + "description": "Width in pixels" + }, + { + "type": "integer", + "const": 480, + "description": "Height in pixels" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + }, + { + "type": "array", + "items": [ + { + "type": "integer", + "const": 720, + "description": "Width in pixels" + }, + { + "type": "integer", + "const": 576, + "description": "Height in pixels" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + }, + { + "type": "array", + "items": [ + { + "type": "integer", + "const": 1280, + "description": "Width in pixels" + }, + { + "type": "integer", + "const": 720, + "description": "Height in pixels" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + }, + { + "type": "array", + "items": [ + { + "type": "integer", + "const": 1920, + "description": "Width in pixels" + }, + { + "type": "integer", + "const": 1080, + "description": "Height in pixels" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + }, + { + "type": "array", + "items": [ + { + "type": "integer", + "const": 3840, + "description": "Width in pixels" + }, + { + "type": "integer", + "const": 2160, + "description": "Height in pixels" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + } + ] + }, + "NetworkType": { + "title": "NetworkType", + "type": "string", + "enum": [ + "wifi", + "ethernet", + "hybrid" + ], + "description": "The type of network that is currently active" + }, + "NetworkState": { + "title": "NetworkState", + "type": "string", + "enum": [ + "connected", + "disconnected" + ], + "description": "The type of network that is currently active" + }, + "AudioProfiles": { + "title": "AudioProfiles", + "type": "object", + "properties": { + "stereo": { + "type": "boolean" + }, + "dolbyDigital5.1": { + "type": "boolean" + }, + "dolbyDigital5.1+": { + "type": "boolean" + }, + "dolbyAtmos": { + "type": "boolean" + } + }, + "required": [ + "stereo", + "dolbyDigital5.1", + "dolbyDigital5.1+", + "dolbyAtmos" + ] + }, + "HDRFormatMap": { + "title": "HDRFormatMap", + "type": "object", + "properties": { + "hdr10": { + "type": "boolean" + }, + "hdr10Plus": { + "type": "boolean" + }, + "dolbyVision": { + "type": "boolean" + }, + "hlg": { + "type": "boolean" + } + }, + "required": [ + "hdr10", + "hdr10Plus", + "dolbyVision", + "hlg" + ], + "description": "The type of HDR format" + }, + "HDCPVersionMap": { + "title": "HDCPVersionMap", + "type": "object", + "properties": { + "hdcp1.4": { + "type": "boolean" + }, + "hdcp2.2": { + "type": "boolean" + } + }, + "required": [ + "hdcp1.4", + "hdcp2.2" + ], + "description": "The type of HDCP versions" + }, + "DeviceVersion": { + "title": "DeviceVersion", + "type": "object", + "properties": { + "sdk": { + "$ref": "#/x-schemas/Types/SemanticVersion", + "description": "The Firebolt SDK version" + }, + "api": { + "$ref": "#/x-schemas/Types/SemanticVersion", + "description": "The latest Firebolt API version supported by the current device." + }, + "firmware": { + "$ref": "#/x-schemas/Types/SemanticVersion", + "description": "The firmware version as reported by the device" + }, + "os": { + "$ref": "#/x-schemas/Types/SemanticVersion", + "description": "**Deprecated** Use `firmware`, instead." + }, + "debug": { + "type": "string", + "description": "Detailed version as a string, for debugging purposes" + } + }, + "required": [ + "api", + "firmware", + "os" + ] + }, + "NetworkInfoResult": { + "title": "NetworkInfoResult", + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/NetworkState" + }, + "type": { + "$ref": "#/components/schemas/NetworkType" + } + }, + "required": [ + "state", + "type" + ] + }, + "DiscoveryPolicy": { + "title": "DiscoveryPolicy", + "type": "object", + "required": [ + "enableRecommendations", + "shareWatchHistory", + "rememberWatchedPrograms" + ], + "properties": { + "enableRecommendations": { + "type": "boolean", + "description": "Whether or not to the user has enabled history-based recommendations" + }, + "shareWatchHistory": { + "type": "boolean", + "description": "Whether or not the user has enabled app watch history data to be shared with the platform" + }, + "rememberWatchedPrograms": { + "type": "boolean", + "description": "Whether or not the user has enabled watch history" + } + } + }, + "FederatedRequest": { + "title": "FederatedRequest", + "type": "object", + "properties": { + "correlationId": { + "type": "string" + } + }, + "required": [ + "correlationId" + ], + "propertyNames": { + "enum": [ + "correlationId", + "parameters" + ] + }, + "examples": [ + { + "correlationId": "xyz" + } + ] + }, + "FederatedResponse": { + "title": "FederatedResponse", + "type": "object", + "properties": { + "correlationId": { + "type": "string" + } + }, + "required": [ + "correlationId", + "result" + ], + "propertyNames": { + "enum": [ + "correlationId", + "result" + ] + }, + "examples": [ + { + "correlationId": "xyz" + } + ] + }, + "EntityInfoFederatedRequest": { + "title": "EntityInfoFederatedRequest", + "allOf": [ + { + "$ref": "#/components/schemas/FederatedRequest" + }, + { + "type": "object", + "properties": { + "parameters": { + "$ref": "#/components/schemas/EntityInfoParameters" + } + }, + "required": [ + "correlationId", + "parameters" + ] + } + ], + "examples": [ + { + "correlationId": "xyz", + "parameters": { + "entityId": "345" + } + } + ] + }, + "EntityInfoParameters": { + "title": "EntityInfoParameters", + "type": "object", + "properties": { + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + } + }, + "required": [ + "entityId" + ], + "additionalProperties": false, + "examples": [ + { + "entityId": "345" + } + ] + }, + "PurchasedContentFederatedRequest": { + "title": "PurchasedContentFederatedRequest", + "allOf": [ + { + "$ref": "#/components/schemas/FederatedRequest" + }, + { + "type": "object", + "properties": { + "parameters": { + "$ref": "#/components/schemas/PurchasedContentParameters" + } + }, + "required": [ + "correlationId", + "parameters" + ] + } + ], + "examples": [ + { + "correlationId": "xyz", + "parameters": { + "limit": 100 + } + } + ] + }, + "PurchasedContentParameters": { + "title": "PurchasedContentParameters", + "type": "object", + "properties": { + "limit": { + "type": "integer", + "minimum": -1 + }, + "offeringType": { + "$ref": "#/x-schemas/Entertainment/OfferingType" + }, + "programType": { + "$ref": "#/x-schemas/Entertainment/ProgramType" + } + }, + "required": [ + "limit" + ], + "additionalProperties": false, + "examples": [ + { + "limit": 100 + } + ] + }, + "Availability": { + "title": "Availability", + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "channel-lineup", + "program-lineup" + ] + }, + "id": { + "type": "string" + }, + "catalogId": { + "type": "string" + }, + "startTime": { + "type": "string", + "format": "date-time" + }, + "endTime": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "type", + "id" + ] + }, + "ContentAccessIdentifiers": { + "title": "ContentAccessIdentifiers", + "type": "object", + "properties": { + "availabilities": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Availability" + }, + "description": "A list of identifiers that represent what content is discoverable for the subscriber. Excluding availabilities will cause no change to the availabilities that are stored for this subscriber. Providing an empty array will clear the subscriber's availabilities" + }, + "entitlements": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/Entitlement" + }, + "description": "A list of identifiers that represent what content is consumable for the subscriber. Excluding entitlements will cause no change to the entitlements that are stored for this subscriber. Providing an empty array will clear the subscriber's entitlements" + } + }, + "required": [] + }, + "UserInterestProviderParameters": { + "title": "UserInterestProviderParameters", + "type": "object", + "required": [ + "type", + "reason" + ], + "properties": { + "type": { + "$ref": "#/x-schemas/Discovery/InterestType" + }, + "reason": { + "$ref": "#/x-schemas/Discovery/InterestReason" + } + } + }, + "HDMIPortId": { + "type": "string", + "pattern": "^HDMI[0-9]+$" + }, + "EDIDVersion": { + "title": "EDIDVersion", + "type": "string", + "enum": [ + "1.4", + "2.0", + "unknown" + ] + }, + "HDMISignalStatus": { + "type": "string", + "enum": [ + "none", + "stable", + "unstable", + "unsupported", + "unknown" + ] + }, + "EmailUsage": { + "title": "EmailUsage", + "type": "string", + "enum": [ + "signIn", + "signUp" + ] + }, + "KeyboardParameters": { + "title": "KeyboardParameters", + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "description": "The message to display to the user so the user knows what they are entering", + "type": "string" + } + }, + "examples": [ + { + "type": "standard", + "message": "Enter your user name." + } + ] + }, + "LifecycleEvent": { + "title": "LifecycleEvent", + "description": "A an object describing the previous and current states", + "type": "object", + "required": [ + "state", + "previous" + ], + "properties": { + "state": { + "$ref": "#/x-schemas/Lifecycle/LifecycleState", + "description": "The current lifcycle state" + }, + "previous": { + "$ref": "#/x-schemas/Lifecycle/LifecycleState", + "description": "The previous lifcycle state" + }, + "source": { + "type": "string", + "enum": [ + "voice", + "remote" + ], + "description": "The source of the lifecycle change." + } + } + }, + "LatLon": { + "type": "array", + "items": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + }, + "MediaPosition": { + "title": "MediaPosition", + "description": "Represents a position inside playback content, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration.", + "oneOf": [ + { + "const": 0 + }, + { + "type": "number", + "exclusiveMinimum": 0, + "exclusiveMaximum": 1 + }, + { + "type": "integer", + "minimum": 1, + "maximum": 86400 + } + ] + }, + "ErrorType": { + "title": "ErrorType", + "type": "string", + "enum": [ + "network", + "media", + "restriction", + "entitlement", + "other" + ] + }, + "EventObjectPrimitives": { + "title": "EventObjectPrimitives", + "anyOf": [ + { + "type": "string", + "maxLength": 256 + }, + { + "type": "number" + }, + { + "type": "integer" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "EventObject": { + "title": "EventObject", + "type": "object", + "maxProperties": 256, + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/EventObjectPrimitives" + }, + { + "type": "array", + "maxItems": 256, + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/EventObjectPrimitives" + }, + { + "$ref": "#/components/schemas/EventObject" + } + ] + } + }, + { + "$ref": "#/components/schemas/EventObject" + } + ] + } + }, + "AppInitialization": { + "title": "AppInitialization", + "type": "object", + "properties": { + "us_privacy": { + "type": "string", + "description": "The IAB US Privacy string." + }, + "lmt": { + "type": "integer", + "description": "The IAB limit ad tracking opt out value." + }, + "discovery": { + "type": "object", + "properties": { + "navigateTo": { + "$ref": "#/x-schemas/Intents/NavigationIntent" + } + } + }, + "secondScreen": { + "type": "object", + "properties": { + "launchRequest": { + "$ref": "#/x-schemas/SecondScreen/SecondScreenEvent" + } + } + } + } + }, + "PinChallenge": { + "title": "PinChallenge", + "type": "object", + "required": [ + "requestor", + "pinSpace" + ], + "properties": { + "pinSpace": { + "type": "string", + "description": "The pin space that this challenge is for", + "enum": [ + "purchase", + "content" + ] + }, + "capability": { + "type": "string", + "description": "The capability that is gated by a pin challenge" + }, + "requestor": { + "description": "The identity of which app is requesting access to this capability", + "$ref": "#/components/schemas/ChallengeRequestor" + } + } + }, + "ResultReason": { + "title": "ResultReason", + "type": "string", + "description": "The reason for the result of challenging the user", + "enum": [ + "noPinRequired", + "noPinRequiredWindow", + "exceededPinFailures", + "correctPin", + "cancelled" + ] + }, + "StorageScope": { + "title": "StorageScope", + "type": "string", + "enum": [ + "device", + "account" + ], + "description": "The scope of the data" + }, + "StorageOptions": { + "title": "StorageOptions", + "type": "object", + "required": [ + "ttl" + ], + "properties": { + "ttl": { + "type": "number", + "description": "Seconds from set time before the data expires and is removed" + } + } + }, + "AppInfo": { + "description": "Information about an app that a grant was for", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "id" + ] + }, + "GrantState": { + "description": "The state the grant is in", + "type": "string", + "enum": [ + "granted", + "denied" + ] + }, + "WifiSecurityMode": { + "title": "WifiSecurityMode", + "description": "Security Mode supported for Wifi", + "type": "string", + "enum": [ + "none", + "wep64", + "wep128", + "wpaPskTkip", + "wpaPskAes", + "wpa2PskTkip", + "wpa2PskAes", + "wpaEnterpriseTkip", + "wpaEnterpriseAes", + "wpa2EnterpriseTkip", + "wpa2EnterpriseAes", + "wpa2Psk", + "wpa2Enterprise", + "wpa3PskAes", + "wpa3Sae" + ] + }, + "WifiSignalStrength": { + "title": "WifiSignalStrength", + "description": "Strength of Wifi signal, value is negative based on RSSI specification.", + "type": "integer", + "default": -255, + "minimum": -255, + "maximum": 0 + }, + "WifiFrequency": { + "title": "WifiFrequency", + "description": "Wifi Frequency in Ghz, example 2.4Ghz and 5Ghz.", + "type": "number", + "default": 0, + "minimum": 0 + }, + "AccessPoint": { + "title": "AccessPoint", + "description": "Properties of a scanned wifi list item.", + "type": "object", + "properties": { + "ssid": { + "type": "string", + "description": "Name of the wifi." + }, + "securityMode": { + "$ref": "#/components/schemas/WifiSecurityMode" + }, + "signalStrength": { + "$ref": "#/components/schemas/WifiSignalStrength" + }, + "frequency": { + "$ref": "#/components/schemas/WifiFrequency" + } + } + } + } + }, + "x-schemas": { + "Types": { + "uri": "https://meta.comcast.com/firebolt/types", + "SemanticVersion": { + "title": "SemanticVersion", + "type": "object", + "properties": { + "major": { + "type": "integer", + "minimum": 0 + }, + "minor": { + "type": "integer", + "minimum": 0 + }, + "patch": { + "type": "integer", + "minimum": 0 + }, + "readable": { + "type": "string" + } + }, + "required": [ + "major", + "minor", + "patch", + "readable" + ], + "additionalProperties": false + }, + "ListenResponse": { + "title": "ListenResponse", + "type": "object", + "required": [ + "event", + "listening" + ], + "properties": { + "event": { + "type": "string", + "pattern": "[a-zA-Z]+\\.on[A-Z][a-zA-Z]+" + }, + "listening": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "ProviderRequest": { + "title": "ProviderRequest", + "type": "object", + "required": [ + "correlationId" + ], + "additionalProperties": false, + "properties": { + "correlationId": { + "type": "string", + "description": "The id that was passed in to the event that triggered a provider method to be called" + }, + "parameters": { + "description": "The result of the provider response.", + "type": [ + "object", + "null" + ] + } + } + }, + "AudioProfile": { + "title": "AudioProfile", + "type": "string", + "enum": [ + "stereo", + "dolbyDigital5.1", + "dolbyDigital5.1+", + "dolbyAtmos" + ] + }, + "LocalizedString": { + "title": "LocalizedString", + "description": "Localized string supports either a simple `string` or a Map of language codes to strings. When using a simple `string`, the current preferred langauge from `Localization.langauge()` is assumed.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + ], + "examples": [ + "A simple string, with no language code", + { + "en": "This is english", + "es": "esto es español" + } + ] + }, + "FlatMap": { + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + }, + "BooleanMap": { + "title": "BooleanMap", + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "Timeout": { + "title": "Timeout", + "description": "Defines the timeout in seconds. If the threshold for timeout is passed for any operation without a result it will throw an error.", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 9999 + } + }, + "Accessibility": { + "uri": "https://meta.comcast.com/firebolt/accessibility", + "ClosedCaptionsSettings": { + "title": "ClosedCaptionsSettings", + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether or not closed-captions should be enabled by default" + }, + "styles": { + "$ref": "#/x-schemas/Accessibility/ClosedCaptionsStyles" + }, + "preferredLanguages": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + }, + "examples": [ + { + "enabled": true, + "styles": { + "fontFamily": "monospaced_serif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] + } + ] + }, + "VoiceGuidanceSettings": { + "title": "VoiceGuidanceSettings", + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether or not voice guidance should be enabled by default" + }, + "speed": { + "$ref": "#/x-schemas/Accessibility/VoiceSpeed", + "description": "The speed at which voice guidance speech will be read back to the user" + } + }, + "examples": [ + { + "enabled": true, + "speed": 2 + } + ] + }, + "VoiceSpeed": { + "title": "VoiceSpeed", + "type": "number", + "minimum": 0.5, + "maximum": 2 + }, + "ClosedCaptionsStyles": { + "title": "ClosedCaptionsStyles", + "type": "object", + "description": "The default styles to use when displaying closed-captions", + "properties": { + "fontFamily": { + "$ref": "#/x-schemas/Accessibility/FontFamily" + }, + "fontSize": { + "$ref": "#/x-schemas/Accessibility/FontSize" + }, + "fontColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "fontEdge": { + "$ref": "#/x-schemas/Accessibility/FontEdge" + }, + "fontEdgeColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "fontOpacity": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "backgroundColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "backgroundOpacity": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "textAlign": { + "$ref": "#/x-schemas/Accessibility/HorizontalAlignment" + }, + "textAlignVertical": { + "$ref": "#/x-schemas/Accessibility/VerticalAlignment" + }, + "windowColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "windowOpacity": { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + } + }, + "FontFamily": { + "type": [ + "string", + "null" + ], + "enum": [ + "monospaced_serif", + "proportional_serif", + "monospaced_sanserif", + "proportional_sanserif", + "smallcaps", + "cursive", + "casual", + null + ] + }, + "FontSize": { + "type": [ + "number", + "null" + ], + "minimum": 0 + }, + "Color": { + "type": [ + "string", + "null" + ] + }, + "FontEdge": { + "type": [ + "string", + "null" + ], + "enum": [ + "none", + "raised", + "depressed", + "uniform", + "drop_shadow_left", + "drop_shadow_right", + null + ] + }, + "Opacity": { + "type": [ + "number", + "null" + ], + "minimum": 0, + "maximum": 100 + }, + "HorizontalAlignment": { + "type": [ + "string", + "null" + ] + }, + "VerticalAlignment": { + "type": [ + "string", + "null" + ] + } + }, + "Localization": { + "uri": "https://meta.comcast.com/firebolt/localization", + "ISO639_2Language": { + "type": "string", + "pattern": "^[a-z]{3}$" + }, + "Locality": { + "type": "string" + }, + "CountryCode": { + "type": "string", + "pattern": "^[A-Z]{2}$" + }, + "Language": { + "type": "string", + "pattern": "^[A-Za-z]{2}$" + }, + "Locale": { + "type": "string", + "pattern": "^[a-zA-Z]+([a-zA-Z0-9\\-]*)$" + }, + "TimeZone": { + "type": "string", + "pattern": "^[-+_/ A-Za-z 0-9]*$" + } + }, + "Advertising": { + "uri": "https://meta.comcast.com/firebolt/advertising", + "SkipRestriction": { + "title": "SkipRestriction", + "$comment": "xrn:advertising:policy:skipRestriction:", + "type": "string", + "enum": [ + "none", + "adsUnwatched", + "adsAll", + "all" + ], + "description": "The advertisement skip restriction.\n\nApplies to fast-forward/rewind (e.g. trick mode), seeking over an entire opportunity (e.g. jump), seeking out of what's currently playing, and \"Skip this ad...\" features. Seeking over multiple ad opportunities only requires playback of the _last_ opportunity, not all opportunities, preceding the seek destination.\n\n| Value | Description |\n|--------------|--------------------------------------------------------------------------------|\n| none |No fast-forward, jump, or skip restrictions |\n| adsUnwatched | Restrict fast-forward, jump, and skip for unwatched ad opportunities only. |\n| adsAll | Restrict fast-forward, jump, and skip for all ad opportunities |\n| all | Restrict fast-forward, jump, and skip for all ad opportunities and all content |\n\nNamespace: `xrn:advertising:policy:skipRestriction:`\n\n" + } + }, + "Capabilities": { + "uri": "https://meta.comcast.com/firebolt/capabilities", + "Capability": { + "title": "Capability", + "type": "string", + "description": "A Capability is a discrete unit of functionality that a Firebolt device might be able to perform.", + "pattern": "^xrn:firebolt:capability:([a-z0-9\\-]+)((:[a-z0-9\\-]+)?)$" + }, + "CapabilityInfo": { + "title": "CapabilityInfo", + "type": "object", + "required": [ + "supported", + "available", + "use", + "manage", + "provide" + ], + "properties": { + "capability": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "supported": { + "type": "boolean", + "description": "Provides info whether the capability is supported" + }, + "available": { + "type": "boolean", + "description": "Provides info whether the capability is available" + }, + "use": { + "$ref": "#/x-schemas/Capabilities/CapPermissionStatus" + }, + "manage": { + "$ref": "#/x-schemas/Capabilities/CapPermissionStatus" + }, + "provide": { + "$ref": "#/x-schemas/Capabilities/CapPermissionStatus" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/DenyReason" + }, + "minItems": 1, + "maxItems": 6 + } + }, + "additionalProperties": false, + "examples": [ + { + "capability": "xrn:firebolt:capability:keyboard", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + } + ] + }, + "Permission": { + "title": "Permission", + "description": "A capability combined with a Role, which an app may be permitted (by a distributor) or granted (by an end user).", + "type": "object", + "required": [ + "capability" + ], + "properties": { + "role": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "capability": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + "additionalProperties": false + }, + "Role": { + "title": "Role", + "description": "Role provides access level for the app for a given capability.", + "type": "string", + "enum": [ + "use", + "manage", + "provide" + ] + }, + "CapPermissionStatus": { + "type": "object", + "properties": { + "permitted": { + "type": "boolean", + "description": "Provides info whether the capability is permitted" + }, + "granted": { + "oneOf": [ + { + "type": "boolean", + "description": "Provides info whether the capability is granted" + }, + { + "const": null + } + ] + } + }, + "additionalProperties": false + }, + "DenyReason": { + "title": "DenyReason", + "description": "Reasons why a Capability might not be invokable", + "type": "string", + "enum": [ + "unpermitted", + "unsupported", + "disabled", + "unavailable", + "grantDenied", + "ungranted" + ] + } + }, + "Discovery": { + "uri": "https://meta.comcast.com/firebolt/discovery", + "InterestType": { + "title": "InterestType", + "type": "string", + "enum": [ + "interest", + "disinterest" + ] + }, + "InterestReason": { + "title": "InterestReason", + "type": "string", + "enum": [ + "playlist", + "reaction", + "recording" + ] + }, + "EntityInfoResult": { + "title": "EntityInfoResult", + "description": "The result for an `entityInfo()` push or pull.", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "entity": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + }, + "related": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + } + } + }, + "required": [ + "expires", + "entity" + ], + "additionalProperties": false + }, + "PurchasedContentResult": { + "title": "PurchasedContentResult", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "totalCount": { + "type": "integer", + "minimum": 0 + }, + "entries": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + } + } + }, + "required": [ + "expires", + "totalCount", + "entries" + ], + "additionalProperties": false + } + }, + "Entity": { + "uri": "https://meta.comcast.com/firebolt/entity", + "EntityDetails": { + "title": "EntityDetails", + "type": "object", + "required": [ + "identifiers" + ], + "properties": { + "identifiers": { + "$ref": "#/x-schemas/Entity/Entity" + }, + "info": { + "$ref": "#/x-schemas/Entity/Metadata" + }, + "waysToWatch": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/WayToWatch" + }, + "description": "An array of ways a user is might watch this entity, regardless of entitlements." + } + } + }, + "Entity": { + "oneOf": [ + { + "$ref": "#/x-schemas/Entity/ProgramEntity" + }, + { + "$ref": "#/x-schemas/Entity/MusicEntity" + }, + { + "$ref": "#/x-schemas/Entity/ChannelEntity" + }, + { + "$ref": "#/x-schemas/Entity/UntypedEntity" + }, + { + "$ref": "#/x-schemas/Entity/PlaylistEntity" + } + ] + }, + "Metadata": { + "title": "Metadata", + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Title of the entity." + }, + "synopsis": { + "type": "string", + "description": "Short description of the entity." + }, + "seasonNumber": { + "type": "number", + "description": "For TV seasons, the season number. For TV episodes, the season that the episode belongs to." + }, + "seasonCount": { + "type": "number", + "description": "For TV series, seasons, and episodes, the total number of seasons." + }, + "episodeNumber": { + "type": "number", + "description": "For TV episodes, the episode number." + }, + "episodeCount": { + "type": "number", + "description": "For TV seasons and episodes, the total number of episodes in the current season." + }, + "releaseDate": { + "type": "string", + "format": "date-time", + "description": "The date that the program or entity was released or first aired." + }, + "contentRatings": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/ContentRating" + }, + "description": "A list of ContentRating objects, describing the entity's ratings in various rating schemes." + } + } + }, + "ProgramEntity": { + "title": "ProgramEntity", + "oneOf": [ + { + "$ref": "#/x-schemas/Entity/MovieEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVEpisodeEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVSeasonEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVSeriesEntity" + }, + { + "$ref": "#/x-schemas/Entity/AdditionalEntity" + } + ] + }, + "MusicEntity": { + "title": "MusicEntity", + "type": "object", + "properties": { + "entityType": { + "const": "music" + }, + "musicType": { + "$ref": "#/x-schemas/Entertainment/MusicType" + }, + "entityId": { + "type": "string" + } + }, + "required": [ + "entityType", + "musicType", + "entityId" + ] + }, + "ChannelEntity": { + "title": "ChannelEntity", + "type": "object", + "properties": { + "entityType": { + "const": "channel" + }, + "channelType": { + "type": "string", + "enum": [ + "streaming", + "overTheAir" + ] + }, + "entityId": { + "type": "string", + "description": "ID of the channel, in the target App's scope." + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "required": [ + "entityType", + "channelType", + "entityId" + ], + "additionalProperties": false + }, + "UntypedEntity": { + "title": "UntypedEntity", + "allOf": [ + { + "description": "A Firebolt compliant representation of the remaining entity types.", + "type": "object", + "required": [ + "entityId" + ], + "properties": { + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false + } + ], + "examples": [ + { + "entityId": "an-entity" + } + ] + }, + "PlaylistEntity": { + "title": "PlaylistEntity", + "description": "A Firebolt compliant representation of a Playlist entity.", + "type": "object", + "required": [ + "entityType", + "entityId" + ], + "properties": { + "entityType": { + "const": "playlist" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "playlist", + "entityId": "playlist/xyz" + } + ] + }, + "MovieEntity": { + "title": "MovieEntity", + "description": "A Firebolt compliant representation of a Movie entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "movie" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "movie", + "entityId": "el-camino" + } + ] + }, + "TVEpisodeEntity": { + "title": "TVEpisodeEntity", + "description": "A Firebolt compliant representation of a TV Episode entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId", + "seriesId", + "seasonId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "episode" + }, + "entityId": { + "type": "string" + }, + "seriesId": { + "type": "string" + }, + "seasonId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "episode", + "entityId": "breaking-bad-pilot", + "seriesId": "breaking-bad", + "seasonId": "breaking-bad-season-1" + } + ] + }, + "TVSeasonEntity": { + "title": "TVSeasonEntity", + "description": "A Firebolt compliant representation of a TV Season entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId", + "seriesId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "season" + }, + "entityId": { + "type": "string" + }, + "seriesId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "season", + "entityId": "breaking-bad-season-1", + "seriesId": "breaking-bad" + } + ] + }, + "TVSeriesEntity": { + "title": "TVSeriesEntity", + "description": "A Firebolt compliant representation of a TV Series entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "series" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "series", + "entityId": "breaking-bad" + } + ] + }, + "AdditionalEntity": { + "title": "AdditionalEntity", + "description": "A Firebolt compliant representation of the remaining program entity types.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "type": "string", + "enum": [ + "concert", + "sportingEvent", + "preview", + "other", + "advertisement", + "musicVideo", + "minisode", + "extra" + ] + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "concert", + "entityId": "live-aid" + } + ] + }, + "PlayableEntity": { + "title": "PlayableEntity", + "anyOf": [ + { + "$ref": "#/x-schemas/Entity/MovieEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVEpisodeEntity" + }, + { + "$ref": "#/x-schemas/Entity/PlaylistEntity" + }, + { + "$ref": "#/x-schemas/Entity/MusicEntity" + }, + { + "$ref": "#/x-schemas/Entity/AdditionalEntity" + } + ] + } + }, + "Entertainment": { + "uri": "https://meta.comcast.com/firebolt/entertainment", + "WayToWatch": { + "title": "WayToWatch", + "type": "object", + "required": [ + "identifiers", + "audioProfile" + ], + "properties": { + "identifiers": { + "$ref": "#/x-schemas/Entertainment/ContentIdentifiers" + }, + "expires": { + "type": "string", + "format": "date-time", + "description": "Time when the WayToWatch is no longer available." + }, + "entitled": { + "type": "boolean", + "description": "Specify if the user is entitled to watch the entity." + }, + "entitledExpires": { + "type": "string", + "format": "date-time", + "description": "Time when the entity is no longer entitled." + }, + "offeringType": { + "$ref": "#/x-schemas/Entertainment/OfferingType" + }, + "hasAds": { + "type": "boolean", + "description": "True if the streamable asset contains ads." + }, + "price": { + "type": "number", + "description": "For \"buy\" and \"rent\" WayToWatch, the price to buy or rent in the user's preferred currency." + }, + "videoQuality": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "SD", + "HD", + "UHD" + ] + }, + "description": "List of the video qualities available via the WayToWatch." + }, + "audioProfile": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Types/AudioProfile" + }, + "description": "List of the audio types available via the WayToWatch." + }, + "audioLanguages": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of audio track languages available on the WayToWatch. The first is considered the primary language. Languages are expressed as ISO 639 1/2 codes." + }, + "closedCaptions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of languages for which closed captions are available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes." + }, + "subtitles": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of languages for which subtitles are available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes." + }, + "audioDescriptions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of languages for which audio descriptions (DVD) as available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes." + } + }, + "description": "A WayToWatch describes a way to watch a video program. It may describe a single\nstreamable asset or a set of streamable assets. For example, an app provider may\ndescribe HD, SD, and UHD assets as individual WayToWatch objects or rolled into\na single WayToWatch.\n\nIf the WayToWatch represents a single streamable asset, the provided\nContentIdentifiers must be sufficient to play back the specific asset when sent\nvia a playback intent or deep link. If the WayToWatch represents multiple\nstreamable assets, the provided ContentIdentifiers must be sufficient to\nplayback one of the assets represented with no user action. In this scenario,\nthe app SHOULD choose the best asset for the user based on their device and\nsettings. The ContentIdentifiers MUST also be sufficient for navigating the user\nto the appropriate entity or detail screen via an entity intent.\n\nThe app should set the `entitled` property to indicate if the user can watch, or\nnot watch, the asset without making a purchase. If the entitlement is known to\nexpire at a certain time (e.g., a rental), the app should also provide the\n`entitledExpires` property. If the entitlement is not expired, the UI will use\nthe `entitled` property to display watchable assets to the user, adjust how\nassets are presented to the user, and how intents into the app are generated.\nFor example, the the Aggregated Experience could render a \"Watch\" button for an\nentitled asset versus a \"Subscribe\" button for an non-entitled asset.\n\nThe app should set the `offeringType` to define how the content may be\nauthorized. The UI will use this to adjust how content is presented to the user.\n\nA single WayToWatch cannot represent streamable assets available via multiple\npurchase paths. If, for example, an asset has both Buy, Rent and Subscription\navailability, the three different entitlement paths MUST be represented as\nmultiple WayToWatch objects.\n\n`price` should be populated for WayToWatch objects with `buy` or `rent`\n`offeringType`. If the WayToWatch represents a set of assets with various price\npoints, the `price` provided must be the lowest available price." + }, + "OfferingType": { + "title": "OfferingType", + "type": "string", + "enum": [ + "free", + "subscribe", + "buy", + "rent" + ], + "description": "The offering type of the WayToWatch." + }, + "ContentIdentifiers": { + "title": "ContentIdentifiers", + "type": "object", + "properties": { + "assetId": { + "type": "string", + "description": "Identifies a particular playable asset. For example, the HD version of a particular movie separate from the UHD version." + }, + "entityId": { + "type": "string", + "description": "Identifies an entity, such as a Movie, TV Series or TV Episode." + }, + "seasonId": { + "type": "string", + "description": "The TV Season for a TV Episode." + }, + "seriesId": { + "type": "string", + "description": "The TV Series for a TV Episode or TV Season." + }, + "appContentData": { + "type": "string", + "description": "App-specific content identifiers.", + "maxLength": 1024 + } + }, + "description": "The ContentIdentifiers object is how the app identifies an entity or asset to\nthe Firebolt platform. These ids are used to look up metadata and deep link into\nthe app.\n\nApps do not need to provide all ids. They only need to provide the minimum\nrequired to target a playable stream or an entity detail screen via a deep link.\nIf an id isn't needed to get to those pages, it doesn't need to be included." + }, + "ContentRating": { + "title": "ContentRating", + "type": "object", + "required": [ + "scheme", + "rating" + ], + "properties": { + "scheme": { + "type": "string", + "enum": [ + "CA-Movie", + "CA-TV", + "CA-Movie-Fr", + "CA-TV-Fr", + "US-Movie", + "US-TV" + ], + "description": "The rating scheme." + }, + "rating": { + "type": "string", + "description": "The content rating." + }, + "advisories": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional list of subratings or content advisories." + } + }, + "description": "A ContentRating represents an age or content based of an entity. Supported rating schemes and associated types are below.\n\n## United States\n\n`US-Movie` (MPAA):\n\nRatings: `NR`, `G`, `PG`, `PG13`, `R`, `NC17`\n\nAdvisories: `AT`, `BN`, `SL`, `SS`, `N`, `V`\n\n`US-TV` (Vchip):\n\nRatings: `TVY`, `TVY7`, `TVG`, `TVPG`, `TV14`, `TVMA`\n\nAdvisories: `FV`, `D`, `L`, `S`, `V`\n\n## Canada\n\n`CA-Movie` (OFRB):\n\nRatings: `G`, `PG`, `14A`, `18A`, `R`, `E`\n\n`CA-TV` (AGVOT)\n\nRatings: `E`, `C`, `C8`, `G`, `PG`, `14+`, `18+`\n\nAdvisories: `C`, `C8`, `G`, `PG`, `14+`, `18+`\n\n`CA-Movie-Fr` (Canadian French language movies):\n\nRatings: `G`, `8+`, `13+`, `16+`, `18+`\n\n`CA-TV-Fr` (Canadian French language TV):\n\nRatings: `G`, `8+`, `13+`, `16+`, `18+`\n" + }, + "MusicType": { + "title": "MusicType", + "type": "string", + "description": "In the case of a music `entityType`, specifies the type of music entity.", + "enum": [ + "song", + "album" + ] + }, + "Entitlement": { + "title": "Entitlement", + "type": "object", + "properties": { + "entitlementId": { + "type": "string" + }, + "startTime": { + "type": "string", + "format": "date-time" + }, + "endTime": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "entitlementId" + ] + }, + "EntityInfo": { + "title": "EntityInfo", + "description": "An EntityInfo object represents an \"entity\" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type.\n\nAdditionally, EntityInfo objects must specify a properly formed\nContentIdentifiers object, `entityType`, and `title`. The app should provide\nthe `synopsis` property for a good user experience if the content\nmetadata is not available another way.\n\nThe ContentIdentifiers must be sufficient for navigating the user to the\nappropriate entity or detail screen via a `detail` intent or deep link.\n\nEntityInfo objects must provide at least one WayToWatch object when returned as\npart of an `entityInfo` method and a streamable asset is available to the user.\nIt is optional for the `purchasedContent` method, but recommended because the UI\nmay use those data.", + "type": "object", + "required": [ + "identifiers", + "entityType", + "title" + ], + "properties": { + "identifiers": { + "$ref": "#/x-schemas/Entertainment/ContentIdentifiers" + }, + "title": { + "type": "string", + "description": "Title of the entity." + }, + "entityType": { + "type": "string", + "enum": [ + "program", + "music" + ], + "description": "The type of the entity, e.g. `program` or `music`." + }, + "programType": { + "$ref": "#/x-schemas/Entertainment/ProgramType" + }, + "musicType": { + "$ref": "#/x-schemas/Entertainment/MusicType" + }, + "synopsis": { + "type": "string", + "description": "Short description of the entity." + }, + "seasonNumber": { + "type": "number", + "description": "For TV seasons, the season number. For TV episodes, the season that the episode belongs to." + }, + "seasonCount": { + "type": "number", + "description": "For TV series, seasons, and episodes, the total number of seasons." + }, + "episodeNumber": { + "type": "number", + "description": "For TV episodes, the episode number." + }, + "episodeCount": { + "type": "number", + "description": "For TV seasons and episodes, the total number of episodes in the current season." + }, + "releaseDate": { + "type": "string", + "format": "date-time", + "description": "The date that the program or entity was released or first aired." + }, + "contentRatings": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/ContentRating" + }, + "description": "A list of ContentRating objects, describing the entity's ratings in various rating schemes." + }, + "waysToWatch": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/WayToWatch" + }, + "description": "An array of ways a user is might watch this entity, regardless of entitlements." + } + }, + "if": { + "properties": { + "entityType": { + "const": "program" + } + } + }, + "then": { + "required": [ + "programType" + ], + "not": { + "required": [ + "musicType" + ] + } + }, + "else": { + "required": [ + "musicType" + ], + "not": { + "required": [ + "programType" + ] + } + } + }, + "ProgramType": { + "title": "ProgramType", + "type": "string", + "description": "In the case of a program `entityType`, specifies the program type.", + "enum": [ + "movie", + "episode", + "season", + "series", + "other", + "preview", + "extra", + "concert", + "sportingEvent", + "advertisement", + "musicVideo", + "minisode" + ] + } + }, + "Intents": { + "uri": "https://meta.comcast.com/firebolt/intents", + "NavigationIntent": { + "title": "NavigationIntent", + "description": "A Firebolt compliant representation of a user intention to navigate to a specific place in an app.", + "anyOf": [ + { + "$ref": "#/x-schemas/Intents/HomeIntent" + }, + { + "$ref": "#/x-schemas/Intents/LaunchIntent" + }, + { + "$ref": "#/x-schemas/Intents/EntityIntent" + }, + { + "$ref": "#/x-schemas/Intents/PlaybackIntent" + }, + { + "$ref": "#/x-schemas/Intents/SearchIntent" + }, + { + "$ref": "#/x-schemas/Intents/SectionIntent" + }, + { + "$ref": "#/x-schemas/Intents/TuneIntent" + }, + { + "$ref": "#/x-schemas/Intents/PlayEntityIntent" + }, + { + "$ref": "#/x-schemas/Intents/PlayQueryIntent" + } + ] + }, + "HomeIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to it's home screen, and bring that app to the foreground if needed.", + "title": "HomeIntent", + "allOf": [ + { + "title": "HomeIntent", + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "title": "HomeIntent", + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "title": "HomeIntent", + "type": "object", + "properties": { + "action": { + "const": "home" + } + }, + "not": { + "required": [ + "data" + ] + } + } + ], + "examples": [ + { + "action": "home", + "context": { + "source": "voice" + } + } + ] + }, + "LaunchIntent": { + "description": "A Firebolt compliant representation of a user intention to launch an app.", + "title": "LaunchIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "launch" + } + }, + "not": { + "required": [ + "data" + ] + } + } + ], + "examples": [ + { + "action": "launch", + "context": { + "source": "voice" + } + } + ] + }, + "EntityIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a specific entity page, and bring that app to the foreground if needed.", + "title": "EntityIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "entity" + }, + "data": { + "$ref": "#/x-schemas/Entity/Entity" + } + } + } + ], + "examples": [ + { + "action": "entity", + "context": { + "source": "voice" + }, + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "el-camino" + } + } + ] + }, + "PlaybackIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a the video player for a specific, playable entity, and bring that app to the foreground if needed.", + "title": "PlaybackIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "playback" + }, + "data": { + "$ref": "#/x-schemas/Entity/PlayableEntity" + } + } + } + ], + "examples": [ + { + "action": "playback", + "data": { + "entityType": "program", + "programType": "episode", + "entityId": "breaking-bad-pilot", + "seriesId": "breaking-bad", + "seasonId": "breaking-bad-season-1" + }, + "context": { + "source": "voice" + } + } + ] + }, + "SearchIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to it's search UI with a search term populated, and bring that app to the foreground if needed.", + "title": "SearchIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "search" + }, + "data": { + "type": "object", + "required": [ + "query" + ], + "properties": { + "query": { + "type": "string" + }, + "suggestions": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entity/Entity" + } + } + }, + "additionalProperties": false + } + } + } + ], + "examples": [ + { + "action": "search", + "data": { + "query": "walter white" + }, + "context": { + "source": "voice" + } + } + ] + }, + "SectionIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a section not covered by `home`, `entity`, `player`, or `search`, and bring that app to the foreground if needed.", + "title": "SectionIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "section" + }, + "data": { + "type": "object", + "required": [ + "sectionName" + ], + "properties": { + "sectionName": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "required": [ + "data" + ] + } + ], + "examples": [ + { + "action": "section", + "data": { + "sectionName": "settings" + }, + "context": { + "source": "voice" + } + } + ] + }, + "TuneIntent": { + "description": "A Firebolt compliant representation of a user intention to 'tune' to a traditional over-the-air broadcast, or an OTT Stream from an OTT or vMVPD App.", + "title": "TuneIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "tune" + }, + "data": { + "type": "object", + "required": [ + "entity" + ], + "additionalProperties": false, + "properties": { + "entity": { + "$ref": "#/x-schemas/Entity/ChannelEntity" + }, + "options": { + "description": "The options property of the data property MUST have only one of the following fields.", + "type": "object", + "required": [], + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "properties": { + "assetId": { + "type": "string", + "description": "The ID of a specific 'listing', as scoped by the target App's ID-space, which the App should begin playback from." + }, + "restartCurrentProgram": { + "type": "boolean", + "description": "Denotes that the App should start playback at the most recent program boundary, rather than 'live.'" + }, + "time": { + "type": "string", + "format": "date-time", + "description": "ISO 8601 Date/Time where the App should begin playback from." + } + } + } + } + } + } + } + ], + "examples": [ + { + "action": "tune", + "data": { + "entity": { + "entityType": "channel", + "channelType": "streaming", + "entityId": "an-ott-channel" + }, + "options": { + "restartCurrentProgram": true + } + }, + "context": { + "source": "voice" + } + } + ] + }, + "PlayEntityIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a the video player for a specific, playable entity, and bring that app to the foreground if needed.", + "title": "PlayEntityIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "play-entity" + }, + "data": { + "type": "object", + "properties": { + "entity": { + "$ref": "#/x-schemas/Entity/PlayableEntity" + }, + "options": { + "type": "object", + "properties": { + "playFirstId": { + "type": "string" + }, + "playFirstTrack": { + "type": "integer", + "minimum": 1 + } + }, + "additionalProperties": false + } + }, + "required": [ + "entity" + ], + "propertyNames": { + "enum": [ + "entity", + "options" + ] + }, + "if": { + "properties": { + "entity": { + "type": "object", + "required": [ + "entityType" + ], + "properties": { + "entityType": { + "const": "playlist" + } + } + } + } + }, + "then": { + "type": "object", + "properties": { + "options": { + "type": "object", + "maxProperties": 1 + } + } + }, + "else": { + "type": "object", + "properties": { + "options": { + "type": "object", + "maxProperties": 0 + } + } + } + } + } + } + ], + "examples": [ + { + "action": "play-entity", + "data": { + "entity": { + "entityType": "playlist", + "entityId": "playlist/xyz" + }, + "options": { + "playFirstId": "song/xyz" + } + }, + "context": { + "source": "voice" + } + }, + { + "action": "play-entity", + "data": { + "entity": { + "entityType": "playlist", + "entityId": "playlist/xyz" + }, + "options": { + "playFirstTrack": 3 + } + }, + "context": { + "source": "voice" + } + } + ] + }, + "PlayQueryIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a the video player for an abstract query to be searched for and played by the app.", + "title": "PlayQueryIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "play-query" + }, + "data": { + "type": "object", + "properties": { + "query": { + "type": "string" + }, + "options": { + "type": "object", + "properties": { + "programTypes": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/ProgramType" + } + }, + "musicTypes": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/MusicType" + } + } + }, + "additionalProperties": false + } + }, + "required": [ + "query" + ], + "propertyNames": { + "enum": [ + "query", + "options" + ] + } + } + } + } + ], + "examples": [ + { + "action": "play-query", + "data": { + "query": "Ed Sheeran" + }, + "context": { + "source": "voice" + } + }, + { + "action": "play-query", + "data": { + "query": "Ed Sheeran", + "options": { + "programTypes": [ + "movie" + ] + } + }, + "context": { + "source": "voice" + } + }, + { + "action": "play-query", + "data": { + "query": "Ed Sheeran", + "options": { + "programTypes": [ + "movie" + ], + "musicTypes": [ + "song" + ] + } + }, + "context": { + "source": "voice" + } + } + ] + }, + "Intent": { + "description": "A Firebolt compliant representation of a user intention.", + "type": "object", + "required": [ + "action", + "context" + ], + "properties": { + "action": { + "type": "string" + }, + "context": { + "type": "object", + "required": [ + "source" + ], + "properties": { + "source": { + "type": "string" + } + } + } + } + }, + "IntentProperties": { + "type": "object", + "propertyNames": { + "enum": [ + "action", + "data", + "context" + ] + } + } + }, + "Lifecycle": { + "uri": "https://meta.comcast.com/firebolt/lifecycle", + "CloseReason": { + "title": "CloseReason", + "description": "The application close reason", + "type": "string", + "enum": [ + "remoteButton", + "userExit", + "done", + "error" + ] + }, + "LifecycleState": { + "title": "LifecycleState", + "description": "The application lifecycle state", + "type": "string", + "enum": [ + "initializing", + "inactive", + "foreground", + "background", + "unloading", + "suspended" + ] + } + }, + "SecondScreen": { + "uri": "https://meta.comcast.com/firebolt/secondscreen", + "SecondScreenEvent": { + "title": "SecondScreenEvent", + "description": "An a message notification from a second screen device", + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "dial" + ] + }, + "version": { + "type": "string" + }, + "data": { + "type": "string" + } + } + } + } + } +} \ No newline at end of file diff --git a/requirements/pr-fix-ci-fb-version/specifications/firebolt-discovery-open-rpc.json b/requirements/pr-fix-ci-fb-version/specifications/firebolt-discovery-open-rpc.json new file mode 100644 index 000000000..cf27a6aa2 --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/firebolt-discovery-open-rpc.json @@ -0,0 +1,2578 @@ +{ + "openrpc": "1.2.4", + "info": { + "title": "Firebolt Discovery SDK", + "version": "1.5.0-fix-ci-fb-version.0", + "x-module-descriptions": {} + }, + "methods": [ + { + "name": "Content.requestUserInterest", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Discovery.onRequestUserInterest", + "x-uses": [ + "xrn:firebolt:capability:discovery:interest" + ] + } + ], + "summary": "Provide information about the entity currently displayed or selected on the screen.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [ + { + "name": "type", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/InterestType" + } + }, + { + "name": "reason", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/InterestReason" + } + } + ], + "result": { + "name": "interest", + "schema": { + "$ref": "#/components/schemas/InterestResult" + }, + "summary": "The EntityDetails data." + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "type", + "value": "interest" + }, + { + "name": "reason", + "value": "playlist" + } + ], + "result": { + "name": "interest", + "value": { + "appId": "cool-app", + "entity": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + } + } + } + ] + }, + { + "name": "Content.onUserInterest", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-provided-by": "Discovery.userInterest", + "x-uses": [ + "xrn:firebolt:capability:discovery:interest" + ] + } + ], + "summary": "Provide information about the entity currently displayed or selected on the screen.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "interest", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/InterestEvent" + } + ] + }, + "summary": "The EntityDetails data." + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "interest", + "value": { + "appId": "cool-app", + "type": "interest", + "reason": "playlist", + "entity": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + } + } + } + ] + } + ], + "components": { + "schemas": { + "ChallengeRequestor": { + "title": "ChallengeRequestor", + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "string", + "description": "The id of the app that requested the challenge" + }, + "name": { + "type": "string", + "description": "The name of the app that requested the challenge" + } + } + }, + "Challenge": { + "title": "Challenge", + "type": "object", + "required": [ + "capability", + "requestor" + ], + "properties": { + "capability": { + "type": "string", + "description": "The capability that is being requested by the user to approve" + }, + "requestor": { + "description": "The identity of which app is requesting access to this capability", + "$ref": "#/components/schemas/ChallengeRequestor" + } + } + }, + "InterestResult": { + "title": "InterestResult", + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "entity": { + "$ref": "#/x-schemas/Entity/EntityDetails" + } + }, + "required": [ + "appId", + "entity" + ] + }, + "InterestEvent": { + "title": "InterestEvent", + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "type": { + "$ref": "#/x-schemas/Discovery/InterestType" + }, + "reason": { + "$ref": "#/x-schemas/Discovery/InterestReason" + }, + "entity": { + "$ref": "#/x-schemas/Entity/EntityDetails" + } + }, + "required": [ + "appId", + "entity", + "type", + "reason" + ] + }, + "NetworkType": { + "title": "NetworkType", + "type": "string", + "enum": [ + "wifi", + "ethernet", + "hybrid" + ], + "description": "The type of network that is currently active" + }, + "NetworkState": { + "title": "NetworkState", + "type": "string", + "enum": [ + "connected", + "disconnected" + ], + "description": "The type of network that is currently active" + }, + "FederatedRequest": { + "title": "FederatedRequest", + "type": "object", + "properties": { + "correlationId": { + "type": "string" + } + }, + "required": [ + "correlationId" + ], + "propertyNames": { + "enum": [ + "correlationId", + "parameters" + ] + }, + "examples": [ + { + "correlationId": "xyz" + } + ] + }, + "FederatedResponse": { + "title": "FederatedResponse", + "type": "object", + "properties": { + "correlationId": { + "type": "string" + } + }, + "required": [ + "correlationId", + "result" + ], + "propertyNames": { + "enum": [ + "correlationId", + "result" + ] + }, + "examples": [ + { + "correlationId": "xyz" + } + ] + }, + "EntityInfoParameters": { + "title": "EntityInfoParameters", + "type": "object", + "properties": { + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + } + }, + "required": [ + "entityId" + ], + "additionalProperties": false, + "examples": [ + { + "entityId": "345" + } + ] + }, + "PurchasedContentParameters": { + "title": "PurchasedContentParameters", + "type": "object", + "properties": { + "limit": { + "type": "integer", + "minimum": -1 + }, + "offeringType": { + "$ref": "#/x-schemas/Entertainment/OfferingType" + }, + "programType": { + "$ref": "#/x-schemas/Entertainment/ProgramType" + } + }, + "required": [ + "limit" + ], + "additionalProperties": false, + "examples": [ + { + "limit": 100 + } + ] + }, + "Availability": { + "title": "Availability", + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "channel-lineup", + "program-lineup" + ] + }, + "id": { + "type": "string" + }, + "catalogId": { + "type": "string" + }, + "startTime": { + "type": "string", + "format": "date-time" + }, + "endTime": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "type", + "id" + ] + }, + "HDMIPortId": { + "type": "string", + "pattern": "^HDMI[0-9]+$" + }, + "EDIDVersion": { + "title": "EDIDVersion", + "type": "string", + "enum": [ + "1.4", + "2.0", + "unknown" + ] + }, + "HDMISignalStatus": { + "type": "string", + "enum": [ + "none", + "stable", + "unstable", + "unsupported", + "unknown" + ] + }, + "KeyboardParameters": { + "title": "KeyboardParameters", + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "description": "The message to display to the user so the user knows what they are entering", + "type": "string" + } + }, + "examples": [ + { + "type": "standard", + "message": "Enter your user name." + } + ] + }, + "EventObjectPrimitives": { + "title": "EventObjectPrimitives", + "anyOf": [ + { + "type": "string", + "maxLength": 256 + }, + { + "type": "number" + }, + { + "type": "integer" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "EventObject": { + "title": "EventObject", + "type": "object", + "maxProperties": 256, + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/EventObjectPrimitives" + }, + { + "type": "array", + "maxItems": 256, + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/EventObjectPrimitives" + }, + { + "$ref": "#/components/schemas/EventObject" + } + ] + } + }, + { + "$ref": "#/components/schemas/EventObject" + } + ] + } + }, + "PinChallenge": { + "title": "PinChallenge", + "type": "object", + "required": [ + "requestor", + "pinSpace" + ], + "properties": { + "pinSpace": { + "type": "string", + "description": "The pin space that this challenge is for", + "enum": [ + "purchase", + "content" + ] + }, + "capability": { + "type": "string", + "description": "The capability that is gated by a pin challenge" + }, + "requestor": { + "description": "The identity of which app is requesting access to this capability", + "$ref": "#/components/schemas/ChallengeRequestor" + } + } + }, + "ResultReason": { + "title": "ResultReason", + "type": "string", + "description": "The reason for the result of challenging the user", + "enum": [ + "noPinRequired", + "noPinRequiredWindow", + "exceededPinFailures", + "correctPin", + "cancelled" + ] + }, + "AppInfo": { + "description": "Information about an app that a grant was for", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "id" + ] + }, + "GrantState": { + "description": "The state the grant is in", + "type": "string", + "enum": [ + "granted", + "denied" + ] + }, + "WifiSecurityMode": { + "title": "WifiSecurityMode", + "description": "Security Mode supported for Wifi", + "type": "string", + "enum": [ + "none", + "wep64", + "wep128", + "wpaPskTkip", + "wpaPskAes", + "wpa2PskTkip", + "wpa2PskAes", + "wpaEnterpriseTkip", + "wpaEnterpriseAes", + "wpa2EnterpriseTkip", + "wpa2EnterpriseAes", + "wpa2Psk", + "wpa2Enterprise", + "wpa3PskAes", + "wpa3Sae" + ] + }, + "WifiSignalStrength": { + "title": "WifiSignalStrength", + "description": "Strength of Wifi signal, value is negative based on RSSI specification.", + "type": "integer", + "default": -255, + "minimum": -255, + "maximum": 0 + }, + "WifiFrequency": { + "title": "WifiFrequency", + "description": "Wifi Frequency in Ghz, example 2.4Ghz and 5Ghz.", + "type": "number", + "default": 0, + "minimum": 0 + }, + "AccessPoint": { + "title": "AccessPoint", + "description": "Properties of a scanned wifi list item.", + "type": "object", + "properties": { + "ssid": { + "type": "string", + "description": "Name of the wifi." + }, + "securityMode": { + "$ref": "#/components/schemas/WifiSecurityMode" + }, + "signalStrength": { + "$ref": "#/components/schemas/WifiSignalStrength" + }, + "frequency": { + "$ref": "#/components/schemas/WifiFrequency" + } + } + } + } + }, + "x-schemas": { + "Types": { + "uri": "https://meta.comcast.com/firebolt/types", + "SemanticVersion": { + "title": "SemanticVersion", + "type": "object", + "properties": { + "major": { + "type": "integer", + "minimum": 0 + }, + "minor": { + "type": "integer", + "minimum": 0 + }, + "patch": { + "type": "integer", + "minimum": 0 + }, + "readable": { + "type": "string" + } + }, + "required": [ + "major", + "minor", + "patch", + "readable" + ], + "additionalProperties": false + }, + "ListenResponse": { + "title": "ListenResponse", + "type": "object", + "required": [ + "event", + "listening" + ], + "properties": { + "event": { + "type": "string", + "pattern": "[a-zA-Z]+\\.on[A-Z][a-zA-Z]+" + }, + "listening": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "ProviderRequest": { + "title": "ProviderRequest", + "type": "object", + "required": [ + "correlationId" + ], + "additionalProperties": false, + "properties": { + "correlationId": { + "type": "string", + "description": "The id that was passed in to the event that triggered a provider method to be called" + }, + "parameters": { + "description": "The result of the provider response.", + "type": [ + "object", + "null" + ] + } + } + }, + "AudioProfile": { + "title": "AudioProfile", + "type": "string", + "enum": [ + "stereo", + "dolbyDigital5.1", + "dolbyDigital5.1+", + "dolbyAtmos" + ] + }, + "LocalizedString": { + "title": "LocalizedString", + "description": "Localized string supports either a simple `string` or a Map of language codes to strings. When using a simple `string`, the current preferred langauge from `Localization.langauge()` is assumed.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + ], + "examples": [ + "A simple string, with no language code", + { + "en": "This is english", + "es": "esto es español" + } + ] + }, + "FlatMap": { + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + }, + "BooleanMap": { + "title": "BooleanMap", + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "Timeout": { + "title": "Timeout", + "description": "Defines the timeout in seconds. If the threshold for timeout is passed for any operation without a result it will throw an error.", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 9999 + } + }, + "Accessibility": { + "uri": "https://meta.comcast.com/firebolt/accessibility", + "ClosedCaptionsSettings": { + "title": "ClosedCaptionsSettings", + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether or not closed-captions should be enabled by default" + }, + "styles": { + "$ref": "#/x-schemas/Accessibility/ClosedCaptionsStyles" + }, + "preferredLanguages": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + }, + "examples": [ + { + "enabled": true, + "styles": { + "fontFamily": "monospaced_serif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] + } + ] + }, + "VoiceGuidanceSettings": { + "title": "VoiceGuidanceSettings", + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether or not voice guidance should be enabled by default" + }, + "speed": { + "$ref": "#/x-schemas/Accessibility/VoiceSpeed", + "description": "The speed at which voice guidance speech will be read back to the user" + } + }, + "examples": [ + { + "enabled": true, + "speed": 2 + } + ] + }, + "VoiceSpeed": { + "title": "VoiceSpeed", + "type": "number", + "minimum": 0.5, + "maximum": 2 + }, + "ClosedCaptionsStyles": { + "title": "ClosedCaptionsStyles", + "type": "object", + "description": "The default styles to use when displaying closed-captions", + "properties": { + "fontFamily": { + "$ref": "#/x-schemas/Accessibility/FontFamily" + }, + "fontSize": { + "$ref": "#/x-schemas/Accessibility/FontSize" + }, + "fontColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "fontEdge": { + "$ref": "#/x-schemas/Accessibility/FontEdge" + }, + "fontEdgeColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "fontOpacity": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "backgroundColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "backgroundOpacity": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "textAlign": { + "$ref": "#/x-schemas/Accessibility/HorizontalAlignment" + }, + "textAlignVertical": { + "$ref": "#/x-schemas/Accessibility/VerticalAlignment" + }, + "windowColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "windowOpacity": { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + } + }, + "FontFamily": { + "type": [ + "string", + "null" + ], + "enum": [ + "monospaced_serif", + "proportional_serif", + "monospaced_sanserif", + "proportional_sanserif", + "smallcaps", + "cursive", + "casual", + null + ] + }, + "FontSize": { + "type": [ + "number", + "null" + ], + "minimum": 0 + }, + "Color": { + "type": [ + "string", + "null" + ] + }, + "FontEdge": { + "type": [ + "string", + "null" + ], + "enum": [ + "none", + "raised", + "depressed", + "uniform", + "drop_shadow_left", + "drop_shadow_right", + null + ] + }, + "Opacity": { + "type": [ + "number", + "null" + ], + "minimum": 0, + "maximum": 100 + }, + "HorizontalAlignment": { + "type": [ + "string", + "null" + ] + }, + "VerticalAlignment": { + "type": [ + "string", + "null" + ] + } + }, + "Localization": { + "uri": "https://meta.comcast.com/firebolt/localization", + "ISO639_2Language": { + "type": "string", + "pattern": "^[a-z]{3}$" + }, + "Locality": { + "type": "string" + }, + "CountryCode": { + "type": "string", + "pattern": "^[A-Z]{2}$" + }, + "Language": { + "type": "string", + "pattern": "^[A-Za-z]{2}$" + }, + "Locale": { + "type": "string", + "pattern": "^[a-zA-Z]+([a-zA-Z0-9\\-]*)$" + }, + "TimeZone": { + "type": "string", + "pattern": "^[-+_/ A-Za-z 0-9]*$" + } + }, + "Advertising": { + "uri": "https://meta.comcast.com/firebolt/advertising", + "SkipRestriction": { + "title": "SkipRestriction", + "$comment": "xrn:advertising:policy:skipRestriction:", + "type": "string", + "enum": [ + "none", + "adsUnwatched", + "adsAll", + "all" + ], + "description": "The advertisement skip restriction.\n\nApplies to fast-forward/rewind (e.g. trick mode), seeking over an entire opportunity (e.g. jump), seeking out of what's currently playing, and \"Skip this ad...\" features. Seeking over multiple ad opportunities only requires playback of the _last_ opportunity, not all opportunities, preceding the seek destination.\n\n| Value | Description |\n|--------------|--------------------------------------------------------------------------------|\n| none |No fast-forward, jump, or skip restrictions |\n| adsUnwatched | Restrict fast-forward, jump, and skip for unwatched ad opportunities only. |\n| adsAll | Restrict fast-forward, jump, and skip for all ad opportunities |\n| all | Restrict fast-forward, jump, and skip for all ad opportunities and all content |\n\nNamespace: `xrn:advertising:policy:skipRestriction:`\n\n" + } + }, + "Capabilities": { + "uri": "https://meta.comcast.com/firebolt/capabilities", + "Capability": { + "title": "Capability", + "type": "string", + "description": "A Capability is a discrete unit of functionality that a Firebolt device might be able to perform.", + "pattern": "^xrn:firebolt:capability:([a-z0-9\\-]+)((:[a-z0-9\\-]+)?)$" + }, + "CapabilityInfo": { + "title": "CapabilityInfo", + "type": "object", + "required": [ + "supported", + "available", + "use", + "manage", + "provide" + ], + "properties": { + "capability": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "supported": { + "type": "boolean", + "description": "Provides info whether the capability is supported" + }, + "available": { + "type": "boolean", + "description": "Provides info whether the capability is available" + }, + "use": { + "$ref": "#/x-schemas/Capabilities/CapPermissionStatus" + }, + "manage": { + "$ref": "#/x-schemas/Capabilities/CapPermissionStatus" + }, + "provide": { + "$ref": "#/x-schemas/Capabilities/CapPermissionStatus" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/DenyReason" + }, + "minItems": 1, + "maxItems": 6 + } + }, + "additionalProperties": false, + "examples": [ + { + "capability": "xrn:firebolt:capability:keyboard", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + } + ] + }, + "Permission": { + "title": "Permission", + "description": "A capability combined with a Role, which an app may be permitted (by a distributor) or granted (by an end user).", + "type": "object", + "required": [ + "capability" + ], + "properties": { + "role": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "capability": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + "additionalProperties": false + }, + "Role": { + "title": "Role", + "description": "Role provides access level for the app for a given capability.", + "type": "string", + "enum": [ + "use", + "manage", + "provide" + ] + }, + "CapPermissionStatus": { + "type": "object", + "properties": { + "permitted": { + "type": "boolean", + "description": "Provides info whether the capability is permitted" + }, + "granted": { + "oneOf": [ + { + "type": "boolean", + "description": "Provides info whether the capability is granted" + }, + { + "const": null + } + ] + } + }, + "additionalProperties": false + }, + "DenyReason": { + "title": "DenyReason", + "description": "Reasons why a Capability might not be invokable", + "type": "string", + "enum": [ + "unpermitted", + "unsupported", + "disabled", + "unavailable", + "grantDenied", + "ungranted" + ] + } + }, + "Discovery": { + "uri": "https://meta.comcast.com/firebolt/discovery", + "InterestType": { + "title": "InterestType", + "type": "string", + "enum": [ + "interest", + "disinterest" + ] + }, + "InterestReason": { + "title": "InterestReason", + "type": "string", + "enum": [ + "playlist", + "reaction", + "recording" + ] + }, + "EntityInfoResult": { + "title": "EntityInfoResult", + "description": "The result for an `entityInfo()` push or pull.", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "entity": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + }, + "related": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + } + } + }, + "required": [ + "expires", + "entity" + ], + "additionalProperties": false + }, + "PurchasedContentResult": { + "title": "PurchasedContentResult", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "totalCount": { + "type": "integer", + "minimum": 0 + }, + "entries": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + } + } + }, + "required": [ + "expires", + "totalCount", + "entries" + ], + "additionalProperties": false + } + }, + "Entity": { + "uri": "https://meta.comcast.com/firebolt/entity", + "EntityDetails": { + "title": "EntityDetails", + "type": "object", + "required": [ + "identifiers" + ], + "properties": { + "identifiers": { + "$ref": "#/x-schemas/Entity/Entity" + }, + "info": { + "$ref": "#/x-schemas/Entity/Metadata" + }, + "waysToWatch": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/WayToWatch" + }, + "description": "An array of ways a user is might watch this entity, regardless of entitlements." + } + } + }, + "Entity": { + "oneOf": [ + { + "$ref": "#/x-schemas/Entity/ProgramEntity" + }, + { + "$ref": "#/x-schemas/Entity/MusicEntity" + }, + { + "$ref": "#/x-schemas/Entity/ChannelEntity" + }, + { + "$ref": "#/x-schemas/Entity/UntypedEntity" + }, + { + "$ref": "#/x-schemas/Entity/PlaylistEntity" + } + ] + }, + "Metadata": { + "title": "Metadata", + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Title of the entity." + }, + "synopsis": { + "type": "string", + "description": "Short description of the entity." + }, + "seasonNumber": { + "type": "number", + "description": "For TV seasons, the season number. For TV episodes, the season that the episode belongs to." + }, + "seasonCount": { + "type": "number", + "description": "For TV series, seasons, and episodes, the total number of seasons." + }, + "episodeNumber": { + "type": "number", + "description": "For TV episodes, the episode number." + }, + "episodeCount": { + "type": "number", + "description": "For TV seasons and episodes, the total number of episodes in the current season." + }, + "releaseDate": { + "type": "string", + "format": "date-time", + "description": "The date that the program or entity was released or first aired." + }, + "contentRatings": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/ContentRating" + }, + "description": "A list of ContentRating objects, describing the entity's ratings in various rating schemes." + } + } + }, + "ProgramEntity": { + "title": "ProgramEntity", + "oneOf": [ + { + "$ref": "#/x-schemas/Entity/MovieEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVEpisodeEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVSeasonEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVSeriesEntity" + }, + { + "$ref": "#/x-schemas/Entity/AdditionalEntity" + } + ] + }, + "MusicEntity": { + "title": "MusicEntity", + "type": "object", + "properties": { + "entityType": { + "const": "music" + }, + "musicType": { + "$ref": "#/x-schemas/Entertainment/MusicType" + }, + "entityId": { + "type": "string" + } + }, + "required": [ + "entityType", + "musicType", + "entityId" + ] + }, + "ChannelEntity": { + "title": "ChannelEntity", + "type": "object", + "properties": { + "entityType": { + "const": "channel" + }, + "channelType": { + "type": "string", + "enum": [ + "streaming", + "overTheAir" + ] + }, + "entityId": { + "type": "string", + "description": "ID of the channel, in the target App's scope." + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "required": [ + "entityType", + "channelType", + "entityId" + ], + "additionalProperties": false + }, + "UntypedEntity": { + "title": "UntypedEntity", + "allOf": [ + { + "description": "A Firebolt compliant representation of the remaining entity types.", + "type": "object", + "required": [ + "entityId" + ], + "properties": { + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false + } + ], + "examples": [ + { + "entityId": "an-entity" + } + ] + }, + "PlaylistEntity": { + "title": "PlaylistEntity", + "description": "A Firebolt compliant representation of a Playlist entity.", + "type": "object", + "required": [ + "entityType", + "entityId" + ], + "properties": { + "entityType": { + "const": "playlist" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "playlist", + "entityId": "playlist/xyz" + } + ] + }, + "MovieEntity": { + "title": "MovieEntity", + "description": "A Firebolt compliant representation of a Movie entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "movie" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "movie", + "entityId": "el-camino" + } + ] + }, + "TVEpisodeEntity": { + "title": "TVEpisodeEntity", + "description": "A Firebolt compliant representation of a TV Episode entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId", + "seriesId", + "seasonId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "episode" + }, + "entityId": { + "type": "string" + }, + "seriesId": { + "type": "string" + }, + "seasonId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "episode", + "entityId": "breaking-bad-pilot", + "seriesId": "breaking-bad", + "seasonId": "breaking-bad-season-1" + } + ] + }, + "TVSeasonEntity": { + "title": "TVSeasonEntity", + "description": "A Firebolt compliant representation of a TV Season entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId", + "seriesId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "season" + }, + "entityId": { + "type": "string" + }, + "seriesId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "season", + "entityId": "breaking-bad-season-1", + "seriesId": "breaking-bad" + } + ] + }, + "TVSeriesEntity": { + "title": "TVSeriesEntity", + "description": "A Firebolt compliant representation of a TV Series entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "series" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "series", + "entityId": "breaking-bad" + } + ] + }, + "AdditionalEntity": { + "title": "AdditionalEntity", + "description": "A Firebolt compliant representation of the remaining program entity types.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "type": "string", + "enum": [ + "concert", + "sportingEvent", + "preview", + "other", + "advertisement", + "musicVideo", + "minisode", + "extra" + ] + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "concert", + "entityId": "live-aid" + } + ] + }, + "PlayableEntity": { + "title": "PlayableEntity", + "anyOf": [ + { + "$ref": "#/x-schemas/Entity/MovieEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVEpisodeEntity" + }, + { + "$ref": "#/x-schemas/Entity/PlaylistEntity" + }, + { + "$ref": "#/x-schemas/Entity/MusicEntity" + }, + { + "$ref": "#/x-schemas/Entity/AdditionalEntity" + } + ] + } + }, + "Entertainment": { + "uri": "https://meta.comcast.com/firebolt/entertainment", + "WayToWatch": { + "title": "WayToWatch", + "type": "object", + "required": [ + "identifiers", + "audioProfile" + ], + "properties": { + "identifiers": { + "$ref": "#/x-schemas/Entertainment/ContentIdentifiers" + }, + "expires": { + "type": "string", + "format": "date-time", + "description": "Time when the WayToWatch is no longer available." + }, + "entitled": { + "type": "boolean", + "description": "Specify if the user is entitled to watch the entity." + }, + "entitledExpires": { + "type": "string", + "format": "date-time", + "description": "Time when the entity is no longer entitled." + }, + "offeringType": { + "$ref": "#/x-schemas/Entertainment/OfferingType" + }, + "hasAds": { + "type": "boolean", + "description": "True if the streamable asset contains ads." + }, + "price": { + "type": "number", + "description": "For \"buy\" and \"rent\" WayToWatch, the price to buy or rent in the user's preferred currency." + }, + "videoQuality": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "SD", + "HD", + "UHD" + ] + }, + "description": "List of the video qualities available via the WayToWatch." + }, + "audioProfile": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Types/AudioProfile" + }, + "description": "List of the audio types available via the WayToWatch." + }, + "audioLanguages": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of audio track languages available on the WayToWatch. The first is considered the primary language. Languages are expressed as ISO 639 1/2 codes." + }, + "closedCaptions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of languages for which closed captions are available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes." + }, + "subtitles": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of languages for which subtitles are available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes." + }, + "audioDescriptions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of languages for which audio descriptions (DVD) as available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes." + } + }, + "description": "A WayToWatch describes a way to watch a video program. It may describe a single\nstreamable asset or a set of streamable assets. For example, an app provider may\ndescribe HD, SD, and UHD assets as individual WayToWatch objects or rolled into\na single WayToWatch.\n\nIf the WayToWatch represents a single streamable asset, the provided\nContentIdentifiers must be sufficient to play back the specific asset when sent\nvia a playback intent or deep link. If the WayToWatch represents multiple\nstreamable assets, the provided ContentIdentifiers must be sufficient to\nplayback one of the assets represented with no user action. In this scenario,\nthe app SHOULD choose the best asset for the user based on their device and\nsettings. The ContentIdentifiers MUST also be sufficient for navigating the user\nto the appropriate entity or detail screen via an entity intent.\n\nThe app should set the `entitled` property to indicate if the user can watch, or\nnot watch, the asset without making a purchase. If the entitlement is known to\nexpire at a certain time (e.g., a rental), the app should also provide the\n`entitledExpires` property. If the entitlement is not expired, the UI will use\nthe `entitled` property to display watchable assets to the user, adjust how\nassets are presented to the user, and how intents into the app are generated.\nFor example, the the Aggregated Experience could render a \"Watch\" button for an\nentitled asset versus a \"Subscribe\" button for an non-entitled asset.\n\nThe app should set the `offeringType` to define how the content may be\nauthorized. The UI will use this to adjust how content is presented to the user.\n\nA single WayToWatch cannot represent streamable assets available via multiple\npurchase paths. If, for example, an asset has both Buy, Rent and Subscription\navailability, the three different entitlement paths MUST be represented as\nmultiple WayToWatch objects.\n\n`price` should be populated for WayToWatch objects with `buy` or `rent`\n`offeringType`. If the WayToWatch represents a set of assets with various price\npoints, the `price` provided must be the lowest available price." + }, + "OfferingType": { + "title": "OfferingType", + "type": "string", + "enum": [ + "free", + "subscribe", + "buy", + "rent" + ], + "description": "The offering type of the WayToWatch." + }, + "ContentIdentifiers": { + "title": "ContentIdentifiers", + "type": "object", + "properties": { + "assetId": { + "type": "string", + "description": "Identifies a particular playable asset. For example, the HD version of a particular movie separate from the UHD version." + }, + "entityId": { + "type": "string", + "description": "Identifies an entity, such as a Movie, TV Series or TV Episode." + }, + "seasonId": { + "type": "string", + "description": "The TV Season for a TV Episode." + }, + "seriesId": { + "type": "string", + "description": "The TV Series for a TV Episode or TV Season." + }, + "appContentData": { + "type": "string", + "description": "App-specific content identifiers.", + "maxLength": 1024 + } + }, + "description": "The ContentIdentifiers object is how the app identifies an entity or asset to\nthe Firebolt platform. These ids are used to look up metadata and deep link into\nthe app.\n\nApps do not need to provide all ids. They only need to provide the minimum\nrequired to target a playable stream or an entity detail screen via a deep link.\nIf an id isn't needed to get to those pages, it doesn't need to be included." + }, + "ContentRating": { + "title": "ContentRating", + "type": "object", + "required": [ + "scheme", + "rating" + ], + "properties": { + "scheme": { + "type": "string", + "enum": [ + "CA-Movie", + "CA-TV", + "CA-Movie-Fr", + "CA-TV-Fr", + "US-Movie", + "US-TV" + ], + "description": "The rating scheme." + }, + "rating": { + "type": "string", + "description": "The content rating." + }, + "advisories": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional list of subratings or content advisories." + } + }, + "description": "A ContentRating represents an age or content based of an entity. Supported rating schemes and associated types are below.\n\n## United States\n\n`US-Movie` (MPAA):\n\nRatings: `NR`, `G`, `PG`, `PG13`, `R`, `NC17`\n\nAdvisories: `AT`, `BN`, `SL`, `SS`, `N`, `V`\n\n`US-TV` (Vchip):\n\nRatings: `TVY`, `TVY7`, `TVG`, `TVPG`, `TV14`, `TVMA`\n\nAdvisories: `FV`, `D`, `L`, `S`, `V`\n\n## Canada\n\n`CA-Movie` (OFRB):\n\nRatings: `G`, `PG`, `14A`, `18A`, `R`, `E`\n\n`CA-TV` (AGVOT)\n\nRatings: `E`, `C`, `C8`, `G`, `PG`, `14+`, `18+`\n\nAdvisories: `C`, `C8`, `G`, `PG`, `14+`, `18+`\n\n`CA-Movie-Fr` (Canadian French language movies):\n\nRatings: `G`, `8+`, `13+`, `16+`, `18+`\n\n`CA-TV-Fr` (Canadian French language TV):\n\nRatings: `G`, `8+`, `13+`, `16+`, `18+`\n" + }, + "MusicType": { + "title": "MusicType", + "type": "string", + "description": "In the case of a music `entityType`, specifies the type of music entity.", + "enum": [ + "song", + "album" + ] + }, + "Entitlement": { + "title": "Entitlement", + "type": "object", + "properties": { + "entitlementId": { + "type": "string" + }, + "startTime": { + "type": "string", + "format": "date-time" + }, + "endTime": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "entitlementId" + ] + }, + "EntityInfo": { + "title": "EntityInfo", + "description": "An EntityInfo object represents an \"entity\" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type.\n\nAdditionally, EntityInfo objects must specify a properly formed\nContentIdentifiers object, `entityType`, and `title`. The app should provide\nthe `synopsis` property for a good user experience if the content\nmetadata is not available another way.\n\nThe ContentIdentifiers must be sufficient for navigating the user to the\nappropriate entity or detail screen via a `detail` intent or deep link.\n\nEntityInfo objects must provide at least one WayToWatch object when returned as\npart of an `entityInfo` method and a streamable asset is available to the user.\nIt is optional for the `purchasedContent` method, but recommended because the UI\nmay use those data.", + "type": "object", + "required": [ + "identifiers", + "entityType", + "title" + ], + "properties": { + "identifiers": { + "$ref": "#/x-schemas/Entertainment/ContentIdentifiers" + }, + "title": { + "type": "string", + "description": "Title of the entity." + }, + "entityType": { + "type": "string", + "enum": [ + "program", + "music" + ], + "description": "The type of the entity, e.g. `program` or `music`." + }, + "programType": { + "$ref": "#/x-schemas/Entertainment/ProgramType" + }, + "musicType": { + "$ref": "#/x-schemas/Entertainment/MusicType" + }, + "synopsis": { + "type": "string", + "description": "Short description of the entity." + }, + "seasonNumber": { + "type": "number", + "description": "For TV seasons, the season number. For TV episodes, the season that the episode belongs to." + }, + "seasonCount": { + "type": "number", + "description": "For TV series, seasons, and episodes, the total number of seasons." + }, + "episodeNumber": { + "type": "number", + "description": "For TV episodes, the episode number." + }, + "episodeCount": { + "type": "number", + "description": "For TV seasons and episodes, the total number of episodes in the current season." + }, + "releaseDate": { + "type": "string", + "format": "date-time", + "description": "The date that the program or entity was released or first aired." + }, + "contentRatings": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/ContentRating" + }, + "description": "A list of ContentRating objects, describing the entity's ratings in various rating schemes." + }, + "waysToWatch": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/WayToWatch" + }, + "description": "An array of ways a user is might watch this entity, regardless of entitlements." + } + }, + "if": { + "properties": { + "entityType": { + "const": "program" + } + } + }, + "then": { + "required": [ + "programType" + ], + "not": { + "required": [ + "musicType" + ] + } + }, + "else": { + "required": [ + "musicType" + ], + "not": { + "required": [ + "programType" + ] + } + } + }, + "ProgramType": { + "title": "ProgramType", + "type": "string", + "description": "In the case of a program `entityType`, specifies the program type.", + "enum": [ + "movie", + "episode", + "season", + "series", + "other", + "preview", + "extra", + "concert", + "sportingEvent", + "advertisement", + "musicVideo", + "minisode" + ] + } + }, + "Intents": { + "uri": "https://meta.comcast.com/firebolt/intents", + "NavigationIntent": { + "title": "NavigationIntent", + "description": "A Firebolt compliant representation of a user intention to navigate to a specific place in an app.", + "anyOf": [ + { + "$ref": "#/x-schemas/Intents/HomeIntent" + }, + { + "$ref": "#/x-schemas/Intents/LaunchIntent" + }, + { + "$ref": "#/x-schemas/Intents/EntityIntent" + }, + { + "$ref": "#/x-schemas/Intents/PlaybackIntent" + }, + { + "$ref": "#/x-schemas/Intents/SearchIntent" + }, + { + "$ref": "#/x-schemas/Intents/SectionIntent" + }, + { + "$ref": "#/x-schemas/Intents/TuneIntent" + }, + { + "$ref": "#/x-schemas/Intents/PlayEntityIntent" + }, + { + "$ref": "#/x-schemas/Intents/PlayQueryIntent" + } + ] + }, + "HomeIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to it's home screen, and bring that app to the foreground if needed.", + "title": "HomeIntent", + "allOf": [ + { + "title": "HomeIntent", + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "title": "HomeIntent", + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "title": "HomeIntent", + "type": "object", + "properties": { + "action": { + "const": "home" + } + }, + "not": { + "required": [ + "data" + ] + } + } + ], + "examples": [ + { + "action": "home", + "context": { + "source": "voice" + } + } + ] + }, + "LaunchIntent": { + "description": "A Firebolt compliant representation of a user intention to launch an app.", + "title": "LaunchIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "launch" + } + }, + "not": { + "required": [ + "data" + ] + } + } + ], + "examples": [ + { + "action": "launch", + "context": { + "source": "voice" + } + } + ] + }, + "EntityIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a specific entity page, and bring that app to the foreground if needed.", + "title": "EntityIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "entity" + }, + "data": { + "$ref": "#/x-schemas/Entity/Entity" + } + } + } + ], + "examples": [ + { + "action": "entity", + "context": { + "source": "voice" + }, + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "el-camino" + } + } + ] + }, + "PlaybackIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a the video player for a specific, playable entity, and bring that app to the foreground if needed.", + "title": "PlaybackIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "playback" + }, + "data": { + "$ref": "#/x-schemas/Entity/PlayableEntity" + } + } + } + ], + "examples": [ + { + "action": "playback", + "data": { + "entityType": "program", + "programType": "episode", + "entityId": "breaking-bad-pilot", + "seriesId": "breaking-bad", + "seasonId": "breaking-bad-season-1" + }, + "context": { + "source": "voice" + } + } + ] + }, + "SearchIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to it's search UI with a search term populated, and bring that app to the foreground if needed.", + "title": "SearchIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "search" + }, + "data": { + "type": "object", + "required": [ + "query" + ], + "properties": { + "query": { + "type": "string" + }, + "suggestions": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entity/Entity" + } + } + }, + "additionalProperties": false + } + } + } + ], + "examples": [ + { + "action": "search", + "data": { + "query": "walter white" + }, + "context": { + "source": "voice" + } + } + ] + }, + "SectionIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a section not covered by `home`, `entity`, `player`, or `search`, and bring that app to the foreground if needed.", + "title": "SectionIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "section" + }, + "data": { + "type": "object", + "required": [ + "sectionName" + ], + "properties": { + "sectionName": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "required": [ + "data" + ] + } + ], + "examples": [ + { + "action": "section", + "data": { + "sectionName": "settings" + }, + "context": { + "source": "voice" + } + } + ] + }, + "TuneIntent": { + "description": "A Firebolt compliant representation of a user intention to 'tune' to a traditional over-the-air broadcast, or an OTT Stream from an OTT or vMVPD App.", + "title": "TuneIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "tune" + }, + "data": { + "type": "object", + "required": [ + "entity" + ], + "additionalProperties": false, + "properties": { + "entity": { + "$ref": "#/x-schemas/Entity/ChannelEntity" + }, + "options": { + "description": "The options property of the data property MUST have only one of the following fields.", + "type": "object", + "required": [], + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "properties": { + "assetId": { + "type": "string", + "description": "The ID of a specific 'listing', as scoped by the target App's ID-space, which the App should begin playback from." + }, + "restartCurrentProgram": { + "type": "boolean", + "description": "Denotes that the App should start playback at the most recent program boundary, rather than 'live.'" + }, + "time": { + "type": "string", + "format": "date-time", + "description": "ISO 8601 Date/Time where the App should begin playback from." + } + } + } + } + } + } + } + ], + "examples": [ + { + "action": "tune", + "data": { + "entity": { + "entityType": "channel", + "channelType": "streaming", + "entityId": "an-ott-channel" + }, + "options": { + "restartCurrentProgram": true + } + }, + "context": { + "source": "voice" + } + } + ] + }, + "PlayEntityIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a the video player for a specific, playable entity, and bring that app to the foreground if needed.", + "title": "PlayEntityIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "play-entity" + }, + "data": { + "type": "object", + "properties": { + "entity": { + "$ref": "#/x-schemas/Entity/PlayableEntity" + }, + "options": { + "type": "object", + "properties": { + "playFirstId": { + "type": "string" + }, + "playFirstTrack": { + "type": "integer", + "minimum": 1 + } + }, + "additionalProperties": false + } + }, + "required": [ + "entity" + ], + "propertyNames": { + "enum": [ + "entity", + "options" + ] + }, + "if": { + "properties": { + "entity": { + "type": "object", + "required": [ + "entityType" + ], + "properties": { + "entityType": { + "const": "playlist" + } + } + } + } + }, + "then": { + "type": "object", + "properties": { + "options": { + "type": "object", + "maxProperties": 1 + } + } + }, + "else": { + "type": "object", + "properties": { + "options": { + "type": "object", + "maxProperties": 0 + } + } + } + } + } + } + ], + "examples": [ + { + "action": "play-entity", + "data": { + "entity": { + "entityType": "playlist", + "entityId": "playlist/xyz" + }, + "options": { + "playFirstId": "song/xyz" + } + }, + "context": { + "source": "voice" + } + }, + { + "action": "play-entity", + "data": { + "entity": { + "entityType": "playlist", + "entityId": "playlist/xyz" + }, + "options": { + "playFirstTrack": 3 + } + }, + "context": { + "source": "voice" + } + } + ] + }, + "PlayQueryIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a the video player for an abstract query to be searched for and played by the app.", + "title": "PlayQueryIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "play-query" + }, + "data": { + "type": "object", + "properties": { + "query": { + "type": "string" + }, + "options": { + "type": "object", + "properties": { + "programTypes": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/ProgramType" + } + }, + "musicTypes": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/MusicType" + } + } + }, + "additionalProperties": false + } + }, + "required": [ + "query" + ], + "propertyNames": { + "enum": [ + "query", + "options" + ] + } + } + } + } + ], + "examples": [ + { + "action": "play-query", + "data": { + "query": "Ed Sheeran" + }, + "context": { + "source": "voice" + } + }, + { + "action": "play-query", + "data": { + "query": "Ed Sheeran", + "options": { + "programTypes": [ + "movie" + ] + } + }, + "context": { + "source": "voice" + } + }, + { + "action": "play-query", + "data": { + "query": "Ed Sheeran", + "options": { + "programTypes": [ + "movie" + ], + "musicTypes": [ + "song" + ] + } + }, + "context": { + "source": "voice" + } + } + ] + }, + "Intent": { + "description": "A Firebolt compliant representation of a user intention.", + "type": "object", + "required": [ + "action", + "context" + ], + "properties": { + "action": { + "type": "string" + }, + "context": { + "type": "object", + "required": [ + "source" + ], + "properties": { + "source": { + "type": "string" + } + } + } + } + }, + "IntentProperties": { + "type": "object", + "propertyNames": { + "enum": [ + "action", + "data", + "context" + ] + } + } + }, + "Lifecycle": { + "uri": "https://meta.comcast.com/firebolt/lifecycle", + "CloseReason": { + "title": "CloseReason", + "description": "The application close reason", + "type": "string", + "enum": [ + "remoteButton", + "userExit", + "done", + "error" + ] + }, + "LifecycleState": { + "title": "LifecycleState", + "description": "The application lifecycle state", + "type": "string", + "enum": [ + "initializing", + "inactive", + "foreground", + "background", + "unloading", + "suspended" + ] + } + }, + "SecondScreen": { + "uri": "https://meta.comcast.com/firebolt/secondscreen", + "SecondScreenEvent": { + "title": "SecondScreenEvent", + "description": "An a message notification from a second screen device", + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "dial" + ] + }, + "version": { + "type": "string" + }, + "data": { + "type": "string" + } + } + } + } + } +} \ No newline at end of file diff --git a/requirements/pr-fix-ci-fb-version/specifications/firebolt-manage-open-rpc.json b/requirements/pr-fix-ci-fb-version/specifications/firebolt-manage-open-rpc.json new file mode 100644 index 000000000..a702fb3d7 --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/firebolt-manage-open-rpc.json @@ -0,0 +1,13660 @@ +{ + "openrpc": "1.2.4", + "info": { + "title": "Firebolt Manage SDK", + "version": "1.5.0-fix-ci-fb-version.0", + "x-module-descriptions": { + "Account": "A module for querying about the device account.", + "AcknowledgeChallenge": "A module for registering as a provider for a user grant in which the user confirms access to a capability", + "Advertising": "A module for platform provided advertising settings and functionality.", + "AudioDescriptions": "A module for managing audio-description Settings.", + "ClosedCaptions": "A module for managing closed-captions Settings.", + "Device": "A module for querying about the device and it's capabilities.", + "Discovery": "Your App likely wants to integrate with the Platform's discovery capabilities. For example to add a \"Watch Next\" tile that links to your app from the platform's home screen.\n\nGetting access to this information requires to connect to lower level APIs made available by the platform. Since implementations differ between operators and platforms, the Firebolt SDK offers a Discovery module, that exposes a generic, agnostic interface to the developer.\n\nUnder the hood, an underlaying transport layer will then take care of calling the right APIs for the actual platform implementation that your App is running on.\n\nThe Discovery plugin is used to _send_ information to the Platform.\n\n### Localization\nApps should provide all user-facing strings in the device's language, as specified by the Firebolt `Localization.language` property.\n\nApps should provide prices in the same currency presented in the app. If multiple currencies are supported in the app, the app should provide prices in the user's current default currency.", + "HDMIInput": "Methods for managing HDMI inputs on an HDMI sink device.", + "Keyboard": "Methods for prompting users to enter text with task-oriented UX", + "Localization": "Methods for accessessing location and language preferences", + "Metrics": "Methods for sending metrics", + "PinChallenge": "A module for registering as a provider for a user grant in which the user is prompted for a pin for access to a capability", + "Privacy": "A module for managing device settings.", + "SecureStorage": "A module for storing and retrieving secure data owned by the app", + "UserGrants": "A module for managing grants given by the user", + "VoiceGuidance": "A module for managing voice-guidance Settings.", + "Wifi": "A module for providing support for Wifi." + }, + "x-interface-names": { + "xrn:firebolt:capability:lifecycle:state": "StateProvider" + } + }, + "methods": [ + { + "name": "Localization.locality", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:locality" + ] + }, + { + "name": "property" + } + ], + "summary": "Get the locality/city the device is located in", + "params": [], + "result": { + "name": "locality", + "summary": "the device city", + "schema": { + "$ref": "#/x-schemas/Localization/Locality" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "Philadelphia" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "Rockville" + } + } + ] + }, + { + "name": "Localization.postalCode", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:postal-code" + ] + } + ], + "summary": "Get the postal code the device is located in", + "params": [], + "result": { + "name": "postalCode", + "summary": "the device postal code", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "19103" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "20850" + } + } + ] + }, + { + "name": "Localization.countryCode", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:country-code" + ] + } + ], + "summary": "Get the ISO 3166-1 alpha-2 code for the country device is located in", + "params": [], + "result": { + "name": "code", + "summary": "the device country code", + "schema": { + "$ref": "#/x-schemas/Localization/CountryCode" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "US" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "UK" + } + } + ] + }, + { + "name": "Localization.language", + "summary": "Get the ISO 639 1/2 code for the preferred language", + "params": [], + "tags": [ + { + "name": "deprecated", + "x-since": "0.17.0", + "x-alternative": "Localization.locale" + }, + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "lang", + "summary": "the device language", + "schema": { + "$ref": "#/x-schemas/Localization/Language" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "en" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "es" + } + } + ] + }, + { + "name": "Localization.preferredAudioLanguages", + "summary": "A prioritized list of ISO 639 1/2 codes for the preferred audio languages on this device.", + "params": [], + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "languages", + "summary": "the preferred audio languages", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": [ + "spa", + "eng" + ] + } + }, + { + "name": "Default Example #2", + "params": [], + "result": { + "name": "Default Result", + "value": [ + "eng", + "spa" + ] + } + } + ] + }, + { + "name": "Localization.locale", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:locale" + ] + } + ], + "summary": "Get the *full* BCP 47 code, including script, region, variant, etc., for the preferred langauage/locale", + "params": [], + "result": { + "name": "locale", + "summary": "the device locale", + "schema": { + "$ref": "#/x-schemas/Localization/Locale" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "en-US" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "es-US" + } + } + ] + }, + { + "name": "Localization.additionalInfo", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:additional-info" + ] + } + ], + "summary": "Get any platform-specific localization information", + "params": [], + "result": { + "name": "info", + "summary": "the additional info", + "schema": { + "type": "object", + "additionalProperties": { + "type": [ + "number", + "string", + "boolean" + ], + "maxLength": 1024 + }, + "maxProperties": 32 + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "info", + "value": {} + } + } + ] + }, + { + "name": "Localization.addAdditionalInfo", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:additional-info" + ] + } + ], + "summary": "Add any platform-specific localization information in key/value pair", + "params": [ + { + "name": "key", + "summary": "Key to add additionalInfo", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "value", + "summary": "Value to be set for additionalInfo. Value can be a number, string or boolean", + "schema": { + "type": [ + "number", + "string", + "boolean" + ] + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Add an additionalInfo for localization", + "params": [ + { + "name": "key", + "value": "defaultKey" + }, + { + "name": "value", + "value": "defaultValue=" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "Localization.removeAdditionalInfo", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:additional-info" + ] + } + ], + "summary": "Remove any platform-specific localization information from map", + "params": [ + { + "name": "key", + "summary": "Key to remove additionalInfo", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Remove an additionalInfo for localization", + "params": [ + { + "name": "key", + "value": "defaultKey" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "Localization.timeZone", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:time-zone" + ] + } + ], + "summary": "Set the IANA timezone for the device", + "params": [], + "result": { + "name": "result", + "schema": { + "$ref": "#/x-schemas/Localization/TimeZone" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "America/New_York" + } + }, + { + "name": "Additional Example", + "params": [], + "result": { + "name": "Default Result", + "value": "America/Los_Angeles" + } + } + ] + }, + { + "name": "Localization.onLocalityChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.locality" + }, + { + "name": "event", + "x-alternative": "locality" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:locality" + ] + } + ], + "summary": "Get the locality/city the device is located in", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "locality", + "summary": "the device city", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/Locality" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Philadelphia" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Rockville" + } + } + ] + }, + { + "name": "Localization.onPostalCodeChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.postalCode" + }, + { + "name": "event", + "x-alternative": "postalCode" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:postal-code" + ] + } + ], + "summary": "Get the postal code the device is located in", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "postalCode", + "summary": "the device postal code", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "string" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "19103" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "20850" + } + } + ] + }, + { + "name": "Localization.onCountryCodeChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.countryCode" + }, + { + "name": "event", + "x-alternative": "countryCode" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:country-code" + ] + } + ], + "summary": "Get the ISO 3166-1 alpha-2 code for the country device is located in", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "code", + "summary": "the device country code", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/CountryCode" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "US" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "UK" + } + } + ] + }, + { + "name": "Localization.onLanguageChanged", + "summary": "Get the ISO 639 1/2 code for the preferred language", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.language" + }, + { + "name": "event", + "x-alternative": "language" + }, + { + "name": "deprecated", + "x-since": "0.17.0", + "x-alternative": "Localization.locale" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "lang", + "summary": "the device language", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/Language" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "en" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "es" + } + } + ] + }, + { + "name": "Localization.onPreferredAudioLanguagesChanged", + "summary": "A prioritized list of ISO 639 1/2 codes for the preferred audio languages on this device.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.preferredAudioLanguages" + }, + { + "name": "event", + "x-alternative": "preferredAudioLanguages" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "languages", + "summary": "the preferred audio languages", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + "spa", + "eng" + ] + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + "eng", + "spa" + ] + } + } + ] + }, + { + "name": "Localization.onLocaleChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.locale" + }, + { + "name": "event", + "x-alternative": "locale" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:locale" + ] + } + ], + "summary": "Get the *full* BCP 47 code, including script, region, variant, etc., for the preferred langauage/locale", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "locale", + "summary": "the device locale", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/Locale" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "en-US" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "es-US" + } + } + ] + }, + { + "name": "Localization.onTimeZoneChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.timeZone" + }, + { + "name": "event", + "x-alternative": "timeZone" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:time-zone" + ] + } + ], + "summary": "Set the IANA timezone for the device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "result", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/TimeZone" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "America/New_York" + } + }, + { + "name": "Additional Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "America/Los_Angeles" + } + } + ] + }, + { + "name": "Localization.setLocality", + "tags": [ + { + "name": "setter", + "x-setter-for": "locality" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:locality" + ] + } + ], + "summary": "Get the locality/city the device is located in", + "params": [ + { + "name": "value", + "summary": "the device city", + "schema": { + "$ref": "#/x-schemas/Localization/Locality" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "Philadelphia" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "Rockville" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setPostalCode", + "tags": [ + { + "name": "setter", + "x-setter-for": "postalCode" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:postal-code" + ] + } + ], + "summary": "Get the postal code the device is located in", + "params": [ + { + "name": "value", + "summary": "the device postal code", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "19103" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "20850" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setCountryCode", + "tags": [ + { + "name": "setter", + "x-setter-for": "countryCode" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:country-code" + ] + } + ], + "summary": "Get the ISO 3166-1 alpha-2 code for the country device is located in", + "params": [ + { + "name": "value", + "summary": "the device country code", + "schema": { + "$ref": "#/x-schemas/Localization/CountryCode" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "US" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "UK" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setLanguage", + "summary": "Get the ISO 639 1/2 code for the preferred language", + "params": [ + { + "name": "value", + "summary": "the device language", + "schema": { + "$ref": "#/x-schemas/Localization/Language" + }, + "required": true + } + ], + "tags": [ + { + "name": "setter", + "x-setter-for": "language" + }, + { + "name": "deprecated", + "x-since": "0.17.0", + "x-alternative": "Localization.locale" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "en" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "es" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setPreferredAudioLanguages", + "summary": "A prioritized list of ISO 639 1/2 codes for the preferred audio languages on this device.", + "params": [ + { + "name": "value", + "summary": "the preferred audio languages", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + }, + "required": true + } + ], + "tags": [ + { + "name": "setter", + "x-setter-for": "preferredAudioLanguages" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": [ + "spa", + "eng" + ] + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "value", + "value": [ + "eng", + "spa" + ] + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setLocale", + "tags": [ + { + "name": "setter", + "x-setter-for": "locale" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:locale" + ] + } + ], + "summary": "Get the *full* BCP 47 code, including script, region, variant, etc., for the preferred langauage/locale", + "params": [ + { + "name": "value", + "summary": "the device locale", + "schema": { + "$ref": "#/x-schemas/Localization/Locale" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "en-US" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "es-US" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setTimeZone", + "tags": [ + { + "name": "setter", + "x-setter-for": "timeZone" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:time-zone" + ] + } + ], + "summary": "Set the IANA timezone for the device", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Localization/TimeZone" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": "America/New_York" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Additional Example", + "params": [ + { + "name": "value", + "value": "America/Los_Angeles" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Metrics.event", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:distributor" + ] + } + ], + "summary": "Inform the platform of 1st party distributor metrics.", + "params": [ + { + "name": "schema", + "summary": "The schema URI of the metric type", + "schema": { + "type": "string", + "format": "uri" + }, + "required": true + }, + { + "name": "data", + "summary": "A JSON payload conforming the the provided schema", + "schema": { + "$ref": "#/components/schemas/EventObject" + }, + "required": true + } + ], + "result": { + "name": "results", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Send foo event", + "params": [ + { + "name": "schema", + "value": "http://meta.rdkcentral.com/some/schema" + }, + { + "name": "data", + "value": { + "foo": "foo" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Wifi.scan", + "summary": "Scan available wifi networks in the location.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:wifi" + ] + } + ], + "params": [ + { + "name": "timeout", + "schema": { + "$ref": "#/x-schemas/Types/Timeout" + } + } + ], + "result": { + "name": "list", + "summary": "Contains a list of wifi networks available near the device.", + "schema": { + "$ref": "#/components/schemas/AccessPointList" + } + }, + "examples": [ + { + "name": "Successful Wifi List", + "params": [ + { + "name": "timeout", + "value": 30 + } + ], + "result": { + "name": "successfulWifiResultExample", + "value": { + "list": [ + { + "ssid": "DND", + "security": "wpa2Psk", + "signalStrength": -70, + "frequency": 2.4 + }, + { + "ssid": "Fortnite", + "security": "WPA2_ENTERPRISE_AES", + "signalStrength": -70, + "frequency": 5 + }, + { + "ssid": "Guardian", + "security": "none", + "signalStrength": -70, + "frequency": 2.4 + } + ] + } + } + } + ] + }, + { + "name": "Wifi.connect", + "summary": "Connect the device to the specified SSID.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:wifi" + ] + } + ], + "params": [ + { + "name": "ssid", + "schema": { + "type": "string" + }, + "description": "Name of Wifi SSID to connect for the device." + }, + { + "name": "passphrase", + "schema": { + "type": "string" + }, + "description": "Password or Passphrase for the wifi." + }, + { + "name": "security", + "schema": { + "$ref": "#/components/schemas/WifiSecurityMode" + } + } + ], + "result": { + "name": "connectedWifi", + "summary": "Successful Response after connecting to the Wifi.", + "schema": { + "$ref": "#/components/schemas/AccessPoint" + } + }, + "examples": [ + { + "name": "Connect to a wpa2Psk Wifi with password", + "params": [ + { + "name": "ssid", + "value": "DND" + }, + { + "name": "passphrase", + "value": "gargoyle" + }, + { + "name": "security", + "value": "wpa2Psk" + } + ], + "result": { + "name": "successfulWifiConnection", + "value": { + "ssid": "DND", + "security": "wpa2Psk", + "signalStrength": -70, + "frequency": 2.4 + } + } + }, + { + "name": "Connect to a WPA2 PSK Wifi with password", + "params": [ + { + "name": "ssid", + "value": "Guardian WIFI" + }, + { + "name": "passphrase", + "value": "" + }, + { + "name": "security", + "value": "none" + } + ], + "result": { + "name": "successfulWifiConnection", + "value": { + "ssid": "Guardian WIFI", + "security": "none", + "signalStrength": -70, + "frequency": 2.4 + } + } + } + ] + }, + { + "name": "Wifi.disconnect", + "summary": "Disconnect the device if connected via WIFI.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:wifi" + ] + } + ], + "params": [], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Disconnect", + "params": [], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "Wifi.wps", + "summary": "Connect to WPS", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:wifi" + ] + } + ], + "params": [ + { + "name": "security", + "schema": { + "$ref": "#/components/schemas/WPSSecurityPin" + } + } + ], + "result": { + "name": "connectedWifi", + "summary": "Successful Response after connecting to the Wifi.", + "schema": { + "$ref": "#/components/schemas/AccessPoint" + } + }, + "examples": [ + { + "name": "Connect to a WPS Wifi router", + "params": [ + { + "name": "security", + "value": "pushButton" + } + ], + "result": { + "name": "successfulWifiConnection", + "value": { + "ssid": "DND", + "security": "wpa2Psk", + "signalStrength": -70, + "frequency": 2.4 + } + } + } + ] + }, + { + "name": "ClosedCaptions.enabled", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "Whether or not closed-captions are enabled.", + "params": [], + "result": { + "name": "enabled", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "ClosedCaptions.fontFamily", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font family for displaying closed-captions.", + "params": [], + "result": { + "name": "family", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontFamily" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "family", + "value": "monospaced_sanserif" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "family", + "value": "cursive" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "family", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.fontSize", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font size for displaying closed-captions.", + "params": [], + "result": { + "name": "size", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontSize" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "size", + "value": 1 + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "size", + "value": 1 + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "size", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.fontColor", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font color for displaying closed-captions.", + "params": [], + "result": { + "name": "color", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.fontEdge", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge style for displaying closed-captions.", + "params": [], + "result": { + "name": "edge", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontEdge" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "edge", + "value": "none" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "edge", + "value": "uniform" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "edge", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.fontEdgeColor", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge color for displaying closed-captions.", + "params": [], + "result": { + "name": "color", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.fontOpacity", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions characters.", + "params": [], + "result": { + "name": "opacity", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.backgroundColor", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred background color for displaying closed-captions, .", + "params": [], + "result": { + "name": "color", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.backgroundOpacity", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions backgrounds.", + "params": [], + "result": { + "name": "opacity", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.textAlign", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [], + "result": { + "name": "alignment", + "schema": { + "$ref": "#/x-schemas/Accessibility/HorizontalAlignment" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "alignment", + "value": "center" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "alignment", + "value": "left" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.textAlignVertical", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [], + "result": { + "name": "alignment", + "schema": { + "$ref": "#/x-schemas/Accessibility/VerticalAlignment" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "alignment", + "value": "middle" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "alignment", + "value": "top" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.windowColor", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window color for displaying closed-captions, .", + "params": [], + "result": { + "name": "color", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "color", + "value": "white" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.windowOpacity", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window opacity for displaying closed-captions backgrounds.", + "params": [], + "result": { + "name": "opacity", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.preferredLanguages", + "summary": "A prioritized list of ISO 639-2/B codes for the preferred closed captions languages on this device.", + "params": [], + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "languages", + "summary": "the preferred closed captions languages", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": [ + "spa", + "eng" + ] + } + }, + { + "name": "Default Example #2", + "params": [], + "result": { + "name": "Default Result", + "value": [ + "eng", + "spa" + ] + } + } + ] + }, + { + "name": "ClosedCaptions.onEnabledChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.enabled" + }, + { + "name": "event", + "x-alternative": "enabled" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "Whether or not closed-captions are enabled.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "enabled", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "ClosedCaptions.onFontFamilyChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontFamily" + }, + { + "name": "event", + "x-alternative": "fontFamily" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font family for displaying closed-captions.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "family", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/FontFamily" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "family", + "value": "monospaced_sanserif" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "family", + "value": "cursive" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "family", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onFontSizeChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontSize" + }, + { + "name": "event", + "x-alternative": "fontSize" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font size for displaying closed-captions.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "size", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/FontSize" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "size", + "value": 1 + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "size", + "value": 1 + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "size", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onFontColorChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontColor" + }, + { + "name": "event", + "x-alternative": "fontColor" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font color for displaying closed-captions.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "color", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Color" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onFontEdgeChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontEdge" + }, + { + "name": "event", + "x-alternative": "fontEdge" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge style for displaying closed-captions.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "edge", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/FontEdge" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "edge", + "value": "none" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "edge", + "value": "uniform" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "edge", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onFontEdgeColorChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontEdgeColor" + }, + { + "name": "event", + "x-alternative": "fontEdgeColor" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge color for displaying closed-captions.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "color", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Color" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onFontOpacityChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontOpacity" + }, + { + "name": "event", + "x-alternative": "fontOpacity" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions characters.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "opacity", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onBackgroundColorChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.backgroundColor" + }, + { + "name": "event", + "x-alternative": "backgroundColor" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred background color for displaying closed-captions, .", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "color", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Color" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onBackgroundOpacityChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.backgroundOpacity" + }, + { + "name": "event", + "x-alternative": "backgroundOpacity" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions backgrounds.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "opacity", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onTextAlignChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.textAlign" + }, + { + "name": "event", + "x-alternative": "textAlign" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "alignment", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/HorizontalAlignment" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": "center" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": "left" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onTextAlignVerticalChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.textAlignVertical" + }, + { + "name": "event", + "x-alternative": "textAlignVertical" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "alignment", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/VerticalAlignment" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": "middle" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": "top" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onWindowColorChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.windowColor" + }, + { + "name": "event", + "x-alternative": "windowColor" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window color for displaying closed-captions, .", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "color", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Color" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "white" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onWindowOpacityChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.windowOpacity" + }, + { + "name": "event", + "x-alternative": "windowOpacity" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window opacity for displaying closed-captions backgrounds.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "opacity", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onPreferredLanguagesChanged", + "summary": "A prioritized list of ISO 639-2/B codes for the preferred closed captions languages on this device.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.preferredLanguages" + }, + { + "name": "event", + "x-alternative": "preferredLanguages" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "languages", + "summary": "the preferred closed captions languages", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + "spa", + "eng" + ] + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + "eng", + "spa" + ] + } + } + ] + }, + { + "name": "ClosedCaptions.setEnabled", + "tags": [ + { + "name": "setter", + "x-setter-for": "enabled" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "Whether or not closed-captions are enabled.", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "enabled", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "enabled", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontFamily", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontFamily" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font family for displaying closed-captions.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontFamily" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "monospaced_sanserif" + } + ], + "result": { + "name": "family", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "cursive" + } + ], + "result": { + "name": "family", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "family", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontSize", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontSize" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font size for displaying closed-captions.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontSize" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": 1 + } + ], + "result": { + "name": "size", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": 1 + } + ], + "result": { + "name": "size", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "size", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontColor", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontColor" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font color for displaying closed-captions.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "#ffffff" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "#000000" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontEdge", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontEdge" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge style for displaying closed-captions.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontEdge" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "none" + } + ], + "result": { + "name": "edge", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "uniform" + } + ], + "result": { + "name": "edge", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "edge", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontEdgeColor", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontEdgeColor" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge color for displaying closed-captions.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "#000000" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "#ffffff" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontOpacity", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontOpacity" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions characters.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": 99 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": 100 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setBackgroundColor", + "tags": [ + { + "name": "setter", + "x-setter-for": "backgroundColor" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred background color for displaying closed-captions, .", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "#000000" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "#ffffff" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setBackgroundOpacity", + "tags": [ + { + "name": "setter", + "x-setter-for": "backgroundOpacity" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions backgrounds.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": 99 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": 100 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setTextAlign", + "tags": [ + { + "name": "setter", + "x-setter-for": "textAlign" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/HorizontalAlignment" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "center" + } + ], + "result": { + "name": "alignment", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "left" + } + ], + "result": { + "name": "alignment", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setTextAlignVertical", + "tags": [ + { + "name": "setter", + "x-setter-for": "textAlignVertical" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/VerticalAlignment" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "middle" + } + ], + "result": { + "name": "alignment", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "top" + } + ], + "result": { + "name": "alignment", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setWindowColor", + "tags": [ + { + "name": "setter", + "x-setter-for": "windowColor" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window color for displaying closed-captions, .", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "#000000" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "white" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setWindowOpacity", + "tags": [ + { + "name": "setter", + "x-setter-for": "windowOpacity" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window opacity for displaying closed-captions backgrounds.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": 99 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": 100 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setPreferredLanguages", + "summary": "A prioritized list of ISO 639-2/B codes for the preferred closed captions languages on this device.", + "params": [ + { + "name": "value", + "summary": "the preferred closed captions languages", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + }, + "required": true + } + ], + "tags": [ + { + "name": "setter", + "x-setter-for": "preferredLanguages" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": [ + "spa", + "eng" + ] + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "value", + "value": [ + "eng", + "spa" + ] + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "AudioDescriptions.enabled", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:audiodescriptions" + ] + } + ], + "summary": "Whether or not audio-descriptions are enabled.", + "params": [], + "result": { + "name": "enabled", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "AudioDescriptions.onEnabledChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "AudioDescriptions.enabled" + }, + { + "name": "event", + "x-alternative": "enabled" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:audiodescriptions" + ] + } + ], + "summary": "Whether or not audio-descriptions are enabled.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "enabled", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "AudioDescriptions.setEnabled", + "tags": [ + { + "name": "setter", + "x-setter-for": "enabled" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:audiodescriptions" + ] + } + ], + "summary": "Whether or not audio-descriptions are enabled.", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "enabled", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "enabled", + "value": null + } + } + ] + }, + { + "name": "VoiceGuidance.enabled", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "Whether or not voice-guidance is enabled.", + "params": [], + "result": { + "name": "enabled", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "VoiceGuidance.speed", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "The speed at which voice guidance speech will be read back to the user.", + "params": [], + "result": { + "name": "speed", + "schema": { + "$ref": "#/x-schemas/Accessibility/VoiceSpeed" + } + }, + "examples": [ + { + "name": "Voice guidance speed to 1", + "params": [], + "result": { + "name": "speed", + "value": 1 + } + }, + { + "name": "Voice guidance speed to 2", + "params": [], + "result": { + "name": "speed", + "value": 2 + } + } + ] + }, + { + "name": "VoiceGuidance.onEnabledChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "VoiceGuidance.enabled" + }, + { + "name": "event", + "x-alternative": "enabled" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "Whether or not voice-guidance is enabled.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "enabled", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "VoiceGuidance.onSpeedChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "VoiceGuidance.speed" + }, + { + "name": "event", + "x-alternative": "speed" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "The speed at which voice guidance speech will be read back to the user.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "speed", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/VoiceSpeed" + } + ] + } + }, + "examples": [ + { + "name": "Voice guidance speed to 1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "speed", + "value": 1 + } + }, + { + "name": "Voice guidance speed to 2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "speed", + "value": 2 + } + } + ] + }, + { + "name": "VoiceGuidance.setEnabled", + "tags": [ + { + "name": "setter", + "x-setter-for": "enabled" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "Whether or not voice-guidance is enabled.", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "enabled", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "enabled", + "value": null + } + } + ] + }, + { + "name": "VoiceGuidance.setSpeed", + "tags": [ + { + "name": "setter", + "x-setter-for": "speed" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "The speed at which voice guidance speech will be read back to the user.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/VoiceSpeed" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Voice guidance speed to 1", + "params": [ + { + "name": "value", + "value": 1 + } + ], + "result": { + "name": "speed", + "value": null + } + }, + { + "name": "Voice guidance speed to 2", + "params": [ + { + "name": "value", + "value": 2 + } + ], + "result": { + "name": "speed", + "value": null + } + } + ] + }, + { + "name": "Device.name", + "summary": "The human readable name of the device", + "params": [], + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:name" + ] + } + ], + "result": { + "name": "value", + "summary": "the device friendly-name", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "Living Room" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "Kitchen" + } + } + ] + }, + { + "name": "Device.onDeviceNameChanged", + "tags": [ + { + "name": "event" + }, + { + "name": "deprecated", + "x-since": "0.6.0", + "x-alternative": "Device.name()" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:name" + ] + } + ], + "summary": "Get the human readable name of the device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "the device friendly-name", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "string" + } + ] + } + }, + "examples": [ + { + "name": "Getting the device name", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Living Room" + } + } + ] + }, + { + "name": "Device.provision", + "summary": "Used by a distributor to push provision info to firebolt.", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:account:id", + "xrn:firebolt:capability:device:id", + "xrn:firebolt:capability:device:distributor" + ] + } + ], + "params": [ + { + "name": "accountId", + "summary": "The id of the account that is device is attached to in the back office.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "deviceId", + "summary": "The id of the device in the back office.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "distributorId", + "summary": "The id of the distributor in the back office.", + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "accountId", + "value": "12345678910" + }, + { + "name": "deviceId", + "value": "987654321111" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + }, + { + "name": "With distributor id", + "params": [ + { + "name": "accountId", + "value": "12345678910" + }, + { + "name": "deviceId", + "value": "987654321111" + }, + { + "name": "distributorId", + "value": "global_partner" + } + ], + "result": { + "name": "partnerResult", + "value": null + } + } + ] + }, + { + "name": "Device.onNameChanged", + "summary": "The human readable name of the device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.name" + }, + { + "name": "event", + "x-alternative": "name" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:name" + ] + } + ], + "result": { + "name": "value", + "summary": "the device friendly-name", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "string" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Living Room" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Kitchen" + } + } + ] + }, + { + "name": "Device.setName", + "summary": "The human readable name of the device", + "params": [ + { + "name": "value", + "summary": "the device friendly-name", + "schema": { + "type": "string" + }, + "required": true + } + ], + "tags": [ + { + "name": "setter", + "x-setter-for": "name" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:device:name" + ] + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "Living Room" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "Kitchen" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "UserGrants.app", + "summary": "Get all granted and denied user grants for the given app", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "appId", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "info", + "summary": "The list of grants for this app", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GrantInfo" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "appId", + "value": "certapp" + } + ], + "result": { + "name": "defaultResult", + "value": [ + { + "app": { + "id": "certapp", + "title": "Firebolt Certification" + }, + "state": "granted", + "capability": "xrn:firebolt:capability:data:app-usage", + "role": "use", + "lifespan": "seconds", + "expires": "2022-12-14T20:20:39+00:00" + }, + { + "app": { + "id": "certapp", + "title": "Firebolt Certification" + }, + "state": "denied", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "appActive" + } + ] + } + } + ] + }, + { + "name": "UserGrants.device", + "summary": "Get all granted and denied user grants for the device", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [], + "result": { + "name": "info", + "summary": "The list of grants for the device", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GrantInfo" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "defaultResult", + "value": [ + { + "state": "granted", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "powerActive" + } + ] + } + } + ] + }, + { + "name": "UserGrants.capability", + "summary": "Get all granted and denied user grants for the given capability", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "capability", + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "required": true + } + ], + "result": { + "name": "info", + "summary": "The list of grants associated with the given capability", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GrantInfo" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + } + ], + "result": { + "name": "defaultResult", + "value": [ + { + "state": "granted", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "powerActive" + } + ] + } + } + ] + }, + { + "name": "UserGrants.grant", + "summary": "Grants a given capability to a specific app, if appropriate. Calling this results in a persisted active grant that lasts for the duration of the grant policy lifespan. ", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "role", + "schema": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "required": true + }, + { + "name": "capability", + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "required": true + }, + { + "name": "options", + "schema": { + "$ref": "#/components/schemas/GrantModificationOptions" + } + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "options", + "value": { + "appId": "certapp" + } + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "UserGrants.deny", + "summary": "Denies a given capability, to a specific app if appropriate. Calling this results in a persisted Denied Grant that lasts for the duration of the Grant Policy lifespan. ", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "role", + "schema": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "required": true + }, + { + "name": "capability", + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "required": true + }, + { + "name": "options", + "schema": { + "$ref": "#/components/schemas/GrantModificationOptions" + } + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "options", + "value": { + "appId": "certapp" + } + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "UserGrants.clear", + "summary": "Clears the grant for a given capability, to a specific app if appropriate. Calling this results in a persisted Denied Grant that lasts for the duration of the Grant Policy lifespan. ", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "role", + "schema": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "required": true + }, + { + "name": "capability", + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "required": true + }, + { + "name": "options", + "schema": { + "$ref": "#/components/schemas/GrantModificationOptions" + } + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "options", + "value": { + "appId": "certapp" + } + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "UserGrants.request", + "summary": "Requests Firebolt to carry out a set of user grants for a given application such that the user grant provider is notified or an existing user grant is reused.", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "appId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "permissions", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/Permission" + }, + "minItems": 1 + }, + "required": true + }, + { + "name": "options", + "summary": "Request options", + "schema": { + "$ref": "#/components/schemas/RequestOptions" + }, + "required": false + } + ], + "result": { + "name": "info", + "summary": "The result of all grants requested by this", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GrantInfo" + } + } + }, + "examples": [ + { + "name": "Default result #1", + "params": [ + { + "name": "appId", + "value": "certapp" + }, + { + "name": "permissions", + "value": [ + { + "role": "use", + "capability": "xrn:firebolt:capability:localization:postal-code" + } + ] + } + ], + "result": { + "name": "defaultResult", + "value": [ + { + "app": { + "id": "certapp", + "title": "Certification App" + }, + "state": "granted", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "powerActive" + } + ] + } + }, + { + "name": "Default result #2", + "params": [ + { + "name": "appId", + "value": "certapp" + }, + { + "name": "permissions", + "value": [ + { + "role": "use", + "capability": "xrn:firebolt:capability:localization:postal-code" + } + ] + }, + { + "name": "options", + "value": { + "force": true + } + } + ], + "result": { + "name": "defaultResult", + "value": [ + { + "app": { + "id": "certapp", + "title": "Certification App" + }, + "state": "granted", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "powerActive" + } + ] + } + } + ] + }, + { + "name": "Privacy.allowResumePoints", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content to show in the main experience", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowUnentitledResumePoints", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content from unentitled providers to show in the main experience", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowWatchHistory", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their watch history from all sources to show in the main experience", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowProductAnalytics", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data can be used for analytics about the product", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowPersonalization", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowUnentitledPersonalization", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations for unentitled content", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowRemoteDiagnostics", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their personal data to be included in diagnostic telemetry. This also allows whether device logs can be remotely accessed from the client device", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowPrimaryContentAdTargeting", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in the primary experience", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowPrimaryBrowseAdTargeting", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while browsing in the primary experience", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowAppContentAdTargeting", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in apps", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowACRCollection", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their automatic content recognition data to be collected", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowCameraAnalytics", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows data from their camera to be used for Product Analytics", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.settings", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Gets the allowed value for all privacy settings", + "params": [], + "result": { + "name": "settings", + "schema": { + "$ref": "#/components/schemas/PrivacySettings" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "settings", + "value": { + "allowACRCollection": true, + "allowResumePoints": false, + "allowAppContentAdTargeting": false, + "allowCameraAnalytics": true, + "allowPersonalization": true, + "allowPrimaryBrowseAdTargeting": false, + "allowPrimaryContentAdTargeting": false, + "allowProductAnalytics": true, + "allowRemoteDiagnostics": true, + "allowUnentitledPersonalization": true, + "allowUnentitledResumePoints": false, + "allowWatchHistory": true + } + } + } + ] + }, + { + "name": "Privacy.onAllowResumePointsChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowResumePoints" + }, + { + "name": "event", + "x-alternative": "allowResumePoints" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content to show in the main experience", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowUnentitledResumePointsChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowUnentitledResumePoints" + }, + { + "name": "event", + "x-alternative": "allowUnentitledResumePoints" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content from unentitled providers to show in the main experience", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowWatchHistoryChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowWatchHistory" + }, + { + "name": "event", + "x-alternative": "allowWatchHistory" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their watch history from all sources to show in the main experience", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowProductAnalyticsChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowProductAnalytics" + }, + { + "name": "event", + "x-alternative": "allowProductAnalytics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data can be used for analytics about the product", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowPersonalizationChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowPersonalization" + }, + { + "name": "event", + "x-alternative": "allowPersonalization" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowUnentitledPersonalizationChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowUnentitledPersonalization" + }, + { + "name": "event", + "x-alternative": "allowUnentitledPersonalization" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations for unentitled content", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowRemoteDiagnosticsChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowRemoteDiagnostics" + }, + { + "name": "event", + "x-alternative": "allowRemoteDiagnostics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their personal data to be included in diagnostic telemetry. This also allows whether device logs can be remotely accessed from the client device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowPrimaryContentAdTargetingChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowPrimaryContentAdTargeting" + }, + { + "name": "event", + "x-alternative": "allowPrimaryContentAdTargeting" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in the primary experience", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowPrimaryBrowseAdTargetingChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowPrimaryBrowseAdTargeting" + }, + { + "name": "event", + "x-alternative": "allowPrimaryBrowseAdTargeting" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while browsing in the primary experience", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowAppContentAdTargetingChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowAppContentAdTargeting" + }, + { + "name": "event", + "x-alternative": "allowAppContentAdTargeting" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in apps", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowACRCollectionChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowACRCollection" + }, + { + "name": "event", + "x-alternative": "allowACRCollection" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their automatic content recognition data to be collected", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowCameraAnalyticsChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowCameraAnalytics" + }, + { + "name": "event", + "x-alternative": "allowCameraAnalytics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows data from their camera to be used for Product Analytics", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.setAllowResumePoints", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowResumePoints" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content to show in the main experience", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowUnentitledResumePoints", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowUnentitledResumePoints" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content from unentitled providers to show in the main experience", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowWatchHistory", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowWatchHistory" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their watch history from all sources to show in the main experience", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowProductAnalytics", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowProductAnalytics" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data can be used for analytics about the product", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowPersonalization", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowPersonalization" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowUnentitledPersonalization", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowUnentitledPersonalization" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations for unentitled content", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowRemoteDiagnostics", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowRemoteDiagnostics" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their personal data to be included in diagnostic telemetry. This also allows whether device logs can be remotely accessed from the client device", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowPrimaryContentAdTargeting", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowPrimaryContentAdTargeting" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in the primary experience", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowPrimaryBrowseAdTargeting", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowPrimaryBrowseAdTargeting" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while browsing in the primary experience", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowAppContentAdTargeting", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowAppContentAdTargeting" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in apps", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowACRCollection", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowACRCollection" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their automatic content recognition data to be collected", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowCameraAnalytics", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowCameraAnalytics" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows data from their camera to be used for Product Analytics", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Advertising.skipRestriction", + "summary": "Set the value for AdPolicy.skipRestriction", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "params": [], + "result": { + "name": "result", + "schema": { + "$ref": "#/x-schemas/Advertising/SkipRestriction" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "result", + "value": "none" + } + }, + { + "name": "Additional Example", + "params": [], + "result": { + "name": "result", + "value": "all" + } + } + ] + }, + { + "name": "Advertising.resetIdentifier", + "summary": "Resets a user's identifier in the ad platform so that the advertising id that apps get will be a new value", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:advertising:identifier" + ] + } + ], + "params": [], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "Advertising.onSkipRestrictionChanged", + "summary": "Set the value for AdPolicy.skipRestriction", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Advertising.skipRestriction" + }, + { + "name": "event", + "x-alternative": "skipRestriction" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "result", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Advertising/SkipRestriction" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": "none" + } + }, + { + "name": "Additional Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": "all" + } + } + ] + }, + { + "name": "Advertising.setSkipRestriction", + "summary": "Set the value for AdPolicy.skipRestriction", + "tags": [ + { + "name": "setter", + "x-setter-for": "skipRestriction" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Advertising/SkipRestriction" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": "none" + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Additional Example", + "params": [ + { + "name": "value", + "value": "all" + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Account.session", + "summary": "Used by a distributor to push Session token to firebolt.", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:token:account" + ] + } + ], + "params": [ + { + "name": "token", + "required": true, + "schema": { + "$ref": "#/components/schemas/Token" + } + }, + { + "name": "expiresIn", + "required": true, + "schema": { + "$ref": "#/components/schemas/Expiry" + } + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "token", + "value": "RmlyZWJvbHQgTWFuYWdlIFNESyBSb2NrcyEhIQ==" + }, + { + "name": "expiresIn", + "value": 84000 + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "Keyboard.onRequestStandard", + "summary": "Registers as a provider for when the user should be shown a standard keyboard.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response": { + "type": "string", + "examples": [ + "username" + ] + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true + } + ], + "result": { + "name": "sessionRequest", + "summary": "The request to start a keyboard session", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/KeyboardProviderRequest" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "correlationId": "abc", + "parameters": { + "message": "Enter your user name." + } + } + } + } + ] + }, + { + "name": "Keyboard.onRequestPassword", + "summary": "Registers as a provider for when the user should be shown a password keyboard, with dots for each character entered.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response": { + "type": "string", + "examples": [ + "password" + ] + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true + } + ], + "result": { + "name": "sessionRequest", + "summary": "The request to start a keyboard session", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/KeyboardProviderRequest" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "correlationId": "abc", + "parameters": { + "message": "Enter your user name." + } + } + } + } + ] + }, + { + "name": "Keyboard.onRequestEmail", + "summary": "Registers as a provider for when the user should be shown a keyboard optimized for email address entry.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response": { + "type": "string", + "examples": [ + "email@address.com" + ] + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true + } + ], + "result": { + "name": "sessionRequest", + "summary": "The request to start a keyboard session", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/KeyboardProviderRequest" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "correlationId": "abc", + "parameters": { + "message": "Enter your user name." + } + } + } + } + ] + }, + { + "name": "Keyboard.standardFocus", + "summary": "Internal API for Standard Provider to request focus for UX purposes.", + "params": [], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-allow-focus-for": "onRequestStandard" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.passwordFocus", + "summary": "Internal API for Password Provider to request focus for UX purposes.", + "params": [], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-allow-focus-for": "onRequestPassword" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.emailFocus", + "summary": "Internal API for Email Provider to request focus for UX purposes.", + "params": [], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-allow-focus-for": "onRequestEmail" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.standardResponse", + "summary": "Internal API for Standard Provider to send back response.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "type": "string", + "examples": [ + "username" + ] + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-response-for": "onRequestStandard" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": "username" + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.standardError", + "summary": "Internal API for Standard Provider to send back error.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-error-for": "onRequestStandard" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.passwordResponse", + "summary": "Internal API for Password Provider to send back response.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "type": "string", + "examples": [ + "password" + ] + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-response-for": "onRequestPassword" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": "password" + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.passwordError", + "summary": "Internal API for Password Provider to send back error.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-error-for": "onRequestPassword" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.emailResponse", + "summary": "Internal API for Email Provider to send back response.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "type": "string", + "examples": [ + "email@address.com" + ] + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-response-for": "onRequestEmail" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": "email@address.com" + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.emailError", + "summary": "Internal API for Email Provider to send back error.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-error-for": "onRequestEmail" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "AcknowledgeChallenge.onRequestChallenge", + "summary": "Registers as a provider for when the user should be challenged in order to confirm access to a capability", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response": { + "$ref": "#/components/schemas/GrantResult" + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:acknowledgechallenge", + "x-allow-focus": true + } + ], + "result": { + "name": "challenge", + "summary": "The request to challenge the user", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/ChallengeProviderRequest" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "correlationId": "abc", + "parameters": { + "capability": "xrn:firebolt:capability:localization::postal-code", + "requestor": { + "id": "ReferenceApp", + "name": "Firebolt Reference App" + } + } + } + } + } + ] + }, + { + "name": "AcknowledgeChallenge.challengeFocus", + "summary": "Internal API for Challenge Provider to request focus for UX purposes.", + "params": [], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:acknowledgechallenge", + "x-allow-focus": true, + "x-allow-focus-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "AcknowledgeChallenge.challengeResponse", + "summary": "Internal API for Challenge Provider to send back response.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "$ref": "#/components/schemas/GrantResult" + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:acknowledgechallenge", + "x-allow-focus": true, + "x-response-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example #1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": true + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Example #2", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": false + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Example #3", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": null + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "AcknowledgeChallenge.challengeError", + "summary": "Internal API for Challenge Provider to send back error.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:acknowledgechallenge", + "x-allow-focus": true, + "x-error-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "PinChallenge.onRequestChallenge", + "summary": "Registers as a provider for when the user should be challenged in order to confirm access to a capability through a pin prompt", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response": { + "$ref": "#/components/schemas/PinChallengeResult", + "examples": [ + { + "granted": true, + "reason": "correctPin" + }, + { + "granted": false, + "reason": "exceededPinFailures" + }, + { + "granted": null, + "reason": "cancelled" + } + ] + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:pinchallenge", + "x-allow-focus": true + } + ], + "result": { + "name": "challenge", + "summary": "The request to challenge the user", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/PinChallengeProviderRequest" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "correlationId": "abc", + "parameters": { + "capability": "xrn:firebolt:capability:commerce::purchase", + "requestor": { + "id": "ReferenceApp", + "name": "Firebolt Reference App" + }, + "pinSpace": "purchase" + } + } + } + } + ] + }, + { + "name": "PinChallenge.challengeFocus", + "summary": "Internal API for Challenge Provider to request focus for UX purposes.", + "params": [], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:pinchallenge", + "x-allow-focus": true, + "x-allow-focus-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "PinChallenge.challengeResponse", + "summary": "Internal API for Challenge Provider to send back response.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "$ref": "#/components/schemas/PinChallengeResult", + "examples": [ + { + "granted": true, + "reason": "correctPin" + }, + { + "granted": false, + "reason": "exceededPinFailures" + }, + { + "granted": null, + "reason": "cancelled" + } + ] + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:pinchallenge", + "x-allow-focus": true, + "x-response-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example #1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": true, + "reason": "correctPin" + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Example #2", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": false, + "reason": "exceededPinFailures" + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Example #3", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": null, + "reason": "cancelled" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "PinChallenge.challengeError", + "summary": "Internal API for Challenge Provider to send back error.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:pinchallenge", + "x-allow-focus": true, + "x-error-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.setForApp", + "summary": "Set or update a secure data value for a specific app.", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "appId", + "summary": "appId for which value is being set", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "scope", + "summary": "The scope of the data key", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + }, + { + "name": "key", + "summary": "Key to set", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "value", + "summary": "Value to set", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "options", + "summary": "Optional parameters to set", + "schema": { + "$ref": "#/components/schemas/StorageOptions" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Set a refresh token with name authRefreshToken with optional parameter for appId foo", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "scope", + "value": "device" + }, + { + "name": "key", + "value": "authRefreshToken" + }, + { + "name": "value", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + }, + { + "name": "options", + "value": { + "ttl": 600 + } + } + ], + "result": { + "name": "defaultResult", + "value": null + } + }, + { + "name": "Set a refresh token with name authRefreshToken without optional parameter for appId foo", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "scope", + "value": "account" + }, + { + "name": "key", + "value": "authRefreshToken" + }, + { + "name": "value", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.removeForApp", + "summary": "Removes single data value for a specific app.", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "appId", + "summary": "appId for which values are removed", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "scope", + "summary": "The scope of the key/value", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + }, + { + "name": "key", + "summary": "Key to remove", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "summary": "", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Removes authRefreshToken for appId foo", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "scope", + "value": "account" + }, + { + "name": "key", + "value": "authRefreshToken" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.clearForApp", + "summary": "Clears all the secure data values for a specific app", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "appId", + "summary": "appId for which values are removed", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "scope", + "summary": "The scope of the key/value", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + } + ], + "result": { + "name": "success", + "summary": "", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Clears all the secure data values for appId foo", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "scope", + "value": "account" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "Discovery.onSignIn", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:discovery:sign-in-status" + ] + } + ], + "summary": "Listen to events from all apps that call Discovery.signIn", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "event", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "object", + "properties": { + "appId": { + "type": "string" + } + }, + "required": [ + "appId" + ] + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Event", + "value": { + "appId": "firecert" + } + } + } + ] + }, + { + "name": "Discovery.onSignOut", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:discovery:sign-in-status" + ] + } + ], + "summary": "Listen to events from all apps that call Discovery.signOut", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "event", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "object", + "properties": { + "appId": { + "type": "string" + } + }, + "required": [ + "appId" + ] + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Event", + "value": { + "appId": "firecert" + } + } + } + ] + }, + { + "name": "HDMIInput.ports", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Retrieve a list of HDMI input ports.", + "params": [], + "result": { + "name": "ports", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/HDMIInputPort" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "ports", + "value": [ + { + "port": "HDMI1", + "connected": true, + "signal": "stable", + "arcCapable": true, + "arcConnected": true, + "edidVersion": "2.0", + "autoLowLatencyModeCapable": true, + "autoLowLatencyModeSignalled": true + } + ] + } + } + ] + }, + { + "name": "HDMIInput.port", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Retrieve a specific HDMI input port.", + "params": [ + { + "name": "portId", + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "required": true + } + ], + "result": { + "name": "port", + "schema": { + "$ref": "#/components/schemas/HDMIInputPort" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "portId", + "value": "HDMI1" + } + ], + "result": { + "name": "ports", + "value": { + "port": "HDMI1", + "connected": true, + "signal": "stable", + "arcCapable": true, + "arcConnected": true, + "edidVersion": "2.0", + "autoLowLatencyModeCapable": true, + "autoLowLatencyModeSignalled": true + } + } + } + ] + }, + { + "name": "HDMIInput.open", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Opens the HDMI Port allowing it to be the active source device. Incase there is a different HDMI portId already set as the active source, this call would stop the older portId before opening the given portId.", + "params": [ + { + "name": "portId", + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "required": true + } + ], + "result": { + "name": "port", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example for open", + "params": [ + { + "name": "portId", + "value": "HDMI1" + } + ], + "result": { + "name": "port", + "value": null + } + } + ] + }, + { + "name": "HDMIInput.close", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Closes the given HDMI Port if it is the current active source for HDMI Input. If there was no active source, then there would no action taken on the device.", + "params": [], + "result": { + "name": "port", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example for stop", + "params": [], + "result": { + "name": "port", + "value": null + } + } + ] + }, + { + "name": "HDMIInput.onConnectionChanged", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Notification for when any HDMI port has a connection physically engaged or disengaged.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "info", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/ConnectionChangedInfo" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "info", + "value": { + "port": "HDMI1", + "connected": true + } + } + } + ] + }, + { + "name": "HDMIInput.onSignalChanged", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Notification for when any HDMI port has it's signal status changed.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "info", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/SignalChangedInfo" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "info", + "value": { + "port": "HDMI1", + "signal": "stable" + } + } + } + ] + }, + { + "name": "HDMIInput.lowLatencyMode", + "summary": "Property for the low latency mode setting.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + }, + { + "name": "property" + } + ], + "params": [], + "result": { + "name": "enabled", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default Example #2", + "params": [], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "HDMIInput.onAutoLowLatencyModeSignalChanged", + "summary": "Notification for changes to ALLM status of any input device.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + }, + { + "name": "event" + } + ], + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "info", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/AutoLowLatencyModeSignalChangedInfo" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "info", + "value": { + "port": "HDMI1", + "autoLowLatencyModeSignalled": true + } + } + } + ] + }, + { + "name": "HDMIInput.autoLowLatencyModeCapable", + "summary": "Property for each port auto low latency mode setting.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + }, + { + "name": "property", + "x-subscriber-type": "global" + } + ], + "params": [ + { + "name": "port", + "required": true, + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + } + } + ], + "result": { + "name": "enabled", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "port", + "value": "HDMI1" + } + ], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "port", + "value": "HDMI1" + } + ], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "HDMIInput.edidVersion", + "summary": "Property for each port's active EDID version.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + }, + { + "name": "property" + } + ], + "params": [ + { + "name": "port", + "required": true, + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + } + } + ], + "result": { + "name": "edidVersion", + "schema": { + "$ref": "#/components/schemas/EDIDVersion" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "port", + "value": "HDMI1" + } + ], + "result": { + "name": "edidVersion", + "value": "2.0" + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "port", + "value": "HDMI1" + } + ], + "result": { + "name": "edidVersion", + "value": "1.4" + } + } + ] + }, + { + "name": "HDMIInput.onLowLatencyModeChanged", + "summary": "Property for the low latency mode setting.", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "HDMIInput.lowLatencyMode" + }, + { + "name": "event", + "x-alternative": "lowLatencyMode" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "enabled", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "HDMIInput.onAutoLowLatencyModeCapableChanged", + "summary": "Property for each port auto low latency mode setting.", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "HDMIInput.autoLowLatencyModeCapable" + }, + { + "name": "event", + "x-alternative": "autoLowLatencyModeCapable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "data", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/AutoLowLatencyModeCapableChangedInfo" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "data", + "value": { + "port": "HDMI1", + "enabled": true + } + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "data", + "value": { + "port": "HDMI1", + "enabled": false + } + } + } + ] + }, + { + "name": "HDMIInput.onEdidVersionChanged", + "summary": "Property for each port's active EDID version.", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "HDMIInput.edidVersion" + }, + { + "name": "event", + "x-alternative": "edidVersion" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "port", + "required": true, + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + } + }, + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "edidVersion", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/EDIDVersion" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "edidVersion", + "value": "2.0" + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "edidVersion", + "value": "1.4" + } + } + ] + }, + { + "name": "HDMIInput.setLowLatencyMode", + "summary": "Property for the low latency mode setting.", + "tags": [ + { + "name": "setter", + "x-setter-for": "lowLatencyMode" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "enabled", + "value": null + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "enabled", + "value": null + } + } + ] + }, + { + "name": "HDMIInput.setAutoLowLatencyModeCapable", + "summary": "Property for each port auto low latency mode setting.", + "tags": [ + { + "name": "setter", + "x-setter-for": "autoLowLatencyModeCapable" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "port", + "required": true, + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + } + }, + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "value", + "value": true + } + ], + "result": { + "name": "enabled", + "value": null + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "value", + "value": false + } + ], + "result": { + "name": "enabled", + "value": null + } + } + ] + }, + { + "name": "HDMIInput.setEdidVersion", + "summary": "Property for each port's active EDID version.", + "tags": [ + { + "name": "setter", + "x-setter-for": "edidVersion" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "port", + "required": true, + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + } + }, + { + "name": "value", + "schema": { + "$ref": "#/components/schemas/EDIDVersion" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "value", + "value": "2.0" + } + ], + "result": { + "name": "edidVersion", + "value": null + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "value", + "value": "1.4" + } + ], + "result": { + "name": "edidVersion", + "value": null + } + } + ] + } + ], + "components": { + "schemas": { + "Token": { + "type": "string", + "description": "Encoded token provided by the Distributor for Device Authentication." + }, + "Expiry": { + "type": "integer", + "description": "Number of secs before the token expires", + "minimum": 1 + }, + "ChallengeRequestor": { + "title": "ChallengeRequestor", + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "string", + "description": "The id of the app that requested the challenge" + }, + "name": { + "type": "string", + "description": "The name of the app that requested the challenge" + } + } + }, + "Challenge": { + "title": "Challenge", + "type": "object", + "required": [ + "capability", + "requestor" + ], + "properties": { + "capability": { + "type": "string", + "description": "The capability that is being requested by the user to approve" + }, + "requestor": { + "description": "The identity of which app is requesting access to this capability", + "$ref": "#/components/schemas/ChallengeRequestor" + } + } + }, + "ChallengeProviderRequest": { + "title": "ChallengeProviderRequest", + "allOf": [ + { + "$ref": "#/x-schemas/Types/ProviderRequest" + }, + { + "type": "object", + "required": [ + "parameters" + ], + "properties": { + "parameters": { + "description": "The request to challenge the user", + "$ref": "#/components/schemas/Challenge" + } + } + } + ] + }, + "GrantResult": { + "title": "GrantResult", + "type": "object", + "required": [ + "granted" + ], + "properties": { + "granted": { + "oneOf": [ + { + "type": "boolean", + "description": "Whether the user approved or denied the challenge" + }, + { + "const": null + } + ] + } + }, + "examples": [ + { + "granted": true + }, + { + "granted": false + }, + { + "granted": null + } + ] + }, + "NetworkType": { + "title": "NetworkType", + "type": "string", + "enum": [ + "wifi", + "ethernet", + "hybrid" + ], + "description": "The type of network that is currently active" + }, + "NetworkState": { + "title": "NetworkState", + "type": "string", + "enum": [ + "connected", + "disconnected" + ], + "description": "The type of network that is currently active" + }, + "FederatedRequest": { + "title": "FederatedRequest", + "type": "object", + "properties": { + "correlationId": { + "type": "string" + } + }, + "required": [ + "correlationId" + ], + "propertyNames": { + "enum": [ + "correlationId", + "parameters" + ] + }, + "examples": [ + { + "correlationId": "xyz" + } + ] + }, + "FederatedResponse": { + "title": "FederatedResponse", + "type": "object", + "properties": { + "correlationId": { + "type": "string" + } + }, + "required": [ + "correlationId", + "result" + ], + "propertyNames": { + "enum": [ + "correlationId", + "result" + ] + }, + "examples": [ + { + "correlationId": "xyz" + } + ] + }, + "EntityInfoParameters": { + "title": "EntityInfoParameters", + "type": "object", + "properties": { + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + } + }, + "required": [ + "entityId" + ], + "additionalProperties": false, + "examples": [ + { + "entityId": "345" + } + ] + }, + "PurchasedContentParameters": { + "title": "PurchasedContentParameters", + "type": "object", + "properties": { + "limit": { + "type": "integer", + "minimum": -1 + }, + "offeringType": { + "$ref": "#/x-schemas/Entertainment/OfferingType" + }, + "programType": { + "$ref": "#/x-schemas/Entertainment/ProgramType" + } + }, + "required": [ + "limit" + ], + "additionalProperties": false, + "examples": [ + { + "limit": 100 + } + ] + }, + "Availability": { + "title": "Availability", + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "channel-lineup", + "program-lineup" + ] + }, + "id": { + "type": "string" + }, + "catalogId": { + "type": "string" + }, + "startTime": { + "type": "string", + "format": "date-time" + }, + "endTime": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "type", + "id" + ] + }, + "HDMIPortId": { + "type": "string", + "pattern": "^HDMI[0-9]+$" + }, + "EDIDVersion": { + "title": "EDIDVersion", + "type": "string", + "enum": [ + "1.4", + "2.0", + "unknown" + ] + }, + "HDMIInputPort": { + "title": "HDMIInputPort", + "type": "object", + "additionalProperties": false, + "properties": { + "port": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "connected": { + "type": "boolean" + }, + "signal": { + "$ref": "#/components/schemas/HDMISignalStatus" + }, + "arcCapable": { + "type": "boolean" + }, + "arcConnected": { + "type": "boolean" + }, + "edidVersion": { + "$ref": "#/components/schemas/EDIDVersion" + }, + "autoLowLatencyModeCapable": { + "type": "boolean" + }, + "autoLowLatencyModeSignalled": { + "type": "boolean" + } + }, + "if": { + "properties": { + "edidVersion": { + "type": "string", + "enum": [ + "1.4", + "unknown" + ] + } + } + }, + "then": { + "properties": { + "autoLowLatencyModeCapable": { + "const": false + }, + "autoLowLatencyModeSignalled": { + "const": false + } + } + }, + "required": [ + "port", + "connected", + "signal", + "arcCapable", + "arcConnected", + "edidVersion", + "autoLowLatencyModeCapable", + "autoLowLatencyModeSignalled" + ] + }, + "HDMISignalStatus": { + "type": "string", + "enum": [ + "none", + "stable", + "unstable", + "unsupported", + "unknown" + ] + }, + "SignalChangedInfo": { + "title": "SignalChangedInfo", + "type": "object", + "properties": { + "port": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "signal": { + "$ref": "#/components/schemas/HDMISignalStatus" + } + }, + "required": [ + "port", + "signal" + ] + }, + "ConnectionChangedInfo": { + "title": "ConnectionChangedInfo", + "type": "object", + "properties": { + "port": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "connected": { + "type": "boolean" + } + } + }, + "AutoLowLatencyModeSignalChangedInfo": { + "title": "AutoLowLatencyModeSignalChangedInfo", + "type": "object", + "properties": { + "port": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "autoLowLatencyModeSignalled": { + "type": "boolean" + } + } + }, + "AutoLowLatencyModeCapableChangedInfo": { + "title": "AutoLowLatencyModeCapableChangedInfo", + "type": "object", + "properties": { + "port": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "enabled": { + "type": "boolean" + } + }, + "required": [ + "port", + "enabled" + ] + }, + "KeyboardParameters": { + "title": "KeyboardParameters", + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "description": "The message to display to the user so the user knows what they are entering", + "type": "string" + } + }, + "examples": [ + { + "type": "standard", + "message": "Enter your user name." + } + ] + }, + "KeyboardProviderRequest": { + "title": "KeyboardProviderRequest", + "type": "object", + "required": [ + "correlationId", + "parameters" + ], + "properties": { + "correlationId": { + "type": "string", + "description": "An id to correlate the provider response with this request" + }, + "parameters": { + "description": "The request to start a keyboard session", + "$ref": "#/components/schemas/KeyboardParameters" + } + } + }, + "EventObjectPrimitives": { + "title": "EventObjectPrimitives", + "anyOf": [ + { + "type": "string", + "maxLength": 256 + }, + { + "type": "number" + }, + { + "type": "integer" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "EventObject": { + "title": "EventObject", + "type": "object", + "maxProperties": 256, + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/EventObjectPrimitives" + }, + { + "type": "array", + "maxItems": 256, + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/EventObjectPrimitives" + }, + { + "$ref": "#/components/schemas/EventObject" + } + ] + } + }, + { + "$ref": "#/components/schemas/EventObject" + } + ] + } + }, + "PinChallenge": { + "title": "PinChallenge", + "type": "object", + "required": [ + "requestor", + "pinSpace" + ], + "properties": { + "pinSpace": { + "type": "string", + "description": "The pin space that this challenge is for", + "enum": [ + "purchase", + "content" + ] + }, + "capability": { + "type": "string", + "description": "The capability that is gated by a pin challenge" + }, + "requestor": { + "description": "The identity of which app is requesting access to this capability", + "$ref": "#/components/schemas/ChallengeRequestor" + } + } + }, + "PinChallengeProviderRequest": { + "title": "PinChallengeProviderRequest", + "allOf": [ + { + "$ref": "#/x-schemas/Types/ProviderRequest" + }, + { + "type": "object", + "required": [ + "parameters" + ], + "properties": { + "parameters": { + "description": "The request to challenge the user", + "$ref": "#/components/schemas/PinChallenge" + } + } + } + ] + }, + "ResultReason": { + "title": "ResultReason", + "type": "string", + "description": "The reason for the result of challenging the user", + "enum": [ + "noPinRequired", + "noPinRequiredWindow", + "exceededPinFailures", + "correctPin", + "cancelled" + ] + }, + "PinChallengeResult": { + "title": "PinChallengeResult", + "type": "object", + "required": [ + "granted", + "reason" + ], + "properties": { + "granted": { + "oneOf": [ + { + "type": "boolean", + "description": "Whether the user succeeded in the pin challenge" + }, + { + "const": null + } + ] + }, + "reason": { + "$ref": "#/components/schemas/ResultReason", + "description": "The reason for the result " + } + } + }, + "PrivacySettings": { + "title": "PrivacySettings", + "type": "object", + "required": [ + "allowACRCollection", + "allowResumePoints", + "allowAppContentAdTargeting", + "allowCameraAnalytics", + "allowPersonalization", + "allowPrimaryBrowseAdTargeting", + "allowPrimaryContentAdTargeting", + "allowProductAnalytics", + "allowRemoteDiagnostics", + "allowUnentitledPersonalization", + "allowUnentitledResumePoints", + "allowWatchHistory" + ], + "properties": { + "allowACRCollection": { + "description": "", + "type": "boolean" + }, + "allowResumePoints": { + "description": "", + "type": "boolean" + }, + "allowAppContentAdTargeting": { + "description": "", + "type": "boolean" + }, + "allowCameraAnalytics": { + "description": "", + "type": "boolean" + }, + "allowPersonalization": { + "description": "", + "type": "boolean" + }, + "allowPrimaryBrowseAdTargeting": { + "description": "", + "type": "boolean" + }, + "allowPrimaryContentAdTargeting": { + "description": "", + "type": "boolean" + }, + "allowProductAnalytics": { + "description": "", + "type": "boolean" + }, + "allowRemoteDiagnostics": { + "description": "", + "type": "boolean" + }, + "allowUnentitledPersonalization": { + "description": "", + "type": "boolean" + }, + "allowUnentitledResumePoints": { + "description": "", + "type": "boolean" + }, + "allowWatchHistory": { + "description": "", + "type": "boolean" + } + }, + "examples": [ + { + "allowACRCollection": true, + "allowResumePoints": false, + "allowAppContentAdTargeting": false, + "allowCameraAnalytics": true, + "allowPersonalization": true, + "allowPrimaryBrowseAdTargeting": false, + "allowPrimaryContentAdTargeting": false, + "allowProductAnalytics": true, + "allowRemoteDiagnostics": true, + "allowUnentitledPersonalization": true, + "allowUnentitledResumePoints": false, + "allowWatchHistory": true + } + ] + }, + "StorageScope": { + "title": "StorageScope", + "type": "string", + "enum": [ + "device", + "account" + ], + "description": "The scope of the data" + }, + "StorageOptions": { + "title": "StorageOptions", + "type": "object", + "required": [ + "ttl" + ], + "properties": { + "ttl": { + "type": "number", + "description": "Seconds from set time before the data expires and is removed" + } + } + }, + "GrantInfo": { + "description": "Information about a grant given by a user", + "type": "object", + "properties": { + "app": { + "$ref": "#/components/schemas/AppInfo" + }, + "state": { + "$ref": "#/components/schemas/GrantState" + }, + "capability": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "role": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "lifespan": { + "type": "string", + "enum": [ + "once", + "forever", + "appActive", + "powerActive", + "seconds" + ] + }, + "expires": { + "type": "string", + "format": "date-time" + } + }, + "additionalProperties": false, + "required": [ + "state", + "capability", + "role", + "lifespan" + ], + "examples": [ + { + "app": { + "id": "certapp", + "title": "Firebolt Certification" + }, + "state": "granted", + "capability": "xrn:firebolt:capability:data:app-usage", + "role": "use", + "lifespan": "seconds", + "expires": "2022-12-14T20:20:39+00:00" + } + ] + }, + "AppInfo": { + "description": "Information about an app that a grant was for", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "id" + ] + }, + "GrantState": { + "description": "The state the grant is in", + "type": "string", + "enum": [ + "granted", + "denied" + ] + }, + "GrantModificationOptions": { + "description": "Options when modifying any grant", + "type": "object", + "properties": { + "appId": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [] + }, + "RequestOptions": { + "title": "RequestOptions", + "type": "object", + "properties": { + "force": { + "type": "boolean", + "description": "Whether to force for user grant even if the previous decision stored" + } + } + }, + "AccessPointList": { + "title": "AccessPointList", + "type": "object", + "description": "List of scanned Wifi networks available near the device.", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AccessPoint" + } + } + } + }, + "WifiSecurityMode": { + "title": "WifiSecurityMode", + "description": "Security Mode supported for Wifi", + "type": "string", + "enum": [ + "none", + "wep64", + "wep128", + "wpaPskTkip", + "wpaPskAes", + "wpa2PskTkip", + "wpa2PskAes", + "wpaEnterpriseTkip", + "wpaEnterpriseAes", + "wpa2EnterpriseTkip", + "wpa2EnterpriseAes", + "wpa2Psk", + "wpa2Enterprise", + "wpa3PskAes", + "wpa3Sae" + ] + }, + "WifiSignalStrength": { + "title": "WifiSignalStrength", + "description": "Strength of Wifi signal, value is negative based on RSSI specification.", + "type": "integer", + "default": -255, + "minimum": -255, + "maximum": 0 + }, + "WifiFrequency": { + "title": "WifiFrequency", + "description": "Wifi Frequency in Ghz, example 2.4Ghz and 5Ghz.", + "type": "number", + "default": 0, + "minimum": 0 + }, + "AccessPoint": { + "title": "AccessPoint", + "description": "Properties of a scanned wifi list item.", + "type": "object", + "properties": { + "ssid": { + "type": "string", + "description": "Name of the wifi." + }, + "securityMode": { + "$ref": "#/components/schemas/WifiSecurityMode" + }, + "signalStrength": { + "$ref": "#/components/schemas/WifiSignalStrength" + }, + "frequency": { + "$ref": "#/components/schemas/WifiFrequency" + } + } + }, + "WPSSecurityPin": { + "title": "WPSSecurityPin", + "description": "Security pin type for WPS(Wifi Protected Setup).", + "type": "string", + "enum": [ + "pushButton", + "pin", + "manufacturerPin" + ] + } + } + }, + "x-schemas": { + "Types": { + "uri": "https://meta.comcast.com/firebolt/types", + "SemanticVersion": { + "title": "SemanticVersion", + "type": "object", + "properties": { + "major": { + "type": "integer", + "minimum": 0 + }, + "minor": { + "type": "integer", + "minimum": 0 + }, + "patch": { + "type": "integer", + "minimum": 0 + }, + "readable": { + "type": "string" + } + }, + "required": [ + "major", + "minor", + "patch", + "readable" + ], + "additionalProperties": false + }, + "ListenResponse": { + "title": "ListenResponse", + "type": "object", + "required": [ + "event", + "listening" + ], + "properties": { + "event": { + "type": "string", + "pattern": "[a-zA-Z]+\\.on[A-Z][a-zA-Z]+" + }, + "listening": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "ProviderRequest": { + "title": "ProviderRequest", + "type": "object", + "required": [ + "correlationId" + ], + "additionalProperties": false, + "properties": { + "correlationId": { + "type": "string", + "description": "The id that was passed in to the event that triggered a provider method to be called" + }, + "parameters": { + "description": "The result of the provider response.", + "type": [ + "object", + "null" + ] + } + } + }, + "AudioProfile": { + "title": "AudioProfile", + "type": "string", + "enum": [ + "stereo", + "dolbyDigital5.1", + "dolbyDigital5.1+", + "dolbyAtmos" + ] + }, + "LocalizedString": { + "title": "LocalizedString", + "description": "Localized string supports either a simple `string` or a Map of language codes to strings. When using a simple `string`, the current preferred langauge from `Localization.langauge()` is assumed.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + ], + "examples": [ + "A simple string, with no language code", + { + "en": "This is english", + "es": "esto es español" + } + ] + }, + "FlatMap": { + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + }, + "BooleanMap": { + "title": "BooleanMap", + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "Timeout": { + "title": "Timeout", + "description": "Defines the timeout in seconds. If the threshold for timeout is passed for any operation without a result it will throw an error.", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 9999 + } + }, + "Accessibility": { + "uri": "https://meta.comcast.com/firebolt/accessibility", + "ClosedCaptionsSettings": { + "title": "ClosedCaptionsSettings", + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether or not closed-captions should be enabled by default" + }, + "styles": { + "$ref": "#/x-schemas/Accessibility/ClosedCaptionsStyles" + }, + "preferredLanguages": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + }, + "examples": [ + { + "enabled": true, + "styles": { + "fontFamily": "monospaced_serif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] + } + ] + }, + "VoiceGuidanceSettings": { + "title": "VoiceGuidanceSettings", + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether or not voice guidance should be enabled by default" + }, + "speed": { + "$ref": "#/x-schemas/Accessibility/VoiceSpeed", + "description": "The speed at which voice guidance speech will be read back to the user" + } + }, + "examples": [ + { + "enabled": true, + "speed": 2 + } + ] + }, + "VoiceSpeed": { + "title": "VoiceSpeed", + "type": "number", + "minimum": 0.5, + "maximum": 2 + }, + "ClosedCaptionsStyles": { + "title": "ClosedCaptionsStyles", + "type": "object", + "description": "The default styles to use when displaying closed-captions", + "properties": { + "fontFamily": { + "$ref": "#/x-schemas/Accessibility/FontFamily" + }, + "fontSize": { + "$ref": "#/x-schemas/Accessibility/FontSize" + }, + "fontColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "fontEdge": { + "$ref": "#/x-schemas/Accessibility/FontEdge" + }, + "fontEdgeColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "fontOpacity": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "backgroundColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "backgroundOpacity": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "textAlign": { + "$ref": "#/x-schemas/Accessibility/HorizontalAlignment" + }, + "textAlignVertical": { + "$ref": "#/x-schemas/Accessibility/VerticalAlignment" + }, + "windowColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "windowOpacity": { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + } + }, + "FontFamily": { + "type": [ + "string", + "null" + ], + "enum": [ + "monospaced_serif", + "proportional_serif", + "monospaced_sanserif", + "proportional_sanserif", + "smallcaps", + "cursive", + "casual", + null + ] + }, + "FontSize": { + "type": [ + "number", + "null" + ], + "minimum": 0 + }, + "Color": { + "type": [ + "string", + "null" + ] + }, + "FontEdge": { + "type": [ + "string", + "null" + ], + "enum": [ + "none", + "raised", + "depressed", + "uniform", + "drop_shadow_left", + "drop_shadow_right", + null + ] + }, + "Opacity": { + "type": [ + "number", + "null" + ], + "minimum": 0, + "maximum": 100 + }, + "HorizontalAlignment": { + "type": [ + "string", + "null" + ] + }, + "VerticalAlignment": { + "type": [ + "string", + "null" + ] + } + }, + "Localization": { + "uri": "https://meta.comcast.com/firebolt/localization", + "ISO639_2Language": { + "type": "string", + "pattern": "^[a-z]{3}$" + }, + "Locality": { + "type": "string" + }, + "CountryCode": { + "type": "string", + "pattern": "^[A-Z]{2}$" + }, + "Language": { + "type": "string", + "pattern": "^[A-Za-z]{2}$" + }, + "Locale": { + "type": "string", + "pattern": "^[a-zA-Z]+([a-zA-Z0-9\\-]*)$" + }, + "TimeZone": { + "type": "string", + "pattern": "^[-+_/ A-Za-z 0-9]*$" + } + }, + "Advertising": { + "uri": "https://meta.comcast.com/firebolt/advertising", + "SkipRestriction": { + "title": "SkipRestriction", + "$comment": "xrn:advertising:policy:skipRestriction:", + "type": "string", + "enum": [ + "none", + "adsUnwatched", + "adsAll", + "all" + ], + "description": "The advertisement skip restriction.\n\nApplies to fast-forward/rewind (e.g. trick mode), seeking over an entire opportunity (e.g. jump), seeking out of what's currently playing, and \"Skip this ad...\" features. Seeking over multiple ad opportunities only requires playback of the _last_ opportunity, not all opportunities, preceding the seek destination.\n\n| Value | Description |\n|--------------|--------------------------------------------------------------------------------|\n| none |No fast-forward, jump, or skip restrictions |\n| adsUnwatched | Restrict fast-forward, jump, and skip for unwatched ad opportunities only. |\n| adsAll | Restrict fast-forward, jump, and skip for all ad opportunities |\n| all | Restrict fast-forward, jump, and skip for all ad opportunities and all content |\n\nNamespace: `xrn:advertising:policy:skipRestriction:`\n\n" + } + }, + "Capabilities": { + "uri": "https://meta.comcast.com/firebolt/capabilities", + "Capability": { + "title": "Capability", + "type": "string", + "description": "A Capability is a discrete unit of functionality that a Firebolt device might be able to perform.", + "pattern": "^xrn:firebolt:capability:([a-z0-9\\-]+)((:[a-z0-9\\-]+)?)$" + }, + "CapabilityInfo": { + "title": "CapabilityInfo", + "type": "object", + "required": [ + "supported", + "available", + "use", + "manage", + "provide" + ], + "properties": { + "capability": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "supported": { + "type": "boolean", + "description": "Provides info whether the capability is supported" + }, + "available": { + "type": "boolean", + "description": "Provides info whether the capability is available" + }, + "use": { + "$ref": "#/x-schemas/Capabilities/CapPermissionStatus" + }, + "manage": { + "$ref": "#/x-schemas/Capabilities/CapPermissionStatus" + }, + "provide": { + "$ref": "#/x-schemas/Capabilities/CapPermissionStatus" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/DenyReason" + }, + "minItems": 1, + "maxItems": 6 + } + }, + "additionalProperties": false, + "examples": [ + { + "capability": "xrn:firebolt:capability:keyboard", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + } + ] + }, + "Permission": { + "title": "Permission", + "description": "A capability combined with a Role, which an app may be permitted (by a distributor) or granted (by an end user).", + "type": "object", + "required": [ + "capability" + ], + "properties": { + "role": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "capability": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + "additionalProperties": false + }, + "Role": { + "title": "Role", + "description": "Role provides access level for the app for a given capability.", + "type": "string", + "enum": [ + "use", + "manage", + "provide" + ] + }, + "CapPermissionStatus": { + "type": "object", + "properties": { + "permitted": { + "type": "boolean", + "description": "Provides info whether the capability is permitted" + }, + "granted": { + "oneOf": [ + { + "type": "boolean", + "description": "Provides info whether the capability is granted" + }, + { + "const": null + } + ] + } + }, + "additionalProperties": false + }, + "DenyReason": { + "title": "DenyReason", + "description": "Reasons why a Capability might not be invokable", + "type": "string", + "enum": [ + "unpermitted", + "unsupported", + "disabled", + "unavailable", + "grantDenied", + "ungranted" + ] + } + }, + "Discovery": { + "uri": "https://meta.comcast.com/firebolt/discovery", + "InterestType": { + "title": "InterestType", + "type": "string", + "enum": [ + "interest", + "disinterest" + ] + }, + "InterestReason": { + "title": "InterestReason", + "type": "string", + "enum": [ + "playlist", + "reaction", + "recording" + ] + }, + "EntityInfoResult": { + "title": "EntityInfoResult", + "description": "The result for an `entityInfo()` push or pull.", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "entity": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + }, + "related": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + } + } + }, + "required": [ + "expires", + "entity" + ], + "additionalProperties": false + }, + "PurchasedContentResult": { + "title": "PurchasedContentResult", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "totalCount": { + "type": "integer", + "minimum": 0 + }, + "entries": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + } + } + }, + "required": [ + "expires", + "totalCount", + "entries" + ], + "additionalProperties": false + } + }, + "Entity": { + "uri": "https://meta.comcast.com/firebolt/entity", + "EntityDetails": { + "title": "EntityDetails", + "type": "object", + "required": [ + "identifiers" + ], + "properties": { + "identifiers": { + "$ref": "#/x-schemas/Entity/Entity" + }, + "info": { + "$ref": "#/x-schemas/Entity/Metadata" + }, + "waysToWatch": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/WayToWatch" + }, + "description": "An array of ways a user is might watch this entity, regardless of entitlements." + } + } + }, + "Entity": { + "oneOf": [ + { + "$ref": "#/x-schemas/Entity/ProgramEntity" + }, + { + "$ref": "#/x-schemas/Entity/MusicEntity" + }, + { + "$ref": "#/x-schemas/Entity/ChannelEntity" + }, + { + "$ref": "#/x-schemas/Entity/UntypedEntity" + }, + { + "$ref": "#/x-schemas/Entity/PlaylistEntity" + } + ] + }, + "Metadata": { + "title": "Metadata", + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Title of the entity." + }, + "synopsis": { + "type": "string", + "description": "Short description of the entity." + }, + "seasonNumber": { + "type": "number", + "description": "For TV seasons, the season number. For TV episodes, the season that the episode belongs to." + }, + "seasonCount": { + "type": "number", + "description": "For TV series, seasons, and episodes, the total number of seasons." + }, + "episodeNumber": { + "type": "number", + "description": "For TV episodes, the episode number." + }, + "episodeCount": { + "type": "number", + "description": "For TV seasons and episodes, the total number of episodes in the current season." + }, + "releaseDate": { + "type": "string", + "format": "date-time", + "description": "The date that the program or entity was released or first aired." + }, + "contentRatings": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/ContentRating" + }, + "description": "A list of ContentRating objects, describing the entity's ratings in various rating schemes." + } + } + }, + "ProgramEntity": { + "title": "ProgramEntity", + "oneOf": [ + { + "$ref": "#/x-schemas/Entity/MovieEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVEpisodeEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVSeasonEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVSeriesEntity" + }, + { + "$ref": "#/x-schemas/Entity/AdditionalEntity" + } + ] + }, + "MusicEntity": { + "title": "MusicEntity", + "type": "object", + "properties": { + "entityType": { + "const": "music" + }, + "musicType": { + "$ref": "#/x-schemas/Entertainment/MusicType" + }, + "entityId": { + "type": "string" + } + }, + "required": [ + "entityType", + "musicType", + "entityId" + ] + }, + "ChannelEntity": { + "title": "ChannelEntity", + "type": "object", + "properties": { + "entityType": { + "const": "channel" + }, + "channelType": { + "type": "string", + "enum": [ + "streaming", + "overTheAir" + ] + }, + "entityId": { + "type": "string", + "description": "ID of the channel, in the target App's scope." + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "required": [ + "entityType", + "channelType", + "entityId" + ], + "additionalProperties": false + }, + "UntypedEntity": { + "title": "UntypedEntity", + "allOf": [ + { + "description": "A Firebolt compliant representation of the remaining entity types.", + "type": "object", + "required": [ + "entityId" + ], + "properties": { + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false + } + ], + "examples": [ + { + "entityId": "an-entity" + } + ] + }, + "PlaylistEntity": { + "title": "PlaylistEntity", + "description": "A Firebolt compliant representation of a Playlist entity.", + "type": "object", + "required": [ + "entityType", + "entityId" + ], + "properties": { + "entityType": { + "const": "playlist" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "playlist", + "entityId": "playlist/xyz" + } + ] + }, + "MovieEntity": { + "title": "MovieEntity", + "description": "A Firebolt compliant representation of a Movie entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "movie" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "movie", + "entityId": "el-camino" + } + ] + }, + "TVEpisodeEntity": { + "title": "TVEpisodeEntity", + "description": "A Firebolt compliant representation of a TV Episode entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId", + "seriesId", + "seasonId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "episode" + }, + "entityId": { + "type": "string" + }, + "seriesId": { + "type": "string" + }, + "seasonId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "episode", + "entityId": "breaking-bad-pilot", + "seriesId": "breaking-bad", + "seasonId": "breaking-bad-season-1" + } + ] + }, + "TVSeasonEntity": { + "title": "TVSeasonEntity", + "description": "A Firebolt compliant representation of a TV Season entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId", + "seriesId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "season" + }, + "entityId": { + "type": "string" + }, + "seriesId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "season", + "entityId": "breaking-bad-season-1", + "seriesId": "breaking-bad" + } + ] + }, + "TVSeriesEntity": { + "title": "TVSeriesEntity", + "description": "A Firebolt compliant representation of a TV Series entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "series" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "series", + "entityId": "breaking-bad" + } + ] + }, + "AdditionalEntity": { + "title": "AdditionalEntity", + "description": "A Firebolt compliant representation of the remaining program entity types.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "type": "string", + "enum": [ + "concert", + "sportingEvent", + "preview", + "other", + "advertisement", + "musicVideo", + "minisode", + "extra" + ] + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "concert", + "entityId": "live-aid" + } + ] + }, + "PlayableEntity": { + "title": "PlayableEntity", + "anyOf": [ + { + "$ref": "#/x-schemas/Entity/MovieEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVEpisodeEntity" + }, + { + "$ref": "#/x-schemas/Entity/PlaylistEntity" + }, + { + "$ref": "#/x-schemas/Entity/MusicEntity" + }, + { + "$ref": "#/x-schemas/Entity/AdditionalEntity" + } + ] + } + }, + "Entertainment": { + "uri": "https://meta.comcast.com/firebolt/entertainment", + "WayToWatch": { + "title": "WayToWatch", + "type": "object", + "required": [ + "identifiers", + "audioProfile" + ], + "properties": { + "identifiers": { + "$ref": "#/x-schemas/Entertainment/ContentIdentifiers" + }, + "expires": { + "type": "string", + "format": "date-time", + "description": "Time when the WayToWatch is no longer available." + }, + "entitled": { + "type": "boolean", + "description": "Specify if the user is entitled to watch the entity." + }, + "entitledExpires": { + "type": "string", + "format": "date-time", + "description": "Time when the entity is no longer entitled." + }, + "offeringType": { + "$ref": "#/x-schemas/Entertainment/OfferingType" + }, + "hasAds": { + "type": "boolean", + "description": "True if the streamable asset contains ads." + }, + "price": { + "type": "number", + "description": "For \"buy\" and \"rent\" WayToWatch, the price to buy or rent in the user's preferred currency." + }, + "videoQuality": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "SD", + "HD", + "UHD" + ] + }, + "description": "List of the video qualities available via the WayToWatch." + }, + "audioProfile": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Types/AudioProfile" + }, + "description": "List of the audio types available via the WayToWatch." + }, + "audioLanguages": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of audio track languages available on the WayToWatch. The first is considered the primary language. Languages are expressed as ISO 639 1/2 codes." + }, + "closedCaptions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of languages for which closed captions are available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes." + }, + "subtitles": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of languages for which subtitles are available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes." + }, + "audioDescriptions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of languages for which audio descriptions (DVD) as available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes." + } + }, + "description": "A WayToWatch describes a way to watch a video program. It may describe a single\nstreamable asset or a set of streamable assets. For example, an app provider may\ndescribe HD, SD, and UHD assets as individual WayToWatch objects or rolled into\na single WayToWatch.\n\nIf the WayToWatch represents a single streamable asset, the provided\nContentIdentifiers must be sufficient to play back the specific asset when sent\nvia a playback intent or deep link. If the WayToWatch represents multiple\nstreamable assets, the provided ContentIdentifiers must be sufficient to\nplayback one of the assets represented with no user action. In this scenario,\nthe app SHOULD choose the best asset for the user based on their device and\nsettings. The ContentIdentifiers MUST also be sufficient for navigating the user\nto the appropriate entity or detail screen via an entity intent.\n\nThe app should set the `entitled` property to indicate if the user can watch, or\nnot watch, the asset without making a purchase. If the entitlement is known to\nexpire at a certain time (e.g., a rental), the app should also provide the\n`entitledExpires` property. If the entitlement is not expired, the UI will use\nthe `entitled` property to display watchable assets to the user, adjust how\nassets are presented to the user, and how intents into the app are generated.\nFor example, the the Aggregated Experience could render a \"Watch\" button for an\nentitled asset versus a \"Subscribe\" button for an non-entitled asset.\n\nThe app should set the `offeringType` to define how the content may be\nauthorized. The UI will use this to adjust how content is presented to the user.\n\nA single WayToWatch cannot represent streamable assets available via multiple\npurchase paths. If, for example, an asset has both Buy, Rent and Subscription\navailability, the three different entitlement paths MUST be represented as\nmultiple WayToWatch objects.\n\n`price` should be populated for WayToWatch objects with `buy` or `rent`\n`offeringType`. If the WayToWatch represents a set of assets with various price\npoints, the `price` provided must be the lowest available price." + }, + "OfferingType": { + "title": "OfferingType", + "type": "string", + "enum": [ + "free", + "subscribe", + "buy", + "rent" + ], + "description": "The offering type of the WayToWatch." + }, + "ContentIdentifiers": { + "title": "ContentIdentifiers", + "type": "object", + "properties": { + "assetId": { + "type": "string", + "description": "Identifies a particular playable asset. For example, the HD version of a particular movie separate from the UHD version." + }, + "entityId": { + "type": "string", + "description": "Identifies an entity, such as a Movie, TV Series or TV Episode." + }, + "seasonId": { + "type": "string", + "description": "The TV Season for a TV Episode." + }, + "seriesId": { + "type": "string", + "description": "The TV Series for a TV Episode or TV Season." + }, + "appContentData": { + "type": "string", + "description": "App-specific content identifiers.", + "maxLength": 1024 + } + }, + "description": "The ContentIdentifiers object is how the app identifies an entity or asset to\nthe Firebolt platform. These ids are used to look up metadata and deep link into\nthe app.\n\nApps do not need to provide all ids. They only need to provide the minimum\nrequired to target a playable stream or an entity detail screen via a deep link.\nIf an id isn't needed to get to those pages, it doesn't need to be included." + }, + "ContentRating": { + "title": "ContentRating", + "type": "object", + "required": [ + "scheme", + "rating" + ], + "properties": { + "scheme": { + "type": "string", + "enum": [ + "CA-Movie", + "CA-TV", + "CA-Movie-Fr", + "CA-TV-Fr", + "US-Movie", + "US-TV" + ], + "description": "The rating scheme." + }, + "rating": { + "type": "string", + "description": "The content rating." + }, + "advisories": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional list of subratings or content advisories." + } + }, + "description": "A ContentRating represents an age or content based of an entity. Supported rating schemes and associated types are below.\n\n## United States\n\n`US-Movie` (MPAA):\n\nRatings: `NR`, `G`, `PG`, `PG13`, `R`, `NC17`\n\nAdvisories: `AT`, `BN`, `SL`, `SS`, `N`, `V`\n\n`US-TV` (Vchip):\n\nRatings: `TVY`, `TVY7`, `TVG`, `TVPG`, `TV14`, `TVMA`\n\nAdvisories: `FV`, `D`, `L`, `S`, `V`\n\n## Canada\n\n`CA-Movie` (OFRB):\n\nRatings: `G`, `PG`, `14A`, `18A`, `R`, `E`\n\n`CA-TV` (AGVOT)\n\nRatings: `E`, `C`, `C8`, `G`, `PG`, `14+`, `18+`\n\nAdvisories: `C`, `C8`, `G`, `PG`, `14+`, `18+`\n\n`CA-Movie-Fr` (Canadian French language movies):\n\nRatings: `G`, `8+`, `13+`, `16+`, `18+`\n\n`CA-TV-Fr` (Canadian French language TV):\n\nRatings: `G`, `8+`, `13+`, `16+`, `18+`\n" + }, + "MusicType": { + "title": "MusicType", + "type": "string", + "description": "In the case of a music `entityType`, specifies the type of music entity.", + "enum": [ + "song", + "album" + ] + }, + "Entitlement": { + "title": "Entitlement", + "type": "object", + "properties": { + "entitlementId": { + "type": "string" + }, + "startTime": { + "type": "string", + "format": "date-time" + }, + "endTime": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "entitlementId" + ] + }, + "EntityInfo": { + "title": "EntityInfo", + "description": "An EntityInfo object represents an \"entity\" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type.\n\nAdditionally, EntityInfo objects must specify a properly formed\nContentIdentifiers object, `entityType`, and `title`. The app should provide\nthe `synopsis` property for a good user experience if the content\nmetadata is not available another way.\n\nThe ContentIdentifiers must be sufficient for navigating the user to the\nappropriate entity or detail screen via a `detail` intent or deep link.\n\nEntityInfo objects must provide at least one WayToWatch object when returned as\npart of an `entityInfo` method and a streamable asset is available to the user.\nIt is optional for the `purchasedContent` method, but recommended because the UI\nmay use those data.", + "type": "object", + "required": [ + "identifiers", + "entityType", + "title" + ], + "properties": { + "identifiers": { + "$ref": "#/x-schemas/Entertainment/ContentIdentifiers" + }, + "title": { + "type": "string", + "description": "Title of the entity." + }, + "entityType": { + "type": "string", + "enum": [ + "program", + "music" + ], + "description": "The type of the entity, e.g. `program` or `music`." + }, + "programType": { + "$ref": "#/x-schemas/Entertainment/ProgramType" + }, + "musicType": { + "$ref": "#/x-schemas/Entertainment/MusicType" + }, + "synopsis": { + "type": "string", + "description": "Short description of the entity." + }, + "seasonNumber": { + "type": "number", + "description": "For TV seasons, the season number. For TV episodes, the season that the episode belongs to." + }, + "seasonCount": { + "type": "number", + "description": "For TV series, seasons, and episodes, the total number of seasons." + }, + "episodeNumber": { + "type": "number", + "description": "For TV episodes, the episode number." + }, + "episodeCount": { + "type": "number", + "description": "For TV seasons and episodes, the total number of episodes in the current season." + }, + "releaseDate": { + "type": "string", + "format": "date-time", + "description": "The date that the program or entity was released or first aired." + }, + "contentRatings": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/ContentRating" + }, + "description": "A list of ContentRating objects, describing the entity's ratings in various rating schemes." + }, + "waysToWatch": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/WayToWatch" + }, + "description": "An array of ways a user is might watch this entity, regardless of entitlements." + } + }, + "if": { + "properties": { + "entityType": { + "const": "program" + } + } + }, + "then": { + "required": [ + "programType" + ], + "not": { + "required": [ + "musicType" + ] + } + }, + "else": { + "required": [ + "musicType" + ], + "not": { + "required": [ + "programType" + ] + } + } + }, + "ProgramType": { + "title": "ProgramType", + "type": "string", + "description": "In the case of a program `entityType`, specifies the program type.", + "enum": [ + "movie", + "episode", + "season", + "series", + "other", + "preview", + "extra", + "concert", + "sportingEvent", + "advertisement", + "musicVideo", + "minisode" + ] + } + }, + "Intents": { + "uri": "https://meta.comcast.com/firebolt/intents", + "NavigationIntent": { + "title": "NavigationIntent", + "description": "A Firebolt compliant representation of a user intention to navigate to a specific place in an app.", + "anyOf": [ + { + "$ref": "#/x-schemas/Intents/HomeIntent" + }, + { + "$ref": "#/x-schemas/Intents/LaunchIntent" + }, + { + "$ref": "#/x-schemas/Intents/EntityIntent" + }, + { + "$ref": "#/x-schemas/Intents/PlaybackIntent" + }, + { + "$ref": "#/x-schemas/Intents/SearchIntent" + }, + { + "$ref": "#/x-schemas/Intents/SectionIntent" + }, + { + "$ref": "#/x-schemas/Intents/TuneIntent" + }, + { + "$ref": "#/x-schemas/Intents/PlayEntityIntent" + }, + { + "$ref": "#/x-schemas/Intents/PlayQueryIntent" + } + ] + }, + "HomeIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to it's home screen, and bring that app to the foreground if needed.", + "title": "HomeIntent", + "allOf": [ + { + "title": "HomeIntent", + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "title": "HomeIntent", + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "title": "HomeIntent", + "type": "object", + "properties": { + "action": { + "const": "home" + } + }, + "not": { + "required": [ + "data" + ] + } + } + ], + "examples": [ + { + "action": "home", + "context": { + "source": "voice" + } + } + ] + }, + "LaunchIntent": { + "description": "A Firebolt compliant representation of a user intention to launch an app.", + "title": "LaunchIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "launch" + } + }, + "not": { + "required": [ + "data" + ] + } + } + ], + "examples": [ + { + "action": "launch", + "context": { + "source": "voice" + } + } + ] + }, + "EntityIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a specific entity page, and bring that app to the foreground if needed.", + "title": "EntityIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "entity" + }, + "data": { + "$ref": "#/x-schemas/Entity/Entity" + } + } + } + ], + "examples": [ + { + "action": "entity", + "context": { + "source": "voice" + }, + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "el-camino" + } + } + ] + }, + "PlaybackIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a the video player for a specific, playable entity, and bring that app to the foreground if needed.", + "title": "PlaybackIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "playback" + }, + "data": { + "$ref": "#/x-schemas/Entity/PlayableEntity" + } + } + } + ], + "examples": [ + { + "action": "playback", + "data": { + "entityType": "program", + "programType": "episode", + "entityId": "breaking-bad-pilot", + "seriesId": "breaking-bad", + "seasonId": "breaking-bad-season-1" + }, + "context": { + "source": "voice" + } + } + ] + }, + "SearchIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to it's search UI with a search term populated, and bring that app to the foreground if needed.", + "title": "SearchIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "search" + }, + "data": { + "type": "object", + "required": [ + "query" + ], + "properties": { + "query": { + "type": "string" + }, + "suggestions": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entity/Entity" + } + } + }, + "additionalProperties": false + } + } + } + ], + "examples": [ + { + "action": "search", + "data": { + "query": "walter white" + }, + "context": { + "source": "voice" + } + } + ] + }, + "SectionIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a section not covered by `home`, `entity`, `player`, or `search`, and bring that app to the foreground if needed.", + "title": "SectionIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "section" + }, + "data": { + "type": "object", + "required": [ + "sectionName" + ], + "properties": { + "sectionName": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "required": [ + "data" + ] + } + ], + "examples": [ + { + "action": "section", + "data": { + "sectionName": "settings" + }, + "context": { + "source": "voice" + } + } + ] + }, + "TuneIntent": { + "description": "A Firebolt compliant representation of a user intention to 'tune' to a traditional over-the-air broadcast, or an OTT Stream from an OTT or vMVPD App.", + "title": "TuneIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "tune" + }, + "data": { + "type": "object", + "required": [ + "entity" + ], + "additionalProperties": false, + "properties": { + "entity": { + "$ref": "#/x-schemas/Entity/ChannelEntity" + }, + "options": { + "description": "The options property of the data property MUST have only one of the following fields.", + "type": "object", + "required": [], + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "properties": { + "assetId": { + "type": "string", + "description": "The ID of a specific 'listing', as scoped by the target App's ID-space, which the App should begin playback from." + }, + "restartCurrentProgram": { + "type": "boolean", + "description": "Denotes that the App should start playback at the most recent program boundary, rather than 'live.'" + }, + "time": { + "type": "string", + "format": "date-time", + "description": "ISO 8601 Date/Time where the App should begin playback from." + } + } + } + } + } + } + } + ], + "examples": [ + { + "action": "tune", + "data": { + "entity": { + "entityType": "channel", + "channelType": "streaming", + "entityId": "an-ott-channel" + }, + "options": { + "restartCurrentProgram": true + } + }, + "context": { + "source": "voice" + } + } + ] + }, + "PlayEntityIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a the video player for a specific, playable entity, and bring that app to the foreground if needed.", + "title": "PlayEntityIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "play-entity" + }, + "data": { + "type": "object", + "properties": { + "entity": { + "$ref": "#/x-schemas/Entity/PlayableEntity" + }, + "options": { + "type": "object", + "properties": { + "playFirstId": { + "type": "string" + }, + "playFirstTrack": { + "type": "integer", + "minimum": 1 + } + }, + "additionalProperties": false + } + }, + "required": [ + "entity" + ], + "propertyNames": { + "enum": [ + "entity", + "options" + ] + }, + "if": { + "properties": { + "entity": { + "type": "object", + "required": [ + "entityType" + ], + "properties": { + "entityType": { + "const": "playlist" + } + } + } + } + }, + "then": { + "type": "object", + "properties": { + "options": { + "type": "object", + "maxProperties": 1 + } + } + }, + "else": { + "type": "object", + "properties": { + "options": { + "type": "object", + "maxProperties": 0 + } + } + } + } + } + } + ], + "examples": [ + { + "action": "play-entity", + "data": { + "entity": { + "entityType": "playlist", + "entityId": "playlist/xyz" + }, + "options": { + "playFirstId": "song/xyz" + } + }, + "context": { + "source": "voice" + } + }, + { + "action": "play-entity", + "data": { + "entity": { + "entityType": "playlist", + "entityId": "playlist/xyz" + }, + "options": { + "playFirstTrack": 3 + } + }, + "context": { + "source": "voice" + } + } + ] + }, + "PlayQueryIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a the video player for an abstract query to be searched for and played by the app.", + "title": "PlayQueryIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "play-query" + }, + "data": { + "type": "object", + "properties": { + "query": { + "type": "string" + }, + "options": { + "type": "object", + "properties": { + "programTypes": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/ProgramType" + } + }, + "musicTypes": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/MusicType" + } + } + }, + "additionalProperties": false + } + }, + "required": [ + "query" + ], + "propertyNames": { + "enum": [ + "query", + "options" + ] + } + } + } + } + ], + "examples": [ + { + "action": "play-query", + "data": { + "query": "Ed Sheeran" + }, + "context": { + "source": "voice" + } + }, + { + "action": "play-query", + "data": { + "query": "Ed Sheeran", + "options": { + "programTypes": [ + "movie" + ] + } + }, + "context": { + "source": "voice" + } + }, + { + "action": "play-query", + "data": { + "query": "Ed Sheeran", + "options": { + "programTypes": [ + "movie" + ], + "musicTypes": [ + "song" + ] + } + }, + "context": { + "source": "voice" + } + } + ] + }, + "Intent": { + "description": "A Firebolt compliant representation of a user intention.", + "type": "object", + "required": [ + "action", + "context" + ], + "properties": { + "action": { + "type": "string" + }, + "context": { + "type": "object", + "required": [ + "source" + ], + "properties": { + "source": { + "type": "string" + } + } + } + } + }, + "IntentProperties": { + "type": "object", + "propertyNames": { + "enum": [ + "action", + "data", + "context" + ] + } + } + }, + "Lifecycle": { + "uri": "https://meta.comcast.com/firebolt/lifecycle", + "CloseReason": { + "title": "CloseReason", + "description": "The application close reason", + "type": "string", + "enum": [ + "remoteButton", + "userExit", + "done", + "error" + ] + }, + "LifecycleState": { + "title": "LifecycleState", + "description": "The application lifecycle state", + "type": "string", + "enum": [ + "initializing", + "inactive", + "foreground", + "background", + "unloading", + "suspended" + ] + } + }, + "SecondScreen": { + "uri": "https://meta.comcast.com/firebolt/secondscreen", + "SecondScreenEvent": { + "title": "SecondScreenEvent", + "description": "An a message notification from a second screen device", + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "dial" + ] + }, + "version": { + "type": "string" + }, + "data": { + "type": "string" + } + } + } + } + } +} \ No newline at end of file diff --git a/requirements/pr-fix-ci-fb-version/specifications/firebolt-open-rpc.json b/requirements/pr-fix-ci-fb-version/specifications/firebolt-open-rpc.json new file mode 100644 index 000000000..96075f1b4 --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/firebolt-open-rpc.json @@ -0,0 +1,21968 @@ +{ + "openrpc": "1.2.4", + "info": { + "title": "Firebolt JSON-RPC API", + "version": "1.5.0-fix-ci-fb-version.0", + "x-module-descriptions": { + "Internal": "Internal methods for SDK / FEE integration", + "Accessibility": "The `Accessibility` module provides access to the user/device settings for closed captioning and voice guidance.\n\nApps **SHOULD** attempt o respect these settings, rather than manage and persist seprate settings, which would be different per-app.", + "Account": "A module for querying about the device account.", + "AcknowledgeChallenge": "A module for registering as a provider for a user grant in which the user confirms access to a capability", + "Advertising": "A module for platform provided advertising settings and functionality.", + "AudioDescriptions": "A module for managing audio-description Settings.", + "Authentication": "A module for acquiring authentication tokens.", + "Capabilities": "The Capabilities module provides information about which discreet unit of functionality is enabled for the apps.", + "ClosedCaptions": "A module for managing closed-captions Settings.", + "Device": "A module for querying about the device and it's capabilities.", + "Discovery": "Your App likely wants to integrate with the Platform's discovery capabilities. For example to add a \"Watch Next\" tile that links to your app from the platform's home screen.\n\nGetting access to this information requires to connect to lower level APIs made available by the platform. Since implementations differ between operators and platforms, the Firebolt SDK offers a Discovery module, that exposes a generic, agnostic interface to the developer.\n\nUnder the hood, an underlaying transport layer will then take care of calling the right APIs for the actual platform implementation that your App is running on.\n\nThe Discovery plugin is used to _send_ information to the Platform.\n\n### Localization\nApps should provide all user-facing strings in the device's language, as specified by the Firebolt `Localization.language` property.\n\nApps should provide prices in the same currency presented in the app. If multiple currencies are supported in the app, the app should provide prices in the user's current default currency.", + "HDMIInput": "Methods for managing HDMI inputs on an HDMI sink device.", + "Keyboard": "Methods for prompting users to enter text with task-oriented UX", + "Lifecycle": "Methods and events for responding to lifecycle changes in your app", + "Localization": "Methods for accessessing location and language preferences", + "Metrics": "Methods for sending metrics", + "Parameters": "Methods for getting initialization parameters for an app cold launch.", + "PinChallenge": "A module for registering as a provider for a user grant in which the user is prompted for a pin for access to a capability", + "Privacy": "A module for managing device settings.", + "Profile": "Methods for getting information about the current user/account profile", + "SecondScreen": "Methods for communicating with second screen devices", + "SecureStorage": "A module for storing and retrieving secure data owned by the app", + "UserGrants": "A module for managing grants given by the user", + "VoiceGuidance": "A module for managing voice-guidance Settings.", + "Wifi": "A module for providing support for Wifi." + } + }, + "methods": [ + { + "name": "rpc.discover", + "summary": "The OpenRPC schema for this JSON-RPC API", + "params": [], + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:rpc:discover" + ] + } + ], + "result": { + "name": "OpenRPC Schema", + "schema": { + "type": "object" + } + }, + "examples": [ + { + "name": "Default", + "params": [], + "result": { + "name": "schema", + "value": {} + } + } + ] + }, + { + "name": "Internal.initialize", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:initialize" + ] + } + ], + "summary": "Initialize the SDK / FEE session.", + "description": "A single version of the Firebolt SDK is compiled into each app. When an app starts up, the SDK **MUST** call this method as soon as possible and **before** any other JSON-RPC methods are sent.", + "params": [ + { + "name": "version", + "required": true, + "schema": { + "$ref": "#/x-schemas/Types/SemanticVersion" + }, + "summary": "The semantic version of the SDK." + } + ], + "result": { + "name": "session", + "summary": "Info about the SDK/FEE session", + "schema": { + "$ref": "#/components/schemas/InitializeResult" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "version", + "value": { + "major": 1, + "minor": 0, + "patch": 0, + "readable": "Firebolt SDK 1.0.0" + } + } + ], + "result": { + "name": "Default Result", + "value": { + "version": { + "major": 1, + "minor": 0, + "patch": 0, + "readable": "Firebolt FEE 1.0.0" + } + } + } + } + ] + }, + { + "name": "Accessibility.closedCaptions", + "summary": "Get the user's preferred closed-captions settings", + "params": [], + "tags": [ + { + "name": "deprecated", + "x-alternative": "Accessibility.closedCaptionsSettings()", + "x-since": "0.6.0" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "closedCaptionsSettings", + "summary": "the closed captions settings", + "schema": { + "$ref": "#/x-schemas/Accessibility/ClosedCaptionsSettings" + } + }, + "examples": [ + { + "name": "Getting the closed captions settings", + "params": [], + "result": { + "name": "settings", + "value": { + "enabled": true, + "styles": { + "fontFamily": "monospaced_sanserif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] + } + } + } + ] + }, + { + "name": "Accessibility.closedCaptionsSettings", + "summary": "Get the user's preferred closed-captions settings", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "closedCaptionsSettings", + "summary": "the closed captions settings", + "schema": { + "$ref": "#/x-schemas/Accessibility/ClosedCaptionsSettings" + } + }, + "examples": [ + { + "name": "Getting the closed captions settings", + "params": [], + "result": { + "name": "settings", + "value": { + "enabled": true, + "styles": { + "fontFamily": "monospaced_sanserif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] + } + } + } + ] + }, + { + "name": "Accessibility.voiceGuidance", + "summary": "Get the user's preferred voice guidance settings", + "params": [], + "tags": [ + { + "name": "deprecated", + "x-alternative": "Accessibility.voiceGuidanceSettings()", + "x-since": "0.6.0" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "result": { + "name": "settings", + "summary": "the voice guidance settings", + "schema": { + "$ref": "#/x-schemas/Accessibility/VoiceGuidanceSettings" + } + }, + "examples": [ + { + "name": "Getting the voice guidance settings", + "params": [], + "result": { + "name": "Default Result", + "value": { + "enabled": true, + "speed": 2 + } + } + } + ] + }, + { + "name": "Accessibility.voiceGuidanceSettings", + "summary": "Get the user's preferred voice guidance settings", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "result": { + "name": "settings", + "summary": "the voice guidance settings", + "schema": { + "$ref": "#/x-schemas/Accessibility/VoiceGuidanceSettings" + } + }, + "examples": [ + { + "name": "Getting the voice guidance settings", + "params": [], + "result": { + "name": "Default Result", + "value": { + "enabled": true, + "speed": 2 + } + } + } + ] + }, + { + "name": "Accessibility.audioDescriptionSettings", + "summary": "Get the user's preferred audio description settings", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:audiodescriptions" + ] + } + ], + "result": { + "name": "settings", + "summary": "the audio description settings", + "schema": { + "$ref": "#/components/schemas/AudioDescriptionSettings" + } + }, + "examples": [ + { + "name": "Getting the audio description settings", + "params": [], + "result": { + "name": "Default Result", + "value": { + "enabled": true + } + } + } + ] + }, + { + "name": "Accessibility.onClosedCaptionsSettingsChanged", + "summary": "Get the user's preferred closed-captions settings", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Accessibility.closedCaptionsSettings" + }, + { + "name": "event", + "x-alternative": "closedCaptionsSettings" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "closedCaptionsSettings", + "summary": "the closed captions settings", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/ClosedCaptionsSettings" + } + ] + } + }, + "examples": [ + { + "name": "Getting the closed captions settings", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "settings", + "value": { + "enabled": true, + "styles": { + "fontFamily": "monospaced_sanserif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] + } + } + } + ] + }, + { + "name": "Accessibility.onVoiceGuidanceSettingsChanged", + "summary": "Get the user's preferred voice guidance settings", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Accessibility.voiceGuidanceSettings" + }, + { + "name": "event", + "x-alternative": "voiceGuidanceSettings" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "result": { + "name": "settings", + "summary": "the voice guidance settings", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/VoiceGuidanceSettings" + } + ] + } + }, + "examples": [ + { + "name": "Getting the voice guidance settings", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "enabled": true, + "speed": 2 + } + } + } + ] + }, + { + "name": "Accessibility.onAudioDescriptionSettingsChanged", + "summary": "Get the user's preferred audio description settings", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Accessibility.audioDescriptionSettings" + }, + { + "name": "event", + "x-alternative": "audioDescriptionSettings" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:audiodescriptions" + ] + } + ], + "result": { + "name": "settings", + "summary": "the audio description settings", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/AudioDescriptionSettings" + } + ] + } + }, + "examples": [ + { + "name": "Getting the audio description settings", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "enabled": true + } + } + } + ] + }, + { + "name": "Account.id", + "summary": "Get the platform back-office account identifier", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:account:id" + ] + } + ], + "result": { + "name": "id", + "summary": "the id", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "123" + } + } + ] + }, + { + "name": "Account.uid", + "summary": "Gets a unique id for the current app & account", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:account:uid" + ] + } + ], + "result": { + "name": "uniqueId", + "summary": "a unique ID", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the unique ID", + "params": [], + "result": { + "name": "Default Result", + "value": "ee6723b8-7ab3-462c-8d93-dbf61227998e" + } + } + ] + }, + { + "name": "Account.session", + "summary": "Used by a distributor to push Session token to firebolt.", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:token:account" + ] + } + ], + "params": [ + { + "name": "token", + "required": true, + "schema": { + "$ref": "#/components/schemas/Token" + } + }, + { + "name": "expiresIn", + "required": true, + "schema": { + "$ref": "#/components/schemas/Expiry" + } + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "token", + "value": "RmlyZWJvbHQgTWFuYWdlIFNESyBSb2NrcyEhIQ==" + }, + { + "name": "expiresIn", + "value": 84000 + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "AcknowledgeChallenge.onRequestChallenge", + "summary": "Registers as a provider for when the user should be challenged in order to confirm access to a capability", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response": { + "$ref": "#/components/schemas/GrantResult" + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:acknowledgechallenge", + "x-allow-focus": true + } + ], + "result": { + "name": "challenge", + "summary": "The request to challenge the user", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/ChallengeProviderRequest" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "correlationId": "abc", + "parameters": { + "capability": "xrn:firebolt:capability:localization::postal-code", + "requestor": { + "id": "ReferenceApp", + "name": "Firebolt Reference App" + } + } + } + } + } + ] + }, + { + "name": "AcknowledgeChallenge.challengeFocus", + "summary": "Internal API for Challenge Provider to request focus for UX purposes.", + "params": [], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:acknowledgechallenge", + "x-allow-focus": true, + "x-allow-focus-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "AcknowledgeChallenge.challengeResponse", + "summary": "Internal API for Challenge Provider to send back response.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "$ref": "#/components/schemas/GrantResult" + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:acknowledgechallenge", + "x-allow-focus": true, + "x-response-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example #1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": true + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Example #2", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": false + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Example #3", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": null + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "AcknowledgeChallenge.challengeError", + "summary": "Internal API for Challenge Provider to send back error.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:acknowledgechallenge", + "x-allow-focus": true, + "x-error-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Advertising.config", + "summary": "Build configuration object for Ad Framework initialization", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "params": [ + { + "name": "options", + "summary": "Configuration options", + "required": true, + "schema": { + "$ref": "#/components/schemas/AdConfigurationOptions" + } + } + ], + "result": { + "name": "adFrameworkConfig", + "summary": "the ad framework config", + "schema": { + "type": "object", + "description": "An opaque object represneting the AdConfiguration" + } + }, + "examples": [ + { + "name": "Initializing the Ad Framework", + "params": [ + { + "name": "options", + "value": { + "environment": "prod", + "authenticationEntity": "MVPD" + } + } + ], + "result": { + "name": "Default Result", + "value": { + "adServerUrl": "https://demo.v.fwmrm.net/ad/p/1", + "adServerUrlTemplate": "https://demo.v.fwmrm.net/ad/p/1?flag=+sltp+exvt+slcb+emcr+amcb+aeti&prof=12345:caf_allinone_profile &nw=12345&mode=live&vdur=123&caid=a110523018&asnw=372464&csid=gmott_ios_tablet_watch_live_ESPNU&ssnw=372464&vip=198.205.92.1&resp=vmap1&metr=1031&pvrn=12345&vprn=12345&vcid=1X0Ce7L3xRWlTeNhc7br8Q%3D%3D", + "adNetworkId": "519178", + "adProfileId": "12345:caf_allinone_profile", + "adSiteSectionId": "caf_allinone_profile_section", + "adOptOut": true, + "privacyData": "ew0KICAicGR0IjogImdkcDp2MSIsDQogICJ1c19wcml2YWN5IjogIjEtTi0iLA0KICAibG10IjogIjEiIA0KfQ0K", + "ifaValue": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa": "ewogICJ2YWx1ZSI6ICIwMTIzNDU2Ny04OUFCLUNERUYtR0gwMS0yMzQ1Njc4OUFCQ0QiLAogICJpZmFfdHlwZSI6ICJzc3BpZCIsCiAgImxtdCI6ICIwIgp9Cg==", + "appName": "FutureToday", + "appBundleId": "FutureToday.comcast", + "distributorAppId": "1001", + "deviceAdAttributes": "ewogICJib0F0dHJpYnV0ZXNGb3JSZXZTaGFyZUlkIjogIjEyMzQiCn0=", + "coppa": 0, + "authenticationEntity": "60f72475281cfba3852413bd53e957f6" + } + } + } + ] + }, + { + "name": "Advertising.policy", + "summary": "Get the advertising privacy and playback policy", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:policy" + ] + } + ], + "result": { + "name": "adPolicy", + "summary": "the ad policy", + "schema": { + "$ref": "#/components/schemas/AdPolicy" + } + }, + "examples": [ + { + "name": "Getting the advertising policy settings", + "params": [], + "result": { + "name": "Default Result", + "value": { + "skipRestriction": "adsUnwatched", + "limitAdTracking": false + } + } + } + ] + }, + { + "name": "Advertising.skipRestriction", + "summary": "Set the value for AdPolicy.skipRestriction", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "params": [], + "result": { + "name": "result", + "schema": { + "$ref": "#/x-schemas/Advertising/SkipRestriction" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "result", + "value": "none" + } + }, + { + "name": "Additional Example", + "params": [], + "result": { + "name": "result", + "value": "all" + } + } + ] + }, + { + "name": "Advertising.advertisingId", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:identifier" + ] + } + ], + "summary": "Get the IAB compliant identifier for advertising (IFA). It is recommended to use the IFA to manage advertising related activities while respecting the user's privacy settings.", + "params": [ + { + "name": "options", + "summary": "AdvertisingId options", + "required": false, + "schema": { + "$ref": "#/components/schemas/AdvertisingIdOptions" + } + } + ], + "result": { + "name": "advertisingId", + "summary": "the advertising ID", + "schema": { + "$ref": "#/components/schemas/AdvertisingIdResult" + } + }, + "examples": [ + { + "name": "Getting the advertising ID", + "params": [], + "result": { + "name": "Default Result", + "value": { + "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa_type": "sspid", + "lmt": "0" + } + } + }, + { + "name": "Getting the advertising ID with scope browse", + "params": [ + { + "name": "options", + "value": { + "scope": { + "type": "browse", + "id": "paidPlacement" + } + } + } + ], + "result": { + "name": "Default Result", + "value": { + "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa_type": "sspid", + "lmt": "0" + } + } + }, + { + "name": "Getting the advertising ID with scope content", + "params": [ + { + "name": "options", + "value": { + "scope": { + "type": "content", + "id": "metadata:linear:station:123" + } + } + } + ], + "result": { + "name": "Default Result", + "value": { + "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa_type": "idfa", + "lmt": "0" + } + } + } + ] + }, + { + "name": "Advertising.deviceAttributes", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "summary": "Get the device advertising device attributes", + "params": [], + "result": { + "name": "deviceAttributes", + "summary": "the device attributes", + "schema": { + "type": "object" + } + }, + "examples": [ + { + "name": "Getting the device attributes", + "params": [], + "result": { + "name": "Default Result", + "value": {} + } + } + ] + }, + { + "name": "Advertising.appBundleId", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "summary": "Get the App's Bundle ID", + "params": [], + "result": { + "name": "appBundleId", + "summary": "the app bundle ID", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "app.operator" + } + } + ] + }, + { + "name": "Advertising.resetIdentifier", + "summary": "Resets a user's identifier in the ad platform so that the advertising id that apps get will be a new value", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:advertising:identifier" + ] + } + ], + "params": [], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "Advertising.onSkipRestrictionChanged", + "summary": "Set the value for AdPolicy.skipRestriction", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Advertising.skipRestriction" + }, + { + "name": "event", + "x-alternative": "skipRestriction" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "result", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Advertising/SkipRestriction" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": "none" + } + }, + { + "name": "Additional Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": "all" + } + } + ] + }, + { + "name": "Advertising.onPolicyChanged", + "summary": "Get the advertising privacy and playback policy", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Advertising.policy" + }, + { + "name": "event", + "x-alternative": "policy" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:policy" + ] + } + ], + "result": { + "name": "adPolicy", + "summary": "the ad policy", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/AdPolicy" + } + ] + } + }, + "examples": [ + { + "name": "Getting the advertising policy settings", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "skipRestriction": "adsUnwatched", + "limitAdTracking": false + } + } + } + ] + }, + { + "name": "Advertising.setSkipRestriction", + "summary": "Set the value for AdPolicy.skipRestriction", + "tags": [ + { + "name": "setter", + "x-setter-for": "skipRestriction" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Advertising/SkipRestriction" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": "none" + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Additional Example", + "params": [ + { + "name": "value", + "value": "all" + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "AudioDescriptions.enabled", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:audiodescriptions" + ] + } + ], + "summary": "Whether or not audio-descriptions are enabled.", + "params": [], + "result": { + "name": "enabled", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "AudioDescriptions.onEnabledChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "AudioDescriptions.enabled" + }, + { + "name": "event", + "x-alternative": "enabled" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:audiodescriptions" + ] + } + ], + "summary": "Whether or not audio-descriptions are enabled.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "enabled", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "AudioDescriptions.setEnabled", + "tags": [ + { + "name": "setter", + "x-setter-for": "enabled" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:audiodescriptions" + ] + } + ], + "summary": "Whether or not audio-descriptions are enabled.", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "enabled", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "enabled", + "value": null + } + } + ] + }, + { + "name": "Authentication.token", + "summary": "Get a specific `type` of authentication token", + "tags": [ + { + "name": "deprecated", + "x-alternative": "Authentication module has individual methods for each token type.", + "x-since": "0.9.0" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:token:platform" + ] + } + ], + "params": [ + { + "name": "type", + "summary": "What type of token to get", + "schema": { + "$ref": "#/components/schemas/TokenType" + }, + "required": true + }, + { + "name": "options", + "summary": "Additional options for acquiring the token.", + "schema": { + "type": "object" + }, + "required": false + } + ], + "result": { + "name": "token", + "summary": "the token value, type, and expiration", + "schema": { + "$ref": "#/components/schemas/AuthenticationTokenResult" + } + }, + "examples": [ + { + "name": "Acquire a Firebolt platform token", + "params": [ + { + "name": "type", + "value": "platform" + } + ], + "result": { + "name": "token", + "value": { + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "expires": "2022-04-23T18:25:43.511Z", + "type": "platform" + } + } + }, + { + "name": "Acquire a Firebolt device identity token", + "params": [ + { + "name": "type", + "value": "device" + } + ], + "result": { + "name": "token", + "value": { + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "expires": "2022-04-23T18:25:43.511Z", + "type": "device" + } + } + }, + { + "name": "Acquire a Firebolt distributor token", + "params": [ + { + "name": "type", + "value": "distributor" + }, + { + "name": "options", + "value": { + "clientId": "xyz" + } + } + ], + "result": { + "name": "token", + "value": { + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "expires": "2022-04-23T18:25:43.511Z", + "type": "distributor", + "data": { + "tid": "EB00E9230AB2A35F57DB4EFDDC4908F6446D38F08F4FF0BD57FE6A61E21EEFD9", + "scope": "scope" + } + } + } + } + ] + }, + { + "name": "Authentication.device", + "summary": "Get a device token scoped to the current app.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:token:device" + ] + } + ], + "params": [], + "result": { + "name": "token", + "summary": "the token value and expiration", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Acquire a Firebolt device identity token", + "params": [], + "result": { + "name": "token", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + } + ] + }, + { + "name": "Authentication.session", + "summary": "Get a destributor session token.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:token:session" + ] + } + ], + "params": [], + "result": { + "name": "token", + "summary": "the token value", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Acquire a distributor session token", + "params": [], + "result": { + "name": "token", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + } + ] + }, + { + "name": "Authentication.root", + "summary": "Get a root device token.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:token:root" + ] + } + ], + "params": [], + "result": { + "name": "token", + "summary": "the token value", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Acquire a Firebolt root device identity token", + "params": [], + "result": { + "name": "token", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + } + ] + }, + { + "name": "Capabilities.supported", + "summary": "Returns whether the platform supports the passed capability.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + } + ], + "result": { + "name": "supported", + "summary": "Whether or not capability is supported in device.", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Wifi scan supported capability", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:wifi:scan" + } + ], + "result": { + "name": "Default Result", + "value": true + } + }, + { + "name": "BLE protocol unsupported capability", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:protocol:bluetoothle" + } + ], + "result": { + "name": "Default Result", + "value": false + } + } + ] + }, + { + "name": "Capabilities.available", + "summary": "Returns whether a capability is available now.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + } + ], + "result": { + "name": "available", + "summary": "Whether or not capability is available now.", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Device Token.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:token:device" + } + ], + "result": { + "name": "Default Result", + "value": true + } + }, + { + "name": "Unavailable Platform token.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:token:platform" + } + ], + "result": { + "name": "Default Result", + "value": false + } + } + ] + }, + { + "name": "Capabilities.permitted", + "summary": "Returns whether the current App has permission to the passed capability and role.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "options", + "summary": "Capability options", + "schema": { + "$ref": "#/components/schemas/CapabilityOption" + } + } + ], + "result": { + "name": "permitted", + "summary": "Whether or not app is permitted for the given capability and the role", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Keyboard", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:input:keyboard" + } + ], + "result": { + "name": "Default Result", + "value": true + } + }, + { + "name": "Keyboard incorrect manage role capability", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:input:keyboard" + }, + { + "name": "options", + "value": { + "role": "manage" + } + } + ], + "result": { + "name": "Default Result", + "value": false + } + }, + { + "name": "Wifi scan not permitted capability", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:wifi:scan" + } + ], + "result": { + "name": "Default Result", + "value": false + } + } + ] + }, + { + "name": "Capabilities.granted", + "summary": "Returns whether the current App has a user grant for passed capability and role.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "options", + "summary": "Capability options", + "schema": { + "$ref": "#/components/schemas/CapabilityOption" + } + } + ], + "result": { + "name": "granted", + "summary": "Whether or not app is granted to use the given capability and the role", + "schema": { + "oneOf": [ + { + "type": "boolean" + }, + { + "const": null + } + ] + } + }, + "examples": [ + { + "name": "Default capabilities without grants.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:input:keyboard" + } + ], + "result": { + "name": "Default Result", + "value": true + } + }, + { + "name": "Get Postal code without grants.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + } + ], + "result": { + "name": "Default Result", + "value": false + } + }, + { + "name": "Get Postal code with grants.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Capabilities.info", + "summary": "Returns an array of CapabilityInfo objects for the passed in capabilities.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "params": [ + { + "name": "capabilities", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "minItems": 1 + } + } + ], + "result": { + "name": "info", + "summary": "Returns an array of CapabilityInfo objects for the passed in capabilities.", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + }, + "minItems": 1 + } + }, + "examples": [ + { + "name": "Default result", + "params": [ + { + "name": "capabilities", + "value": [ + "xrn:firebolt:capability:device:model", + "xrn:firebolt:capability:input:keyboard", + "xrn:firebolt:capability:protocol:bluetoothle", + "xrn:firebolt:capability:token:device", + "xrn:firebolt:capability:token:platform", + "xrn:firebolt:capability:protocol:moca", + "xrn:firebolt:capability:wifi:scan", + "xrn:firebolt:capability:localization:postal-code", + "xrn:firebolt:capability:localization:locality" + ] + } + ], + "result": { + "name": "Default Result", + "value": [ + { + "capability": "xrn:firebolt:capability:device:model", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + }, + { + "capability": "xrn:firebolt:capability:input:keyboard", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + }, + { + "capability": "xrn:firebolt:capability:protocol:bluetoothle", + "supported": false, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unsupported" + ] + }, + { + "capability": "xrn:firebolt:capability:token:device", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + }, + { + "capability": "xrn:firebolt:capability:token:platform", + "supported": true, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unavailable" + ] + }, + { + "capability": "xrn:firebolt:capability:protocol:moca", + "supported": true, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "disabled", + "unavailable" + ] + }, + { + "capability": "xrn:firebolt:capability:wifi:scan", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unpermitted" + ] + }, + { + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": null + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "ungranted" + ] + }, + { + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "ungranted" + ] + }, + { + "capability": "xrn:firebolt:capability:localization:locality", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "grantDenied", + "ungranted" + ] + } + ] + } + } + ] + }, + { + "name": "Capabilities.request", + "summary": "Requests grants for all capability/role combinations in the roles array.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:request" + ] + } + ], + "params": [ + { + "name": "grants", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/Permission" + }, + "minItems": 1 + } + } + ], + "result": { + "name": "request", + "summary": "Returns an array of CapabilityInfo objects for the passed in capabilities.", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + }, + "minItems": 1 + } + }, + "examples": [ + { + "name": "Default result", + "params": [ + { + "name": "grants", + "value": [ + { + "role": "use", + "capability": "xrn:firebolt:capability:commerce:purchase" + } + ] + } + ], + "result": { + "name": "Default Result", + "value": [ + { + "capability": "xrn:firebolt:capability:commerce:purchase", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + } + ] + } + } + ] + }, + { + "name": "Capabilities.onAvailable", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "summary": "Listens for all App permitted capabilities to become available.", + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "Provides the capability info.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + } + ] + } + }, + "examples": [ + { + "name": "Platform token is available", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:token:platform" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default result", + "value": { + "capability": "xrn:firebolt:capability:token:platform", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unpermitted" + ] + } + } + } + ] + }, + { + "name": "Capabilities.onUnavailable", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "summary": "Listens for all App permitted capabilities to become unavailable.", + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "Provides the capability info.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + } + ] + } + }, + "examples": [ + { + "name": "Platform token is unavailable.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:token:platform" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "capability": "xrn:firebolt:capability:token:platform", + "supported": true, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unavailable" + ] + } + } + } + ] + }, + { + "name": "Capabilities.onGranted", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "summary": "Listens for all App permitted capabilities to become granted.", + "params": [ + { + "name": "role", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Role" + } + }, + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "Provides the capability info.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + } + ] + } + }, + "examples": [ + { + "name": "Postal code granted", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + } + } + } + ] + }, + { + "name": "Capabilities.onRevoked", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "summary": "Listens for all App permitted capabilities to become revoked.", + "params": [ + { + "name": "role", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Role" + } + }, + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "Provides the capability info.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + } + ] + } + }, + "examples": [ + { + "name": "Postal code revoked", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "grantDenied" + ] + } + } + } + ] + }, + { + "name": "ClosedCaptions.enabled", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "Whether or not closed-captions are enabled.", + "params": [], + "result": { + "name": "enabled", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "ClosedCaptions.fontFamily", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font family for displaying closed-captions.", + "params": [], + "result": { + "name": "family", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontFamily" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "family", + "value": "monospaced_sanserif" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "family", + "value": "cursive" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "family", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.fontSize", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font size for displaying closed-captions.", + "params": [], + "result": { + "name": "size", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontSize" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "size", + "value": 1 + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "size", + "value": 1 + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "size", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.fontColor", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font color for displaying closed-captions.", + "params": [], + "result": { + "name": "color", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.fontEdge", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge style for displaying closed-captions.", + "params": [], + "result": { + "name": "edge", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontEdge" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "edge", + "value": "none" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "edge", + "value": "uniform" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "edge", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.fontEdgeColor", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge color for displaying closed-captions.", + "params": [], + "result": { + "name": "color", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.fontOpacity", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions characters.", + "params": [], + "result": { + "name": "opacity", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.backgroundColor", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred background color for displaying closed-captions, .", + "params": [], + "result": { + "name": "color", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.backgroundOpacity", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions backgrounds.", + "params": [], + "result": { + "name": "opacity", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.textAlign", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [], + "result": { + "name": "alignment", + "schema": { + "$ref": "#/x-schemas/Accessibility/HorizontalAlignment" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "alignment", + "value": "center" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "alignment", + "value": "left" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.textAlignVertical", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [], + "result": { + "name": "alignment", + "schema": { + "$ref": "#/x-schemas/Accessibility/VerticalAlignment" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "alignment", + "value": "middle" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "alignment", + "value": "top" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.windowColor", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window color for displaying closed-captions, .", + "params": [], + "result": { + "name": "color", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "color", + "value": "white" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.windowOpacity", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window opacity for displaying closed-captions backgrounds.", + "params": [], + "result": { + "name": "opacity", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.preferredLanguages", + "summary": "A prioritized list of ISO 639-2/B codes for the preferred closed captions languages on this device.", + "params": [], + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "languages", + "summary": "the preferred closed captions languages", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": [ + "spa", + "eng" + ] + } + }, + { + "name": "Default Example #2", + "params": [], + "result": { + "name": "Default Result", + "value": [ + "eng", + "spa" + ] + } + } + ] + }, + { + "name": "ClosedCaptions.onEnabledChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.enabled" + }, + { + "name": "event", + "x-alternative": "enabled" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "Whether or not closed-captions are enabled.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "enabled", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "ClosedCaptions.onFontFamilyChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontFamily" + }, + { + "name": "event", + "x-alternative": "fontFamily" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font family for displaying closed-captions.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "family", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/FontFamily" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "family", + "value": "monospaced_sanserif" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "family", + "value": "cursive" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "family", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onFontSizeChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontSize" + }, + { + "name": "event", + "x-alternative": "fontSize" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font size for displaying closed-captions.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "size", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/FontSize" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "size", + "value": 1 + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "size", + "value": 1 + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "size", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onFontColorChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontColor" + }, + { + "name": "event", + "x-alternative": "fontColor" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font color for displaying closed-captions.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "color", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Color" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onFontEdgeChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontEdge" + }, + { + "name": "event", + "x-alternative": "fontEdge" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge style for displaying closed-captions.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "edge", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/FontEdge" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "edge", + "value": "none" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "edge", + "value": "uniform" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "edge", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onFontEdgeColorChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontEdgeColor" + }, + { + "name": "event", + "x-alternative": "fontEdgeColor" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge color for displaying closed-captions.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "color", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Color" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onFontOpacityChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontOpacity" + }, + { + "name": "event", + "x-alternative": "fontOpacity" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions characters.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "opacity", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onBackgroundColorChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.backgroundColor" + }, + { + "name": "event", + "x-alternative": "backgroundColor" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred background color for displaying closed-captions, .", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "color", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Color" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onBackgroundOpacityChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.backgroundOpacity" + }, + { + "name": "event", + "x-alternative": "backgroundOpacity" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions backgrounds.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "opacity", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onTextAlignChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.textAlign" + }, + { + "name": "event", + "x-alternative": "textAlign" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "alignment", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/HorizontalAlignment" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": "center" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": "left" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onTextAlignVerticalChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.textAlignVertical" + }, + { + "name": "event", + "x-alternative": "textAlignVertical" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "alignment", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/VerticalAlignment" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": "middle" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": "top" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onWindowColorChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.windowColor" + }, + { + "name": "event", + "x-alternative": "windowColor" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window color for displaying closed-captions, .", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "color", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Color" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "white" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onWindowOpacityChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.windowOpacity" + }, + { + "name": "event", + "x-alternative": "windowOpacity" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window opacity for displaying closed-captions backgrounds.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "opacity", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onPreferredLanguagesChanged", + "summary": "A prioritized list of ISO 639-2/B codes for the preferred closed captions languages on this device.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.preferredLanguages" + }, + { + "name": "event", + "x-alternative": "preferredLanguages" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "languages", + "summary": "the preferred closed captions languages", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + "spa", + "eng" + ] + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + "eng", + "spa" + ] + } + } + ] + }, + { + "name": "ClosedCaptions.setEnabled", + "tags": [ + { + "name": "setter", + "x-setter-for": "enabled" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "Whether or not closed-captions are enabled.", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "enabled", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "enabled", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontFamily", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontFamily" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font family for displaying closed-captions.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontFamily" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "monospaced_sanserif" + } + ], + "result": { + "name": "family", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "cursive" + } + ], + "result": { + "name": "family", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "family", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontSize", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontSize" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font size for displaying closed-captions.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontSize" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": 1 + } + ], + "result": { + "name": "size", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": 1 + } + ], + "result": { + "name": "size", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "size", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontColor", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontColor" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font color for displaying closed-captions.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "#ffffff" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "#000000" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontEdge", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontEdge" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge style for displaying closed-captions.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontEdge" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "none" + } + ], + "result": { + "name": "edge", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "uniform" + } + ], + "result": { + "name": "edge", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "edge", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontEdgeColor", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontEdgeColor" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge color for displaying closed-captions.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "#000000" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "#ffffff" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontOpacity", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontOpacity" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions characters.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": 99 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": 100 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setBackgroundColor", + "tags": [ + { + "name": "setter", + "x-setter-for": "backgroundColor" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred background color for displaying closed-captions, .", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "#000000" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "#ffffff" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setBackgroundOpacity", + "tags": [ + { + "name": "setter", + "x-setter-for": "backgroundOpacity" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions backgrounds.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": 99 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": 100 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setTextAlign", + "tags": [ + { + "name": "setter", + "x-setter-for": "textAlign" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/HorizontalAlignment" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "center" + } + ], + "result": { + "name": "alignment", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "left" + } + ], + "result": { + "name": "alignment", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setTextAlignVertical", + "tags": [ + { + "name": "setter", + "x-setter-for": "textAlignVertical" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/VerticalAlignment" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "middle" + } + ], + "result": { + "name": "alignment", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "top" + } + ], + "result": { + "name": "alignment", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setWindowColor", + "tags": [ + { + "name": "setter", + "x-setter-for": "windowColor" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window color for displaying closed-captions, .", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "#000000" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "white" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setWindowOpacity", + "tags": [ + { + "name": "setter", + "x-setter-for": "windowOpacity" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window opacity for displaying closed-captions backgrounds.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": 99 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": 100 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setPreferredLanguages", + "summary": "A prioritized list of ISO 639-2/B codes for the preferred closed captions languages on this device.", + "params": [ + { + "name": "value", + "summary": "the preferred closed captions languages", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + }, + "required": true + } + ], + "tags": [ + { + "name": "setter", + "x-setter-for": "preferredLanguages" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": [ + "spa", + "eng" + ] + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "value", + "value": [ + "eng", + "spa" + ] + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Content.requestUserInterest", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Discovery.onRequestUserInterest", + "x-uses": [ + "xrn:firebolt:capability:discovery:interest" + ] + } + ], + "summary": "Provide information about the entity currently displayed or selected on the screen.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [ + { + "name": "type", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/InterestType" + } + }, + { + "name": "reason", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/InterestReason" + } + } + ], + "result": { + "name": "interest", + "schema": { + "$ref": "#/components/schemas/InterestResult" + }, + "summary": "The EntityDetails data." + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "type", + "value": "interest" + }, + { + "name": "reason", + "value": "playlist" + } + ], + "result": { + "name": "interest", + "value": { + "appId": "cool-app", + "entity": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + } + } + } + ] + }, + { + "name": "Content.onUserInterest", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-provided-by": "Discovery.userInterest", + "x-uses": [ + "xrn:firebolt:capability:discovery:interest" + ] + } + ], + "summary": "Provide information about the entity currently displayed or selected on the screen.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "interest", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/InterestEvent" + } + ] + }, + "summary": "The EntityDetails data." + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "interest", + "value": { + "appId": "cool-app", + "type": "interest", + "reason": "playlist", + "entity": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + } + } + } + ] + }, + { + "name": "Device.id", + "summary": "Get the platform back-office device identifier", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:id" + ] + } + ], + "result": { + "name": "id", + "summary": "the id", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "123" + } + } + ] + }, + { + "name": "Device.distributor", + "summary": "Get the name of the entity which is distributing the current device. There can be multiple distributors which distribute the same device model.", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:distributor" + ] + } + ], + "result": { + "name": "distributorId", + "summary": "the distributor ID", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the distributor ID", + "params": [], + "result": { + "name": "Default Result", + "value": "Company" + } + } + ] + }, + { + "name": "Device.platform", + "summary": "Get a platform identifier for the device. This API should be used to correlate metrics on the device only and cannot be guaranteed to have consistent responses across platforms.", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "platformId", + "summary": "the platform ID", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the platform ID", + "params": [], + "result": { + "name": "Default Result", + "value": "WPE" + } + } + ] + }, + { + "name": "Device.uid", + "summary": "Gets a unique id for the current app & device", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:uid" + ] + } + ], + "result": { + "name": "uniqueId", + "summary": "a unique ID", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the unique ID", + "params": [], + "result": { + "name": "Default Result", + "value": "ee6723b8-7ab3-462c-8d93-dbf61227998e" + } + } + ] + }, + { + "name": "Device.type", + "summary": "Get the device type", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "deviceType", + "summary": "the device type", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the device type", + "params": [], + "result": { + "name": "Default Result", + "value": "STB" + } + } + ] + }, + { + "name": "Device.model", + "summary": "Get the manufacturer designated model of the device", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:model" + ] + } + ], + "result": { + "name": "model", + "summary": "the device model", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the device model", + "params": [], + "result": { + "name": "Default Result", + "value": "xi6" + } + } + ] + }, + { + "name": "Device.sku", + "summary": "Get the device sku", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:sku" + ] + } + ], + "result": { + "name": "sku", + "summary": "the device sku", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the device sku", + "params": [], + "result": { + "name": "Default Result", + "value": "AX061AEI" + } + } + ] + }, + { + "name": "Device.make", + "summary": "Get the manufacturer of the device model", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:make" + ] + } + ], + "result": { + "name": "make", + "summary": "the device make", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the device make", + "params": [], + "result": { + "name": "Default Result", + "value": "Arris" + } + } + ] + }, + { + "name": "Device.version", + "summary": "Get the SDK, OS and other version info", + "params": [], + "tags": [ + { + "name": "exclude-from-sdk" + }, + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "versions", + "summary": "the versions", + "schema": { + "$ref": "#/components/schemas/DeviceVersion" + } + }, + "examples": [ + { + "name": "Getting the os and sdk versions", + "params": [], + "result": { + "name": "Default Result", + "value": { + "sdk": { + "major": 0, + "minor": 8, + "patch": 0, + "readable": "Firebolt JS SDK v0.8.0" + }, + "api": { + "major": 0, + "minor": 8, + "patch": 0, + "readable": "Firebolt API v0.8.0" + }, + "firmware": { + "major": 1, + "minor": 2, + "patch": 3, + "readable": "Device Firmware v1.2.3" + }, + "os": { + "major": 0, + "minor": 1, + "patch": 0, + "readable": "Firebolt OS v0.1.0" + }, + "debug": "Non-parsable build info for error logging only." + } + } + } + ] + }, + { + "name": "Device.hdcp", + "summary": "Get the negotiated HDCP profiles for a connected device. \n\n For devices that do not require additional connections (e.g. panels), `true` will be returned for all profiles.", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "negotiatedHdcpVersions", + "summary": "the negotiated HDCP versions", + "schema": { + "$ref": "#/components/schemas/HDCPVersionMap" + } + }, + "examples": [ + { + "name": "Getting the negotiated HDCP versions", + "params": [], + "result": { + "name": "Default Result", + "value": { + "hdcp1.4": true, + "hdcp2.2": true + } + } + } + ] + }, + { + "name": "Device.hdr", + "summary": "Get the negotiated HDR formats for the connected display and device", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "negotiatedHdrFormats", + "summary": "the negotiated HDR formats", + "schema": { + "$ref": "#/components/schemas/HDRFormatMap" + } + }, + "examples": [ + { + "name": "Getting the negotiated HDR formats", + "params": [], + "result": { + "name": "Default Result", + "value": { + "hdr10": true, + "hdr10Plus": true, + "dolbyVision": true, + "hlg": true + } + } + } + ] + }, + { + "name": "Device.audio", + "summary": "Get the supported audio profiles for the connected devices. \n\n It is not recommended to use this API for visual badging on content within your app since this does not reflect the settings of the user.", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "supportedAudioProfiles", + "summary": "the supported audio profiles", + "schema": { + "$ref": "#/components/schemas/AudioProfiles" + } + }, + "examples": [ + { + "name": "Getting the supported audio profiles", + "params": [], + "result": { + "name": "Default Result", + "value": { + "stereo": true, + "dolbyDigital5.1": true, + "dolbyDigital5.1+": true, + "dolbyAtmos": true + } + } + } + ] + }, + { + "name": "Device.screenResolution", + "summary": "Get the resolution for the graphical surface of the app. \n\nThe pairs returned will be of a [width, height] format and will correspond to the following values: \n\nNTSC Standard Definition (SD): [720, 480] \n\nPAL Standard Definition (SD): [720, 576] \n\nHigh Definition (HD): [1280, 720] \n\nFull HD (FHD): [1920, 1080]\n\n4K Ultra High Definition (UHD): [3840, 2160] \n\n**Deprecated:** Use non-Firebolt APIs specific to your platform, e.g. W3C APIs", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + }, + { + "name": "deprecated", + "x-alternative": "Use non-Firebolt APIs specific to your platform, e.g. W3C APIs", + "x-since": "1.4.0" + } + ], + "result": { + "name": "screenResolution", + "summary": "the resolution", + "schema": { + "$ref": "#/components/schemas/Resolution" + } + }, + "examples": [ + { + "name": "Getting the screen resolution", + "params": [], + "result": { + "name": "Default Result", + "value": [ + 1920, + 1080 + ] + } + } + ] + }, + { + "name": "Device.videoResolution", + "summary": "Get the maximum supported video resolution of the currently connected device and display. \n\nThe pairs returned will be of a [width, height] format and will correspond to the following values: \n\nNTSC Standard Definition (SD): [720, 480] \n\nPAL Standard Definition (SD): [720, 576] \n\nHigh Definition (HD): [1280, 720] \n\nFull HD (FHD): [1920, 1080]\n\n4K Ultra High Definition (UHD): [3840, 2160]", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "videoResolution", + "summary": "the resolution", + "schema": { + "$ref": "#/components/schemas/Resolution" + } + }, + "examples": [ + { + "name": "Getting the video resolution", + "params": [], + "result": { + "name": "Default Result", + "value": [ + 1920, + 1080 + ] + } + } + ] + }, + { + "name": "Device.name", + "summary": "The human readable name of the device", + "params": [], + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:name" + ] + } + ], + "result": { + "name": "value", + "summary": "the device friendly-name", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "Living Room" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "Kitchen" + } + } + ] + }, + { + "name": "Device.onDeviceNameChanged", + "tags": [ + { + "name": "event" + }, + { + "name": "deprecated", + "x-since": "0.6.0", + "x-alternative": "Device.name()" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:name" + ] + } + ], + "summary": "Get the human readable name of the device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "the device friendly-name", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "string" + } + ] + } + }, + "examples": [ + { + "name": "Getting the device name", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Living Room" + } + } + ] + }, + { + "name": "Device.network", + "summary": "Get the current network status and type", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:network:status" + ] + } + ], + "result": { + "name": "networkInfo", + "summary": "the status and type", + "schema": { + "$ref": "#/components/schemas/NetworkInfoResult" + } + }, + "examples": [ + { + "name": "Getting the network info", + "params": [], + "result": { + "name": "Default Result", + "value": { + "state": "connected", + "type": "wifi" + } + } + } + ] + }, + { + "name": "Device.provision", + "summary": "Used by a distributor to push provision info to firebolt.", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:account:id", + "xrn:firebolt:capability:device:id", + "xrn:firebolt:capability:device:distributor" + ] + } + ], + "params": [ + { + "name": "accountId", + "summary": "The id of the account that is device is attached to in the back office.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "deviceId", + "summary": "The id of the device in the back office.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "distributorId", + "summary": "The id of the distributor in the back office.", + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "accountId", + "value": "12345678910" + }, + { + "name": "deviceId", + "value": "987654321111" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + }, + { + "name": "With distributor id", + "params": [ + { + "name": "accountId", + "value": "12345678910" + }, + { + "name": "deviceId", + "value": "987654321111" + }, + { + "name": "distributorId", + "value": "global_partner" + } + ], + "result": { + "name": "partnerResult", + "value": null + } + } + ] + }, + { + "name": "Device.onNameChanged", + "summary": "The human readable name of the device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.name" + }, + { + "name": "event", + "x-alternative": "name" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:name" + ] + } + ], + "result": { + "name": "value", + "summary": "the device friendly-name", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "string" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Living Room" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Kitchen" + } + } + ] + }, + { + "name": "Device.onHdcpChanged", + "summary": "Get the negotiated HDCP profiles for a connected device. \n\n For devices that do not require additional connections (e.g. panels), `true` will be returned for all profiles.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.hdcp" + }, + { + "name": "event", + "x-alternative": "hdcp" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "negotiatedHdcpVersions", + "summary": "the negotiated HDCP versions", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/HDCPVersionMap" + } + ] + } + }, + "examples": [ + { + "name": "Getting the negotiated HDCP versions", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "hdcp1.4": true, + "hdcp2.2": true + } + } + } + ] + }, + { + "name": "Device.onHdrChanged", + "summary": "Get the negotiated HDR formats for the connected display and device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.hdr" + }, + { + "name": "event", + "x-alternative": "hdr" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "negotiatedHdrFormats", + "summary": "the negotiated HDR formats", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/HDRFormatMap" + } + ] + } + }, + "examples": [ + { + "name": "Getting the negotiated HDR formats", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "hdr10": true, + "hdr10Plus": true, + "dolbyVision": true, + "hlg": true + } + } + } + ] + }, + { + "name": "Device.onAudioChanged", + "summary": "Get the supported audio profiles for the connected devices. \n\n It is not recommended to use this API for visual badging on content within your app since this does not reflect the settings of the user.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.audio" + }, + { + "name": "event", + "x-alternative": "audio" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "supportedAudioProfiles", + "summary": "the supported audio profiles", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/AudioProfiles" + } + ] + } + }, + "examples": [ + { + "name": "Getting the supported audio profiles", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "stereo": true, + "dolbyDigital5.1": true, + "dolbyDigital5.1+": true, + "dolbyAtmos": true + } + } + } + ] + }, + { + "name": "Device.onScreenResolutionChanged", + "summary": "Get the resolution for the graphical surface of the app. \n\nThe pairs returned will be of a [width, height] format and will correspond to the following values: \n\nNTSC Standard Definition (SD): [720, 480] \n\nPAL Standard Definition (SD): [720, 576] \n\nHigh Definition (HD): [1280, 720] \n\nFull HD (FHD): [1920, 1080]\n\n4K Ultra High Definition (UHD): [3840, 2160] \n\n**Deprecated:** Use non-Firebolt APIs specific to your platform, e.g. W3C APIs", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.screenResolution" + }, + { + "name": "event", + "x-alternative": "screenResolution" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + }, + { + "name": "deprecated", + "x-alternative": "Use non-Firebolt APIs specific to your platform, e.g. W3C APIs", + "x-since": "1.4.0" + } + ], + "result": { + "name": "screenResolution", + "summary": "the resolution", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/Resolution" + } + ] + } + }, + "examples": [ + { + "name": "Getting the screen resolution", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + 1920, + 1080 + ] + } + } + ] + }, + { + "name": "Device.onVideoResolutionChanged", + "summary": "Get the maximum supported video resolution of the currently connected device and display. \n\nThe pairs returned will be of a [width, height] format and will correspond to the following values: \n\nNTSC Standard Definition (SD): [720, 480] \n\nPAL Standard Definition (SD): [720, 576] \n\nHigh Definition (HD): [1280, 720] \n\nFull HD (FHD): [1920, 1080]\n\n4K Ultra High Definition (UHD): [3840, 2160]", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.videoResolution" + }, + { + "name": "event", + "x-alternative": "videoResolution" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "videoResolution", + "summary": "the resolution", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/Resolution" + } + ] + } + }, + "examples": [ + { + "name": "Getting the video resolution", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + 1920, + 1080 + ] + } + } + ] + }, + { + "name": "Device.onNetworkChanged", + "summary": "Get the current network status and type", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.network" + }, + { + "name": "event", + "x-alternative": "network" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:network:status" + ] + } + ], + "result": { + "name": "networkInfo", + "summary": "the status and type", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/NetworkInfoResult" + } + ] + } + }, + "examples": [ + { + "name": "Getting the network info", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "connected", + "type": "wifi" + } + } + } + ] + }, + { + "name": "Device.setName", + "summary": "The human readable name of the device", + "params": [ + { + "name": "value", + "summary": "the device friendly-name", + "schema": { + "type": "string" + }, + "required": true + } + ], + "tags": [ + { + "name": "setter", + "x-setter-for": "name" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:device:name" + ] + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "Living Room" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "Kitchen" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Discovery.policy", + "summary": "get the discovery policy", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:policy" + ] + } + ], + "result": { + "name": "policy", + "summary": "discovery policy opt-in/outs", + "schema": { + "$ref": "#/components/schemas/DiscoveryPolicy" + } + }, + "examples": [ + { + "name": "Getting the discovery policy", + "params": [], + "result": { + "name": "Default Result", + "value": { + "enableRecommendations": true, + "shareWatchHistory": true, + "rememberWatchedPrograms": true + } + } + } + ] + }, + { + "name": "Discovery.entityInfo", + "tags": [ + { + "name": "polymorphic-pull" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:entity-info" + }, + { + "name": "deprecated" + } + ], + "summary": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow.", + "description": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow. Includes information about the program entity and its relevant associated entities, such as extras, previews, and, in the case of TV series, seasons and episodes.\n\nSee the `EntityInfo` and `WayToWatch` data structures below for more information.\n\nThe app only needs to implement Pull support for `entityInfo` at this time.", + "params": [ + { + "name": "correlationId", + "required": true, + "schema": { + "type": [ + "string", + "null" + ] + } + }, + { + "name": "result", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/EntityInfoResult" + }, + "summary": "The entityInfo data." + } + ], + "result": { + "name": "success", + "summary": "True if the push operation is successful", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send entity info for a movie to the platform.", + "params": [ + { + "name": "correlationId", + "value": null + }, + { + "name": "result", + "value": { + "expires": "2025-01-01T00:00:00.000Z", + "entity": { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": [ + "UHD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ], + "subtitles": [ + "es" + ], + "audioDescriptions": [ + "en" + ] + } + ] + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send entity info for a movie with a trailer to the platform.", + "params": [ + { + "name": "correlationId", + "value": null + }, + { + "name": "result", + "value": { + "expires": "2025-01-01T00:00:00.000Z", + "entity": { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": [ + "UHD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ], + "subtitles": [ + "es" + ], + "audioDescriptions": [ + "en" + ] + } + ] + }, + "related": [ + { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "preview", + "title": "Cool Runnings Trailer", + "waysToWatch": [ + { + "identifiers": { + "assetId": "123111", + "entityId": "345" + }, + "entitled": true, + "videoQuality": [ + "HD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ] + } + ] + } + ] + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send entity info for a TV Series with seasons and episodes to the platform.", + "params": [ + { + "name": "correlationId", + "value": null + }, + { + "name": "result", + "value": { + "expires": "2025-01-01T00:00:00.000Z", + "entity": { + "identifiers": { + "entityId": "98765" + }, + "entityType": "program", + "programType": "series", + "title": "Perfect Strangers", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1986-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ] + }, + "related": [ + { + "identifiers": { + "entityId": "111", + "seriesId": "98765" + }, + "entityType": "program", + "programType": "season", + "seasonNumber": 1, + "title": "Perfect Strangers Season 3", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "556", + "entityId": "111", + "seriesId": "98765" + }, + "entitled": true, + "offeringType": "free", + "videoQuality": [ + "SD" + ], + "audioProfile": [ + "stereo" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ] + } + ] + }, + { + "identifiers": { + "entityId": "111", + "seriesId": "98765" + }, + "entityType": "program", + "programType": "episode", + "seasonNumber": 1, + "episodeNumber": 1, + "title": "Knock Knock, Who's There?", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1986-03-25T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "556", + "entityId": "111", + "seriesId": "98765" + }, + "entitled": true, + "offeringType": "free", + "videoQuality": [ + "SD" + ], + "audioProfile": [ + "stereo" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ] + } + ] + }, + { + "identifiers": { + "entityId": "112", + "seriesId": "98765" + }, + "entityType": "program", + "programType": "episode", + "seasonNumber": 1, + "episodeNumber": 2, + "title": "Picture This", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1986-04-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "557", + "entityId": "112", + "seriesId": "98765" + }, + "entitled": true, + "offeringType": "free", + "videoQuality": [ + "SD" + ], + "audioProfile": [ + "stereo" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ] + } + ] + } + ] + } + } + ], + "result": { + "name": "result", + "value": true + } + } + ] + }, + { + "name": "Discovery.purchasedContent", + "tags": [ + { + "name": "polymorphic-pull" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:purchased-content" + }, + { + "name": "deprecated" + } + ], + "summary": "Provide a list of purchased content for the authenticated account, such as rentals and electronic sell through purchases.", + "params": [ + { + "name": "correlationId", + "required": true, + "schema": { + "type": [ + "string", + "null" + ] + } + }, + { + "name": "result", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/PurchasedContentResult" + }, + "summary": "The data for the purchasedContent" + } + ], + "result": { + "name": "success", + "summary": "True if the push operation is successful", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Inform the platform of the user's purchased content", + "params": [ + { + "name": "correlationId", + "value": null + }, + { + "name": "result", + "value": { + "totalCount": 10, + "expires": "2025-01-01T00:00:00.000Z", + "entries": [ + { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": [ + "UHD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ], + "subtitles": [ + "es" + ], + "audioDescriptions": [ + "en" + ] + } + ] + } + ] + } + } + ], + "result": { + "name": "success", + "value": true + } + } + ], + "description": "Return content purchased by the user, such as rentals and electronic sell through purchases.\n\nThe app should return the user's 100 most recent purchases in `entries`. The total count of purchases must be provided in `count`. If `count` is greater than the total number of `entries`, the UI may provide a link into the app to see the complete purchase list.\n\nThe `EntityInfo` object returned is not required to have `waysToWatch` populated, but it is recommended that it do so in case the UI wants to surface additional information on the purchases screen.\n\nThe app should implement both Push and Pull methods for `purchasedContent`.\n\nThe app should actively push `purchasedContent` when:\n\n* The app becomes Active.\n* When the state of the purchasedContent set has changed.\n* The app goes into Inactive or Background state, if there is a chance a change event has been missed." + }, + { + "name": "Discovery.watched", + "summary": "Notify the platform that content was partially or completely watched", + "tags": [ + { + "name": "polymorphic-reducer" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:watched" + ] + } + ], + "params": [ + { + "name": "entityId", + "required": true, + "schema": { + "type": "string" + }, + "summary": "The entity Id of the watched content." + }, + { + "name": "progress", + "summary": "How much of the content has been watched (percentage as (0-0.999) for VOD, number of seconds for live)", + "schema": { + "type": "number", + "minimum": 0 + } + }, + { + "name": "completed", + "summary": "Whether or not this viewing is considered \"complete,\" per the app's definition thereof", + "schema": { + "type": "boolean" + } + }, + { + "name": "watchedOn", + "summary": "Date/Time the content was watched, ISO 8601 Date/Time", + "schema": { + "type": "string", + "format": "date-time" + } + } + ], + "result": { + "name": "success", + "summary": "whether the call was successful or not", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Notifying the platform of watched content", + "params": [ + { + "name": "entityId", + "value": "partner.com/entity/123" + }, + { + "name": "progress", + "value": 0.95 + }, + { + "name": "completed", + "value": true + }, + { + "name": "watchedOn", + "value": "2021-04-23T18:25:43.511Z" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.watchNext", + "summary": "Suggest a call-to-action for this app on the platform home screen", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:watch-next" + ] + } + ], + "params": [ + { + "name": "title", + "summary": "The title of this call to action", + "schema": { + "$ref": "#/x-schemas/Types/LocalizedString" + }, + "required": true + }, + { + "name": "identifiers", + "summary": "A set of content identifiers for this call to action", + "schema": { + "$ref": "#/x-schemas/Entertainment/ContentIdentifiers" + }, + "required": true + }, + { + "name": "expires", + "summary": "When this call to action should no longer be presented to users", + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "images", + "summary": "A set of images for this call to action", + "schema": { + "type": "object", + "patternProperties": { + "^.*$": { + "$ref": "#/x-schemas/Types/LocalizedString" + } + } + } + } + ], + "result": { + "name": "success", + "summary": "whether the call was successful or not", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Suggest a watch-next tile for the home screen", + "params": [ + { + "name": "title", + "value": "A Cool Show" + }, + { + "name": "identifiers", + "value": { + "entityId": "partner.com/entity/123" + } + }, + { + "name": "expires", + "value": "2021-04-23T18:25:43.511Z" + }, + { + "name": "images", + "value": { + "3x4": { + "en-US": "https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg", + "es": "https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg" + }, + "16x9": { + "en": "https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Suggest a watch-next tile for the home screen", + "params": [ + { + "name": "title", + "value": "A Fantastic Show" + }, + { + "name": "identifiers", + "value": { + "entityId": "partner.com/entity/456" + } + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.entitlements", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:content-access" + ] + }, + { + "name": "deprecated", + "x-since": "0.10.0", + "x-alternative": "Discovery.contentAccess()" + } + ], + "summary": "Inform the platform of the users latest entitlements w/in this app.", + "params": [ + { + "name": "entitlements", + "summary": "Array of entitlement objects", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/Entitlement" + } + }, + "required": true + } + ], + "result": { + "name": "success", + "summary": "whether the call was successful or not", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Update user's entitlements", + "params": [ + { + "name": "entitlements", + "value": [ + { + "entitlementId": "partner.com/entitlement/123", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + }, + { + "entitlementId": "partner.com/entitlement/456", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + } + ] + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.contentAccess", + "summary": "Inform the platform of what content the user can access either by discovering it or consuming it. Availabilities determine which content is discoverable to a user, while entitlements determine if the user can currently consume that content. Content can be available but not entitled, this means that user can see the content but when they try to open it they must gain an entitlement either through purchase or subscription upgrade. In case the access changed off-device, this API should be called any time the app comes to the foreground to refresh the access. This API should also be called any time the availabilities or entitlements change within the app for any reason. Typical reasons may include the user signing into an account or upgrading a subscription. Less common cases can cause availabilities to change, such as moving to a new service location. When availabilities or entitlements are removed from the subscriber (such as when the user signs out), then an empty array should be given. To clear both, use the Discovery.clearContentAccess convenience API.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:content-access" + ] + } + ], + "params": [ + { + "name": "ids", + "summary": "A list of identifiers that represent content that is discoverable or consumable for the subscriber", + "schema": { + "$ref": "#/components/schemas/ContentAccessIdentifiers" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Update subscriber's availabilities", + "params": [ + { + "name": "ids", + "value": { + "availabilities": [ + { + "type": "channel-lineup", + "id": "partner.com/availability/123", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + }, + { + "type": "channel-lineup", + "id": "partner.com/availability/456", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + } + ] + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Update subscriber's availabilities and entitlements", + "params": [ + { + "name": "ids", + "value": { + "availabilities": [ + { + "type": "channel-lineup", + "id": "partner.com/availability/123", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + }, + { + "type": "channel-lineup", + "id": "partner.com/availability/456", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + } + ], + "entitlements": [ + { + "entitlementId": "123", + "startTime": "2025-01-01T00:00:00.000Z", + "endTime": "2025-01-01T00:00:00.000Z" + } + ] + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Update subscriber's entitlements", + "params": [ + { + "name": "ids", + "value": { + "entitlements": [ + { + "entitlementId": "123", + "startTime": "2025-01-01T00:00:00.000Z", + "endTime": "2025-01-01T00:00:00.000Z" + } + ] + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Clear a subscriber's entitlements", + "params": [ + { + "name": "ids", + "value": { + "entitlements": [] + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Clear a subscriber's availabilities", + "params": [ + { + "name": "ids", + "value": { + "availabilities": [] + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Discovery.clearContentAccess", + "summary": "Clear both availabilities and entitlements from the subscriber. This is equivalent of calling `Discovery.contentAccess({ availabilities: [], entitlements: []})`. This is typically called when the user signs out of an account.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:content-access" + ] + } + ], + "params": [], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Clear subscriber's availabilities and entitlements", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Discovery.launch", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:launch" + ] + } + ], + "summary": "Launch or foreground the specified app, and optionally instructs it to navigate to the specified user action. \n For the Primary Experience, the appId can be any one of: \n\n - xrn:firebolt:application-type:main \n\n - xrn:firebolt:application-type:settings", + "params": [ + { + "name": "appId", + "required": true, + "summary": "The durable app Id of the app to launch", + "schema": { + "type": "string" + } + }, + { + "name": "intent", + "required": false, + "summary": "An optional `NavigationIntent` with details about what part of the app to show first, and context around how/why it was launched", + "schema": { + "$ref": "#/x-schemas/Intents/NavigationIntent" + } + } + ], + "result": { + "name": "success", + "summary": "whether the call was successful or not", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Launch the 'Foo' app to it's home screen.", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "intent", + "value": { + "action": "home", + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the 'Foo' app to it's own page for a specific entity.", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "intent", + "value": { + "action": "entity", + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "example-movie-id" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the 'Foo' app to a fullscreen playback experience for a specific entity.", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "intent", + "value": { + "action": "playback", + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "example-movie-id" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to a global page for a specific entity.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main" + }, + { + "name": "intent", + "value": { + "action": "entity", + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "example-movie-id" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to a global page for the company / partner with the ID 'foo'.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main" + }, + { + "name": "intent", + "value": { + "action": "section", + "data": { + "sectionName": "company:foo" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to it's home screen, as if the Home remote button was pressed.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main" + }, + { + "name": "intent", + "value": { + "action": "home", + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to it's search screen.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main" + }, + { + "name": "intent", + "value": { + "action": "search", + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to it's settings screen.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:settings" + }, + { + "name": "intent", + "value": { + "action": "section", + "data": { + "sectionName": "settings" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to it's linear/epg guide.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main" + }, + { + "name": "intent", + "value": { + "action": "section", + "data": { + "sectionName": "guide" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to the App Store details page for a specific app with the ID 'foo'.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main " + }, + { + "name": "intent", + "value": { + "action": "section", + "data": { + "sectionName": "app:foo" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.onNavigateTo", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:navigate-to" + ] + } + ], + "summary": "listen to `navigateTo` events", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "An object describing where in the app the user intends to navigate to", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Intents/NavigationIntent" + } + ] + } + }, + "examples": [ + { + "name": "Listening for `navigateTo` events", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "event", + "value": { + "action": "search", + "data": { + "query": "a cool show" + }, + "context": { + "campaign": "unknown", + "source": "voice" + } + } + } + } + ] + }, + { + "name": "Discovery.signIn", + "tags": [ + { + "name": "calls-metrics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:sign-in-status" + ] + } + ], + "summary": "Inform the platform that your user is signed in, for increased visibility in search & discovery. Sign-in state is used separately from what content can be access through entitlements and availabilities. Sign-in state may be used when deciding whether to choose this app to handle a user intent. For instance, if the user tries to launch something generic like playing music from an artist, only a signed-in app will be chosen. If the user wants to tune to a channel, only a signed-in app will be chosen to handle that intent. While signIn can optionally include entitlements as those typically change at signIn time, it is recommended to make a separate call to Discovery.contentAccess for entitlements. signIn is not only for when a user explicitly enters login credentials. If an app does not require any credentials from the user to consume content, such as in a free app, then the app should call signIn immediately on launch.", + "params": [ + { + "name": "entitlements", + "summary": "Optional array of Entitlements, in case of a different user account, or a long time since last sign-in.", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/Entitlement" + } + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send signIn metric", + "params": [], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send signIn notification with entitlements", + "params": [ + { + "name": "entitlements", + "value": [ + { + "entitlementId": "123", + "startTime": "2025-01-01T00:00:00.000Z", + "endTime": "2025-01-01T00:00:00.000Z" + } + ] + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.signOut", + "tags": [ + { + "name": "calls-metrics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:sign-in-status" + ] + } + ], + "summary": "Inform the platform that your user has signed out. See `Discovery.signIn` for more details on how the sign-in state is used.signOut will NOT clear entitlements, the app should make a separate call to Discovery.clearContentAccess. Apps should also call signOut when a login token has expired and the user is now in a signed-out state.", + "params": [], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send signOut notification", + "params": [], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.onSignIn", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:discovery:sign-in-status" + ] + } + ], + "summary": "Listen to events from all apps that call Discovery.signIn", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "event", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "object", + "properties": { + "appId": { + "type": "string" + } + }, + "required": [ + "appId" + ] + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Event", + "value": { + "appId": "firecert" + } + } + } + ] + }, + { + "name": "Discovery.onSignOut", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:discovery:sign-in-status" + ] + } + ], + "summary": "Listen to events from all apps that call Discovery.signOut", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "event", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "object", + "properties": { + "appId": { + "type": "string" + } + }, + "required": [ + "appId" + ] + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Event", + "value": { + "appId": "firecert" + } + } + } + ] + }, + { + "name": "Discovery.userInterest", + "summary": "Send an entity that the user has expressed interest in to the platform.", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest" + } + ], + "params": [ + { + "name": "type", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/InterestType" + } + }, + { + "name": "reason", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/InterestReason" + } + }, + { + "name": "entity", + "required": true, + "schema": { + "$ref": "#/x-schemas/Entity/EntityDetails" + } + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "type", + "value": "interest" + }, + { + "name": "reason", + "value": "playlist" + }, + { + "name": "entity", + "value": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": {} + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Discovery.onRequestUserInterest", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response-name": "entity", + "x-response": { + "$ref": "#/x-schemas/Entity/EntityDetails", + "examples": [ + { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + ] + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest" + } + ], + "summary": "Provide information about the entity currently displayed or selected on the screen.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "request", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "object", + "required": [ + "correlationId", + "parameters" + ], + "properties": { + "correlationId": { + "type": "string" + }, + "parameters": { + "$ref": "#/components/schemas/UserInterestProviderParameters" + } + }, + "additionalProperties": false + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "request", + "value": { + "correlationId": "xyz", + "parameters": { + "type": "interest", + "reason": "playlist" + } + } + } + } + ] + }, + { + "name": "Discovery.onPolicyChanged", + "summary": "get the discovery policy", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Discovery.policy" + }, + { + "name": "event", + "x-alternative": "policy" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:policy" + ] + } + ], + "result": { + "name": "policy", + "summary": "discovery policy opt-in/outs", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/DiscoveryPolicy" + } + ] + } + }, + "examples": [ + { + "name": "Getting the discovery policy", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "enableRecommendations": true, + "shareWatchHistory": true, + "rememberWatchedPrograms": true + } + } + } + ] + }, + { + "name": "Discovery.onPullEntityInfo", + "tags": [ + { + "name": "polymorphic-pull-event" + }, + { + "name": "event", + "x-pulls-for": "entityInfo" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:entity-info" + }, + { + "name": "deprecated" + } + ], + "summary": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow.", + "description": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow. Includes information about the program entity and its relevant associated entities, such as extras, previews, and, in the case of TV series, seasons and episodes.\n\nSee the `EntityInfo` and `WayToWatch` data structures below for more information.\n\nThe app only needs to implement Pull support for `entityInfo` at this time.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "request", + "summary": "A EntityInfoFederatedRequest object.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/EntityInfoFederatedRequest" + } + ] + } + }, + "examples": [ + { + "name": "Send entity info for a movie to the platform.", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": { + "correlationId": "xyz", + "parameters": { + "entityId": "345" + } + } + } + }, + { + "name": "Send entity info for a movie with a trailer to the platform.", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": { + "correlationId": "xyz", + "parameters": { + "entityId": "345" + } + } + } + }, + { + "name": "Send entity info for a TV Series with seasons and episodes to the platform.", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": { + "correlationId": "xyz", + "parameters": { + "entityId": "345" + } + } + } + } + ] + }, + { + "name": "Discovery.onPullPurchasedContent", + "tags": [ + { + "name": "polymorphic-pull-event" + }, + { + "name": "event", + "x-pulls-for": "purchasedContent" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:purchased-content" + }, + { + "name": "deprecated" + } + ], + "summary": "Provide a list of purchased content for the authenticated account, such as rentals and electronic sell through purchases.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "request", + "summary": "A PurchasedContentFederatedRequest object.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/PurchasedContentFederatedRequest" + } + ] + } + }, + "examples": [ + { + "name": "Inform the platform of the user's purchased content", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": { + "correlationId": "xyz", + "parameters": { + "limit": 100 + } + } + } + } + ], + "description": "Return content purchased by the user, such as rentals and electronic sell through purchases.\n\nThe app should return the user's 100 most recent purchases in `entries`. The total count of purchases must be provided in `count`. If `count` is greater than the total number of `entries`, the UI may provide a link into the app to see the complete purchase list.\n\nThe `EntityInfo` object returned is not required to have `waysToWatch` populated, but it is recommended that it do so in case the UI wants to surface additional information on the purchases screen.\n\nThe app should implement both Push and Pull methods for `purchasedContent`.\n\nThe app should actively push `purchasedContent` when:\n\n* The app becomes Active.\n* When the state of the purchasedContent set has changed.\n* The app goes into Inactive or Background state, if there is a chance a change event has been missed." + }, + { + "name": "Discovery.userInterestResponse", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest", + "x-response-for": "Discovery.onRequestUserInterest" + } + ], + "summary": "Internal API for .onRequestUserInterest Provider to send back response.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "$ref": "#/x-schemas/Entity/EntityDetails", + "examples": [ + { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + ] + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Discovery.userInterestError", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest", + "x-error-for": "Discovery.onRequestUserInterest" + } + ], + "summary": "Internal API for .onRequestUserInterest Provider to send back error.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "HDMIInput.ports", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Retrieve a list of HDMI input ports.", + "params": [], + "result": { + "name": "ports", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/HDMIInputPort" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "ports", + "value": [ + { + "port": "HDMI1", + "connected": true, + "signal": "stable", + "arcCapable": true, + "arcConnected": true, + "edidVersion": "2.0", + "autoLowLatencyModeCapable": true, + "autoLowLatencyModeSignalled": true + } + ] + } + } + ] + }, + { + "name": "HDMIInput.port", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Retrieve a specific HDMI input port.", + "params": [ + { + "name": "portId", + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "required": true + } + ], + "result": { + "name": "port", + "schema": { + "$ref": "#/components/schemas/HDMIInputPort" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "portId", + "value": "HDMI1" + } + ], + "result": { + "name": "ports", + "value": { + "port": "HDMI1", + "connected": true, + "signal": "stable", + "arcCapable": true, + "arcConnected": true, + "edidVersion": "2.0", + "autoLowLatencyModeCapable": true, + "autoLowLatencyModeSignalled": true + } + } + } + ] + }, + { + "name": "HDMIInput.open", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Opens the HDMI Port allowing it to be the active source device. Incase there is a different HDMI portId already set as the active source, this call would stop the older portId before opening the given portId.", + "params": [ + { + "name": "portId", + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "required": true + } + ], + "result": { + "name": "port", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example for open", + "params": [ + { + "name": "portId", + "value": "HDMI1" + } + ], + "result": { + "name": "port", + "value": null + } + } + ] + }, + { + "name": "HDMIInput.close", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Closes the given HDMI Port if it is the current active source for HDMI Input. If there was no active source, then there would no action taken on the device.", + "params": [], + "result": { + "name": "port", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example for stop", + "params": [], + "result": { + "name": "port", + "value": null + } + } + ] + }, + { + "name": "HDMIInput.onConnectionChanged", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Notification for when any HDMI port has a connection physically engaged or disengaged.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "info", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/ConnectionChangedInfo" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "info", + "value": { + "port": "HDMI1", + "connected": true + } + } + } + ] + }, + { + "name": "HDMIInput.onSignalChanged", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Notification for when any HDMI port has it's signal status changed.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "info", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/SignalChangedInfo" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "info", + "value": { + "port": "HDMI1", + "signal": "stable" + } + } + } + ] + }, + { + "name": "HDMIInput.lowLatencyMode", + "summary": "Property for the low latency mode setting.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + }, + { + "name": "property" + } + ], + "params": [], + "result": { + "name": "enabled", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default Example #2", + "params": [], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "HDMIInput.onAutoLowLatencyModeSignalChanged", + "summary": "Notification for changes to ALLM status of any input device.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + }, + { + "name": "event" + } + ], + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "info", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/AutoLowLatencyModeSignalChangedInfo" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "info", + "value": { + "port": "HDMI1", + "autoLowLatencyModeSignalled": true + } + } + } + ] + }, + { + "name": "HDMIInput.autoLowLatencyModeCapable", + "summary": "Property for each port auto low latency mode setting.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + }, + { + "name": "property", + "x-subscriber-type": "global" + } + ], + "params": [ + { + "name": "port", + "required": true, + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + } + } + ], + "result": { + "name": "enabled", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "port", + "value": "HDMI1" + } + ], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "port", + "value": "HDMI1" + } + ], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "HDMIInput.edidVersion", + "summary": "Property for each port's active EDID version.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + }, + { + "name": "property" + } + ], + "params": [ + { + "name": "port", + "required": true, + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + } + } + ], + "result": { + "name": "edidVersion", + "schema": { + "$ref": "#/components/schemas/EDIDVersion" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "port", + "value": "HDMI1" + } + ], + "result": { + "name": "edidVersion", + "value": "2.0" + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "port", + "value": "HDMI1" + } + ], + "result": { + "name": "edidVersion", + "value": "1.4" + } + } + ] + }, + { + "name": "HDMIInput.onLowLatencyModeChanged", + "summary": "Property for the low latency mode setting.", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "HDMIInput.lowLatencyMode" + }, + { + "name": "event", + "x-alternative": "lowLatencyMode" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "enabled", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "HDMIInput.onAutoLowLatencyModeCapableChanged", + "summary": "Property for each port auto low latency mode setting.", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "HDMIInput.autoLowLatencyModeCapable" + }, + { + "name": "event", + "x-alternative": "autoLowLatencyModeCapable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "data", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/AutoLowLatencyModeCapableChangedInfo" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "data", + "value": { + "port": "HDMI1", + "enabled": true + } + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "data", + "value": { + "port": "HDMI1", + "enabled": false + } + } + } + ] + }, + { + "name": "HDMIInput.onEdidVersionChanged", + "summary": "Property for each port's active EDID version.", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "HDMIInput.edidVersion" + }, + { + "name": "event", + "x-alternative": "edidVersion" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "port", + "required": true, + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + } + }, + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "edidVersion", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/EDIDVersion" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "edidVersion", + "value": "2.0" + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "edidVersion", + "value": "1.4" + } + } + ] + }, + { + "name": "HDMIInput.setLowLatencyMode", + "summary": "Property for the low latency mode setting.", + "tags": [ + { + "name": "setter", + "x-setter-for": "lowLatencyMode" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "enabled", + "value": null + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "enabled", + "value": null + } + } + ] + }, + { + "name": "HDMIInput.setAutoLowLatencyModeCapable", + "summary": "Property for each port auto low latency mode setting.", + "tags": [ + { + "name": "setter", + "x-setter-for": "autoLowLatencyModeCapable" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "port", + "required": true, + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + } + }, + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "value", + "value": true + } + ], + "result": { + "name": "enabled", + "value": null + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "value", + "value": false + } + ], + "result": { + "name": "enabled", + "value": null + } + } + ] + }, + { + "name": "HDMIInput.setEdidVersion", + "summary": "Property for each port's active EDID version.", + "tags": [ + { + "name": "setter", + "x-setter-for": "edidVersion" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "port", + "required": true, + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + } + }, + { + "name": "value", + "schema": { + "$ref": "#/components/schemas/EDIDVersion" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "value", + "value": "2.0" + } + ], + "result": { + "name": "edidVersion", + "value": null + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "value", + "value": "1.4" + } + ], + "result": { + "name": "edidVersion", + "value": null + } + } + ] + }, + { + "name": "Keyboard.email", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Keyboard.onRequestEmail", + "x-uses": [ + "xrn:firebolt:capability:input:keyboard" + ], + "x-allow-focus": true + } + ], + "summary": "Prompt the user for their email address with a simplified list of choices.", + "params": [ + { + "name": "type", + "summary": "Why the email is being requested, e.g. sign on or sign up", + "required": true, + "schema": { + "$ref": "#/components/schemas/EmailUsage" + } + }, + { + "name": "message", + "summary": "The message to display while prompting", + "required": false, + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "email", + "summary": "the selected or entered email", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Prompt the user to select or type an email address", + "params": [ + { + "name": "type", + "value": "signIn" + }, + { + "name": "message", + "value": "Enter your email to sign into this app" + } + ], + "result": { + "name": "Default Result", + "value": "user@domain.com" + } + }, + { + "name": "Prompt the user to type an email address to sign up", + "params": [ + { + "name": "type", + "value": "signUp" + }, + { + "name": "message", + "value": "Enter your email to sign up for this app" + } + ], + "result": { + "name": "Default Result", + "value": "user@domain.com" + } + } + ] + }, + { + "name": "Keyboard.password", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Keyboard.onRequestPassword", + "x-uses": [ + "xrn:firebolt:capability:input:keyboard" + ], + "x-allow-focus": true + } + ], + "summary": "Show the password entry keyboard, with typing obfuscated from visibility", + "params": [ + { + "name": "message", + "summary": "The message to display while prompting", + "required": false, + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "value", + "summary": "the selected or entered password", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Prompt the user to enter their password", + "params": [ + { + "name": "message", + "value": "Enter your password" + } + ], + "result": { + "name": "Default Result", + "value": "abc123" + } + } + ] + }, + { + "name": "Keyboard.standard", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Keyboard.onRequestStandard", + "x-uses": [ + "xrn:firebolt:capability:input:keyboard" + ], + "x-allow-focus": true + } + ], + "summary": "Show the standard platform keyboard, and return the submitted value", + "params": [ + { + "name": "message", + "summary": "The message to display while prompting", + "required": true, + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "value", + "summary": "the selected or entered text", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Prompt the user for an arbitrary string", + "params": [ + { + "name": "message", + "value": "Enter the name you'd like to associate with this device" + } + ], + "result": { + "name": "Default Result", + "value": "Living Room" + } + } + ] + }, + { + "name": "Keyboard.onRequestStandard", + "summary": "Registers as a provider for when the user should be shown a standard keyboard.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response": { + "type": "string", + "examples": [ + "username" + ] + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true + } + ], + "result": { + "name": "sessionRequest", + "summary": "The request to start a keyboard session", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/KeyboardProviderRequest" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "correlationId": "abc", + "parameters": { + "message": "Enter your user name." + } + } + } + } + ] + }, + { + "name": "Keyboard.onRequestPassword", + "summary": "Registers as a provider for when the user should be shown a password keyboard, with dots for each character entered.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response": { + "type": "string", + "examples": [ + "password" + ] + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true + } + ], + "result": { + "name": "sessionRequest", + "summary": "The request to start a keyboard session", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/KeyboardProviderRequest" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "correlationId": "abc", + "parameters": { + "message": "Enter your user name." + } + } + } + } + ] + }, + { + "name": "Keyboard.onRequestEmail", + "summary": "Registers as a provider for when the user should be shown a keyboard optimized for email address entry.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response": { + "type": "string", + "examples": [ + "email@address.com" + ] + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true + } + ], + "result": { + "name": "sessionRequest", + "summary": "The request to start a keyboard session", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/KeyboardProviderRequest" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "correlationId": "abc", + "parameters": { + "message": "Enter your user name." + } + } + } + } + ] + }, + { + "name": "Keyboard.standardFocus", + "summary": "Internal API for Standard Provider to request focus for UX purposes.", + "params": [], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-allow-focus-for": "onRequestStandard" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.passwordFocus", + "summary": "Internal API for Password Provider to request focus for UX purposes.", + "params": [], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-allow-focus-for": "onRequestPassword" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.emailFocus", + "summary": "Internal API for Email Provider to request focus for UX purposes.", + "params": [], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-allow-focus-for": "onRequestEmail" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.standardResponse", + "summary": "Internal API for Standard Provider to send back response.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "type": "string", + "examples": [ + "username" + ] + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-response-for": "onRequestStandard" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": "username" + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.standardError", + "summary": "Internal API for Standard Provider to send back error.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-error-for": "onRequestStandard" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.passwordResponse", + "summary": "Internal API for Password Provider to send back response.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "type": "string", + "examples": [ + "password" + ] + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-response-for": "onRequestPassword" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": "password" + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.passwordError", + "summary": "Internal API for Password Provider to send back error.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-error-for": "onRequestPassword" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.emailResponse", + "summary": "Internal API for Email Provider to send back response.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "type": "string", + "examples": [ + "email@address.com" + ] + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-response-for": "onRequestEmail" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": "email@address.com" + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.emailError", + "summary": "Internal API for Email Provider to send back error.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-error-for": "onRequestEmail" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Lifecycle.ready", + "tags": [ + { + "name": "calls-metrics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:ready" + ] + }, + { + "name": "exclude-from-sdk" + } + ], + "summary": "Notify the platform that the app is ready", + "params": [], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Let the platform know that your app is ready", + "params": [], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Lifecycle.close", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Request that the platform move your app out of focus", + "params": [ + { + "name": "reason", + "summary": "The reason the app is requesting to be closed", + "required": true, + "schema": { + "$ref": "#/x-schemas/Lifecycle/CloseReason" + } + } + ], + "result": { + "name": "success", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Close the app when the user presses back on the app home screen", + "params": [ + { + "name": "reason", + "value": "remoteButton" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Close the app when the user selects an exit menu item", + "params": [ + { + "name": "reason", + "value": "userExit" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Lifecycle.finished", + "tags": [ + { + "name": "exclude-from-sdk" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Notify the platform that the app is done unloading", + "params": [], + "result": { + "name": "results", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Lifecycle.state", + "summary": "Get the current state of the app. This function is **synchronous**.", + "tags": [ + { + "name": "synchronous" + }, + { + "name": "exclude-from-sdk" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "params": [], + "result": { + "name": "state", + "summary": "the current state of the app.", + "schema": { + "$ref": "#/x-schemas/Lifecycle/LifecycleState" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "foreground" + } + } + ] + }, + { + "name": "Lifecycle.onInactive", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the inactive event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/LifecycleEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "inactive", + "previous": "initializing" + } + } + } + ] + }, + { + "name": "Lifecycle.onForeground", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the foreground event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/LifecycleEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "foreground", + "previous": "inactive" + } + } + }, + { + "name": "Move to foreground via remote branded buton", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "value", + "value": { + "state": "foreground", + "previous": "inactive", + "source": "remote" + } + } + } + ] + }, + { + "name": "Lifecycle.onBackground", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the background event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/LifecycleEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "background", + "previous": "foreground" + } + } + } + ] + }, + { + "name": "Lifecycle.onSuspended", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the suspended event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/LifecycleEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "suspended", + "previous": "inactive" + } + } + } + ] + }, + { + "name": "Lifecycle.onUnloading", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the unloading event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/LifecycleEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "unloading", + "previous": "inactive" + } + } + } + ] + }, + { + "name": "Localization.locality", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:locality" + ] + }, + { + "name": "property" + } + ], + "summary": "Get the locality/city the device is located in", + "params": [], + "result": { + "name": "locality", + "summary": "the device city", + "schema": { + "$ref": "#/x-schemas/Localization/Locality" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "Philadelphia" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "Rockville" + } + } + ] + }, + { + "name": "Localization.postalCode", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:postal-code" + ] + } + ], + "summary": "Get the postal code the device is located in", + "params": [], + "result": { + "name": "postalCode", + "summary": "the device postal code", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "19103" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "20850" + } + } + ] + }, + { + "name": "Localization.countryCode", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:country-code" + ] + } + ], + "summary": "Get the ISO 3166-1 alpha-2 code for the country device is located in", + "params": [], + "result": { + "name": "code", + "summary": "the device country code", + "schema": { + "$ref": "#/x-schemas/Localization/CountryCode" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "US" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "UK" + } + } + ] + }, + { + "name": "Localization.language", + "summary": "Get the ISO 639 1/2 code for the preferred language", + "params": [], + "tags": [ + { + "name": "deprecated", + "x-since": "0.17.0", + "x-alternative": "Localization.locale" + }, + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "lang", + "summary": "the device language", + "schema": { + "$ref": "#/x-schemas/Localization/Language" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "en" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "es" + } + } + ] + }, + { + "name": "Localization.preferredAudioLanguages", + "summary": "A prioritized list of ISO 639 1/2 codes for the preferred audio languages on this device.", + "params": [], + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "languages", + "summary": "the preferred audio languages", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": [ + "spa", + "eng" + ] + } + }, + { + "name": "Default Example #2", + "params": [], + "result": { + "name": "Default Result", + "value": [ + "eng", + "spa" + ] + } + } + ] + }, + { + "name": "Localization.locale", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:locale" + ] + } + ], + "summary": "Get the *full* BCP 47 code, including script, region, variant, etc., for the preferred langauage/locale", + "params": [], + "result": { + "name": "locale", + "summary": "the device locale", + "schema": { + "$ref": "#/x-schemas/Localization/Locale" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "en-US" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "es-US" + } + } + ] + }, + { + "name": "Localization.latlon", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:location" + ] + } + ], + "summary": "Get the approximate latitude and longitude coordinates of the device location", + "params": [], + "result": { + "name": "latlong", + "summary": "lat/long tuple", + "schema": { + "$ref": "#/components/schemas/LatLon" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": [ + 39.9549, + 75.1699 + ] + } + } + ] + }, + { + "name": "Localization.additionalInfo", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:additional-info" + ] + } + ], + "summary": "Get any platform-specific localization information", + "params": [], + "result": { + "name": "info", + "summary": "the additional info", + "schema": { + "type": "object", + "additionalProperties": { + "type": [ + "number", + "string", + "boolean" + ], + "maxLength": 1024 + }, + "maxProperties": 32 + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "info", + "value": {} + } + } + ] + }, + { + "name": "Localization.addAdditionalInfo", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:additional-info" + ] + } + ], + "summary": "Add any platform-specific localization information in key/value pair", + "params": [ + { + "name": "key", + "summary": "Key to add additionalInfo", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "value", + "summary": "Value to be set for additionalInfo. Value can be a number, string or boolean", + "schema": { + "type": [ + "number", + "string", + "boolean" + ] + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Add an additionalInfo for localization", + "params": [ + { + "name": "key", + "value": "defaultKey" + }, + { + "name": "value", + "value": "defaultValue=" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "Localization.removeAdditionalInfo", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:additional-info" + ] + } + ], + "summary": "Remove any platform-specific localization information from map", + "params": [ + { + "name": "key", + "summary": "Key to remove additionalInfo", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Remove an additionalInfo for localization", + "params": [ + { + "name": "key", + "value": "defaultKey" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "Localization.timeZone", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:time-zone" + ] + } + ], + "summary": "Set the IANA timezone for the device", + "params": [], + "result": { + "name": "result", + "schema": { + "$ref": "#/x-schemas/Localization/TimeZone" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "America/New_York" + } + }, + { + "name": "Additional Example", + "params": [], + "result": { + "name": "Default Result", + "value": "America/Los_Angeles" + } + } + ] + }, + { + "name": "Localization.onLocalityChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.locality" + }, + { + "name": "event", + "x-alternative": "locality" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:locality" + ] + } + ], + "summary": "Get the locality/city the device is located in", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "locality", + "summary": "the device city", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/Locality" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Philadelphia" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Rockville" + } + } + ] + }, + { + "name": "Localization.onPostalCodeChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.postalCode" + }, + { + "name": "event", + "x-alternative": "postalCode" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:postal-code" + ] + } + ], + "summary": "Get the postal code the device is located in", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "postalCode", + "summary": "the device postal code", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "string" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "19103" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "20850" + } + } + ] + }, + { + "name": "Localization.onCountryCodeChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.countryCode" + }, + { + "name": "event", + "x-alternative": "countryCode" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:country-code" + ] + } + ], + "summary": "Get the ISO 3166-1 alpha-2 code for the country device is located in", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "code", + "summary": "the device country code", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/CountryCode" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "US" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "UK" + } + } + ] + }, + { + "name": "Localization.onLanguageChanged", + "summary": "Get the ISO 639 1/2 code for the preferred language", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.language" + }, + { + "name": "event", + "x-alternative": "language" + }, + { + "name": "deprecated", + "x-since": "0.17.0", + "x-alternative": "Localization.locale" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "lang", + "summary": "the device language", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/Language" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "en" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "es" + } + } + ] + }, + { + "name": "Localization.onPreferredAudioLanguagesChanged", + "summary": "A prioritized list of ISO 639 1/2 codes for the preferred audio languages on this device.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.preferredAudioLanguages" + }, + { + "name": "event", + "x-alternative": "preferredAudioLanguages" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "languages", + "summary": "the preferred audio languages", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + "spa", + "eng" + ] + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + "eng", + "spa" + ] + } + } + ] + }, + { + "name": "Localization.onLocaleChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.locale" + }, + { + "name": "event", + "x-alternative": "locale" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:locale" + ] + } + ], + "summary": "Get the *full* BCP 47 code, including script, region, variant, etc., for the preferred langauage/locale", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "locale", + "summary": "the device locale", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/Locale" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "en-US" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "es-US" + } + } + ] + }, + { + "name": "Localization.onTimeZoneChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.timeZone" + }, + { + "name": "event", + "x-alternative": "timeZone" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:time-zone" + ] + } + ], + "summary": "Set the IANA timezone for the device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "result", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/TimeZone" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "America/New_York" + } + }, + { + "name": "Additional Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "America/Los_Angeles" + } + } + ] + }, + { + "name": "Localization.setLocality", + "tags": [ + { + "name": "setter", + "x-setter-for": "locality" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:locality" + ] + } + ], + "summary": "Get the locality/city the device is located in", + "params": [ + { + "name": "value", + "summary": "the device city", + "schema": { + "$ref": "#/x-schemas/Localization/Locality" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "Philadelphia" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "Rockville" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setPostalCode", + "tags": [ + { + "name": "setter", + "x-setter-for": "postalCode" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:postal-code" + ] + } + ], + "summary": "Get the postal code the device is located in", + "params": [ + { + "name": "value", + "summary": "the device postal code", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "19103" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "20850" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setCountryCode", + "tags": [ + { + "name": "setter", + "x-setter-for": "countryCode" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:country-code" + ] + } + ], + "summary": "Get the ISO 3166-1 alpha-2 code for the country device is located in", + "params": [ + { + "name": "value", + "summary": "the device country code", + "schema": { + "$ref": "#/x-schemas/Localization/CountryCode" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "US" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "UK" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setLanguage", + "summary": "Get the ISO 639 1/2 code for the preferred language", + "params": [ + { + "name": "value", + "summary": "the device language", + "schema": { + "$ref": "#/x-schemas/Localization/Language" + }, + "required": true + } + ], + "tags": [ + { + "name": "setter", + "x-setter-for": "language" + }, + { + "name": "deprecated", + "x-since": "0.17.0", + "x-alternative": "Localization.locale" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "en" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "es" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setPreferredAudioLanguages", + "summary": "A prioritized list of ISO 639 1/2 codes for the preferred audio languages on this device.", + "params": [ + { + "name": "value", + "summary": "the preferred audio languages", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + }, + "required": true + } + ], + "tags": [ + { + "name": "setter", + "x-setter-for": "preferredAudioLanguages" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": [ + "spa", + "eng" + ] + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "value", + "value": [ + "eng", + "spa" + ] + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setLocale", + "tags": [ + { + "name": "setter", + "x-setter-for": "locale" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:locale" + ] + } + ], + "summary": "Get the *full* BCP 47 code, including script, region, variant, etc., for the preferred langauage/locale", + "params": [ + { + "name": "value", + "summary": "the device locale", + "schema": { + "$ref": "#/x-schemas/Localization/Locale" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "en-US" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "es-US" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setTimeZone", + "tags": [ + { + "name": "setter", + "x-setter-for": "timeZone" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:time-zone" + ] + } + ], + "summary": "Set the IANA timezone for the device", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Localization/TimeZone" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": "America/New_York" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Additional Example", + "params": [ + { + "name": "value", + "value": "America/Los_Angeles" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Metrics.ready", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform that your app is minimally usable. This method is called automatically by `Lifecycle.ready()`", + "params": [], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send ready metric", + "params": [], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.signIn", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Log a sign in event, called by Discovery.signIn().", + "params": [], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send signIn metric", + "params": [], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send signIn metric with entitlements", + "params": [ + { + "name": "entitlements", + "value": [ + { + "entitlementId": "123", + "startTime": "2025-01-01T00:00:00.000Z", + "endTime": "2025-01-01T00:00:00.000Z" + } + ] + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.signOut", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Log a sign out event, called by Discovery.signOut().", + "params": [], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send signOut metric", + "params": [], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.startContent", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform that your user has started content.", + "params": [ + { + "name": "entityId", + "summary": "Optional entity ID of the content.", + "schema": { + "type": "string" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send startContent metric", + "params": [], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send startContent metric w/ entity", + "params": [ + { + "name": "entityId", + "value": "abc" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.stopContent", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform that your user has stopped content.", + "params": [ + { + "name": "entityId", + "summary": "Optional entity ID of the content.", + "schema": { + "type": "string" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send stopContent metric", + "params": [], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send stopContent metric w/ entity", + "params": [ + { + "name": "entityId", + "value": "abc" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.page", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform that your user has navigated to a page or view.", + "params": [ + { + "name": "pageId", + "summary": "Page ID of the content.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send page metric", + "params": [ + { + "name": "pageId", + "value": "xyz" + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send startContent metric w/ entity", + "params": [ + { + "name": "pageId", + "value": "home" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.action", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform of something not covered by other Metrics APIs.", + "params": [ + { + "name": "category", + "summary": "The category of action being logged. Must be 'user' for user-initated actions or 'app' for all other actions", + "schema": { + "type": "string", + "enum": [ + "user", + "app" + ] + }, + "required": true + }, + { + "name": "type", + "summary": "A short, indexible identifier for the action, e.g. 'SignIn Prompt Displayed'", + "schema": { + "type": "string", + "maxLength": 256 + }, + "required": true + }, + { + "name": "parameters", + "schema": { + "$ref": "#/x-schemas/Types/FlatMap" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send foo action", + "params": [ + { + "name": "category", + "value": "user" + }, + { + "name": "type", + "value": "The user did foo" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.error", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform of an error that has occured in your app.", + "params": [ + { + "name": "type", + "summary": "The type of error", + "schema": { + "$ref": "#/components/schemas/ErrorType" + }, + "required": true + }, + { + "name": "code", + "summary": "an app-specific error code", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "description", + "summary": "A short description of the error", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "visible", + "summary": "Whether or not this error was visible to the user.", + "schema": { + "type": "boolean" + }, + "required": true + }, + { + "name": "parameters", + "summary": "Optional additional parameters to be logged with the error", + "schema": { + "$ref": "#/x-schemas/Types/FlatMap" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send error metric", + "params": [ + { + "name": "type", + "value": "media" + }, + { + "name": "code", + "value": "MEDIA-STALLED" + }, + { + "name": "description", + "value": "playback stalled" + }, + { + "name": "visible", + "value": true + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaLoadStart", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when setting the URL of a media asset to play, in order to infer load time.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send loadstart metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaPlay", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when media playback should start due to autoplay, user-initiated play, or unpausing.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send play metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaPlaying", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when media playback actually starts due to autoplay, user-initiated play, unpausing, or recovering from a buffering interuption.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send playing metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaPause", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when media playback will pause due to an intentional pause operation.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send pause metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaWaiting", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when media playback will halt due to a network, buffer, or other unintentional constraint.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send waiting metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaProgress", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called every 60 seconds as media playback progresses.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "progress", + "summary": "Progress of playback, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration.", + "schema": { + "$ref": "#/components/schemas/MediaPosition" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send progress metric.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "progress", + "value": 0.75 + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaSeeking", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when a seek is initiated during media playback.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "target", + "summary": "Target destination of the seek, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration.", + "schema": { + "$ref": "#/components/schemas/MediaPosition" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send seeking metric.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "target", + "value": 0.5 + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaSeeked", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when a seek is completed during media playback.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "position", + "summary": "Resulting position of the seek operation, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration.", + "schema": { + "$ref": "#/components/schemas/MediaPosition" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send seeked metric.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "position", + "value": 0.51 + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaRateChange", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when the playback rate of media is changed.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "rate", + "summary": "The new playback rate.", + "schema": { + "type": "number" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send ratechange metric.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "rate", + "value": 2 + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaRenditionChange", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when the playback rendition (e.g. bitrate, dimensions, profile, etc) is changed.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "bitrate", + "summary": "The new bitrate in kbps.", + "schema": { + "type": "number" + }, + "required": true + }, + { + "name": "width", + "summary": "The new resolution width.", + "schema": { + "type": "number" + }, + "required": true + }, + { + "name": "height", + "summary": "The new resolution height.", + "schema": { + "type": "number" + }, + "required": true + }, + { + "name": "profile", + "summary": "A description of the new profile, e.g. 'HDR' etc.", + "schema": { + "type": "string" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send renditionchange metric.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "bitrate", + "value": 5000 + }, + { + "name": "width", + "value": 1920 + }, + { + "name": "height", + "value": 1080 + }, + { + "name": "profile", + "value": "HDR+" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaEnded", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when playback has stopped because the end of the media was reached.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send ended metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.event", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:distributor" + ] + } + ], + "summary": "Inform the platform of 1st party distributor metrics.", + "params": [ + { + "name": "schema", + "summary": "The schema URI of the metric type", + "schema": { + "type": "string", + "format": "uri" + }, + "required": true + }, + { + "name": "data", + "summary": "A JSON payload conforming the the provided schema", + "schema": { + "$ref": "#/components/schemas/EventObject" + }, + "required": true + } + ], + "result": { + "name": "results", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Send foo event", + "params": [ + { + "name": "schema", + "value": "http://meta.rdkcentral.com/some/schema" + }, + { + "name": "data", + "value": { + "foo": "foo" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Metrics.appInfo", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform about an app's build info.", + "params": [ + { + "name": "build", + "summary": "The build / version of this app.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Send appInfo metric", + "params": [ + { + "name": "build", + "value": "1.2.2" + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Parameters.initialization", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Returns any initialization parameters for the app, e.g. initialial `NavigationIntent`.", + "params": [], + "result": { + "name": "init", + "summary": "The initialization parameters.", + "schema": { + "$ref": "#/components/schemas/AppInitialization" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "init", + "value": { + "lmt": 0, + "us_privacy": "1-Y-", + "discovery": { + "navigateTo": { + "action": "entity", + "data": { + "entityId": "abc", + "entityType": "program", + "programType": "movie" + }, + "context": { + "source": "voice" + } + } + } + } + } + } + ] + }, + { + "name": "PinChallenge.onRequestChallenge", + "summary": "Registers as a provider for when the user should be challenged in order to confirm access to a capability through a pin prompt", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response": { + "$ref": "#/components/schemas/PinChallengeResult", + "examples": [ + { + "granted": true, + "reason": "correctPin" + }, + { + "granted": false, + "reason": "exceededPinFailures" + }, + { + "granted": null, + "reason": "cancelled" + } + ] + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:pinchallenge", + "x-allow-focus": true + } + ], + "result": { + "name": "challenge", + "summary": "The request to challenge the user", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/PinChallengeProviderRequest" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "correlationId": "abc", + "parameters": { + "capability": "xrn:firebolt:capability:commerce::purchase", + "requestor": { + "id": "ReferenceApp", + "name": "Firebolt Reference App" + }, + "pinSpace": "purchase" + } + } + } + } + ] + }, + { + "name": "PinChallenge.challengeFocus", + "summary": "Internal API for Challenge Provider to request focus for UX purposes.", + "params": [], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:pinchallenge", + "x-allow-focus": true, + "x-allow-focus-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "PinChallenge.challengeResponse", + "summary": "Internal API for Challenge Provider to send back response.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "$ref": "#/components/schemas/PinChallengeResult", + "examples": [ + { + "granted": true, + "reason": "correctPin" + }, + { + "granted": false, + "reason": "exceededPinFailures" + }, + { + "granted": null, + "reason": "cancelled" + } + ] + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:pinchallenge", + "x-allow-focus": true, + "x-response-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example #1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": true, + "reason": "correctPin" + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Example #2", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": false, + "reason": "exceededPinFailures" + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Example #3", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": null, + "reason": "cancelled" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "PinChallenge.challengeError", + "summary": "Internal API for Challenge Provider to send back error.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:pinchallenge", + "x-allow-focus": true, + "x-error-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Privacy.allowResumePoints", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content to show in the main experience", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowUnentitledResumePoints", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content from unentitled providers to show in the main experience", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowWatchHistory", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their watch history from all sources to show in the main experience", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowProductAnalytics", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data can be used for analytics about the product", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowPersonalization", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowUnentitledPersonalization", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations for unentitled content", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowRemoteDiagnostics", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their personal data to be included in diagnostic telemetry. This also allows whether device logs can be remotely accessed from the client device", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowPrimaryContentAdTargeting", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in the primary experience", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowPrimaryBrowseAdTargeting", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while browsing in the primary experience", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowAppContentAdTargeting", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in apps", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowACRCollection", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their automatic content recognition data to be collected", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowCameraAnalytics", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows data from their camera to be used for Product Analytics", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.settings", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Gets the allowed value for all privacy settings", + "params": [], + "result": { + "name": "settings", + "schema": { + "$ref": "#/components/schemas/PrivacySettings" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "settings", + "value": { + "allowACRCollection": true, + "allowResumePoints": false, + "allowAppContentAdTargeting": false, + "allowCameraAnalytics": true, + "allowPersonalization": true, + "allowPrimaryBrowseAdTargeting": false, + "allowPrimaryContentAdTargeting": false, + "allowProductAnalytics": true, + "allowRemoteDiagnostics": true, + "allowUnentitledPersonalization": true, + "allowUnentitledResumePoints": false, + "allowWatchHistory": true + } + } + } + ] + }, + { + "name": "Privacy.onAllowResumePointsChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowResumePoints" + }, + { + "name": "event", + "x-alternative": "allowResumePoints" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content to show in the main experience", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowUnentitledResumePointsChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowUnentitledResumePoints" + }, + { + "name": "event", + "x-alternative": "allowUnentitledResumePoints" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content from unentitled providers to show in the main experience", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowWatchHistoryChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowWatchHistory" + }, + { + "name": "event", + "x-alternative": "allowWatchHistory" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their watch history from all sources to show in the main experience", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowProductAnalyticsChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowProductAnalytics" + }, + { + "name": "event", + "x-alternative": "allowProductAnalytics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data can be used for analytics about the product", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowPersonalizationChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowPersonalization" + }, + { + "name": "event", + "x-alternative": "allowPersonalization" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowUnentitledPersonalizationChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowUnentitledPersonalization" + }, + { + "name": "event", + "x-alternative": "allowUnentitledPersonalization" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations for unentitled content", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowRemoteDiagnosticsChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowRemoteDiagnostics" + }, + { + "name": "event", + "x-alternative": "allowRemoteDiagnostics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their personal data to be included in diagnostic telemetry. This also allows whether device logs can be remotely accessed from the client device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowPrimaryContentAdTargetingChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowPrimaryContentAdTargeting" + }, + { + "name": "event", + "x-alternative": "allowPrimaryContentAdTargeting" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in the primary experience", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowPrimaryBrowseAdTargetingChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowPrimaryBrowseAdTargeting" + }, + { + "name": "event", + "x-alternative": "allowPrimaryBrowseAdTargeting" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while browsing in the primary experience", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowAppContentAdTargetingChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowAppContentAdTargeting" + }, + { + "name": "event", + "x-alternative": "allowAppContentAdTargeting" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in apps", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowACRCollectionChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowACRCollection" + }, + { + "name": "event", + "x-alternative": "allowACRCollection" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their automatic content recognition data to be collected", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowCameraAnalyticsChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowCameraAnalytics" + }, + { + "name": "event", + "x-alternative": "allowCameraAnalytics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows data from their camera to be used for Product Analytics", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.setAllowResumePoints", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowResumePoints" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content to show in the main experience", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowUnentitledResumePoints", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowUnentitledResumePoints" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content from unentitled providers to show in the main experience", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowWatchHistory", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowWatchHistory" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their watch history from all sources to show in the main experience", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowProductAnalytics", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowProductAnalytics" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data can be used for analytics about the product", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowPersonalization", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowPersonalization" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowUnentitledPersonalization", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowUnentitledPersonalization" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations for unentitled content", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowRemoteDiagnostics", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowRemoteDiagnostics" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their personal data to be included in diagnostic telemetry. This also allows whether device logs can be remotely accessed from the client device", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowPrimaryContentAdTargeting", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowPrimaryContentAdTargeting" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in the primary experience", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowPrimaryBrowseAdTargeting", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowPrimaryBrowseAdTargeting" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while browsing in the primary experience", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowAppContentAdTargeting", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowAppContentAdTargeting" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in apps", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowACRCollection", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowACRCollection" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their automatic content recognition data to be collected", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowCameraAnalytics", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowCameraAnalytics" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows data from their camera to be used for Product Analytics", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Profile.approveContentRating", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:approve:content" + ] + } + ], + "summary": "Verifies that the current profile should have access to mature/adult content.", + "params": [], + "result": { + "name": "allow", + "summary": "Whether or not to allow access", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Profile.approvePurchase", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:approve:purchase" + ] + } + ], + "summary": "Verifies that the current profile should have access to making purchases.", + "params": [], + "result": { + "name": "allow", + "summary": "Whether or not to allow access", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Profile.flags", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:profile:flags" + ] + } + ], + "summary": "Get a map of profile flags for the current session.", + "params": [], + "result": { + "name": "flags", + "summary": "The profile flags.", + "schema": { + "$ref": "#/x-schemas/Types/FlatMap" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "flags", + "value": { + "userExperience": "1000" + } + } + } + ] + }, + { + "name": "SecondScreen.protocols", + "summary": "Get the supported second screen discovery protocols", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:secondscreen:protocol" + ] + } + ], + "params": [], + "result": { + "name": "protocols", + "summary": "the supported protocols", + "schema": { + "$ref": "#/x-schemas/Types/BooleanMap" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": { + "dial1.7": true + } + } + } + ] + }, + { + "name": "SecondScreen.device", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "summary": "Get the broadcasted id for the device", + "params": [ + { + "name": "type", + "summary": "The type of second screen protocol, e.g. \"dial\"", + "required": false, + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "deviceId", + "summary": "the device id", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "device-id" + } + } + ] + }, + { + "name": "SecondScreen.friendlyName", + "summary": "Get the broadcasted friendly name for the device", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "result": { + "name": "friendlyName", + "summary": "the device friendly-name", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "friendlyName", + "value": "Living Room" + } + } + ] + }, + { + "name": "SecondScreen.onLaunchRequest", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "summary": "Listen to the launchRequest event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "launchRequestEvent", + "summary": "Dispatched when a second screen device on the local network has requested this app to be launched", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/SecondScreen/SecondScreenEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "type": "dial", + "version": "1.7", + "data": "{\"code\":\"AQDPQZiQcb3KQ7gY7yy5tHTMbbkGHR9Zjp-KL53H3eKBZIeAt7O9UKYPu6B21l2UZVmIqkFXDXBmXvK4g2e3EgZtjMNmKPsTltgnRl95DImtOXjSpWtTjSaOkW4w1kZKUTwLKdwVWTzBVH8ERHorvLU6vCGOVHxXt65LNwdl5HKRweShVC1V9QsyvRnQS61ov0UclmrH_xZML2Bt-Q-rZFjey5MjwupIb4x4f53XUJMhjHpDHoIUKrjpdPDQvK2a\",\"friendlyName\":\"Operator_TX061AEI\",\"UDN\":\"608fef11-2800-482a-962b-23a6690c93c1\"}" + } + } + } + ] + }, + { + "name": "SecondScreen.onCloseRequest", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "summary": "Listen to the closeRequest event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "closeRequestEvent", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/SecondScreen/SecondScreenEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "type": "dial", + "version": "1.7" + } + } + } + ] + }, + { + "name": "SecondScreen.onFriendlyNameChanged", + "summary": "Get the broadcasted friendly name for the device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "SecondScreen.friendlyName" + }, + { + "name": "event", + "x-alternative": "friendlyName" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "result": { + "name": "friendlyName", + "summary": "the device friendly-name", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "string" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "friendlyName", + "value": "Living Room" + } + } + ] + }, + { + "name": "SecureStorage.get", + "summary": "Get stored value by key", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "scope", + "summary": "The scope of the key/value", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + }, + { + "name": "key", + "summary": "Key to get", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "value", + "summary": "The retrieved value, if found.", + "schema": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "examples": [ + { + "name": "Successfully retrieve a refresh token with key authRefreshToken", + "params": [ + { + "name": "scope", + "value": "device" + }, + { + "name": "key", + "value": "authRefreshToken" + } + ], + "result": { + "name": "value", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + } + }, + { + "name": "Attempt to retrieve a key with no value set", + "params": [ + { + "name": "scope", + "value": "account" + }, + { + "name": "key", + "value": "authRefreshToken" + } + ], + "result": { + "name": "value", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.set", + "summary": "Set or update a secure data value", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "scope", + "summary": "The scope of the data key", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + }, + { + "name": "key", + "summary": "Key to set", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "value", + "summary": "Value to set", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "options", + "summary": "Optional parameters to set", + "schema": { + "$ref": "#/components/schemas/StorageOptions" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Set a refresh token with name authRefreshToken with optional paramter", + "params": [ + { + "name": "scope", + "value": "device" + }, + { + "name": "key", + "value": "authRefreshToken" + }, + { + "name": "value", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + }, + { + "name": "options", + "value": { + "ttl": 600 + } + } + ], + "result": { + "name": "defaultResult", + "value": null + } + }, + { + "name": "Set a refresh token with name authRefreshToken without optional parameter", + "params": [ + { + "name": "scope", + "value": "account" + }, + { + "name": "key", + "value": "authRefreshToken" + }, + { + "name": "value", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.remove", + "summary": "Remove a secure data value", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "scope", + "summary": "The scope of the data key", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + }, + { + "name": "key", + "summary": "Key to remove", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "summary": "", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Remove the value with key authRefreshToken for device", + "params": [ + { + "name": "scope", + "value": "device" + }, + { + "name": "key", + "value": "authRefreshToken" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + }, + { + "name": "Remove the value with key authRefreshToken for account", + "params": [ + { + "name": "scope", + "value": "account" + }, + { + "name": "key", + "value": "authRefreshToken" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.setForApp", + "summary": "Set or update a secure data value for a specific app.", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "appId", + "summary": "appId for which value is being set", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "scope", + "summary": "The scope of the data key", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + }, + { + "name": "key", + "summary": "Key to set", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "value", + "summary": "Value to set", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "options", + "summary": "Optional parameters to set", + "schema": { + "$ref": "#/components/schemas/StorageOptions" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Set a refresh token with name authRefreshToken with optional parameter for appId foo", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "scope", + "value": "device" + }, + { + "name": "key", + "value": "authRefreshToken" + }, + { + "name": "value", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + }, + { + "name": "options", + "value": { + "ttl": 600 + } + } + ], + "result": { + "name": "defaultResult", + "value": null + } + }, + { + "name": "Set a refresh token with name authRefreshToken without optional parameter for appId foo", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "scope", + "value": "account" + }, + { + "name": "key", + "value": "authRefreshToken" + }, + { + "name": "value", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.removeForApp", + "summary": "Removes single data value for a specific app.", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "appId", + "summary": "appId for which values are removed", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "scope", + "summary": "The scope of the key/value", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + }, + { + "name": "key", + "summary": "Key to remove", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "summary": "", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Removes authRefreshToken for appId foo", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "scope", + "value": "account" + }, + { + "name": "key", + "value": "authRefreshToken" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.clearForApp", + "summary": "Clears all the secure data values for a specific app", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "appId", + "summary": "appId for which values are removed", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "scope", + "summary": "The scope of the key/value", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + } + ], + "result": { + "name": "success", + "summary": "", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Clears all the secure data values for appId foo", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "scope", + "value": "account" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.clear", + "summary": "Clears all the secure data values", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "scope", + "summary": "The scope of the key/value", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + } + ], + "result": { + "name": "success", + "summary": "", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Clears all the data values of storage", + "params": [ + { + "name": "scope", + "value": "account" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "UserGrants.app", + "summary": "Get all granted and denied user grants for the given app", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "appId", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "info", + "summary": "The list of grants for this app", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GrantInfo" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "appId", + "value": "certapp" + } + ], + "result": { + "name": "defaultResult", + "value": [ + { + "app": { + "id": "certapp", + "title": "Firebolt Certification" + }, + "state": "granted", + "capability": "xrn:firebolt:capability:data:app-usage", + "role": "use", + "lifespan": "seconds", + "expires": "2022-12-14T20:20:39+00:00" + }, + { + "app": { + "id": "certapp", + "title": "Firebolt Certification" + }, + "state": "denied", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "appActive" + } + ] + } + } + ] + }, + { + "name": "UserGrants.device", + "summary": "Get all granted and denied user grants for the device", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [], + "result": { + "name": "info", + "summary": "The list of grants for the device", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GrantInfo" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "defaultResult", + "value": [ + { + "state": "granted", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "powerActive" + } + ] + } + } + ] + }, + { + "name": "UserGrants.capability", + "summary": "Get all granted and denied user grants for the given capability", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "capability", + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "required": true + } + ], + "result": { + "name": "info", + "summary": "The list of grants associated with the given capability", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GrantInfo" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + } + ], + "result": { + "name": "defaultResult", + "value": [ + { + "state": "granted", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "powerActive" + } + ] + } + } + ] + }, + { + "name": "UserGrants.grant", + "summary": "Grants a given capability to a specific app, if appropriate. Calling this results in a persisted active grant that lasts for the duration of the grant policy lifespan. ", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "role", + "schema": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "required": true + }, + { + "name": "capability", + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "required": true + }, + { + "name": "options", + "schema": { + "$ref": "#/components/schemas/GrantModificationOptions" + } + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "options", + "value": { + "appId": "certapp" + } + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "UserGrants.deny", + "summary": "Denies a given capability, to a specific app if appropriate. Calling this results in a persisted Denied Grant that lasts for the duration of the Grant Policy lifespan. ", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "role", + "schema": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "required": true + }, + { + "name": "capability", + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "required": true + }, + { + "name": "options", + "schema": { + "$ref": "#/components/schemas/GrantModificationOptions" + } + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "options", + "value": { + "appId": "certapp" + } + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "UserGrants.clear", + "summary": "Clears the grant for a given capability, to a specific app if appropriate. Calling this results in a persisted Denied Grant that lasts for the duration of the Grant Policy lifespan. ", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "role", + "schema": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "required": true + }, + { + "name": "capability", + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "required": true + }, + { + "name": "options", + "schema": { + "$ref": "#/components/schemas/GrantModificationOptions" + } + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "options", + "value": { + "appId": "certapp" + } + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "UserGrants.request", + "summary": "Requests Firebolt to carry out a set of user grants for a given application such that the user grant provider is notified or an existing user grant is reused.", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "appId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "permissions", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/Permission" + }, + "minItems": 1 + }, + "required": true + }, + { + "name": "options", + "summary": "Request options", + "schema": { + "$ref": "#/components/schemas/RequestOptions" + }, + "required": false + } + ], + "result": { + "name": "info", + "summary": "The result of all grants requested by this", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GrantInfo" + } + } + }, + "examples": [ + { + "name": "Default result #1", + "params": [ + { + "name": "appId", + "value": "certapp" + }, + { + "name": "permissions", + "value": [ + { + "role": "use", + "capability": "xrn:firebolt:capability:localization:postal-code" + } + ] + } + ], + "result": { + "name": "defaultResult", + "value": [ + { + "app": { + "id": "certapp", + "title": "Certification App" + }, + "state": "granted", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "powerActive" + } + ] + } + }, + { + "name": "Default result #2", + "params": [ + { + "name": "appId", + "value": "certapp" + }, + { + "name": "permissions", + "value": [ + { + "role": "use", + "capability": "xrn:firebolt:capability:localization:postal-code" + } + ] + }, + { + "name": "options", + "value": { + "force": true + } + } + ], + "result": { + "name": "defaultResult", + "value": [ + { + "app": { + "id": "certapp", + "title": "Certification App" + }, + "state": "granted", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "powerActive" + } + ] + } + } + ] + }, + { + "name": "VoiceGuidance.enabled", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "Whether or not voice-guidance is enabled.", + "params": [], + "result": { + "name": "enabled", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "VoiceGuidance.speed", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "The speed at which voice guidance speech will be read back to the user.", + "params": [], + "result": { + "name": "speed", + "schema": { + "$ref": "#/x-schemas/Accessibility/VoiceSpeed" + } + }, + "examples": [ + { + "name": "Voice guidance speed to 1", + "params": [], + "result": { + "name": "speed", + "value": 1 + } + }, + { + "name": "Voice guidance speed to 2", + "params": [], + "result": { + "name": "speed", + "value": 2 + } + } + ] + }, + { + "name": "VoiceGuidance.onEnabledChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "VoiceGuidance.enabled" + }, + { + "name": "event", + "x-alternative": "enabled" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "Whether or not voice-guidance is enabled.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "enabled", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "VoiceGuidance.onSpeedChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "VoiceGuidance.speed" + }, + { + "name": "event", + "x-alternative": "speed" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "The speed at which voice guidance speech will be read back to the user.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "speed", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/VoiceSpeed" + } + ] + } + }, + "examples": [ + { + "name": "Voice guidance speed to 1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "speed", + "value": 1 + } + }, + { + "name": "Voice guidance speed to 2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "speed", + "value": 2 + } + } + ] + }, + { + "name": "VoiceGuidance.setEnabled", + "tags": [ + { + "name": "setter", + "x-setter-for": "enabled" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "Whether or not voice-guidance is enabled.", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "enabled", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "enabled", + "value": null + } + } + ] + }, + { + "name": "VoiceGuidance.setSpeed", + "tags": [ + { + "name": "setter", + "x-setter-for": "speed" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "The speed at which voice guidance speech will be read back to the user.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/VoiceSpeed" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Voice guidance speed to 1", + "params": [ + { + "name": "value", + "value": 1 + } + ], + "result": { + "name": "speed", + "value": null + } + }, + { + "name": "Voice guidance speed to 2", + "params": [ + { + "name": "value", + "value": 2 + } + ], + "result": { + "name": "speed", + "value": null + } + } + ] + }, + { + "name": "Wifi.scan", + "summary": "Scan available wifi networks in the location.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:wifi" + ] + } + ], + "params": [ + { + "name": "timeout", + "schema": { + "$ref": "#/x-schemas/Types/Timeout" + } + } + ], + "result": { + "name": "list", + "summary": "Contains a list of wifi networks available near the device.", + "schema": { + "$ref": "#/components/schemas/AccessPointList" + } + }, + "examples": [ + { + "name": "Successful Wifi List", + "params": [ + { + "name": "timeout", + "value": 30 + } + ], + "result": { + "name": "successfulWifiResultExample", + "value": { + "list": [ + { + "ssid": "DND", + "security": "wpa2Psk", + "signalStrength": -70, + "frequency": 2.4 + }, + { + "ssid": "Fortnite", + "security": "WPA2_ENTERPRISE_AES", + "signalStrength": -70, + "frequency": 5 + }, + { + "ssid": "Guardian", + "security": "none", + "signalStrength": -70, + "frequency": 2.4 + } + ] + } + } + } + ] + }, + { + "name": "Wifi.connect", + "summary": "Connect the device to the specified SSID.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:wifi" + ] + } + ], + "params": [ + { + "name": "ssid", + "schema": { + "type": "string" + }, + "description": "Name of Wifi SSID to connect for the device." + }, + { + "name": "passphrase", + "schema": { + "type": "string" + }, + "description": "Password or Passphrase for the wifi." + }, + { + "name": "security", + "schema": { + "$ref": "#/components/schemas/WifiSecurityMode" + } + } + ], + "result": { + "name": "connectedWifi", + "summary": "Successful Response after connecting to the Wifi.", + "schema": { + "$ref": "#/components/schemas/AccessPoint" + } + }, + "examples": [ + { + "name": "Connect to a wpa2Psk Wifi with password", + "params": [ + { + "name": "ssid", + "value": "DND" + }, + { + "name": "passphrase", + "value": "gargoyle" + }, + { + "name": "security", + "value": "wpa2Psk" + } + ], + "result": { + "name": "successfulWifiConnection", + "value": { + "ssid": "DND", + "security": "wpa2Psk", + "signalStrength": -70, + "frequency": 2.4 + } + } + }, + { + "name": "Connect to a WPA2 PSK Wifi with password", + "params": [ + { + "name": "ssid", + "value": "Guardian WIFI" + }, + { + "name": "passphrase", + "value": "" + }, + { + "name": "security", + "value": "none" + } + ], + "result": { + "name": "successfulWifiConnection", + "value": { + "ssid": "Guardian WIFI", + "security": "none", + "signalStrength": -70, + "frequency": 2.4 + } + } + } + ] + }, + { + "name": "Wifi.disconnect", + "summary": "Disconnect the device if connected via WIFI.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:wifi" + ] + } + ], + "params": [], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Disconnect", + "params": [], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "Wifi.wps", + "summary": "Connect to WPS", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:wifi" + ] + } + ], + "params": [ + { + "name": "security", + "schema": { + "$ref": "#/components/schemas/WPSSecurityPin" + } + } + ], + "result": { + "name": "connectedWifi", + "summary": "Successful Response after connecting to the Wifi.", + "schema": { + "$ref": "#/components/schemas/AccessPoint" + } + }, + "examples": [ + { + "name": "Connect to a WPS Wifi router", + "params": [ + { + "name": "security", + "value": "pushButton" + } + ], + "result": { + "name": "successfulWifiConnection", + "value": { + "ssid": "DND", + "security": "wpa2Psk", + "signalStrength": -70, + "frequency": 2.4 + } + } + } + ] + } + ], + "components": { + "schemas": { + "InitializeResult": { + "title": "InitializeResult", + "type": "object", + "required": [ + "version" + ], + "properties": { + "version": { + "$ref": "#/x-schemas/Types/SemanticVersion", + "description": "The semantic version of the FEE." + } + }, + "additionalProperties": false + }, + "AudioDescriptionSettings": { + "title": "AudioDescriptionSettings", + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether or not audio descriptions should be enabled by default" + } + } + }, + "Token": { + "type": "string", + "description": "Encoded token provided by the Distributor for Device Authentication." + }, + "Expiry": { + "type": "integer", + "description": "Number of secs before the token expires", + "minimum": 1 + }, + "ChallengeRequestor": { + "title": "ChallengeRequestor", + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "string", + "description": "The id of the app that requested the challenge" + }, + "name": { + "type": "string", + "description": "The name of the app that requested the challenge" + } + } + }, + "Challenge": { + "title": "Challenge", + "type": "object", + "required": [ + "capability", + "requestor" + ], + "properties": { + "capability": { + "type": "string", + "description": "The capability that is being requested by the user to approve" + }, + "requestor": { + "description": "The identity of which app is requesting access to this capability", + "$ref": "#/components/schemas/ChallengeRequestor" + } + } + }, + "ChallengeProviderRequest": { + "title": "ChallengeProviderRequest", + "allOf": [ + { + "$ref": "#/x-schemas/Types/ProviderRequest" + }, + { + "type": "object", + "required": [ + "parameters" + ], + "properties": { + "parameters": { + "description": "The request to challenge the user", + "$ref": "#/components/schemas/Challenge" + } + } + } + ] + }, + "GrantResult": { + "title": "GrantResult", + "type": "object", + "required": [ + "granted" + ], + "properties": { + "granted": { + "oneOf": [ + { + "type": "boolean", + "description": "Whether the user approved or denied the challenge" + }, + { + "const": null + } + ] + } + }, + "examples": [ + { + "granted": true + }, + { + "granted": false + }, + { + "granted": null + } + ] + }, + "AdPolicy": { + "title": "AdPolicy", + "description": "Describes various ad playback enforcement rules that the app should follow.", + "type": "object", + "properties": { + "skipRestriction": { + "$ref": "#/x-schemas/Advertising/SkipRestriction" + }, + "limitAdTracking": { + "type": "boolean" + } + } + }, + "AdConfigurationOptions": { + "title": "AdConfigurationOptions", + "type": "object", + "properties": { + "coppa": { + "type": "boolean", + "description": "Whether or not the app requires US COPPA compliance." + }, + "environment": { + "type": "string", + "enum": [ + "prod", + "test" + ], + "default": "prod", + "description": "Whether the app is running in a production or test mode." + }, + "authenticationEntity": { + "type": "string", + "description": "The authentication provider, when it is separate entity than the app provider, e.g. an MVPD." + } + } + }, + "AdvertisingIdOptions": { + "title": "AdvertisingIdOptions", + "type": "object", + "properties": { + "scope": { + "type": "object", + "description": "Provides the options to send scope type and id to select desired advertising id", + "required": [ + "type", + "id" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "browse", + "content" + ], + "default": "browse", + "description": "The scope type, which will determine where to show advertisement" + }, + "id": { + "type": "string", + "description": "A value that identifies a specific scope within the scope type" + } + } + } + } + }, + "AdvertisingIdResult": { + "title": "AdvertisingIdResult", + "type": "object", + "properties": { + "ifa": { + "type": "string", + "description": "UUID conforming to IAB standard" + }, + "ifa_type": { + "type": "string", + "description": "source of the IFA as defined by IAB" + }, + "lmt": { + "type": "string", + "enum": [ + "0", + "1" + ], + "description": "boolean that if set to 1, user has requested ad tracking and measurement is disabled" + } + }, + "required": [ + "ifa", + "ifa_type", + "lmt" + ] + }, + "TokenType": { + "title": "TokenType", + "type": "string", + "enum": [ + "platform", + "device", + "distributor" + ] + }, + "AuthenticationTokenResult": { + "title": "AuthenticationTokenResult", + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "expires": { + "type": "string", + "format": "date-time" + }, + "type": { + "type": "string" + } + }, + "required": [ + "value" + ] + }, + "CapabilityOption": { + "title": "CapabilityOption", + "type": "object", + "properties": { + "role": { + "$ref": "#/x-schemas/Capabilities/Role", + "description": "Which role of the capability to check the state of, default will be 'use'", + "default": "use" + } + } + }, + "ClosedCaptionsSettingsProviderRequest": { + "title": "ClosedCaptionsSettingsProviderRequest", + "allOf": [ + { + "$ref": "#/x-schemas/Types/ProviderRequest" + }, + { + "type": "object", + "properties": { + "parameters": { + "const": null + } + } + } + ], + "examples": [ + { + "correlationId": "abc" + } + ] + }, + "InterestResult": { + "title": "InterestResult", + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "entity": { + "$ref": "#/x-schemas/Entity/EntityDetails" + } + }, + "required": [ + "appId", + "entity" + ] + }, + "InterestEvent": { + "title": "InterestEvent", + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "type": { + "$ref": "#/x-schemas/Discovery/InterestType" + }, + "reason": { + "$ref": "#/x-schemas/Discovery/InterestReason" + }, + "entity": { + "$ref": "#/x-schemas/Entity/EntityDetails" + } + }, + "required": [ + "appId", + "entity", + "type", + "reason" + ] + }, + "Resolution": { + "oneOf": [ + { + "type": "array", + "items": [ + { + "type": "integer", + "const": 720, + "description": "Width in pixels" + }, + { + "type": "integer", + "const": 480, + "description": "Height in pixels" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + }, + { + "type": "array", + "items": [ + { + "type": "integer", + "const": 720, + "description": "Width in pixels" + }, + { + "type": "integer", + "const": 576, + "description": "Height in pixels" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + }, + { + "type": "array", + "items": [ + { + "type": "integer", + "const": 1280, + "description": "Width in pixels" + }, + { + "type": "integer", + "const": 720, + "description": "Height in pixels" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + }, + { + "type": "array", + "items": [ + { + "type": "integer", + "const": 1920, + "description": "Width in pixels" + }, + { + "type": "integer", + "const": 1080, + "description": "Height in pixels" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + }, + { + "type": "array", + "items": [ + { + "type": "integer", + "const": 3840, + "description": "Width in pixels" + }, + { + "type": "integer", + "const": 2160, + "description": "Height in pixels" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + } + ] + }, + "NetworkType": { + "title": "NetworkType", + "type": "string", + "enum": [ + "wifi", + "ethernet", + "hybrid" + ], + "description": "The type of network that is currently active" + }, + "NetworkState": { + "title": "NetworkState", + "type": "string", + "enum": [ + "connected", + "disconnected" + ], + "description": "The type of network that is currently active" + }, + "AudioProfiles": { + "title": "AudioProfiles", + "type": "object", + "properties": { + "stereo": { + "type": "boolean" + }, + "dolbyDigital5.1": { + "type": "boolean" + }, + "dolbyDigital5.1+": { + "type": "boolean" + }, + "dolbyAtmos": { + "type": "boolean" + } + }, + "required": [ + "stereo", + "dolbyDigital5.1", + "dolbyDigital5.1+", + "dolbyAtmos" + ] + }, + "HDRFormatMap": { + "title": "HDRFormatMap", + "type": "object", + "properties": { + "hdr10": { + "type": "boolean" + }, + "hdr10Plus": { + "type": "boolean" + }, + "dolbyVision": { + "type": "boolean" + }, + "hlg": { + "type": "boolean" + } + }, + "required": [ + "hdr10", + "hdr10Plus", + "dolbyVision", + "hlg" + ], + "description": "The type of HDR format" + }, + "HDCPVersionMap": { + "title": "HDCPVersionMap", + "type": "object", + "properties": { + "hdcp1.4": { + "type": "boolean" + }, + "hdcp2.2": { + "type": "boolean" + } + }, + "required": [ + "hdcp1.4", + "hdcp2.2" + ], + "description": "The type of HDCP versions" + }, + "DeviceVersion": { + "title": "DeviceVersion", + "type": "object", + "properties": { + "sdk": { + "$ref": "#/x-schemas/Types/SemanticVersion", + "description": "The Firebolt SDK version" + }, + "api": { + "$ref": "#/x-schemas/Types/SemanticVersion", + "description": "The latest Firebolt API version supported by the current device." + }, + "firmware": { + "$ref": "#/x-schemas/Types/SemanticVersion", + "description": "The firmware version as reported by the device" + }, + "os": { + "$ref": "#/x-schemas/Types/SemanticVersion", + "description": "**Deprecated** Use `firmware`, instead." + }, + "debug": { + "type": "string", + "description": "Detailed version as a string, for debugging purposes" + } + }, + "required": [ + "api", + "firmware", + "os" + ] + }, + "NetworkInfoResult": { + "title": "NetworkInfoResult", + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/NetworkState" + }, + "type": { + "$ref": "#/components/schemas/NetworkType" + } + }, + "required": [ + "state", + "type" + ] + }, + "DiscoveryPolicy": { + "title": "DiscoveryPolicy", + "type": "object", + "required": [ + "enableRecommendations", + "shareWatchHistory", + "rememberWatchedPrograms" + ], + "properties": { + "enableRecommendations": { + "type": "boolean", + "description": "Whether or not to the user has enabled history-based recommendations" + }, + "shareWatchHistory": { + "type": "boolean", + "description": "Whether or not the user has enabled app watch history data to be shared with the platform" + }, + "rememberWatchedPrograms": { + "type": "boolean", + "description": "Whether or not the user has enabled watch history" + } + } + }, + "FederatedRequest": { + "title": "FederatedRequest", + "type": "object", + "properties": { + "correlationId": { + "type": "string" + } + }, + "required": [ + "correlationId" + ], + "propertyNames": { + "enum": [ + "correlationId", + "parameters" + ] + }, + "examples": [ + { + "correlationId": "xyz" + } + ] + }, + "FederatedResponse": { + "title": "FederatedResponse", + "type": "object", + "properties": { + "correlationId": { + "type": "string" + } + }, + "required": [ + "correlationId", + "result" + ], + "propertyNames": { + "enum": [ + "correlationId", + "result" + ] + }, + "examples": [ + { + "correlationId": "xyz" + } + ] + }, + "EntityInfoFederatedRequest": { + "title": "EntityInfoFederatedRequest", + "allOf": [ + { + "$ref": "#/components/schemas/FederatedRequest" + }, + { + "type": "object", + "properties": { + "parameters": { + "$ref": "#/components/schemas/EntityInfoParameters" + } + }, + "required": [ + "correlationId", + "parameters" + ] + } + ], + "examples": [ + { + "correlationId": "xyz", + "parameters": { + "entityId": "345" + } + } + ] + }, + "EntityInfoParameters": { + "title": "EntityInfoParameters", + "type": "object", + "properties": { + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + } + }, + "required": [ + "entityId" + ], + "additionalProperties": false, + "examples": [ + { + "entityId": "345" + } + ] + }, + "EntityInfoFederatedResponse": { + "title": "EntityInfoFederatedResponse", + "allOf": [ + { + "$ref": "#/components/schemas/FederatedResponse" + }, + { + "type": "object", + "properties": { + "result": { + "$ref": "#/x-schemas/Discovery/EntityInfoResult" + } + } + } + ] + }, + "EntityInfoResult": { + "title": "EntityInfoResult", + "description": "The result for an `entityInfo()` push or pull.", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "entity": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + }, + "related": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + } + } + }, + "required": [ + "expires", + "entity" + ], + "additionalProperties": false + }, + "PurchasedContentFederatedRequest": { + "title": "PurchasedContentFederatedRequest", + "allOf": [ + { + "$ref": "#/components/schemas/FederatedRequest" + }, + { + "type": "object", + "properties": { + "parameters": { + "$ref": "#/components/schemas/PurchasedContentParameters" + } + }, + "required": [ + "correlationId", + "parameters" + ] + } + ], + "examples": [ + { + "correlationId": "xyz", + "parameters": { + "limit": 100 + } + } + ] + }, + "PurchasedContentParameters": { + "title": "PurchasedContentParameters", + "type": "object", + "properties": { + "limit": { + "type": "integer", + "minimum": -1 + }, + "offeringType": { + "$ref": "#/x-schemas/Entertainment/OfferingType" + }, + "programType": { + "$ref": "#/x-schemas/Entertainment/ProgramType" + } + }, + "required": [ + "limit" + ], + "additionalProperties": false, + "examples": [ + { + "limit": 100 + } + ] + }, + "PurchasedContentFederatedResponse": { + "title": "PurchasedContentFederatedResponse", + "allOf": [ + { + "$ref": "#/components/schemas/FederatedResponse" + }, + { + "type": "object", + "properties": { + "result": { + "$ref": "#/x-schemas/Discovery/PurchasedContentResult" + } + } + } + ] + }, + "PurchasedContentResult": { + "title": "PurchasedContentResult", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "totalCount": { + "type": "integer", + "minimum": 0 + }, + "entries": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + } + } + }, + "required": [ + "expires", + "totalCount", + "entries" + ], + "additionalProperties": false + }, + "Availability": { + "title": "Availability", + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "channel-lineup", + "program-lineup" + ] + }, + "id": { + "type": "string" + }, + "catalogId": { + "type": "string" + }, + "startTime": { + "type": "string", + "format": "date-time" + }, + "endTime": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "type", + "id" + ] + }, + "ContentAccessIdentifiers": { + "title": "ContentAccessIdentifiers", + "type": "object", + "properties": { + "availabilities": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Availability" + }, + "description": "A list of identifiers that represent what content is discoverable for the subscriber. Excluding availabilities will cause no change to the availabilities that are stored for this subscriber. Providing an empty array will clear the subscriber's availabilities" + }, + "entitlements": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/Entitlement" + }, + "description": "A list of identifiers that represent what content is consumable for the subscriber. Excluding entitlements will cause no change to the entitlements that are stored for this subscriber. Providing an empty array will clear the subscriber's entitlements" + } + }, + "required": [] + }, + "TuneChannels": { + "title": "TuneChannels", + "description": "An enumeration of xrn values for the TuneIntent that have special meaning.", + "type": "string", + "enum": [ + "xrn:firebolt:channel:any" + ] + }, + "UserInterestProviderParameters": { + "title": "UserInterestProviderParameters", + "type": "object", + "required": [ + "type", + "reason" + ], + "properties": { + "type": { + "$ref": "#/x-schemas/Discovery/InterestType" + }, + "reason": { + "$ref": "#/x-schemas/Discovery/InterestReason" + } + } + }, + "HDMIPortId": { + "type": "string", + "pattern": "^HDMI[0-9]+$" + }, + "EDIDVersion": { + "title": "EDIDVersion", + "type": "string", + "enum": [ + "1.4", + "2.0", + "unknown" + ] + }, + "HDMIInputPort": { + "title": "HDMIInputPort", + "type": "object", + "additionalProperties": false, + "properties": { + "port": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "connected": { + "type": "boolean" + }, + "signal": { + "$ref": "#/components/schemas/HDMISignalStatus" + }, + "arcCapable": { + "type": "boolean" + }, + "arcConnected": { + "type": "boolean" + }, + "edidVersion": { + "$ref": "#/components/schemas/EDIDVersion" + }, + "autoLowLatencyModeCapable": { + "type": "boolean" + }, + "autoLowLatencyModeSignalled": { + "type": "boolean" + } + }, + "if": { + "properties": { + "edidVersion": { + "type": "string", + "enum": [ + "1.4", + "unknown" + ] + } + } + }, + "then": { + "properties": { + "autoLowLatencyModeCapable": { + "const": false + }, + "autoLowLatencyModeSignalled": { + "const": false + } + } + }, + "required": [ + "port", + "connected", + "signal", + "arcCapable", + "arcConnected", + "edidVersion", + "autoLowLatencyModeCapable", + "autoLowLatencyModeSignalled" + ] + }, + "HDMISignalStatus": { + "type": "string", + "enum": [ + "none", + "stable", + "unstable", + "unsupported", + "unknown" + ] + }, + "SignalChangedInfo": { + "title": "SignalChangedInfo", + "type": "object", + "properties": { + "port": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "signal": { + "$ref": "#/components/schemas/HDMISignalStatus" + } + }, + "required": [ + "port", + "signal" + ] + }, + "ConnectionChangedInfo": { + "title": "ConnectionChangedInfo", + "type": "object", + "properties": { + "port": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "connected": { + "type": "boolean" + } + } + }, + "AutoLowLatencyModeSignalChangedInfo": { + "title": "AutoLowLatencyModeSignalChangedInfo", + "type": "object", + "properties": { + "port": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "autoLowLatencyModeSignalled": { + "type": "boolean" + } + } + }, + "AutoLowLatencyModeCapableChangedInfo": { + "title": "AutoLowLatencyModeCapableChangedInfo", + "type": "object", + "properties": { + "port": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "enabled": { + "type": "boolean" + } + }, + "required": [ + "port", + "enabled" + ] + }, + "EmailUsage": { + "title": "EmailUsage", + "type": "string", + "enum": [ + "signIn", + "signUp" + ] + }, + "KeyboardType": { + "title": "KeyboardType", + "type": "string", + "description": "The type of keyboard to show to the user", + "enum": [ + "standard", + "email", + "password" + ] + }, + "KeyboardParameters": { + "title": "KeyboardParameters", + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "description": "The message to display to the user so the user knows what they are entering", + "type": "string" + } + }, + "examples": [ + { + "type": "standard", + "message": "Enter your user name." + } + ] + }, + "KeyboardProviderRequest": { + "title": "KeyboardProviderRequest", + "type": "object", + "required": [ + "correlationId", + "parameters" + ], + "properties": { + "correlationId": { + "type": "string", + "description": "An id to correlate the provider response with this request" + }, + "parameters": { + "description": "The request to start a keyboard session", + "$ref": "#/components/schemas/KeyboardParameters" + } + } + }, + "LifecycleEvent": { + "title": "LifecycleEvent", + "description": "A an object describing the previous and current states", + "type": "object", + "required": [ + "state", + "previous" + ], + "properties": { + "state": { + "$ref": "#/x-schemas/Lifecycle/LifecycleState", + "description": "The current lifcycle state" + }, + "previous": { + "$ref": "#/x-schemas/Lifecycle/LifecycleState", + "description": "The previous lifcycle state" + }, + "source": { + "type": "string", + "enum": [ + "voice", + "remote" + ], + "description": "The source of the lifecycle change." + } + } + }, + "LatLon": { + "type": "array", + "items": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + }, + "MediaPosition": { + "title": "MediaPosition", + "description": "Represents a position inside playback content, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration.", + "oneOf": [ + { + "const": 0 + }, + { + "type": "number", + "exclusiveMinimum": 0, + "exclusiveMaximum": 1 + }, + { + "type": "integer", + "minimum": 1, + "maximum": 86400 + } + ] + }, + "ErrorType": { + "title": "ErrorType", + "type": "string", + "enum": [ + "network", + "media", + "restriction", + "entitlement", + "other" + ] + }, + "EventObjectPrimitives": { + "title": "EventObjectPrimitives", + "anyOf": [ + { + "type": "string", + "maxLength": 256 + }, + { + "type": "number" + }, + { + "type": "integer" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "EventObject": { + "title": "EventObject", + "type": "object", + "maxProperties": 256, + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/EventObjectPrimitives" + }, + { + "type": "array", + "maxItems": 256, + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/EventObjectPrimitives" + }, + { + "$ref": "#/components/schemas/EventObject" + } + ] + } + }, + { + "$ref": "#/components/schemas/EventObject" + } + ] + } + }, + "AppInitialization": { + "title": "AppInitialization", + "type": "object", + "properties": { + "us_privacy": { + "type": "string", + "description": "The IAB US Privacy string." + }, + "lmt": { + "type": "integer", + "description": "The IAB limit ad tracking opt out value." + }, + "discovery": { + "type": "object", + "properties": { + "navigateTo": { + "$ref": "#/x-schemas/Intents/NavigationIntent" + } + } + }, + "secondScreen": { + "type": "object", + "properties": { + "launchRequest": { + "$ref": "#/x-schemas/SecondScreen/SecondScreenEvent" + } + } + } + } + }, + "PinChallenge": { + "title": "PinChallenge", + "type": "object", + "required": [ + "requestor", + "pinSpace" + ], + "properties": { + "pinSpace": { + "type": "string", + "description": "The pin space that this challenge is for", + "enum": [ + "purchase", + "content" + ] + }, + "capability": { + "type": "string", + "description": "The capability that is gated by a pin challenge" + }, + "requestor": { + "description": "The identity of which app is requesting access to this capability", + "$ref": "#/components/schemas/ChallengeRequestor" + } + } + }, + "PinChallengeProviderRequest": { + "title": "PinChallengeProviderRequest", + "allOf": [ + { + "$ref": "#/x-schemas/Types/ProviderRequest" + }, + { + "type": "object", + "required": [ + "parameters" + ], + "properties": { + "parameters": { + "description": "The request to challenge the user", + "$ref": "#/components/schemas/PinChallenge" + } + } + } + ] + }, + "ResultReason": { + "title": "ResultReason", + "type": "string", + "description": "The reason for the result of challenging the user", + "enum": [ + "noPinRequired", + "noPinRequiredWindow", + "exceededPinFailures", + "correctPin", + "cancelled" + ] + }, + "PinChallengeResult": { + "title": "PinChallengeResult", + "type": "object", + "required": [ + "granted", + "reason" + ], + "properties": { + "granted": { + "oneOf": [ + { + "type": "boolean", + "description": "Whether the user succeeded in the pin challenge" + }, + { + "const": null + } + ] + }, + "reason": { + "$ref": "#/components/schemas/ResultReason", + "description": "The reason for the result " + } + } + }, + "PrivacySettings": { + "title": "PrivacySettings", + "type": "object", + "required": [ + "allowACRCollection", + "allowResumePoints", + "allowAppContentAdTargeting", + "allowCameraAnalytics", + "allowPersonalization", + "allowPrimaryBrowseAdTargeting", + "allowPrimaryContentAdTargeting", + "allowProductAnalytics", + "allowRemoteDiagnostics", + "allowUnentitledPersonalization", + "allowUnentitledResumePoints", + "allowWatchHistory" + ], + "properties": { + "allowACRCollection": { + "description": "", + "type": "boolean" + }, + "allowResumePoints": { + "description": "", + "type": "boolean" + }, + "allowAppContentAdTargeting": { + "description": "", + "type": "boolean" + }, + "allowCameraAnalytics": { + "description": "", + "type": "boolean" + }, + "allowPersonalization": { + "description": "", + "type": "boolean" + }, + "allowPrimaryBrowseAdTargeting": { + "description": "", + "type": "boolean" + }, + "allowPrimaryContentAdTargeting": { + "description": "", + "type": "boolean" + }, + "allowProductAnalytics": { + "description": "", + "type": "boolean" + }, + "allowRemoteDiagnostics": { + "description": "", + "type": "boolean" + }, + "allowUnentitledPersonalization": { + "description": "", + "type": "boolean" + }, + "allowUnentitledResumePoints": { + "description": "", + "type": "boolean" + }, + "allowWatchHistory": { + "description": "", + "type": "boolean" + } + }, + "examples": [ + { + "allowACRCollection": true, + "allowResumePoints": false, + "allowAppContentAdTargeting": false, + "allowCameraAnalytics": true, + "allowPersonalization": true, + "allowPrimaryBrowseAdTargeting": false, + "allowPrimaryContentAdTargeting": false, + "allowProductAnalytics": true, + "allowRemoteDiagnostics": true, + "allowUnentitledPersonalization": true, + "allowUnentitledResumePoints": false, + "allowWatchHistory": true + } + ] + }, + "StorageScope": { + "title": "StorageScope", + "type": "string", + "enum": [ + "device", + "account" + ], + "description": "The scope of the data" + }, + "StorageOptions": { + "title": "StorageOptions", + "type": "object", + "required": [ + "ttl" + ], + "properties": { + "ttl": { + "type": "number", + "description": "Seconds from set time before the data expires and is removed" + } + } + }, + "GrantInfo": { + "description": "Information about a grant given by a user", + "type": "object", + "properties": { + "app": { + "$ref": "#/components/schemas/AppInfo" + }, + "state": { + "$ref": "#/components/schemas/GrantState" + }, + "capability": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "role": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "lifespan": { + "type": "string", + "enum": [ + "once", + "forever", + "appActive", + "powerActive", + "seconds" + ] + }, + "expires": { + "type": "string", + "format": "date-time" + } + }, + "additionalProperties": false, + "required": [ + "state", + "capability", + "role", + "lifespan" + ], + "examples": [ + { + "app": { + "id": "certapp", + "title": "Firebolt Certification" + }, + "state": "granted", + "capability": "xrn:firebolt:capability:data:app-usage", + "role": "use", + "lifespan": "seconds", + "expires": "2022-12-14T20:20:39+00:00" + } + ] + }, + "AppInfo": { + "description": "Information about an app that a grant was for", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "id" + ] + }, + "GrantState": { + "description": "The state the grant is in", + "type": "string", + "enum": [ + "granted", + "denied" + ] + }, + "GrantModificationOptions": { + "description": "Options when modifying any grant", + "type": "object", + "properties": { + "appId": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [] + }, + "RequestOptions": { + "title": "RequestOptions", + "type": "object", + "properties": { + "force": { + "type": "boolean", + "description": "Whether to force for user grant even if the previous decision stored" + } + } + }, + "AccessPointList": { + "title": "AccessPointList", + "type": "object", + "description": "List of scanned Wifi networks available near the device.", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AccessPoint" + } + } + } + }, + "WifiSecurityMode": { + "title": "WifiSecurityMode", + "description": "Security Mode supported for Wifi", + "type": "string", + "enum": [ + "none", + "wep64", + "wep128", + "wpaPskTkip", + "wpaPskAes", + "wpa2PskTkip", + "wpa2PskAes", + "wpaEnterpriseTkip", + "wpaEnterpriseAes", + "wpa2EnterpriseTkip", + "wpa2EnterpriseAes", + "wpa2Psk", + "wpa2Enterprise", + "wpa3PskAes", + "wpa3Sae" + ] + }, + "WifiSignalStrength": { + "title": "WifiSignalStrength", + "description": "Strength of Wifi signal, value is negative based on RSSI specification.", + "type": "integer", + "default": -255, + "minimum": -255, + "maximum": 0 + }, + "WifiFrequency": { + "title": "WifiFrequency", + "description": "Wifi Frequency in Ghz, example 2.4Ghz and 5Ghz.", + "type": "number", + "default": 0, + "minimum": 0 + }, + "AccessPoint": { + "title": "AccessPoint", + "description": "Properties of a scanned wifi list item.", + "type": "object", + "properties": { + "ssid": { + "type": "string", + "description": "Name of the wifi." + }, + "securityMode": { + "$ref": "#/components/schemas/WifiSecurityMode" + }, + "signalStrength": { + "$ref": "#/components/schemas/WifiSignalStrength" + }, + "frequency": { + "$ref": "#/components/schemas/WifiFrequency" + } + } + }, + "WPSSecurityPin": { + "title": "WPSSecurityPin", + "description": "Security pin type for WPS(Wifi Protected Setup).", + "type": "string", + "enum": [ + "pushButton", + "pin", + "manufacturerPin" + ] + }, + "WifiConnectRequest": { + "title": "WifiConnectRequest", + "description": "Request object for the wifi connection.", + "type": "object", + "properties": { + "ssid": { + "schema": { + "type": "string" + } + }, + "passphrase": { + "schema": { + "type": "string" + } + }, + "securityMode": { + "schema": { + "$ref": "#/components/schemas/WifiSecurityMode" + } + }, + "timeout": { + "schema": { + "$ref": "#/x-schemas/Types/Timeout" + } + } + } + } + } + }, + "x-schemas": { + "Types": { + "uri": "https://meta.comcast.com/firebolt/types", + "SemanticVersion": { + "title": "SemanticVersion", + "type": "object", + "properties": { + "major": { + "type": "integer", + "minimum": 0 + }, + "minor": { + "type": "integer", + "minimum": 0 + }, + "patch": { + "type": "integer", + "minimum": 0 + }, + "readable": { + "type": "string" + } + }, + "required": [ + "major", + "minor", + "patch", + "readable" + ], + "additionalProperties": false + }, + "ListenResponse": { + "title": "ListenResponse", + "type": "object", + "required": [ + "event", + "listening" + ], + "properties": { + "event": { + "type": "string", + "pattern": "[a-zA-Z]+\\.on[A-Z][a-zA-Z]+" + }, + "listening": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "ProviderRequest": { + "title": "ProviderRequest", + "type": "object", + "required": [ + "correlationId" + ], + "additionalProperties": false, + "properties": { + "correlationId": { + "type": "string", + "description": "The id that was passed in to the event that triggered a provider method to be called" + }, + "parameters": { + "description": "The result of the provider response.", + "type": [ + "object", + "null" + ] + } + } + }, + "AudioProfile": { + "title": "AudioProfile", + "type": "string", + "enum": [ + "stereo", + "dolbyDigital5.1", + "dolbyDigital5.1+", + "dolbyAtmos" + ] + }, + "LocalizedString": { + "title": "LocalizedString", + "description": "Localized string supports either a simple `string` or a Map of language codes to strings. When using a simple `string`, the current preferred langauge from `Localization.langauge()` is assumed.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + ], + "examples": [ + "A simple string, with no language code", + { + "en": "This is english", + "es": "esto es español" + } + ] + }, + "FlatMap": { + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + }, + "BooleanMap": { + "title": "BooleanMap", + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "Timeout": { + "title": "Timeout", + "description": "Defines the timeout in seconds. If the threshold for timeout is passed for any operation without a result it will throw an error.", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 9999 + } + }, + "Accessibility": { + "uri": "https://meta.comcast.com/firebolt/accessibility", + "ClosedCaptionsSettings": { + "title": "ClosedCaptionsSettings", + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether or not closed-captions should be enabled by default" + }, + "styles": { + "$ref": "#/x-schemas/Accessibility/ClosedCaptionsStyles" + }, + "preferredLanguages": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + }, + "examples": [ + { + "enabled": true, + "styles": { + "fontFamily": "monospaced_serif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] + } + ] + }, + "VoiceGuidanceSettings": { + "title": "VoiceGuidanceSettings", + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether or not voice guidance should be enabled by default" + }, + "speed": { + "$ref": "#/x-schemas/Accessibility/VoiceSpeed", + "description": "The speed at which voice guidance speech will be read back to the user" + } + }, + "examples": [ + { + "enabled": true, + "speed": 2 + } + ] + }, + "VoiceSpeed": { + "title": "VoiceSpeed", + "type": "number", + "minimum": 0.5, + "maximum": 2 + }, + "ClosedCaptionsStyles": { + "title": "ClosedCaptionsStyles", + "type": "object", + "description": "The default styles to use when displaying closed-captions", + "properties": { + "fontFamily": { + "$ref": "#/x-schemas/Accessibility/FontFamily" + }, + "fontSize": { + "$ref": "#/x-schemas/Accessibility/FontSize" + }, + "fontColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "fontEdge": { + "$ref": "#/x-schemas/Accessibility/FontEdge" + }, + "fontEdgeColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "fontOpacity": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "backgroundColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "backgroundOpacity": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "textAlign": { + "$ref": "#/x-schemas/Accessibility/HorizontalAlignment" + }, + "textAlignVertical": { + "$ref": "#/x-schemas/Accessibility/VerticalAlignment" + }, + "windowColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "windowOpacity": { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + } + }, + "FontFamily": { + "type": [ + "string", + "null" + ], + "enum": [ + "monospaced_serif", + "proportional_serif", + "monospaced_sanserif", + "proportional_sanserif", + "smallcaps", + "cursive", + "casual", + null + ] + }, + "FontSize": { + "type": [ + "number", + "null" + ], + "minimum": 0 + }, + "Color": { + "type": [ + "string", + "null" + ] + }, + "FontEdge": { + "type": [ + "string", + "null" + ], + "enum": [ + "none", + "raised", + "depressed", + "uniform", + "drop_shadow_left", + "drop_shadow_right", + null + ] + }, + "Opacity": { + "type": [ + "number", + "null" + ], + "minimum": 0, + "maximum": 100 + }, + "HorizontalAlignment": { + "type": [ + "string", + "null" + ] + }, + "VerticalAlignment": { + "type": [ + "string", + "null" + ] + } + }, + "Localization": { + "uri": "https://meta.comcast.com/firebolt/localization", + "ISO639_2Language": { + "type": "string", + "pattern": "^[a-z]{3}$" + }, + "Locality": { + "type": "string" + }, + "CountryCode": { + "type": "string", + "pattern": "^[A-Z]{2}$" + }, + "Language": { + "type": "string", + "pattern": "^[A-Za-z]{2}$" + }, + "Locale": { + "type": "string", + "pattern": "^[a-zA-Z]+([a-zA-Z0-9\\-]*)$" + }, + "TimeZone": { + "type": "string", + "pattern": "^[-+_/ A-Za-z 0-9]*$" + } + }, + "Advertising": { + "uri": "https://meta.comcast.com/firebolt/advertising", + "SkipRestriction": { + "title": "SkipRestriction", + "$comment": "xrn:advertising:policy:skipRestriction:", + "type": "string", + "enum": [ + "none", + "adsUnwatched", + "adsAll", + "all" + ], + "description": "The advertisement skip restriction.\n\nApplies to fast-forward/rewind (e.g. trick mode), seeking over an entire opportunity (e.g. jump), seeking out of what's currently playing, and \"Skip this ad...\" features. Seeking over multiple ad opportunities only requires playback of the _last_ opportunity, not all opportunities, preceding the seek destination.\n\n| Value | Description |\n|--------------|--------------------------------------------------------------------------------|\n| none |No fast-forward, jump, or skip restrictions |\n| adsUnwatched | Restrict fast-forward, jump, and skip for unwatched ad opportunities only. |\n| adsAll | Restrict fast-forward, jump, and skip for all ad opportunities |\n| all | Restrict fast-forward, jump, and skip for all ad opportunities and all content |\n\nNamespace: `xrn:advertising:policy:skipRestriction:`\n\n" + } + }, + "Capabilities": { + "uri": "https://meta.comcast.com/firebolt/capabilities", + "Capability": { + "title": "Capability", + "type": "string", + "description": "A Capability is a discrete unit of functionality that a Firebolt device might be able to perform.", + "pattern": "^xrn:firebolt:capability:([a-z0-9\\-]+)((:[a-z0-9\\-]+)?)$" + }, + "CapabilityInfo": { + "title": "CapabilityInfo", + "type": "object", + "required": [ + "supported", + "available", + "use", + "manage", + "provide" + ], + "properties": { + "capability": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "supported": { + "type": "boolean", + "description": "Provides info whether the capability is supported" + }, + "available": { + "type": "boolean", + "description": "Provides info whether the capability is available" + }, + "use": { + "$ref": "#/x-schemas/Capabilities/CapPermissionStatus" + }, + "manage": { + "$ref": "#/x-schemas/Capabilities/CapPermissionStatus" + }, + "provide": { + "$ref": "#/x-schemas/Capabilities/CapPermissionStatus" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/DenyReason" + }, + "minItems": 1, + "maxItems": 6 + } + }, + "additionalProperties": false, + "examples": [ + { + "capability": "xrn:firebolt:capability:keyboard", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + } + ] + }, + "Permission": { + "title": "Permission", + "description": "A capability combined with a Role, which an app may be permitted (by a distributor) or granted (by an end user).", + "type": "object", + "required": [ + "capability" + ], + "properties": { + "role": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "capability": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + "additionalProperties": false + }, + "Role": { + "title": "Role", + "description": "Role provides access level for the app for a given capability.", + "type": "string", + "enum": [ + "use", + "manage", + "provide" + ] + }, + "CapPermissionStatus": { + "type": "object", + "properties": { + "permitted": { + "type": "boolean", + "description": "Provides info whether the capability is permitted" + }, + "granted": { + "oneOf": [ + { + "type": "boolean", + "description": "Provides info whether the capability is granted" + }, + { + "const": null + } + ] + } + }, + "additionalProperties": false + }, + "DenyReason": { + "title": "DenyReason", + "description": "Reasons why a Capability might not be invokable", + "type": "string", + "enum": [ + "unpermitted", + "unsupported", + "disabled", + "unavailable", + "grantDenied", + "ungranted" + ] + } + }, + "Discovery": { + "uri": "https://meta.comcast.com/firebolt/discovery", + "InterestType": { + "title": "InterestType", + "type": "string", + "enum": [ + "interest", + "disinterest" + ] + }, + "InterestReason": { + "title": "InterestReason", + "type": "string", + "enum": [ + "playlist", + "reaction", + "recording" + ] + }, + "EntityInfoResult": { + "title": "EntityInfoResult", + "description": "The result for an `entityInfo()` push or pull.", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "entity": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + }, + "related": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + } + } + }, + "required": [ + "expires", + "entity" + ], + "additionalProperties": false + }, + "PurchasedContentResult": { + "title": "PurchasedContentResult", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "totalCount": { + "type": "integer", + "minimum": 0 + }, + "entries": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + } + } + }, + "required": [ + "expires", + "totalCount", + "entries" + ], + "additionalProperties": false + } + }, + "Entity": { + "uri": "https://meta.comcast.com/firebolt/entity", + "EntityDetails": { + "title": "EntityDetails", + "type": "object", + "required": [ + "identifiers" + ], + "properties": { + "identifiers": { + "$ref": "#/x-schemas/Entity/Entity" + }, + "info": { + "$ref": "#/x-schemas/Entity/Metadata" + }, + "waysToWatch": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/WayToWatch" + }, + "description": "An array of ways a user is might watch this entity, regardless of entitlements." + } + } + }, + "Entity": { + "oneOf": [ + { + "$ref": "#/x-schemas/Entity/ProgramEntity" + }, + { + "$ref": "#/x-schemas/Entity/MusicEntity" + }, + { + "$ref": "#/x-schemas/Entity/ChannelEntity" + }, + { + "$ref": "#/x-schemas/Entity/UntypedEntity" + }, + { + "$ref": "#/x-schemas/Entity/PlaylistEntity" + } + ] + }, + "Metadata": { + "title": "Metadata", + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Title of the entity." + }, + "synopsis": { + "type": "string", + "description": "Short description of the entity." + }, + "seasonNumber": { + "type": "number", + "description": "For TV seasons, the season number. For TV episodes, the season that the episode belongs to." + }, + "seasonCount": { + "type": "number", + "description": "For TV series, seasons, and episodes, the total number of seasons." + }, + "episodeNumber": { + "type": "number", + "description": "For TV episodes, the episode number." + }, + "episodeCount": { + "type": "number", + "description": "For TV seasons and episodes, the total number of episodes in the current season." + }, + "releaseDate": { + "type": "string", + "format": "date-time", + "description": "The date that the program or entity was released or first aired." + }, + "contentRatings": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/ContentRating" + }, + "description": "A list of ContentRating objects, describing the entity's ratings in various rating schemes." + } + } + }, + "ProgramEntity": { + "title": "ProgramEntity", + "oneOf": [ + { + "$ref": "#/x-schemas/Entity/MovieEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVEpisodeEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVSeasonEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVSeriesEntity" + }, + { + "$ref": "#/x-schemas/Entity/AdditionalEntity" + } + ] + }, + "MusicEntity": { + "title": "MusicEntity", + "type": "object", + "properties": { + "entityType": { + "const": "music" + }, + "musicType": { + "$ref": "#/x-schemas/Entertainment/MusicType" + }, + "entityId": { + "type": "string" + } + }, + "required": [ + "entityType", + "musicType", + "entityId" + ] + }, + "ChannelEntity": { + "title": "ChannelEntity", + "type": "object", + "properties": { + "entityType": { + "const": "channel" + }, + "channelType": { + "type": "string", + "enum": [ + "streaming", + "overTheAir" + ] + }, + "entityId": { + "type": "string", + "description": "ID of the channel, in the target App's scope." + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "required": [ + "entityType", + "channelType", + "entityId" + ], + "additionalProperties": false + }, + "UntypedEntity": { + "title": "UntypedEntity", + "allOf": [ + { + "description": "A Firebolt compliant representation of the remaining entity types.", + "type": "object", + "required": [ + "entityId" + ], + "properties": { + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false + } + ], + "examples": [ + { + "entityId": "an-entity" + } + ] + }, + "PlaylistEntity": { + "title": "PlaylistEntity", + "description": "A Firebolt compliant representation of a Playlist entity.", + "type": "object", + "required": [ + "entityType", + "entityId" + ], + "properties": { + "entityType": { + "const": "playlist" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "playlist", + "entityId": "playlist/xyz" + } + ] + }, + "MovieEntity": { + "title": "MovieEntity", + "description": "A Firebolt compliant representation of a Movie entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "movie" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "movie", + "entityId": "el-camino" + } + ] + }, + "TVEpisodeEntity": { + "title": "TVEpisodeEntity", + "description": "A Firebolt compliant representation of a TV Episode entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId", + "seriesId", + "seasonId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "episode" + }, + "entityId": { + "type": "string" + }, + "seriesId": { + "type": "string" + }, + "seasonId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "episode", + "entityId": "breaking-bad-pilot", + "seriesId": "breaking-bad", + "seasonId": "breaking-bad-season-1" + } + ] + }, + "TVSeasonEntity": { + "title": "TVSeasonEntity", + "description": "A Firebolt compliant representation of a TV Season entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId", + "seriesId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "season" + }, + "entityId": { + "type": "string" + }, + "seriesId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "season", + "entityId": "breaking-bad-season-1", + "seriesId": "breaking-bad" + } + ] + }, + "TVSeriesEntity": { + "title": "TVSeriesEntity", + "description": "A Firebolt compliant representation of a TV Series entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "series" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "series", + "entityId": "breaking-bad" + } + ] + }, + "AdditionalEntity": { + "title": "AdditionalEntity", + "description": "A Firebolt compliant representation of the remaining program entity types.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "type": "string", + "enum": [ + "concert", + "sportingEvent", + "preview", + "other", + "advertisement", + "musicVideo", + "minisode", + "extra" + ] + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "concert", + "entityId": "live-aid" + } + ] + }, + "PlayableEntity": { + "title": "PlayableEntity", + "anyOf": [ + { + "$ref": "#/x-schemas/Entity/MovieEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVEpisodeEntity" + }, + { + "$ref": "#/x-schemas/Entity/PlaylistEntity" + }, + { + "$ref": "#/x-schemas/Entity/MusicEntity" + }, + { + "$ref": "#/x-schemas/Entity/AdditionalEntity" + } + ] + } + }, + "Entertainment": { + "uri": "https://meta.comcast.com/firebolt/entertainment", + "WayToWatch": { + "title": "WayToWatch", + "type": "object", + "required": [ + "identifiers", + "audioProfile" + ], + "properties": { + "identifiers": { + "$ref": "#/x-schemas/Entertainment/ContentIdentifiers" + }, + "expires": { + "type": "string", + "format": "date-time", + "description": "Time when the WayToWatch is no longer available." + }, + "entitled": { + "type": "boolean", + "description": "Specify if the user is entitled to watch the entity." + }, + "entitledExpires": { + "type": "string", + "format": "date-time", + "description": "Time when the entity is no longer entitled." + }, + "offeringType": { + "$ref": "#/x-schemas/Entertainment/OfferingType" + }, + "hasAds": { + "type": "boolean", + "description": "True if the streamable asset contains ads." + }, + "price": { + "type": "number", + "description": "For \"buy\" and \"rent\" WayToWatch, the price to buy or rent in the user's preferred currency." + }, + "videoQuality": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "SD", + "HD", + "UHD" + ] + }, + "description": "List of the video qualities available via the WayToWatch." + }, + "audioProfile": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Types/AudioProfile" + }, + "description": "List of the audio types available via the WayToWatch." + }, + "audioLanguages": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of audio track languages available on the WayToWatch. The first is considered the primary language. Languages are expressed as ISO 639 1/2 codes." + }, + "closedCaptions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of languages for which closed captions are available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes." + }, + "subtitles": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of languages for which subtitles are available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes." + }, + "audioDescriptions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of languages for which audio descriptions (DVD) as available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes." + } + }, + "description": "A WayToWatch describes a way to watch a video program. It may describe a single\nstreamable asset or a set of streamable assets. For example, an app provider may\ndescribe HD, SD, and UHD assets as individual WayToWatch objects or rolled into\na single WayToWatch.\n\nIf the WayToWatch represents a single streamable asset, the provided\nContentIdentifiers must be sufficient to play back the specific asset when sent\nvia a playback intent or deep link. If the WayToWatch represents multiple\nstreamable assets, the provided ContentIdentifiers must be sufficient to\nplayback one of the assets represented with no user action. In this scenario,\nthe app SHOULD choose the best asset for the user based on their device and\nsettings. The ContentIdentifiers MUST also be sufficient for navigating the user\nto the appropriate entity or detail screen via an entity intent.\n\nThe app should set the `entitled` property to indicate if the user can watch, or\nnot watch, the asset without making a purchase. If the entitlement is known to\nexpire at a certain time (e.g., a rental), the app should also provide the\n`entitledExpires` property. If the entitlement is not expired, the UI will use\nthe `entitled` property to display watchable assets to the user, adjust how\nassets are presented to the user, and how intents into the app are generated.\nFor example, the the Aggregated Experience could render a \"Watch\" button for an\nentitled asset versus a \"Subscribe\" button for an non-entitled asset.\n\nThe app should set the `offeringType` to define how the content may be\nauthorized. The UI will use this to adjust how content is presented to the user.\n\nA single WayToWatch cannot represent streamable assets available via multiple\npurchase paths. If, for example, an asset has both Buy, Rent and Subscription\navailability, the three different entitlement paths MUST be represented as\nmultiple WayToWatch objects.\n\n`price` should be populated for WayToWatch objects with `buy` or `rent`\n`offeringType`. If the WayToWatch represents a set of assets with various price\npoints, the `price` provided must be the lowest available price." + }, + "OfferingType": { + "title": "OfferingType", + "type": "string", + "enum": [ + "free", + "subscribe", + "buy", + "rent" + ], + "description": "The offering type of the WayToWatch." + }, + "ContentIdentifiers": { + "title": "ContentIdentifiers", + "type": "object", + "properties": { + "assetId": { + "type": "string", + "description": "Identifies a particular playable asset. For example, the HD version of a particular movie separate from the UHD version." + }, + "entityId": { + "type": "string", + "description": "Identifies an entity, such as a Movie, TV Series or TV Episode." + }, + "seasonId": { + "type": "string", + "description": "The TV Season for a TV Episode." + }, + "seriesId": { + "type": "string", + "description": "The TV Series for a TV Episode or TV Season." + }, + "appContentData": { + "type": "string", + "description": "App-specific content identifiers.", + "maxLength": 1024 + } + }, + "description": "The ContentIdentifiers object is how the app identifies an entity or asset to\nthe Firebolt platform. These ids are used to look up metadata and deep link into\nthe app.\n\nApps do not need to provide all ids. They only need to provide the minimum\nrequired to target a playable stream or an entity detail screen via a deep link.\nIf an id isn't needed to get to those pages, it doesn't need to be included." + }, + "ContentRating": { + "title": "ContentRating", + "type": "object", + "required": [ + "scheme", + "rating" + ], + "properties": { + "scheme": { + "type": "string", + "enum": [ + "CA-Movie", + "CA-TV", + "CA-Movie-Fr", + "CA-TV-Fr", + "US-Movie", + "US-TV" + ], + "description": "The rating scheme." + }, + "rating": { + "type": "string", + "description": "The content rating." + }, + "advisories": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional list of subratings or content advisories." + } + }, + "description": "A ContentRating represents an age or content based of an entity. Supported rating schemes and associated types are below.\n\n## United States\n\n`US-Movie` (MPAA):\n\nRatings: `NR`, `G`, `PG`, `PG13`, `R`, `NC17`\n\nAdvisories: `AT`, `BN`, `SL`, `SS`, `N`, `V`\n\n`US-TV` (Vchip):\n\nRatings: `TVY`, `TVY7`, `TVG`, `TVPG`, `TV14`, `TVMA`\n\nAdvisories: `FV`, `D`, `L`, `S`, `V`\n\n## Canada\n\n`CA-Movie` (OFRB):\n\nRatings: `G`, `PG`, `14A`, `18A`, `R`, `E`\n\n`CA-TV` (AGVOT)\n\nRatings: `E`, `C`, `C8`, `G`, `PG`, `14+`, `18+`\n\nAdvisories: `C`, `C8`, `G`, `PG`, `14+`, `18+`\n\n`CA-Movie-Fr` (Canadian French language movies):\n\nRatings: `G`, `8+`, `13+`, `16+`, `18+`\n\n`CA-TV-Fr` (Canadian French language TV):\n\nRatings: `G`, `8+`, `13+`, `16+`, `18+`\n" + }, + "MusicType": { + "title": "MusicType", + "type": "string", + "description": "In the case of a music `entityType`, specifies the type of music entity.", + "enum": [ + "song", + "album" + ] + }, + "Entitlement": { + "title": "Entitlement", + "type": "object", + "properties": { + "entitlementId": { + "type": "string" + }, + "startTime": { + "type": "string", + "format": "date-time" + }, + "endTime": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "entitlementId" + ] + }, + "EntityInfo": { + "title": "EntityInfo", + "description": "An EntityInfo object represents an \"entity\" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type.\n\nAdditionally, EntityInfo objects must specify a properly formed\nContentIdentifiers object, `entityType`, and `title`. The app should provide\nthe `synopsis` property for a good user experience if the content\nmetadata is not available another way.\n\nThe ContentIdentifiers must be sufficient for navigating the user to the\nappropriate entity or detail screen via a `detail` intent or deep link.\n\nEntityInfo objects must provide at least one WayToWatch object when returned as\npart of an `entityInfo` method and a streamable asset is available to the user.\nIt is optional for the `purchasedContent` method, but recommended because the UI\nmay use those data.", + "type": "object", + "required": [ + "identifiers", + "entityType", + "title" + ], + "properties": { + "identifiers": { + "$ref": "#/x-schemas/Entertainment/ContentIdentifiers" + }, + "title": { + "type": "string", + "description": "Title of the entity." + }, + "entityType": { + "type": "string", + "enum": [ + "program", + "music" + ], + "description": "The type of the entity, e.g. `program` or `music`." + }, + "programType": { + "$ref": "#/x-schemas/Entertainment/ProgramType" + }, + "musicType": { + "$ref": "#/x-schemas/Entertainment/MusicType" + }, + "synopsis": { + "type": "string", + "description": "Short description of the entity." + }, + "seasonNumber": { + "type": "number", + "description": "For TV seasons, the season number. For TV episodes, the season that the episode belongs to." + }, + "seasonCount": { + "type": "number", + "description": "For TV series, seasons, and episodes, the total number of seasons." + }, + "episodeNumber": { + "type": "number", + "description": "For TV episodes, the episode number." + }, + "episodeCount": { + "type": "number", + "description": "For TV seasons and episodes, the total number of episodes in the current season." + }, + "releaseDate": { + "type": "string", + "format": "date-time", + "description": "The date that the program or entity was released or first aired." + }, + "contentRatings": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/ContentRating" + }, + "description": "A list of ContentRating objects, describing the entity's ratings in various rating schemes." + }, + "waysToWatch": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/WayToWatch" + }, + "description": "An array of ways a user is might watch this entity, regardless of entitlements." + } + }, + "if": { + "properties": { + "entityType": { + "const": "program" + } + } + }, + "then": { + "required": [ + "programType" + ], + "not": { + "required": [ + "musicType" + ] + } + }, + "else": { + "required": [ + "musicType" + ], + "not": { + "required": [ + "programType" + ] + } + } + }, + "ProgramType": { + "title": "ProgramType", + "type": "string", + "description": "In the case of a program `entityType`, specifies the program type.", + "enum": [ + "movie", + "episode", + "season", + "series", + "other", + "preview", + "extra", + "concert", + "sportingEvent", + "advertisement", + "musicVideo", + "minisode" + ] + } + }, + "Intents": { + "uri": "https://meta.comcast.com/firebolt/intents", + "NavigationIntent": { + "title": "NavigationIntent", + "description": "A Firebolt compliant representation of a user intention to navigate to a specific place in an app.", + "anyOf": [ + { + "$ref": "#/x-schemas/Intents/HomeIntent" + }, + { + "$ref": "#/x-schemas/Intents/LaunchIntent" + }, + { + "$ref": "#/x-schemas/Intents/EntityIntent" + }, + { + "$ref": "#/x-schemas/Intents/PlaybackIntent" + }, + { + "$ref": "#/x-schemas/Intents/SearchIntent" + }, + { + "$ref": "#/x-schemas/Intents/SectionIntent" + }, + { + "$ref": "#/x-schemas/Intents/TuneIntent" + }, + { + "$ref": "#/x-schemas/Intents/PlayEntityIntent" + }, + { + "$ref": "#/x-schemas/Intents/PlayQueryIntent" + } + ] + }, + "HomeIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to it's home screen, and bring that app to the foreground if needed.", + "title": "HomeIntent", + "allOf": [ + { + "title": "HomeIntent", + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "title": "HomeIntent", + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "title": "HomeIntent", + "type": "object", + "properties": { + "action": { + "const": "home" + } + }, + "not": { + "required": [ + "data" + ] + } + } + ], + "examples": [ + { + "action": "home", + "context": { + "source": "voice" + } + } + ] + }, + "LaunchIntent": { + "description": "A Firebolt compliant representation of a user intention to launch an app.", + "title": "LaunchIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "launch" + } + }, + "not": { + "required": [ + "data" + ] + } + } + ], + "examples": [ + { + "action": "launch", + "context": { + "source": "voice" + } + } + ] + }, + "EntityIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a specific entity page, and bring that app to the foreground if needed.", + "title": "EntityIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "entity" + }, + "data": { + "$ref": "#/x-schemas/Entity/Entity" + } + } + } + ], + "examples": [ + { + "action": "entity", + "context": { + "source": "voice" + }, + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "el-camino" + } + } + ] + }, + "PlaybackIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a the video player for a specific, playable entity, and bring that app to the foreground if needed.", + "title": "PlaybackIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "playback" + }, + "data": { + "$ref": "#/x-schemas/Entity/PlayableEntity" + } + } + } + ], + "examples": [ + { + "action": "playback", + "data": { + "entityType": "program", + "programType": "episode", + "entityId": "breaking-bad-pilot", + "seriesId": "breaking-bad", + "seasonId": "breaking-bad-season-1" + }, + "context": { + "source": "voice" + } + } + ] + }, + "SearchIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to it's search UI with a search term populated, and bring that app to the foreground if needed.", + "title": "SearchIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "search" + }, + "data": { + "type": "object", + "required": [ + "query" + ], + "properties": { + "query": { + "type": "string" + }, + "suggestions": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entity/Entity" + } + } + }, + "additionalProperties": false + } + } + } + ], + "examples": [ + { + "action": "search", + "data": { + "query": "walter white" + }, + "context": { + "source": "voice" + } + } + ] + }, + "SectionIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a section not covered by `home`, `entity`, `player`, or `search`, and bring that app to the foreground if needed.", + "title": "SectionIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "section" + }, + "data": { + "type": "object", + "required": [ + "sectionName" + ], + "properties": { + "sectionName": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "required": [ + "data" + ] + } + ], + "examples": [ + { + "action": "section", + "data": { + "sectionName": "settings" + }, + "context": { + "source": "voice" + } + } + ] + }, + "TuneIntent": { + "description": "A Firebolt compliant representation of a user intention to 'tune' to a traditional over-the-air broadcast, or an OTT Stream from an OTT or vMVPD App.", + "title": "TuneIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "tune" + }, + "data": { + "type": "object", + "required": [ + "entity" + ], + "additionalProperties": false, + "properties": { + "entity": { + "$ref": "#/x-schemas/Entity/ChannelEntity" + }, + "options": { + "description": "The options property of the data property MUST have only one of the following fields.", + "type": "object", + "required": [], + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "properties": { + "assetId": { + "type": "string", + "description": "The ID of a specific 'listing', as scoped by the target App's ID-space, which the App should begin playback from." + }, + "restartCurrentProgram": { + "type": "boolean", + "description": "Denotes that the App should start playback at the most recent program boundary, rather than 'live.'" + }, + "time": { + "type": "string", + "format": "date-time", + "description": "ISO 8601 Date/Time where the App should begin playback from." + } + } + } + } + } + } + } + ], + "examples": [ + { + "action": "tune", + "data": { + "entity": { + "entityType": "channel", + "channelType": "streaming", + "entityId": "an-ott-channel" + }, + "options": { + "restartCurrentProgram": true + } + }, + "context": { + "source": "voice" + } + } + ] + }, + "PlayEntityIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a the video player for a specific, playable entity, and bring that app to the foreground if needed.", + "title": "PlayEntityIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "play-entity" + }, + "data": { + "type": "object", + "properties": { + "entity": { + "$ref": "#/x-schemas/Entity/PlayableEntity" + }, + "options": { + "type": "object", + "properties": { + "playFirstId": { + "type": "string" + }, + "playFirstTrack": { + "type": "integer", + "minimum": 1 + } + }, + "additionalProperties": false + } + }, + "required": [ + "entity" + ], + "propertyNames": { + "enum": [ + "entity", + "options" + ] + }, + "if": { + "properties": { + "entity": { + "type": "object", + "required": [ + "entityType" + ], + "properties": { + "entityType": { + "const": "playlist" + } + } + } + } + }, + "then": { + "type": "object", + "properties": { + "options": { + "type": "object", + "maxProperties": 1 + } + } + }, + "else": { + "type": "object", + "properties": { + "options": { + "type": "object", + "maxProperties": 0 + } + } + } + } + } + } + ], + "examples": [ + { + "action": "play-entity", + "data": { + "entity": { + "entityType": "playlist", + "entityId": "playlist/xyz" + }, + "options": { + "playFirstId": "song/xyz" + } + }, + "context": { + "source": "voice" + } + }, + { + "action": "play-entity", + "data": { + "entity": { + "entityType": "playlist", + "entityId": "playlist/xyz" + }, + "options": { + "playFirstTrack": 3 + } + }, + "context": { + "source": "voice" + } + } + ] + }, + "PlayQueryIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a the video player for an abstract query to be searched for and played by the app.", + "title": "PlayQueryIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "play-query" + }, + "data": { + "type": "object", + "properties": { + "query": { + "type": "string" + }, + "options": { + "type": "object", + "properties": { + "programTypes": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/ProgramType" + } + }, + "musicTypes": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/MusicType" + } + } + }, + "additionalProperties": false + } + }, + "required": [ + "query" + ], + "propertyNames": { + "enum": [ + "query", + "options" + ] + } + } + } + } + ], + "examples": [ + { + "action": "play-query", + "data": { + "query": "Ed Sheeran" + }, + "context": { + "source": "voice" + } + }, + { + "action": "play-query", + "data": { + "query": "Ed Sheeran", + "options": { + "programTypes": [ + "movie" + ] + } + }, + "context": { + "source": "voice" + } + }, + { + "action": "play-query", + "data": { + "query": "Ed Sheeran", + "options": { + "programTypes": [ + "movie" + ], + "musicTypes": [ + "song" + ] + } + }, + "context": { + "source": "voice" + } + } + ] + }, + "Intent": { + "description": "A Firebolt compliant representation of a user intention.", + "type": "object", + "required": [ + "action", + "context" + ], + "properties": { + "action": { + "type": "string" + }, + "context": { + "type": "object", + "required": [ + "source" + ], + "properties": { + "source": { + "type": "string" + } + } + } + } + }, + "IntentProperties": { + "type": "object", + "propertyNames": { + "enum": [ + "action", + "data", + "context" + ] + } + } + }, + "Lifecycle": { + "uri": "https://meta.comcast.com/firebolt/lifecycle", + "CloseReason": { + "title": "CloseReason", + "description": "The application close reason", + "type": "string", + "enum": [ + "remoteButton", + "userExit", + "done", + "error" + ] + }, + "LifecycleState": { + "title": "LifecycleState", + "description": "The application lifecycle state", + "type": "string", + "enum": [ + "initializing", + "inactive", + "foreground", + "background", + "unloading", + "suspended" + ] + } + }, + "SecondScreen": { + "uri": "https://meta.comcast.com/firebolt/secondscreen", + "SecondScreenEvent": { + "title": "SecondScreenEvent", + "description": "An a message notification from a second screen device", + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "dial" + ] + }, + "version": { + "type": "string" + }, + "data": { + "type": "string" + } + } + } + } + } +} \ No newline at end of file diff --git a/requirements/pr-fix-ci-fb-version/specifications/firebolt-specification.json b/requirements/pr-fix-ci-fb-version/specifications/firebolt-specification.json new file mode 100644 index 000000000..a494475b7 --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/firebolt-specification.json @@ -0,0 +1,22910 @@ +{ + "schemaVersion": { + "major": 1, + "minor": 0, + "patch": 0, + "readable": "Firebolt Version Manifest v1.0.0" + }, + "capabilities": { + "xrn:firebolt:capability:accessibility:audiodescriptions": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:accessibility:closedcaptions": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:accessibility:voiceguidance": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:account:id": { + "level": "could", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:account:uid": { + "level": "should", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:advertising:configuration": { + "level": "could", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:advertising:identifier": { + "level": "could", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:advertising:policy": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:approve:content": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:approve:purchase": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:capabilities:info": { + "level": "must", + "use": { + "public": true, + "negotiable": false + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:capabilities:request": { + "level": "must", + "use": { + "public": true, + "negotiable": false + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:device:distributor": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:device:id": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:device:info": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:device:make": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:device:model": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:device:name": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:device:sku": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:device:uid": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:discovery:content-access": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:discovery:entity-info": { + "level": "must", + "use": { + "public": false, + "negotiable": false + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": true, + "negotiable": true + } + }, + "xrn:firebolt:capability:discovery:interest": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": true, + "negotiable": true + } + }, + "xrn:firebolt:capability:discovery:navigate-to": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:discovery:policy": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:discovery:purchased-content": { + "level": "must", + "use": { + "public": false, + "negotiable": false + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": true, + "negotiable": true + } + }, + "xrn:firebolt:capability:discovery:sign-in-status": { + "level": "could", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:discovery:watch-next": { + "level": "could", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:discovery:watched": { + "level": "could", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:grants:state": { + "level": "should", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:input:keyboard": { + "level": "should", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": true, + "negotiable": true + } + }, + "xrn:firebolt:capability:inputs:hdmi": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:lifecycle:initialize": { + "level": "must", + "use": { + "public": true, + "negotiable": false + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:lifecycle:launch": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:lifecycle:ready": { + "level": "must", + "use": { + "public": true, + "negotiable": false + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:lifecycle:state": { + "level": "must", + "use": { + "public": true, + "negotiable": false + }, + "manage": { + "public": false, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": true + } + }, + "xrn:firebolt:capability:localization:additional-info": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:localization:country-code": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:localization:language": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:localization:locale": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:localization:locality": { + "level": "could", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:localization:location": { + "level": "could", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:localization:postal-code": { + "level": "could", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:localization:time-zone": { + "level": "could", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:metrics:distributor": { + "level": "could", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:metrics:general": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:metrics:media": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:network:status": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:privacy:settings": { + "level": "could", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:profile:flags": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:protocol:dial": { + "level": "could", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:protocol:wifi": { + "level": "could", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:rpc:discover": { + "level": "must", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:secondscreen:protocol": { + "level": "should", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:storage:secure": { + "level": "could", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:token:account": { + "level": "should", + "use": { + "public": false, + "negotiable": false + }, + "manage": { + "public": true, + "negotiable": true + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:token:device": { + "level": "should", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:token:platform": { + "level": "should", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:token:root": { + "level": "should", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:token:session": { + "level": "should", + "use": { + "public": true, + "negotiable": true + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": false, + "negotiable": false + } + }, + "xrn:firebolt:capability:usergrant:acknowledgechallenge": { + "level": "should", + "use": { + "public": false, + "negotiable": false + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": true, + "negotiable": true + } + }, + "xrn:firebolt:capability:usergrant:pinchallenge": { + "level": "should", + "use": { + "public": false, + "negotiable": false + }, + "manage": { + "public": false, + "negotiable": false + }, + "provide": { + "public": true, + "negotiable": true + } + } + }, + "apis": { + "1": { + "openrpc": "1.2.4", + "info": { + "title": "Firebolt JSON-RPC API", + "version": "1.5.0-fix-ci-fb-version.0", + "x-module-descriptions": { + "Internal": "Internal methods for SDK / FEE integration", + "Accessibility": "The `Accessibility` module provides access to the user/device settings for closed captioning and voice guidance.\n\nApps **SHOULD** attempt o respect these settings, rather than manage and persist seprate settings, which would be different per-app.", + "Account": "A module for querying about the device account.", + "AcknowledgeChallenge": "A module for registering as a provider for a user grant in which the user confirms access to a capability", + "Advertising": "A module for platform provided advertising settings and functionality.", + "AudioDescriptions": "A module for managing audio-description Settings.", + "Authentication": "A module for acquiring authentication tokens.", + "Capabilities": "The Capabilities module provides information about which discreet unit of functionality is enabled for the apps.", + "ClosedCaptions": "A module for managing closed-captions Settings.", + "Device": "A module for querying about the device and it's capabilities.", + "Discovery": "Your App likely wants to integrate with the Platform's discovery capabilities. For example to add a \"Watch Next\" tile that links to your app from the platform's home screen.\n\nGetting access to this information requires to connect to lower level APIs made available by the platform. Since implementations differ between operators and platforms, the Firebolt SDK offers a Discovery module, that exposes a generic, agnostic interface to the developer.\n\nUnder the hood, an underlaying transport layer will then take care of calling the right APIs for the actual platform implementation that your App is running on.\n\nThe Discovery plugin is used to _send_ information to the Platform.\n\n### Localization\nApps should provide all user-facing strings in the device's language, as specified by the Firebolt `Localization.language` property.\n\nApps should provide prices in the same currency presented in the app. If multiple currencies are supported in the app, the app should provide prices in the user's current default currency.", + "HDMIInput": "Methods for managing HDMI inputs on an HDMI sink device.", + "Keyboard": "Methods for prompting users to enter text with task-oriented UX", + "Lifecycle": "Methods and events for responding to lifecycle changes in your app", + "Localization": "Methods for accessessing location and language preferences", + "Metrics": "Methods for sending metrics", + "Parameters": "Methods for getting initialization parameters for an app cold launch.", + "PinChallenge": "A module for registering as a provider for a user grant in which the user is prompted for a pin for access to a capability", + "Privacy": "A module for managing device settings.", + "Profile": "Methods for getting information about the current user/account profile", + "SecondScreen": "Methods for communicating with second screen devices", + "SecureStorage": "A module for storing and retrieving secure data owned by the app", + "UserGrants": "A module for managing grants given by the user", + "VoiceGuidance": "A module for managing voice-guidance Settings.", + "Wifi": "A module for providing support for Wifi." + } + }, + "methods": [ + { + "name": "rpc.discover", + "summary": "The OpenRPC schema for this JSON-RPC API", + "params": [], + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:rpc:discover" + ] + } + ], + "result": { + "name": "OpenRPC Schema", + "schema": { + "type": "object" + } + }, + "examples": [ + { + "name": "Default", + "params": [], + "result": { + "name": "schema", + "value": {} + } + } + ] + }, + { + "name": "Internal.initialize", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:initialize" + ] + } + ], + "summary": "Initialize the SDK / FEE session.", + "description": "A single version of the Firebolt SDK is compiled into each app. When an app starts up, the SDK **MUST** call this method as soon as possible and **before** any other JSON-RPC methods are sent.", + "params": [ + { + "name": "version", + "required": true, + "schema": { + "$ref": "#/x-schemas/Types/SemanticVersion" + }, + "summary": "The semantic version of the SDK." + } + ], + "result": { + "name": "session", + "summary": "Info about the SDK/FEE session", + "schema": { + "$ref": "#/components/schemas/InitializeResult" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "version", + "value": { + "major": 1, + "minor": 0, + "patch": 0, + "readable": "Firebolt SDK 1.0.0" + } + } + ], + "result": { + "name": "Default Result", + "value": { + "version": { + "major": 1, + "minor": 0, + "patch": 0, + "readable": "Firebolt FEE 1.0.0" + } + } + } + } + ] + }, + { + "name": "Accessibility.closedCaptions", + "summary": "Get the user's preferred closed-captions settings", + "params": [], + "tags": [ + { + "name": "deprecated", + "x-alternative": "Accessibility.closedCaptionsSettings()", + "x-since": "0.6.0" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "closedCaptionsSettings", + "summary": "the closed captions settings", + "schema": { + "$ref": "#/x-schemas/Accessibility/ClosedCaptionsSettings" + } + }, + "examples": [ + { + "name": "Getting the closed captions settings", + "params": [], + "result": { + "name": "settings", + "value": { + "enabled": true, + "styles": { + "fontFamily": "monospaced_sanserif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] + } + } + } + ] + }, + { + "name": "Accessibility.closedCaptionsSettings", + "summary": "Get the user's preferred closed-captions settings", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "closedCaptionsSettings", + "summary": "the closed captions settings", + "schema": { + "$ref": "#/x-schemas/Accessibility/ClosedCaptionsSettings" + } + }, + "examples": [ + { + "name": "Getting the closed captions settings", + "params": [], + "result": { + "name": "settings", + "value": { + "enabled": true, + "styles": { + "fontFamily": "monospaced_sanserif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] + } + } + } + ] + }, + { + "name": "Accessibility.voiceGuidance", + "summary": "Get the user's preferred voice guidance settings", + "params": [], + "tags": [ + { + "name": "deprecated", + "x-alternative": "Accessibility.voiceGuidanceSettings()", + "x-since": "0.6.0" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "result": { + "name": "settings", + "summary": "the voice guidance settings", + "schema": { + "$ref": "#/x-schemas/Accessibility/VoiceGuidanceSettings" + } + }, + "examples": [ + { + "name": "Getting the voice guidance settings", + "params": [], + "result": { + "name": "Default Result", + "value": { + "enabled": true, + "speed": 2 + } + } + } + ] + }, + { + "name": "Accessibility.voiceGuidanceSettings", + "summary": "Get the user's preferred voice guidance settings", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "result": { + "name": "settings", + "summary": "the voice guidance settings", + "schema": { + "$ref": "#/x-schemas/Accessibility/VoiceGuidanceSettings" + } + }, + "examples": [ + { + "name": "Getting the voice guidance settings", + "params": [], + "result": { + "name": "Default Result", + "value": { + "enabled": true, + "speed": 2 + } + } + } + ] + }, + { + "name": "Accessibility.audioDescriptionSettings", + "summary": "Get the user's preferred audio description settings", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:audiodescriptions" + ] + } + ], + "result": { + "name": "settings", + "summary": "the audio description settings", + "schema": { + "$ref": "#/components/schemas/AudioDescriptionSettings" + } + }, + "examples": [ + { + "name": "Getting the audio description settings", + "params": [], + "result": { + "name": "Default Result", + "value": { + "enabled": true + } + } + } + ] + }, + { + "name": "Accessibility.onClosedCaptionsSettingsChanged", + "summary": "Get the user's preferred closed-captions settings", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Accessibility.closedCaptionsSettings" + }, + { + "name": "event", + "x-alternative": "closedCaptionsSettings" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "closedCaptionsSettings", + "summary": "the closed captions settings", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/ClosedCaptionsSettings" + } + ] + } + }, + "examples": [ + { + "name": "Getting the closed captions settings", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "settings", + "value": { + "enabled": true, + "styles": { + "fontFamily": "monospaced_sanserif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] + } + } + } + ] + }, + { + "name": "Accessibility.onVoiceGuidanceSettingsChanged", + "summary": "Get the user's preferred voice guidance settings", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Accessibility.voiceGuidanceSettings" + }, + { + "name": "event", + "x-alternative": "voiceGuidanceSettings" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "result": { + "name": "settings", + "summary": "the voice guidance settings", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/VoiceGuidanceSettings" + } + ] + } + }, + "examples": [ + { + "name": "Getting the voice guidance settings", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "enabled": true, + "speed": 2 + } + } + } + ] + }, + { + "name": "Accessibility.onAudioDescriptionSettingsChanged", + "summary": "Get the user's preferred audio description settings", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Accessibility.audioDescriptionSettings" + }, + { + "name": "event", + "x-alternative": "audioDescriptionSettings" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:audiodescriptions" + ] + } + ], + "result": { + "name": "settings", + "summary": "the audio description settings", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/AudioDescriptionSettings" + } + ] + } + }, + "examples": [ + { + "name": "Getting the audio description settings", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "enabled": true + } + } + } + ] + }, + { + "name": "Account.id", + "summary": "Get the platform back-office account identifier", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:account:id" + ] + } + ], + "result": { + "name": "id", + "summary": "the id", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "123" + } + } + ] + }, + { + "name": "Account.uid", + "summary": "Gets a unique id for the current app & account", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:account:uid" + ] + } + ], + "result": { + "name": "uniqueId", + "summary": "a unique ID", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the unique ID", + "params": [], + "result": { + "name": "Default Result", + "value": "ee6723b8-7ab3-462c-8d93-dbf61227998e" + } + } + ] + }, + { + "name": "Account.session", + "summary": "Used by a distributor to push Session token to firebolt.", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:token:account" + ] + } + ], + "params": [ + { + "name": "token", + "required": true, + "schema": { + "$ref": "#/components/schemas/Token" + } + }, + { + "name": "expiresIn", + "required": true, + "schema": { + "$ref": "#/components/schemas/Expiry" + } + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "token", + "value": "RmlyZWJvbHQgTWFuYWdlIFNESyBSb2NrcyEhIQ==" + }, + { + "name": "expiresIn", + "value": 84000 + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "AcknowledgeChallenge.onRequestChallenge", + "summary": "Registers as a provider for when the user should be challenged in order to confirm access to a capability", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response": { + "$ref": "#/components/schemas/GrantResult" + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:acknowledgechallenge", + "x-allow-focus": true + } + ], + "result": { + "name": "challenge", + "summary": "The request to challenge the user", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/ChallengeProviderRequest" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "correlationId": "abc", + "parameters": { + "capability": "xrn:firebolt:capability:localization::postal-code", + "requestor": { + "id": "ReferenceApp", + "name": "Firebolt Reference App" + } + } + } + } + } + ] + }, + { + "name": "AcknowledgeChallenge.challengeFocus", + "summary": "Internal API for Challenge Provider to request focus for UX purposes.", + "params": [], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:acknowledgechallenge", + "x-allow-focus": true, + "x-allow-focus-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "AcknowledgeChallenge.challengeResponse", + "summary": "Internal API for Challenge Provider to send back response.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "$ref": "#/components/schemas/GrantResult" + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:acknowledgechallenge", + "x-allow-focus": true, + "x-response-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example #1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": true + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Example #2", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": false + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Example #3", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": null + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "AcknowledgeChallenge.challengeError", + "summary": "Internal API for Challenge Provider to send back error.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:acknowledgechallenge", + "x-allow-focus": true, + "x-error-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Advertising.config", + "summary": "Build configuration object for Ad Framework initialization", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "params": [ + { + "name": "options", + "summary": "Configuration options", + "required": true, + "schema": { + "$ref": "#/components/schemas/AdConfigurationOptions" + } + } + ], + "result": { + "name": "adFrameworkConfig", + "summary": "the ad framework config", + "schema": { + "type": "object", + "description": "An opaque object represneting the AdConfiguration" + } + }, + "examples": [ + { + "name": "Initializing the Ad Framework", + "params": [ + { + "name": "options", + "value": { + "environment": "prod", + "authenticationEntity": "MVPD" + } + } + ], + "result": { + "name": "Default Result", + "value": { + "adServerUrl": "https://demo.v.fwmrm.net/ad/p/1", + "adServerUrlTemplate": "https://demo.v.fwmrm.net/ad/p/1?flag=+sltp+exvt+slcb+emcr+amcb+aeti&prof=12345:caf_allinone_profile &nw=12345&mode=live&vdur=123&caid=a110523018&asnw=372464&csid=gmott_ios_tablet_watch_live_ESPNU&ssnw=372464&vip=198.205.92.1&resp=vmap1&metr=1031&pvrn=12345&vprn=12345&vcid=1X0Ce7L3xRWlTeNhc7br8Q%3D%3D", + "adNetworkId": "519178", + "adProfileId": "12345:caf_allinone_profile", + "adSiteSectionId": "caf_allinone_profile_section", + "adOptOut": true, + "privacyData": "ew0KICAicGR0IjogImdkcDp2MSIsDQogICJ1c19wcml2YWN5IjogIjEtTi0iLA0KICAibG10IjogIjEiIA0KfQ0K", + "ifaValue": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa": "ewogICJ2YWx1ZSI6ICIwMTIzNDU2Ny04OUFCLUNERUYtR0gwMS0yMzQ1Njc4OUFCQ0QiLAogICJpZmFfdHlwZSI6ICJzc3BpZCIsCiAgImxtdCI6ICIwIgp9Cg==", + "appName": "FutureToday", + "appBundleId": "FutureToday.comcast", + "distributorAppId": "1001", + "deviceAdAttributes": "ewogICJib0F0dHJpYnV0ZXNGb3JSZXZTaGFyZUlkIjogIjEyMzQiCn0=", + "coppa": 0, + "authenticationEntity": "60f72475281cfba3852413bd53e957f6" + } + } + } + ] + }, + { + "name": "Advertising.policy", + "summary": "Get the advertising privacy and playback policy", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:policy" + ] + } + ], + "result": { + "name": "adPolicy", + "summary": "the ad policy", + "schema": { + "$ref": "#/components/schemas/AdPolicy" + } + }, + "examples": [ + { + "name": "Getting the advertising policy settings", + "params": [], + "result": { + "name": "Default Result", + "value": { + "skipRestriction": "adsUnwatched", + "limitAdTracking": false + } + } + } + ] + }, + { + "name": "Advertising.skipRestriction", + "summary": "Set the value for AdPolicy.skipRestriction", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "params": [], + "result": { + "name": "result", + "schema": { + "$ref": "#/x-schemas/Advertising/SkipRestriction" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "result", + "value": "none" + } + }, + { + "name": "Additional Example", + "params": [], + "result": { + "name": "result", + "value": "all" + } + } + ] + }, + { + "name": "Advertising.advertisingId", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:identifier" + ] + } + ], + "summary": "Get the IAB compliant identifier for advertising (IFA). It is recommended to use the IFA to manage advertising related activities while respecting the user's privacy settings.", + "params": [ + { + "name": "options", + "summary": "AdvertisingId options", + "required": false, + "schema": { + "$ref": "#/components/schemas/AdvertisingIdOptions" + } + } + ], + "result": { + "name": "advertisingId", + "summary": "the advertising ID", + "schema": { + "$ref": "#/components/schemas/AdvertisingIdResult" + } + }, + "examples": [ + { + "name": "Getting the advertising ID", + "params": [], + "result": { + "name": "Default Result", + "value": { + "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa_type": "sspid", + "lmt": "0" + } + } + }, + { + "name": "Getting the advertising ID with scope browse", + "params": [ + { + "name": "options", + "value": { + "scope": { + "type": "browse", + "id": "paidPlacement" + } + } + } + ], + "result": { + "name": "Default Result", + "value": { + "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa_type": "sspid", + "lmt": "0" + } + } + }, + { + "name": "Getting the advertising ID with scope content", + "params": [ + { + "name": "options", + "value": { + "scope": { + "type": "content", + "id": "metadata:linear:station:123" + } + } + } + ], + "result": { + "name": "Default Result", + "value": { + "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa_type": "idfa", + "lmt": "0" + } + } + } + ] + }, + { + "name": "Advertising.deviceAttributes", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "summary": "Get the device advertising device attributes", + "params": [], + "result": { + "name": "deviceAttributes", + "summary": "the device attributes", + "schema": { + "type": "object" + } + }, + "examples": [ + { + "name": "Getting the device attributes", + "params": [], + "result": { + "name": "Default Result", + "value": {} + } + } + ] + }, + { + "name": "Advertising.appBundleId", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "summary": "Get the App's Bundle ID", + "params": [], + "result": { + "name": "appBundleId", + "summary": "the app bundle ID", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "app.operator" + } + } + ] + }, + { + "name": "Advertising.resetIdentifier", + "summary": "Resets a user's identifier in the ad platform so that the advertising id that apps get will be a new value", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:advertising:identifier" + ] + } + ], + "params": [], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "Advertising.onSkipRestrictionChanged", + "summary": "Set the value for AdPolicy.skipRestriction", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Advertising.skipRestriction" + }, + { + "name": "event", + "x-alternative": "skipRestriction" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "result", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Advertising/SkipRestriction" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": "none" + } + }, + { + "name": "Additional Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": "all" + } + } + ] + }, + { + "name": "Advertising.onPolicyChanged", + "summary": "Get the advertising privacy and playback policy", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Advertising.policy" + }, + { + "name": "event", + "x-alternative": "policy" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:policy" + ] + } + ], + "result": { + "name": "adPolicy", + "summary": "the ad policy", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/AdPolicy" + } + ] + } + }, + "examples": [ + { + "name": "Getting the advertising policy settings", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "skipRestriction": "adsUnwatched", + "limitAdTracking": false + } + } + } + ] + }, + { + "name": "Advertising.setSkipRestriction", + "summary": "Set the value for AdPolicy.skipRestriction", + "tags": [ + { + "name": "setter", + "x-setter-for": "skipRestriction" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Advertising/SkipRestriction" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": "none" + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Additional Example", + "params": [ + { + "name": "value", + "value": "all" + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "AudioDescriptions.enabled", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:audiodescriptions" + ] + } + ], + "summary": "Whether or not audio-descriptions are enabled.", + "params": [], + "result": { + "name": "enabled", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "AudioDescriptions.onEnabledChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "AudioDescriptions.enabled" + }, + { + "name": "event", + "x-alternative": "enabled" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:audiodescriptions" + ] + } + ], + "summary": "Whether or not audio-descriptions are enabled.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "enabled", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "AudioDescriptions.setEnabled", + "tags": [ + { + "name": "setter", + "x-setter-for": "enabled" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:audiodescriptions" + ] + } + ], + "summary": "Whether or not audio-descriptions are enabled.", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "enabled", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "enabled", + "value": null + } + } + ] + }, + { + "name": "Authentication.token", + "summary": "Get a specific `type` of authentication token", + "tags": [ + { + "name": "deprecated", + "x-alternative": "Authentication module has individual methods for each token type.", + "x-since": "0.9.0" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:token:platform" + ] + } + ], + "params": [ + { + "name": "type", + "summary": "What type of token to get", + "schema": { + "$ref": "#/components/schemas/TokenType" + }, + "required": true + }, + { + "name": "options", + "summary": "Additional options for acquiring the token.", + "schema": { + "type": "object" + }, + "required": false + } + ], + "result": { + "name": "token", + "summary": "the token value, type, and expiration", + "schema": { + "$ref": "#/components/schemas/AuthenticationTokenResult" + } + }, + "examples": [ + { + "name": "Acquire a Firebolt platform token", + "params": [ + { + "name": "type", + "value": "platform" + } + ], + "result": { + "name": "token", + "value": { + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "expires": "2022-04-23T18:25:43.511Z", + "type": "platform" + } + } + }, + { + "name": "Acquire a Firebolt device identity token", + "params": [ + { + "name": "type", + "value": "device" + } + ], + "result": { + "name": "token", + "value": { + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "expires": "2022-04-23T18:25:43.511Z", + "type": "device" + } + } + }, + { + "name": "Acquire a Firebolt distributor token", + "params": [ + { + "name": "type", + "value": "distributor" + }, + { + "name": "options", + "value": { + "clientId": "xyz" + } + } + ], + "result": { + "name": "token", + "value": { + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c", + "expires": "2022-04-23T18:25:43.511Z", + "type": "distributor", + "data": { + "tid": "EB00E9230AB2A35F57DB4EFDDC4908F6446D38F08F4FF0BD57FE6A61E21EEFD9", + "scope": "scope" + } + } + } + } + ] + }, + { + "name": "Authentication.device", + "summary": "Get a device token scoped to the current app.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:token:device" + ] + } + ], + "params": [], + "result": { + "name": "token", + "summary": "the token value and expiration", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Acquire a Firebolt device identity token", + "params": [], + "result": { + "name": "token", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + } + ] + }, + { + "name": "Authentication.session", + "summary": "Get a destributor session token.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:token:session" + ] + } + ], + "params": [], + "result": { + "name": "token", + "summary": "the token value", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Acquire a distributor session token", + "params": [], + "result": { + "name": "token", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + } + ] + }, + { + "name": "Authentication.root", + "summary": "Get a root device token.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:token:root" + ] + } + ], + "params": [], + "result": { + "name": "token", + "summary": "the token value", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Acquire a Firebolt root device identity token", + "params": [], + "result": { + "name": "token", + "value": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + } + } + ] + }, + { + "name": "Capabilities.supported", + "summary": "Returns whether the platform supports the passed capability.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + } + ], + "result": { + "name": "supported", + "summary": "Whether or not capability is supported in device.", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Wifi scan supported capability", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:wifi:scan" + } + ], + "result": { + "name": "Default Result", + "value": true + } + }, + { + "name": "BLE protocol unsupported capability", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:protocol:bluetoothle" + } + ], + "result": { + "name": "Default Result", + "value": false + } + } + ] + }, + { + "name": "Capabilities.available", + "summary": "Returns whether a capability is available now.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + } + ], + "result": { + "name": "available", + "summary": "Whether or not capability is available now.", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Device Token.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:token:device" + } + ], + "result": { + "name": "Default Result", + "value": true + } + }, + { + "name": "Unavailable Platform token.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:token:platform" + } + ], + "result": { + "name": "Default Result", + "value": false + } + } + ] + }, + { + "name": "Capabilities.permitted", + "summary": "Returns whether the current App has permission to the passed capability and role.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "options", + "summary": "Capability options", + "schema": { + "$ref": "#/components/schemas/CapabilityOption" + } + } + ], + "result": { + "name": "permitted", + "summary": "Whether or not app is permitted for the given capability and the role", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Keyboard", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:input:keyboard" + } + ], + "result": { + "name": "Default Result", + "value": true + } + }, + { + "name": "Keyboard incorrect manage role capability", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:input:keyboard" + }, + { + "name": "options", + "value": { + "role": "manage" + } + } + ], + "result": { + "name": "Default Result", + "value": false + } + }, + { + "name": "Wifi scan not permitted capability", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:wifi:scan" + } + ], + "result": { + "name": "Default Result", + "value": false + } + } + ] + }, + { + "name": "Capabilities.granted", + "summary": "Returns whether the current App has a user grant for passed capability and role.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "options", + "summary": "Capability options", + "schema": { + "$ref": "#/components/schemas/CapabilityOption" + } + } + ], + "result": { + "name": "granted", + "summary": "Whether or not app is granted to use the given capability and the role", + "schema": { + "oneOf": [ + { + "type": "boolean" + }, + { + "const": null + } + ] + } + }, + "examples": [ + { + "name": "Default capabilities without grants.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:input:keyboard" + } + ], + "result": { + "name": "Default Result", + "value": true + } + }, + { + "name": "Get Postal code without grants.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + } + ], + "result": { + "name": "Default Result", + "value": false + } + }, + { + "name": "Get Postal code with grants.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Capabilities.info", + "summary": "Returns an array of CapabilityInfo objects for the passed in capabilities.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "params": [ + { + "name": "capabilities", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "minItems": 1 + } + } + ], + "result": { + "name": "info", + "summary": "Returns an array of CapabilityInfo objects for the passed in capabilities.", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + }, + "minItems": 1 + } + }, + "examples": [ + { + "name": "Default result", + "params": [ + { + "name": "capabilities", + "value": [ + "xrn:firebolt:capability:device:model", + "xrn:firebolt:capability:input:keyboard", + "xrn:firebolt:capability:protocol:bluetoothle", + "xrn:firebolt:capability:token:device", + "xrn:firebolt:capability:token:platform", + "xrn:firebolt:capability:protocol:moca", + "xrn:firebolt:capability:wifi:scan", + "xrn:firebolt:capability:localization:postal-code", + "xrn:firebolt:capability:localization:locality" + ] + } + ], + "result": { + "name": "Default Result", + "value": [ + { + "capability": "xrn:firebolt:capability:device:model", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + }, + { + "capability": "xrn:firebolt:capability:input:keyboard", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + }, + { + "capability": "xrn:firebolt:capability:protocol:bluetoothle", + "supported": false, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unsupported" + ] + }, + { + "capability": "xrn:firebolt:capability:token:device", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + }, + { + "capability": "xrn:firebolt:capability:token:platform", + "supported": true, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unavailable" + ] + }, + { + "capability": "xrn:firebolt:capability:protocol:moca", + "supported": true, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "disabled", + "unavailable" + ] + }, + { + "capability": "xrn:firebolt:capability:wifi:scan", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unpermitted" + ] + }, + { + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": null + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "ungranted" + ] + }, + { + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "ungranted" + ] + }, + { + "capability": "xrn:firebolt:capability:localization:locality", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "grantDenied", + "ungranted" + ] + } + ] + } + } + ] + }, + { + "name": "Capabilities.request", + "summary": "Requests grants for all capability/role combinations in the roles array.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:request" + ] + } + ], + "params": [ + { + "name": "grants", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/Permission" + }, + "minItems": 1 + } + } + ], + "result": { + "name": "request", + "summary": "Returns an array of CapabilityInfo objects for the passed in capabilities.", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + }, + "minItems": 1 + } + }, + "examples": [ + { + "name": "Default result", + "params": [ + { + "name": "grants", + "value": [ + { + "role": "use", + "capability": "xrn:firebolt:capability:commerce:purchase" + } + ] + } + ], + "result": { + "name": "Default Result", + "value": [ + { + "capability": "xrn:firebolt:capability:commerce:purchase", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + } + ] + } + } + ] + }, + { + "name": "Capabilities.onAvailable", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "summary": "Listens for all App permitted capabilities to become available.", + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "Provides the capability info.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + } + ] + } + }, + "examples": [ + { + "name": "Platform token is available", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:token:platform" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default result", + "value": { + "capability": "xrn:firebolt:capability:token:platform", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unpermitted" + ] + } + } + } + ] + }, + { + "name": "Capabilities.onUnavailable", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "summary": "Listens for all App permitted capabilities to become unavailable.", + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "Provides the capability info.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + } + ] + } + }, + "examples": [ + { + "name": "Platform token is unavailable.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:token:platform" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "capability": "xrn:firebolt:capability:token:platform", + "supported": true, + "available": false, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "unavailable" + ] + } + } + } + ] + }, + { + "name": "Capabilities.onGranted", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "summary": "Listens for all App permitted capabilities to become granted.", + "params": [ + { + "name": "role", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Role" + } + }, + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "Provides the capability info.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + } + ] + } + }, + "examples": [ + { + "name": "Postal code granted", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + } + } + } + ] + }, + { + "name": "Capabilities.onRevoked", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:capabilities:info" + ] + } + ], + "summary": "Listens for all App permitted capabilities to become revoked.", + "params": [ + { + "name": "role", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Role" + } + }, + { + "name": "capability", + "required": true, + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "Provides the capability info.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Capabilities/CapabilityInfo" + } + ] + } + }, + "examples": [ + { + "name": "Postal code revoked", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "capability": "xrn:firebolt:capability:localization:postal-code", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + }, + "details": [ + "grantDenied" + ] + } + } + } + ] + }, + { + "name": "ClosedCaptions.enabled", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "Whether or not closed-captions are enabled.", + "params": [], + "result": { + "name": "enabled", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "ClosedCaptions.fontFamily", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font family for displaying closed-captions.", + "params": [], + "result": { + "name": "family", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontFamily" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "family", + "value": "monospaced_sanserif" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "family", + "value": "cursive" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "family", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.fontSize", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font size for displaying closed-captions.", + "params": [], + "result": { + "name": "size", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontSize" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "size", + "value": 1 + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "size", + "value": 1 + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "size", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.fontColor", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font color for displaying closed-captions.", + "params": [], + "result": { + "name": "color", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.fontEdge", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge style for displaying closed-captions.", + "params": [], + "result": { + "name": "edge", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontEdge" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "edge", + "value": "none" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "edge", + "value": "uniform" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "edge", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.fontEdgeColor", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge color for displaying closed-captions.", + "params": [], + "result": { + "name": "color", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.fontOpacity", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions characters.", + "params": [], + "result": { + "name": "opacity", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.backgroundColor", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred background color for displaying closed-captions, .", + "params": [], + "result": { + "name": "color", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.backgroundOpacity", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions backgrounds.", + "params": [], + "result": { + "name": "opacity", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.textAlign", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [], + "result": { + "name": "alignment", + "schema": { + "$ref": "#/x-schemas/Accessibility/HorizontalAlignment" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "alignment", + "value": "center" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "alignment", + "value": "left" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.textAlignVertical", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [], + "result": { + "name": "alignment", + "schema": { + "$ref": "#/x-schemas/Accessibility/VerticalAlignment" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "alignment", + "value": "middle" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "alignment", + "value": "top" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.windowColor", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window color for displaying closed-captions, .", + "params": [], + "result": { + "name": "color", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "color", + "value": "white" + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.windowOpacity", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window opacity for displaying closed-captions backgrounds.", + "params": [], + "result": { + "name": "opacity", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.preferredLanguages", + "summary": "A prioritized list of ISO 639-2/B codes for the preferred closed captions languages on this device.", + "params": [], + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "languages", + "summary": "the preferred closed captions languages", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": [ + "spa", + "eng" + ] + } + }, + { + "name": "Default Example #2", + "params": [], + "result": { + "name": "Default Result", + "value": [ + "eng", + "spa" + ] + } + } + ] + }, + { + "name": "ClosedCaptions.onEnabledChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.enabled" + }, + { + "name": "event", + "x-alternative": "enabled" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "Whether or not closed-captions are enabled.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "enabled", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "ClosedCaptions.onFontFamilyChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontFamily" + }, + { + "name": "event", + "x-alternative": "fontFamily" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font family for displaying closed-captions.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "family", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/FontFamily" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "family", + "value": "monospaced_sanserif" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "family", + "value": "cursive" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "family", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onFontSizeChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontSize" + }, + { + "name": "event", + "x-alternative": "fontSize" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font size for displaying closed-captions.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "size", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/FontSize" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "size", + "value": 1 + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "size", + "value": 1 + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "size", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onFontColorChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontColor" + }, + { + "name": "event", + "x-alternative": "fontColor" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font color for displaying closed-captions.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "color", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Color" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onFontEdgeChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontEdge" + }, + { + "name": "event", + "x-alternative": "fontEdge" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge style for displaying closed-captions.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "edge", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/FontEdge" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "edge", + "value": "none" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "edge", + "value": "uniform" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "edge", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onFontEdgeColorChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontEdgeColor" + }, + { + "name": "event", + "x-alternative": "fontEdgeColor" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge color for displaying closed-captions.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "color", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Color" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onFontOpacityChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.fontOpacity" + }, + { + "name": "event", + "x-alternative": "fontOpacity" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions characters.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "opacity", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onBackgroundColorChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.backgroundColor" + }, + { + "name": "event", + "x-alternative": "backgroundColor" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred background color for displaying closed-captions, .", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "color", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Color" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#ffffff" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onBackgroundOpacityChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.backgroundOpacity" + }, + { + "name": "event", + "x-alternative": "backgroundOpacity" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions backgrounds.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "opacity", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onTextAlignChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.textAlign" + }, + { + "name": "event", + "x-alternative": "textAlign" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "alignment", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/HorizontalAlignment" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": "center" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": "left" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onTextAlignVerticalChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.textAlignVertical" + }, + { + "name": "event", + "x-alternative": "textAlignVertical" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "alignment", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/VerticalAlignment" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": "middle" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": "top" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onWindowColorChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.windowColor" + }, + { + "name": "event", + "x-alternative": "windowColor" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window color for displaying closed-captions, .", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "color", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Color" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "#000000" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": "white" + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onWindowOpacityChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.windowOpacity" + }, + { + "name": "event", + "x-alternative": "windowOpacity" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window opacity for displaying closed-captions backgrounds.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "opacity", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 99 + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": 100 + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.onPreferredLanguagesChanged", + "summary": "A prioritized list of ISO 639-2/B codes for the preferred closed captions languages on this device.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "ClosedCaptions.preferredLanguages" + }, + { + "name": "event", + "x-alternative": "preferredLanguages" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "languages", + "summary": "the preferred closed captions languages", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + "spa", + "eng" + ] + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + "eng", + "spa" + ] + } + } + ] + }, + { + "name": "ClosedCaptions.setEnabled", + "tags": [ + { + "name": "setter", + "x-setter-for": "enabled" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "Whether or not closed-captions are enabled.", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "enabled", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "enabled", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontFamily", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontFamily" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font family for displaying closed-captions.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontFamily" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "monospaced_sanserif" + } + ], + "result": { + "name": "family", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "cursive" + } + ], + "result": { + "name": "family", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "family", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontSize", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontSize" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font size for displaying closed-captions.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontSize" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": 1 + } + ], + "result": { + "name": "size", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": 1 + } + ], + "result": { + "name": "size", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "size", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontColor", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontColor" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font color for displaying closed-captions.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "#ffffff" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "#000000" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontEdge", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontEdge" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge style for displaying closed-captions.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/FontEdge" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "none" + } + ], + "result": { + "name": "edge", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "uniform" + } + ], + "result": { + "name": "edge", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "edge", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontEdgeColor", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontEdgeColor" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred font edge color for displaying closed-captions.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "#000000" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "#ffffff" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setFontOpacity", + "tags": [ + { + "name": "setter", + "x-setter-for": "fontOpacity" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions characters.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": 99 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": 100 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setBackgroundColor", + "tags": [ + { + "name": "setter", + "x-setter-for": "backgroundColor" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred background color for displaying closed-captions, .", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "#000000" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "#ffffff" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setBackgroundOpacity", + "tags": [ + { + "name": "setter", + "x-setter-for": "backgroundOpacity" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred opacity for displaying closed-captions backgrounds.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": 99 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": 100 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setTextAlign", + "tags": [ + { + "name": "setter", + "x-setter-for": "textAlign" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/HorizontalAlignment" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "center" + } + ], + "result": { + "name": "alignment", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "left" + } + ], + "result": { + "name": "alignment", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setTextAlignVertical", + "tags": [ + { + "name": "setter", + "x-setter-for": "textAlignVertical" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred horizontal alignment for displaying closed-captions characters.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/VerticalAlignment" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "middle" + } + ], + "result": { + "name": "alignment", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "top" + } + ], + "result": { + "name": "alignment", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "alignment", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setWindowColor", + "tags": [ + { + "name": "setter", + "x-setter-for": "windowColor" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window color for displaying closed-captions, .", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "#000000" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "white" + } + ], + "result": { + "name": "color", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "color", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setWindowOpacity", + "tags": [ + { + "name": "setter", + "x-setter-for": "windowOpacity" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "summary": "The preferred window opacity for displaying closed-captions backgrounds.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": 99 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": 100 + } + ], + "result": { + "name": "opacity", + "value": null + } + }, + { + "name": "Default example #3", + "params": [ + { + "name": "value", + "value": null + } + ], + "result": { + "name": "opacity", + "value": null + } + } + ] + }, + { + "name": "ClosedCaptions.setPreferredLanguages", + "summary": "A prioritized list of ISO 639-2/B codes for the preferred closed captions languages on this device.", + "params": [ + { + "name": "value", + "summary": "the preferred closed captions languages", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + }, + "required": true + } + ], + "tags": [ + { + "name": "setter", + "x-setter-for": "preferredLanguages" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:closedcaptions" + ] + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": [ + "spa", + "eng" + ] + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "value", + "value": [ + "eng", + "spa" + ] + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Content.requestUserInterest", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Discovery.onRequestUserInterest", + "x-uses": [ + "xrn:firebolt:capability:discovery:interest" + ] + } + ], + "summary": "Provide information about the entity currently displayed or selected on the screen.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [ + { + "name": "type", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/InterestType" + } + }, + { + "name": "reason", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/InterestReason" + } + } + ], + "result": { + "name": "interest", + "schema": { + "$ref": "#/components/schemas/InterestResult" + }, + "summary": "The EntityDetails data." + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "type", + "value": "interest" + }, + { + "name": "reason", + "value": "playlist" + } + ], + "result": { + "name": "interest", + "value": { + "appId": "cool-app", + "entity": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + } + } + } + ] + }, + { + "name": "Content.onUserInterest", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-provided-by": "Discovery.userInterest", + "x-uses": [ + "xrn:firebolt:capability:discovery:interest" + ] + } + ], + "summary": "Provide information about the entity currently displayed or selected on the screen.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "interest", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/InterestEvent" + } + ] + }, + "summary": "The EntityDetails data." + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "interest", + "value": { + "appId": "cool-app", + "type": "interest", + "reason": "playlist", + "entity": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + } + } + } + ] + }, + { + "name": "Device.id", + "summary": "Get the platform back-office device identifier", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:id" + ] + } + ], + "result": { + "name": "id", + "summary": "the id", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "123" + } + } + ] + }, + { + "name": "Device.distributor", + "summary": "Get the name of the entity which is distributing the current device. There can be multiple distributors which distribute the same device model.", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:distributor" + ] + } + ], + "result": { + "name": "distributorId", + "summary": "the distributor ID", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the distributor ID", + "params": [], + "result": { + "name": "Default Result", + "value": "Company" + } + } + ] + }, + { + "name": "Device.platform", + "summary": "Get a platform identifier for the device. This API should be used to correlate metrics on the device only and cannot be guaranteed to have consistent responses across platforms.", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "platformId", + "summary": "the platform ID", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the platform ID", + "params": [], + "result": { + "name": "Default Result", + "value": "WPE" + } + } + ] + }, + { + "name": "Device.uid", + "summary": "Gets a unique id for the current app & device", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:uid" + ] + } + ], + "result": { + "name": "uniqueId", + "summary": "a unique ID", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the unique ID", + "params": [], + "result": { + "name": "Default Result", + "value": "ee6723b8-7ab3-462c-8d93-dbf61227998e" + } + } + ] + }, + { + "name": "Device.type", + "summary": "Get the device type", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "deviceType", + "summary": "the device type", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the device type", + "params": [], + "result": { + "name": "Default Result", + "value": "STB" + } + } + ] + }, + { + "name": "Device.model", + "summary": "Get the manufacturer designated model of the device", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:model" + ] + } + ], + "result": { + "name": "model", + "summary": "the device model", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the device model", + "params": [], + "result": { + "name": "Default Result", + "value": "xi6" + } + } + ] + }, + { + "name": "Device.sku", + "summary": "Get the device sku", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:sku" + ] + } + ], + "result": { + "name": "sku", + "summary": "the device sku", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the device sku", + "params": [], + "result": { + "name": "Default Result", + "value": "AX061AEI" + } + } + ] + }, + { + "name": "Device.make", + "summary": "Get the manufacturer of the device model", + "params": [], + "tags": [ + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:make" + ] + } + ], + "result": { + "name": "make", + "summary": "the device make", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Getting the device make", + "params": [], + "result": { + "name": "Default Result", + "value": "Arris" + } + } + ] + }, + { + "name": "Device.version", + "summary": "Get the SDK, OS and other version info", + "params": [], + "tags": [ + { + "name": "exclude-from-sdk" + }, + { + "name": "property:immutable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "versions", + "summary": "the versions", + "schema": { + "$ref": "#/components/schemas/DeviceVersion" + } + }, + "examples": [ + { + "name": "Getting the os and sdk versions", + "params": [], + "result": { + "name": "Default Result", + "value": { + "sdk": { + "major": 0, + "minor": 8, + "patch": 0, + "readable": "Firebolt JS SDK v0.8.0" + }, + "api": { + "major": 0, + "minor": 8, + "patch": 0, + "readable": "Firebolt API v0.8.0" + }, + "firmware": { + "major": 1, + "minor": 2, + "patch": 3, + "readable": "Device Firmware v1.2.3" + }, + "os": { + "major": 0, + "minor": 1, + "patch": 0, + "readable": "Firebolt OS v0.1.0" + }, + "debug": "Non-parsable build info for error logging only." + } + } + } + ] + }, + { + "name": "Device.hdcp", + "summary": "Get the negotiated HDCP profiles for a connected device. \n\n For devices that do not require additional connections (e.g. panels), `true` will be returned for all profiles.", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "negotiatedHdcpVersions", + "summary": "the negotiated HDCP versions", + "schema": { + "$ref": "#/components/schemas/HDCPVersionMap" + } + }, + "examples": [ + { + "name": "Getting the negotiated HDCP versions", + "params": [], + "result": { + "name": "Default Result", + "value": { + "hdcp1.4": true, + "hdcp2.2": true + } + } + } + ] + }, + { + "name": "Device.hdr", + "summary": "Get the negotiated HDR formats for the connected display and device", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "negotiatedHdrFormats", + "summary": "the negotiated HDR formats", + "schema": { + "$ref": "#/components/schemas/HDRFormatMap" + } + }, + "examples": [ + { + "name": "Getting the negotiated HDR formats", + "params": [], + "result": { + "name": "Default Result", + "value": { + "hdr10": true, + "hdr10Plus": true, + "dolbyVision": true, + "hlg": true + } + } + } + ] + }, + { + "name": "Device.audio", + "summary": "Get the supported audio profiles for the connected devices. \n\n It is not recommended to use this API for visual badging on content within your app since this does not reflect the settings of the user.", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "supportedAudioProfiles", + "summary": "the supported audio profiles", + "schema": { + "$ref": "#/components/schemas/AudioProfiles" + } + }, + "examples": [ + { + "name": "Getting the supported audio profiles", + "params": [], + "result": { + "name": "Default Result", + "value": { + "stereo": true, + "dolbyDigital5.1": true, + "dolbyDigital5.1+": true, + "dolbyAtmos": true + } + } + } + ] + }, + { + "name": "Device.screenResolution", + "summary": "Get the resolution for the graphical surface of the app. \n\nThe pairs returned will be of a [width, height] format and will correspond to the following values: \n\nNTSC Standard Definition (SD): [720, 480] \n\nPAL Standard Definition (SD): [720, 576] \n\nHigh Definition (HD): [1280, 720] \n\nFull HD (FHD): [1920, 1080]\n\n4K Ultra High Definition (UHD): [3840, 2160] \n\n**Deprecated:** Use non-Firebolt APIs specific to your platform, e.g. W3C APIs", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + }, + { + "name": "deprecated", + "x-alternative": "Use non-Firebolt APIs specific to your platform, e.g. W3C APIs", + "x-since": "1.4.0" + } + ], + "result": { + "name": "screenResolution", + "summary": "the resolution", + "schema": { + "$ref": "#/components/schemas/Resolution" + } + }, + "examples": [ + { + "name": "Getting the screen resolution", + "params": [], + "result": { + "name": "Default Result", + "value": [ + 1920, + 1080 + ] + } + } + ] + }, + { + "name": "Device.videoResolution", + "summary": "Get the maximum supported video resolution of the currently connected device and display. \n\nThe pairs returned will be of a [width, height] format and will correspond to the following values: \n\nNTSC Standard Definition (SD): [720, 480] \n\nPAL Standard Definition (SD): [720, 576] \n\nHigh Definition (HD): [1280, 720] \n\nFull HD (FHD): [1920, 1080]\n\n4K Ultra High Definition (UHD): [3840, 2160]", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "videoResolution", + "summary": "the resolution", + "schema": { + "$ref": "#/components/schemas/Resolution" + } + }, + "examples": [ + { + "name": "Getting the video resolution", + "params": [], + "result": { + "name": "Default Result", + "value": [ + 1920, + 1080 + ] + } + } + ] + }, + { + "name": "Device.name", + "summary": "The human readable name of the device", + "params": [], + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:name" + ] + } + ], + "result": { + "name": "value", + "summary": "the device friendly-name", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "Living Room" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "Kitchen" + } + } + ] + }, + { + "name": "Device.onDeviceNameChanged", + "tags": [ + { + "name": "event" + }, + { + "name": "deprecated", + "x-since": "0.6.0", + "x-alternative": "Device.name()" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:name" + ] + } + ], + "summary": "Get the human readable name of the device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "the device friendly-name", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "string" + } + ] + } + }, + "examples": [ + { + "name": "Getting the device name", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Living Room" + } + } + ] + }, + { + "name": "Device.network", + "summary": "Get the current network status and type", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:network:status" + ] + } + ], + "result": { + "name": "networkInfo", + "summary": "the status and type", + "schema": { + "$ref": "#/components/schemas/NetworkInfoResult" + } + }, + "examples": [ + { + "name": "Getting the network info", + "params": [], + "result": { + "name": "Default Result", + "value": { + "state": "connected", + "type": "wifi" + } + } + } + ] + }, + { + "name": "Device.provision", + "summary": "Used by a distributor to push provision info to firebolt.", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:account:id", + "xrn:firebolt:capability:device:id", + "xrn:firebolt:capability:device:distributor" + ] + } + ], + "params": [ + { + "name": "accountId", + "summary": "The id of the account that is device is attached to in the back office.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "deviceId", + "summary": "The id of the device in the back office.", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "distributorId", + "summary": "The id of the distributor in the back office.", + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "accountId", + "value": "12345678910" + }, + { + "name": "deviceId", + "value": "987654321111" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + }, + { + "name": "With distributor id", + "params": [ + { + "name": "accountId", + "value": "12345678910" + }, + { + "name": "deviceId", + "value": "987654321111" + }, + { + "name": "distributorId", + "value": "global_partner" + } + ], + "result": { + "name": "partnerResult", + "value": null + } + } + ] + }, + { + "name": "Device.onNameChanged", + "summary": "The human readable name of the device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.name" + }, + { + "name": "event", + "x-alternative": "name" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:name" + ] + } + ], + "result": { + "name": "value", + "summary": "the device friendly-name", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "string" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Living Room" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Kitchen" + } + } + ] + }, + { + "name": "Device.onHdcpChanged", + "summary": "Get the negotiated HDCP profiles for a connected device. \n\n For devices that do not require additional connections (e.g. panels), `true` will be returned for all profiles.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.hdcp" + }, + { + "name": "event", + "x-alternative": "hdcp" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "negotiatedHdcpVersions", + "summary": "the negotiated HDCP versions", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/HDCPVersionMap" + } + ] + } + }, + "examples": [ + { + "name": "Getting the negotiated HDCP versions", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "hdcp1.4": true, + "hdcp2.2": true + } + } + } + ] + }, + { + "name": "Device.onHdrChanged", + "summary": "Get the negotiated HDR formats for the connected display and device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.hdr" + }, + { + "name": "event", + "x-alternative": "hdr" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "negotiatedHdrFormats", + "summary": "the negotiated HDR formats", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/HDRFormatMap" + } + ] + } + }, + "examples": [ + { + "name": "Getting the negotiated HDR formats", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "hdr10": true, + "hdr10Plus": true, + "dolbyVision": true, + "hlg": true + } + } + } + ] + }, + { + "name": "Device.onAudioChanged", + "summary": "Get the supported audio profiles for the connected devices. \n\n It is not recommended to use this API for visual badging on content within your app since this does not reflect the settings of the user.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.audio" + }, + { + "name": "event", + "x-alternative": "audio" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "supportedAudioProfiles", + "summary": "the supported audio profiles", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/AudioProfiles" + } + ] + } + }, + "examples": [ + { + "name": "Getting the supported audio profiles", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "stereo": true, + "dolbyDigital5.1": true, + "dolbyDigital5.1+": true, + "dolbyAtmos": true + } + } + } + ] + }, + { + "name": "Device.onScreenResolutionChanged", + "summary": "Get the resolution for the graphical surface of the app. \n\nThe pairs returned will be of a [width, height] format and will correspond to the following values: \n\nNTSC Standard Definition (SD): [720, 480] \n\nPAL Standard Definition (SD): [720, 576] \n\nHigh Definition (HD): [1280, 720] \n\nFull HD (FHD): [1920, 1080]\n\n4K Ultra High Definition (UHD): [3840, 2160] \n\n**Deprecated:** Use non-Firebolt APIs specific to your platform, e.g. W3C APIs", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.screenResolution" + }, + { + "name": "event", + "x-alternative": "screenResolution" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + }, + { + "name": "deprecated", + "x-alternative": "Use non-Firebolt APIs specific to your platform, e.g. W3C APIs", + "x-since": "1.4.0" + } + ], + "result": { + "name": "screenResolution", + "summary": "the resolution", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/Resolution" + } + ] + } + }, + "examples": [ + { + "name": "Getting the screen resolution", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + 1920, + 1080 + ] + } + } + ] + }, + { + "name": "Device.onVideoResolutionChanged", + "summary": "Get the maximum supported video resolution of the currently connected device and display. \n\nThe pairs returned will be of a [width, height] format and will correspond to the following values: \n\nNTSC Standard Definition (SD): [720, 480] \n\nPAL Standard Definition (SD): [720, 576] \n\nHigh Definition (HD): [1280, 720] \n\nFull HD (FHD): [1920, 1080]\n\n4K Ultra High Definition (UHD): [3840, 2160]", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.videoResolution" + }, + { + "name": "event", + "x-alternative": "videoResolution" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "videoResolution", + "summary": "the resolution", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/Resolution" + } + ] + } + }, + "examples": [ + { + "name": "Getting the video resolution", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + 1920, + 1080 + ] + } + } + ] + }, + { + "name": "Device.onNetworkChanged", + "summary": "Get the current network status and type", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Device.network" + }, + { + "name": "event", + "x-alternative": "network" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:network:status" + ] + } + ], + "result": { + "name": "networkInfo", + "summary": "the status and type", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/NetworkInfoResult" + } + ] + } + }, + "examples": [ + { + "name": "Getting the network info", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "connected", + "type": "wifi" + } + } + } + ] + }, + { + "name": "Device.setName", + "summary": "The human readable name of the device", + "params": [ + { + "name": "value", + "summary": "the device friendly-name", + "schema": { + "type": "string" + }, + "required": true + } + ], + "tags": [ + { + "name": "setter", + "x-setter-for": "name" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:device:name" + ] + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "Living Room" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "Kitchen" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Discovery.policy", + "summary": "get the discovery policy", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:policy" + ] + } + ], + "result": { + "name": "policy", + "summary": "discovery policy opt-in/outs", + "schema": { + "$ref": "#/components/schemas/DiscoveryPolicy" + } + }, + "examples": [ + { + "name": "Getting the discovery policy", + "params": [], + "result": { + "name": "Default Result", + "value": { + "enableRecommendations": true, + "shareWatchHistory": true, + "rememberWatchedPrograms": true + } + } + } + ] + }, + { + "name": "Discovery.entityInfo", + "tags": [ + { + "name": "polymorphic-pull" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:entity-info" + }, + { + "name": "deprecated" + } + ], + "summary": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow.", + "description": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow. Includes information about the program entity and its relevant associated entities, such as extras, previews, and, in the case of TV series, seasons and episodes.\n\nSee the `EntityInfo` and `WayToWatch` data structures below for more information.\n\nThe app only needs to implement Pull support for `entityInfo` at this time.", + "params": [ + { + "name": "correlationId", + "required": true, + "schema": { + "type": [ + "string", + "null" + ] + } + }, + { + "name": "result", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/EntityInfoResult" + }, + "summary": "The entityInfo data." + } + ], + "result": { + "name": "success", + "summary": "True if the push operation is successful", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send entity info for a movie to the platform.", + "params": [ + { + "name": "correlationId", + "value": null + }, + { + "name": "result", + "value": { + "expires": "2025-01-01T00:00:00.000Z", + "entity": { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": [ + "UHD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ], + "subtitles": [ + "es" + ], + "audioDescriptions": [ + "en" + ] + } + ] + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send entity info for a movie with a trailer to the platform.", + "params": [ + { + "name": "correlationId", + "value": null + }, + { + "name": "result", + "value": { + "expires": "2025-01-01T00:00:00.000Z", + "entity": { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": [ + "UHD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ], + "subtitles": [ + "es" + ], + "audioDescriptions": [ + "en" + ] + } + ] + }, + "related": [ + { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "preview", + "title": "Cool Runnings Trailer", + "waysToWatch": [ + { + "identifiers": { + "assetId": "123111", + "entityId": "345" + }, + "entitled": true, + "videoQuality": [ + "HD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ] + } + ] + } + ] + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send entity info for a TV Series with seasons and episodes to the platform.", + "params": [ + { + "name": "correlationId", + "value": null + }, + { + "name": "result", + "value": { + "expires": "2025-01-01T00:00:00.000Z", + "entity": { + "identifiers": { + "entityId": "98765" + }, + "entityType": "program", + "programType": "series", + "title": "Perfect Strangers", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1986-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ] + }, + "related": [ + { + "identifiers": { + "entityId": "111", + "seriesId": "98765" + }, + "entityType": "program", + "programType": "season", + "seasonNumber": 1, + "title": "Perfect Strangers Season 3", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "556", + "entityId": "111", + "seriesId": "98765" + }, + "entitled": true, + "offeringType": "free", + "videoQuality": [ + "SD" + ], + "audioProfile": [ + "stereo" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ] + } + ] + }, + { + "identifiers": { + "entityId": "111", + "seriesId": "98765" + }, + "entityType": "program", + "programType": "episode", + "seasonNumber": 1, + "episodeNumber": 1, + "title": "Knock Knock, Who's There?", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1986-03-25T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "556", + "entityId": "111", + "seriesId": "98765" + }, + "entitled": true, + "offeringType": "free", + "videoQuality": [ + "SD" + ], + "audioProfile": [ + "stereo" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ] + } + ] + }, + { + "identifiers": { + "entityId": "112", + "seriesId": "98765" + }, + "entityType": "program", + "programType": "episode", + "seasonNumber": 1, + "episodeNumber": 2, + "title": "Picture This", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1986-04-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-TV", + "rating": "TV-PG" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "557", + "entityId": "112", + "seriesId": "98765" + }, + "entitled": true, + "offeringType": "free", + "videoQuality": [ + "SD" + ], + "audioProfile": [ + "stereo" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ] + } + ] + } + ] + } + } + ], + "result": { + "name": "result", + "value": true + } + } + ] + }, + { + "name": "Discovery.purchasedContent", + "tags": [ + { + "name": "polymorphic-pull" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:purchased-content" + }, + { + "name": "deprecated" + } + ], + "summary": "Provide a list of purchased content for the authenticated account, such as rentals and electronic sell through purchases.", + "params": [ + { + "name": "correlationId", + "required": true, + "schema": { + "type": [ + "string", + "null" + ] + } + }, + { + "name": "result", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/PurchasedContentResult" + }, + "summary": "The data for the purchasedContent" + } + ], + "result": { + "name": "success", + "summary": "True if the push operation is successful", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Inform the platform of the user's purchased content", + "params": [ + { + "name": "correlationId", + "value": null + }, + { + "name": "result", + "value": { + "totalCount": 10, + "expires": "2025-01-01T00:00:00.000Z", + "entries": [ + { + "identifiers": { + "entityId": "345" + }, + "entityType": "program", + "programType": "movie", + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ], + "waysToWatch": [ + { + "identifiers": { + "assetId": "123" + }, + "expires": "2025-01-01T00:00:00.000Z", + "entitled": true, + "entitledExpires": "2025-01-01T00:00:00.000Z", + "offeringType": "buy", + "price": 2.99, + "videoQuality": [ + "UHD" + ], + "audioProfile": [ + "dolbyAtmos" + ], + "audioLanguages": [ + "en" + ], + "closedCaptions": [ + "en" + ], + "subtitles": [ + "es" + ], + "audioDescriptions": [ + "en" + ] + } + ] + } + ] + } + } + ], + "result": { + "name": "success", + "value": true + } + } + ], + "description": "Return content purchased by the user, such as rentals and electronic sell through purchases.\n\nThe app should return the user's 100 most recent purchases in `entries`. The total count of purchases must be provided in `count`. If `count` is greater than the total number of `entries`, the UI may provide a link into the app to see the complete purchase list.\n\nThe `EntityInfo` object returned is not required to have `waysToWatch` populated, but it is recommended that it do so in case the UI wants to surface additional information on the purchases screen.\n\nThe app should implement both Push and Pull methods for `purchasedContent`.\n\nThe app should actively push `purchasedContent` when:\n\n* The app becomes Active.\n* When the state of the purchasedContent set has changed.\n* The app goes into Inactive or Background state, if there is a chance a change event has been missed." + }, + { + "name": "Discovery.watched", + "summary": "Notify the platform that content was partially or completely watched", + "tags": [ + { + "name": "polymorphic-reducer" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:watched" + ] + } + ], + "params": [ + { + "name": "entityId", + "required": true, + "schema": { + "type": "string" + }, + "summary": "The entity Id of the watched content." + }, + { + "name": "progress", + "summary": "How much of the content has been watched (percentage as (0-0.999) for VOD, number of seconds for live)", + "schema": { + "type": "number", + "minimum": 0 + } + }, + { + "name": "completed", + "summary": "Whether or not this viewing is considered \"complete,\" per the app's definition thereof", + "schema": { + "type": "boolean" + } + }, + { + "name": "watchedOn", + "summary": "Date/Time the content was watched, ISO 8601 Date/Time", + "schema": { + "type": "string", + "format": "date-time" + } + } + ], + "result": { + "name": "success", + "summary": "whether the call was successful or not", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Notifying the platform of watched content", + "params": [ + { + "name": "entityId", + "value": "partner.com/entity/123" + }, + { + "name": "progress", + "value": 0.95 + }, + { + "name": "completed", + "value": true + }, + { + "name": "watchedOn", + "value": "2021-04-23T18:25:43.511Z" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.watchNext", + "summary": "Suggest a call-to-action for this app on the platform home screen", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:watch-next" + ] + } + ], + "params": [ + { + "name": "title", + "summary": "The title of this call to action", + "schema": { + "$ref": "#/x-schemas/Types/LocalizedString" + }, + "required": true + }, + { + "name": "identifiers", + "summary": "A set of content identifiers for this call to action", + "schema": { + "$ref": "#/x-schemas/Entertainment/ContentIdentifiers" + }, + "required": true + }, + { + "name": "expires", + "summary": "When this call to action should no longer be presented to users", + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "images", + "summary": "A set of images for this call to action", + "schema": { + "type": "object", + "patternProperties": { + "^.*$": { + "$ref": "#/x-schemas/Types/LocalizedString" + } + } + } + } + ], + "result": { + "name": "success", + "summary": "whether the call was successful or not", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Suggest a watch-next tile for the home screen", + "params": [ + { + "name": "title", + "value": "A Cool Show" + }, + { + "name": "identifiers", + "value": { + "entityId": "partner.com/entity/123" + } + }, + { + "name": "expires", + "value": "2021-04-23T18:25:43.511Z" + }, + { + "name": "images", + "value": { + "3x4": { + "en-US": "https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg", + "es": "https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg" + }, + "16x9": { + "en": "https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Suggest a watch-next tile for the home screen", + "params": [ + { + "name": "title", + "value": "A Fantastic Show" + }, + { + "name": "identifiers", + "value": { + "entityId": "partner.com/entity/456" + } + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.entitlements", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:content-access" + ] + }, + { + "name": "deprecated", + "x-since": "0.10.0", + "x-alternative": "Discovery.contentAccess()" + } + ], + "summary": "Inform the platform of the users latest entitlements w/in this app.", + "params": [ + { + "name": "entitlements", + "summary": "Array of entitlement objects", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/Entitlement" + } + }, + "required": true + } + ], + "result": { + "name": "success", + "summary": "whether the call was successful or not", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Update user's entitlements", + "params": [ + { + "name": "entitlements", + "value": [ + { + "entitlementId": "partner.com/entitlement/123", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + }, + { + "entitlementId": "partner.com/entitlement/456", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + } + ] + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.contentAccess", + "summary": "Inform the platform of what content the user can access either by discovering it or consuming it. Availabilities determine which content is discoverable to a user, while entitlements determine if the user can currently consume that content. Content can be available but not entitled, this means that user can see the content but when they try to open it they must gain an entitlement either through purchase or subscription upgrade. In case the access changed off-device, this API should be called any time the app comes to the foreground to refresh the access. This API should also be called any time the availabilities or entitlements change within the app for any reason. Typical reasons may include the user signing into an account or upgrading a subscription. Less common cases can cause availabilities to change, such as moving to a new service location. When availabilities or entitlements are removed from the subscriber (such as when the user signs out), then an empty array should be given. To clear both, use the Discovery.clearContentAccess convenience API.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:content-access" + ] + } + ], + "params": [ + { + "name": "ids", + "summary": "A list of identifiers that represent content that is discoverable or consumable for the subscriber", + "schema": { + "$ref": "#/components/schemas/ContentAccessIdentifiers" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Update subscriber's availabilities", + "params": [ + { + "name": "ids", + "value": { + "availabilities": [ + { + "type": "channel-lineup", + "id": "partner.com/availability/123", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + }, + { + "type": "channel-lineup", + "id": "partner.com/availability/456", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + } + ] + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Update subscriber's availabilities and entitlements", + "params": [ + { + "name": "ids", + "value": { + "availabilities": [ + { + "type": "channel-lineup", + "id": "partner.com/availability/123", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + }, + { + "type": "channel-lineup", + "id": "partner.com/availability/456", + "startTime": "2021-04-23T18:25:43.511Z", + "endTime": "2021-04-23T18:25:43.511Z" + } + ], + "entitlements": [ + { + "entitlementId": "123", + "startTime": "2025-01-01T00:00:00.000Z", + "endTime": "2025-01-01T00:00:00.000Z" + } + ] + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Update subscriber's entitlements", + "params": [ + { + "name": "ids", + "value": { + "entitlements": [ + { + "entitlementId": "123", + "startTime": "2025-01-01T00:00:00.000Z", + "endTime": "2025-01-01T00:00:00.000Z" + } + ] + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Clear a subscriber's entitlements", + "params": [ + { + "name": "ids", + "value": { + "entitlements": [] + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Clear a subscriber's availabilities", + "params": [ + { + "name": "ids", + "value": { + "availabilities": [] + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Discovery.clearContentAccess", + "summary": "Clear both availabilities and entitlements from the subscriber. This is equivalent of calling `Discovery.contentAccess({ availabilities: [], entitlements: []})`. This is typically called when the user signs out of an account.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:content-access" + ] + } + ], + "params": [], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Clear subscriber's availabilities and entitlements", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Discovery.launch", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:launch" + ] + } + ], + "summary": "Launch or foreground the specified app, and optionally instructs it to navigate to the specified user action. \n For the Primary Experience, the appId can be any one of: \n\n - xrn:firebolt:application-type:main \n\n - xrn:firebolt:application-type:settings", + "params": [ + { + "name": "appId", + "required": true, + "summary": "The durable app Id of the app to launch", + "schema": { + "type": "string" + } + }, + { + "name": "intent", + "required": false, + "summary": "An optional `NavigationIntent` with details about what part of the app to show first, and context around how/why it was launched", + "schema": { + "$ref": "#/x-schemas/Intents/NavigationIntent" + } + } + ], + "result": { + "name": "success", + "summary": "whether the call was successful or not", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Launch the 'Foo' app to it's home screen.", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "intent", + "value": { + "action": "home", + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the 'Foo' app to it's own page for a specific entity.", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "intent", + "value": { + "action": "entity", + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "example-movie-id" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the 'Foo' app to a fullscreen playback experience for a specific entity.", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "intent", + "value": { + "action": "playback", + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "example-movie-id" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to a global page for a specific entity.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main" + }, + { + "name": "intent", + "value": { + "action": "entity", + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "example-movie-id" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to a global page for the company / partner with the ID 'foo'.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main" + }, + { + "name": "intent", + "value": { + "action": "section", + "data": { + "sectionName": "company:foo" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to it's home screen, as if the Home remote button was pressed.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main" + }, + { + "name": "intent", + "value": { + "action": "home", + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to it's search screen.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main" + }, + { + "name": "intent", + "value": { + "action": "search", + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to it's settings screen.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:settings" + }, + { + "name": "intent", + "value": { + "action": "section", + "data": { + "sectionName": "settings" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to it's linear/epg guide.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main" + }, + { + "name": "intent", + "value": { + "action": "section", + "data": { + "sectionName": "guide" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Launch the Aggregated Experience to the App Store details page for a specific app with the ID 'foo'.", + "params": [ + { + "name": "appId", + "value": "xrn:firebolt:application-type:main " + }, + { + "name": "intent", + "value": { + "action": "section", + "data": { + "sectionName": "app:foo" + }, + "context": { + "source": "voice" + } + } + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.onNavigateTo", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:navigate-to" + ] + } + ], + "summary": "listen to `navigateTo` events", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "summary": "An object describing where in the app the user intends to navigate to", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Intents/NavigationIntent" + } + ] + } + }, + "examples": [ + { + "name": "Listening for `navigateTo` events", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "event", + "value": { + "action": "search", + "data": { + "query": "a cool show" + }, + "context": { + "campaign": "unknown", + "source": "voice" + } + } + } + } + ] + }, + { + "name": "Discovery.signIn", + "tags": [ + { + "name": "calls-metrics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:sign-in-status" + ] + } + ], + "summary": "Inform the platform that your user is signed in, for increased visibility in search & discovery. Sign-in state is used separately from what content can be access through entitlements and availabilities. Sign-in state may be used when deciding whether to choose this app to handle a user intent. For instance, if the user tries to launch something generic like playing music from an artist, only a signed-in app will be chosen. If the user wants to tune to a channel, only a signed-in app will be chosen to handle that intent. While signIn can optionally include entitlements as those typically change at signIn time, it is recommended to make a separate call to Discovery.contentAccess for entitlements. signIn is not only for when a user explicitly enters login credentials. If an app does not require any credentials from the user to consume content, such as in a free app, then the app should call signIn immediately on launch.", + "params": [ + { + "name": "entitlements", + "summary": "Optional array of Entitlements, in case of a different user account, or a long time since last sign-in.", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/Entitlement" + } + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send signIn metric", + "params": [], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send signIn notification with entitlements", + "params": [ + { + "name": "entitlements", + "value": [ + { + "entitlementId": "123", + "startTime": "2025-01-01T00:00:00.000Z", + "endTime": "2025-01-01T00:00:00.000Z" + } + ] + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.signOut", + "tags": [ + { + "name": "calls-metrics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:sign-in-status" + ] + } + ], + "summary": "Inform the platform that your user has signed out. See `Discovery.signIn` for more details on how the sign-in state is used.signOut will NOT clear entitlements, the app should make a separate call to Discovery.clearContentAccess. Apps should also call signOut when a login token has expired and the user is now in a signed-out state.", + "params": [], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send signOut notification", + "params": [], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Discovery.onSignIn", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:discovery:sign-in-status" + ] + } + ], + "summary": "Listen to events from all apps that call Discovery.signIn", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "event", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "object", + "properties": { + "appId": { + "type": "string" + } + }, + "required": [ + "appId" + ] + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Event", + "value": { + "appId": "firecert" + } + } + } + ] + }, + { + "name": "Discovery.onSignOut", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:discovery:sign-in-status" + ] + } + ], + "summary": "Listen to events from all apps that call Discovery.signOut", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "event", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "object", + "properties": { + "appId": { + "type": "string" + } + }, + "required": [ + "appId" + ] + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Event", + "value": { + "appId": "firecert" + } + } + } + ] + }, + { + "name": "Discovery.userInterest", + "summary": "Send an entity that the user has expressed interest in to the platform.", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest" + } + ], + "params": [ + { + "name": "type", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/InterestType" + } + }, + { + "name": "reason", + "required": true, + "schema": { + "$ref": "#/x-schemas/Discovery/InterestReason" + } + }, + { + "name": "entity", + "required": true, + "schema": { + "$ref": "#/x-schemas/Entity/EntityDetails" + } + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "type", + "value": "interest" + }, + { + "name": "reason", + "value": "playlist" + }, + { + "name": "entity", + "value": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": {} + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Discovery.onRequestUserInterest", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response-name": "entity", + "x-response": { + "$ref": "#/x-schemas/Entity/EntityDetails", + "examples": [ + { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + ] + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest" + } + ], + "summary": "Provide information about the entity currently displayed or selected on the screen.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "request", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "object", + "required": [ + "correlationId", + "parameters" + ], + "properties": { + "correlationId": { + "type": "string" + }, + "parameters": { + "$ref": "#/components/schemas/UserInterestProviderParameters" + } + }, + "additionalProperties": false + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "request", + "value": { + "correlationId": "xyz", + "parameters": { + "type": "interest", + "reason": "playlist" + } + } + } + } + ] + }, + { + "name": "Discovery.onPolicyChanged", + "summary": "get the discovery policy", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Discovery.policy" + }, + { + "name": "event", + "x-alternative": "policy" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:policy" + ] + } + ], + "result": { + "name": "policy", + "summary": "discovery policy opt-in/outs", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/DiscoveryPolicy" + } + ] + } + }, + "examples": [ + { + "name": "Getting the discovery policy", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "enableRecommendations": true, + "shareWatchHistory": true, + "rememberWatchedPrograms": true + } + } + } + ] + }, + { + "name": "Discovery.onPullEntityInfo", + "tags": [ + { + "name": "polymorphic-pull-event" + }, + { + "name": "event", + "x-pulls-for": "entityInfo" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:entity-info" + }, + { + "name": "deprecated" + } + ], + "summary": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow.", + "description": "Provide information about a program entity and its available watchable assets, such as entitlement status and price, via either a push or pull call flow. Includes information about the program entity and its relevant associated entities, such as extras, previews, and, in the case of TV series, seasons and episodes.\n\nSee the `EntityInfo` and `WayToWatch` data structures below for more information.\n\nThe app only needs to implement Pull support for `entityInfo` at this time.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "request", + "summary": "A EntityInfoFederatedRequest object.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/EntityInfoFederatedRequest" + } + ] + } + }, + "examples": [ + { + "name": "Send entity info for a movie to the platform.", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": { + "correlationId": "xyz", + "parameters": { + "entityId": "345" + } + } + } + }, + { + "name": "Send entity info for a movie with a trailer to the platform.", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": { + "correlationId": "xyz", + "parameters": { + "entityId": "345" + } + } + } + }, + { + "name": "Send entity info for a TV Series with seasons and episodes to the platform.", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": { + "correlationId": "xyz", + "parameters": { + "entityId": "345" + } + } + } + } + ] + }, + { + "name": "Discovery.onPullPurchasedContent", + "tags": [ + { + "name": "polymorphic-pull-event" + }, + { + "name": "event", + "x-pulls-for": "purchasedContent" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:purchased-content" + }, + { + "name": "deprecated" + } + ], + "summary": "Provide a list of purchased content for the authenticated account, such as rentals and electronic sell through purchases.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "request", + "summary": "A PurchasedContentFederatedRequest object.", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/PurchasedContentFederatedRequest" + } + ] + } + }, + "examples": [ + { + "name": "Inform the platform of the user's purchased content", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "result", + "value": { + "correlationId": "xyz", + "parameters": { + "limit": 100 + } + } + } + } + ], + "description": "Return content purchased by the user, such as rentals and electronic sell through purchases.\n\nThe app should return the user's 100 most recent purchases in `entries`. The total count of purchases must be provided in `count`. If `count` is greater than the total number of `entries`, the UI may provide a link into the app to see the complete purchase list.\n\nThe `EntityInfo` object returned is not required to have `waysToWatch` populated, but it is recommended that it do so in case the UI wants to surface additional information on the purchases screen.\n\nThe app should implement both Push and Pull methods for `purchasedContent`.\n\nThe app should actively push `purchasedContent` when:\n\n* The app becomes Active.\n* When the state of the purchasedContent set has changed.\n* The app goes into Inactive or Background state, if there is a chance a change event has been missed." + }, + { + "name": "Discovery.userInterestResponse", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest", + "x-response-for": "Discovery.onRequestUserInterest" + } + ], + "summary": "Internal API for .onRequestUserInterest Provider to send back response.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "$ref": "#/x-schemas/Entity/EntityDetails", + "examples": [ + { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + ] + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": { + "title": "Cool Runnings", + "synopsis": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Pulvinar sapien et ligula ullamcorper malesuada proin libero nunc.", + "releaseDate": "1993-01-01T00:00:00.000Z", + "contentRatings": [ + { + "scheme": "US-Movie", + "rating": "PG" + }, + { + "scheme": "CA-Movie", + "rating": "G" + } + ] + } + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Discovery.userInterestError", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest", + "x-error-for": "Discovery.onRequestUserInterest" + } + ], + "summary": "Internal API for .onRequestUserInterest Provider to send back error.", + "description": "Provide information about the entity currently displayed or selected on the screen.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "HDMIInput.ports", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Retrieve a list of HDMI input ports.", + "params": [], + "result": { + "name": "ports", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/HDMIInputPort" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "ports", + "value": [ + { + "port": "HDMI1", + "connected": true, + "signal": "stable", + "arcCapable": true, + "arcConnected": true, + "edidVersion": "2.0", + "autoLowLatencyModeCapable": true, + "autoLowLatencyModeSignalled": true + } + ] + } + } + ] + }, + { + "name": "HDMIInput.port", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Retrieve a specific HDMI input port.", + "params": [ + { + "name": "portId", + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "required": true + } + ], + "result": { + "name": "port", + "schema": { + "$ref": "#/components/schemas/HDMIInputPort" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "portId", + "value": "HDMI1" + } + ], + "result": { + "name": "ports", + "value": { + "port": "HDMI1", + "connected": true, + "signal": "stable", + "arcCapable": true, + "arcConnected": true, + "edidVersion": "2.0", + "autoLowLatencyModeCapable": true, + "autoLowLatencyModeSignalled": true + } + } + } + ] + }, + { + "name": "HDMIInput.open", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Opens the HDMI Port allowing it to be the active source device. Incase there is a different HDMI portId already set as the active source, this call would stop the older portId before opening the given portId.", + "params": [ + { + "name": "portId", + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "required": true + } + ], + "result": { + "name": "port", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example for open", + "params": [ + { + "name": "portId", + "value": "HDMI1" + } + ], + "result": { + "name": "port", + "value": null + } + } + ] + }, + { + "name": "HDMIInput.close", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Closes the given HDMI Port if it is the current active source for HDMI Input. If there was no active source, then there would no action taken on the device.", + "params": [], + "result": { + "name": "port", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example for stop", + "params": [], + "result": { + "name": "port", + "value": null + } + } + ] + }, + { + "name": "HDMIInput.onConnectionChanged", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Notification for when any HDMI port has a connection physically engaged or disengaged.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "info", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/ConnectionChangedInfo" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "info", + "value": { + "port": "HDMI1", + "connected": true + } + } + } + ] + }, + { + "name": "HDMIInput.onSignalChanged", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "summary": "Notification for when any HDMI port has it's signal status changed.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "info", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/SignalChangedInfo" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "info", + "value": { + "port": "HDMI1", + "signal": "stable" + } + } + } + ] + }, + { + "name": "HDMIInput.lowLatencyMode", + "summary": "Property for the low latency mode setting.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + }, + { + "name": "property" + } + ], + "params": [], + "result": { + "name": "enabled", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default Example #2", + "params": [], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "HDMIInput.onAutoLowLatencyModeSignalChanged", + "summary": "Notification for changes to ALLM status of any input device.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + }, + { + "name": "event" + } + ], + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "info", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/AutoLowLatencyModeSignalChangedInfo" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "info", + "value": { + "port": "HDMI1", + "autoLowLatencyModeSignalled": true + } + } + } + ] + }, + { + "name": "HDMIInput.autoLowLatencyModeCapable", + "summary": "Property for each port auto low latency mode setting.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + }, + { + "name": "property", + "x-subscriber-type": "global" + } + ], + "params": [ + { + "name": "port", + "required": true, + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + } + } + ], + "result": { + "name": "enabled", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "port", + "value": "HDMI1" + } + ], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "port", + "value": "HDMI1" + } + ], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "HDMIInput.edidVersion", + "summary": "Property for each port's active EDID version.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + }, + { + "name": "property" + } + ], + "params": [ + { + "name": "port", + "required": true, + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + } + } + ], + "result": { + "name": "edidVersion", + "schema": { + "$ref": "#/components/schemas/EDIDVersion" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "port", + "value": "HDMI1" + } + ], + "result": { + "name": "edidVersion", + "value": "2.0" + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "port", + "value": "HDMI1" + } + ], + "result": { + "name": "edidVersion", + "value": "1.4" + } + } + ] + }, + { + "name": "HDMIInput.onLowLatencyModeChanged", + "summary": "Property for the low latency mode setting.", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "HDMIInput.lowLatencyMode" + }, + { + "name": "event", + "x-alternative": "lowLatencyMode" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "enabled", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "HDMIInput.onAutoLowLatencyModeCapableChanged", + "summary": "Property for each port auto low latency mode setting.", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "HDMIInput.autoLowLatencyModeCapable" + }, + { + "name": "event", + "x-alternative": "autoLowLatencyModeCapable" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "data", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/AutoLowLatencyModeCapableChangedInfo" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "data", + "value": { + "port": "HDMI1", + "enabled": true + } + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "data", + "value": { + "port": "HDMI1", + "enabled": false + } + } + } + ] + }, + { + "name": "HDMIInput.onEdidVersionChanged", + "summary": "Property for each port's active EDID version.", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "HDMIInput.edidVersion" + }, + { + "name": "event", + "x-alternative": "edidVersion" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "port", + "required": true, + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + } + }, + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "edidVersion", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/EDIDVersion" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "edidVersion", + "value": "2.0" + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "edidVersion", + "value": "1.4" + } + } + ] + }, + { + "name": "HDMIInput.setLowLatencyMode", + "summary": "Property for the low latency mode setting.", + "tags": [ + { + "name": "setter", + "x-setter-for": "lowLatencyMode" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "enabled", + "value": null + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "enabled", + "value": null + } + } + ] + }, + { + "name": "HDMIInput.setAutoLowLatencyModeCapable", + "summary": "Property for each port auto low latency mode setting.", + "tags": [ + { + "name": "setter", + "x-setter-for": "autoLowLatencyModeCapable" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "port", + "required": true, + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + } + }, + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "value", + "value": true + } + ], + "result": { + "name": "enabled", + "value": null + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "value", + "value": false + } + ], + "result": { + "name": "enabled", + "value": null + } + } + ] + }, + { + "name": "HDMIInput.setEdidVersion", + "summary": "Property for each port's active EDID version.", + "tags": [ + { + "name": "setter", + "x-setter-for": "edidVersion" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:inputs:hdmi" + ] + } + ], + "params": [ + { + "name": "port", + "required": true, + "schema": { + "$ref": "#/components/schemas/HDMIPortId" + } + }, + { + "name": "value", + "schema": { + "$ref": "#/components/schemas/EDIDVersion" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "value", + "value": "2.0" + } + ], + "result": { + "name": "edidVersion", + "value": null + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "port", + "value": "HDMI1" + }, + { + "name": "value", + "value": "1.4" + } + ], + "result": { + "name": "edidVersion", + "value": null + } + } + ] + }, + { + "name": "Keyboard.email", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Keyboard.onRequestEmail", + "x-uses": [ + "xrn:firebolt:capability:input:keyboard" + ], + "x-allow-focus": true + } + ], + "summary": "Prompt the user for their email address with a simplified list of choices.", + "params": [ + { + "name": "type", + "summary": "Why the email is being requested, e.g. sign on or sign up", + "required": true, + "schema": { + "$ref": "#/components/schemas/EmailUsage" + } + }, + { + "name": "message", + "summary": "The message to display while prompting", + "required": false, + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "email", + "summary": "the selected or entered email", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Prompt the user to select or type an email address", + "params": [ + { + "name": "type", + "value": "signIn" + }, + { + "name": "message", + "value": "Enter your email to sign into this app" + } + ], + "result": { + "name": "Default Result", + "value": "user@domain.com" + } + }, + { + "name": "Prompt the user to type an email address to sign up", + "params": [ + { + "name": "type", + "value": "signUp" + }, + { + "name": "message", + "value": "Enter your email to sign up for this app" + } + ], + "result": { + "name": "Default Result", + "value": "user@domain.com" + } + } + ] + }, + { + "name": "Keyboard.password", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Keyboard.onRequestPassword", + "x-uses": [ + "xrn:firebolt:capability:input:keyboard" + ], + "x-allow-focus": true + } + ], + "summary": "Show the password entry keyboard, with typing obfuscated from visibility", + "params": [ + { + "name": "message", + "summary": "The message to display while prompting", + "required": false, + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "value", + "summary": "the selected or entered password", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Prompt the user to enter their password", + "params": [ + { + "name": "message", + "value": "Enter your password" + } + ], + "result": { + "name": "Default Result", + "value": "abc123" + } + } + ] + }, + { + "name": "Keyboard.standard", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Keyboard.onRequestStandard", + "x-uses": [ + "xrn:firebolt:capability:input:keyboard" + ], + "x-allow-focus": true + } + ], + "summary": "Show the standard platform keyboard, and return the submitted value", + "params": [ + { + "name": "message", + "summary": "The message to display while prompting", + "required": true, + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "value", + "summary": "the selected or entered text", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Prompt the user for an arbitrary string", + "params": [ + { + "name": "message", + "value": "Enter the name you'd like to associate with this device" + } + ], + "result": { + "name": "Default Result", + "value": "Living Room" + } + } + ] + }, + { + "name": "Keyboard.onRequestStandard", + "summary": "Registers as a provider for when the user should be shown a standard keyboard.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response": { + "type": "string", + "examples": [ + "username" + ] + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true + } + ], + "result": { + "name": "sessionRequest", + "summary": "The request to start a keyboard session", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/KeyboardProviderRequest" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "correlationId": "abc", + "parameters": { + "message": "Enter your user name." + } + } + } + } + ] + }, + { + "name": "Keyboard.onRequestPassword", + "summary": "Registers as a provider for when the user should be shown a password keyboard, with dots for each character entered.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response": { + "type": "string", + "examples": [ + "password" + ] + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true + } + ], + "result": { + "name": "sessionRequest", + "summary": "The request to start a keyboard session", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/KeyboardProviderRequest" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "correlationId": "abc", + "parameters": { + "message": "Enter your user name." + } + } + } + } + ] + }, + { + "name": "Keyboard.onRequestEmail", + "summary": "Registers as a provider for when the user should be shown a keyboard optimized for email address entry.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response": { + "type": "string", + "examples": [ + "email@address.com" + ] + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true + } + ], + "result": { + "name": "sessionRequest", + "summary": "The request to start a keyboard session", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/KeyboardProviderRequest" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "correlationId": "abc", + "parameters": { + "message": "Enter your user name." + } + } + } + } + ] + }, + { + "name": "Keyboard.standardFocus", + "summary": "Internal API for Standard Provider to request focus for UX purposes.", + "params": [], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-allow-focus-for": "onRequestStandard" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.passwordFocus", + "summary": "Internal API for Password Provider to request focus for UX purposes.", + "params": [], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-allow-focus-for": "onRequestPassword" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.emailFocus", + "summary": "Internal API for Email Provider to request focus for UX purposes.", + "params": [], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-allow-focus-for": "onRequestEmail" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.standardResponse", + "summary": "Internal API for Standard Provider to send back response.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "type": "string", + "examples": [ + "username" + ] + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-response-for": "onRequestStandard" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": "username" + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.standardError", + "summary": "Internal API for Standard Provider to send back error.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-error-for": "onRequestStandard" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.passwordResponse", + "summary": "Internal API for Password Provider to send back response.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "type": "string", + "examples": [ + "password" + ] + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-response-for": "onRequestPassword" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": "password" + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.passwordError", + "summary": "Internal API for Password Provider to send back error.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-error-for": "onRequestPassword" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.emailResponse", + "summary": "Internal API for Email Provider to send back response.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "type": "string", + "examples": [ + "email@address.com" + ] + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-response-for": "onRequestEmail" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": "email@address.com" + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Keyboard.emailError", + "summary": "Internal API for Email Provider to send back error.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:input:keyboard", + "x-allow-focus": true, + "x-error-for": "onRequestEmail" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Lifecycle.ready", + "tags": [ + { + "name": "calls-metrics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:ready" + ] + }, + { + "name": "exclude-from-sdk" + } + ], + "summary": "Notify the platform that the app is ready", + "params": [], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Let the platform know that your app is ready", + "params": [], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Lifecycle.close", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Request that the platform move your app out of focus", + "params": [ + { + "name": "reason", + "summary": "The reason the app is requesting to be closed", + "required": true, + "schema": { + "$ref": "#/x-schemas/Lifecycle/CloseReason" + } + } + ], + "result": { + "name": "success", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Close the app when the user presses back on the app home screen", + "params": [ + { + "name": "reason", + "value": "remoteButton" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Close the app when the user selects an exit menu item", + "params": [ + { + "name": "reason", + "value": "userExit" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Lifecycle.finished", + "tags": [ + { + "name": "exclude-from-sdk" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Notify the platform that the app is done unloading", + "params": [], + "result": { + "name": "results", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Lifecycle.state", + "summary": "Get the current state of the app. This function is **synchronous**.", + "tags": [ + { + "name": "synchronous" + }, + { + "name": "exclude-from-sdk" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "params": [], + "result": { + "name": "state", + "summary": "the current state of the app.", + "schema": { + "$ref": "#/x-schemas/Lifecycle/LifecycleState" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "foreground" + } + } + ] + }, + { + "name": "Lifecycle.onInactive", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the inactive event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/LifecycleEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "inactive", + "previous": "initializing" + } + } + } + ] + }, + { + "name": "Lifecycle.onForeground", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the foreground event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/LifecycleEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "foreground", + "previous": "inactive" + } + } + }, + { + "name": "Move to foreground via remote branded buton", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "value", + "value": { + "state": "foreground", + "previous": "inactive", + "source": "remote" + } + } + } + ] + }, + { + "name": "Lifecycle.onBackground", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the background event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/LifecycleEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "background", + "previous": "foreground" + } + } + } + ] + }, + { + "name": "Lifecycle.onSuspended", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the suspended event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/LifecycleEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "suspended", + "previous": "inactive" + } + } + } + ] + }, + { + "name": "Lifecycle.onUnloading", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the unloading event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "value", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/LifecycleEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "state": "unloading", + "previous": "inactive" + } + } + } + ] + }, + { + "name": "Localization.locality", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:locality" + ] + }, + { + "name": "property" + } + ], + "summary": "Get the locality/city the device is located in", + "params": [], + "result": { + "name": "locality", + "summary": "the device city", + "schema": { + "$ref": "#/x-schemas/Localization/Locality" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "Philadelphia" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "Rockville" + } + } + ] + }, + { + "name": "Localization.postalCode", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:postal-code" + ] + } + ], + "summary": "Get the postal code the device is located in", + "params": [], + "result": { + "name": "postalCode", + "summary": "the device postal code", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "19103" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "20850" + } + } + ] + }, + { + "name": "Localization.countryCode", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:country-code" + ] + } + ], + "summary": "Get the ISO 3166-1 alpha-2 code for the country device is located in", + "params": [], + "result": { + "name": "code", + "summary": "the device country code", + "schema": { + "$ref": "#/x-schemas/Localization/CountryCode" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "US" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "UK" + } + } + ] + }, + { + "name": "Localization.language", + "summary": "Get the ISO 639 1/2 code for the preferred language", + "params": [], + "tags": [ + { + "name": "deprecated", + "x-since": "0.17.0", + "x-alternative": "Localization.locale" + }, + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "lang", + "summary": "the device language", + "schema": { + "$ref": "#/x-schemas/Localization/Language" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "en" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "es" + } + } + ] + }, + { + "name": "Localization.preferredAudioLanguages", + "summary": "A prioritized list of ISO 639 1/2 codes for the preferred audio languages on this device.", + "params": [], + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "languages", + "summary": "the preferred audio languages", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": [ + "spa", + "eng" + ] + } + }, + { + "name": "Default Example #2", + "params": [], + "result": { + "name": "Default Result", + "value": [ + "eng", + "spa" + ] + } + } + ] + }, + { + "name": "Localization.locale", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:locale" + ] + } + ], + "summary": "Get the *full* BCP 47 code, including script, region, variant, etc., for the preferred langauage/locale", + "params": [], + "result": { + "name": "locale", + "summary": "the device locale", + "schema": { + "$ref": "#/x-schemas/Localization/Locale" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "Default Result", + "value": "en-US" + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "Default Result", + "value": "es-US" + } + } + ] + }, + { + "name": "Localization.latlon", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:location" + ] + } + ], + "summary": "Get the approximate latitude and longitude coordinates of the device location", + "params": [], + "result": { + "name": "latlong", + "summary": "lat/long tuple", + "schema": { + "$ref": "#/components/schemas/LatLon" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": [ + 39.9549, + 75.1699 + ] + } + } + ] + }, + { + "name": "Localization.additionalInfo", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:additional-info" + ] + } + ], + "summary": "Get any platform-specific localization information", + "params": [], + "result": { + "name": "info", + "summary": "the additional info", + "schema": { + "type": "object", + "additionalProperties": { + "type": [ + "number", + "string", + "boolean" + ], + "maxLength": 1024 + }, + "maxProperties": 32 + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "info", + "value": {} + } + } + ] + }, + { + "name": "Localization.addAdditionalInfo", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:additional-info" + ] + } + ], + "summary": "Add any platform-specific localization information in key/value pair", + "params": [ + { + "name": "key", + "summary": "Key to add additionalInfo", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "value", + "summary": "Value to be set for additionalInfo. Value can be a number, string or boolean", + "schema": { + "type": [ + "number", + "string", + "boolean" + ] + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Add an additionalInfo for localization", + "params": [ + { + "name": "key", + "value": "defaultKey" + }, + { + "name": "value", + "value": "defaultValue=" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "Localization.removeAdditionalInfo", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:additional-info" + ] + } + ], + "summary": "Remove any platform-specific localization information from map", + "params": [ + { + "name": "key", + "summary": "Key to remove additionalInfo", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Remove an additionalInfo for localization", + "params": [ + { + "name": "key", + "value": "defaultKey" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "Localization.timeZone", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:time-zone" + ] + } + ], + "summary": "Set the IANA timezone for the device", + "params": [], + "result": { + "name": "result", + "schema": { + "$ref": "#/x-schemas/Localization/TimeZone" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "America/New_York" + } + }, + { + "name": "Additional Example", + "params": [], + "result": { + "name": "Default Result", + "value": "America/Los_Angeles" + } + } + ] + }, + { + "name": "Localization.onLocalityChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.locality" + }, + { + "name": "event", + "x-alternative": "locality" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:locality" + ] + } + ], + "summary": "Get the locality/city the device is located in", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "locality", + "summary": "the device city", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/Locality" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Philadelphia" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "Rockville" + } + } + ] + }, + { + "name": "Localization.onPostalCodeChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.postalCode" + }, + { + "name": "event", + "x-alternative": "postalCode" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:postal-code" + ] + } + ], + "summary": "Get the postal code the device is located in", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "postalCode", + "summary": "the device postal code", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "string" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "19103" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "20850" + } + } + ] + }, + { + "name": "Localization.onCountryCodeChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.countryCode" + }, + { + "name": "event", + "x-alternative": "countryCode" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:country-code" + ] + } + ], + "summary": "Get the ISO 3166-1 alpha-2 code for the country device is located in", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "code", + "summary": "the device country code", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/CountryCode" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "US" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "UK" + } + } + ] + }, + { + "name": "Localization.onLanguageChanged", + "summary": "Get the ISO 639 1/2 code for the preferred language", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.language" + }, + { + "name": "event", + "x-alternative": "language" + }, + { + "name": "deprecated", + "x-since": "0.17.0", + "x-alternative": "Localization.locale" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "lang", + "summary": "the device language", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/Language" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "en" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "es" + } + } + ] + }, + { + "name": "Localization.onPreferredAudioLanguagesChanged", + "summary": "A prioritized list of ISO 639 1/2 codes for the preferred audio languages on this device.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.preferredAudioLanguages" + }, + { + "name": "event", + "x-alternative": "preferredAudioLanguages" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "languages", + "summary": "the preferred audio languages", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + "spa", + "eng" + ] + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": [ + "eng", + "spa" + ] + } + } + ] + }, + { + "name": "Localization.onLocaleChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.locale" + }, + { + "name": "event", + "x-alternative": "locale" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:locale" + ] + } + ], + "summary": "Get the *full* BCP 47 code, including script, region, variant, etc., for the preferred langauage/locale", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "locale", + "summary": "the device locale", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/Locale" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "en-US" + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "es-US" + } + } + ] + }, + { + "name": "Localization.onTimeZoneChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Localization.timeZone" + }, + { + "name": "event", + "x-alternative": "timeZone" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:time-zone" + ] + } + ], + "summary": "Set the IANA timezone for the device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "result", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Localization/TimeZone" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "America/New_York" + } + }, + { + "name": "Additional Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": "America/Los_Angeles" + } + } + ] + }, + { + "name": "Localization.setLocality", + "tags": [ + { + "name": "setter", + "x-setter-for": "locality" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:locality" + ] + } + ], + "summary": "Get the locality/city the device is located in", + "params": [ + { + "name": "value", + "summary": "the device city", + "schema": { + "$ref": "#/x-schemas/Localization/Locality" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "Philadelphia" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "Rockville" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setPostalCode", + "tags": [ + { + "name": "setter", + "x-setter-for": "postalCode" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:postal-code" + ] + } + ], + "summary": "Get the postal code the device is located in", + "params": [ + { + "name": "value", + "summary": "the device postal code", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "19103" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "20850" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setCountryCode", + "tags": [ + { + "name": "setter", + "x-setter-for": "countryCode" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:country-code" + ] + } + ], + "summary": "Get the ISO 3166-1 alpha-2 code for the country device is located in", + "params": [ + { + "name": "value", + "summary": "the device country code", + "schema": { + "$ref": "#/x-schemas/Localization/CountryCode" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "US" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "UK" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setLanguage", + "summary": "Get the ISO 639 1/2 code for the preferred language", + "params": [ + { + "name": "value", + "summary": "the device language", + "schema": { + "$ref": "#/x-schemas/Localization/Language" + }, + "required": true + } + ], + "tags": [ + { + "name": "setter", + "x-setter-for": "language" + }, + { + "name": "deprecated", + "x-since": "0.17.0", + "x-alternative": "Localization.locale" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "en" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "es" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setPreferredAudioLanguages", + "summary": "A prioritized list of ISO 639 1/2 codes for the preferred audio languages on this device.", + "params": [ + { + "name": "value", + "summary": "the preferred audio languages", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + }, + "required": true + } + ], + "tags": [ + { + "name": "setter", + "x-setter-for": "preferredAudioLanguages" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:language" + ] + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": [ + "spa", + "eng" + ] + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default Example #2", + "params": [ + { + "name": "value", + "value": [ + "eng", + "spa" + ] + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setLocale", + "tags": [ + { + "name": "setter", + "x-setter-for": "locale" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:locale" + ] + } + ], + "summary": "Get the *full* BCP 47 code, including script, region, variant, etc., for the preferred langauage/locale", + "params": [ + { + "name": "value", + "summary": "the device locale", + "schema": { + "$ref": "#/x-schemas/Localization/Locale" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": "en-US" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": "es-US" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Localization.setTimeZone", + "tags": [ + { + "name": "setter", + "x-setter-for": "timeZone" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:localization:time-zone" + ] + } + ], + "summary": "Set the IANA timezone for the device", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Localization/TimeZone" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": "America/New_York" + } + ], + "result": { + "name": "Default Result", + "value": null + } + }, + { + "name": "Additional Example", + "params": [ + { + "name": "value", + "value": "America/Los_Angeles" + } + ], + "result": { + "name": "Default Result", + "value": null + } + } + ] + }, + { + "name": "Metrics.ready", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform that your app is minimally usable. This method is called automatically by `Lifecycle.ready()`", + "params": [], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send ready metric", + "params": [], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.signIn", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Log a sign in event, called by Discovery.signIn().", + "params": [], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send signIn metric", + "params": [], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send signIn metric with entitlements", + "params": [ + { + "name": "entitlements", + "value": [ + { + "entitlementId": "123", + "startTime": "2025-01-01T00:00:00.000Z", + "endTime": "2025-01-01T00:00:00.000Z" + } + ] + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.signOut", + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Log a sign out event, called by Discovery.signOut().", + "params": [], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send signOut metric", + "params": [], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.startContent", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform that your user has started content.", + "params": [ + { + "name": "entityId", + "summary": "Optional entity ID of the content.", + "schema": { + "type": "string" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send startContent metric", + "params": [], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send startContent metric w/ entity", + "params": [ + { + "name": "entityId", + "value": "abc" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.stopContent", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform that your user has stopped content.", + "params": [ + { + "name": "entityId", + "summary": "Optional entity ID of the content.", + "schema": { + "type": "string" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send stopContent metric", + "params": [], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send stopContent metric w/ entity", + "params": [ + { + "name": "entityId", + "value": "abc" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.page", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform that your user has navigated to a page or view.", + "params": [ + { + "name": "pageId", + "summary": "Page ID of the content.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send page metric", + "params": [ + { + "name": "pageId", + "value": "xyz" + } + ], + "result": { + "name": "success", + "value": true + } + }, + { + "name": "Send startContent metric w/ entity", + "params": [ + { + "name": "pageId", + "value": "home" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.action", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform of something not covered by other Metrics APIs.", + "params": [ + { + "name": "category", + "summary": "The category of action being logged. Must be 'user' for user-initated actions or 'app' for all other actions", + "schema": { + "type": "string", + "enum": [ + "user", + "app" + ] + }, + "required": true + }, + { + "name": "type", + "summary": "A short, indexible identifier for the action, e.g. 'SignIn Prompt Displayed'", + "schema": { + "type": "string", + "maxLength": 256 + }, + "required": true + }, + { + "name": "parameters", + "schema": { + "$ref": "#/x-schemas/Types/FlatMap" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send foo action", + "params": [ + { + "name": "category", + "value": "user" + }, + { + "name": "type", + "value": "The user did foo" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.error", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform of an error that has occured in your app.", + "params": [ + { + "name": "type", + "summary": "The type of error", + "schema": { + "$ref": "#/components/schemas/ErrorType" + }, + "required": true + }, + { + "name": "code", + "summary": "an app-specific error code", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "description", + "summary": "A short description of the error", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "visible", + "summary": "Whether or not this error was visible to the user.", + "schema": { + "type": "boolean" + }, + "required": true + }, + { + "name": "parameters", + "summary": "Optional additional parameters to be logged with the error", + "schema": { + "$ref": "#/x-schemas/Types/FlatMap" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send error metric", + "params": [ + { + "name": "type", + "value": "media" + }, + { + "name": "code", + "value": "MEDIA-STALLED" + }, + { + "name": "description", + "value": "playback stalled" + }, + { + "name": "visible", + "value": true + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaLoadStart", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when setting the URL of a media asset to play, in order to infer load time.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send loadstart metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaPlay", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when media playback should start due to autoplay, user-initiated play, or unpausing.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send play metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaPlaying", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when media playback actually starts due to autoplay, user-initiated play, unpausing, or recovering from a buffering interuption.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send playing metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaPause", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when media playback will pause due to an intentional pause operation.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send pause metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaWaiting", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when media playback will halt due to a network, buffer, or other unintentional constraint.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send waiting metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaProgress", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called every 60 seconds as media playback progresses.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "progress", + "summary": "Progress of playback, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration.", + "schema": { + "$ref": "#/components/schemas/MediaPosition" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send progress metric.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "progress", + "value": 0.75 + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaSeeking", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when a seek is initiated during media playback.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "target", + "summary": "Target destination of the seek, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration.", + "schema": { + "$ref": "#/components/schemas/MediaPosition" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send seeking metric.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "target", + "value": 0.5 + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaSeeked", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when a seek is completed during media playback.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "position", + "summary": "Resulting position of the seek operation, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration.", + "schema": { + "$ref": "#/components/schemas/MediaPosition" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send seeked metric.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "position", + "value": 0.51 + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaRateChange", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when the playback rate of media is changed.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "rate", + "summary": "The new playback rate.", + "schema": { + "type": "number" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send ratechange metric.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "rate", + "value": 2 + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaRenditionChange", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when the playback rendition (e.g. bitrate, dimensions, profile, etc) is changed.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "bitrate", + "summary": "The new bitrate in kbps.", + "schema": { + "type": "number" + }, + "required": true + }, + { + "name": "width", + "summary": "The new resolution width.", + "schema": { + "type": "number" + }, + "required": true + }, + { + "name": "height", + "summary": "The new resolution height.", + "schema": { + "type": "number" + }, + "required": true + }, + { + "name": "profile", + "summary": "A description of the new profile, e.g. 'HDR' etc.", + "schema": { + "type": "string" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send renditionchange metric.", + "params": [ + { + "name": "entityId", + "value": "345" + }, + { + "name": "bitrate", + "value": 5000 + }, + { + "name": "width", + "value": 1920 + }, + { + "name": "height", + "value": 1080 + }, + { + "name": "profile", + "value": "HDR+" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.mediaEnded", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:media" + ] + } + ], + "summary": "Called when playback has stopped because the end of the media was reached.", + "params": [ + { + "name": "entityId", + "summary": "The entityId of the media.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Send ended metric.", + "params": [ + { + "name": "entityId", + "value": "345" + } + ], + "result": { + "name": "success", + "value": true + } + } + ] + }, + { + "name": "Metrics.event", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:distributor" + ] + } + ], + "summary": "Inform the platform of 1st party distributor metrics.", + "params": [ + { + "name": "schema", + "summary": "The schema URI of the metric type", + "schema": { + "type": "string", + "format": "uri" + }, + "required": true + }, + { + "name": "data", + "summary": "A JSON payload conforming the the provided schema", + "schema": { + "$ref": "#/components/schemas/EventObject" + }, + "required": true + } + ], + "result": { + "name": "results", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Send foo event", + "params": [ + { + "name": "schema", + "value": "http://meta.rdkcentral.com/some/schema" + }, + { + "name": "data", + "value": { + "foo": "foo" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Metrics.appInfo", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:metrics:general" + ] + } + ], + "summary": "Inform the platform about an app's build info.", + "params": [ + { + "name": "build", + "summary": "The build / version of this app.", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Send appInfo metric", + "params": [ + { + "name": "build", + "value": "1.2.2" + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Parameters.initialization", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Returns any initialization parameters for the app, e.g. initialial `NavigationIntent`.", + "params": [], + "result": { + "name": "init", + "summary": "The initialization parameters.", + "schema": { + "$ref": "#/components/schemas/AppInitialization" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "init", + "value": { + "lmt": 0, + "us_privacy": "1-Y-", + "discovery": { + "navigateTo": { + "action": "entity", + "data": { + "entityId": "abc", + "entityType": "program", + "programType": "movie" + }, + "context": { + "source": "voice" + } + } + } + } + } + } + ] + }, + { + "name": "PinChallenge.onRequestChallenge", + "summary": "Registers as a provider for when the user should be challenged in order to confirm access to a capability through a pin prompt", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "event", + "x-response": { + "$ref": "#/components/schemas/PinChallengeResult", + "examples": [ + { + "granted": true, + "reason": "correctPin" + }, + { + "granted": false, + "reason": "exceededPinFailures" + }, + { + "granted": null, + "reason": "cancelled" + } + ] + }, + "x-error": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + } + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:pinchallenge", + "x-allow-focus": true + } + ], + "result": { + "name": "challenge", + "summary": "The request to challenge the user", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/components/schemas/PinChallengeProviderRequest" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "correlationId": "abc", + "parameters": { + "capability": "xrn:firebolt:capability:commerce::purchase", + "requestor": { + "id": "ReferenceApp", + "name": "Firebolt Reference App" + }, + "pinSpace": "purchase" + } + } + } + } + ] + }, + { + "name": "PinChallenge.challengeFocus", + "summary": "Internal API for Challenge Provider to request focus for UX purposes.", + "params": [], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:pinchallenge", + "x-allow-focus": true, + "x-allow-focus-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example", + "params": [], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "PinChallenge.challengeResponse", + "summary": "Internal API for Challenge Provider to send back response.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "result", + "schema": { + "$ref": "#/components/schemas/PinChallengeResult", + "examples": [ + { + "granted": true, + "reason": "correctPin" + }, + { + "granted": false, + "reason": "exceededPinFailures" + }, + { + "granted": null, + "reason": "cancelled" + } + ] + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:pinchallenge", + "x-allow-focus": true, + "x-response-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example #1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": true, + "reason": "correctPin" + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Example #2", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": false, + "reason": "exceededPinFailures" + } + } + ], + "result": { + "name": "result", + "value": null + } + }, + { + "name": "Example #3", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "result", + "value": { + "granted": null, + "reason": "cancelled" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "PinChallenge.challengeError", + "summary": "Internal API for Challenge Provider to send back error.", + "params": [ + { + "name": "correlationId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "error", + "schema": { + "type": "object", + "additionalProperties": false, + "required": [ + "code", + "message" + ], + "properties": { + "code": { + "title": "errorObjectCode", + "description": "A Number that indicates the error type that occurred. This MUST be an integer. The error codes from and including -32768 to -32000 are reserved for pre-defined errors. These pre-defined errors SHOULD be assumed to be returned from any JSON-RPC api.", + "type": "integer" + }, + "message": { + "title": "errorObjectMessage", + "description": "A String providing a short description of the error. The message SHOULD be limited to a concise single sentence.", + "type": "string" + }, + "data": { + "title": "errorObjectData", + "description": "A Primitive or Structured value that contains additional information about the error. This may be omitted. The value of this member is defined by the Server (e.g. detailed error information, nested errors etc.)." + } + } + }, + "required": true + } + ], + "tags": [ + { + "name": "rpc-only" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:pinchallenge", + "x-allow-focus": true, + "x-error-for": "onRequestChallenge" + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Example 1", + "params": [ + { + "name": "correlationId", + "value": "123" + }, + { + "name": "error", + "value": { + "code": 1, + "message": "Error" + } + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, + { + "name": "Privacy.allowResumePoints", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content to show in the main experience", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowUnentitledResumePoints", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content from unentitled providers to show in the main experience", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowWatchHistory", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their watch history from all sources to show in the main experience", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowProductAnalytics", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data can be used for analytics about the product", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowPersonalization", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowUnentitledPersonalization", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations for unentitled content", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowRemoteDiagnostics", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their personal data to be included in diagnostic telemetry. This also allows whether device logs can be remotely accessed from the client device", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowPrimaryContentAdTargeting", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in the primary experience", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowPrimaryBrowseAdTargeting", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while browsing in the primary experience", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowAppContentAdTargeting", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in apps", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowACRCollection", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their automatic content recognition data to be collected", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.allowCameraAnalytics", + "tags": [ + { + "name": "property", + "x-allow-value": true + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows data from their camera to be used for Product Analytics", + "params": [], + "result": { + "name": "allow", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.settings", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Gets the allowed value for all privacy settings", + "params": [], + "result": { + "name": "settings", + "schema": { + "$ref": "#/components/schemas/PrivacySettings" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "settings", + "value": { + "allowACRCollection": true, + "allowResumePoints": false, + "allowAppContentAdTargeting": false, + "allowCameraAnalytics": true, + "allowPersonalization": true, + "allowPrimaryBrowseAdTargeting": false, + "allowPrimaryContentAdTargeting": false, + "allowProductAnalytics": true, + "allowRemoteDiagnostics": true, + "allowUnentitledPersonalization": true, + "allowUnentitledResumePoints": false, + "allowWatchHistory": true + } + } + } + ] + }, + { + "name": "Privacy.onAllowResumePointsChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowResumePoints" + }, + { + "name": "event", + "x-alternative": "allowResumePoints" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content to show in the main experience", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowUnentitledResumePointsChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowUnentitledResumePoints" + }, + { + "name": "event", + "x-alternative": "allowUnentitledResumePoints" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content from unentitled providers to show in the main experience", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowWatchHistoryChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowWatchHistory" + }, + { + "name": "event", + "x-alternative": "allowWatchHistory" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their watch history from all sources to show in the main experience", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowProductAnalyticsChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowProductAnalytics" + }, + { + "name": "event", + "x-alternative": "allowProductAnalytics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data can be used for analytics about the product", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowPersonalizationChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowPersonalization" + }, + { + "name": "event", + "x-alternative": "allowPersonalization" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowUnentitledPersonalizationChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowUnentitledPersonalization" + }, + { + "name": "event", + "x-alternative": "allowUnentitledPersonalization" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations for unentitled content", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowRemoteDiagnosticsChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowRemoteDiagnostics" + }, + { + "name": "event", + "x-alternative": "allowRemoteDiagnostics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their personal data to be included in diagnostic telemetry. This also allows whether device logs can be remotely accessed from the client device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowPrimaryContentAdTargetingChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowPrimaryContentAdTargeting" + }, + { + "name": "event", + "x-alternative": "allowPrimaryContentAdTargeting" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in the primary experience", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowPrimaryBrowseAdTargetingChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowPrimaryBrowseAdTargeting" + }, + { + "name": "event", + "x-alternative": "allowPrimaryBrowseAdTargeting" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while browsing in the primary experience", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowAppContentAdTargetingChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowAppContentAdTargeting" + }, + { + "name": "event", + "x-alternative": "allowAppContentAdTargeting" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in apps", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowACRCollectionChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowACRCollection" + }, + { + "name": "event", + "x-alternative": "allowACRCollection" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their automatic content recognition data to be collected", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.onAllowCameraAnalyticsChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "Privacy.allowCameraAnalytics" + }, + { + "name": "event", + "x-alternative": "allowCameraAnalytics" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows data from their camera to be used for Product Analytics", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "allow", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Privacy.setAllowResumePoints", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowResumePoints" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content to show in the main experience", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowUnentitledResumePoints", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowUnentitledResumePoints" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows resume points for content from unentitled providers to show in the main experience", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowWatchHistory", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowWatchHistory" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their watch history from all sources to show in the main experience", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowProductAnalytics", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowProductAnalytics" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data can be used for analytics about the product", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowPersonalization", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowPersonalization" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowUnentitledPersonalization", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowUnentitledPersonalization" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their usage data to be used for personalization and recommendations for unentitled content", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowRemoteDiagnostics", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowRemoteDiagnostics" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their personal data to be included in diagnostic telemetry. This also allows whether device logs can be remotely accessed from the client device", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowPrimaryContentAdTargeting", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowPrimaryContentAdTargeting" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in the primary experience", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowPrimaryBrowseAdTargeting", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowPrimaryBrowseAdTargeting" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while browsing in the primary experience", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowAppContentAdTargeting", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowAppContentAdTargeting" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows ads to be targeted to the user while watching content in apps", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowACRCollection", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowACRCollection" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows their automatic content recognition data to be collected", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Privacy.setAllowCameraAnalytics", + "tags": [ + { + "name": "setter", + "x-setter-for": "allowCameraAnalytics" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:privacy:settings" + ] + } + ], + "summary": "Whether the user allows data from their camera to be used for Product Analytics", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "allow", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "allow", + "value": null + } + } + ] + }, + { + "name": "Profile.approveContentRating", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:approve:content" + ] + } + ], + "summary": "Verifies that the current profile should have access to mature/adult content.", + "params": [], + "result": { + "name": "allow", + "summary": "Whether or not to allow access", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Profile.approvePurchase", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:approve:purchase" + ] + } + ], + "summary": "Verifies that the current profile should have access to making purchases.", + "params": [], + "result": { + "name": "allow", + "summary": "Whether or not to allow access", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "allow", + "value": false + } + } + ] + }, + { + "name": "Profile.flags", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:profile:flags" + ] + } + ], + "summary": "Get a map of profile flags for the current session.", + "params": [], + "result": { + "name": "flags", + "summary": "The profile flags.", + "schema": { + "$ref": "#/x-schemas/Types/FlatMap" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "flags", + "value": { + "userExperience": "1000" + } + } + } + ] + }, + { + "name": "SecondScreen.protocols", + "summary": "Get the supported second screen discovery protocols", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:secondscreen:protocol" + ] + } + ], + "params": [], + "result": { + "name": "protocols", + "summary": "the supported protocols", + "schema": { + "$ref": "#/x-schemas/Types/BooleanMap" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": { + "dial1.7": true + } + } + } + ] + }, + { + "name": "SecondScreen.device", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "summary": "Get the broadcasted id for the device", + "params": [ + { + "name": "type", + "summary": "The type of second screen protocol, e.g. \"dial\"", + "required": false, + "schema": { + "type": "string" + } + } + ], + "result": { + "name": "deviceId", + "summary": "the device id", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "device-id" + } + } + ] + }, + { + "name": "SecondScreen.friendlyName", + "summary": "Get the broadcasted friendly name for the device", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "result": { + "name": "friendlyName", + "summary": "the device friendly-name", + "schema": { + "type": "string" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "friendlyName", + "value": "Living Room" + } + } + ] + }, + { + "name": "SecondScreen.onLaunchRequest", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "summary": "Listen to the launchRequest event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "launchRequestEvent", + "summary": "Dispatched when a second screen device on the local network has requested this app to be launched", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/SecondScreen/SecondScreenEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "type": "dial", + "version": "1.7", + "data": "{\"code\":\"AQDPQZiQcb3KQ7gY7yy5tHTMbbkGHR9Zjp-KL53H3eKBZIeAt7O9UKYPu6B21l2UZVmIqkFXDXBmXvK4g2e3EgZtjMNmKPsTltgnRl95DImtOXjSpWtTjSaOkW4w1kZKUTwLKdwVWTzBVH8ERHorvLU6vCGOVHxXt65LNwdl5HKRweShVC1V9QsyvRnQS61ov0UclmrH_xZML2Bt-Q-rZFjey5MjwupIb4x4f53XUJMhjHpDHoIUKrjpdPDQvK2a\",\"friendlyName\":\"Operator_TX061AEI\",\"UDN\":\"608fef11-2800-482a-962b-23a6690c93c1\"}" + } + } + } + ] + }, + { + "name": "SecondScreen.onCloseRequest", + "tags": [ + { + "name": "event" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "summary": "Listen to the closeRequest event", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "closeRequestEvent", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/SecondScreen/SecondScreenEvent" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "Default Result", + "value": { + "type": "dial", + "version": "1.7" + } + } + } + ] + }, + { + "name": "SecondScreen.onFriendlyNameChanged", + "summary": "Get the broadcasted friendly name for the device", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "SecondScreen.friendlyName" + }, + { + "name": "event", + "x-alternative": "friendlyName" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "result": { + "name": "friendlyName", + "summary": "the device friendly-name", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "string" + } + ] + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "friendlyName", + "value": "Living Room" + } + } + ] + }, + { + "name": "SecureStorage.get", + "summary": "Get stored value by key", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "scope", + "summary": "The scope of the key/value", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + }, + { + "name": "key", + "summary": "Key to get", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "value", + "summary": "The retrieved value, if found.", + "schema": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "examples": [ + { + "name": "Successfully retrieve a refresh token with key authRefreshToken", + "params": [ + { + "name": "scope", + "value": "device" + }, + { + "name": "key", + "value": "authRefreshToken" + } + ], + "result": { + "name": "value", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + } + }, + { + "name": "Attempt to retrieve a key with no value set", + "params": [ + { + "name": "scope", + "value": "account" + }, + { + "name": "key", + "value": "authRefreshToken" + } + ], + "result": { + "name": "value", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.set", + "summary": "Set or update a secure data value", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "scope", + "summary": "The scope of the data key", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + }, + { + "name": "key", + "summary": "Key to set", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "value", + "summary": "Value to set", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "options", + "summary": "Optional parameters to set", + "schema": { + "$ref": "#/components/schemas/StorageOptions" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Set a refresh token with name authRefreshToken with optional paramter", + "params": [ + { + "name": "scope", + "value": "device" + }, + { + "name": "key", + "value": "authRefreshToken" + }, + { + "name": "value", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + }, + { + "name": "options", + "value": { + "ttl": 600 + } + } + ], + "result": { + "name": "defaultResult", + "value": null + } + }, + { + "name": "Set a refresh token with name authRefreshToken without optional parameter", + "params": [ + { + "name": "scope", + "value": "account" + }, + { + "name": "key", + "value": "authRefreshToken" + }, + { + "name": "value", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.remove", + "summary": "Remove a secure data value", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "scope", + "summary": "The scope of the data key", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + }, + { + "name": "key", + "summary": "Key to remove", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "summary": "", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Remove the value with key authRefreshToken for device", + "params": [ + { + "name": "scope", + "value": "device" + }, + { + "name": "key", + "value": "authRefreshToken" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + }, + { + "name": "Remove the value with key authRefreshToken for account", + "params": [ + { + "name": "scope", + "value": "account" + }, + { + "name": "key", + "value": "authRefreshToken" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.setForApp", + "summary": "Set or update a secure data value for a specific app.", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "appId", + "summary": "appId for which value is being set", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "scope", + "summary": "The scope of the data key", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + }, + { + "name": "key", + "summary": "Key to set", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "value", + "summary": "Value to set", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "options", + "summary": "Optional parameters to set", + "schema": { + "$ref": "#/components/schemas/StorageOptions" + }, + "required": false + } + ], + "result": { + "name": "success", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Set a refresh token with name authRefreshToken with optional parameter for appId foo", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "scope", + "value": "device" + }, + { + "name": "key", + "value": "authRefreshToken" + }, + { + "name": "value", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + }, + { + "name": "options", + "value": { + "ttl": 600 + } + } + ], + "result": { + "name": "defaultResult", + "value": null + } + }, + { + "name": "Set a refresh token with name authRefreshToken without optional parameter for appId foo", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "scope", + "value": "account" + }, + { + "name": "key", + "value": "authRefreshToken" + }, + { + "name": "value", + "value": "VGhpcyBub3QgYSByZWFsIHRva2VuLgo=" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.removeForApp", + "summary": "Removes single data value for a specific app.", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "appId", + "summary": "appId for which values are removed", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "scope", + "summary": "The scope of the key/value", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + }, + { + "name": "key", + "summary": "Key to remove", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "success", + "summary": "", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Removes authRefreshToken for appId foo", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "scope", + "value": "account" + }, + { + "name": "key", + "value": "authRefreshToken" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.clearForApp", + "summary": "Clears all the secure data values for a specific app", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "appId", + "summary": "appId for which values are removed", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "scope", + "summary": "The scope of the key/value", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + } + ], + "result": { + "name": "success", + "summary": "", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Clears all the secure data values for appId foo", + "params": [ + { + "name": "appId", + "value": "foo" + }, + { + "name": "scope", + "value": "account" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "SecureStorage.clear", + "summary": "Clears all the secure data values", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:storage:secure" + ] + } + ], + "params": [ + { + "name": "scope", + "summary": "The scope of the key/value", + "schema": { + "$ref": "#/components/schemas/StorageScope" + }, + "required": true + } + ], + "result": { + "name": "success", + "summary": "", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Clears all the data values of storage", + "params": [ + { + "name": "scope", + "value": "account" + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "UserGrants.app", + "summary": "Get all granted and denied user grants for the given app", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "appId", + "schema": { + "type": "string" + }, + "required": true + } + ], + "result": { + "name": "info", + "summary": "The list of grants for this app", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GrantInfo" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "appId", + "value": "certapp" + } + ], + "result": { + "name": "defaultResult", + "value": [ + { + "app": { + "id": "certapp", + "title": "Firebolt Certification" + }, + "state": "granted", + "capability": "xrn:firebolt:capability:data:app-usage", + "role": "use", + "lifespan": "seconds", + "expires": "2022-12-14T20:20:39+00:00" + }, + { + "app": { + "id": "certapp", + "title": "Firebolt Certification" + }, + "state": "denied", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "appActive" + } + ] + } + } + ] + }, + { + "name": "UserGrants.device", + "summary": "Get all granted and denied user grants for the device", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [], + "result": { + "name": "info", + "summary": "The list of grants for the device", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GrantInfo" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "defaultResult", + "value": [ + { + "state": "granted", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "powerActive" + } + ] + } + } + ] + }, + { + "name": "UserGrants.capability", + "summary": "Get all granted and denied user grants for the given capability", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "capability", + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "required": true + } + ], + "result": { + "name": "info", + "summary": "The list of grants associated with the given capability", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GrantInfo" + } + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + } + ], + "result": { + "name": "defaultResult", + "value": [ + { + "state": "granted", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "powerActive" + } + ] + } + } + ] + }, + { + "name": "UserGrants.grant", + "summary": "Grants a given capability to a specific app, if appropriate. Calling this results in a persisted active grant that lasts for the duration of the grant policy lifespan. ", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "role", + "schema": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "required": true + }, + { + "name": "capability", + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "required": true + }, + { + "name": "options", + "schema": { + "$ref": "#/components/schemas/GrantModificationOptions" + } + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "options", + "value": { + "appId": "certapp" + } + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "UserGrants.deny", + "summary": "Denies a given capability, to a specific app if appropriate. Calling this results in a persisted Denied Grant that lasts for the duration of the Grant Policy lifespan. ", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "role", + "schema": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "required": true + }, + { + "name": "capability", + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "required": true + }, + { + "name": "options", + "schema": { + "$ref": "#/components/schemas/GrantModificationOptions" + } + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "options", + "value": { + "appId": "certapp" + } + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "UserGrants.clear", + "summary": "Clears the grant for a given capability, to a specific app if appropriate. Calling this results in a persisted Denied Grant that lasts for the duration of the Grant Policy lifespan. ", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "role", + "schema": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "required": true + }, + { + "name": "capability", + "schema": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "required": true + }, + { + "name": "options", + "schema": { + "$ref": "#/components/schemas/GrantModificationOptions" + } + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "options", + "value": { + "appId": "certapp" + } + } + ], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "UserGrants.request", + "summary": "Requests Firebolt to carry out a set of user grants for a given application such that the user grant provider is notified or an existing user grant is reused.", + "tags": [ + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:grants:state" + ] + } + ], + "params": [ + { + "name": "appId", + "schema": { + "type": "string" + }, + "required": true + }, + { + "name": "permissions", + "schema": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/Permission" + }, + "minItems": 1 + }, + "required": true + }, + { + "name": "options", + "summary": "Request options", + "schema": { + "$ref": "#/components/schemas/RequestOptions" + }, + "required": false + } + ], + "result": { + "name": "info", + "summary": "The result of all grants requested by this", + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/GrantInfo" + } + } + }, + "examples": [ + { + "name": "Default result #1", + "params": [ + { + "name": "appId", + "value": "certapp" + }, + { + "name": "permissions", + "value": [ + { + "role": "use", + "capability": "xrn:firebolt:capability:localization:postal-code" + } + ] + } + ], + "result": { + "name": "defaultResult", + "value": [ + { + "app": { + "id": "certapp", + "title": "Certification App" + }, + "state": "granted", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "powerActive" + } + ] + } + }, + { + "name": "Default result #2", + "params": [ + { + "name": "appId", + "value": "certapp" + }, + { + "name": "permissions", + "value": [ + { + "role": "use", + "capability": "xrn:firebolt:capability:localization:postal-code" + } + ] + }, + { + "name": "options", + "value": { + "force": true + } + } + ], + "result": { + "name": "defaultResult", + "value": [ + { + "app": { + "id": "certapp", + "title": "Certification App" + }, + "state": "granted", + "capability": "xrn:firebolt:capability:localization:postal-code", + "role": "use", + "lifespan": "powerActive" + } + ] + } + } + ] + }, + { + "name": "VoiceGuidance.enabled", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "Whether or not voice-guidance is enabled.", + "params": [], + "result": { + "name": "enabled", + "schema": { + "type": "boolean" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "VoiceGuidance.speed", + "tags": [ + { + "name": "property" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "The speed at which voice guidance speech will be read back to the user.", + "params": [], + "result": { + "name": "speed", + "schema": { + "$ref": "#/x-schemas/Accessibility/VoiceSpeed" + } + }, + "examples": [ + { + "name": "Voice guidance speed to 1", + "params": [], + "result": { + "name": "speed", + "value": 1 + } + }, + { + "name": "Voice guidance speed to 2", + "params": [], + "result": { + "name": "speed", + "value": 2 + } + } + ] + }, + { + "name": "VoiceGuidance.onEnabledChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "VoiceGuidance.enabled" + }, + { + "name": "event", + "x-alternative": "enabled" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "Whether or not voice-guidance is enabled.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "enabled", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "type": "boolean" + } + ] + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": true + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "enabled", + "value": false + } + } + ] + }, + { + "name": "VoiceGuidance.onSpeedChanged", + "tags": [ + { + "name": "subscriber", + "x-subscriber-for": "VoiceGuidance.speed" + }, + { + "name": "event", + "x-alternative": "speed" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "The speed at which voice guidance speech will be read back to the user.", + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "speed", + "schema": { + "anyOf": [ + { + "$ref": "#/x-schemas/Types/ListenResponse" + }, + { + "$ref": "#/x-schemas/Accessibility/VoiceSpeed" + } + ] + } + }, + "examples": [ + { + "name": "Voice guidance speed to 1", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "speed", + "value": 1 + } + }, + { + "name": "Voice guidance speed to 2", + "params": [ + { + "name": "listen", + "value": true + } + ], + "result": { + "name": "speed", + "value": 2 + } + } + ] + }, + { + "name": "VoiceGuidance.setEnabled", + "tags": [ + { + "name": "setter", + "x-setter-for": "enabled" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "Whether or not voice-guidance is enabled.", + "params": [ + { + "name": "value", + "schema": { + "type": "boolean" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Default example #1", + "params": [ + { + "name": "value", + "value": true + } + ], + "result": { + "name": "enabled", + "value": null + } + }, + { + "name": "Default example #2", + "params": [ + { + "name": "value", + "value": false + } + ], + "result": { + "name": "enabled", + "value": null + } + } + ] + }, + { + "name": "VoiceGuidance.setSpeed", + "tags": [ + { + "name": "setter", + "x-setter-for": "speed" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:accessibility:voiceguidance" + ] + } + ], + "summary": "The speed at which voice guidance speech will be read back to the user.", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/x-schemas/Accessibility/VoiceSpeed" + }, + "required": true + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + }, + "examples": [ + { + "name": "Voice guidance speed to 1", + "params": [ + { + "name": "value", + "value": 1 + } + ], + "result": { + "name": "speed", + "value": null + } + }, + { + "name": "Voice guidance speed to 2", + "params": [ + { + "name": "value", + "value": 2 + } + ], + "result": { + "name": "speed", + "value": null + } + } + ] + }, + { + "name": "Wifi.scan", + "summary": "Scan available wifi networks in the location.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:wifi" + ] + } + ], + "params": [ + { + "name": "timeout", + "schema": { + "$ref": "#/x-schemas/Types/Timeout" + } + } + ], + "result": { + "name": "list", + "summary": "Contains a list of wifi networks available near the device.", + "schema": { + "$ref": "#/components/schemas/AccessPointList" + } + }, + "examples": [ + { + "name": "Successful Wifi List", + "params": [ + { + "name": "timeout", + "value": 30 + } + ], + "result": { + "name": "successfulWifiResultExample", + "value": { + "list": [ + { + "ssid": "DND", + "security": "wpa2Psk", + "signalStrength": -70, + "frequency": 2.4 + }, + { + "ssid": "Fortnite", + "security": "WPA2_ENTERPRISE_AES", + "signalStrength": -70, + "frequency": 5 + }, + { + "ssid": "Guardian", + "security": "none", + "signalStrength": -70, + "frequency": 2.4 + } + ] + } + } + } + ] + }, + { + "name": "Wifi.connect", + "summary": "Connect the device to the specified SSID.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:wifi" + ] + } + ], + "params": [ + { + "name": "ssid", + "schema": { + "type": "string" + }, + "description": "Name of Wifi SSID to connect for the device." + }, + { + "name": "passphrase", + "schema": { + "type": "string" + }, + "description": "Password or Passphrase for the wifi." + }, + { + "name": "security", + "schema": { + "$ref": "#/components/schemas/WifiSecurityMode" + } + } + ], + "result": { + "name": "connectedWifi", + "summary": "Successful Response after connecting to the Wifi.", + "schema": { + "$ref": "#/components/schemas/AccessPoint" + } + }, + "examples": [ + { + "name": "Connect to a wpa2Psk Wifi with password", + "params": [ + { + "name": "ssid", + "value": "DND" + }, + { + "name": "passphrase", + "value": "gargoyle" + }, + { + "name": "security", + "value": "wpa2Psk" + } + ], + "result": { + "name": "successfulWifiConnection", + "value": { + "ssid": "DND", + "security": "wpa2Psk", + "signalStrength": -70, + "frequency": 2.4 + } + } + }, + { + "name": "Connect to a WPA2 PSK Wifi with password", + "params": [ + { + "name": "ssid", + "value": "Guardian WIFI" + }, + { + "name": "passphrase", + "value": "" + }, + { + "name": "security", + "value": "none" + } + ], + "result": { + "name": "successfulWifiConnection", + "value": { + "ssid": "Guardian WIFI", + "security": "none", + "signalStrength": -70, + "frequency": 2.4 + } + } + } + ] + }, + { + "name": "Wifi.disconnect", + "summary": "Disconnect the device if connected via WIFI.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:wifi" + ] + } + ], + "params": [], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Disconnect", + "params": [], + "result": { + "name": "defaultResult", + "value": null + } + } + ] + }, + { + "name": "Wifi.wps", + "summary": "Connect to WPS", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:wifi" + ] + } + ], + "params": [ + { + "name": "security", + "schema": { + "$ref": "#/components/schemas/WPSSecurityPin" + } + } + ], + "result": { + "name": "connectedWifi", + "summary": "Successful Response after connecting to the Wifi.", + "schema": { + "$ref": "#/components/schemas/AccessPoint" + } + }, + "examples": [ + { + "name": "Connect to a WPS Wifi router", + "params": [ + { + "name": "security", + "value": "pushButton" + } + ], + "result": { + "name": "successfulWifiConnection", + "value": { + "ssid": "DND", + "security": "wpa2Psk", + "signalStrength": -70, + "frequency": 2.4 + } + } + } + ] + } + ], + "components": { + "schemas": { + "InitializeResult": { + "title": "InitializeResult", + "type": "object", + "required": [ + "version" + ], + "properties": { + "version": { + "$ref": "#/x-schemas/Types/SemanticVersion", + "description": "The semantic version of the FEE." + } + }, + "additionalProperties": false + }, + "AudioDescriptionSettings": { + "title": "AudioDescriptionSettings", + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether or not audio descriptions should be enabled by default" + } + } + }, + "Token": { + "type": "string", + "description": "Encoded token provided by the Distributor for Device Authentication." + }, + "Expiry": { + "type": "integer", + "description": "Number of secs before the token expires", + "minimum": 1 + }, + "ChallengeRequestor": { + "title": "ChallengeRequestor", + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "string", + "description": "The id of the app that requested the challenge" + }, + "name": { + "type": "string", + "description": "The name of the app that requested the challenge" + } + } + }, + "Challenge": { + "title": "Challenge", + "type": "object", + "required": [ + "capability", + "requestor" + ], + "properties": { + "capability": { + "type": "string", + "description": "The capability that is being requested by the user to approve" + }, + "requestor": { + "description": "The identity of which app is requesting access to this capability", + "$ref": "#/components/schemas/ChallengeRequestor" + } + } + }, + "ChallengeProviderRequest": { + "title": "ChallengeProviderRequest", + "allOf": [ + { + "$ref": "#/x-schemas/Types/ProviderRequest" + }, + { + "type": "object", + "required": [ + "parameters" + ], + "properties": { + "parameters": { + "description": "The request to challenge the user", + "$ref": "#/components/schemas/Challenge" + } + } + } + ] + }, + "GrantResult": { + "title": "GrantResult", + "type": "object", + "required": [ + "granted" + ], + "properties": { + "granted": { + "oneOf": [ + { + "type": "boolean", + "description": "Whether the user approved or denied the challenge" + }, + { + "const": null + } + ] + } + }, + "examples": [ + { + "granted": true + }, + { + "granted": false + }, + { + "granted": null + } + ] + }, + "AdPolicy": { + "title": "AdPolicy", + "description": "Describes various ad playback enforcement rules that the app should follow.", + "type": "object", + "properties": { + "skipRestriction": { + "$ref": "#/x-schemas/Advertising/SkipRestriction" + }, + "limitAdTracking": { + "type": "boolean" + } + } + }, + "AdConfigurationOptions": { + "title": "AdConfigurationOptions", + "type": "object", + "properties": { + "coppa": { + "type": "boolean", + "description": "Whether or not the app requires US COPPA compliance." + }, + "environment": { + "type": "string", + "enum": [ + "prod", + "test" + ], + "default": "prod", + "description": "Whether the app is running in a production or test mode." + }, + "authenticationEntity": { + "type": "string", + "description": "The authentication provider, when it is separate entity than the app provider, e.g. an MVPD." + } + } + }, + "AdvertisingIdOptions": { + "title": "AdvertisingIdOptions", + "type": "object", + "properties": { + "scope": { + "type": "object", + "description": "Provides the options to send scope type and id to select desired advertising id", + "required": [ + "type", + "id" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "browse", + "content" + ], + "default": "browse", + "description": "The scope type, which will determine where to show advertisement" + }, + "id": { + "type": "string", + "description": "A value that identifies a specific scope within the scope type" + } + } + } + } + }, + "AdvertisingIdResult": { + "title": "AdvertisingIdResult", + "type": "object", + "properties": { + "ifa": { + "type": "string", + "description": "UUID conforming to IAB standard" + }, + "ifa_type": { + "type": "string", + "description": "source of the IFA as defined by IAB" + }, + "lmt": { + "type": "string", + "enum": [ + "0", + "1" + ], + "description": "boolean that if set to 1, user has requested ad tracking and measurement is disabled" + } + }, + "required": [ + "ifa", + "ifa_type", + "lmt" + ] + }, + "TokenType": { + "title": "TokenType", + "type": "string", + "enum": [ + "platform", + "device", + "distributor" + ] + }, + "AuthenticationTokenResult": { + "title": "AuthenticationTokenResult", + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "expires": { + "type": "string", + "format": "date-time" + }, + "type": { + "type": "string" + } + }, + "required": [ + "value" + ] + }, + "CapabilityOption": { + "title": "CapabilityOption", + "type": "object", + "properties": { + "role": { + "$ref": "#/x-schemas/Capabilities/Role", + "description": "Which role of the capability to check the state of, default will be 'use'", + "default": "use" + } + } + }, + "ClosedCaptionsSettingsProviderRequest": { + "title": "ClosedCaptionsSettingsProviderRequest", + "allOf": [ + { + "$ref": "#/x-schemas/Types/ProviderRequest" + }, + { + "type": "object", + "properties": { + "parameters": { + "const": null + } + } + } + ], + "examples": [ + { + "correlationId": "abc" + } + ] + }, + "InterestResult": { + "title": "InterestResult", + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "entity": { + "$ref": "#/x-schemas/Entity/EntityDetails" + } + }, + "required": [ + "appId", + "entity" + ] + }, + "InterestEvent": { + "title": "InterestEvent", + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "type": { + "$ref": "#/x-schemas/Discovery/InterestType" + }, + "reason": { + "$ref": "#/x-schemas/Discovery/InterestReason" + }, + "entity": { + "$ref": "#/x-schemas/Entity/EntityDetails" + } + }, + "required": [ + "appId", + "entity", + "type", + "reason" + ] + }, + "Resolution": { + "oneOf": [ + { + "type": "array", + "items": [ + { + "type": "integer", + "const": 720, + "description": "Width in pixels" + }, + { + "type": "integer", + "const": 480, + "description": "Height in pixels" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + }, + { + "type": "array", + "items": [ + { + "type": "integer", + "const": 720, + "description": "Width in pixels" + }, + { + "type": "integer", + "const": 576, + "description": "Height in pixels" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + }, + { + "type": "array", + "items": [ + { + "type": "integer", + "const": 1280, + "description": "Width in pixels" + }, + { + "type": "integer", + "const": 720, + "description": "Height in pixels" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + }, + { + "type": "array", + "items": [ + { + "type": "integer", + "const": 1920, + "description": "Width in pixels" + }, + { + "type": "integer", + "const": 1080, + "description": "Height in pixels" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + }, + { + "type": "array", + "items": [ + { + "type": "integer", + "const": 3840, + "description": "Width in pixels" + }, + { + "type": "integer", + "const": 2160, + "description": "Height in pixels" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + } + ] + }, + "NetworkType": { + "title": "NetworkType", + "type": "string", + "enum": [ + "wifi", + "ethernet", + "hybrid" + ], + "description": "The type of network that is currently active" + }, + "NetworkState": { + "title": "NetworkState", + "type": "string", + "enum": [ + "connected", + "disconnected" + ], + "description": "The type of network that is currently active" + }, + "AudioProfiles": { + "title": "AudioProfiles", + "type": "object", + "properties": { + "stereo": { + "type": "boolean" + }, + "dolbyDigital5.1": { + "type": "boolean" + }, + "dolbyDigital5.1+": { + "type": "boolean" + }, + "dolbyAtmos": { + "type": "boolean" + } + }, + "required": [ + "stereo", + "dolbyDigital5.1", + "dolbyDigital5.1+", + "dolbyAtmos" + ] + }, + "HDRFormatMap": { + "title": "HDRFormatMap", + "type": "object", + "properties": { + "hdr10": { + "type": "boolean" + }, + "hdr10Plus": { + "type": "boolean" + }, + "dolbyVision": { + "type": "boolean" + }, + "hlg": { + "type": "boolean" + } + }, + "required": [ + "hdr10", + "hdr10Plus", + "dolbyVision", + "hlg" + ], + "description": "The type of HDR format" + }, + "HDCPVersionMap": { + "title": "HDCPVersionMap", + "type": "object", + "properties": { + "hdcp1.4": { + "type": "boolean" + }, + "hdcp2.2": { + "type": "boolean" + } + }, + "required": [ + "hdcp1.4", + "hdcp2.2" + ], + "description": "The type of HDCP versions" + }, + "DeviceVersion": { + "title": "DeviceVersion", + "type": "object", + "properties": { + "sdk": { + "$ref": "#/x-schemas/Types/SemanticVersion", + "description": "The Firebolt SDK version" + }, + "api": { + "$ref": "#/x-schemas/Types/SemanticVersion", + "description": "The latest Firebolt API version supported by the current device." + }, + "firmware": { + "$ref": "#/x-schemas/Types/SemanticVersion", + "description": "The firmware version as reported by the device" + }, + "os": { + "$ref": "#/x-schemas/Types/SemanticVersion", + "description": "**Deprecated** Use `firmware`, instead." + }, + "debug": { + "type": "string", + "description": "Detailed version as a string, for debugging purposes" + } + }, + "required": [ + "api", + "firmware", + "os" + ] + }, + "NetworkInfoResult": { + "title": "NetworkInfoResult", + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/NetworkState" + }, + "type": { + "$ref": "#/components/schemas/NetworkType" + } + }, + "required": [ + "state", + "type" + ] + }, + "DiscoveryPolicy": { + "title": "DiscoveryPolicy", + "type": "object", + "required": [ + "enableRecommendations", + "shareWatchHistory", + "rememberWatchedPrograms" + ], + "properties": { + "enableRecommendations": { + "type": "boolean", + "description": "Whether or not to the user has enabled history-based recommendations" + }, + "shareWatchHistory": { + "type": "boolean", + "description": "Whether or not the user has enabled app watch history data to be shared with the platform" + }, + "rememberWatchedPrograms": { + "type": "boolean", + "description": "Whether or not the user has enabled watch history" + } + } + }, + "FederatedRequest": { + "title": "FederatedRequest", + "type": "object", + "properties": { + "correlationId": { + "type": "string" + } + }, + "required": [ + "correlationId" + ], + "propertyNames": { + "enum": [ + "correlationId", + "parameters" + ] + }, + "examples": [ + { + "correlationId": "xyz" + } + ] + }, + "FederatedResponse": { + "title": "FederatedResponse", + "type": "object", + "properties": { + "correlationId": { + "type": "string" + } + }, + "required": [ + "correlationId", + "result" + ], + "propertyNames": { + "enum": [ + "correlationId", + "result" + ] + }, + "examples": [ + { + "correlationId": "xyz" + } + ] + }, + "EntityInfoFederatedRequest": { + "title": "EntityInfoFederatedRequest", + "allOf": [ + { + "$ref": "#/components/schemas/FederatedRequest" + }, + { + "type": "object", + "properties": { + "parameters": { + "$ref": "#/components/schemas/EntityInfoParameters" + } + }, + "required": [ + "correlationId", + "parameters" + ] + } + ], + "examples": [ + { + "correlationId": "xyz", + "parameters": { + "entityId": "345" + } + } + ] + }, + "EntityInfoParameters": { + "title": "EntityInfoParameters", + "type": "object", + "properties": { + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + } + }, + "required": [ + "entityId" + ], + "additionalProperties": false, + "examples": [ + { + "entityId": "345" + } + ] + }, + "EntityInfoFederatedResponse": { + "title": "EntityInfoFederatedResponse", + "allOf": [ + { + "$ref": "#/components/schemas/FederatedResponse" + }, + { + "type": "object", + "properties": { + "result": { + "$ref": "#/x-schemas/Discovery/EntityInfoResult" + } + } + } + ] + }, + "EntityInfoResult": { + "title": "EntityInfoResult", + "description": "The result for an `entityInfo()` push or pull.", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "entity": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + }, + "related": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + } + } + }, + "required": [ + "expires", + "entity" + ], + "additionalProperties": false + }, + "PurchasedContentFederatedRequest": { + "title": "PurchasedContentFederatedRequest", + "allOf": [ + { + "$ref": "#/components/schemas/FederatedRequest" + }, + { + "type": "object", + "properties": { + "parameters": { + "$ref": "#/components/schemas/PurchasedContentParameters" + } + }, + "required": [ + "correlationId", + "parameters" + ] + } + ], + "examples": [ + { + "correlationId": "xyz", + "parameters": { + "limit": 100 + } + } + ] + }, + "PurchasedContentParameters": { + "title": "PurchasedContentParameters", + "type": "object", + "properties": { + "limit": { + "type": "integer", + "minimum": -1 + }, + "offeringType": { + "$ref": "#/x-schemas/Entertainment/OfferingType" + }, + "programType": { + "$ref": "#/x-schemas/Entertainment/ProgramType" + } + }, + "required": [ + "limit" + ], + "additionalProperties": false, + "examples": [ + { + "limit": 100 + } + ] + }, + "PurchasedContentFederatedResponse": { + "title": "PurchasedContentFederatedResponse", + "allOf": [ + { + "$ref": "#/components/schemas/FederatedResponse" + }, + { + "type": "object", + "properties": { + "result": { + "$ref": "#/x-schemas/Discovery/PurchasedContentResult" + } + } + } + ] + }, + "PurchasedContentResult": { + "title": "PurchasedContentResult", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "totalCount": { + "type": "integer", + "minimum": 0 + }, + "entries": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + } + } + }, + "required": [ + "expires", + "totalCount", + "entries" + ], + "additionalProperties": false + }, + "Availability": { + "title": "Availability", + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "channel-lineup", + "program-lineup" + ] + }, + "id": { + "type": "string" + }, + "catalogId": { + "type": "string" + }, + "startTime": { + "type": "string", + "format": "date-time" + }, + "endTime": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "type", + "id" + ] + }, + "ContentAccessIdentifiers": { + "title": "ContentAccessIdentifiers", + "type": "object", + "properties": { + "availabilities": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Availability" + }, + "description": "A list of identifiers that represent what content is discoverable for the subscriber. Excluding availabilities will cause no change to the availabilities that are stored for this subscriber. Providing an empty array will clear the subscriber's availabilities" + }, + "entitlements": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/Entitlement" + }, + "description": "A list of identifiers that represent what content is consumable for the subscriber. Excluding entitlements will cause no change to the entitlements that are stored for this subscriber. Providing an empty array will clear the subscriber's entitlements" + } + }, + "required": [] + }, + "TuneChannels": { + "title": "TuneChannels", + "description": "An enumeration of xrn values for the TuneIntent that have special meaning.", + "type": "string", + "enum": [ + "xrn:firebolt:channel:any" + ] + }, + "UserInterestProviderParameters": { + "title": "UserInterestProviderParameters", + "type": "object", + "required": [ + "type", + "reason" + ], + "properties": { + "type": { + "$ref": "#/x-schemas/Discovery/InterestType" + }, + "reason": { + "$ref": "#/x-schemas/Discovery/InterestReason" + } + } + }, + "HDMIPortId": { + "type": "string", + "pattern": "^HDMI[0-9]+$" + }, + "EDIDVersion": { + "title": "EDIDVersion", + "type": "string", + "enum": [ + "1.4", + "2.0", + "unknown" + ] + }, + "HDMIInputPort": { + "title": "HDMIInputPort", + "type": "object", + "additionalProperties": false, + "properties": { + "port": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "connected": { + "type": "boolean" + }, + "signal": { + "$ref": "#/components/schemas/HDMISignalStatus" + }, + "arcCapable": { + "type": "boolean" + }, + "arcConnected": { + "type": "boolean" + }, + "edidVersion": { + "$ref": "#/components/schemas/EDIDVersion" + }, + "autoLowLatencyModeCapable": { + "type": "boolean" + }, + "autoLowLatencyModeSignalled": { + "type": "boolean" + } + }, + "if": { + "properties": { + "edidVersion": { + "type": "string", + "enum": [ + "1.4", + "unknown" + ] + } + } + }, + "then": { + "properties": { + "autoLowLatencyModeCapable": { + "const": false + }, + "autoLowLatencyModeSignalled": { + "const": false + } + } + }, + "required": [ + "port", + "connected", + "signal", + "arcCapable", + "arcConnected", + "edidVersion", + "autoLowLatencyModeCapable", + "autoLowLatencyModeSignalled" + ] + }, + "HDMISignalStatus": { + "type": "string", + "enum": [ + "none", + "stable", + "unstable", + "unsupported", + "unknown" + ] + }, + "SignalChangedInfo": { + "title": "SignalChangedInfo", + "type": "object", + "properties": { + "port": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "signal": { + "$ref": "#/components/schemas/HDMISignalStatus" + } + }, + "required": [ + "port", + "signal" + ] + }, + "ConnectionChangedInfo": { + "title": "ConnectionChangedInfo", + "type": "object", + "properties": { + "port": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "connected": { + "type": "boolean" + } + } + }, + "AutoLowLatencyModeSignalChangedInfo": { + "title": "AutoLowLatencyModeSignalChangedInfo", + "type": "object", + "properties": { + "port": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "autoLowLatencyModeSignalled": { + "type": "boolean" + } + } + }, + "AutoLowLatencyModeCapableChangedInfo": { + "title": "AutoLowLatencyModeCapableChangedInfo", + "type": "object", + "properties": { + "port": { + "$ref": "#/components/schemas/HDMIPortId" + }, + "enabled": { + "type": "boolean" + } + }, + "required": [ + "port", + "enabled" + ] + }, + "EmailUsage": { + "title": "EmailUsage", + "type": "string", + "enum": [ + "signIn", + "signUp" + ] + }, + "KeyboardType": { + "title": "KeyboardType", + "type": "string", + "description": "The type of keyboard to show to the user", + "enum": [ + "standard", + "email", + "password" + ] + }, + "KeyboardParameters": { + "title": "KeyboardParameters", + "type": "object", + "required": [ + "message" + ], + "properties": { + "message": { + "description": "The message to display to the user so the user knows what they are entering", + "type": "string" + } + }, + "examples": [ + { + "type": "standard", + "message": "Enter your user name." + } + ] + }, + "KeyboardProviderRequest": { + "title": "KeyboardProviderRequest", + "type": "object", + "required": [ + "correlationId", + "parameters" + ], + "properties": { + "correlationId": { + "type": "string", + "description": "An id to correlate the provider response with this request" + }, + "parameters": { + "description": "The request to start a keyboard session", + "$ref": "#/components/schemas/KeyboardParameters" + } + } + }, + "LifecycleEvent": { + "title": "LifecycleEvent", + "description": "A an object describing the previous and current states", + "type": "object", + "required": [ + "state", + "previous" + ], + "properties": { + "state": { + "$ref": "#/x-schemas/Lifecycle/LifecycleState", + "description": "The current lifcycle state" + }, + "previous": { + "$ref": "#/x-schemas/Lifecycle/LifecycleState", + "description": "The previous lifcycle state" + }, + "source": { + "type": "string", + "enum": [ + "voice", + "remote" + ], + "description": "The source of the lifecycle change." + } + } + }, + "LatLon": { + "type": "array", + "items": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + }, + "MediaPosition": { + "title": "MediaPosition", + "description": "Represents a position inside playback content, as a decimal percentage (0-0.999) for content with a known duration, or an integer number of seconds (0-86400) for content with an unknown duration.", + "oneOf": [ + { + "const": 0 + }, + { + "type": "number", + "exclusiveMinimum": 0, + "exclusiveMaximum": 1 + }, + { + "type": "integer", + "minimum": 1, + "maximum": 86400 + } + ] + }, + "ErrorType": { + "title": "ErrorType", + "type": "string", + "enum": [ + "network", + "media", + "restriction", + "entitlement", + "other" + ] + }, + "EventObjectPrimitives": { + "title": "EventObjectPrimitives", + "anyOf": [ + { + "type": "string", + "maxLength": 256 + }, + { + "type": "number" + }, + { + "type": "integer" + }, + { + "type": "boolean" + }, + { + "type": "null" + } + ] + }, + "EventObject": { + "title": "EventObject", + "type": "object", + "maxProperties": 256, + "additionalProperties": { + "anyOf": [ + { + "$ref": "#/components/schemas/EventObjectPrimitives" + }, + { + "type": "array", + "maxItems": 256, + "items": { + "anyOf": [ + { + "$ref": "#/components/schemas/EventObjectPrimitives" + }, + { + "$ref": "#/components/schemas/EventObject" + } + ] + } + }, + { + "$ref": "#/components/schemas/EventObject" + } + ] + } + }, + "AppInitialization": { + "title": "AppInitialization", + "type": "object", + "properties": { + "us_privacy": { + "type": "string", + "description": "The IAB US Privacy string." + }, + "lmt": { + "type": "integer", + "description": "The IAB limit ad tracking opt out value." + }, + "discovery": { + "type": "object", + "properties": { + "navigateTo": { + "$ref": "#/x-schemas/Intents/NavigationIntent" + } + } + }, + "secondScreen": { + "type": "object", + "properties": { + "launchRequest": { + "$ref": "#/x-schemas/SecondScreen/SecondScreenEvent" + } + } + } + } + }, + "PinChallenge": { + "title": "PinChallenge", + "type": "object", + "required": [ + "requestor", + "pinSpace" + ], + "properties": { + "pinSpace": { + "type": "string", + "description": "The pin space that this challenge is for", + "enum": [ + "purchase", + "content" + ] + }, + "capability": { + "type": "string", + "description": "The capability that is gated by a pin challenge" + }, + "requestor": { + "description": "The identity of which app is requesting access to this capability", + "$ref": "#/components/schemas/ChallengeRequestor" + } + } + }, + "PinChallengeProviderRequest": { + "title": "PinChallengeProviderRequest", + "allOf": [ + { + "$ref": "#/x-schemas/Types/ProviderRequest" + }, + { + "type": "object", + "required": [ + "parameters" + ], + "properties": { + "parameters": { + "description": "The request to challenge the user", + "$ref": "#/components/schemas/PinChallenge" + } + } + } + ] + }, + "ResultReason": { + "title": "ResultReason", + "type": "string", + "description": "The reason for the result of challenging the user", + "enum": [ + "noPinRequired", + "noPinRequiredWindow", + "exceededPinFailures", + "correctPin", + "cancelled" + ] + }, + "PinChallengeResult": { + "title": "PinChallengeResult", + "type": "object", + "required": [ + "granted", + "reason" + ], + "properties": { + "granted": { + "oneOf": [ + { + "type": "boolean", + "description": "Whether the user succeeded in the pin challenge" + }, + { + "const": null + } + ] + }, + "reason": { + "$ref": "#/components/schemas/ResultReason", + "description": "The reason for the result " + } + } + }, + "PrivacySettings": { + "title": "PrivacySettings", + "type": "object", + "required": [ + "allowACRCollection", + "allowResumePoints", + "allowAppContentAdTargeting", + "allowCameraAnalytics", + "allowPersonalization", + "allowPrimaryBrowseAdTargeting", + "allowPrimaryContentAdTargeting", + "allowProductAnalytics", + "allowRemoteDiagnostics", + "allowUnentitledPersonalization", + "allowUnentitledResumePoints", + "allowWatchHistory" + ], + "properties": { + "allowACRCollection": { + "description": "", + "type": "boolean" + }, + "allowResumePoints": { + "description": "", + "type": "boolean" + }, + "allowAppContentAdTargeting": { + "description": "", + "type": "boolean" + }, + "allowCameraAnalytics": { + "description": "", + "type": "boolean" + }, + "allowPersonalization": { + "description": "", + "type": "boolean" + }, + "allowPrimaryBrowseAdTargeting": { + "description": "", + "type": "boolean" + }, + "allowPrimaryContentAdTargeting": { + "description": "", + "type": "boolean" + }, + "allowProductAnalytics": { + "description": "", + "type": "boolean" + }, + "allowRemoteDiagnostics": { + "description": "", + "type": "boolean" + }, + "allowUnentitledPersonalization": { + "description": "", + "type": "boolean" + }, + "allowUnentitledResumePoints": { + "description": "", + "type": "boolean" + }, + "allowWatchHistory": { + "description": "", + "type": "boolean" + } + }, + "examples": [ + { + "allowACRCollection": true, + "allowResumePoints": false, + "allowAppContentAdTargeting": false, + "allowCameraAnalytics": true, + "allowPersonalization": true, + "allowPrimaryBrowseAdTargeting": false, + "allowPrimaryContentAdTargeting": false, + "allowProductAnalytics": true, + "allowRemoteDiagnostics": true, + "allowUnentitledPersonalization": true, + "allowUnentitledResumePoints": false, + "allowWatchHistory": true + } + ] + }, + "StorageScope": { + "title": "StorageScope", + "type": "string", + "enum": [ + "device", + "account" + ], + "description": "The scope of the data" + }, + "StorageOptions": { + "title": "StorageOptions", + "type": "object", + "required": [ + "ttl" + ], + "properties": { + "ttl": { + "type": "number", + "description": "Seconds from set time before the data expires and is removed" + } + } + }, + "GrantInfo": { + "description": "Information about a grant given by a user", + "type": "object", + "properties": { + "app": { + "$ref": "#/components/schemas/AppInfo" + }, + "state": { + "$ref": "#/components/schemas/GrantState" + }, + "capability": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "role": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "lifespan": { + "type": "string", + "enum": [ + "once", + "forever", + "appActive", + "powerActive", + "seconds" + ] + }, + "expires": { + "type": "string", + "format": "date-time" + } + }, + "additionalProperties": false, + "required": [ + "state", + "capability", + "role", + "lifespan" + ], + "examples": [ + { + "app": { + "id": "certapp", + "title": "Firebolt Certification" + }, + "state": "granted", + "capability": "xrn:firebolt:capability:data:app-usage", + "role": "use", + "lifespan": "seconds", + "expires": "2022-12-14T20:20:39+00:00" + } + ] + }, + "AppInfo": { + "description": "Information about an app that a grant was for", + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "title": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "id" + ] + }, + "GrantState": { + "description": "The state the grant is in", + "type": "string", + "enum": [ + "granted", + "denied" + ] + }, + "GrantModificationOptions": { + "description": "Options when modifying any grant", + "type": "object", + "properties": { + "appId": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [] + }, + "RequestOptions": { + "title": "RequestOptions", + "type": "object", + "properties": { + "force": { + "type": "boolean", + "description": "Whether to force for user grant even if the previous decision stored" + } + } + }, + "AccessPointList": { + "title": "AccessPointList", + "type": "object", + "description": "List of scanned Wifi networks available near the device.", + "properties": { + "list": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AccessPoint" + } + } + } + }, + "WifiSecurityMode": { + "title": "WifiSecurityMode", + "description": "Security Mode supported for Wifi", + "type": "string", + "enum": [ + "none", + "wep64", + "wep128", + "wpaPskTkip", + "wpaPskAes", + "wpa2PskTkip", + "wpa2PskAes", + "wpaEnterpriseTkip", + "wpaEnterpriseAes", + "wpa2EnterpriseTkip", + "wpa2EnterpriseAes", + "wpa2Psk", + "wpa2Enterprise", + "wpa3PskAes", + "wpa3Sae" + ] + }, + "WifiSignalStrength": { + "title": "WifiSignalStrength", + "description": "Strength of Wifi signal, value is negative based on RSSI specification.", + "type": "integer", + "default": -255, + "minimum": -255, + "maximum": 0 + }, + "WifiFrequency": { + "title": "WifiFrequency", + "description": "Wifi Frequency in Ghz, example 2.4Ghz and 5Ghz.", + "type": "number", + "default": 0, + "minimum": 0 + }, + "AccessPoint": { + "title": "AccessPoint", + "description": "Properties of a scanned wifi list item.", + "type": "object", + "properties": { + "ssid": { + "type": "string", + "description": "Name of the wifi." + }, + "securityMode": { + "$ref": "#/components/schemas/WifiSecurityMode" + }, + "signalStrength": { + "$ref": "#/components/schemas/WifiSignalStrength" + }, + "frequency": { + "$ref": "#/components/schemas/WifiFrequency" + } + } + }, + "WPSSecurityPin": { + "title": "WPSSecurityPin", + "description": "Security pin type for WPS(Wifi Protected Setup).", + "type": "string", + "enum": [ + "pushButton", + "pin", + "manufacturerPin" + ] + }, + "WifiConnectRequest": { + "title": "WifiConnectRequest", + "description": "Request object for the wifi connection.", + "type": "object", + "properties": { + "ssid": { + "schema": { + "type": "string" + } + }, + "passphrase": { + "schema": { + "type": "string" + } + }, + "securityMode": { + "schema": { + "$ref": "#/components/schemas/WifiSecurityMode" + } + }, + "timeout": { + "schema": { + "$ref": "#/x-schemas/Types/Timeout" + } + } + } + } + } + }, + "x-schemas": { + "Types": { + "uri": "https://meta.comcast.com/firebolt/types", + "SemanticVersion": { + "title": "SemanticVersion", + "type": "object", + "properties": { + "major": { + "type": "integer", + "minimum": 0 + }, + "minor": { + "type": "integer", + "minimum": 0 + }, + "patch": { + "type": "integer", + "minimum": 0 + }, + "readable": { + "type": "string" + } + }, + "required": [ + "major", + "minor", + "patch", + "readable" + ], + "additionalProperties": false + }, + "ListenResponse": { + "title": "ListenResponse", + "type": "object", + "required": [ + "event", + "listening" + ], + "properties": { + "event": { + "type": "string", + "pattern": "[a-zA-Z]+\\.on[A-Z][a-zA-Z]+" + }, + "listening": { + "type": "boolean" + } + }, + "additionalProperties": false + }, + "ProviderRequest": { + "title": "ProviderRequest", + "type": "object", + "required": [ + "correlationId" + ], + "additionalProperties": false, + "properties": { + "correlationId": { + "type": "string", + "description": "The id that was passed in to the event that triggered a provider method to be called" + }, + "parameters": { + "description": "The result of the provider response.", + "type": [ + "object", + "null" + ] + } + } + }, + "AudioProfile": { + "title": "AudioProfile", + "type": "string", + "enum": [ + "stereo", + "dolbyDigital5.1", + "dolbyDigital5.1+", + "dolbyAtmos" + ] + }, + "LocalizedString": { + "title": "LocalizedString", + "description": "Localized string supports either a simple `string` or a Map of language codes to strings. When using a simple `string`, the current preferred langauge from `Localization.langauge()` is assumed.", + "oneOf": [ + { + "type": "string" + }, + { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + ], + "examples": [ + "A simple string, with no language code", + { + "en": "This is english", + "es": "esto es español" + } + ] + }, + "FlatMap": { + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + }, + "BooleanMap": { + "title": "BooleanMap", + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "Timeout": { + "title": "Timeout", + "description": "Defines the timeout in seconds. If the threshold for timeout is passed for any operation without a result it will throw an error.", + "type": "integer", + "default": 0, + "minimum": 0, + "maximum": 9999 + } + }, + "Accessibility": { + "uri": "https://meta.comcast.com/firebolt/accessibility", + "ClosedCaptionsSettings": { + "title": "ClosedCaptionsSettings", + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether or not closed-captions should be enabled by default" + }, + "styles": { + "$ref": "#/x-schemas/Accessibility/ClosedCaptionsStyles" + }, + "preferredLanguages": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Localization/ISO639_2Language" + } + } + }, + "examples": [ + { + "enabled": true, + "styles": { + "fontFamily": "monospaced_serif", + "fontSize": 1, + "fontColor": "#ffffff", + "fontEdge": "none", + "fontEdgeColor": "#7F7F7F", + "fontOpacity": 100, + "backgroundColor": "#000000", + "backgroundOpacity": 100, + "textAlign": "center", + "textAlignVertical": "middle", + "windowColor": "white", + "windowOpacity": 50 + }, + "preferredLanguages": [ + "eng", + "spa" + ] + } + ] + }, + "VoiceGuidanceSettings": { + "title": "VoiceGuidanceSettings", + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether or not voice guidance should be enabled by default" + }, + "speed": { + "$ref": "#/x-schemas/Accessibility/VoiceSpeed", + "description": "The speed at which voice guidance speech will be read back to the user" + } + }, + "examples": [ + { + "enabled": true, + "speed": 2 + } + ] + }, + "VoiceSpeed": { + "title": "VoiceSpeed", + "type": "number", + "minimum": 0.5, + "maximum": 2 + }, + "ClosedCaptionsStyles": { + "title": "ClosedCaptionsStyles", + "type": "object", + "description": "The default styles to use when displaying closed-captions", + "properties": { + "fontFamily": { + "$ref": "#/x-schemas/Accessibility/FontFamily" + }, + "fontSize": { + "$ref": "#/x-schemas/Accessibility/FontSize" + }, + "fontColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "fontEdge": { + "$ref": "#/x-schemas/Accessibility/FontEdge" + }, + "fontEdgeColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "fontOpacity": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "backgroundColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "backgroundOpacity": { + "$ref": "#/x-schemas/Accessibility/Opacity" + }, + "textAlign": { + "$ref": "#/x-schemas/Accessibility/HorizontalAlignment" + }, + "textAlignVertical": { + "$ref": "#/x-schemas/Accessibility/VerticalAlignment" + }, + "windowColor": { + "$ref": "#/x-schemas/Accessibility/Color" + }, + "windowOpacity": { + "$ref": "#/x-schemas/Accessibility/Opacity" + } + } + }, + "FontFamily": { + "type": [ + "string", + "null" + ], + "enum": [ + "monospaced_serif", + "proportional_serif", + "monospaced_sanserif", + "proportional_sanserif", + "smallcaps", + "cursive", + "casual", + null + ] + }, + "FontSize": { + "type": [ + "number", + "null" + ], + "minimum": 0 + }, + "Color": { + "type": [ + "string", + "null" + ] + }, + "FontEdge": { + "type": [ + "string", + "null" + ], + "enum": [ + "none", + "raised", + "depressed", + "uniform", + "drop_shadow_left", + "drop_shadow_right", + null + ] + }, + "Opacity": { + "type": [ + "number", + "null" + ], + "minimum": 0, + "maximum": 100 + }, + "HorizontalAlignment": { + "type": [ + "string", + "null" + ] + }, + "VerticalAlignment": { + "type": [ + "string", + "null" + ] + } + }, + "Localization": { + "uri": "https://meta.comcast.com/firebolt/localization", + "ISO639_2Language": { + "type": "string", + "pattern": "^[a-z]{3}$" + }, + "Locality": { + "type": "string" + }, + "CountryCode": { + "type": "string", + "pattern": "^[A-Z]{2}$" + }, + "Language": { + "type": "string", + "pattern": "^[A-Za-z]{2}$" + }, + "Locale": { + "type": "string", + "pattern": "^[a-zA-Z]+([a-zA-Z0-9\\-]*)$" + }, + "TimeZone": { + "type": "string", + "pattern": "^[-+_/ A-Za-z 0-9]*$" + } + }, + "Advertising": { + "uri": "https://meta.comcast.com/firebolt/advertising", + "SkipRestriction": { + "title": "SkipRestriction", + "$comment": "xrn:advertising:policy:skipRestriction:", + "type": "string", + "enum": [ + "none", + "adsUnwatched", + "adsAll", + "all" + ], + "description": "The advertisement skip restriction.\n\nApplies to fast-forward/rewind (e.g. trick mode), seeking over an entire opportunity (e.g. jump), seeking out of what's currently playing, and \"Skip this ad...\" features. Seeking over multiple ad opportunities only requires playback of the _last_ opportunity, not all opportunities, preceding the seek destination.\n\n| Value | Description |\n|--------------|--------------------------------------------------------------------------------|\n| none |No fast-forward, jump, or skip restrictions |\n| adsUnwatched | Restrict fast-forward, jump, and skip for unwatched ad opportunities only. |\n| adsAll | Restrict fast-forward, jump, and skip for all ad opportunities |\n| all | Restrict fast-forward, jump, and skip for all ad opportunities and all content |\n\nNamespace: `xrn:advertising:policy:skipRestriction:`\n\n" + } + }, + "Capabilities": { + "uri": "https://meta.comcast.com/firebolt/capabilities", + "Capability": { + "title": "Capability", + "type": "string", + "description": "A Capability is a discrete unit of functionality that a Firebolt device might be able to perform.", + "pattern": "^xrn:firebolt:capability:([a-z0-9\\-]+)((:[a-z0-9\\-]+)?)$" + }, + "CapabilityInfo": { + "title": "CapabilityInfo", + "type": "object", + "required": [ + "supported", + "available", + "use", + "manage", + "provide" + ], + "properties": { + "capability": { + "$ref": "#/x-schemas/Capabilities/Capability" + }, + "supported": { + "type": "boolean", + "description": "Provides info whether the capability is supported" + }, + "available": { + "type": "boolean", + "description": "Provides info whether the capability is available" + }, + "use": { + "$ref": "#/x-schemas/Capabilities/CapPermissionStatus" + }, + "manage": { + "$ref": "#/x-schemas/Capabilities/CapPermissionStatus" + }, + "provide": { + "$ref": "#/x-schemas/Capabilities/CapPermissionStatus" + }, + "details": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Capabilities/DenyReason" + }, + "minItems": 1, + "maxItems": 6 + } + }, + "additionalProperties": false, + "examples": [ + { + "capability": "xrn:firebolt:capability:keyboard", + "supported": true, + "available": true, + "use": { + "permitted": true, + "granted": true + }, + "manage": { + "permitted": true, + "granted": true + }, + "provide": { + "permitted": true, + "granted": true + } + } + ] + }, + "Permission": { + "title": "Permission", + "description": "A capability combined with a Role, which an app may be permitted (by a distributor) or granted (by an end user).", + "type": "object", + "required": [ + "capability" + ], + "properties": { + "role": { + "$ref": "#/x-schemas/Capabilities/Role" + }, + "capability": { + "$ref": "#/x-schemas/Capabilities/Capability" + } + }, + "additionalProperties": false + }, + "Role": { + "title": "Role", + "description": "Role provides access level for the app for a given capability.", + "type": "string", + "enum": [ + "use", + "manage", + "provide" + ] + }, + "CapPermissionStatus": { + "type": "object", + "properties": { + "permitted": { + "type": "boolean", + "description": "Provides info whether the capability is permitted" + }, + "granted": { + "oneOf": [ + { + "type": "boolean", + "description": "Provides info whether the capability is granted" + }, + { + "const": null + } + ] + } + }, + "additionalProperties": false + }, + "DenyReason": { + "title": "DenyReason", + "description": "Reasons why a Capability might not be invokable", + "type": "string", + "enum": [ + "unpermitted", + "unsupported", + "disabled", + "unavailable", + "grantDenied", + "ungranted" + ] + } + }, + "Discovery": { + "uri": "https://meta.comcast.com/firebolt/discovery", + "InterestType": { + "title": "InterestType", + "type": "string", + "enum": [ + "interest", + "disinterest" + ] + }, + "InterestReason": { + "title": "InterestReason", + "type": "string", + "enum": [ + "playlist", + "reaction", + "recording" + ] + }, + "EntityInfoResult": { + "title": "EntityInfoResult", + "description": "The result for an `entityInfo()` push or pull.", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "entity": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + }, + "related": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + } + } + }, + "required": [ + "expires", + "entity" + ], + "additionalProperties": false + }, + "PurchasedContentResult": { + "title": "PurchasedContentResult", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "totalCount": { + "type": "integer", + "minimum": 0 + }, + "entries": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/EntityInfo" + } + } + }, + "required": [ + "expires", + "totalCount", + "entries" + ], + "additionalProperties": false + } + }, + "Entity": { + "uri": "https://meta.comcast.com/firebolt/entity", + "EntityDetails": { + "title": "EntityDetails", + "type": "object", + "required": [ + "identifiers" + ], + "properties": { + "identifiers": { + "$ref": "#/x-schemas/Entity/Entity" + }, + "info": { + "$ref": "#/x-schemas/Entity/Metadata" + }, + "waysToWatch": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/WayToWatch" + }, + "description": "An array of ways a user is might watch this entity, regardless of entitlements." + } + } + }, + "Entity": { + "oneOf": [ + { + "$ref": "#/x-schemas/Entity/ProgramEntity" + }, + { + "$ref": "#/x-schemas/Entity/MusicEntity" + }, + { + "$ref": "#/x-schemas/Entity/ChannelEntity" + }, + { + "$ref": "#/x-schemas/Entity/UntypedEntity" + }, + { + "$ref": "#/x-schemas/Entity/PlaylistEntity" + } + ] + }, + "Metadata": { + "title": "Metadata", + "type": "object", + "properties": { + "title": { + "type": "string", + "description": "Title of the entity." + }, + "synopsis": { + "type": "string", + "description": "Short description of the entity." + }, + "seasonNumber": { + "type": "number", + "description": "For TV seasons, the season number. For TV episodes, the season that the episode belongs to." + }, + "seasonCount": { + "type": "number", + "description": "For TV series, seasons, and episodes, the total number of seasons." + }, + "episodeNumber": { + "type": "number", + "description": "For TV episodes, the episode number." + }, + "episodeCount": { + "type": "number", + "description": "For TV seasons and episodes, the total number of episodes in the current season." + }, + "releaseDate": { + "type": "string", + "format": "date-time", + "description": "The date that the program or entity was released or first aired." + }, + "contentRatings": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/ContentRating" + }, + "description": "A list of ContentRating objects, describing the entity's ratings in various rating schemes." + } + } + }, + "ProgramEntity": { + "title": "ProgramEntity", + "oneOf": [ + { + "$ref": "#/x-schemas/Entity/MovieEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVEpisodeEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVSeasonEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVSeriesEntity" + }, + { + "$ref": "#/x-schemas/Entity/AdditionalEntity" + } + ] + }, + "MusicEntity": { + "title": "MusicEntity", + "type": "object", + "properties": { + "entityType": { + "const": "music" + }, + "musicType": { + "$ref": "#/x-schemas/Entertainment/MusicType" + }, + "entityId": { + "type": "string" + } + }, + "required": [ + "entityType", + "musicType", + "entityId" + ] + }, + "ChannelEntity": { + "title": "ChannelEntity", + "type": "object", + "properties": { + "entityType": { + "const": "channel" + }, + "channelType": { + "type": "string", + "enum": [ + "streaming", + "overTheAir" + ] + }, + "entityId": { + "type": "string", + "description": "ID of the channel, in the target App's scope." + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "required": [ + "entityType", + "channelType", + "entityId" + ], + "additionalProperties": false + }, + "UntypedEntity": { + "title": "UntypedEntity", + "allOf": [ + { + "description": "A Firebolt compliant representation of the remaining entity types.", + "type": "object", + "required": [ + "entityId" + ], + "properties": { + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false + } + ], + "examples": [ + { + "entityId": "an-entity" + } + ] + }, + "PlaylistEntity": { + "title": "PlaylistEntity", + "description": "A Firebolt compliant representation of a Playlist entity.", + "type": "object", + "required": [ + "entityType", + "entityId" + ], + "properties": { + "entityType": { + "const": "playlist" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "playlist", + "entityId": "playlist/xyz" + } + ] + }, + "MovieEntity": { + "title": "MovieEntity", + "description": "A Firebolt compliant representation of a Movie entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "movie" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "movie", + "entityId": "el-camino" + } + ] + }, + "TVEpisodeEntity": { + "title": "TVEpisodeEntity", + "description": "A Firebolt compliant representation of a TV Episode entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId", + "seriesId", + "seasonId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "episode" + }, + "entityId": { + "type": "string" + }, + "seriesId": { + "type": "string" + }, + "seasonId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "episode", + "entityId": "breaking-bad-pilot", + "seriesId": "breaking-bad", + "seasonId": "breaking-bad-season-1" + } + ] + }, + "TVSeasonEntity": { + "title": "TVSeasonEntity", + "description": "A Firebolt compliant representation of a TV Season entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId", + "seriesId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "season" + }, + "entityId": { + "type": "string" + }, + "seriesId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "season", + "entityId": "breaking-bad-season-1", + "seriesId": "breaking-bad" + } + ] + }, + "TVSeriesEntity": { + "title": "TVSeriesEntity", + "description": "A Firebolt compliant representation of a TV Series entity.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "const": "series" + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "series", + "entityId": "breaking-bad" + } + ] + }, + "AdditionalEntity": { + "title": "AdditionalEntity", + "description": "A Firebolt compliant representation of the remaining program entity types.", + "type": "object", + "required": [ + "entityType", + "programType", + "entityId" + ], + "properties": { + "entityType": { + "const": "program" + }, + "programType": { + "type": "string", + "enum": [ + "concert", + "sportingEvent", + "preview", + "other", + "advertisement", + "musicVideo", + "minisode", + "extra" + ] + }, + "entityId": { + "type": "string" + }, + "assetId": { + "type": "string" + }, + "appContentData": { + "type": "string", + "maxLength": 256 + } + }, + "additionalProperties": false, + "examples": [ + { + "entityType": "program", + "programType": "concert", + "entityId": "live-aid" + } + ] + }, + "PlayableEntity": { + "title": "PlayableEntity", + "anyOf": [ + { + "$ref": "#/x-schemas/Entity/MovieEntity" + }, + { + "$ref": "#/x-schemas/Entity/TVEpisodeEntity" + }, + { + "$ref": "#/x-schemas/Entity/PlaylistEntity" + }, + { + "$ref": "#/x-schemas/Entity/MusicEntity" + }, + { + "$ref": "#/x-schemas/Entity/AdditionalEntity" + } + ] + } + }, + "Entertainment": { + "uri": "https://meta.comcast.com/firebolt/entertainment", + "WayToWatch": { + "title": "WayToWatch", + "type": "object", + "required": [ + "identifiers", + "audioProfile" + ], + "properties": { + "identifiers": { + "$ref": "#/x-schemas/Entertainment/ContentIdentifiers" + }, + "expires": { + "type": "string", + "format": "date-time", + "description": "Time when the WayToWatch is no longer available." + }, + "entitled": { + "type": "boolean", + "description": "Specify if the user is entitled to watch the entity." + }, + "entitledExpires": { + "type": "string", + "format": "date-time", + "description": "Time when the entity is no longer entitled." + }, + "offeringType": { + "$ref": "#/x-schemas/Entertainment/OfferingType" + }, + "hasAds": { + "type": "boolean", + "description": "True if the streamable asset contains ads." + }, + "price": { + "type": "number", + "description": "For \"buy\" and \"rent\" WayToWatch, the price to buy or rent in the user's preferred currency." + }, + "videoQuality": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "SD", + "HD", + "UHD" + ] + }, + "description": "List of the video qualities available via the WayToWatch." + }, + "audioProfile": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Types/AudioProfile" + }, + "description": "List of the audio types available via the WayToWatch." + }, + "audioLanguages": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of audio track languages available on the WayToWatch. The first is considered the primary language. Languages are expressed as ISO 639 1/2 codes." + }, + "closedCaptions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of languages for which closed captions are available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes." + }, + "subtitles": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of languages for which subtitles are available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes." + }, + "audioDescriptions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of languages for which audio descriptions (DVD) as available on the WayToWatch. Languages are expressed as ISO 639 1/2 codes." + } + }, + "description": "A WayToWatch describes a way to watch a video program. It may describe a single\nstreamable asset or a set of streamable assets. For example, an app provider may\ndescribe HD, SD, and UHD assets as individual WayToWatch objects or rolled into\na single WayToWatch.\n\nIf the WayToWatch represents a single streamable asset, the provided\nContentIdentifiers must be sufficient to play back the specific asset when sent\nvia a playback intent or deep link. If the WayToWatch represents multiple\nstreamable assets, the provided ContentIdentifiers must be sufficient to\nplayback one of the assets represented with no user action. In this scenario,\nthe app SHOULD choose the best asset for the user based on their device and\nsettings. The ContentIdentifiers MUST also be sufficient for navigating the user\nto the appropriate entity or detail screen via an entity intent.\n\nThe app should set the `entitled` property to indicate if the user can watch, or\nnot watch, the asset without making a purchase. If the entitlement is known to\nexpire at a certain time (e.g., a rental), the app should also provide the\n`entitledExpires` property. If the entitlement is not expired, the UI will use\nthe `entitled` property to display watchable assets to the user, adjust how\nassets are presented to the user, and how intents into the app are generated.\nFor example, the the Aggregated Experience could render a \"Watch\" button for an\nentitled asset versus a \"Subscribe\" button for an non-entitled asset.\n\nThe app should set the `offeringType` to define how the content may be\nauthorized. The UI will use this to adjust how content is presented to the user.\n\nA single WayToWatch cannot represent streamable assets available via multiple\npurchase paths. If, for example, an asset has both Buy, Rent and Subscription\navailability, the three different entitlement paths MUST be represented as\nmultiple WayToWatch objects.\n\n`price` should be populated for WayToWatch objects with `buy` or `rent`\n`offeringType`. If the WayToWatch represents a set of assets with various price\npoints, the `price` provided must be the lowest available price." + }, + "OfferingType": { + "title": "OfferingType", + "type": "string", + "enum": [ + "free", + "subscribe", + "buy", + "rent" + ], + "description": "The offering type of the WayToWatch." + }, + "ContentIdentifiers": { + "title": "ContentIdentifiers", + "type": "object", + "properties": { + "assetId": { + "type": "string", + "description": "Identifies a particular playable asset. For example, the HD version of a particular movie separate from the UHD version." + }, + "entityId": { + "type": "string", + "description": "Identifies an entity, such as a Movie, TV Series or TV Episode." + }, + "seasonId": { + "type": "string", + "description": "The TV Season for a TV Episode." + }, + "seriesId": { + "type": "string", + "description": "The TV Series for a TV Episode or TV Season." + }, + "appContentData": { + "type": "string", + "description": "App-specific content identifiers.", + "maxLength": 1024 + } + }, + "description": "The ContentIdentifiers object is how the app identifies an entity or asset to\nthe Firebolt platform. These ids are used to look up metadata and deep link into\nthe app.\n\nApps do not need to provide all ids. They only need to provide the minimum\nrequired to target a playable stream or an entity detail screen via a deep link.\nIf an id isn't needed to get to those pages, it doesn't need to be included." + }, + "ContentRating": { + "title": "ContentRating", + "type": "object", + "required": [ + "scheme", + "rating" + ], + "properties": { + "scheme": { + "type": "string", + "enum": [ + "CA-Movie", + "CA-TV", + "CA-Movie-Fr", + "CA-TV-Fr", + "US-Movie", + "US-TV" + ], + "description": "The rating scheme." + }, + "rating": { + "type": "string", + "description": "The content rating." + }, + "advisories": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Optional list of subratings or content advisories." + } + }, + "description": "A ContentRating represents an age or content based of an entity. Supported rating schemes and associated types are below.\n\n## United States\n\n`US-Movie` (MPAA):\n\nRatings: `NR`, `G`, `PG`, `PG13`, `R`, `NC17`\n\nAdvisories: `AT`, `BN`, `SL`, `SS`, `N`, `V`\n\n`US-TV` (Vchip):\n\nRatings: `TVY`, `TVY7`, `TVG`, `TVPG`, `TV14`, `TVMA`\n\nAdvisories: `FV`, `D`, `L`, `S`, `V`\n\n## Canada\n\n`CA-Movie` (OFRB):\n\nRatings: `G`, `PG`, `14A`, `18A`, `R`, `E`\n\n`CA-TV` (AGVOT)\n\nRatings: `E`, `C`, `C8`, `G`, `PG`, `14+`, `18+`\n\nAdvisories: `C`, `C8`, `G`, `PG`, `14+`, `18+`\n\n`CA-Movie-Fr` (Canadian French language movies):\n\nRatings: `G`, `8+`, `13+`, `16+`, `18+`\n\n`CA-TV-Fr` (Canadian French language TV):\n\nRatings: `G`, `8+`, `13+`, `16+`, `18+`\n" + }, + "MusicType": { + "title": "MusicType", + "type": "string", + "description": "In the case of a music `entityType`, specifies the type of music entity.", + "enum": [ + "song", + "album" + ] + }, + "Entitlement": { + "title": "Entitlement", + "type": "object", + "properties": { + "entitlementId": { + "type": "string" + }, + "startTime": { + "type": "string", + "format": "date-time" + }, + "endTime": { + "type": "string", + "format": "date-time" + } + }, + "required": [ + "entitlementId" + ] + }, + "EntityInfo": { + "title": "EntityInfo", + "description": "An EntityInfo object represents an \"entity\" on the platform. Currently, only entities of type `program` are supported. `programType` must be supplied to identify the program type.\n\nAdditionally, EntityInfo objects must specify a properly formed\nContentIdentifiers object, `entityType`, and `title`. The app should provide\nthe `synopsis` property for a good user experience if the content\nmetadata is not available another way.\n\nThe ContentIdentifiers must be sufficient for navigating the user to the\nappropriate entity or detail screen via a `detail` intent or deep link.\n\nEntityInfo objects must provide at least one WayToWatch object when returned as\npart of an `entityInfo` method and a streamable asset is available to the user.\nIt is optional for the `purchasedContent` method, but recommended because the UI\nmay use those data.", + "type": "object", + "required": [ + "identifiers", + "entityType", + "title" + ], + "properties": { + "identifiers": { + "$ref": "#/x-schemas/Entertainment/ContentIdentifiers" + }, + "title": { + "type": "string", + "description": "Title of the entity." + }, + "entityType": { + "type": "string", + "enum": [ + "program", + "music" + ], + "description": "The type of the entity, e.g. `program` or `music`." + }, + "programType": { + "$ref": "#/x-schemas/Entertainment/ProgramType" + }, + "musicType": { + "$ref": "#/x-schemas/Entertainment/MusicType" + }, + "synopsis": { + "type": "string", + "description": "Short description of the entity." + }, + "seasonNumber": { + "type": "number", + "description": "For TV seasons, the season number. For TV episodes, the season that the episode belongs to." + }, + "seasonCount": { + "type": "number", + "description": "For TV series, seasons, and episodes, the total number of seasons." + }, + "episodeNumber": { + "type": "number", + "description": "For TV episodes, the episode number." + }, + "episodeCount": { + "type": "number", + "description": "For TV seasons and episodes, the total number of episodes in the current season." + }, + "releaseDate": { + "type": "string", + "format": "date-time", + "description": "The date that the program or entity was released or first aired." + }, + "contentRatings": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/ContentRating" + }, + "description": "A list of ContentRating objects, describing the entity's ratings in various rating schemes." + }, + "waysToWatch": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/WayToWatch" + }, + "description": "An array of ways a user is might watch this entity, regardless of entitlements." + } + }, + "if": { + "properties": { + "entityType": { + "const": "program" + } + } + }, + "then": { + "required": [ + "programType" + ], + "not": { + "required": [ + "musicType" + ] + } + }, + "else": { + "required": [ + "musicType" + ], + "not": { + "required": [ + "programType" + ] + } + } + }, + "ProgramType": { + "title": "ProgramType", + "type": "string", + "description": "In the case of a program `entityType`, specifies the program type.", + "enum": [ + "movie", + "episode", + "season", + "series", + "other", + "preview", + "extra", + "concert", + "sportingEvent", + "advertisement", + "musicVideo", + "minisode" + ] + } + }, + "Intents": { + "uri": "https://meta.comcast.com/firebolt/intents", + "NavigationIntent": { + "title": "NavigationIntent", + "description": "A Firebolt compliant representation of a user intention to navigate to a specific place in an app.", + "anyOf": [ + { + "$ref": "#/x-schemas/Intents/HomeIntent" + }, + { + "$ref": "#/x-schemas/Intents/LaunchIntent" + }, + { + "$ref": "#/x-schemas/Intents/EntityIntent" + }, + { + "$ref": "#/x-schemas/Intents/PlaybackIntent" + }, + { + "$ref": "#/x-schemas/Intents/SearchIntent" + }, + { + "$ref": "#/x-schemas/Intents/SectionIntent" + }, + { + "$ref": "#/x-schemas/Intents/TuneIntent" + }, + { + "$ref": "#/x-schemas/Intents/PlayEntityIntent" + }, + { + "$ref": "#/x-schemas/Intents/PlayQueryIntent" + } + ] + }, + "HomeIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to it's home screen, and bring that app to the foreground if needed.", + "title": "HomeIntent", + "allOf": [ + { + "title": "HomeIntent", + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "title": "HomeIntent", + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "title": "HomeIntent", + "type": "object", + "properties": { + "action": { + "const": "home" + } + }, + "not": { + "required": [ + "data" + ] + } + } + ], + "examples": [ + { + "action": "home", + "context": { + "source": "voice" + } + } + ] + }, + "LaunchIntent": { + "description": "A Firebolt compliant representation of a user intention to launch an app.", + "title": "LaunchIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "launch" + } + }, + "not": { + "required": [ + "data" + ] + } + } + ], + "examples": [ + { + "action": "launch", + "context": { + "source": "voice" + } + } + ] + }, + "EntityIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a specific entity page, and bring that app to the foreground if needed.", + "title": "EntityIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "entity" + }, + "data": { + "$ref": "#/x-schemas/Entity/Entity" + } + } + } + ], + "examples": [ + { + "action": "entity", + "context": { + "source": "voice" + }, + "data": { + "entityType": "program", + "programType": "movie", + "entityId": "el-camino" + } + } + ] + }, + "PlaybackIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a the video player for a specific, playable entity, and bring that app to the foreground if needed.", + "title": "PlaybackIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "playback" + }, + "data": { + "$ref": "#/x-schemas/Entity/PlayableEntity" + } + } + } + ], + "examples": [ + { + "action": "playback", + "data": { + "entityType": "program", + "programType": "episode", + "entityId": "breaking-bad-pilot", + "seriesId": "breaking-bad", + "seasonId": "breaking-bad-season-1" + }, + "context": { + "source": "voice" + } + } + ] + }, + "SearchIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to it's search UI with a search term populated, and bring that app to the foreground if needed.", + "title": "SearchIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "search" + }, + "data": { + "type": "object", + "required": [ + "query" + ], + "properties": { + "query": { + "type": "string" + }, + "suggestions": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entity/Entity" + } + } + }, + "additionalProperties": false + } + } + } + ], + "examples": [ + { + "action": "search", + "data": { + "query": "walter white" + }, + "context": { + "source": "voice" + } + } + ] + }, + "SectionIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a section not covered by `home`, `entity`, `player`, or `search`, and bring that app to the foreground if needed.", + "title": "SectionIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "section" + }, + "data": { + "type": "object", + "required": [ + "sectionName" + ], + "properties": { + "sectionName": { + "type": "string" + } + }, + "additionalProperties": false + } + }, + "required": [ + "data" + ] + } + ], + "examples": [ + { + "action": "section", + "data": { + "sectionName": "settings" + }, + "context": { + "source": "voice" + } + } + ] + }, + "TuneIntent": { + "description": "A Firebolt compliant representation of a user intention to 'tune' to a traditional over-the-air broadcast, or an OTT Stream from an OTT or vMVPD App.", + "title": "TuneIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "tune" + }, + "data": { + "type": "object", + "required": [ + "entity" + ], + "additionalProperties": false, + "properties": { + "entity": { + "$ref": "#/x-schemas/Entity/ChannelEntity" + }, + "options": { + "description": "The options property of the data property MUST have only one of the following fields.", + "type": "object", + "required": [], + "additionalProperties": false, + "minProperties": 1, + "maxProperties": 1, + "properties": { + "assetId": { + "type": "string", + "description": "The ID of a specific 'listing', as scoped by the target App's ID-space, which the App should begin playback from." + }, + "restartCurrentProgram": { + "type": "boolean", + "description": "Denotes that the App should start playback at the most recent program boundary, rather than 'live.'" + }, + "time": { + "type": "string", + "format": "date-time", + "description": "ISO 8601 Date/Time where the App should begin playback from." + } + } + } + } + } + } + } + ], + "examples": [ + { + "action": "tune", + "data": { + "entity": { + "entityType": "channel", + "channelType": "streaming", + "entityId": "an-ott-channel" + }, + "options": { + "restartCurrentProgram": true + } + }, + "context": { + "source": "voice" + } + } + ] + }, + "PlayEntityIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a the video player for a specific, playable entity, and bring that app to the foreground if needed.", + "title": "PlayEntityIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "play-entity" + }, + "data": { + "type": "object", + "properties": { + "entity": { + "$ref": "#/x-schemas/Entity/PlayableEntity" + }, + "options": { + "type": "object", + "properties": { + "playFirstId": { + "type": "string" + }, + "playFirstTrack": { + "type": "integer", + "minimum": 1 + } + }, + "additionalProperties": false + } + }, + "required": [ + "entity" + ], + "propertyNames": { + "enum": [ + "entity", + "options" + ] + }, + "if": { + "properties": { + "entity": { + "type": "object", + "required": [ + "entityType" + ], + "properties": { + "entityType": { + "const": "playlist" + } + } + } + } + }, + "then": { + "type": "object", + "properties": { + "options": { + "type": "object", + "maxProperties": 1 + } + } + }, + "else": { + "type": "object", + "properties": { + "options": { + "type": "object", + "maxProperties": 0 + } + } + } + } + } + } + ], + "examples": [ + { + "action": "play-entity", + "data": { + "entity": { + "entityType": "playlist", + "entityId": "playlist/xyz" + }, + "options": { + "playFirstId": "song/xyz" + } + }, + "context": { + "source": "voice" + } + }, + { + "action": "play-entity", + "data": { + "entity": { + "entityType": "playlist", + "entityId": "playlist/xyz" + }, + "options": { + "playFirstTrack": 3 + } + }, + "context": { + "source": "voice" + } + } + ] + }, + "PlayQueryIntent": { + "description": "A Firebolt compliant representation of a user intention to navigate an app to a the video player for an abstract query to be searched for and played by the app.", + "title": "PlayQueryIntent", + "allOf": [ + { + "$ref": "#/x-schemas/Intents/Intent" + }, + { + "$ref": "#/x-schemas/Intents/IntentProperties" + }, + { + "type": "object", + "required": [ + "data" + ], + "properties": { + "action": { + "const": "play-query" + }, + "data": { + "type": "object", + "properties": { + "query": { + "type": "string" + }, + "options": { + "type": "object", + "properties": { + "programTypes": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/ProgramType" + } + }, + "musicTypes": { + "type": "array", + "items": { + "$ref": "#/x-schemas/Entertainment/MusicType" + } + } + }, + "additionalProperties": false + } + }, + "required": [ + "query" + ], + "propertyNames": { + "enum": [ + "query", + "options" + ] + } + } + } + } + ], + "examples": [ + { + "action": "play-query", + "data": { + "query": "Ed Sheeran" + }, + "context": { + "source": "voice" + } + }, + { + "action": "play-query", + "data": { + "query": "Ed Sheeran", + "options": { + "programTypes": [ + "movie" + ] + } + }, + "context": { + "source": "voice" + } + }, + { + "action": "play-query", + "data": { + "query": "Ed Sheeran", + "options": { + "programTypes": [ + "movie" + ], + "musicTypes": [ + "song" + ] + } + }, + "context": { + "source": "voice" + } + } + ] + }, + "Intent": { + "description": "A Firebolt compliant representation of a user intention.", + "type": "object", + "required": [ + "action", + "context" + ], + "properties": { + "action": { + "type": "string" + }, + "context": { + "type": "object", + "required": [ + "source" + ], + "properties": { + "source": { + "type": "string" + } + } + } + } + }, + "IntentProperties": { + "type": "object", + "propertyNames": { + "enum": [ + "action", + "data", + "context" + ] + } + } + }, + "Lifecycle": { + "uri": "https://meta.comcast.com/firebolt/lifecycle", + "CloseReason": { + "title": "CloseReason", + "description": "The application close reason", + "type": "string", + "enum": [ + "remoteButton", + "userExit", + "done", + "error" + ] + }, + "LifecycleState": { + "title": "LifecycleState", + "description": "The application lifecycle state", + "type": "string", + "enum": [ + "initializing", + "inactive", + "foreground", + "background", + "unloading", + "suspended" + ] + } + }, + "SecondScreen": { + "uri": "https://meta.comcast.com/firebolt/secondscreen", + "SecondScreenEvent": { + "title": "SecondScreenEvent", + "description": "An a message notification from a second screen device", + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "dial" + ] + }, + "version": { + "type": "string" + }, + "data": { + "type": "string" + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/requirements/pr-fix-ci-fb-version/specifications/general/capabilities/index.md b/requirements/pr-fix-ci-fb-version/specifications/general/capabilities/index.md new file mode 100644 index 000000000..71673610a --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/general/capabilities/index.md @@ -0,0 +1,668 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: Capabilities +category: requirements +type: specification +--- +# Capabilities + +Document Status: Candidate Specification + +See [Firebolt Requirements Governance](../../../governance) for more info. + +| Contributor | Organization | +| -------------- | -------------- | +| Andrew Bennett | Sky | +| Tim Dibben | Sky | +| Jeremy LaCivita | Comcast | +| Kevin Pearson | Comcast | +| Peter Yu | Comcast | + +## 1. Overview + +This document introduces Firebolt Capabilities, which enable discovery +of supported features, negotiation of App permissions, and end-user +grants for Apps to access sensitive features. + +Apps can detect if Capabilities are supported and available. If so, Apps +can **Use**, **Provide**, or **Manage** capabilities that they are given +access to. + +The most common case is for an App to `use` a Capability, the platform +to `provide` it, and the Distributor\'s Settings App to `manage` it: + +![Diagram Description automatically +generated](../../../images/specifications/general/capabilities/image1.png) + +However, Apps may also provide Capabilities back to the platform: + +![Diagram Description automatically +generated](../../../images/specifications/general/capabilities/image2.png) + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. Introduction to Capabilities](#3-introduction-to-capabilities) + - [3.1. Capabilities](#31-capabilities) + - [3.2. Availability](#32-availability) + - [3.3. Permissions](#33-permissions) + - [3.4. Roles](#34-roles) + - [3.5. User Grants](#35-user-grants) +- [4. How Capabilities Work](#4-how-capabilities-work) + - [4.1. Supported Capabilities](#41-supported-capabilities) + - [4.2. Available Capabilities](#42-available-capabilities) + - [4.3. Permitted Capabilities](#43-permitted-capabilities) + - [4.4. User Granted Capabilities](#44-user-granted-capabilities) + - [4.5. Invoking Capabilities](#45-invoking-capabilities) +- [5. Configuring Device Capabilities](#5-configuring-device-capabilities) + - [5.1. Device Supported Capabilities](#51-device-supported-capabilities) + - [5.2. Device Grant Policy Overrides](#52-device-grant-policy-overrides) +- [6. Capability Schemas](#6-capability-schemas) + - [6.1. Firebolt Specification Manifest](#61-firebolt-specification-manifest) + - [6.2. Firebolt Device Manifest](#62-firebolt-device-manifest) +- [7. Capability to Feature Mapping](#7-capability-to-feature-mapping) + - [7.1. App installation](#71-app-installation) + - [7.2. Firebolt APIs](#72-firebolt-apis) + - [7.3. Extension APIs](#73-extension-apis) + - [7.4. Hidden Permissions](#74-hidden-permissions) +- [8. Firebolt Capability Catalog](#8-firebolt-capability-catalog) +- [9. APIs](#9-apis) + - [9.1. Core SDK APIs](#91-core-sdk-apis) + - [9.2. Manage SDK APIs](#92-manage-sdk-apis) + +## 3. Introduction to Capabilities + +This section is non-normative and defines the key concepts behind the +Firebolt Capabilities system. Each portion of this section provides a +background and conversational definitions of the terms used in the rest +of this document, and through all Firebolt Requirements Specifications. + +### 3.1. Capabilities + +A Capability is a discrete unit of functionality that a Firebolt device +might be able to perform. It is granular enough to enable appropriate +access controls across all Firebolt Apps, but useful enough to be a +meaningful functional unit that an App might care about. Bluetooth is a +good example of a Capability. + +The Firebolt Specification determines the range of possible +Capabilities. + +Firebolt platforms advertise which Capabilities are supported. The set +of capabilities supported by a device is an immutable set and will never +change at runtime. Supporting Wi-Fi and having an active Wi-Fi +connection are two different things. + +Firebolt platforms determine if an App is allowed to invoke the +different aspects of a Capability (see [Roles](#roles), below). + +Firebolt Apps list which Capabilities are required and optional for the +App to be installed. + +Firebolt Apps inspect which Capabilities are supported and active. + +Firebolt Distributors sign off on some, or all, of the App's listed +required and optional Capabilities. + +### 3.2. Availability + +A Capability may rely on intermittently available resources, for example +a network capability requires an Ethernet or Wi-Fi network connection. + +A supported capability is only considered available if those resources +could be used by the App right now (without taking into account any needed permissions or [User Grants](#user-grants)). For example, the needed +resources are not disabled, not tied up by the platform, and not experiencing +any intermittent network, hardware, or signal issues. + +A supported capability is always supported, but it may not always be +*available*. + +Availability of a capability is a global status, not a per-app status. + +If a Capability is available, then it is considered available globally. +Capabilities can not be available to one app, while simultaneously being +unavailable to another app. This is handled by permissions, or by +capability-specific error management, e.g. returning an error to an app that +attempts to use the video pipeline while in the Inactive Lifecycle state. + +### 3.3. Permissions + +A Permission is what allows an App to attempt to invoke an aspect of a +Capability. Permissions to a Capability are assigned to an App with a +[Role](#roles), by a Firebolt Distributor. + +Firebolt documents and APIs will use the term "Permission" +interchangeably with phrases like: + +- An App's Assigned Role for a Capability + +- App + Capability + Role + +- Etc. + +The Firebolt Specification determines which Capabilities require +Permissions. + +The Firebolt Specification determines which Permission requirements may +be overridden by Distributors. + +An App is considered to have Permission to a Capability if it is: + +- Listed with a Role in the App's manifest and signed by the App + provider + +- Listed and signed again by the Distributor on the App's behalf + +- Listed and signed by the App Publisher when running in self-signed developer + mode + +An App can invoke a Capability if: + +- It has permission, which includes a Role, for that capability + +- The capability is supported by the current device + +- The App is invoking aspects of the capability that it has the + appropriate Role for + +- The capability is [Available](#availability) at time of invocation + +See [Permitted Capabilities](#permitted-capabilities) for more info. + +### 3.4. Roles + +Every Firebolt Capability has exactly three roles: + +- Use + +- Manage + +- Provide + +While these roles will be defined on a case-by-case basis for each +capability, they should generally follow the guidelines set here. + +The `Use` role is for providing basic access so that an App can leverage +the standard use cases of the Capability. The `Use` role will not enable +an App to perform management tasks such as turning the Capability on and +off for the entire device. The `Use` role will not enable an App to +perform administrative tasks such as renaming HDMI inputs, etc. + +The `Manage` role is for providing access to a Capability's management +and administrative features. This role may be used to allow an App to +build a Settings UI for the Capability, for example. The `Manage` role +is not for creating tiers of permissions within a Capability, but for +separating out administrative APIs, for example turning a feature on and +off. + +Most Capabilities are provided by the platform, denoted by making the +`Provide` role `private` for that Capability. However, there are use +cases where Apps may provide Capabilities. The `Provide` role allows for +declaring that an App *implements* the Capability and can be registered +with the platform for fulfilling the Capability's features. This could +be used for functionality that needs to be customized from Distributor +to Distributor. The `Provide` role may also be used to allow Apps to +contribute to aggregated functionality, for example a federated search +feature. By providing a capability, an App is signing up to implement +any `Use` or `Manage` APIs required by that capability. + +Each role must be explicitly assigned. An App *never* inherits the +operations from one role by virtue of being granted another. Roles may +have overlapping functionality. + +A [Permission](#permissions) is the combination of a Capability w/ a +Role and determines which specific operations are permitted. + +### 3.5. User Grants + +A User Grant allows some Permissions to depend on the User of the +Firebolt Device to explicitly grant access for one or all Apps to use a +specific Capability. This an additional layer of access control on top +of Permissions. + +The Firebolt Specification determines which Permissions require User +Grants by default. + +It is not possible to require a User Grant for a Capability that is open +to all Apps. + +Distributors may override any User Grant details that are defined by the +Firebolt Specification if that User Grant Policy is set to +`overridable: true`. + +Consumers want to know that their Smart TV platform treats +security as a first-class design principal. As such, table-stakes User +Grant policies, e.g. App access to Bluetooth, may be denoted as +overridable: false in the Firebolt Specification, to remove any +possibility of a security flaw. + +An App is considered to have a User Grant to a Capability if it: + +- Has Permission to the Capability + +- The User Grant is for the same Role as the Permission above + +- The Capability is **securely** approved by the device user + +If an App invokes a Capability but does not have an active User Grant, +then the platform will block invocation, prompt the user for a grant, +and then continue with the original invocation, e.g. the App does not +have to call the originating API again (assuming the user did give their +approval). + +See [User Granted Capabilities](#user-granted-capabilities) for more +info. + +## 4. How Capabilities Work + +A given Capability may or may not be supported or available. +Additionally, a given Role may or may not be permitted or granted for a +given Capability. + +While support and availability of a Capability is static and global, the +permission and grant status may differ from App to App. + +Determining the status of a Role and Capability is fundamental to +both the Platform and the Apps that run on it. + +### 4.1. Supported Capabilities + +Once an App has been launched, it may need to check if a certain +capability is supported to present the appropriate user experience. For +example, an App may want to put Dolby Atmos badges next to its content, +but only if the platform supports Dolby Atmos. + +The Firebolt Specification determines which capabilities **MUST** be +supported by all Firebolt Devices, by listing those Capabilities in the +[Firebolt Specification Schema](#61-firebolt-specification-schema) as `level: "must"` in the Capabilities +array. + +For a capability to be supported, it **MUST** have *one* or *both* of +the following: + +> A supported capability **MUST** have the necessary hardware and +> software to invoke all required aspects of all Roles of the +> capability. +> +> **OR** +> +> A supported capability **MUST** have the necessary hardware and +> software to support a *certified*, after-market peripheral that +> provides the capability. Note that this includes peripherals that have +> not yet been connected to or installed on the device. + +However, a Firebolt device **MUST NOT** be considered to support a +capability if the capability is disabled by the static distributor +configuration. + +The platform **MUST** return accurate responses based on these +requirements to all [APIs](#apis) outlined below. + +### 4.2. Available Capabilities + +Once an App has been launched, it may need to check if a certain +capability is available, to start the appropriate user experience. For +example, an App that uses an external camera may need to check if the +user has set up their camera before proceeding to the main user +experience. + +A Capability is available if **all** the following are true: + +> An available Capability **MUST** be supported. +> +> An available Capability **MUST** have a provider, either an App, an +> Extension SDK, or the OS itself. +> +> The provider of the Capability **MUST** consider it to be available +> +> An available Capability **MUST NOT** be currently disabled by any +> user, account, or device setting. +> +> An available Capability **MUST** be considered available by at least +> one provider of the capability. This is specified by the requirements +> for each feature. + +An available Capability **MAY** be tied to a User Grant, regardless of +whether the user has granted it yet. Secure user grants gate permission, +not availability. + +The platform **MUST** return accurate responses based on these +requirements to all [APIs](#apis) outlined below. + +### 4.3. Permitted Capabilities + +Capabilities may be permitted to *all* Apps by the [Firebolt +Specification Schema](../../firebolt-specification.json), or to individual Apps by the Distributor-signed +App Manifest. + +An App may need to know if a Capability is permitted to it once it has +been launched. For example, it may need to check if a certain capability +is permitted, to enable the correct features for the current +distributor. For example, an App that has just been installed might not +show a Returns true for capability/role combinations that do not r +Sign-up option when running on a distributor that has not allowed it to +`use` the `commerce:subscribe` capability, and only allow existing users +to sign in. + +Determining if a Capability is permitted requires knowing which **Role** +is being leveraged. + +Permitted capabilities **MUST** be denoted as `public` in the Specification Schema](#61-firebolt-specification-schema). + +Additionally, **one** of the following **MUST** be true as well: + +> The Role **MUST** have `negotiable` set to `false` +> +> **OR** +> +> The Role **MUST** be approved for the capability by the distributor in +> the App Manifest + +A permitted Capability **MAY** be tied to a User Grant, regardless of +whether the user has granted it yet. + +The platform **MUST** return accurate responses based on these +requirements to all [APIs](#apis) outlined below. + +### 4.4. User Granted Capabilities + +Some Capabilities may require a User Grant. It is the App's choice +whether it requests these grants at launch or allows the platform to +interrupt the App's experience when User Grant-gated Capabilities are +invoked. + +Determining if a Capability has been granted by the user requires +knowing which Role is being used. + +For a Capability to be considered granted, it **MUST** be supported. + +Additionally, a Capability + Role is granted to an App if **one** of the +following is true: + +> A granted capability **MUST** have the Role securely granted to the +> App by the user and that grant must not be expired. +> +> **OR** +> +> A granted capability **MUST** have the Role permanently granted to the +> App by the App Manifest, e.g., if the user implicitly granted these by +> virtue of an end user license agreement. + +Firebolt platforms **MUST** support acquiring a user grant *at the +moment the Capability is invoked*, without requiring any reinvocation of +the Capability. + +See [User Grants](./user-grants), for more info. + +The platform **MUST** return accurate responses based on these +requirements to all [APIs](#apis) outlined below. + +### 4.5. Invoking Capabilities + +When invoking a Capability, there are several factors that determine +whether the calling App will be allowed. The primary factor is which +Role is being leveraged by the invocation. + +A given Capability & Role can be public or not, and it can be negotiable +or not. + +If a Role for a Capability is public and non-negotiable, then all Apps +are allowed to invoke it, without any explicit permission from the +platform distributor. This is subject to support, availability, and any +required User Grants. + +If a Role for a Capability is public and negotiable, then Apps **MUST** +be permitted by each distributor to use it on that distributor\'s +devices. + +If a Role for a Capability is private, then it **MUST NOT** be permitted +or granted to any Apps. + +A Role for a Capability **MUST NOT** be flagged as negotiable if it is +private. + +If a Capability is gated by a User Grant requirement, then any +invocation **MUST** check the grant status for the Role in question, and +potentially re-acquire a User Grant for the App to invoke it. + +The following flow diagrams show the order of operations for determining +if a Firebolt API, that depends on one or more capabilities, may be +invoked. The checks in this diagram **MUST** be executed in this order +to ensure that error codes are consistent and User Grant prompts are not +displayed to end users in situations where the API call will still not +be allowed for other reasons. + +![](../../../images/specifications/general/capabilities/image4.png) + +Note that determining user grants may involve presenting a UX to the end +user. During this time, a necessary capability may become unavailable. +Due to this, necessary Capabilities MUST be reevaluated for availability +after determining user grant status. For a more detailed flow diagram +for evaluating User Grants, see [User Grants](./user-grants). + +## 5. Configuring Device Capabilities + +The Firebolt Specification describes all the possible, non-Extension +capabilities that a particular version of Firebolt allows. Individual +Firebolt devices, however, may not support every Capability and may want +to override certain aspects of those Capabilities. + +Every Firebolt-compliant device **MUST** include an official, versioned +Firebolt JSON configuration that conforms to the Specification Schema](#61-firebolt-specification-schema), so that the implementation +knows how to configure each capability, and which aspects are +overridable. + +Additionally, every Firebolt-compliant device **MUST** have a versioned + +Firebolt Device JSON configuration that conforms to the Firebolt Device +Schema, so that the implementation knows how each capability has been +overridden by the Distributor for this device. + +See [Firebolt Device Schema](#firebolt-device-schema) for more info. + +### 5.1. Device Supported Capabilities + +Firebolt-compliant devices **MUST** list all the Capabilities they +support in the Device Capabilities configuration file\'s `supported` +array. + +The `supported` array **MUST** contain a `CapabilityConfig` for every +Firebolt Capability supported by this device. + +The `supported` array **MUST** contain an entry for every Capability +from the Specification Schema](#61-firebolt-specification-schema) that has a level of `must`. + +The `supported` array **MAY** contain entries for any `should` or +`could` Capabilities. + +The supported array **MUST NOT** contain any entries for Capabilities +not found in the Firebolt Specification Schema. + +### 5.2. Device Grant Policy Overrides + +Firebolt-compliant devices **MAY** override any `GrantPolicies` that +have `overridable` set to `true`. + +This can be used to permanently disable a User Grant + +Firebolt-compliant devices **MUST NOT** override any `GrantPolicies` +that have `overridable` set to `false`. + +`GrantOverrides` are included in the `grantOverrides` array of the +`CapabilityConfig` for the Capability in question. + +If both the Firebolt Specification Schema and the Device Schema have +different, valid overrides for the same capability + appId, then the +device config **MUST** be used by that device. + +## 6. Capability Schemas + +This section describes how Capabilities are represented in the static +Firebolt configuration for a device. + +### 6.1. Firebolt Specification Manifest + +Each version of Firebolt **MUST** have a single Firebolt Specification +Manifest that is the source-of-truth for and contains all possible +capabilities provided, used, or managed by Apps or Firebolt platforms. + ++The Firebolt Specification Manifest **MUST** list all capabilities defined by that version of Firebolt. + +The Firebolt Specification Manifest **MUST** specify whether each capability `must`, `should`, or `could` be implemented by Firebolt devices. + +The Firebolt Specification Manifest **MUST** specify whether each role, i.e. `use`, `manage`, and `provide`, is a `public` permission that apps may call. + +See [Invoking Capabilities](#46-invoking-capabilities), for more info on public and negotiable capabilities. + +The Firebolt Specification Manifest **MUST** include the entire Firebolt OpenRPC specification for all APIs in the 'apis` block. + +The Firebolt Specification Manifest **MUST** specify which major versions of the Firebolt RPC APIs are required for backwards compatibility. + +The [Firebolt Version Manifest JSON-Schema](https://github.com/rdkcentral/firebolt-configuration/blob/main/src/schemas/version-manifest/version-manifest.json) defines the JSON semantics for this file. + +The latest version of the firebolt-specification.json **MUST** be available at this URL: + +``` +http://rdkcentral.github.io/firebolt/requirements/latest/specifications/firebolt-specification.json +``` + +The version of the firebolt-specification.json associated with this document **SHOULD** be available at [../../firebolt-specification.json](../../firebolt-specification.json). + +### 6.2. Firebolt Device Manifest + +Each Firebolt device will have a static configuration for overriding +which capabilities are supported, as well as any negotiable Capability +overrides. + +The Device Manifest **MUST** specify which capabilities the device supports. + +The Device Manfiest **MUST** include every capability from the Firebolt Specification Manifest that has a `level` of `must` in its supported list. + +The Device Manifest **MUST** specify which capabilities have distributor define Grant Policy Overrides. + +The Device Manfiest **MUST NOT** have any Grant Policies that override Grant Policies from the Firebolt Specification Manifest that have `overridable` set to `false`. + +The [Firebolt Device Manifest JSON-Schema](https://github.com/rdkcentral/firebolt-configuration/blob/main/src/schemas/device-manifest/device-manifest.json) defines the JSON semantics for this file. + +## 7. Capability to Feature Mapping + +Capabilities denote functionality, and functionality can manifest in several ways. + +### 7.1. App installation + +Some Apps may not be useful, and may even prove counter to their goals, +if installed on a device without certain capabilities. For example, a +Dolby Vision demonstration App that requires it only be installed on +devices that support Dolby Vision, to avoid playing back lower quality +content that users might mistake for Dolby Vision content. + +If an App includes a capability in one of its App Manifest's `required` +Capability lists: + +- `app.capabilities.used.required` + +- `app.capabilities.managed.required` + +- `app.capabilities.provided.required` + +Then that App **MUST NOT** be installable on Firebolt devices that do +not support that capability. + +Apps that have an unsupported capability inside one of its `optional` +lists **SHOULD NOT** be prevented from installation, unless there is +some other reason outside the scope of this document. + +### 7.2. Firebolt APIs + +Some Firebolt APIs may require the use of one or more Capabilities. +These methods **MUST** have all required Capabilities listed in the method's OpenRPC schema. + +Capabilities are listed in one of three OpenRPC extensions attached to +the `'capabilities' `tag on the method: `x-uses`, `x-manages`, +`x-provides`. + +If a method lists more than one Capability for a role, then it may +specify that those capabilities are either all required, any combination +of them is required, or one and only one is required. The platform **MUST parse any `x-uses-operator` values which will have values of either `allOf`, `anyOf`, or `oneOf`. This value defaults to `allOf` if not specified. An example of +this is an API to find and pair remotes, regardless of which connection +protocol is needed. This API requires `anyOf` `bluetooth:scan`, +`rf4ce:scan`, `wifi:scan`. If one or more of these capabilities is +available (and permitted) then the API will execute using the available +and permitted protocols. The same pattern applies to `x-manages-operator`. The `x-provides` extension only supports a single capability, so this pattern does not extend to providers. + +If a method *requires* a capability, and that capability requires a user +grant that the App does not have, then the platform **MUST** block and +initiate a User Grant flow. Once granted, the platform **MUST** return +the expected value without the App having to reinvoke the API. If not +granted after the User Grant flow, the platform **MUST** return an +error. + +Capabilities that enhance an API, but are not fundamentally required, +for example a `play` API optionally uses the `'hdr:dolbyvision'` +capability, **MUST NOT** be listed in the OpenRPC schema. These are considered *optional* capabilities of the method implementation. + +If a method leverages an *optional* Capability that is unavailable or +unpermitted, it **MUST** leave out or defer the optional functionality. + +If a method leverages an *optional* Capability that requires a user +grant the App does not have, it **MUST** leave out the optional +functionality, and it **MUST NOT** request a user grant. + +### 7.3. Extension APIs + +Extension SDKs implement their methods in the cloud but rely on +Firebolt's Permissions and Capabilities model. + +Requirements for Extension SDKS are outside of the scope of this document. + +### 7.4. Hidden Permissions + +A hidden permission arises when an API requires permission to one +Capability which in turn requires another Capability gated by a +different permission. This is not supported by Firebolt, and all +permission dependencies should be validated to avoid this. + +Firebolt Capabilities **MUST NOT** have hidden permissions. + +For example: + +- API `Module.methodOne()` requires permission to `use` the + `'contrived:capability1'` Capability + +- API `Module.methodTwo()` requires permission to `use` the + `'contrived:capability2'` Capability + +- `methodOne`'s implementation calls `methodTwo` + +There is now a hidden permission: `methodOne` requires both +`capability1` and `capabilty2`. + +Note that it's fine for a method to leverage an ungated, but also +unavailable Capability, such as a DIAL API failing because the network +capability is unavailable. + +## 8. Firebolt Capability Catalog + +Firebolt Capabilities are enumeraged in the [Firebolt Specification Manifest](../../firebolt-specification.json). + +## 9. APIs +All of the APIs below have full OpenRPC schemas in the [Firebolt OpenRPC JSON document](../../../specifications/firebolt-open-rpc.json). + +### 9.1. Core SDK APIs + +Several APIs are exposed by the Firebolt Core SDK as part of the +`Capabilities` module. This module is intended for App +developers to have one place to check for all aspects of "can I do +this." Including supported, available, permitted, and granted +Capabilities. It also provides bulk operations for figuring out which +needed Capabilities are unavailable, in order to wait for them, and +which ones are ungranted, in order to request them. + +### 9.2. Manage SDK APIs + +Several APIs are exposed by the Firebolt Manage SDK as part of the +`UserGrants` module. This module is intended for +Management UIs that show a list of grants per App or Capability, and +allow users to revoke them. diff --git a/requirements/pr-fix-ci-fb-version/specifications/general/capabilities/user-grants/index.md b/requirements/pr-fix-ci-fb-version/specifications/general/capabilities/user-grants/index.md new file mode 100644 index 000000000..9f87a1546 --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/general/capabilities/user-grants/index.md @@ -0,0 +1,601 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: User Grants +category: requirements +type: specification +--- +# User Grants + +Document status: Candidate Specification + +See [Firebolt Requirements Governance](../../../../governance) for more info. + +| Contributor | Organization | +| -------------- | -------------- | +| Andrew Bennet | Sky | +| Tim Dibben | Sky | +| Jeremy LaCivita | Comcast | +| Kevin Pearson | Comcast | +| Peter Yu | Comcast | + +## 1. Overview + +This document describes the requirements for Firebolt User Grants. User +Grants enable end-user control over which Apps have access to +potentially sensitive Firebolt Capabilities. For example, a user might +want to explicitly approve of any App attempting to purchase new content +by entering an account-holder PIN on the RCU. + +User Grants are also common when two apps need to share data, for +example, Firebolt has a `Discovery.watched` method that allows apps to +inform Firebolt that a user has finished watching some content. This +method allows an app to **provide** the watch history capability and the +aggregated experience to **use** it. See Firebolt +[Capabilities](../capabilities) requirements for more info on the `use` and `provide` roles of a +capability. + +This sort of data exchange involves several parties: minimally the user, +the publisher of the OTT app, and the distributor of the Firebolt +device. Additionally, this exchange could also involve privacy laws of +the user\'s home geo-political state, local I.T. best practices around +PII, or even a particular product\'s public position on their privacy +offering to the market. Because of the importance and complexity of +personal data, Firebolt allows each distributor to configure which +Firebolt capabilities require User Grants and what policies should be +applied to acquiring those grants. + +![Diagram Description automatically +generated](../../../../images/specifications/general/capabilities/user-grants/image1.png) + +Distributors can configure what kind of user grant is required for a +particular capability, e.g. a simple acknowledgement of an \"OK\" +button, an account-owner PIN entry, an account-owner three-factor +authentication challenge, etc. + +Distributors can also configure whether certain user grants are opt-in +or opt-out, and whether explicit prompting of the user is required. + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. Introduction to User Grants](#3-introduction-to-user-grants) + - [3.1. Active Grant](#31-active-grant) + - [3.2. Denied Grant](#32-denied-grant) + - [3.3. Unset Grant](#33-unset-grant) + - [3.4. Granting Capability](#34-granting-capability) + - [3.5. Grant Policy](#35-grant-policy) + - [3.6. Privacy Setting](#36-privacy-setting) +- [4. User Grant Requirements](#4-user-grant-requirements) + - [4.1. Granting Capability](#41-granting-capability) + - [4.1.1. Acknowledgement](#411-acknowledgement) + - [4.1.2. Pin Challenge](#412-pin-challenge) + - [4.2. Grant Policy](#42-grant-policy) + - [4.2.1. Grant Requirements](#421-grant-requirements) + - [4.2.2. Grant Lifespan](#422-grant-lifespan) + - [4.2.3. Grant Privacy Setting](#423-grant-privacy-setting) + - [4.3. Distributor Overrides](#43-distributor-overrides) + - [4.4. Application Overrides](#44-application-overrides) +- [5. Grant Execution](#5-grant-execution) + - [5.1. Capability Check](#51-capability-check) + - [5.2. Grant Policy Resolution](#52-grant-policy-resolution) + - [5.3. Active Grant Check](#53-active-grant-check) + - [5.4. Grant Prompt and Resolution](#54-grant-prompt-and-resolution) +- [6. Schemas](#6-schemas) + - [6.1. Grant Policy](#61-grant-policy) + - [6.2. GrantRequirements](#62-grantrequirements) + - [6.3. GrantStep](#63-grantstep) + - [6.4. GrantKey](#64-grantkey) + - [6.4.1. GrantScope](#641-grantscope) + - [6.4.2. GrantLifespan](#642-grantlifespan) + - [6.4.3. PrivacySetting](#643-privacysetting) +- [7. APIs](#7-apis) + - [7.1. Manage SDK APIs](#71-manage-sdk-apis) + - [7.1.1. GrantInfo Object](#711-grantinfo-object) + - [7.1.2. App Method](#712-app-method) + - [7.1.3. Device Method](#713-device-method) + - [7.1.4. Capability Method](#714-capability-method) + - [7.1.5. Grant Method](#715-grant-method) + - [7.1.6. Deny Method](#716-deny-method) + - [7.1.7. Clear Method](#717-clear-method) + + +## 3. Introduction to User Grants + +This section defines the key concepts behind the Firebolt User Grant +system. User Grants build on top of [Firebolt +Capabilities](../capabilities). +Since Capabilities are fundamental to user grants, it is recommended to +read the Capabilities requirements first before reading this document. + +Each portion of this section provides a background and conversational +definitions of the terms used in the rest of this document, and through +other Firebolt Requirements Specifications. + +As described in the Overview, a User Grant allows an end user to +explicitly allow (or not allow) an app to use certain Firebolt +Capabilities. Firebolt Distributors need flexibility in configuring +which Capabilities require what types of user interaction, PIN vs +password, etc. + +The following concepts inform how the Firebolt User Grant APIs and +architecture are designed. + +### 3.1. Active Grant + +An **Active Grant** is a User Grant that has already been granted by the +user for a Capability to a specific app (if the Grant Policy is per-app) +or all apps. Active Grants do not need to be granted again (until they +expire) and may be revoked or expire. + +### 3.2. Denied Grant + +A **Denied Grant** is a User Grant that has already been explicitly +*denied* by the user for a Capability to a specific app (if the Grant +Policy is per-app) or all apps. Denied Grants do not need to be denied +again (until they expire) and may be revoked or expire. This serves to +allow the Grant Policy lifetime to be applied to explicit denials as +well. + +### 3.3. Unset Grant + +An **Unset Grant** is a User Grant that has no persisted state. This +could be because the user has never granted or denied it, or because it +was previously granted/denied, but has since expired. Additionally, the +user or platform may clear out an active or denied grant, which results +in this state. + +### 3.4. Granting Capability + +User grants typically require some sort of user experience. Firebolt +delegates display of these user experiences to (typically) first-party +apps, which must provide them as **Granting Capabilities**. Therefore, +it\'s quite possible that using a capability such as watch history +initiates a User Grant request which itself requires another capability, +e.g. the \"acknowledge\" capability, to fulfill the original API. + +In the following diagram, an OTT App is calling an API that would share +watch history data with the 1st party aggregated experience on the +device. This capability is configured with a [Grant +Policy](#grant-policy) (see below) that specifies use of an +Acknowledgement Challenge Capability. the \"Watch History\" capability +is what is being accessed, and the \"Acknowledgement Challenge\" +capability is how this device is configured to grant access to that +capability. Said another way, the Acknowledgement Challenge is the +*Granting Capability*. + +![Diagram Description automatically +generated](../../../../images/specifications/general/capabilities/user-grants/image2.png) + +Note that the granting capability UI is provided by another app. The +Provider APIs for each granting capability type are out of scope for +this document. + +A granting capability is generally agnostic to the original capability +that it is helping to grant and can be reused by several capabilities +via a Grant Policy. + +### 3.5. Grant Policy + +A **Grant Policy** ties a set of user grant-related configuration values +to a capability. This allows a Firebolt distributor, or the Firebolt +specification itself, to define the business policy of a particular user +grant. + +Grant Policies specify details like how long the grant lasts and what is +the scope of the grant, e.g. a single app, or all apps. + +### 3.6. Privacy Setting + +A **Privacy Setting** is a link between a Grant Policy and any Firebolt API that is tagged with the Property pattern and returns a +`boolean`. This allows User Grant state to be linked to Privacy Settings +on the device or account. + +![Diagram Description automatically +generated](../../../../images/specifications/general/capabilities/user-grants/image3.png) + +How Firebolt devices persist Privacy Settings is outside the scope of +this document. + +## 4. User Grant Requirements + +### 4.1. Granting Capability + +A granting capability **MUST** have the category portion of its +capability key set to `usergrant`. For example: + +`xrn:firebolt:capability:usergrant:acknowledge` + +In order for a granting capability to be available, it **MUST** be +provided by some app that is currently loaded. + +Each granting capability **MUST** have a schema, in the Firebolt +Specification Schema, to validate that any configuration associated with +it is valid. + +#### 4.1.1. Acknowledgement + +The Acknowledgement capability enables a user to acknowledge a user +grant by simply clicking a button. + +This capability has the following key: + +`xrn:firebolt:capability:usergrant:acknowledgechallenge` + +The configuration for this capability is always `null`, i.e., there is +no configuration. + +For more info on how an app can provide the acknowledge capability, see +Acknowledge Provider. **TODO**: add link. + +#### 4.1.2. Pin Challenge + +The Pin Challenge capability enables a user to confirm that they are the +account owner, or a delegate of, by responding to a numeric PIN +challenge. + +This capability has the following key: + +`xrn:firebolt:capability:usergrant:pinchallenge` + +For more info on how an app can provide the acknowledge capability, see +Pin Challenge Provider. **TODO**: add link. + +### 4.2. Grant Policy + +If a Capability is configured with a `GrantPolicy` then the User Grants +specified by the Grant Policy **MUST** be evaluated before a GrantPolicy +llowing access to that Capability. + +A Grant Policy **MUST** have a `scope` for the grant, which determines +whether the user will be granting the capability to the current app or +to all apps. + +A Grant Policy **MUST** have an `overridable` flag that determines if it +may be overridden downstream. For Grant Policies in the Firebolt Version +Manifest, the Device Manifest may override if `overridable` is `true`. +For Grant Policies in the Device Manifest, individual [App +Manifests](https://github.com/rdkcentral/firebolt-configuration/src/schemas/app-manifest/app/app.json) may override the grant if `overridable` is `true`. + +#### 4.2.1. Grant Requirements + +A Grant Policy **MUST** have at least one `GrantRequirements` object, +which itself has a list of zero or more [Granting +Capabilities](#granting-capability) and their configurations. If all the +granting capabilities are supported and available, then they all +**MUST** be invoked. This allows for multiple security checks, e.g. +allow watch history data to be collected if the user has opted into +usage data collection **and** they confirm via an acknowledgement +challenge UI. If one or more of the granting capabilities is not +supported or available, then the entire Grant Requirements block is not +valid for acquiring a user grant. + +A Grant Policy **MAY** have more than one `GrantRequirements` object, +which are ranked in order of preference. This allows for low-friction +but high-security methods to be preferred, e.g. allow in-app purchases +with a passive facial recognition scan, with higher-friction fallbacks +to ensure security on devices with less capabilities, e.g. allow in-app +purchases if the account owner performs a multi-factor authentication +flow. This list of `GrantRequirements` objects is stored in the Grant +Policy\'s `options` field. + +If a Grant Policy has more than one `GrantRequirements` option, then the +highest priority list with all its required capabilities supported and +available **MUST** be used. Note that the app which initiated the +original capability check **does not** need to have permission (or a +grant) to any of the granting capabilities that might be invoked. The +app is not using them, the Firebolt device is using them. + +#### 4.2.2. Grant Lifespan + +A Grant Policy **MUST** have a `lifespan`, which determines how long a +grant is valid for. + +> If the lifespan is set to `once`, then any grant resulting from this +> policy **MUST** be active for a single API transaction. +> +> If the lifespan is set to `forever`, then any grant resulting from +> this policy **MUST** be active until explicitly revoked. +> +> If the lifespan is set to `appActive`, then any grant resulting from +> this policy **MUST** be active until the app goes into one of the +> `inactive`, `suspended`, or `unloading` states. +> +> If the lifespan is set to `powerActive`, then any grant resulting from +> this policy **MUST** be active until the device power goes into any +> state other than `active`. +> +> If the lifespan is set to `seconds`, then any grant resulting from +> this policy **MUST** be active until `lifespanTtl` seconds have passed +> since the grant was issued. + +If a Grant Policy has the `lifespan` set to `seconds`, then the +`lifespanTtl` **MUST** be set to a non-zero, positive number of seconds. + +#### 4.2.3. Grant Privacy Setting + +A Grant Policy **MAY** have a `PrivacySetting` object, which +associates any Firebolt `boolean` property API with this Grant Policy. +The Privacy Setting points to the RPC name of the property\'s getter +method. + +The associated property API **MUST** have an `x-allow-value` extension +on the \"property\" tag set to true or false. + +If a Grant Policy has a Privacy Setting, then the `PrivacySetting` +**MUST** be evaluated **before** any `GrantRequirements`. + +> The Privacy Setting **MUST** have an `autoApplyPolicy` which **MUST** +> be one of the following values: +> +> `always` - Silently grant if the getter for the `property` returns the +> property\'s `x-allow-value`. Silently deny if the getter for the +> `property` returns `!x-allow-value`. +> +> `allowed` - Silently grant if the getter for the `property` returns +> the property\'s `x-allow-value`. +> +> `disallowed` - Silently deny if the getter for the `property` returns +> the property\'s `!x-allow-value`. +> +> `never` - Do not silently grant or deny based on this Grant Policy. +> +> If the Privacy Setting has `revokeGrantsOnDisallow` set to `true`, +> then **all active** user grants that resulted from this Grant Policy +> **MUST** be revoked if and when the property value specified by +> `property` ever changes to `!x-allow-value`. This enables +> distributors to decide whether changes to a Privacy Setting affects +> only new User Grants or existing, active User Grants as well. +> +> If the Privacy Setting has `updateProperty` set to `true`, then a +> successful user grant from this Grant Policy **MUST** also result in +> updating the property value specified by `property` to +> `x-allow-value`. +> +> If the Privacy Setting has `updateProperty` set to `true`, then a +> rejected **or expiring** user grant from this Grant Policy **MUST** +> also result in updating the property value specified by `property` to +> `!x-allow-value`. This is considered a \"disallow\" and +> **MUST** initiate evaluation of the `revokeGrantsOnDisallow` value. +> +> If the Grant Policy `scope` is set to `app` then the property +> specified by `property` **MUST** have a single context +> parameter of type `string` and the requesting appId **MUST** be passed +> to all get/set/subscribe calls fulfilling this section of requirements. + +### 4.3. Distributor Overrides + +Capability Grant Policies in the Firebolt Version Manifest are designed +to be overridden by Distributors to allow for different privacy use +cases across businesses and geographic regions. These overrides go in +the Device Manifest under the `grantPolicies` section of the +`capabilities` section. + +Distributor overrides **MUST** be for Grant Policies that are +`overridable`. + +See the [Firebolt Configuration Schemas +repository](https://github.com/rdkcentral/firebolt-configuration/) for +more information on the Firebolt Version Manifest and Device Manifest. + +### 4.4. Application Overrides + +Firebolt supports creating active grants via the App manifest, which +allows distributors and App publishers to decide that a particular app +will already be granted some capability. This is typically used for +first-party apps that come pre-installed but could be used for other +purposes. + +If an app has a role/capability listed in its App Manifest, then it is +considered to have an active grant for that capability if the manifest +has a valid signature. + +App Manifests overrides **MUST** be for Grant Policies that are +`overridable` and scoped to `app`. + +See the [Firebolt Configuration Schemas +repository](https://github.com/rdkcentral/firebolt-configuration/) for +more information on Firebolt App Manifests. + +## 5. Grant Execution + +When a Firebolt API is called the platform **MUST** first collate all +the device User Grant configurations that apply to every capability that +the API uses. This list **MUST** then be filtered to remove any User +Grants that have already been granted for the current capability for +this app and role. + +### 5.1. Capability Check + +First, all capabilities necessary to fulfill the API are collected. + +![](../../../../images/specifications/general/capabilities/user-grants/image4.png) + +### 5.2. Grant Policy Resolution + +Next, each capability is checked to see if there is a Firebolt, +Distributor, or App Grant Policy that applies, and that none of them are +invalid, e.g. an override that is now allowed. + +![Diagram Description automatically +generated](../../../../images/specifications/general/capabilities/user-grants/image5.png) + +### 5.3. Active Grant Check + +Then, each Grant Policy is evaluated to see if there is already an +active grant, or if it is linked to a Privacy Setting configured to skip +user-prompts. + +![Diagram Description automatically +generated](../../../../images/specifications/general/capabilities/user-grants/image6.png) + +### 5.4. Grant Prompt and Resolution + +Finally, each needed Granting Capability is invoked to present a UX to +the end user, and any linked Privacy Settings are updated as +appropriate. If all succeeds, then the API is invoked. + +![Diagram Description automatically +generated](../../../../images/specifications/general/capabilities/user-grants/image7.png) + +## 6. Schemas + +The following schemas give an overview of the schemas outlined by this +document. See the [Firebolt Configuration Schemas +repository](https://github.com/rdkcentral/firebolt-configuration/) for +the latest versions of these schemas. + +### 6.1. Grant Policy + +Grant Policies have the following properties. + +| Property | Type | Description | +|-------------|-----------------------|-------------------------------------| +| `options` | `GrantRequirements[]` | An array of GrantRequirements, any one of which could be used to Grant a requested capability/role to an App. The first one that is completely supported by the current device should be used. | +| `scope` | `string` | Whether the resulting user grant applies to all Apps or just the requesting App. | +| `lifespan` | `string` | How long the resulting user grant (or deny) will last. | +| `lifespanTtl` | `integer` | If lifespan is `'seconds'` this represents the number of seconds. | +| `privacySetting` | `PrivacySetting` | Links this Grant Policy to a privacy setting. | +| `overridable` | `boolean` | Whether a distributor may override this GrantPolicy with their own. | + +### 6.2. GrantRequirements + +A list of `GrantSteps` objects describing which capabilities and any +optional configuration needed to fulfill this grant policy. These +capabilities must be from the capability category `usergrant` which +denotes special capabilities that perform user grants, e.g. an +acknowledge challenge capability. + +| Property | Type | Description | +|-------------|-----------------|-------------------------------------------| +| `steps` | `GrantStep[]` | An array of GrantSteps, all of which need to be verified to fulfill this GrantPolicy. | + +### 6.3. GrantStep + +| Property | Type | Description | +|-------------|----------------|-------------------------------------------| +| `capability` | `string` | The Granting Capability to use for this step in the grant flow. | +| `configuration ` | `object` | The configuration for the Granting Capability, which is specific to each type. | + +### 6.4. GrantKey + +A CapabilityKey with the \ set to `usergrant`: + +`/\^xrn:firebolt:capability:usergrant:\[a-zA-Z0-9\\-\]{1,32}\$/` + +#### 6.4.1. GrantScope + +A `string` enumeration. + +| Value | Description | +|----------------|--------------------------------------------------------| +| `device` | The resulting user grant will apply to all Apps on the device. | +| `app` | The resulting user grant will apply to the requesting App only. | + +#### 6.4.2. GrantLifespan + +A `string` enumeration. + +The resulting user grant will only be valid: + +| Value | Description | +|----------------|--------------------------------------------------------| +| `once` | for a single usage, e.g. one API call. | +| `forever` | until the end of time. | +| `appActive` | until the app enters a non-Active Lifecycle state: inactive, suspended | +| `powerActive` | until the device leaves the Active power state. | +| `seconds` | until \ seconds have passed. | + +#### 6.4.3. PrivacySetting + +| Value | | Description | +|--------------------|----------|------------------------------------------| +| `property` | string | The fully qualified RPC method name of the associated property setter, e.g. `Privacy.limitAdTracking` | +| `autoApplyPolicy` | string | Set the auto grant policy to `always`, `allowed`, `disallowed`, `never` | +| `revokeGrantsOnDisallow` | boolean | Any grants made from this policy will be revoked if/when the property is ever set to the deny value | +| `updateProperty` | boolean | Whether to update the property value to match the grant. | + +## 7. APIs + +APIs for User Grants are covered in the [Capabilities Requirements +document](../capabilities). + +### 7.1. Manage SDK APIs + +These APIs are intended for trusted apps to expose a UI for end-users to +manage the grants given to the device and various apps. Permission for +these APIs should only be given to a trusted settings app performing +this function. + +#### 7.1.1. GrantInfo Object + +Object describing a persisted active or denied Grant. + +```typescript +type GrantInfo = { + appId: string, + state: "active" | "denied", + capability: string, + role: "use" | "manage" | "provide" + lifespan: "once" | "forever" | "appActive" | " powerActive" | "seconds" + expires: integer +} +``` + +#### 7.1.2. App Method + +Returns all active and denied user grants for the given App, **NOT** +including those granted to all apps via the device. + +```typescript +UserGrants.app(appId: string): GrantInfo[] +``` + +#### 7.1.3. Device Method + +Returns all active and denied user grants for the Device. + +```typescript +UserGrants.device(): GrantInfo[] +``` + +#### 7.1.4. Capability Method + +Returns all active and denied user grants for the given Capability. + +```typescript +UserGrants.capability(capability: string): GrantInfo [] +``` + +#### 7.1.5. Grant Method + +Grants a given Capability, to a specific app if appropriate. Calling +this results in a persisted Active Grant that lasts for the duration of +the Grant Policy lifespan. + + +```typescript +UserGrants.grant(role: string, capability: string, appId?:string): void +``` + +#### 7.1.6. Deny Method + +Denies a given Capability, to a specific app if appropriate. Calling +this results in a persisted Denied Grant that lasts for the duration of +the Grant Policy lifespan. + +```typescript +UserGrants.deny(role: string, capability: string, appId?: string):void +``` + +#### 7.1.7. Clear Method + +Clears any persisted active or denied grant for a Capability, for a +specific app if appropriate. This results in an Unset Grant. This method +may take a wildcard value of `'*'` for role, capability, or appId, in +order to clear grant state in bulk. + +```typescript +UserGrants.clear(role: string, capability: string, appId?:string): void +``` diff --git a/requirements/pr-fix-ci-fb-version/specifications/general/context-parameters/index.md b/requirements/pr-fix-ci-fb-version/specifications/general/context-parameters/index.md new file mode 100644 index 000000000..c6aa5b947 --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/general/context-parameters/index.md @@ -0,0 +1,311 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: Context Parameters +category: requirements +type: specification +--- +# Context Parameters +Document Status: Working Draft + +See [Firebolt Requirements Governance](../../../governance) for more info. + +| Contributor | Organization | +| -------------- | -------------- | +| Jeremy LaCivita | Comcast | +| Yuri Pasquali | Sky | + +## 1. Overview + +**TODO**: This doc is old and need to be refreshed + +Context Parameters are parameters on an RPC method that provide context +for the call via a set of primitive types (string, number, integer, +boolean). This allows for sharing the context parameters across property +getters, setters, and subscribers, as well as filtering which events to +listen for by context. + +An example of a property method with context could be: + +```javascript +// get a context-driven property (context: appId=hulu) +const huluShare = await Privacy.shareWatchHistory('hulu') +``` + +```javascript +// set a context-driven property (context: appId=hulu) +Privacy.shareWatchHistory('hulu', false) +``` + +In the example above, 'hulu' is the context parameter for both the +shareWatchHistory getter and setter. + +Context parameters can also be applied to property subscribers, as well +as other, non-property events: + +```javascript +// subscribe to a context-driven property +Privacy.shareWatchHistory('hulu', (value) => { + console.log('hulu value changed to: ' + value) +}) + +Privacy.listen('shareWatchHistoryChanged', 'hulu', (value) => { + console.log('hulu value changed to: ' + value) +}) +``` + +For subscribers and events, the context parameters may be omitted, in +which case, all events will be dispatched to the listener: + +```javascript +// subscribe to a context-driven property w/out any context (get all of them) + +Privacy.shareWatchHistory((appId, value) => { + console.log(`App '${appId}' value changed to ${value}`) +}) + +Privacy.listen('shareWatchHistoryChanged', (appId, value) => { + console.log(`App '${appId}' value changed to: ${value}`) +}) +``` + +Context Parameters **MUST** be of a primitive type, to avoid complex +object-tree filtering. + +This document describes an OpenRPC pattern and JavaScript code +generation for a Firebolt method template that uses Context Parameters. + +## 2. Table of Contesnts +- [1. Overview](#1-overview) +- [2. Table of Contesnts](#2-table-of-contesnts) +- [3. Context Parameters Use Cases](#3-context-parameters-use-cases) +- [4. Context Parameters API](#4-context-parameters-api) + - [4.1. JSON-RPC API](#41-json-rpc-api) + - [4.1.1. Setter RPC generation](#411-setter-rpc-generation) + - [4.1.2. onChanged RPC generation](#412-onchanged-rpc-generation) + - [4.1.3. Temporal Set onAvailable / Unavailable RPC generation](#413-temporal-set-onavailable--unavailable-rpc-generation) + - [4.1.4. Event RPC Decoration](#414-event-rpc-decoration) + - [4.2. JavaScript API](#42-javascript-api) + - [4.2.1. Event Listener Signatures](#421-event-listener-signatures) + +## 3. Context Parameters Use Cases + +How each parameter affects it's corresponding API is out of scope for +this document. See each API spec for details on what each context +parameter does. + +Setting a context parameter to null is still setting it to a value. If a +context parameter is passed to the SDK with either a value of null or +undefined, then it **MUST** be explicitly set in the RPC request to the +value null. This is to avoid additional method signature permutations +being required for the SDK. + +An effort should be made to sort the context parameters in order of most +usefulness, since not all languages support undefined. + +## 4. Context Parameters API + +The section describes the RPC and JavaScript APIs. + +### 4.1. JSON-RPC API + +Simple getters and event listeners don't need any parameters. + +If a method is tagged as either a property (any kind) or an event, then +**all** the parameters in the RPC definition **MUST** be context +parameters. + +To facilitate this, the listen parameter that all events currently have +will be removed from the source module and inserted into the generated +RPC by the firebolt-openrpc tooling. + +If any Context Parameters have a type other than: + +- `string` +- `boolean` +- `number` +- `integer` + +Then the RPC method **MUST NOT** pass validation. This is to ensure that +implementing context parameters is not overly complicated. + +#### 4.1.1. Setter RPC generation + +When generating the setter for a property method, all the Context +Parameters **MUST** be copied to the setter. The context parameters +**MUST** be before the value parameter, which itself **MUST** be last. + +#### 4.1.2. onChanged RPC generation + +When generating the onChanged notification for a property +method, all the Context Parameters **MUST** be copied to the event +parameters. The context parameters **MUST** be before the listen +parameter, which itself **MUST** be last. + +#### 4.1.3. Temporal Set onAvailable / Unavailable RPC generation + +Generated Temporal Set events will treat the entire parameter list from +the original temporal-set method as Context Parameters and copy them to +the event parameters. The context parameters **MUST** be before the +listen parameter, which itself **MUST** be last. + +#### 4.1.4. Event RPC Decoration + +All RPC methods tagged as event **MUST** have the listen parameter, of +type boolean, automatically added when generating the final RPC. This +parameter will be added at the end of the parameters list. + +All RPC methods tagged as event that have context parameters **MUST** +have the result schema wrapped in an object. The original result schema +**MUST** be moved to a property called data. Each of the context +parameters **MUST** be copied to a property called context. + +So the following RPC event: + +```json +{ + "name": "onContextualEvent", + "tags": [ + { + "name": "event" + } + ], + "params": [ + { + "name": "a", + "required": true, + "schema": { + "type": "boolean" + } + }, + { + "name": "b", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "c", + "required": true, + "schema": { + "type": "number" + } + } + ], + "result": { + "name": "result", + "schema": { + "type": "object", + "properties": { + "foo": { + "type": "boolean" + } + } + } + } +} +``` + +Would have its result transformed to: + +```json +{ + "name": "result", + "schema": { + "type": "object", + "properties": { + "data": { + "type": "object", + "properties": { + "foo": { + "type": "boolean" + } + } + }, + "context": { + "type": "object", + "properties": { + "a": { + "type": "boolean" + }, + "b": { + "type": "string" + }, + "c": { + "type": "number" + } + }, + "required": [ + "a", "b", "c" + ] + } + } + } +} +``` + +### 4.2. JavaScript API + +TBD + +#### 4.2.1. Event Listener Signatures + +If any of the context parameters are optional, then a callback signature +must be generated for each left-to-right combination of the parameters. + +For example, the method: + +```json +{ + "name": "onFoo", + "tags": [ + { + "name": "event" + } + ], + "params": [ + { + "name": "a", + "required": true, + "schema": { + "type": "boolean" + } + }, + { + "name": "b", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "c", + "required": false, + "schema": { + "type": "number" + } + } + ] +} +``` + +Would result in the following method signatures: + +```typescript +listen(event: 'foo', a: boolean, callback: (b: string, c: number, data: any) => {}) + +listen(event: 'foo', a: boolean, b: string, callback: (c: number, data: any) => {}) + +listen(event: 'foo', a: boolean, b: string, c: number, callback: (data: any) => {}) +``` + +Which allows parameters to be omitted, from right-to-left, and included +as part of the result, instead. + +When invoking the callback, the SDK **MUST** pass the data portion of +the result to the data parameter of the callback, and each context +property to the corresponding callback parameter. + +This pattern also applies to property subscribers. diff --git a/requirements/pr-fix-ci-fb-version/specifications/hardware/hdmi-input/index.md b/requirements/pr-fix-ci-fb-version/specifications/hardware/hdmi-input/index.md new file mode 100644 index 000000000..755c8f2da --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/hardware/hdmi-input/index.md @@ -0,0 +1,321 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: HDMIInput +category: requirements +type: specification +--- +# HDMIInput + +Document Status: Proposed Specification + +See [Firebolt Requirements Governance](../../../governance) for more info. + +| Contributor | Organization | +| ------------------- | -------------- | +| Jeremy LaCivita | Comcast | +| Lucien Kennedy-Lamb | Sky | + +## 1. Overview +This document describes the requirements for managing HDMI inputs on a Firebolt device. hese APIs are for managing the HMDI inputs of a device. All TVs have HDMI inputs, whereas only certain STBs have HDMI inputs. + +This document is written using the [IETF Best Common Practice 14](https://www.rfc-editor.org/rfc/rfc2119.txt), specifically: + +The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**NOT RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in [BCP 14](https://www.rfc-editor.org/rfc/rfc2119.txt) [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here. + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. All Ports](#3-all-ports) +- [4. Single Port](#4-single-port) +- [5. Port Connection Notification](#5-port-connection-notification) +- [6. Port Signal Notification](#6-port-signal-notification) +- [7. EDID Version](#7-edid-version) +- [8. Low Latency](#8-low-latency) + - [8.1. Low Latency Mode](#81-low-latency-mode) + - [8.1.1. Low Latency Mode Notification](#811-low-latency-mode-notification) + - [8.2. Auto Low Latency Mode Signalled](#82-auto-low-latency-mode-signalled) + - [8.3. Port Auto Low Latency Mode Capable](#83-port-auto-low-latency-mode-capable) + - [8.3.1. Port Auto Low Latency Mode Capable Changed Notification](#831-port-auto-low-latency-mode-capable-changed-notification) +- [9. HDMI Port managing active source](#9-hdmi-port-managing-active-source) +## 3. All Ports +The `HDMIInput` module **MUST** have a `ports` method that lists all physical HDMI input ports on the device. + +The `ports` API **MUST** return an array of `HDMIInputPort` objects. + +An example response: + +```json +[ + { + "port": "HDMI1", + "connected": true, + "signal": "unknown", + "arcCapable": true, + "arcConnected": true, + "autoLowLatencyModeCapable": true, + "autoLowLatencyModeSignalled": true, + "edidVersion": "2.0" + } +] +``` + +The `HDMIInputPort` object **MUST** have a `port` string property, which is the unique ID of that port. This is usually formatted and printed on the device near the port. + +The `port` property **MUST** match the pattern: + + ```regexp + /^HDMI[0-9]+$/ + ``` + +The `HDMIInputPort` object **MUST** have a `connected` boolean property, which is true if that port has a device connected, false otherwise. + +The `HDMIInputPort` object **MUST** have a `signal` string property, which denotes the signal validity. + +The `signal` property **MUST** be one of the following values: + +- `"unknown"` - the HDMI input port is not switched, so the signal state is unknown. +- `"none"` - no signal from the HDMI input device. +- `"stable"` - the signal is stable and should provide good audio and viddeo. +- `"unstable"` - the signal is unstable and could exhibit broken audio and video. +- `"unsupported"` - the signal is not at a supported speed/resolution. + +The `HDMIInputPort` object **MUST** have an `arcCapable` boolean property, which is true if this HDMI port supports ARC and/or eARC device connections. + +The `HDMIInputPort` object **MUST** have an `arcConnected` boolean property, which is true if the attached device supports ARC and/or eARC, regardless of whether the input port supports ARC. + +The `HDMIInputPort` object **MUST** have an `edidVersion` string property which is the selected E-EDID version "1.4" or "2.0" for the port. + +The `edidVersion` property **MUST** be one of the following values: + +- `"1.4"` +- `"2.0"` +- `"unknown"` + +If the `edidVersion` is `"2.0"` then the `HDMIInputPort` object: + +> **MUST** have an `autoLowLatencyModeCapable` boolean property, which is true if the device has ALLM support in the EDID on this HDMI input, false otherwise. +> +> **MUST** have an `autoLowLatencyModelSignalled` boolean property, which is true if the port is receiving an ALLM signal from a downstream source device, and false otherwise. + +If the `edidVersion` is `"1.4"` or `"unknown"` then the `HDMIInputPort` object: + + > **MUST** have the `autoLowLatencyModeCapable` boolean property set to `false`. + > + > **MUST** have the `autoLowLatencyModelSignaled` boolean property set to `false` + +The `"unknown"` value of the `edidVersion` property **SHOULD** be reserved for edge cases, such as a test device with a newer version of HDMI ports than the device software supports. + +The `ports` API requires `use` access to the `xrn:firebolt:capability:inputs:hdmi` capability. + +## 4. Single Port +The `HDMIInput` module **MUST** have a `port` method that returns info on a single HDMI port. + +The `port` API **MUST** return an `HDMIInputPort` object that corresponds to the provided `portId` parameter. + +```javascript +HDMIInput.port('HDMI1') +``` + +The `port` API requires `use` access to the `xrn:firebolt:capability:inputs:hdmi` capability. + +## 5. Port Connection Notification +The `HDMIInput` module **MUST** have an `onConnectionChanged` notification that fires when any HDMI port has a connection physically engaged or disengaged. + +This notification **MUST** have an object payload. + +The object payload **MUST** have a `port` string property that denotes which input port has detected a connection change. + +The `port` property **MUST** match the pattern: + + ```regexp + /^HDMI[0-9]+$/ + ``` + +The object payload **MUST** have a `connected` boolean property that denotes the updated value of the connection state. + +Example payload: + +```json + { + "port": "HDMI1", + "contected": true + } +``` + +The `onConnectionChanged` API requires `use` access to the `xrn:firebolt:capability:inputs:hdmi` capability. + + +## 6. Port Signal Notification +The `HDMIInput` module **MUST** have an `onSignalChanged` notification that fires when any HDMI port signal changes status. + +This notification **MUST** have an object payload. + +The object payload **MUST** have a `port` string property that denotes which input port has detected a change to the signal validity. + +The `port` property **MUST** match the pattern: + + ```regexp + /^HDMI[0-9]+$/ + ``` + +The object payload **MUST** have a `signal` string property that denotes the updated value of the input device signal. + +The `signal` property **MUST** be one of the following values: + +- `"unknown"` - the HDMI input port is not switched, so the signal state is unknown. +- `"none"` - no signal from the HDMI input device. +- `"stable"` - the signal is stable and should provide good audio and viddeo. +- `"unstable"` - the signal is unstable and could exhibit broken audio and video. +- `"unsupported"` - the signal is not at a supported speed/resolution. + +Example payload: + +```json + { + "port": "HDMI1", + "signal": "stable" + } +``` + +The `onSignalChanged` API requires `use` access to the `xrn:firebolt:capability:inputs:hdmi` capability. + +## 7. EDID Version +Extended Display Identification Data enables HDMI devices to communicate which set of features are supported. + +The `HDMIInput` module **MUST** have a boolean property named `edidVersion`, with a getter, setter, and notification subscriber. + +The `edidVersion` property **MUST** have a `port` parameter to specify which port. + +The `edidVersion` property requires access to the `use` role of the `xrn:firebolt:capability:inputs:hdmi` capability. + +The `edidVersion` property **MUST** have a notification for when a port's edid value changes. + +The `edidVersion` property **MUST** have a setter that requires access to the `manage` role. + +Setting this property changes the specified port's EDID version, that is broadcast to other devices. + +Low latency mode switches the device to shorten the overall processing time of HDMI A/V signals. +Depending on the platform some video processing features may be disabled such as MPEG noise reduction. + +## 8. Low Latency +Low Latency refers to a set of functionally that combines to provide manual or automatic activation of HDMI Low Latency Mode. + +Low latency mode switches the device to shorten the overall processing time of HDMI A/V signals. + +Depending on the platform some video processing features may be disabled such as MPEG noise reduction. + +### 8.1. Low Latency Mode +The `HDMIInput` module **MUST** have a boolean property named `lowLatencyMode`, with a getter, setter, and notification subscriber. + +Enabling this property turns on the underlying low latency mode feature for the Firebolt device, which affects all HDMI ports, +but not other media sources. + +Low latency mode switches the device to shorten the overall processing time of HDMI A/V signals. +Depending on the platform some video processing features may be disabled such as MPEG noise reduction. + +The `lowLatencyMode` API requires `use` access to the `xrn:firebolt:capability:inputs:hdmi` capability. + +The `lowLatencyMode` API **MUST** have a corresponding setter that requires `manage` access to the `xrn:firebolt:capability:inputs:hdmi` capability. + + +#### 8.1.1. Low Latency Mode Notification +Whenever the underlying HDMI implementation executes an LLM change (either on or off), this notification **MUST** fire: + +`HDMIInput.onLowLatencyModeChanged` + +The `onLowLatencyModeChanged` API requires `use` access to the `xrn:firebolt:capability:inputs:hdmi` capability. + +### 8.2. Auto Low Latency Mode Signalled +The `HDMIInput` module **MUST** have an `onAutoLowLatencyModeSignalChanged` notification that fires when the ALLM signal from the source connected to a port changes. + +This notification **MUST** have an object payload. + +The object payload **MUST** have a `port` string property that denotes which input port has detected a change to the ALLM signal. + +The `port` property **MUST** match the pattern: + + ```regexp + /^HDMI[0-9]+$/ + ``` + +The object payload **MUST** have an `autoLowLatencyMode` boolean property that denotes the updated value, true or false, of the ALLM setting. + +Example payload: + +```json + { + "port": "HDMI1", + "autoLowLatencyModeSignalled": true + } +``` + +The `onAutoLowLatencyModeSignalChanged` API requires `use` access to the `xrn:firebolt:capability:inputs:hdmi` capability. + +### 8.3. Port Auto Low Latency Mode Capable +The `HDMIInput` module **MUST** have a boolean property `autoLowLatencyModeCapable` which reflects the HDMI port setting for advertising ALLM support in its E-EDID. + +The `autoLowLatencyModeCapable` property takes a string context parameter, `port` to identify the HDMI port. + +The `port` parameter must match the pattern: + +```regexp + /^HDMI[0-9]+$/ + ``` + +The `autoLowLatencyModeCapable` API requires `use` access to the `xrn:firebolt:capability:inputs:hdmi` capability. + +Changing this property turns on/off the underlying auto low latency mode advertisement in any HDMI port E-EDID of version >= v2.0. + +To change the property: + +```javascript +function autoLowLatencyModeCapable(port: string, autoLowLatencyMode: boolean) +``` + +The `autoLowLatencyModeCapable` setter API requires `manage` access to the `xrn:firebolt:capability:inputs:hdmi` capability. + +#### 8.3.1. Port Auto Low Latency Mode Capable Changed Notification +Whenever the underlying HDMI implementation executes an ALLM support change (either on or off), this notification must fire: + +`HDMIInput.onAutoLowLatencyModeCapableChanged` + +To listen for port ALLM notifications: + +```javascript +HDMIInput.autoLowLatencyModeCapableChanged((data) => { + console.log('Port ' + data.port + ' ALLM changed to ' + data.autoLowLatencyModeCapable) +}) +``` + +`autoLowLatencyModeCapable` - whether or not ALLM is advertised as supported in the E-EDID for the port. + +`port` - the HDMI port that had an E-EDID ALLM advertisement change. + +The `onAutoLowLatencyModeCapableChanged` API requires `use` access to the `xrn:firebolt:capability:inputs:hdmi` capability. + + +## 9. HDMI Port managing active source + +The `HDMIInput` module **MUST** have `open` and `close` method(s) that manages the active source of on a single HDMI port. + +The `HDMIInput.open` **MUST** include a `portId` field complying to the schema of `HDMIPortId` + +The `HdmiInput.open` and `HDMIInput.close` API(s) **MUST** return an `empty` object for a successful operation, if there was an error the response **Must** contain the details of the error. + +The `HdmiInput.open` and `HDMIInput.close` API requires `manage` access to the `xrn:firebolt:capability:inputs:hdmi` capability. + +Below is an example for opening a given HDMIPort. +```javascript +HDMIInput.open('HDMI1').then(() => { + console.log("Successfully opened HDMI1 port"); +}) +``` + +Below is an example for closing last active source. +```javascript +HDMIInput.close().then(() => { + console.log("Successfully closed HDMI1 port"); +}) +``` \ No newline at end of file diff --git a/requirements/pr-fix-ci-fb-version/specifications/intents/command-and-control/index.md b/requirements/pr-fix-ci-fb-version/specifications/intents/command-and-control/index.md new file mode 100644 index 000000000..9ae0f75be --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/intents/command-and-control/index.md @@ -0,0 +1,992 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: Command and Control Intents +category: requirements +type: specification +--- +# Command and Control Intents + +Document Status: Proposed Specification + +See [Firebolt Requirements Governance](../../../governance) for more info. + +| Contributor | Organization | +| ---------------- | ------------ | +| Saras Arveti | Comcast | +| Eileen Bengston | Comcast | +| Michael Driscoll | Comcast | +| Simon Grist | Sky | +| Jeremy LaCivita | Comcast | + +## 1. Overview + +This document outlines several basic Intents for controlling a Firebolt +compliant device. + +### 1.1. Message.type + +Message.type should be a useful grouping to bucket related intents +together for easier forwarding to appropriate components. + +## 2. Table of Contents +- [1. Overview](#1-overview) + - [1.1. Message.type](#11-messagetype) +- [2. Table of Contents](#2-table-of-contents) +- [3. Control Intents](#3-control-intents) + - [3.1. Power Intent](#31-power-intent) + - [3.2. Volume Intents](#32-volume-intents) + - [3.2.1. Volume Intent](#321-volume-intent) + - [3.2.2. Mute Intent](#322-mute-intent) + - [3.3. Channel Intent](#33-channel-intent) + - [3.4. Media Control Intents](#34-media-control-intents) + - [3.4.1. Pause, Play, Replay, and Stop Intents](#341-pause-play-replay-and-stop-intents) + - [3.4.2. Seek Intent](#342-seek-intent) + - [3.4.3. Fast-forward and Rewind Intents](#343-fast-forward-and-rewind-intents) + - [3.5. Accessibility Intents](#35-accessibility-intents) + - [3.5.1. Closed Captions Intent](#351-closed-captions-intent) + - [3.5.2. Voice Guidance Intent](#352-voice-guidance-intent) + - [3.5.3. Audio Descritions Intent](#353-audio-descritions-intent) + - [3.5.4. High Contrast Intent](#354-high-contrast-intent) + - [3.5.5. Screen Magnification Intent](#355-screen-magnification-intent) + - [3.6. Interaction Intents](#36-interaction-intents) + - [3.6.1. Focus Intent](#361-focus-intent) + - [3.6.2. Select Intent](#362-select-intent) + - [3.6.3. Scroll Intent](#363-scroll-intent) + - [3.6.4. Back Intent](#364-back-intent) + - [3.6.5. Exit Intent](#365-exit-intent) +- [4. Launch Intents](#4-launch-intents) + - [4.1. Content Discovery Launch Intents](#41-content-discovery-launch-intents) + - [4.2. Device Settings Launch Intent](#42-device-settings-launch-intent) + +## 3. Control Intents + +Control intents are for user intentions that will be needed regardless +of whether there are any apps installed. + +For example, these intents are all useful even if only using your TV +with a single HDMI input, and not for apps. + +### 3.1. Power Intent + +This intent allows a user to turn the device on or off. + +```json +{ + "type": "xrn:firebolt:intent:platform:power", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "power", + "data": { + "value": true | false + }, + "context": { + "source": "voice" + } + } +} +``` + +Additionally, this intent may specify a toggle: + +```json +{ + "type": "xrn:firebolt:intent:platform:power", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "power", + "data": { + "toggle": true + }, + "context": { + "source": "voice" + } + } +} +``` + +Additionally, this intent allows a user to set a timer for turning off +the power, aka a "sleep timer." + +This is handled by the optional field delay, which is measured in whole +seconds: + +```json +{ + "type": "xrn:firebolt:intent:platform:power", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "power", + "data": { + "value": true | false, + "delay": 3600 + }, + "context": { + "source": "voice" + } + } +} +``` + +To cancel a sleep timer, send a new intent without a delay. + +While it may not be implemented by all platforms, this could also be +used to turn on the TV with a timer. + +### 3.2. Volume Intents + +Volume Intents control the audio level of the device. + +#### 3.2.1. Volume Intent + +This intent allows setting the volume to an absolute or relative value. + +```json +{ + "type": "xrn:firebolt:intent:platform:volume", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "volume", + "data": { + "value": 70 + }, + "context": { + "source": "VOICE" + } + } +} + +``` + +The value is an integer value from 0 to 100. + +This intent also supports relative volume changes, by providing the +optional relative field: + +```json +{ + "type": "xrn:firebolt:intent:platform:volume", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "volume", + "data": { + "value": -10, + "relative": true + }, + "context": { + "source": "VOICE" + } + } +} + +``` + +The value is a positive or negative integer that is relative to a scale +of 0-100. + +Firebolt will not support complicated relative changes, e.g. "Set the +volume to 50% *of what it currently is\...*" + +Firebolt uses a size of 0-100 for this intent. It\'s up to each voice +integration if it wants to convert "5" to "50%" before generating +the intent, but convenience transformations like this are recommended. + +Whether or not a TV uses logarithmic or linear scale is irrelevant to +the VolumeIntent schema. + +#### 3.2.2. Mute Intent + +This intent allows the user to mute or unmute the device. + +```json +{ + "type": "xrn:firebolt:intent:platform:volume", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "mute", + "data": { + "value": true | false + }, + "context": { + "source": "VOICE" + } + } +} +``` + +### 3.3. Channel Intent + +For tuning to a specific channel, either OTA or in-app, see [Tune +Intents](../tune). + +The intents in this section are for relative next/previous channel user +intentions and are a separate type of Intent. This allows each app to +decide what "channel" means. For example, an App might simply take you +to the next section/genre if it doesn\'t have linear streams in it\'s +catalog. + +The goal of the action property to is tell the client how to parse the +Intent, so overloading the tune intent with a different structure is not +desirable. + +Also, +"tune" inherently means to zero in on a specific part of a +scale, e.g. tuning a harp. + +For relative "channel surfing" we\'ll use the more content-centric +action "channel" which will also align with non-linear apps that want +to leverage the channel up/down intent. + +The Channel Intent allows a user to scan "channels" in an app (or +actual OTA channels if not in an app). + +Users can scan to the next or previous channel. For scanning to the most +recent, i.e. "Last" channel, see [Interaction +Intent +](#interaction-intents). + +```json +{ + "type": "xrn:firebolt:intent:platform:channel", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "channel", + "data": { + "value": "next" | "previous" + }, + "context": { + "source": "voice" + } + } +} + +``` + +The value property MUST always be "next" or "previous". These are +chosen over up/down since not all use cases will be numeric. + +Since this intent is always relative to the current app, there is no +need for an appId. + +If this Intent needs to be passed to the current app, it can be passed +as-is, via the Discovery. onNavigateTo API, or a simulated RCU press of +one of the channel up/down buttons. + +### 3.4. Media Control Intents + +#### 3.4.1. Pause, Play, Replay, and Stop Intents + +These intents allow the user to pause and resume playback of the current +Media: + +```json +{ + "type": "xrn:firebolt:intent:platform:media-control", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "pause" | "play" | "replay" | "stop", + "context": { + "source": "voice" + } + } +} +``` + +If the action is pause, then the currently playing media should be +paused, with the frames on-screen and the video decoder ready to resume. + +If the action is play, and the current media is paused, then the +currently paused media should resume. + +If the action is play, and there is something playbable selected, then +playback of the selected asset should be initiated. + +If the action is replay, then the currently paused or playing media should restart +from the beginning. This should work even if the decoder has finished, +and its resources have been released. + +If the action is stop, then the currently playing media should be +stopped, frames removed from the screen, and any decoder resources +should be released. + +#### 3.4.2. Seek Intent + +The seek intent allows users to jump to a relative or absolute position +in the currently playing media. + +```json +{ + "type": "xrn:firebolt:intent:platform:media-control", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "seek", + "data": { + "seconds": 3600 + }, + "context": { + "source": "voice" + } + } +} +``` + +The seconds value is a positive integer representing where to seek. + +This intent also supports relative seeking, by providing the optional +relative field: + +```json +{ + "type": "xrn:firebolt:intent:platform:media-control", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "seek", + "data": { + "seconds": -30, + "relative": true + }, + "context": { + "source": "voice" + } + } +} +``` + +For relative seeking, the seconds value may be a positive or negative value. + +If a relative seek intent with a seconds value of `0` is received, the platform **SHOULD** ignore it, rather than rebuffering at the current position. + +#### 3.4.3. Fast-forward and Rewind Intents + +These intents allow users to fast-forward or rewind: + +```json +{ + "type": "xrn:firebolt:intent:platform:media-control", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "fast-forward" | "rewind", + "data": { + "speed": 2.5 + }, + "context": { + "source": "voice" + } + } +} +``` + +Speed is a float in the range of 0 (non-includsive) to 10 (inclusive), +with values between 0 and 1 denoting slow motion. + +It is a device-level decision how to implement different speeds, however +actual fast playback (with audio) should be used where possible and +reasonable, e.g. a speed of 1.5 should actually be playing the video w/ +sync\'d audio, while a speed of 10 will likely be using iframes and not +have audio. For rewind it is not important, and likely undesirable, to +provide audio. + +If speed is not provided then the device should cycle through a range +of speeds defined by the device. This range of speeds **COULD** include +the value `1` so that users can get back to normal speed if desired. + +### 3.5. Accessibility Intents + +These intents manipulate accessibility features on the device. + +#### 3.5.1. Closed Captions Intent + +This intent allows a user to turn closed captions on or off. + +```json +{ + "type": "xrn:firebolt:intent:platform:accessibility", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "closed-captions", + "data": { + "value": true | false + }, + "context": { + "source": "voice" + } + } +} +``` + +Additionally, this intent may specify a toggle: + +```json +{ + "type": "xrn:firebolt:intent:platform:accessibility", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "closed-captions", + "data": { + "toggle": true + }, + "context": { + "source": "voice" + } + } +} +``` + +#### 3.5.2. Voice Guidance Intent + +This intent allows a user to turn voice guidance on or off. + +```json +{ + "type": "xrn:firebolt:intent:platform:accessibility", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "voice-guidance", + "data": { + "value": true | false + }, + "context": { + "source": "voice" + } + } +} + +``` + +Additionally, this intent may specify a toggle: + +```json +{ + "type": "xrn:firebolt:intent:platform:accessibility", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "voice-guidance", + "data": { + "toggle": true + }, + "context": { + "source": "voice" + } + } +} +``` + +The intent **MAY** specify `speed` `number` property that specifies a speed from 0 to 10: + +```json +{ + "type": "xrn:firebolt:intent:platform:accessibility", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "voice-guidance", + "data": { + "speed": 2 + }, + "context": { + "source": "voice" + } + } +} +``` + +When providing a `speed` this intent **MAY** also set the `relative` property to `true` denoting an increase or decrease in speed. The speed value may be between -5 and 5 inclusive: + +```json +{ + "type": "xrn:firebolt:intent:platform:accessibility", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "voice-guidance", + "data": { + "speed": -1, + "relative": true + }, + "context": { + "source": "voice" + } + } +} +``` + +Finally, the intent **MAY** specify a `verbosity` property, which **MUST** use one of the following values is provided: + +| Value | Description | +|--------|-------------| +| `low` | to select shorter response, less context, and less detail; can use abbreviations and can selectively skip words | +| `high` | to select longer response, more context, and more detail; full comprehensive readout and explicit reflection of what is seen on screen | + +```json +{ + "type": "xrn:firebolt:intent:platform:accessibility", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "voice-guidance", + "data": { + "value": true, + "verbosity": "low" + }, + "context": { + "source": "voice" + } + } +} +``` + +#### 3.5.3. Audio Descritions Intent + +This intent allows a user to turn audio descriptions of content on or off. + + +```json +{ + "type": "xrn:firebolt:intent:platform:accessibility", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "audio-descriptions", + "data": { + "value": true | false + }, + "context": { + "source": "voice" + } + } +} + +``` + +This intent may specify a language: + +```json +{ + "type": "xrn:firebolt:intent:platform:accessibility", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "audio-descriptions", + "data": { + "value": true, + "language": "eng" + }, + "context": { + "source": "voice" + } + } +} +``` + +The `language` must be a three character ISO 639 1/2 code, e.g. `eng`. + +Additionally, this intent may specify a toggle: + +```json +{ + "type": "xrn:firebolt:intent:platform:accessibility", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "audio-descriptions", + "data": { + "toggle": true + }, + "context": { + "source": "voice" + } + } +} +``` + +#### 3.5.4. High Contrast Intent + +This intent allows a user to turn high contrast mode on or off. + +```json +{ + "type": "xrn:firebolt:intent:platform:accessibility", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "high-contrast", + "data": { + "value": true | false + }, + "context": { + "source": "voice" + } + } +} + +``` + +Additionally, this intent may specify a toggle: + +```json +{ + "type": "xrn:firebolt:intent:platform:accessibility", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "high-contrast", + "data": { + "toggle": true + }, + "context": { + "source": "voice" + } + } +} +``` + +#### 3.5.5. Screen Magnification Intent + +This intent allows a user to turn screen magnification on or off. + +```json +{ + "type": "xrn:firebolt:intent:platform:accessibility", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "screen-magnification", + "data": { + "value": true | false + }, + "context": { + "source": "voice" + } + } +} + +``` + +Additionally, this intent may specify a toggle: + +```json +{ + "type": "xrn:firebolt:intent:platform:accessibility", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "screen-magnification", + "data": { + "toggle": true + }, + "context": { + "source": "voice" + } + } +} +``` + +Finally, this intent may specify a magnification scale as a number: + +```json +{ + "type": "xrn:firebolt:intent:platform:accessibility", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "screen-magnification", + "data": { + "scale": 2.5 + }, + "context": { + "source": "voice" + } + } +} +``` + +Setting the scale to `1` turns off magnification. Setting the scale to a value greater than 1 turns on magnification. + +Even if a Firebolt platform does not support specifying the numeric scale, it **MUST** turn magnifacation on and off based on them. + +If the intent has the `toggle` property, then it **MUST NOT** have the `scale` or `value` property. + +If the intent has the `value` property, then it **MUST NOT** have the `toggle`. + +### 3.6. Interaction Intents + +Interaction Intents allow for voice (or other upstream intent service) +to control an on-screen UI without need for a keyboard or remote. + +#### 3.6.1. Focus Intent + +The Focus Intent allows users to move the focus / cursor +up/down/left/right: + +```json +{ + "type": "xrn:firebolt:intent:platform:interaction", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "focus", + "data": { + "direction": "up" | "down" | "left" | "right" + }, + "context": { + "source": "voice" + } + } +} + +``` + +Note that this does not give focus to a particular app, which is handled +by the "launch" action. + +These Intents will generate appropriate HTML browser keyCode events to +facilitate up/down/left/right key presses. + +#### 3.6.2. Select Intent + +The select intent allows users to tell an app select, e.g., +"click" on +whatever is focused. This is a platform-level intent that effectively +sends the "Ok" or "Select" key to the current app. + +```json +{ + "type": "xrn:firebolt:intent:platform:interaction", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "select", + "context": { + "source": "voice" + } + } +} +``` + +#### 3.6.3. Scroll Intent + +The Scroll Intent allows users to move the current view port +up/down/left/right: + +```json +{ + "type": "xrn:firebolt:intent:platform:interaction", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "scroll", + "data": { + "direction": "up" | "down" | "left" | "right", + "unit": "page" | "line" | "percent" + }, + "context": { + "source": "voice" + } + } +} +``` + +Both `direction` and `unit` are required. + +These Intents will generate appropriate browser / DOM scrolling +operations that don\'t require custom APIs. + +#### 3.6.4. Back Intent + +The back intent allows users to tell an app go to "back" like a +browser. This is a platform-level intent and will initiate a browser +back flow for web apps. For native apps, this will be converted to an +app Navigation Intent by the client and surfaced through the navigateTo +API. + +```json +{ + "type": "xrn:firebolt:intent:platform:interaction", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "back", + "context": { + "source": "voice" + } + } +} +``` + +#### 3.6.5. Exit Intent + +The exit intent allows users to tell an app close. This is a +platform-level intent and will simply move the current app into the +inactive state. + +```json +{ + "type": "xrn:firebolt:intent:platform:interaction", + "target": "client", + "metadata": { + "assistant": "XFINITY", + "lang": "eng-USA", + "micType": "NEAR_FIELD" + }, + "intent": { + "action": "exit", + "context": { + "source": "voice" + } + } +} +``` + +## 4. Launch Intents + +If a Firebolt app wants to launch the main or settings experience of the device, it can use one of the following abstract appIds with the `launch` intent. + +### 4.1. Content Discovery Launch Intents + +The following section IDs will be used, with the Firebolt application +type as the target App ID: + +`xrn:firebolt:application-type:main` + +### 4.2. Device Settings Launch Intent + +To launch the settings UI, a Launch Intent will be used, with the +Firebolt application type: + +`xrn:firebolt:application-type:settings` diff --git a/requirements/pr-fix-ci-fb-version/specifications/intents/index.md b/requirements/pr-fix-ci-fb-version/specifications/intents/index.md new file mode 100644 index 000000000..57e848d62 --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/intents/index.md @@ -0,0 +1,128 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: Intents +category: requirements +type: specification +--- +# Intents + +Document Status: Proposed Specification + +See [Firebolt Requirements Governance](../../governance) for more info. + +| Contributor | Organization | +| --------------- | ------------ | +| Jeremy LaCivita | Comcast | +| Simon Grist | Sky | + + +## 1. Overview +Offen times an end-user has a specific intention that needs to be communicated +to an app by the platform. A common reason for this is that a platform may have +a voice interface, and an end-user has given an instruction that needs to be +carried out by a specific app, e.g. a deep link to content w/in that app. + +Other use cases include editorially placed calls to action in the main user +experience, developer tools, and app-to-app communication brokered by Firebolt +intents. + +All intents have an `action`, and `context` property, and many intents have an +additional `data` property. + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. Intent Action](#3-intent-action) +- [4. Intent Context](#4-intent-context) +- [5. Intent Data](#5-intent-data) +- [6. Intent Message](#6-intent-message) + - [6.1. App Intent Message](#61-app-intent-message) + - [6.2. Platform Intent Message](#62-platform-intent-message) + - [6.3. Intent Message Type](#63-intent-message-type) + - [6.4. Intent Message Metadata](#64-intent-message-metadata) +- [7. Intent Types](#7-intent-types) + +## 3. Intent Action +The intent `action` denotes what type of intent it is. + +All intents **MUST** have an `action` `string` property denoting the type of intent. + +See the various [Intent Types](#intent-types) below for values. + +## 4. Intent Context + +The intent `context` provides information on where the intent orginated from. +All intents **MUST** have a `context` property, which is an object. + +The `context` object **MUST** have a `source` string property with one of the +following values: + + | Value | Description | + |-------------|-------------------------------------------------------------------------------------| + | `voice` | This intent originated from a voice service | + | `editorial` | This intent originated from an editorial CMS | + | `api` | This intent originated from some other API on the platform, e.g. `Discovery.launch` | + +The `context` object **MAY** have a `campaign` string property, which can have +any string value. This property denotes an editorial campaign. + +## 5. Intent Data +If an intent has any additional data, it **MUST** be in the `data` property. + +## 6. Intent Message +When an intent is sent to a Firebolt device from some other system, e.g. a cloud voice service, it **MUST** be wrapped in an `IntentMessage` object so that it can be properly routed after transport. + +An intent message **MUST** have an `intent` object property that is the intent being passed. + +An example intent message: + +```json +{ + "type": "xrn:firebolt:intent:app:launch", + "appId": "Netflix", + "intent": { + "action": "launch", + "context": { + "source": "voice" + } + }, + "metadata": { + "foo": "bar" + } +} +``` + +### 6.1. App Intent Message +If an intent is targeting a specific app, then the intent message **MUST** have an `appId` string property with the appId of the targeted app. + +### 6.2. Platform Intent Message +If an intent messagage does not have an `appId` property, then it **MUST** be targeting the device itself, e.g. a `power` intent to turn off the device. + +### 6.3. Intent Message Type +An intent message **MUST** have a `type` string property for categorizing the intent. + +The type property **MUST** match the regular expression: + +```regex +^xrn:firebolt:intent:(app|platform):[a-zA-Z]+$ +``` + +App Intent Messages **MUST** have the fourth section set to `app`. + +Platform Intent Messages **MUST** have the fourth section set to `platform` + +All Intent Messages **MUST** have the fifth section set to the same value as `intent.action`. + +Platforms may use this to route different types of intents to different subsystems without having to understand the internal structure of Firebolt intent objects. + +### 6.4. Intent Message Metadata +An intent message **MAY** have a `metadata` object property for adding distributor-specific metadata for logging or analytics. The values in `metadata` **MUST NOT** impact how the device interprets the intent. + +## 7. Intent Types + +- [Play](./play) +- [Tune](./tune) +- [Basic Navigation](./navigation) + \ No newline at end of file diff --git a/requirements/pr-fix-ci-fb-version/specifications/intents/play/index.md b/requirements/pr-fix-ci-fb-version/specifications/intents/play/index.md new file mode 100644 index 000000000..d318289c7 --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/intents/play/index.md @@ -0,0 +1,274 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: Play Intent +category: requirements +type: specification +--- +# Play Intent + +Document Status: Proposed Specification + +See [Firebolt Requirements Governance](../../../governance) for more info. + +| Contributor | Organization | +| --------------- | ------------ | +| Jeremy LaCivita | Comcast | +| Liz Sheffield | Comcast | +| Seth Kelly | Comcast | +| Simon Grist | Sky | + +## 1. Overview +There are many use cases where a Firebolt device will need to inform an app of +a user's intention to play something. This could originate from a voice remote, +an editorial tile, a developer tool, or any number of places. Having a standard +message to play something allows an app to integrate with this message once, +while allowing the platform to change when and where the intent comes from +w/out further work from the app. + +Apps will need to be able to play specific entities from a back-office +meta-data integration, entities from a federated meta-data integration, or +non-specific entities based on a query. + +The existing Firebolt `playback` intent does not meet these requirements. This +document outlines a more flexible `play-entity` and `play-query` intent to +replace it. + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. Play Entity Intent](#3-play-entity-intent) + - [3.1. Play Entity Options](#31-play-entity-options) + - [3.1.1. Play First Option](#311-play-first-option) +- [4. Play Query Intent](#4-play-query-intent) + - [4.1. Play Options for Query](#41-play-options-for-query) +- [5. Core APIs](#5-core-apis) + +## 3. Play Entity Intent +The Firebolt `navigateTo` notification **MUST** support a `play-entity` intent, +which tells an app to initiate playback of specific entity. + +The `play-entity` intent **MUST** have an `action` property, whose value is +`"play-entity"`. + +The `play-entity` intent **MUST** have a `data` object property, which is an +object conforming to the following: + +> The `data` object **MUST** have an `entity` object property. +> +> The `entity` object, **MUST** be an [Entity](../../entities/). +> +> The `data` object **MAY** have an `options` object property that conforms to +> [Play Entity Options](#31-play-entity-options). + +The `play-entity` intent **MUST** have a `context` object property that +conforms to the [Intent Context](../index#4-intent-context). + +An example play-entity intent: + +```json +{ + "action": "play-entity", + "data": { + "entity": { + "entityType": "program", + "programType": "movie", + "entityId": "movie/xyz" + } + }, + "context": { + "source": "voice" + } + } +``` + +Which would instruct an app to play the movie entity with id `movie/xyz`. + +### 3.1. Play Entity Options + +#### 3.1.1. Play First Option +For `play-entity` intents with an `entity` whose `entityType` is `"playlist"`, +e.g.: + + ```json + { + "action": "play-entity", + "data": { + "entity": { + "entityType": "playlist", + "entityId": "playlist/xyz" + } + }, + "context": { + "source": "voice" + } + } +``` + +The `options` property of the intent **MAY** contain a `playFirstId` string +property, to identify an entity to play *before* starting the playlist, e.g.: + + ```json + { + "action": "play-entity", + "data": { + "entity": { + "entityType": "playlist", + "entityId": "playlist/xyz" + }, + "options": { + "playFirstId": "song/xyz" + } + }, + "context": { + "source": "voice" + } + } +``` + +If `playFirstId` is provided, the the targeted app **MUST** attempt to play the +entity denoted by `playFirstId` first, regardless of whether it is part of the +identified playlist or not. + +If the `playFirstId` was successfully played, then the app **SHOULD** remove +the `playFirstId` entity from any later position in the playlist, if +appropriate. + +The `options` property of the intent **MAY** contain a `playFirstTrack` integer +property, to identify an entity from the playlist to play *before* the rest of +the playlist, e.g.: + + ```json + { + "action": "play-entity", + "data": { + "entity": { + "entityType": "playlist", + "entityId": "playlist/xyz" + }, + "options": { + "playFirstTrack": 3 + } + }, + "context": { + "source": "voice" + } + } +``` + +If `playFirstTrack` is provided and the playlist has at least that many items, +then the item denoted by `playFirstTrack` **MUST** be moved from it's original +position to the front of the playlist for playback. + +The options object **MUST NOT** have both a `playFirstId` and a +`playFirstTrack` property. + +## 4. Play Query Intent +The Firebolt `navigateTo` notification **MUST** support a `play-query` intent, +which tells an app to find content that matches a query and play that content. + +The `play-query` intent **MUST** have an `action` property, whose value is +`"play-query"`. + +The `play-query` intent **MUST** have `data` property, which is an object +conforming to the following: + +> The `data` object **MUST** have a `query` string property. +> +> The `data` object **MAY** have an `options` object property that conforms to +> [Play Options](#41-play-options-for-query). + +The `play-query` intent **MUST** have a `context` object property that conforms +to the [Intent Context](../index#4-intent-context). + +An example play intent: + +```json +{ + "action": "play-query", + "data": { + "query": "Ed Sheeran" + }, + "context": { + "source": "voice" + } +} +``` + +Which would instruct an app to search for content matching the query "Ed +Sheeran" and then play the results. + +### 4.1. Play Options for Query +For `play-query` intents with a `query`, e.g.: + + ```json + { + "action": "play-query", + "data": { + "query": "Ed Sheeran" + }, + "context": { + "source": "voice" + } + } +``` + +The `options` property of the intent **MAY** contain a `programTypes` +array-of-strings property, to filter which program entity typess, e.g. `[ +"movie", "episode" ]` should be included, e.g.: + + ```json + { + "action": "play-query", + "data": { + "query": "Ed Sheeran", + "options": { + "programTypes": [ + "movie" + ] + } + }, + "context": { + "source": "voice" + } + } +``` + +The `options` property of the intent **MAY** contain a `musicTypes` +array-of-strings property, to filter which music entity typess, e.g. `[ "song", +"album" ]` should be included, e.g.: + + ```json + { + "action": "play-query", + "data": { + "query": "Ed Sheeran", + "options": { + "programTypes": [ + "movie" + ], + "musicTypes": [ + "song" + ] + } + }, + "context": { + "source": "voice" + } + } +``` + +## 5. Core APIs +The Firebolt Core SDK will support listening to `play-query` and `play-entity` +intents via the `Discovery.navigateTo` notification. + +```javascript +import { Discovery } from '@firebolt-js/sdk' + +Discovery.listen('navigateTo', (intent) => { + if (intent.action === 'play-query') + // do stuff with play intent! + } +}) +``` \ No newline at end of file diff --git a/requirements/pr-fix-ci-fb-version/specifications/intents/user-interest/index.md b/requirements/pr-fix-ci-fb-version/specifications/intents/user-interest/index.md new file mode 100644 index 000000000..aafbe4d69 --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/intents/user-interest/index.md @@ -0,0 +1,23 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: User Interest +category: requirements +type: specification +--- +# User Interest + +Document Status: Candidate Specification + +See [Firebolt Requirements Governance](../../../governance) for more info. + +| Contributor | Organization | +| -------------- | -------------- | +| Eugene Chung | Comcast | +| Tim Dibben | Sky | +| Mike Horwitz | Comcast | +| Jeremy LaCivita | Comcast | + +## 1. Overview +This document describes the intent to initiate a [User Interest](../../discovery/user-interest) flow from an upstream system, e.g. a voice assistant. diff --git a/requirements/pr-fix-ci-fb-version/specifications/localization/language/index.md b/requirements/pr-fix-ci-fb-version/specifications/localization/language/index.md new file mode 100644 index 000000000..ca019cf40 --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/localization/language/index.md @@ -0,0 +1,107 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: Language Settings +category: requirements +type: specification +--- +# Language Settings + +Document Status: Candidate Specification + +See [Firebolt Requirements Governance](../../../governance) for more info. + +| Contributor | Organization | +| -------------- | -------------- | +| Jeremy LaCivita | Comcast | +| Kevin Pearson | Comcast | +| Tim Dibben | Sky | + +## 1. Overview + +This document describes the requirements that Firebolt platforms must +fulfill when surfacing user language preferences. + +Exposing these settings, e.g. the main device language, or a list of +preferred audio languages, allows Apps to respect the device's current +setting so that the user has a seamless experience when switching from +app to app. + +This document covers how Firebolt platforms manage language settings and +expose to Apps. It does not cover the use cases Apps might apply these +APIs to. + +The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**NOT RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in [BCP 14](https://www.rfc-editor.org/rfc/rfc2119.txt) [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here. + +- [1. Overview](#1-overview) +- [2. Language](#2-language) +- [3. Locale](#3-locale) +- [4. Preferred Audio Languages](#4-preferred-audio-languages) +- [5. Core SDK APIs](#5-core-sdk-apis) +- [6. Manage SDK APIs](#6-manage-sdk-apis) + +## 2. Language + +Language describes the ISO 639 1/2 code for the preferred language on +this device. All Apps **SHOULD** generally render their user experience +in this language. This is a guideline, not an absolute requirement, +since different Apps may have different target audiences with differing +languages prevalent within those audiences. + +This setting is represented by a mutable property which is a string +conforming to the ISO 639 1/2 standard, e.g. `'en'`. + +## 3. Locale + +Locale describes the *full* BCP 47 code, including script, region, +variant, etc., for the preferred language/locale on this device. Apps +**MAY** alter their user experience to match this locale to account for +local differences in the same language. + +This setting is represented by a mutable property which is a string +conforming to the full BCP 47 standard, e.g. `'en-US'`. + +## 4. Preferred Audio Languages + +The preferred audio languages setting provides a ranked list of +languages that the user prefers to be selected on this device. All +values are from the ISO 639 1/2 standard. Apps **MAY** use this list to +influence selection of an initial audio track when playing content with +multiple languages. For example, a bilingual user living in an English +speaking country may have the `language` set to `'en`\' and the +`preferredAudioLanguages` set to `['fr', 'en']`. This +enables them to typically consume content from apps whose catalogs are +mostly filmed in English, but automatically get the French language +track when watching a French movie that has both French and English +tracks. + +This setting is represented by a mutable property which is an array of +strings conforming to the ISO 639 1/2 standard, e.g. `'en'`. + +## 5. Core SDK APIs + +The following APIs are exposed by the Firebolt Core SDK as part of the +`core:localization` domain/module. + +Each of these APIs a read-only property. + +- `Localization.language():Promise` + +- `Localization.locale():Promise` + +- `Localization.preferredAudioLanguages():Promise` + +- `Localization.onLanguageChanged():Promise` + +- `Localization.onLocaleChanged():Promise` + +- `Localization.onPreferredAudioLanguagesChanged():Promise` + +## 6. Manage SDK APIs + +The following APIs are exposed by the Firebolt Manage SDK as part of the +`manage` domain. + +The Manage SDK APIs inclueare identical to the Core SDK, except that all +property APIs are mutable. diff --git a/requirements/pr-fix-ci-fb-version/specifications/openrpc-extensions/app-passthrough-apis/index.md b/requirements/pr-fix-ci-fb-version/specifications/openrpc-extensions/app-passthrough-apis/index.md new file mode 100644 index 000000000..069ad0827 --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/specifications/openrpc-extensions/app-passthrough-apis/index.md @@ -0,0 +1,472 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: App Pass-through APIs +category: requirements +type: specification +--- +# App Pass-through APIs + +Document Status: Working Draft + +See [Firebolt Requirements Governance](../../../governance) for more info. + +| Contributor | Organization | +|-----------------|----------------| +| Jeremy LaCivita | Comcast | +| Kevin Pearson | Comcast | +| Yuri Pasquali | Sky | + +## 1. Overview +This document describes how one Firebolt App can provide a capability that may be used by another Firebolt App, with the platform as a permission broker that passes the requests and responses to each app without feature-specific logic. + +This document covers the App Pass-through Firebolt OpenRPC extension as well as how Firebolt implementations should detect and execute app provided pass-through APIs. + +Some APIs require an app to fulfill the request on behalf of another app, e.g. to provide a UX or cross-app data sharing. Generally the calling app doesn't care, or have a say in, which other app provides the API, that is up to the Firebolt distributor. + +To facilitate these APIs, Firebolt denotes an OpenRPC tag with OpenRPC extensions to connect the `provide` API to the `use` API. + +This document is written using the [IETF Best Common Practice 14](https://www.rfc-editor.org/rfc/rfc2119.txt) and should include the following summary in the Overview section: + +The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**NOT RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in [BCP 14](https://www.rfc-editor.org/rfc/rfc2119.txt) [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here. + +## 2. Table of Contents +- [App Pass-through APIs](#app-pass-through-apis) + - [1. Overview](#1-overview) + - [2. Table of Contents](#2-table-of-contents) + - [3. Open RPC Extensions](#3-open-rpc-extensions) + - [3.1. Provided By Extension](#31-provided-by-extension) + - [4. Routing App pass-through APIs](#4-routing-app-pass-through-apis) + - [4.1. No available providers](#41-no-available-providers) + - [4.2. Direct pass-through](#42-direct-pass-through) + - [4.4. Pass-through notifications](#44-pass-through-notifications) + - [5. Provider Candidates](#5-provider-candidates) + - [6. Best Candidate](#6-best-candidate) + - [7. Result Transformations](#7-result-transformations) + - [8. Provider Parameter Injection](#8-provider-parameter-injection) + - [9. API Gateway](#9-api-gateway) + - [10. Example: User Interest](#10-example-user-interest) + - [10.1. User Interest Pull](#101-user-interest-pull) + - [10.2. User Interest Push](#102-user-interest-push) + +## 3. Open RPC Extensions + +### 3.1. Provided By Extension +Firebolt OpenRPC **MUST** support a `string` `x-provided-by` extension property on the `capabilities` tag that denotes a method is provided by some app on the device registering for the specified provider API, e.g.: + +```json +{ + "methods": [ + { + "name": "Keyboard.standard", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Keyboard.onRequestStandard", + "x-uses": [ + "xrn:firebolt:capability:input:keyboard" + ] + } + ] + } + ] +} +``` + +The method denoted by `x-provided-by` is referred to as the "*provider*" or "*provider method*" for the remainder of this document. + +The method with the `x-provided-by` extension is referred to as the "*platform method*" for the remainder of this document. + +To prevent unresolvable chaining of methods the `x-provided-by` extension **MUST NOT** be used on a method with any value in the `x-provides` extension. + +To prevent compound methods a platform method **MUST** `use` a single capability or `manage` a single capability, but not both. + +The provider method **MUST** provide the same capability that the platform method either uses or manages. + +If a platform method has no provider method then it is not a valid Firebolt OpenRPC method schema, and a validation error **MUST** be generated. + +## 4. Routing App pass-through APIs +App pass-through APIs may be routed in one of several ways. + +When an app calls a platform method, i.e. one with an `x-provided-by` extension, the platform **MUST** use one of the routing methods defined in this section based on various properties of the method. + +### 4.1. No available providers +When an app calls a platform method with an `x-provided-by` extension, the platform **MUST** return an unavailable error if there is no [candidate app](#7-provider-candidates) to execute the provider method. + +```json +{ + "id": 1, + "error": { + "code": -50300, + "message": "Capability is unavailable." + } +} +``` + +Where `` is the capability XRN string, e.g. `xrn:firebolt:capabilities:example:foo`. + +### 4.2. Direct pass-through +A direct pass-through is where a single app provides a single response to a single request by another app. + +This section only applies to app provider methods that do not have an `event` tag. + +The platform method result schema **MUST** either: + +> Match the `x-response` schema on the provider method so that the result can be passed through. +> +> or +> +> Have a property that matches the `x-response-name` string and `x-response` schema on the +> provider method so that the result can be composed and passed through. + +The platform **MUST** call the provider method from the [best candidate](#8-best-candidate) app and acquire the result. + +If the platform method result schema matches the `x-response` schema on the provider method then the value **MUST** be used as-is. + +Otherwise if the platform method result schema has a property that matches the `x-response` schema on the provider method then the value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [result transformations](#9-result-transformations) to the composed result. + +### 4.4. Pass-through notifications +Firebolt events have a synchronous subscriber registration method, e.g. `Lifecycle.onInactive(true)`, in addition to asynchronous notifications when the event actually happens. For events powered by an app pass-through, only the asynchronous notifications are passed in by the providing app. The initial event registration is handled by the platform, and the success response is not handled by the providing app. + +This section only applies to platform methods that have an `event` tag. + +App provided event registration **MUST** not return an availability error due to a lack of providers, since one may be launched at a future point. + +To ensure that event provider methods all behave the same the provider method **MUST** have a `result` schema with `"type"` set to `"null"`, since it will not expect any data in the response from the platform after pushing the notification. + +The platform method result schema **MUST** either: + +> Match the *last* parameter schema on the provider method so that the result can be passed through. +> +> Have a property that matches the *last* parameter name and schema on the provider method so that the result can be passed through. + +Example platform method with context: +```json +{ + "name": "onFoo", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capabilities:example:foo" + ], + "x-provided-by": "foo" + }, + { + "name": "event" + } + ], + "params": [ + { + "name": "context1", + "schema":{ + "type": "string" + } + }, + { + "name": "context2", + "schema": { + "type": "number" + } + } + ], + "result": { + "name": "value", + "schema": { + "type": "boolean" + } + } +} +``` + +Matching provider method: + +```json +{ + "name": "foo", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capabilities:example:foo" + } + ], + "params": [ + { + "name": "context1", + "schema":{ + "type": "string" + } + }, + { + "name": "context2", + "schema": { + "type": "number" + } + }, + { + "name": "value", + "schema": { + "type": "boolean" + } + } + ] +} +``` + +When a provider app calls a provider method mapped to an event the platform **MUST** ignore the notification if the app is not a [candidate app](#7-provider-candidates) for this capability. + +If the platform method result schema matches the *last* parameter schema on the provider method then the value **MUST** be used as-is. + +Otherwise if the platform method result schema has a property that matches the *last* parameter schema on the provider method then the value **MUST** be composed into an object under the corresponding property name and the platform **MUST** apply any [result transformations](#9-result-transformations) to the composed result. + +If the value was composed into the platform method result under a matching property, then any context parameter values from the provider method that correspond to a property name and schema in the platform method result **MUST** also be composed into the platform method result under those properties. + +Finally the platform **MUST** dispatch the notification to the app that registered for the event via the original platform method, using all but the last parameter as context. + +## 5. Provider Candidates +When a platform method with an `x-provided-by` extension is called, then +all loaded apps that have permission to provide the capability **MUST** be +considered as candidates to fulfill the method. + +## 6. Best Candidate +Any provider candidates that have not registered to provide the method in +question **MUST NOT** be considered the best candidate and removed from +consideration. + +If there is only one candidate left then it **MUST** be the best candidate. + +If there is more than one candidate left, then the candidate app that most recently had RCU input focus **MUST** be the best candidate. + +If none of the candidates have had focus yet, then the candidate app that was most recently launched **MUST** be the best candidate. + +## 7. Result Transformations +A platform method may be configured to insert the providing app id into composite values. This is not allowed in non-composite results to avoid collisions with the provder method sending an appId and Firebolt overriding it. + +If a "composite result" was used to wrap the provider method value and the platform method's schema has an `appId` `string` property at the top level then the property's value **MUST** be set to the the appId of the providing app for that result. + +## 8. Provider Parameter Injection +If the provider method has a parameter named `appId` and the platform method *does not*, then the appId of the app calling the platform method **MUST** be sent to the provider in the `appId` parameter. + +If the platform method is an `event` and the provider method has context parameters then each context parameter from the provider that has a matching context parameter in the event **MUST** have it's value passed to that parameter. + +If the platform method is an `event` with a "composite result" and the provider method has context parameters then each context parameter from the provider that has a matching property on the `result` object **MUST** have it's value copied into that property. + +## 9. API Gateway +The Firebolt API Gateway **MUST** detect app-passthrough APIs and map the `use`/`manage` APIs to the corresponding `provide` APIs by parsing the Firebolt OpenRPC Specification and following the logic outline in this document. + +## 10. Example: User Interest + +The following schemas are referenced by these examples: + +```json +{ + "components": { + "schemas": { + "InterestType": { + "type": "string", + "enum": [ + "interest", + "disinterest" + ] + }, + "InterestReason": { + "type": "string", + "enum": [ + "playlist" + ] + }, + "EntityDetailsFromApp": { + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "entity": { + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" + } + }, + "required": [ + "appId", + "entity" + ] + } + } + } +} +``` + +### 10.1. User Interest Pull + +Platform method: + +```json +{ + "methods": [ + { + "name": "requestUserInterest", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Discovery.onRequestUserInterest", + "x-uses": [ + "xrn:firebolt:capability:discovery:interest" + ] + } + ], + "params": [ + { + "name": "type", + "required": true, + "schema": { + "$ref": "#/components/schemas/InterestType" + } + }, + { + "name": "reason", + "required": true, + "schema": { + "$ref": "#/components/schemas/InterestReason" + } + } + ], + "result": { + "name": "interest", + "schema": { + "$ref": "#/components/schemas/EntityDetailsFromApp", + } + } + } + ] +} +``` + +Provider method: + +```json +{ + "methods": [ + { + "name": "onRequestUserInterest", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest" + }, + { + "name": "event", + "x-response": { + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" + } + } + ], + "result": { + "name": "request", + "schema": { + "type": "object", + "properties": { + "type": { + "$ref": "#/components/schemas/InterestType", + }, + "reason": { + "$ref": "#/components/schemas/InterestReason", + } + } + } + } + } + ] +} +``` + +### 10.2. User Interest Push + +Provider method: + +```json +{ + "methods": [ + { + "name": "userInterest", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest" + } + ], + "params": [ + { + "name": "type", + "schema": { + "$ref": "#/components/schemas/InterestType", + } + }, + { + "name": "reason", + "schema": { + "$ref": "#/components/schemas/InterestReason", + } + }, + { + "name": "entity", + "schema": { + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" + } + } + ], + "result": { + "name": "result", + "schema": { + "type": "null" + } + } + } + ] +} +``` + +Platform Method: + +```json +{ + "methods": [ + { + "name": "onUserInterest", + "tags": [ + { + "name": "capabilities", + "x-provided-by": "Discovery.userInterest", + "x-uses": [ + "xrn:firebolt:capability:discovery:interest" + ] + }, + { + "name": "event" + } + ], + "params": [], + "result": { + "name": "interest", + "schema": { + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "type": { + "$ref": "#/components/schemas/InterestType" + }, + "reason": { + "$ref": "#/components/schemas/InterestReason" + }, + "entity": { + "$ref": "https://meta.comcast.com/firebolt/entity#/definitions/EntityDetails" + } + } + + } + } + } + ] +} +``` \ No newline at end of file diff --git a/requirements/pr-fix-ci-fb-version/style-guide-and-template/index.md b/requirements/pr-fix-ci-fb-version/style-guide-and-template/index.md new file mode 100644 index 000000000..33fec52cb --- /dev/null +++ b/requirements/pr-fix-ci-fb-version/style-guide-and-template/index.md @@ -0,0 +1,99 @@ +--- + +version: pr-fix-ci-fb-version +layout: default +title: Requirements Style Guide +category: requirements +--- +# Requirements Style Guide + +Document Status: Working Draft + +See [Firebolt Requirements Governance](../governance) for more info. + +**NOTE**: Update this link based on your directory depth ^^ + +| Contributor | Organization | +| -------------- | -------------- | +| TBD | TBD | + +## 1. Overview +This document is both a style guide *and* a template for Firebolt Requirements Specifications. + +The Overview section is a non-normative or informative introduction to the contents and subject matter of the document. This is included to introduce the reader to the overall problem, solution, and scope. No formal requirements will be included here, as it will often be skipped by readers that are already familiar with the document. + +Overviews can be as long or short as appropriate for the subject matter, and should have a target audience ranging from technical product managers to engineering teams that may be testing, implementing, or integrating with the functionality described in the document. + +The overview must contain the following towards the end: + +Requirements documents are written using the [IETF Best Common Practice 14](https://www.rfc-editor.org/rfc/rfc2119.txt) and should include the following summary in the Overview section: + +The key words "**MUST**", "**MUST NOT**", "**REQUIRED**", "**SHALL**", "**SHALL NOT**", "**SHOULD**", "**SHOULD NOT**", "**RECOMMENDED**", "**NOT RECOMMENDED**", "**MAY**", and "**OPTIONAL**" in this document are to be interpreted as described in [BCP 14](https://www.rfc-editor.org/rfc/rfc2119.txt) [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here. + +## 2. Table of Contents +- [1. Overview](#1-overview) +- [2. Table of Contents](#2-table-of-contents) +- [3. Specification Style Requirements](#3-specification-style-requirements) + - [3.1. General Style Requirements](#31-general-style-requirements) + - [3.2. Firebolt Style Requirements](#32-firebolt-style-requirements) + - [3.3. Firebolt Method Templates](#33-firebolt-method-templates) +- [4. Example Section](#4-example-section) + - [4.1. Example Feature](#41-example-feature) + +**NOTE**: This is a simple table of contents. It should include links to all headers in the document, except for the top-level header (i.e. `# Title`). It is recommended to use a Markdown plugin to generate this based on headers ranging from level two to level six. Delete this note from your actual spec :) + +## 3. Specification Style Requirements +Firebolt uses method templates in order to code-generate consistent APIs. For example, methods with the `"property"` tag only need to have the `getter` editorially defined. The Firebolt OpenRPC tools will auto-generate the `setter` and `subscriber` as OpenRPC methods with matching types. Additionally, the Firebolt OpenRPC tools wil then code-generate the getter, setter, and subscriber as APIs in various languages using templates. + +This enables both consistent APIs (all properties have a recongnizable pattern) and consistent SDK implementation, which reduces the code that needs to be tested. + +### 3.1. General Style Requirements +All headers **MUST** be numbered, and have the parent header as the prefix, separated with '.' + +Module and method names, as well as constants **MUST** be in monospace font, e.g. the `Foo` module **MUST** have a `bar` method that returns `true`. Specs should use JavaScript notation for any code examples if the spec is not targeting another specific language binding, e.g. a spec about Event listeners in C++ would use C++ syntax. + +String constants and values **MUST** be wrapped in quotes for clarity, e.g. `"Hello World"`. + +### 3.2. Firebolt Style Requirements +All Firebolt APIs exposed for building Firebolt Apps **MUST** be exposed as JSON-RPC methods on a WebSocket accessible to the device, typically running locally. + +Parameters and return values for all APIs **MUST** be described using JSON-Schema schemas. + +Methods **MUST** be grouped into “modules” or “packages” of functionality. + +The JSON-RPC method name of any method **MUST** follow the template: + +``` +. +``` + +e.g. + +``` +lifecycle.ready +``` + +JSON-RPC method names are case sensitive. + +Methods **MUST** have at least one capability used, managed, or provided by the method. + +Methods **MAY** require the use of more than one capability, but this means that the app must have permission to all of them. In order to enable App permissions to be evaluated in an isolated layer, separate from the method implementation itself, a Firebolt method **MUST NOT** be specified to add or remove fields based on the caller's permissions. + +The words used in method and parameter names **SHOULD** be used as consistently as possible across the Firebolt API surface. See the [Firebolt API Glossary](../glossary) for words that Firebolt uses and how they are used. + +### 3.3. Firebolt Method Templates +Methods **SHOULD** consider using the existing Firebolt method tags, in order to have a level of consistency across APIs. + +If a Firebolt method is specified such that it requires a non-existant template, then a new Requirements Specification **MUST** be written and referenced by the specification that inspired it. Method templates **MUST** be designed with re-use in mind. + +## 4. Example Section +A section describes group of closely related features. Many specifications have only one section, however, more complicated specifications may have many. The first paragraph of a section is typically a non-normative introduction to that section, and therefor does not contain any formal requirements. + +### 4.1. Example Feature +Each feature under a section will have it's own heading. Non-normative introductions to features are not typically needed, as the reader is ready to get into requirements at this point. It is recommended that all Feature headings under each Section contain only sentences or short paragraphs with formal requirements, e.g. MUST, SHOULD, MAY, MUST NOT, SHOULD NOT, etc. These sentences should be separated by blank lines for readability, e.g.: + +This requirement **MUST** be satisifed. + +This requirement **SHOULD** be satisfied. + +This requirement **MUST** be satisfied. The requirement **MUST** be satisifed in this particular way.