diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 2a2c3bb31..ac225d765 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -39,5 +39,5 @@ jobs: - run: npm run compile - run: npm run slice - run: npm run validate:compiled - - run: npm run sdks + - run: npm run sdk - run: npm run test diff --git a/CHANGELOG.md b/CHANGELOG.md index ca266e76a..3c5423498 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,24 @@ +# [1.2.0-next.5](https://github.com/rdkcentral/firebolt-apis/compare/v1.2.0-next.4...v1.2.0-next.5) (2024-06-13) + + +### Bug Fixes + +* 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)) + +# [1.2.0-next.4](https://github.com/rdkcentral/firebolt-apis/compare/v1.2.0-next.3...v1.2.0-next.4) (2024-06-06) + + +### Features + +* Command and Control Intents ([#251](https://github.com/rdkcentral/firebolt-apis/issues/251)) ([c8f8dae](https://github.com/rdkcentral/firebolt-apis/commit/c8f8dae5a9a0f14a3815c04df5a55763823d4898)) + +# [1.2.0-next.3](https://github.com/rdkcentral/firebolt-apis/compare/v1.2.0-next.2...v1.2.0-next.3) (2024-06-06) + + +### Features + +* User Interest ([#170](https://github.com/rdkcentral/firebolt-apis/issues/170)) ([48a1094](https://github.com/rdkcentral/firebolt-apis/commit/48a1094aaab6418f09db662dbc81f090a34f32ed)) + # [1.2.0-next.2](https://github.com/rdkcentral/firebolt-apis/compare/v1.2.0-next.1...v1.2.0-next.2) (2024-04-08) diff --git a/firebolt-openrpc.config.json b/firebolt-openrpc.config.json new file mode 100644 index 000000000..57b8c3e1c --- /dev/null +++ b/firebolt-openrpc.config.json @@ -0,0 +1,10 @@ +{ + "sdk": { + + }, + "languages": { + "javascript": { + "copySchemasIntoModules": true + } + } +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c4faf171a..13c5a04da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,17 @@ { "name": "@firebolt-js/sdks", - "version": "1.2.0-next.2", + "version": "1.2.0-next.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@firebolt-js/sdks", - "version": "1.2.0-next.2", + "version": "1.2.0-next.5", "license": "Apache-2.0", "workspaces": [ "src/sdks/core", - "src/sdks/manage" + "src/sdks/manage", + "src/sdks/discovery" ], "bin": { "firebolt-version": "src/js/version.mjs" @@ -18,8 +19,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "3.0.0-next.1", - "@firebolt-js/schemas": "2.0.0", + "@firebolt-js/openrpc": "rdkcentral/firebolt-openrpc#major/rpc", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", "@semantic-release/git": "^10.0.1", @@ -36,15 +36,6 @@ "typescript": "^4.6.4" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", @@ -989,94 +980,22 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@eslint/eslintrc": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", - "integrity": "sha512-1JTKgrOKAHVivSvOYw+sJOunkBjUOvjqWk1DPja7ZFhIS2mX/4EgTT8M7eTK9jrKhL/FvXXEbQwIs3pg1xp3dg==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "lodash": "^4.17.20", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "dependencies": { - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/@firebolt-js/discovery-sdk": { + "resolved": "src/sdks/discovery", + "link": true }, "node_modules/@firebolt-js/manage-sdk": { "resolved": "src/sdks/manage", "link": true }, "node_modules/@firebolt-js/openrpc": { - "version": "3.0.0-next.1", - "resolved": "https://registry.npmjs.org/@firebolt-js/openrpc/-/openrpc-3.0.0-next.1.tgz", - "integrity": "sha512-bFNXTePgmYPqHqMiGX2aWuTBY0KrZtwd7TVd58tg8fKpIgCjaBLf/8MAXqTd6oWYKU9o86zi4De3ygmYQCuJYg==", + "version": "3.0.0-next.4", + "resolved": "git+ssh://git@github.com/rdkcentral/firebolt-openrpc.git#c09602178f609146c0532d41b437a38d38053c05", "dev": true, + "license": "Apache-2.0", "dependencies": { - "ajv": "^8.3.0", - "ajv-formats": "^2.1.0", + "ajv": "^8.12.0", + "ajv-formats": "^2.1.1", "array.prototype.groupby": "^1.1.0", "crocks": "^0.12.4", "deepmerge": "^4.2.2", @@ -1098,15 +1017,15 @@ "dev": true }, "node_modules/@firebolt-js/openrpc/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -1160,39 +1079,6 @@ "node": ">=6" } }, - "node_modules/@firebolt-js/schemas": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@firebolt-js/schemas/-/schemas-2.0.0.tgz", - "integrity": "sha512-RSPyEfbKBclQQfKYgsHYQEPWQP2uka0JQKoq9h9V5S5swJtcVMLZAZcoK+G0R8/30jz12Pfl6MipIRhpJIoaFQ==", - "dev": true, - "dependencies": { - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "standard": "^16.0.4" - } - }, - "node_modules/@firebolt-js/schemas/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@firebolt-js/schemas/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/@firebolt-js/sdk": { "resolved": "src/sdks/core", "link": true @@ -2353,12 +2239,6 @@ "@types/tough-cookie": "*" } }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, "node_modules/@types/minimist": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.4.tgz", @@ -2465,15 +2345,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, "node_modules/acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", @@ -2542,15 +2413,15 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -2563,15 +2434,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -2649,13 +2511,16 @@ "dev": true }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2667,25 +2532,6 @@ "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -2695,42 +2541,6 @@ "node": ">=8" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.groupby": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array.prototype.groupby/-/array.prototype.groupby-1.1.0.tgz", @@ -2746,17 +2556,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -2775,15 +2586,6 @@ "node": ">=0.10.0" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2791,10 +2593,13 @@ "dev": true }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -2987,14 +2792,19 @@ "dev": true }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3468,6 +3278,57 @@ "node": ">=12" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -3549,12 +3410,6 @@ "node": ">=4.0.0" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -3565,17 +3420,20 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-properties": { @@ -3706,18 +3564,6 @@ "node": ">=8" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/domexception": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", @@ -3775,19 +3621,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/env-ci": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/env-ci/-/env-ci-9.1.1.tgz", @@ -3921,50 +3754,57 @@ } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -3973,28 +3813,61 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } }, "node_modules/es-to-primitive": { "version": "1.2.1", @@ -4055,606 +3928,6 @@ "source-map": "~0.6.1" } }, - "node_modules/eslint": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz", - "integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.3.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.2.0", - "esutils": "^2.0.2", - "file-entry-cache": "^6.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash": "^4.17.20", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.4", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-standard": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", - "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peerDependencies": { - "eslint": "^7.12.1", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-promise": "^4.2.1 || ^5.0.0" - } - }, - "node_modules/eslint-config-standard-jsx": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-10.0.0.tgz", - "integrity": "sha512-hLeA2f5e06W1xyr/93/QJulN/rLbUVUmqTlexv9PRKHFwEC9ffJcH2LvJhMoEqYQBEYafedgGZXH2W8NUpt5lA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peerDependencies": { - "eslint": "^7.12.1", - "eslint-plugin-react": "^7.21.5" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.24.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", - "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.3", - "array.prototype.flat": "^1.2.4", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.6.2", - "find-up": "^2.0.0", - "has": "^1.0.3", - "is-core-module": "^2.6.0", - "minimatch": "^3.0.4", - "object.values": "^1.1.4", - "pkg-up": "^2.0.0", - "read-pkg-up": "^3.0.0", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.11.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/eslint-plugin-import/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/eslint-plugin-import/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "dependencies": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "peerDependencies": { - "eslint": ">=5.16.0" - } - }, - "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-promise": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.1.tgz", - "integrity": "sha512-XgdcdyNzHfmlQyweOPTxmc7pIsS6dE4MvwhXWMQ2Dxs1XAL2GJDilUsjWen6TWik0aSI+zD/PqocZBblcm9rdA==", - "dev": true, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.3.tgz", - "integrity": "sha512-ZMbFvZ1WAYSZKY662MBVEWR45VaBT6KSJCiupjrNlcdakB90juaZeDCbJq19e73JZQubqFtgETohwgAt8u5P6w==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.3", - "array.prototype.flatmap": "^1.2.4", - "doctrine": "^2.1.0", - "estraverse": "^5.2.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.0.4", - "object.entries": "^1.1.4", - "object.fromentries": "^2.0.4", - "object.hasown": "^1.0.0", - "object.values": "^1.1.4", - "prop-types": "^15.7.2", - "resolve": "^2.0.0-next.3", - "string.prototype.matchall": "^4.0.5" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "dependencies": { - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -4668,30 +3941,6 @@ "node": ">=4" } }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", @@ -4786,12 +4035,6 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -4849,18 +4092,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4904,26 +4135,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -5030,12 +4241,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -5064,16 +4269,20 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5087,18 +4296,6 @@ "node": ">=8.0.0" } }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -5112,13 +4309,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -5233,12 +4431,13 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -5326,15 +4525,6 @@ "node": ">=6" } }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -5354,21 +4544,21 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -5390,12 +4580,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -5405,9 +4595,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "dependencies": { "function-bind": "^1.1.2" @@ -5654,12 +4844,12 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -5700,14 +4890,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5771,6 +4963,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -5841,9 +5048,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -5944,12 +5151,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6010,12 +5220,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -6810,12 +6020,6 @@ "node": ">=4" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -6834,12 +6038,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -6895,30 +6093,6 @@ "node": "*" } }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -6946,19 +6120,6 @@ "node": ">=6" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -7101,12 +6262,6 @@ "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", "dev": true }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -7125,18 +6280,6 @@ "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", "dev": true }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -10151,20 +9294,14 @@ "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10179,13 +9316,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -10196,67 +9333,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -10281,23 +9357,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/p-each-series": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz", @@ -10660,130 +9719,51 @@ } }, "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", - "dev": true, - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { - "p-limit": "^1.1.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/pkg-up/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", "dev": true, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" } }, "node_modules/prettier": { @@ -10838,15 +9818,6 @@ "resolved": "src/js/production-changelog", "link": true }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", @@ -10860,23 +9831,6 @@ "node": ">= 6" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -11140,14 +10094,15 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -11156,18 +10111,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/registry-auth-token": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", @@ -11312,13 +10255,13 @@ } }, "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -11342,15 +10285,18 @@ "dev": true }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -15314,29 +14260,32 @@ "dev": true }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -15364,14 +14313,18 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15495,335 +14448,123 @@ "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spawn-error-forwarder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", - "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "dev": true - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/split2/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/standard": { - "version": "16.0.4", - "resolved": "https://registry.npmjs.org/standard/-/standard-16.0.4.tgz", - "integrity": "sha512-2AGI874RNClW4xUdM+bg1LRXVlYLzTNEkHmTG5mhyn45OhbgwA+6znowkOGYy+WMb5HRyELvtNy39kcdMQMcYQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "eslint": "~7.18.0", - "eslint-config-standard": "16.0.3", - "eslint-config-standard-jsx": "10.0.0", - "eslint-plugin-import": "~2.24.2", - "eslint-plugin-node": "~11.1.0", - "eslint-plugin-promise": "~5.1.0", - "eslint-plugin-react": "~7.25.1", - "standard-engine": "^14.0.1" - }, - "bin": { - "standard": "bin/cmd.js" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/standard-engine": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-14.0.1.tgz", - "integrity": "sha512-7FEzDwmHDOGva7r9ifOzD3BGdTbA7ujJ50afLVdW/tK14zQEptJjbFuUfn50irqdHDcTbNh0DTIoMPynMCXb0Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "get-stdin": "^8.0.0", - "minimist": "^1.2.5", - "pkg-conf": "^3.1.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8.10" - } - }, - "node_modules/standard-engine/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/standard-engine/node_modules/load-json-file": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", - "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "dependencies": { - "graceful-fs": "^4.1.15", - "parse-json": "^4.0.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0", - "type-fest": "^0.3.0" - }, - "engines": { - "node": ">=6" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/standard-engine/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "node_modules/spawn-error-forwarder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz", + "integrity": "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/standard-engine/node_modules/p-limit": { + "node_modules/spdx-exceptions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/standard-engine/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/spdx-license-ids": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", + "dev": true + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "dev": true, "dependencies": { - "p-limit": "^2.0.0" + "through": "2" }, "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/standard-engine/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" + "readable-stream": "^3.0.0" } }, - "node_modules/standard-engine/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "node_modules/split2/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/standard-engine/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true }, - "node_modules/standard-engine/node_modules/pkg-conf": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", - "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "dependencies": { - "find-up": "^3.0.0", - "load-json-file": "^5.2.0" + "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/standard-engine/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/standard-engine/node_modules/type-fest": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", - "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/stream-combiner2": { @@ -15872,35 +14613,16 @@ "node": ">=8" } }, - "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -15910,28 +14632,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16034,44 +14759,6 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -16151,12 +14838,6 @@ "node": ">=0.10" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -16319,51 +15000,6 @@ "node": ">=0.4.0" } }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -16386,29 +15022,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -16418,16 +15055,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -16437,14 +15075,20 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16595,12 +15239,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "node_modules/v8-compile-cache": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", - "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -16669,9 +15307,9 @@ } }, "node_modules/web-streams-polyfill": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", - "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", "dev": true, "engines": { "node": ">= 8" @@ -16752,16 +15390,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -16833,15 +15471,6 @@ } } }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", @@ -16951,7 +15580,18 @@ }, "src/sdks/core": { "name": "@firebolt-js/sdk", - "version": "1.1.1-next.1", + "version": "1.2.0-next.5", + "license": "Apache-2.0", + "devDependencies": { + "jest": "^28.1.0", + "jest-environment-jsdom": "^28.1.3", + "prettier": "^3.1.0", + "typescript": "^4.6.4" + } + }, + "src/sdks/discovery": { + "name": "@firebolt-js/discovery-sdk", + "version": "1.2.0-next.5", "license": "Apache-2.0", "devDependencies": { "jest": "^28.1.0", @@ -16962,7 +15602,7 @@ }, "src/sdks/manage": { "name": "@firebolt-js/manage-sdk", - "version": "1.1.1-next.1", + "version": "1.2.0-next.5", "license": "Apache-2.0", "devDependencies": { "jest": "^28.1.0", diff --git a/package.json b/package.json index 506674342..4ebbde724 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@firebolt-js/sdks", - "version": "1.2.0-next.2", + "version": "1.2.0-next.5", "description": "The Firebolt JS SDK", "type": "module", "bin": { @@ -8,16 +8,18 @@ }, "workspaces": [ "src/sdks/core", - "src/sdks/manage" + "src/sdks/manage", + "src/sdks/discovery" ], "scripts": { "fs:setup": "npm run clean && mkdir -p dist", - "validate:each": "npx firebolt-openrpc validate --input src/openrpc --schemas node_modules/@firebolt-js/schemas/src/schemas --schemas src/schemas --transformations", + "validate:each": "npx firebolt-openrpc validate --input src/openrpc --schemas src/schemas --transformations", "validate:compiled": "npx firebolt-openrpc validate --input dist/firebolt-open-rpc.json && npm run validate --workspaces", "validate": "npm run validate:each && npm run validate:compiled ", - "compile": "npx firebolt-openrpc openrpc --input src --template src/template/openrpc/template.json --output ./dist/firebolt-open-rpc.json --schemas node_modules/@firebolt-js/schemas/src/schemas --schemas src/schemas", + "compile": "npx firebolt-openrpc openrpc --input src --template src/template/openrpc/template.json --server ./dist/firebolt-open-rpc.json --schemas src/schemas", + "update": "npx firebolt-openrpc update --input src --schemas src/schemas", "slice": "npm run slice --workspaces", - "sdks": "npm run sdk --workspaces", + "sdk": "npm run sdk --workspaces", "docs": "npm run docs --workspaces", "wiki": "npm run wiki --workspaces", "test:setup": "npm run test:setup --workspaces", @@ -44,8 +46,7 @@ "devDependencies": { "@commitlint/cli": "^17.0.3", "@commitlint/config-conventional": "^17.0.3", - "@firebolt-js/openrpc": "3.0.0-next.1", - "@firebolt-js/schemas": "2.0.0", + "@firebolt-js/openrpc": "rdkcentral/firebolt-openrpc#major/rpc", "@saithodev/semantic-release-backmerge": "^3.2.0", "@semantic-release/changelog": "^6.0.1", "@semantic-release/git": "^10.0.1", diff --git a/requirements/images/specifications/general/capabilities/image1.png b/requirements/images/specifications/general/capabilities/image1.png new file mode 100644 index 000000000..049fc70bf Binary files /dev/null and b/requirements/images/specifications/general/capabilities/image1.png differ diff --git a/requirements/images/specifications/general/capabilities/image2.png b/requirements/images/specifications/general/capabilities/image2.png new file mode 100644 index 000000000..7c0c10f7c Binary files /dev/null and b/requirements/images/specifications/general/capabilities/image2.png differ diff --git a/requirements/images/specifications/general/capabilities/image4.png b/requirements/images/specifications/general/capabilities/image4.png new file mode 100644 index 000000000..641c26847 Binary files /dev/null and b/requirements/images/specifications/general/capabilities/image4.png differ diff --git a/requirements/images/specifications/general/capabilities/user-grants/image1.png b/requirements/images/specifications/general/capabilities/user-grants/image1.png new file mode 100644 index 000000000..c836daebf Binary files /dev/null and b/requirements/images/specifications/general/capabilities/user-grants/image1.png differ diff --git a/requirements/images/specifications/general/capabilities/user-grants/image2.png b/requirements/images/specifications/general/capabilities/user-grants/image2.png new file mode 100644 index 000000000..bc0c978ea Binary files /dev/null and b/requirements/images/specifications/general/capabilities/user-grants/image2.png differ diff --git a/requirements/images/specifications/general/capabilities/user-grants/image3.png b/requirements/images/specifications/general/capabilities/user-grants/image3.png new file mode 100644 index 000000000..96d73b0ab Binary files /dev/null and b/requirements/images/specifications/general/capabilities/user-grants/image3.png differ diff --git a/requirements/images/specifications/general/capabilities/user-grants/image4.png b/requirements/images/specifications/general/capabilities/user-grants/image4.png new file mode 100644 index 000000000..0c9246bce Binary files /dev/null and b/requirements/images/specifications/general/capabilities/user-grants/image4.png differ diff --git a/requirements/images/specifications/general/capabilities/user-grants/image5.png b/requirements/images/specifications/general/capabilities/user-grants/image5.png new file mode 100644 index 000000000..26c583d2d Binary files /dev/null and b/requirements/images/specifications/general/capabilities/user-grants/image5.png differ diff --git a/requirements/images/specifications/general/capabilities/user-grants/image6.png b/requirements/images/specifications/general/capabilities/user-grants/image6.png new file mode 100644 index 000000000..4761e5ea4 Binary files /dev/null and b/requirements/images/specifications/general/capabilities/user-grants/image6.png differ diff --git a/requirements/images/specifications/general/capabilities/user-grants/image7.png b/requirements/images/specifications/general/capabilities/user-grants/image7.png new file mode 100644 index 000000000..0b09b1b76 Binary files /dev/null and b/requirements/images/specifications/general/capabilities/user-grants/image7.png differ diff --git a/requirements/images/specifications/intents/user-interest/media/image1.png b/requirements/images/specifications/intents/user-interest/media/image1.png new file mode 100644 index 000000000..b0171a9a4 Binary files /dev/null and b/requirements/images/specifications/intents/user-interest/media/image1.png differ diff --git a/requirements/images/specifications/intents/user-interest/media/image2.png b/requirements/images/specifications/intents/user-interest/media/image2.png new file mode 100644 index 000000000..94102a60f Binary files /dev/null and b/requirements/images/specifications/intents/user-interest/media/image2.png differ diff --git a/requirements/images/specifications/intents/user-interest/media/image3.png b/requirements/images/specifications/intents/user-interest/media/image3.png new file mode 100644 index 000000000..c7ddb6405 Binary files /dev/null and b/requirements/images/specifications/intents/user-interest/media/image3.png differ diff --git a/requirements/images/specifications/intents/user-interest/media/image4.png b/requirements/images/specifications/intents/user-interest/media/image4.png new file mode 100644 index 000000000..6a15fe0c6 Binary files /dev/null and b/requirements/images/specifications/intents/user-interest/media/image4.png differ diff --git a/requirements/specifications/discovery/user-interest.md b/requirements/specifications/discovery/user-interest.md new file mode 100644 index 000000000..f53e239ba --- /dev/null +++ b/requirements/specifications/discovery/user-interest.md @@ -0,0 +1,361 @@ +# User Interest + +Document Status: Candidate Specification + +See [Firebolt Requirements Governance](../../governance.md) 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.md#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/specifications/general/capabilities/capabilities.md b/requirements/specifications/general/capabilities/capabilities.md new file mode 100644 index 000000000..30430ec06 --- /dev/null +++ b/requirements/specifications/general/capabilities/capabilities.md @@ -0,0 +1,660 @@ +# Capabilities + +Document Status: Candidate Specification + +See [Firebolt Requirements Governance](../../../governance.md) 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.md), 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.md). + +## 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/specifications/general/capabilities/user-grants.md b/requirements/specifications/general/capabilities/user-grants.md new file mode 100644 index 000000000..f87342a5c --- /dev/null +++ b/requirements/specifications/general/capabilities/user-grants.md @@ -0,0 +1,593 @@ +# User Grants + +Document status: Candidate Specification + +See [Firebolt Requirements Governance](../../../governance.md) 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.md) 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.md). +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.md). + +### 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/specifications/general/context-parameters.md b/requirements/specifications/general/context-parameters.md new file mode 100644 index 000000000..761a03fd7 --- /dev/null +++ b/requirements/specifications/general/context-parameters.md @@ -0,0 +1,303 @@ +# Context Parameters +Document Status: Working Draft + +See [Firebolt Requirements Governance](../../governance.md) 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/specifications/general/rpc.md b/requirements/specifications/general/rpc.md new file mode 100644 index 000000000..a8bdf42db --- /dev/null +++ b/requirements/specifications/general/rpc.md @@ -0,0 +1,486 @@ +# Firebolt RPC Requirements + +Document Status: Working Draft + +See [Firebolt Requirements Governance](../../governance.md) for more info. + +| Contributor | Organization | +| --------------- | -------------- | +| Andrew Bennett | Sky | +| Bart Catrysse | Liberty | +| Piotr Kobzda | Liberty | +| Jeremy LaCivita | Comcast | +| Kevin Pearson | Comcast | + +## 1. Overview +This document outlines the requirements for remote procedure call (RPC) APIs surfaced by a Firebolt implementation to Firebolt Apps. + +This document does not cover the scope of the Firebolt SDK vs the App itself, and the term "Firebolt App" is meant to denote a fully built App, including the Firebolt SDK. + +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. Protocol](#3-protocol) + - [3.1. OpenRPC Documents](#31-openrpc-documents) + - [3.1.1. OpenRPC Ids](#311-openrpc-ids) + - [3.1.2. Duplex Linking](#312-duplex-linking) + - [3.2. Firebolt Modules](#32-firebolt-modules) + - [3.3. Asynchronous Events](#33-asynchronous-events) + - [3.3.1. Notifier OpenRPC Extension](#331-notifier-openrpc-extension) + - [3.4. Provider Interfaces](#34-provider-interfaces) + - [3.4.1. Interface OpenRPC Extension](#341-interface-openrpc-extension) + - [3.4.2. Client Provider Example](#342-client-provider-example) +- [4. Transport](#4-transport) + - [4.1. API Version](#41-api-version) + +## 3. Protocol +Firebolt implmentations **MUST** support RPC using the [JSON-RPC 2.0](https://www.jsonrpc.org/specification) protocol. + +The RPC interface of every Firebolt method **MUST** be defined via an [OpenRPC document](https://spec.open-rpc.org). + +RPC method definitions **SHOULD** use the [Firebolt OpenRPC](https://github.com/rdkcentral/firebolt-openrpc/) Extensions to enable language-specific design patterns to be applied to similar APIs. + +Firebolt implementations **MAY** support other RPC protocols in addition to JSON-RPC 2.0, as long as a compatible transport layer is provided so that apps do not have to be rewritten. + +Firebolt implementations **MUST** support all aspects of the JSON-RPC specification. + +Firebolt implementations **MUST** send only one response for each request. + +Firebolt implementations **MUST** treat all named OpenRPC fields, i.e. fields with a `"name"` attribute, as case-senstitive values, including, but not limited to methods and params. + +Firebolt implementations **MUST** return a `-32600` error (Invalid Request) if a method having no result definition is requested with an `id` value. + +### 3.1. OpenRPC Documents +Since both the App and the Firebolt Implementation expose APIs, there **MUST** be a separate OpenRPC definition for each. + +The Firebolt Implementation OpenRPC Document: +``` +firebolt-open-rpc.json +``` + +The Firebolt App OpenRPC Document: + +``` +firebolt-app-open-rpc.json +``` + +#### 3.1.1. OpenRPC Ids +The Firebolt Implementation OpenRPC Document **MUST** have the `$id` set to: + +``` +"$schema": "https://meta.open-rpc.org/", +"$id": "https://rdkcentral.github.io/firebolt/openrpc/platform" +``` + +An HTTP `GET` on `https://rdkcentral.github.io/firebolt/openrpc/platform` **MUST** return the latest production version of the Firebolt Implementation Open RPC Definition. + +The Firebolt App OpenRpc Document **MUST** have the `$id` set to: + +``` +"$schema": "https://meta.open-rpc.org/", +"$id": "https://rdkcentral.github.io/firebolt/openrpc/app" +``` + +An HTTP `GET` on `https://rdkcentral.github.io/firebolt/openrpc/app` **MUST** return the latest production version of the Firebolt App Open RPC Definition. + +#### 3.1.2. Duplex Linking +Since a platform OpenRPC definition has a corresponding application defintion, it **MUST** be denoted by an OpenRPC `x-client-api` extension property in the `info` section. + +Similarly, the application OpenRPC definition **MUST** reference the platform definition in the `x-client-api` property. + +Firebolt Platform OpenRPC: + +```json +{ + "$id": "https://rdkcentral.github.io/firebolt/openrpc/platform", + "info": { + "title": "Firebolt", + "x-client-api": "https://rdkcentral.github.io/firebolt/openrpc/app" + } +} +``` + +Firebolt Application OpenRPC: + +```json +{ + "$id": "https://rdkcentral.github.io/firebolt/openrpc/app", + "info": { + "title": "Firebolt App", + "x-client-api": "https://rdkcentral.github.io/firebolt/openrpc/platform" + } +} +``` + +### 3.2. Firebolt Modules +In order to support groups of methods, i.e. "interfaces," Firebolt uses dot-notation in the method name, so a method named `Module.foo` would create a `foo()` method inside of a module called `Module`. + +For standard JSON-RPC interactions, the module name is simply part of the method name. + +Some Firebolt-specific OpenRPC extensions use the module name to refer to an entire group of methods within the module. + +Firebolt OpenRPC allows zero or more module names, e.g. `foo` and `Module.foo`, and `Module.Submodule.foo` are all valid method names. + +### 3.3. Asynchronous Events +Asynchronous events, aka "notifications," **MUST** be handled by leveraging the common "duplex" pattern where both the Firebolt App & the Firebolt Implementation act as a JSON-RPC Server *and* a JSON-RPC client. + +To register for an event, e.g "sunrise", the Firebolt App would call an RPC method on the Firebolt Implementation called `Sky.onSunrise` with the `listen` parameter set to `true`: + +App -> Firebolt + +```json +{ + "id": 1, + "method": "Sky.onSunrise", + "params": { + "listen": true + } +} +``` + +This `onSunrise` call **MUST** only have one response: either an empty success result, or an error describing why the event registration was not successful. + +2.0 success + +```json +{ + "id": 1, + "result": null +} +``` + +2.0 failure + +```json +{ + "id": 1, + "error": { + "code": 111, + "message": "failed" + } +} +``` + +If a Firebolt App has registered for an event, e.g. "sunrise," then the Firebolt Implementation **SHOULD** send any occurences of the "sunrise" event to the app via a JSON-RPC notification request: + +Firebolt -> App + +```json +{ + "method": "Sky.sunrise", + "params": {} +} +``` + +If a Firebolt App registers (or unregisters) for an event, e.g. "sunrise," more than once, then the Firebolt Implementation **SHOULD** treat the request as a success if the initial request was successful. The Firebolt Implementation **MUST** send only one notification to the app per occurences of the "sunrise" event regardless of how many times it registered. + +A single unregistration for an event **MUST** result in the notifications for that event being turned off for that app, regardless of how many times the app had registered. + +#### 3.3.1. Notifier OpenRPC Extension +The Platform event registration API **MUST** have an `x-notifier` extension property on the `event` tag with the full name of the Application RPC notification method: + +```json +{ + "info": { + "title": "Firebolt Platform" + }, + "methods": [ + { + "name": "Sky.onSunrise", + "tags": [ + { + "name": "event", + "x-notifier": "Sky.sunrise" + } + ], + "params": [ + { + "name": "listen", + "required": true, + "schema": { + "type": "boolean" + } + } + ] + } + ] +} +``` + +The Application OpenRPC definition for the notification **MUST** have an `x-event` extension property on the `notifier` tag with the full name of the Platform RPC registeration method, e.g.: + +```json +{ + "info": { + "title": "Firebolt Application" + }, + "methods": [ + { + "name": "Sky.sunrise", + "tags": [ + { + "name": "notifier", + "x-event": "Sky.onSunrise" + } + ], + "params": [ + ] + } + ] +} +``` + +The notifer method **MUST** have no `"result"` defined, since no response is expected or allowed. + +If an OpenRPC method tagged as a "notifier" does not have a `x-event` attribute on the tag, then the value **MUST** be generated by the Firebolt OpenRPC tooling to match the pattern: `.on`, e.g. a method named `Sky.sunrise` would have the `x-event` value set to `Sky.onSunrise`. + +If an OpenRPC method in the Application tagged as "notifier" does not have a method matching the `x-event` extension in the Platform OpenRPC, then a method **MUST** be generated by the Firebolt OpenRPC tooling that with a matching `x-notifier` property on the "event" tag and a matching name. + +### 3.4. Provider Interfaces +Provider Interfaces allow a Firebolt App to "provide" a Firebolt Capability back to the Firebolt Implementation, in the form of an interface dictated by Firebolt and implemented by the app. + +Provider Interfaces **MUST** be handled by leveraging the common "duplex" pattern where both the Firebolt App & the Firebolt Implementation act as a JSON-RPC Server *and* a JSON-RPC client. + +For this example, the `"xrn:firebolt:capability:sky:sun"` interface consists of (Written in TypeScript for brevity): + +```typescript +interface Sun { + function rise(): Promise; + function set(): Promise; +} +``` + +To register as a provider for a capability, e.g. `"xrn:firebolt:capability:sky:sun"`, the Firebolt App would call an RPC method on the Firebolt Implementation to enable the interface to be called on the application by the platform. + +To register for this Provider Interface, the Firebolt App would call the RPC method, e.g.: + +```json +{ + "id": 1, + "method": "Sky.provideSun", + "params": { + "enabled": true + } +} +``` + +If a Firebolt App has registered as a capability provider, e.g. "xrn:firebolt:capability:sky:sun", then the Firebolt Implementation **SHOULD** call the appropriate methods via the app's JSON-RPC server as neeeded, e.g.: + +```json +{ + "id": 1, + "method": "Sun.rise", + "params": [] +} +``` + +The app **MUST** respond either either a result or an error. + +#### 3.4.1. Interface OpenRPC Extension +The Platform provider registration API **MUST** have a `registration` tag and an `x-interface` string parameter denoting the name of the interface from the Application OpenRPC that this registration API is enabling. + +```json +{ + "info": { + "title": "Firebolt Platform" + }, + "methods": [ + { + "name": "Sky.provideSun", + "tags": [ + { + "name": "registration", + "x-interface": "Sun" + } + ], + "params": [ + { + "name": "enabled", + "required": true, + "schema": { + "type": "boolean" + } + } + ] + } + ] +} +``` + +The Application OpenRPC definition for the interface **MUST** have one or more methods with the provided `x-interface` value as the module name, e.g.: + +```json +{ + "info": { + "title": "Firebolt Application" + }, + "methods": [ + { + "name": "Sun.rise", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:sky:sun", + "x-allow-focus": true + } + ], + "params": [], + }, + { + "name": "Sun.set", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:sky:sun", + "x-allow-focus": true + } + ], + "params": [] + } + ] +} +``` + +#### 3.4.2. Client Provider Example +Using the [Lifecycle](../lifecycle/index.md) `Application` and `Activatable` interfaces as an example: + +```typescript +import { Lifecycle } from '@firebolt-js/sdk' + +class myApp implements Lifecycle.IApplication { + async function create(params: CreateParameters) {} + async function suspend() {} + async function resume() {} + async function destroy() {} +} + +const app = new myApp() + +await Lifecycle.provideApplication(app) +``` + +The Firebolt Implementation OpenRPC would include: + +```json +{ + "info": { + "title": "Firebolt Platform" + }, + "methods": [ + { + "name": "Lifecycle.provideApplication", + "tags": [ + { + "name": "registration", + "x-interface": "Application" + } + ], + "params": [ + { + "name": "enabled", + "required": true, + "schema": { + "type": "boolean" + } + } + ] + } + ] +} +``` + +The Firebolt App OpenRPC would include: + +```json +{ + "info": { + "title": "Firebolt App" + }, + "methods": [ + { + "name": "Application.create", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:lifecycle:application" + } + ], + "params": [ + { + "name": "params", + "schema": { + "$ref": "#/components/schemas/CreateParameters" + } + } + ], + "result": { + "name": "default", + "schema": { + "type": "null" + } + } + }, + { + "name": "Application.suspend", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:lifecycle:application" + } + ], + "params": [], + "result": { + "name": "default", + "schema": { + "type": "null" + } + } + }, + { + "name": "Application.resume", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:lifecycle:application" + } + ], + "params": [], + "result": { + "name": "default", + "schema": { + "type": "null" + } + } + }, + { + "name": "Application.destroy", + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:lifecycle:application" + } + ], + "params": [], + "result": { + "name": "default", + "schema": { + "type": "null" + } + } + } + ] +} +``` + +## 4. Transport +The RPC Protocol **MUST** be handled over a WebSocket. + +### 4.1. API Version +The Firebolt API Version *and* protocol **MUST** be passsed as part of the Sec-WebSocket-Protocol header: + +```http +Sec-WebSocket-Protocol: firebolt.v2.0.0, jsonrpc +``` + \ No newline at end of file diff --git a/requirements/specifications/intents/command-and-control.md b/requirements/specifications/intents/command-and-control.md new file mode 100644 index 000000000..db799cde9 --- /dev/null +++ b/requirements/specifications/intents/command-and-control.md @@ -0,0 +1,984 @@ +# Command and Control Intents + +Document Status: Proposed Specification + +See [Firebolt Requirements Governance](../../governance.md) 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.md). + +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/specifications/intents/index.md b/requirements/specifications/intents/index.md index 6925376e4..72d6138c8 100644 --- a/requirements/specifications/intents/index.md +++ b/requirements/specifications/intents/index.md @@ -7,6 +7,8 @@ See [Firebolt Requirements Governance](../../governance.md) 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 @@ -27,18 +29,23 @@ additional `data` property. - [3. Intent Action](#3-intent-action) - [4. Intent Context](#4-intent-context) - [5. Intent Data](#5-intent-data) -- [Intent Types](#intent-types) +- [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 a `string` attribute denoting the type of intent. +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. +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 @@ -56,7 +63,56 @@ 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. -## Intent Types +## 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.md) - [Tune](./tune.md) diff --git a/requirements/specifications/intents/user-interest.md b/requirements/specifications/intents/user-interest.md new file mode 100644 index 000000000..eae60ecf7 --- /dev/null +++ b/requirements/specifications/intents/user-interest.md @@ -0,0 +1,15 @@ +# User Interest + +Document Status: Candidate Specification + +See [Firebolt Requirements Governance](../../governance.md) 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.md) flow from an upstream system, e.g. a voice assistant. diff --git a/requirements/specifications/localization/language.md b/requirements/specifications/localization/language.md new file mode 100644 index 000000000..0b3df80ef --- /dev/null +++ b/requirements/specifications/localization/language.md @@ -0,0 +1,99 @@ +# Language Settings + +Document Status: Candidate Specification + +See [Firebolt Requirements Governance](../../governance.md) 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/specifications/openrpc-extensions/app-passthrough-apis.md b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md new file mode 100644 index 000000000..a804e5b4d --- /dev/null +++ b/requirements/specifications/openrpc-extensions/app-passthrough-apis.md @@ -0,0 +1,463 @@ +# App Pass-through APIs + +Document Status: Working Draft + +See [Firebolt Requirements Governance](../../governance.md) 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 +- [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.rdkcentral.com/firebolt/schemas/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.rdkcentral.com/firebolt/schemas/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.rdkcentral.com/firebolt/schemas/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.rdkcentral.com/firebolt/schemas/entity#/definitions/EntityDetails" + } + } + + } + } + } + ] +} +``` diff --git a/src/openrpc/_internal.json b/src/openrpc/_internal.json index 7f04a6dc1..f172cb5c4 100644 --- a/src/openrpc/_internal.json +++ b/src/openrpc/_internal.json @@ -1,82 +1,83 @@ { - "openrpc": "1.2.4", - "info": { - "title": "Internal", - "description": "Internal methods for SDK / FEE integration", - "version": "0.0.0" - }, - "methods": [ - { - "name": "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": "https://meta.comcast.com/firebolt/types#/definitions/SemanticVersion" - }, - "summary": "The semantic version of the SDK." - } - ], - "result": { - "name": "session", - "summary": "Info about the SDK/FEE session", - "schema": { - "type": "object", - "required": ["version"], - "properties": { - "version": { - "$ref": "https://meta.comcast.com/firebolt/types#/definitions/SemanticVersion", - "description": "The semantic version of the FEE." - } - }, - "additionalProperties": false - } - }, - "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" - } - } - } - } - ] - } - ], - "components": { - "schemas": { - } - } + "openrpc": "1.2.4", + "info": { + "title": "Internal", + "description": "Internal methods for SDK / FEE integration", + "version": "0.0.0" + }, + "methods": [ + { + "name": "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": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/SemanticVersion" + }, + "summary": "The semantic version of the SDK." + } + ], + "result": { + "name": "session", + "summary": "Info about the SDK/FEE session", + "schema": { + "type": "object", + "required": [ + "version" + ], + "properties": { + "version": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/SemanticVersion", + "description": "The semantic version of the FEE." + } + }, + "additionalProperties": false + } + }, + "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" + } + } + } + } + ] + } + ], + "components": { + "schemas": {} + } } \ No newline at end of file diff --git a/src/openrpc/accessibility.json b/src/openrpc/accessibility.json index c010a6146..1d758792d 100644 --- a/src/openrpc/accessibility.json +++ b/src/openrpc/accessibility.json @@ -1,242 +1,244 @@ { - "openrpc": "1.2.4", - "info": { - "title": "Accessibility", - "version": "0.0.0", - "description": "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." - }, - "methods": [ - { - "name": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/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": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/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": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/VoiceGuidanceSettings" - } - }, - "examples": [ - { - "name": "Getting the voice guidance settings", - "params": [], - "result": { - "name": "Default Result", - "value": { - "enabled": true, - "speed": 2 - } - } - } - ] - }, - { - "name": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/VoiceGuidanceSettings" - } - }, - "examples": [ - { - "name": "Getting the voice guidance settings", - "params": [], - "result": { - "name": "Default Result", - "value": { - "enabled": true, - "speed": 2 - } - } - } - ] - }, - { - "name": "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 - } - } - } - ] - } - ], - "components": { - "schemas": { - "AudioDescriptionSettings": { - "title": "AudioDescriptionSettings", - "type": "object", - "required": ["enabled"], - "properties": { - "enabled": { - "type": "boolean", - "description": "Whether or not audio descriptions should be enabled by default" - } - } - } - } - } + "openrpc": "1.2.4", + "info": { + "title": "Accessibility", + "version": "0.0.0", + "description": "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." + }, + "methods": [ + { + "name": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/VoiceGuidanceSettings" + } + }, + "examples": [ + { + "name": "Getting the voice guidance settings", + "params": [], + "result": { + "name": "Default Result", + "value": { + "enabled": true, + "speed": 2 + } + } + } + ] + }, + { + "name": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/VoiceGuidanceSettings" + } + }, + "examples": [ + { + "name": "Getting the voice guidance settings", + "params": [], + "result": { + "name": "Default Result", + "value": { + "enabled": true, + "speed": 2 + } + } + } + ] + }, + { + "name": "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 + } + } + } + ] + } + ], + "components": { + "schemas": { + "AudioDescriptionSettings": { + "title": "AudioDescriptionSettings", + "type": "object", + "required": [ + "enabled" + ], + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether or not audio descriptions should be enabled by default" + } + } + } + } + } } \ No newline at end of file diff --git a/src/openrpc/account.json b/src/openrpc/account.json index b4a5b81f2..be5f57c70 100644 --- a/src/openrpc/account.json +++ b/src/openrpc/account.json @@ -1,142 +1,142 @@ { - "openrpc": "1.2.4", - "info": { - "title": "Account", - "description": "A module for querying about the device account.", - "version": "0.0.0" - }, - "methods": [ - { - "name": "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": "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": "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 - } - } - ] - } - ], - "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 - } - } - } + "openrpc": "1.2.4", + "info": { + "title": "Account", + "description": "A module for querying about the device account.", + "version": "0.0.0" + }, + "methods": [ + { + "name": "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": "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": "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 + } + } + ] + } + ], + "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 + } + } + } } \ No newline at end of file diff --git a/src/openrpc/acknowledge_challenge.json b/src/openrpc/acknowledge_challenge.json index a51d60c2c..d7417cea1 100644 --- a/src/openrpc/acknowledge_challenge.json +++ b/src/openrpc/acknowledge_challenge.json @@ -1,145 +1,151 @@ { - "openrpc": "1.2.4", - "info": { - "title": "AcknowledgeChallenge", - "description": "A module for registering as a provider for a user grant in which the user confirms access to a capability", - "version": "0.0.0" - }, - "methods": [ - { - "name": "onRequestChallenge", - "summary": "Registers as a provider for when the user should be challenged in order to confirm access to a capability", - "params": [], - "tags": [ - { - "name": "event", - "x-response": { - "$ref": "#/components/schemas/GrantResult" - } - }, - { - "name": "capabilities", - "x-provides": "xrn:firebolt:capability:usergrant:acknowledgechallenge", - "x-allow-focus": true - } - ], - "result": { - "name": "challenge", - "summary": "The request to challenge the user", - "schema": { - "$ref": "#/components/schemas/ChallengeProviderRequest" - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "Default Result", - "value": { - "correlationId": "abc", - "parameters": { - "capability": "xrn:firebolt:capability:localization::postal-code", - "requestor": { - "id": "ReferenceApp", - "name": "Firebolt Reference App" - } - } - } - } - } - ] - } - ], - "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" - } - } - }, - "ChallengeProviderRequest": { - "title": "ChallengeProviderRequest", - "allOf": [ - { - "$ref": "https://meta.comcast.com/firebolt/types#/definitions/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 - } - ] - } - } - } + "openrpc": "1.2.4", + "info": { + "title": "AcknowledgeChallenge", + "description": "A module for registering as a provider for a user grant in which the user confirms access to a capability", + "version": "0.0.0" + }, + "methods": [ + { + "name": "challenge", + "summary": "Registers as a provider for when the user should be challenged in order to confirm access to a capability", + "params": [ + { + "name": "capability", + "required": true, + "schema": { + "type": "string", + "description": "The capability that is being requested by the user to approve" + } + }, + { + "name": "requestor", + "required": true, + "schema": { + "description": "The identity of which app is requesting access to this capability", + "$ref": "#/components/schemas/ChallengeRequestor" + } + } + ], + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:acknowledgechallenge", + "x-allow-focus": true + } + ], + "result": { + "name": "result", + "schema": { + "$ref": "#/components/schemas/GrantResult" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:localization::postal-code" + }, + { + "name": "requestor", + "value": { + "id": "ReferenceApp", + "name": "Firebolt Reference App" + } + } + ], + "result": { + "name": "result", + "value": { + "granted": true + } + } + } + ] + } + ], + "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": {} + }, + "ChallengeProviderRequest": { + "title": "ChallengeProviderRequest", + "allOf": [ + { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/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 + } + ] + } + } + } } \ No newline at end of file diff --git a/src/openrpc/advertising.json b/src/openrpc/advertising.json index 22a86b312..4875c37ef 100644 --- a/src/openrpc/advertising.json +++ b/src/openrpc/advertising.json @@ -1,410 +1,410 @@ { - "openrpc": "1.2.4", - "info": { - "title": "Advertising", - "version": "0.0.0", - "description": "A module for platform provided advertising settings and functionality." - }, - "methods": [ - { - "name": "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": "policy", - "summary": "Get the advertising privacy and playback policy", - "params": [], - "tags": [ - { - "name": "property:readonly" - }, - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:privacy:advertising", - "xrn:firebolt:capability:advertising:configuration" - ] - } - ], - "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": "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": "https://meta.comcast.com/firebolt/advertising#/definitions/SkipRestriction" - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "result", - "value": "none" - } - }, - { - "name": "Additional Example", - "params": [], - "result": { - "name": "result", - "value": "all" - } - } - ] - }, - { - "name": "advertisingId", - "tags": [ - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:advertising:identifier" - ] - } - ], - "summary": "Get the advertising ID", - "params": [ - { - "name": "options", - "summary": "AdvertisingId options", - "required": false, - "schema": { - "$ref": "#/components/schemas/AdvertisingIdOptions" - } - } - ], - "result": { - "name": "advertisingId", - "summary": "the advertising ID", - "schema": { - "type": "object", - "properties": { - "ifa": { - "type": "string" - }, - "ifa_type": { - "type": "string" - }, - "lmt": { - "type": "string" - } - }, - "required": [ - "ifa" - ] - } - }, - "examples": [ - { - "name": "Getting the advertising ID", - "params": [], - "result": { - "name": "Default Result", - "value": { - "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", - "ifa_type": "idfa", - "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": "idfa", - "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": "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": "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": "operator.app" - } - } - ] - }, - { - "name": "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 - } - } - ] - } - ], - "components": { - "schemas": { - "AdPolicy": { - "title": "AdPolicy", - "description": "Describes various ad playback enforcement rules that the app should follow.", - "type": "object", - "properties": { - "skipRestriction": { - "$ref": "https://meta.comcast.com/firebolt/advertising#/definitions/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" - } - } - } - } - } - } - } + "openrpc": "1.2.4", + "info": { + "title": "Advertising", + "version": "0.0.0", + "description": "A module for platform provided advertising settings and functionality." + }, + "methods": [ + { + "name": "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": "policy", + "summary": "Get the advertising privacy and playback policy", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:privacy:advertising", + "xrn:firebolt:capability:advertising:configuration" + ] + } + ], + "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": "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": "https://meta.rdkcentral.com/firebolt/schemas/advertising#/definitions/SkipRestriction" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "result", + "value": "none" + } + }, + { + "name": "Additional Example", + "params": [], + "result": { + "name": "result", + "value": "all" + } + } + ] + }, + { + "name": "advertisingId", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:advertising:identifier" + ] + } + ], + "summary": "Get the advertising ID", + "params": [ + { + "name": "options", + "summary": "AdvertisingId options", + "required": false, + "schema": { + "$ref": "#/components/schemas/AdvertisingIdOptions" + } + } + ], + "result": { + "name": "advertisingId", + "summary": "the advertising ID", + "schema": { + "type": "object", + "properties": { + "ifa": { + "type": "string" + }, + "ifa_type": { + "type": "string" + }, + "lmt": { + "type": "string" + } + }, + "required": [ + "ifa" + ] + } + }, + "examples": [ + { + "name": "Getting the advertising ID", + "params": [], + "result": { + "name": "Default Result", + "value": { + "ifa": "01234567-89AB-CDEF-GH01-23456789ABCD", + "ifa_type": "idfa", + "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": "idfa", + "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": "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": "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": "operator.app" + } + } + ] + }, + { + "name": "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 + } + } + ] + } + ], + "components": { + "schemas": { + "AdPolicy": { + "title": "AdPolicy", + "description": "Describes various ad playback enforcement rules that the app should follow.", + "type": "object", + "properties": { + "skipRestriction": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/advertising#/definitions/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" + } + } + } + } + } + } + } } \ No newline at end of file diff --git a/src/openrpc/audio_descriptions.json b/src/openrpc/audio_descriptions.json index fb909285e..58803be17 100644 --- a/src/openrpc/audio_descriptions.json +++ b/src/openrpc/audio_descriptions.json @@ -1,57 +1,53 @@ { - "openrpc": "1.2.4", - "info": { - "title": "AudioDescriptions", - "description": "A module for managing audio-description Settings.", - "version": "0.0.0" - }, - "methods": [ - { - "name": "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 - } - } - ] - } - ], - "components": { - "schemas": { - } - } + "openrpc": "1.2.4", + "info": { + "title": "AudioDescriptions", + "description": "A module for managing audio-description Settings.", + "version": "0.0.0" + }, + "methods": [ + { + "name": "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 + } + } + ] + } + ], + "components": { + "schemas": {} + } } \ No newline at end of file diff --git a/src/openrpc/authentication.json b/src/openrpc/authentication.json index 18a633183..1e29e3205 100644 --- a/src/openrpc/authentication.json +++ b/src/openrpc/authentication.json @@ -1,239 +1,233 @@ { - "openrpc": "1.2.4", - "info": { - "title": "Authentication", - "description": "A module for acquiring authentication tokens.", - "version": "0.0.0" - }, - "methods": [ - { - "name": "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": { - "type": "object", - "properties": { - "value": { - "type": "string" - }, - "expires": { - "type": "string", - "format": "date-time" - }, - "type": { - "type": "string" - } - }, - "required": [ - "value" - ] - } - }, - "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": "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": "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": "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" - } - } - ] - } - ], - "components": { - "schemas": { - "TokenType": { - "title": "TokenType", - "type": "string", - "enum": [ - "platform", - "device", - "distributor" - ] - } - } - } -} + "openrpc": "1.2.4", + "info": { + "title": "Authentication", + "description": "A module for acquiring authentication tokens.", + "version": "0.0.0" + }, + "methods": [ + { + "name": "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": { + "type": "object", + "properties": { + "value": { + "type": "string" + }, + "expires": { + "type": "string", + "format": "date-time" + }, + "type": { + "type": "string" + } + }, + "required": [ + "value" + ] + } + }, + "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": "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": "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": "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" + } + } + ] + } + ], + "components": { + "schemas": { + "TokenType": { + "title": "TokenType", + "type": "string", + "enum": [ + "platform", + "device", + "distributor" + ] + } + } + } +} \ No newline at end of file diff --git a/src/openrpc/capabilities.json b/src/openrpc/capabilities.json index e2b35f8af..8cfce0f67 100644 --- a/src/openrpc/capabilities.json +++ b/src/openrpc/capabilities.json @@ -1,910 +1,914 @@ { - "openrpc": "1.2.4", - "info": { - "title": "Capabilities", - "description": "The Capabilities module provides information about which discreet unit of functionality is enabled for the apps.", - "version": "0.0.0" - }, - "methods": [ - { - "name": "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": "https://meta.comcast.com/firebolt/capabilities#/definitions/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": "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": "https://meta.comcast.com/firebolt/capabilities#/definitions/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": "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": "https://meta.comcast.com/firebolt/capabilities#/definitions/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": "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": "https://meta.comcast.com/firebolt/capabilities#/definitions/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": "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": "https://meta.comcast.com/firebolt/capabilities#/definitions/Capability" - }, - "minItems": 1 - } - } - ], - "result": { - "name": "info", - "summary": "Returns an array of CapabilityInfo objects for the passed in capabilities.", - "schema": { - "type": "array", - "items": { - "$ref": "https://meta.comcast.com/firebolt/capabilities#/definitions/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": "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": "https://meta.comcast.com/firebolt/capabilities#/definitions/Permission" - }, - "minItems": 1 - } - } - ], - "result": { - "name": "request", - "summary": "Returns an array of CapabilityInfo objects for the passed in capabilities.", - "schema": { - "type": "array", - "items": { - "$ref": "https://meta.comcast.com/firebolt/capabilities#/definitions/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": "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": "https://meta.comcast.com/firebolt/capabilities#/definitions/Capability" - } - } - ], - "result": { - "name": "value", - "summary": "Provides the capability info.", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/capabilities#/definitions/CapabilityInfo" - } - }, - "examples": [ - { - "name": "Platform token is available", - "params": [ - { - "name": "capability", - "value": "xrn:firebolt:capability:token:platform" - } - ], - "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": "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": "https://meta.comcast.com/firebolt/capabilities#/definitions/Capability" - } - } - ], - "result": { - "name": "value", - "summary": "Provides the capability info.", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/capabilities#/definitions/CapabilityInfo" - } - }, - "examples": [ - { - "name": "Platform token is unavailable.", - "params": [ - { - "name": "capability", - "value": "xrn:firebolt:capability:token:platform" - } - ], - "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": "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": "https://meta.comcast.com/firebolt/capabilities#/definitions/Role" - } - }, - { - "name": "capability", - "required": true, - "schema": { - "$ref": "https://meta.comcast.com/firebolt/capabilities#/definitions/Capability" - } - } - ], - "result": { - "name": "value", - "summary": "Provides the capability info.", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/capabilities#/definitions/CapabilityInfo" - } - }, - "examples": [ - { - "name": "Postal code granted", - "params": [ - { - "name": "role", - "value": "use" - }, - { - "name": "capability", - "value": "xrn:firebolt:capability:localization:postal-code" - } - ], - "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": "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": "https://meta.comcast.com/firebolt/capabilities#/definitions/Role" - } - }, - { - "name": "capability", - "required": true, - "schema": { - "$ref": "https://meta.comcast.com/firebolt/capabilities#/definitions/Capability" - } - } - ], - "result": { - "name": "value", - "summary": "Provides the capability info.", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/capabilities#/definitions/CapabilityInfo" - } - }, - "examples": [ - { - "name": "Postal code revoked", - "params": [ - { - "name": "role", - "value": "use" - }, - { - "name": "capability", - "value": "xrn:firebolt:capability:localization:postal-code" - } - ], - "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" - ] - } - } - } - ] - } - ], - "components": { - "schemas": { - "CapabilityOption": { - "title": "CapabilityOption", - "type": "object", - "properties": { - "role": { - "$ref": "https://meta.comcast.com/firebolt/capabilities#/definitions/Role", - "description": "Which role of the capability to check the state of, default will be 'use'", - "default": "use" - } - } - } - } - } -} + "openrpc": "1.2.4", + "info": { + "title": "Capabilities", + "description": "The Capabilities module provides information about which discreet unit of functionality is enabled for the apps.", + "version": "0.0.0" + }, + "methods": [ + { + "name": "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": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/Capability" + }, + "minItems": 1 + } + } + ], + "result": { + "name": "info", + "summary": "Returns an array of CapabilityInfo objects for the passed in capabilities.", + "schema": { + "type": "array", + "items": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/Permission" + }, + "minItems": 1 + } + } + ], + "result": { + "name": "request", + "summary": "Returns an array of CapabilityInfo objects for the passed in capabilities.", + "schema": { + "type": "array", + "items": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/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": "available", + "tags": [ + { + "name": "notifier", + "x-event": "Capabilities.onAvailable" + }, + { + "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": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/Capability" + } + }, + { + "name": "value", + "summary": "Provides the capability info.", + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/CapabilityInfo" + } + } + ], + "examples": [ + { + "name": "Platform token is available", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:token:platform" + }, + { + "name": "value", + "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": "unavailable", + "tags": [ + { + "name": "notifier", + "x-event": "Capabilities.onUnavailable" + }, + { + "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": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/Capability" + } + }, + { + "name": "value", + "summary": "Provides the capability info.", + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/CapabilityInfo" + } + } + ], + "examples": [ + { + "name": "Platform token is unavailable.", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:token:platform" + }, + { + "name": "value", + "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": "granted", + "tags": [ + { + "name": "notifier", + "x-event": "Capabilities.onGranted" + }, + { + "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": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/Role" + } + }, + { + "name": "capability", + "required": true, + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/Capability" + } + }, + { + "name": "value", + "summary": "Provides the capability info.", + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/CapabilityInfo" + } + } + ], + "examples": [ + { + "name": "Postal code granted", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "value", + "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": "revoked", + "tags": [ + { + "name": "notifier", + "x-event": "Capabilities.onRevoked" + }, + { + "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": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/Role" + } + }, + { + "name": "capability", + "required": true, + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/Capability" + } + }, + { + "name": "value", + "summary": "Provides the capability info.", + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/CapabilityInfo" + } + } + ], + "examples": [ + { + "name": "Postal code revoked", + "params": [ + { + "name": "role", + "value": "use" + }, + { + "name": "capability", + "value": "xrn:firebolt:capability:localization:postal-code" + }, + { + "name": "value", + "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" + ] + } + } + ] + } + ] + } + ], + "components": { + "schemas": { + "CapabilityOption": { + "title": "CapabilityOption", + "type": "object", + "properties": { + "role": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/Role", + "description": "Which role of the capability to check the state of, default will be 'use'", + "default": "use" + } + } + } + } + } +} \ No newline at end of file diff --git a/src/openrpc/closed_captions.json b/src/openrpc/closed_captions.json index 90fd21e90..445c56cd1 100644 --- a/src/openrpc/closed_captions.json +++ b/src/openrpc/closed_captions.json @@ -1,701 +1,701 @@ { - "openrpc": "1.2.4", - "info": { - "title": "ClosedCaptions", - "description": "A module for managing closed-captions Settings.", - "version": "0.0.0" - }, - "methods": [ - { - "name": "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": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/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": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/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": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/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": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/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": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/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": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/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": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/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": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/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": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/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": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/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": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/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": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/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": "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": "https://meta.comcast.com/firebolt/localization#/definitions/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" - ] - } - } - ] - } - ], - "components": { - "schemas": { - "ClosedCaptionsSettingsProviderRequest": { - "title": "ClosedCaptionsSettingsProviderRequest", - "allOf": [ - { - "$ref": "https://meta.comcast.com/firebolt/types#/definitions/ProviderRequest" - }, - { - "type": "object", - "properties": { - "parameters": { - "const": null - } - } - } - ], - "examples": [ - { - "correlationId": "abc" - } - ] - } - } - } + "openrpc": "1.2.4", + "info": { + "title": "ClosedCaptions", + "description": "A module for managing closed-captions Settings.", + "version": "0.0.0" + }, + "methods": [ + { + "name": "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": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/localization#/definitions/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" + ] + } + } + ] + } + ], + "components": { + "schemas": { + "ClosedCaptionsSettingsProviderRequest": { + "title": "ClosedCaptionsSettingsProviderRequest", + "allOf": [ + { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/ProviderRequest" + }, + { + "type": "object", + "properties": { + "parameters": { + "const": null + } + } + } + ], + "examples": [ + { + "correlationId": "abc" + } + ] + } + } + } } \ No newline at end of file diff --git a/src/openrpc/content.json b/src/openrpc/content.json new file mode 100644 index 000000000..b80096ae3 --- /dev/null +++ b/src/openrpc/content.json @@ -0,0 +1,198 @@ +{ + "openrpc": "1.2.4", + "info": { + "title": "Content", + "version": "0.0.0", + "description": "" + }, + "methods": [ + { + "name": "requestUserInterest", + "tags": [ + { + "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": "type", + "required": true, + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/discovery#/definitions/InterestType" + } + }, + { + "name": "reason", + "required": true, + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/discovery#/definitions/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": "userInterest", + "tags": [ + { + "name": "notifier" + }, + { + "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": "interest", + "required": true, + "schema": { + "$ref": "#/components/schemas/InterestEvent" + }, + "summary": "The EntityDetails data." + } + ], + "examples": [ + { + "name": "Default Example", + "params": [ + { + "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": { + "InterestResult": { + "title": "InterestResult", + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "entity": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/EntityDetails" + } + }, + "required": [ + "appId", + "entity" + ] + }, + "InterestEvent": { + "title": "InterestEvent", + "type": "object", + "properties": { + "appId": { + "type": "string" + }, + "type": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/discovery#/definitions/InterestType" + }, + "reason": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/discovery#/definitions/InterestReason" + }, + "entity": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/EntityDetails" + } + }, + "required": [ + "appId", + "entity", + "type", + "reason" + ] + } + } + } +} \ No newline at end of file diff --git a/src/openrpc/device.json b/src/openrpc/device.json index 04cdced4d..aef28a971 100644 --- a/src/openrpc/device.json +++ b/src/openrpc/device.json @@ -1,810 +1,813 @@ { - "openrpc": "1.2.4", - "info": { - "title": "Device", - "description": "A module for querying about the device and it's capabilities.", - "version": "0.0.0" - }, - "methods": [ - { - "name": "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": "distributor", - "summary": "Get the distributor ID for this device", - "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": "platform", - "summary": "Get the platform ID for this device", - "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": "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": "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": "model", - "summary": "Get the device model", - "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": "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": "make", - "summary": "Get the device make", - "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": "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": { - "type": "object", - "properties": { - "sdk": { - "$ref": "https://meta.comcast.com/firebolt/types#/definitions/SemanticVersion", - "description": "The Firebolt SDK version" - }, - "api": { - "$ref": "https://meta.comcast.com/firebolt/types#/definitions/SemanticVersion", - "description": "The lateset Firebolt API version supported by the curent device." - }, - "firmware": { - "$ref": "https://meta.comcast.com/firebolt/types#/definitions/SemanticVersion", - "description": "The device firmware version." - }, - "os": { - "$ref": "https://meta.comcast.com/firebolt/types#/definitions/SemanticVersion", - "description": "**Deprecated** Use `firmware`, instead." - }, - "debug": { - "type": "string", - "description": "Detail version as a string, for debugging purposes" - } - }, - "required": [ - "api", - "firmware", - "os" - ] - } - }, - "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": "hdcp", - "summary": "Get the supported HDCP profiles", - "params": [], - "tags": [ - { - "name": "property:readonly" - }, - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:device:info" - ] - } - ], - "result": { - "name": "supportedHdcpProfiles", - "summary": "the supported HDCP profiles", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/types#/definitions/BooleanMap" - } - }, - "examples": [ - { - "name": "Getting the supported HDCP profiles", - "params": [], - "result": { - "name": "Default Result", - "value": { - "hdcp1.4": true, - "hdcp2.2": true - } - } - } - ] - }, - { - "name": "hdr", - "summary": "Get the supported HDR profiles", - "params": [], - "tags": [ - { - "name": "property:readonly" - }, - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:device:info" - ] - } - ], - "result": { - "name": "supportedHdrProfiles", - "summary": "the supported HDR profiles", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/types#/definitions/BooleanMap" - } - }, - "examples": [ - { - "name": "Getting the supported HDR profiles", - "params": [], - "result": { - "name": "Default Result", - "value": { - "hdr10": true, - "hdr10Plus": true, - "dolbyVision": true, - "hlg": true - } - } - } - ] - }, - { - "name": "audio", - "summary": "Get the supported audio profiles", - "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": "screenResolution", - "summary": "Get the current screen resolution", - "params": [], - "tags": [ - { - "name": "property:readonly" - }, - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:device:info" - ] - } - ], - "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": "videoResolution", - "summary": "Get the current video resolution", - "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": "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": "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": [], - "result": { - "name": "value", - "summary": "the device friendly-name", - "schema": { - "type": "string" - } - }, - "examples": [ - { - "name": "Getting the device name", - "params": [], - "result": { - "name": "Default Result", - "value": "Living Room" - } - } - ] - }, - { - "name": "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": { - "type": "object", - "properties": { - "state": { - "$ref": "#/components/schemas/NetworkState" - }, - "type": { - "$ref": "#/components/schemas/NetworkType" - } - }, - "required": [ - "state", - "type" - ] - } - }, - "examples": [ - { - "name": "Getting the network info", - "params": [], - "result": { - "name": "Default Result", - "value": { - "state": "connected", - "type": "wifi" - } - } - } - ] - }, - { - "name": "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 - } - } - ] - } - ], - "components": { - "schemas": { - "Resolution": { - "type": "array", - "items": [ - { - "type": "integer" - }, - { - "type": "integer" - } - ], - "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", - "allOf": [ - { - "$ref": "https://meta.comcast.com/firebolt/types#/definitions/BooleanMap" - }, - { - "type": "object", - "propertyNames": { - "$ref": "https://meta.comcast.com/firebolt/types#/definitions/AudioProfile" - } - } - ] - } - } - } + "openrpc": "1.2.4", + "info": { + "title": "Device", + "description": "A module for querying about the device and it's capabilities.", + "version": "0.0.0" + }, + "methods": [ + { + "name": "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": "distributor", + "summary": "Get the distributor ID for this device", + "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": "platform", + "summary": "Get the platform ID for this device", + "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": "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": "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": "model", + "summary": "Get the device model", + "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": "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": "make", + "summary": "Get the device make", + "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": "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": { + "type": "object", + "properties": { + "sdk": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/SemanticVersion", + "description": "The Firebolt SDK version" + }, + "api": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/SemanticVersion", + "description": "The lateset Firebolt API version supported by the curent device." + }, + "firmware": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/SemanticVersion", + "description": "The device firmware version." + }, + "os": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/SemanticVersion", + "description": "**Deprecated** Use `firmware`, instead." + }, + "debug": { + "type": "string", + "description": "Detail version as a string, for debugging purposes" + } + }, + "required": [ + "api", + "firmware", + "os" + ] + } + }, + "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": "hdcp", + "summary": "Get the supported HDCP profiles", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "supportedHdcpProfiles", + "summary": "the supported HDCP profiles", + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/BooleanMap" + } + }, + "examples": [ + { + "name": "Getting the supported HDCP profiles", + "params": [], + "result": { + "name": "Default Result", + "value": { + "hdcp1.4": true, + "hdcp2.2": true + } + } + } + ] + }, + { + "name": "hdr", + "summary": "Get the supported HDR profiles", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "result": { + "name": "supportedHdrProfiles", + "summary": "the supported HDR profiles", + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/BooleanMap" + } + }, + "examples": [ + { + "name": "Getting the supported HDR profiles", + "params": [], + "result": { + "name": "Default Result", + "value": { + "hdr10": true, + "hdr10Plus": true, + "dolbyVision": true, + "hlg": true + } + } + } + ] + }, + { + "name": "audio", + "summary": "Get the supported audio profiles", + "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": "screenResolution", + "summary": "Get the current screen resolution", + "params": [], + "tags": [ + { + "name": "property:readonly" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "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": "videoResolution", + "summary": "Get the current video resolution", + "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": "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": "deviceNameChanged", + "tags": [ + { + "name": "notifier", + "x-event": "Device.onDeviceNameChanged" + }, + { + "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": "value", + "summary": "the device friendly-name", + "schema": { + "type": "string" + } + } + ], + "examples": [ + { + "name": "Getting the device name", + "params": [ + { + "name": "value", + "value": "Living Room" + } + ] + } + ] + }, + { + "name": "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": { + "type": "object", + "properties": { + "state": { + "$ref": "#/components/schemas/NetworkState" + }, + "type": { + "$ref": "#/components/schemas/NetworkType" + } + }, + "required": [ + "state", + "type" + ] + } + }, + "examples": [ + { + "name": "Getting the network info", + "params": [], + "result": { + "name": "Default Result", + "value": { + "state": "connected", + "type": "wifi" + } + } + } + ] + }, + { + "name": "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 + } + } + ] + } + ], + "components": { + "schemas": { + "Resolution": { + "type": "array", + "items": [ + { + "type": "integer" + }, + { + "type": "integer" + } + ], + "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", + "allOf": [ + { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/BooleanMap" + }, + { + "type": "object", + "propertyNames": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/AudioProfile" + } + } + ] + } + } + } } \ No newline at end of file diff --git a/src/openrpc/discovery.json b/src/openrpc/discovery.json index eb7530a35..61235695d 100644 --- a/src/openrpc/discovery.json +++ b/src/openrpc/discovery.json @@ -1,1791 +1,2008 @@ { - "openrpc": "1.2.4", - "info": { - "title": "Discovery", - "version": "0.0.0", - "description": "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." - }, - "methods": [ - { - "name": "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 - } - } + "openrpc": "1.2.4", + "info": { + "title": "Discovery", + "version": "0.0.0", + "description": "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." + }, + "methods": [ + { + "name": "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": "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": "https://meta.rdkcentral.com/firebolt/schemas/discovery#/definitions/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": "success", + "value": true + } + } + ] + }, + { + "name": "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": "https://meta.rdkcentral.com/firebolt/schemas/discovery#/definitions/PurchasedContentResult" + }, + "summary": "The data for the purachasedContent" + } + ], + "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": "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-1 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": "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": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/LocalizedString" + }, + "required": true + }, + { + "name": "identifiers", + "summary": "A set of content identifiers for this call to action", + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/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": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/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": "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": "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": "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": "https://meta.rdkcentral.com/firebolt/schemas/intents#/definitions/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:main" + }, + { + "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 specfic 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": "navigateTo", + "tags": [ + { + "name": "notifier", + "x-event": "Discovery.onNavigateTo" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:discovery:navigate-to" + ] + } + ], + "summary": "listen to `navigateTo` events", + "params": [ + { + "name": "value", + "summary": "An object describing where in the app the user intends to navigate to", + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/intents#/definitions/NavigationIntent" + } + } + ], + "examples": [ + { + "name": "Listening for `navigateTo` events", + "params": [ + { + "name": "event", + "value": { + "action": "search", + "data": { + "query": "a cool show" + }, + "context": { + "campaign": "unknown", + "source": "voice" + } + } + } + ] + } + ] + }, + { + "name": "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": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/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": "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": "signIn", + "tags": [ + { + "name": "notifier", + "x-event": "Discovery.onSignIn" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:discovery:sign-in-status" + ] + } + ], + "summary": "Listen to events from all apps that call Discovery.signIn", + "params": [ + { + "name": "event", + "schema": { + "type": "object", + "properties": { + "appId": { + "type": "string" + } + }, + "required": [ + "appId" + ] + } + } + ], + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "Default Event", + "value": { + "appId": "firecert" + } + } + ] + } + ] + }, + { + "name": "signOut", + "tags": [ + { + "name": "notifier", + "x-event": "Discovery.onSignOut" + }, + { + "name": "capabilities", + "x-manages": [ + "xrn:firebolt:capability:discovery:sign-in-status" + ] + } + ], + "summary": "Listen to events from all apps that call Discovery.signOut", + "params": [ + { + "name": "event", + "schema": { + "type": "object", + "properties": { + "appId": { + "type": "string" + } + }, + "required": [ + "appId" + ] + } + } + ], + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "Default Event", + "value": { + "appId": "firecert" + } + } + ] + } + ] + }, + { + "name": "provideInterest", + "tags": [ + { + "name": "registration", + "x-interface": "Interest" + }, + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:discovery:interest" + } + ], + "summary": "Register an app's Interest interface.", + "params": [ + { + "name": "enabled", + "required": true, + "schema": { + "type": "boolean" + } + } + ], + "result": { + "name": "result", + "schema": { + "const": null + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "enabled", + "value": true + } + ], + "result": { + "name": "result", + "value": null + } + } + ] + }, { - "name": "entityInfo", + "name": "userInterest", + "summary": "Send an entity that the user has expressed interest in to the platform.", "tags": [ - { - "name": "polymorphic-pull" - }, { "name": "capabilities", - "x-provides": "xrn:firebolt:capability:discovery:entity-info" + "x-provides": "xrn:firebolt:capability:discovery:interest" } ], - "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", + "name": "type", "required": true, "schema": { - "type": [ - "string", - "null" - ] + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/discovery#/definitions/InterestType" } }, { - "name": "result", + "name": "reason", "required": true, "schema": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/EntityInfoResult" - }, - "summary": "The entityInfo data." + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/discovery#/definitions/InterestReason" + } } ], "result": { - "name": "success", - "summary": "True if the push operation is successful", + "name": "entity", "schema": { - "type": "boolean" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/EntityDetails" } }, "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.", + "name": "Default Example", "params": [ { - "name": "correlationId", - "value": null + "name": "type", + "value": "interest" }, { - "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" - ] - } - ] - } - ] - } + "name": "reason", + "value": "playlist" } ], - "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": "entity", + "value": { + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" + }, + "info": {} } - ], - "result": { - "name": "success", - "value": true } } ] }, { - "name": "purchasedContent", + "name": "userInterest", "tags": [ - { - "name": "polymorphic-pull" - }, { "name": "capabilities", - "x-provides": "xrn:firebolt:capability:discovery:purchased-content" + "x-provides": "xrn:firebolt:capability:discovery:interest", + "x-push": true } ], - "summary": "Provide a list of purchased content for the authenticated account, such as rentals and electronic sell through purchases.", + "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": "correlationId", - "required": true, - "schema": { - "type": [ - "string", - "null" - ] - } - }, - { - "name": "result", + "name": "type", "required": true, "schema": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/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 + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/discovery#/definitions/InterestType" } - } - ], - "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": "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", + "name": "reason", "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-1 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": "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": "https://meta.comcast.com/firebolt/types#/definitions/LocalizedString" - }, - "required": true - }, - { - "name": "identifiers", - "summary": "A set of content identifiers for this call to action", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/ContentIdentifiers" - }, - "required": true - }, - { - "name": "expires", - "summary": "When this call to action should no longer be presented to users", - "schema": { - "type": "string", - "format": "date-time" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/discovery#/definitions/InterestReason" } }, { - "name": "images", - "summary": "A set of images for this call to action", + "name": "entity", "schema": { - "type": "object", - "patternProperties": { - "^.*$": { - "$ref": "https://meta.comcast.com/firebolt/types#/definitions/LocalizedString" - } - } + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/EntityDetails" } - } + } ], "result": { - "name": "success", - "summary": "whether the call was successful or not", + "name": "result", "schema": { - "type": "boolean" + "type": "null" } }, "examples": [ { - "name": "Suggest a watch-next tile for the home screen", + "name": "Default Example", "params": [ { - "name": "title", - "value": "A Cool Show" - }, - { - "name": "identifiers", - "value": { - "entityId": "partner.com/entity/123" - } + "name": "type", + "value": "interest" }, { - "name": "expires", - "value": "2021-04-23T18:25:43.511Z" + "name": "reason", + "value": "playlist" }, { - "name": "images", + "name": "entity", "value": { - "3x4": { - "en-US": "https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg", - "es": "https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg" + "identifiers": { + "entityId": "345", + "entityType": "program", + "programType": "movie" }, - "16x9": { - "en": "https://i.ytimg.com/vi/4r7wHMg5Yjg/maxresdefault.jpg" + "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": "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": "result", + "value": null } } ] - }, - { - "name": "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": "https://meta.comcast.com/firebolt/entertainment#/definitions/Entitlement" - } + } + ], + "components": { + "schemas": { + "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": "https://meta.rdkcentral.com/firebolt/schemas/discovery#/definitions/EntityInfoResult" + } + } + } + ] + }, + "EntityInfoResult": { + "title": "EntityInfoResult", + "description": "The result for an `entityInfo()` push or pull.", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "entity": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/EntityInfo" + }, + "related": { + "type": "array", + "items": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/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": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/OfferingType" + }, + "programType": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/ProgramType" + } + }, + "required": [ + "limit" + ], + "additionalProperties": false, + "examples": [ + { + "limit": 100 + } + ] + }, + "PurchasedContentFederatedResponse": { + "title": "PurchasedContentFederatedResponse", + "allOf": [ + { + "$ref": "#/components/schemas/FederatedResponse" + }, + { + "type": "object", + "properties": { + "result": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/discovery#/definitions/PurchasedContentResult" + } + } + } + ] + }, + "PurchasedContentResult": { + "title": "PurchasedContentResult", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "totalCount": { + "type": "integer", + "minimum": 0 + }, + "entries": { + "type": "array", + "items": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/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": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/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": "https://meta.rdkcentral.com/firebolt/schemas/discovery#/definitions/InterestType" }, - "required": true + "reason": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/discovery#/definitions/InterestReason" + } } - ], - "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": "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": "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": "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": "https://meta.comcast.com/firebolt/intents#/definitions/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": "onNavigateTo", - "tags": [ - { - "name": "event" - }, - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:discovery:navigate-to" - ] - } - ], - "summary": "listen to `navigateTo` events", - "params": [], - "result": { - "name": "value", - "summary": "An object describing where in the app the user intends to navigate to", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/intents#/definitions/NavigationIntent" - } - }, - "examples": [ - { - "name": "Listening for `navigateTo` events", - "params": [], - "result": { - "name": "event", - "value": { - "action": "search", - "data": { - "query": "a cool show" - }, - "context": { - "campaign": "unknown", - "source": "voice" - } - } - } - } - ] - }, - { - "name": "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": "https://meta.comcast.com/firebolt/entertainment#/definitions/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": "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": "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": [], - "result": { - "name": "event", - "schema": { - "type": "object", - "properties": { - "appId": { - "type": "string" - } - }, - "required": [ - "appId" - ] - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "Default Event", - "value": { - "appId": "firecert" - } - } - } - ] - }, - { - "name": "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": [], - "result": { - "name": "event", - "schema": { - "type": "object", - "properties": { - "appId": { - "type": "string" - } - }, - "required": [ - "appId" - ] - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "Default Event", - "value": { - "appId": "firecert" - } - } - } - ] - } - ], - "components": { - "schemas": { - "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": "https://meta.comcast.com/firebolt/discovery#/definitions/EntityInfoResult" - } - } - } - ] - }, - "EntityInfoResult": { - "title": "EntityInfoResult", - "description": "The result for an `entityInfo()` push or pull.", - "type": "object", - "properties": { - "expires": { - "type": "string", - "format": "date-time" - }, - "entity": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/EntityInfo" - }, - "related": { - "type": "array", - "items": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/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": "https://meta.comcast.com/firebolt/entertainment#/definitions/OfferingType" - }, - "programType": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/ProgramType" - } - }, - "required": [ - "limit" - ], - "additionalProperties": false, - "examples": [ - { - "limit": 100 - } - ] - }, - "PurchasedContentFederatedResponse": { - "title": "PurchasedContentFederatedResponse", - "allOf": [ - { - "$ref": "#/components/schemas/FederatedResponse" - }, - { - "type": "object", - "properties": { - "result": { - "$ref": "https://meta.comcast.com/firebolt/discovery#/definitions/PurchasedContentResult" - } - } - } - ] - }, - "PurchasedContentResult": { - "title": "PurchasedContentResult", - "type": "object", - "properties": { - "expires": { - "type": "string", - "format": "date-time" - }, - "totalCount": { - "type": "integer", - "minimum": 0 - }, - "entries": { - "type": "array", - "items": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/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": "https://meta.comcast.com/firebolt/entertainment#/definitions/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" - ] - } - } - } + } + } + } } \ No newline at end of file diff --git a/src/openrpc/hdmi-input.json b/src/openrpc/hdmi-input.json index 9a724aab2..13b340a82 100644 --- a/src/openrpc/hdmi-input.json +++ b/src/openrpc/hdmi-input.json @@ -173,10 +173,10 @@ ] }, { - "name": "onConnectionChanged", + "name": "connectionChanged", "tags": [ { - "name": "event" + "name": "notifier" }, { "name": "capabilities", @@ -186,32 +186,35 @@ } ], "summary": "Notification for when any HDMI port has a connection physically engaged or disengaged.", - "params": [], - "result": { - "name": "info", - "schema": { - "$ref": "#/components/schemas/ConnectionChangedInfo" + "params": [ + { + "name": "info", + "required": true, + "schema": { + "$ref": "#/components/schemas/ConnectionChangedInfo" + } } - }, + ], "examples": [ { "name": "Default Example", - "params": [], - "result": { - "name": "info", - "value": { - "port": "HDMI1", - "connected": true + "params": [ + { + "name": "info", + "value": { + "port": "HDMI1", + "connected": true + } } - } + ] } ] }, { - "name": "onSignalChanged", + "name": "signalChanged", "tags": [ { - "name": "event" + "name": "notifier" }, { "name": "capabilities", @@ -221,24 +224,27 @@ } ], "summary": "Notification for when any HDMI port has it's signal status changed.", - "params": [], - "result": { - "name": "info", - "schema": { - "$ref": "#/components/schemas/SignalChangedInfo" - } - }, + "params": [ + { + "name": "info", + "required": true, + "schema": { + "$ref": "#/components/schemas/SignalChangedInfo" + } + } + ], "examples": [ { "name": "Default Example", - "params": [], - "result": { - "name": "info", - "value": { - "port": "HDMI1", - "signal": "stable" + "params": [ + { + "name": "info", + "value": { + "port": "HDMI1", + "signal": "stable" + } } - } + ] } ] }, @@ -284,7 +290,7 @@ ] }, { - "name": "onAutoLowLatencyModeSignalChanged", + "name": "autoLowLatencyModeSignalChanged", "summary": "Notification for changes to ALLM status of any input device.", "tags": [ { @@ -294,27 +300,30 @@ ] }, { - "name": "event" + "name": "notifier" } ], - "params": [], - "result": { - "name": "info", - "schema": { - "$ref": "#/components/schemas/AutoLowLatencyModeSignalChangedInfo" - } - }, + "params": [ + { + "name": "info", + "required": true, + "schema": { + "$ref": "#/components/schemas/AutoLowLatencyModeSignalChangedInfo" + } + } + ], "examples": [ { "name": "Default Example", - "params": [], - "result": { - "name": "info", - "value": { - "port": "HDMI1", - "autoLowLatencyModeSignalled": true + "params": [ + { + "name": "info", + "value": { + "port": "HDMI1", + "autoLowLatencyModeSignalled": true + } } - } + ] } ] }, diff --git a/src/openrpc/keyboard.json b/src/openrpc/keyboard.json index 0ef1f725b..c943a8fd7 100644 --- a/src/openrpc/keyboard.json +++ b/src/openrpc/keyboard.json @@ -1,382 +1,403 @@ { - "openrpc": "1.2.4", - "info": { - "title": "Keyboard", - "description": "Methods for prompting users to enter text with task-oriented UX", - "version": "0.0.0" - }, - "methods": [ - { - "name": "email", - "tags": [ - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:input:keyboard" - ] - } - ], - "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": "password", - "tags": [ - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:input:keyboard" - ] - } - ], - "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": "standard", - "tags": [ - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:input:keyboard" - ] - } - ], - "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": "onRequestStandard", - "summary": "Registers as a provider for when the user should be shown a standard keyboard.", - "params": [], - "tags": [ - { - "name": "event", - "x-response": { - "$ref": "#/components/schemas/KeyboardResult", - "examples": [ - { - "text": "username" - } - ] - } - }, - { - "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": { - "$ref": "#/components/schemas/KeyboardProviderRequest" - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "Default Result", - "value": { - "correlationId": "abc", - "parameters": { - "message": "Enter your user name." - } - } - } - } - ] - }, - { - "name": "onRequestPassword", - "summary": "Registers as a provider for when the user should be shown a password keyboard, with dots for each character entered.", - "params": [], - "tags": [ - { - "name": "event", - "x-response": { - "$ref": "#/components/schemas/KeyboardResult", - "examples": [ - { - "text": "password" - } - ] - } - }, - { - "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": { - "$ref": "#/components/schemas/KeyboardProviderRequest" - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "Default Result", - "value": { - "correlationId": "abc", - "parameters": { - "message": "Enter your user name." - } - } - } - } - ] - }, - { - "name": "onRequestEmail", - "summary": "Registers as a provider for when the user should be shown a keyboard optimized for email address entry.", - "params": [], - "tags": [ - { - "name": "event", - "x-response": { - "$ref": "#/components/schemas/KeyboardResult", - "examples": [ - { - "text": "email@address.com" - } - ] - } - }, - { - "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": { - "$ref": "#/components/schemas/KeyboardProviderRequest" - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "Default Result", - "value": { - "correlationId": "abc", - "parameters": { - "message": "Enter your user name." - } - } - } - } - ] - } - ], - "components": { - "schemas": { - "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" - } - } - }, - "KeyboardResult": { - "title": "KeyboardResult", - "type": "object", - "required": [ - "text" - ], - "properties": { - "text": { - "type": "string", - "description": "The text the user entered into the keyboard" - }, - "canceled": { - "type": "boolean", - "description": "Whether the user canceled entering text before they were finished typing on the keyboard" - } - } - } - } - } + "openrpc": "1.2.4", + "info": { + "title": "Keyboard", + "description": "Methods for prompting users to enter text with task-oriented UX", + "version": "0.0.0" + }, + "methods": [ + { + "name": "email", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:input:keyboard" + ], + "x-provided-by": "Keyboard.email" + } + ], + "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": "password", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:input:keyboard" + ], + "x-provided-by": "Keyboard.password" + } + ], + "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": "standard", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:input:keyboard" + ], + "x-provided-by": "Keyboard.standard" + } + ], + "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": "email", + "tags": [ + { + "name": "capabilities", + "x-provides": "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": "password", + "tags": [ + { + "name": "capabilities", + "x-provides": "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": "standard", + "tags": [ + { + "name": "capabilities", + "x-provides": "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" + } + } + ] + } + ], + "components": { + "schemas": { + "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": {}, + "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" + } + } + }, + "KeyboardResult": { + "title": "KeyboardResult", + "type": "object", + "required": [ + "text" + ], + "properties": { + "text": { + "type": "string", + "description": "The text the user entered into the keyboard" + }, + "canceled": { + "type": "boolean", + "description": "Whether the user canceled entering text before they were finished typing on the keyboard" + } + } + } + } + } } \ No newline at end of file diff --git a/src/openrpc/lifecycle.json b/src/openrpc/lifecycle.json index 4bddae9d1..bf5f122a5 100644 --- a/src/openrpc/lifecycle.json +++ b/src/openrpc/lifecycle.json @@ -1,387 +1,403 @@ { - "openrpc": "1.2.4", - "info": { - "title": "Lifecycle", - "description": "Methods and events for responding to lifecycle changes in your app", - "version": "0.0.0" - }, - "methods": [ - { - "name": "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": "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": "https://meta.comcast.com/firebolt/lifecycle#/definitions/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": "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": "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": "https://meta.comcast.com/firebolt/lifecycle#/definitions/LifecycleState" - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "Default Result", - "value": "foreground" - } - } - ] - }, - { - "name": "onInactive", - "tags": [ - { - "name": "event" - }, - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:lifecycle:state" - ] - } - ], - "summary": "Listen to the inactive event", - "params": [], - "result": { - "name": "value", - "schema": { - "$ref": "#/components/schemas/LifecycleEvent" - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "Default Result", - "value": { - "state": "inactive", - "previous": "initializing" - } - } - } - ] - }, - { - "name": "onForeground", - "tags": [ - { - "name": "event" - }, - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:lifecycle:state" - ] - } - ], - "summary": "Listen to the foreground event", - "params": [], - "result": { - "name": "value", - "schema": { - "$ref": "#/components/schemas/LifecycleEvent" - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "Default Result", - "value": { - "state": "foreground", - "previous": "inactive" - } - } - }, - { - "name": "Move to foreground via remote branded buton", - "params": [], - "result": { - "name": "value", - "value": { - "state": "foreground", - "previous": "inactive", - "source": "remote" - } - } - } - ] - }, - { - "name": "onBackground", - "tags": [ - { - "name": "event" - }, - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:lifecycle:state" - ] - } - ], - "summary": "Listen to the background event", - "params": [], - "result": { - "name": "value", - "schema": { - "$ref": "#/components/schemas/LifecycleEvent" - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "Default Result", - "value": { - "state": "background", - "previous": "foreground" - } - } - } - ] - }, - { - "name": "onSuspended", - "tags": [ - { - "name": "event" - }, - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:lifecycle:state" - ] - } - ], - "summary": "Listen to the suspended event", - "params": [], - "result": { - "name": "value", - "schema": { - "$ref": "#/components/schemas/LifecycleEvent" - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "Default Result", - "value": { - "state": "suspended", - "previous": "inactive" - } - } - } - ] - }, - { - "name": "onUnloading", - "tags": [ - { - "name": "event" - }, - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:lifecycle:state" - ] - } - ], - "summary": "Listen to the unloading event", - "params": [], - "result": { - "name": "value", - "schema": { - "$ref": "#/components/schemas/LifecycleEvent" - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "Default Result", - "value": { - "state": "unloading", - "previous": "inactive" - } - } - } - ] - } - ], - "components": { - "schemas": { - "LifecycleEvent": { - "title": "LifecycleEvent", - "description": "A an object describing the previous and current states", - "type": "object", - "required": [ - "state", - "previous" - ], - "properties": { - "state": { - "$ref": "https://meta.comcast.com/firebolt/lifecycle#/definitions/LifecycleState", - "description": "The current lifcycle state" - }, - "previous": { - "$ref": "https://meta.comcast.com/firebolt/lifecycle#/definitions/LifecycleState", - "description": "The previous lifcycle state" - }, - "source": { - "type": "string", - "enum": [ - "voice", - "remote" - ], - "description": "The source of the lifecycle change." - } - } - } - } - } + "openrpc": "1.2.4", + "info": { + "title": "Lifecycle", + "description": "Methods and events for responding to lifecycle changes in your app", + "version": "0.0.0" + }, + "methods": [ + { + "name": "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": "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": "https://meta.rdkcentral.com/firebolt/schemas/lifecycle#/definitions/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": "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": "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": "https://meta.rdkcentral.com/firebolt/schemas/lifecycle#/definitions/LifecycleState" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": "foreground" + } + } + ] + }, + { + "name": "inactive", + "tags": [ + { + "name": "notifier", + "x-event": "Lifecycle.onInactive" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the inactive event", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/components/schemas/LifecycleEvent" + } + } + ], + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": { + "state": "inactive", + "previous": "initializing" + } + } + ] + } + ] + }, + { + "name": "foreground", + "tags": [ + { + "name": "notifier", + "x-event": "Lifecycle.onForeground" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the foreground event", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/components/schemas/LifecycleEvent" + } + } + ], + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "Default Result", + "value": { + "state": "foreground", + "previous": "inactive" + } + } + ] + }, + { + "name": "Move to foreground via remote branded buton", + "params": [ + { + "name": "value", + "value": { + "state": "foreground", + "previous": "inactive", + "source": "remote" + } + } + ] + } + ] + }, + { + "name": "background", + "tags": [ + { + "name": "notifier", + "x-event": "Lifecycle.onBackground" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the background event", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/components/schemas/LifecycleEvent" + } + } + ], + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": { + "state": "background", + "previous": "foreground" + } + } + ] + } + ] + }, + { + "name": "suspended", + "tags": [ + { + "name": "notifier", + "x-event": "Lifecycle.onSuspended" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the suspended event", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/components/schemas/LifecycleEvent" + } + } + ], + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": { + "state": "suspended", + "previous": "inactive" + } + } + ] + } + ] + }, + { + "name": "unloading", + "tags": [ + { + "name": "notifier", + "x-event": "Lifecycle.onUnloading" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:lifecycle:state" + ] + } + ], + "summary": "Listen to the unloading event", + "params": [ + { + "name": "value", + "schema": { + "$ref": "#/components/schemas/LifecycleEvent" + } + } + ], + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "value", + "value": { + "state": "unloading", + "previous": "inactive" + } + } + ] + } + ] + } + ], + "components": { + "schemas": { + "LifecycleEvent": { + "title": "LifecycleEvent", + "description": "A an object describing the previous and current states", + "type": "object", + "required": [ + "state", + "previous" + ], + "properties": { + "state": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/lifecycle#/definitions/LifecycleState", + "description": "The current lifcycle state" + }, + "previous": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/lifecycle#/definitions/LifecycleState", + "description": "The previous lifcycle state" + }, + "source": { + "type": "string", + "enum": [ + "voice", + "remote" + ], + "description": "The source of the lifecycle change." + } + } + } + } + } } \ No newline at end of file diff --git a/src/openrpc/localization.json b/src/openrpc/localization.json index db92eeb5b..654a6ff4b 100644 --- a/src/openrpc/localization.json +++ b/src/openrpc/localization.json @@ -1,480 +1,494 @@ { - "openrpc": "1.2.4", - "info": { - "title": "Localization", - "description": "Methods for accessessing location and language preferences", - "version": "0.0.0" - }, - "methods": [ - { - "name": "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": "https://meta.comcast.com/firebolt/localization#/definitions/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": "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": "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": "https://meta.comcast.com/firebolt/localization#/definitions/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": "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": "https://meta.comcast.com/firebolt/localization#/definitions/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": "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": "https://meta.comcast.com/firebolt/localization#/definitions/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": "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": "https://meta.comcast.com/firebolt/localization#/definitions/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": "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": "additionalInfo", - "tags": [ - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:localization:additional-info" - ] - } - ], - "summary": "Get any platform-specific localization information, in an Map", - "params": [], - "result": { - "name": "info", - "summary": "the additional info", - "schema": { - "type": "object", - "additionalProperties": { - "type": "string", - "maxLength": 1024 - }, - "maxProperties": 32 - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "info", - "value": { - } - } - } - ] - }, - { - "name": "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", - "schema": { - "type": "string" - }, - "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": "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": "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": "https://meta.comcast.com/firebolt/localization#/definitions/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" - } - } - ] - } - ], - "components": { - "schemas": { - "LatLon": { - "type": "array", - "items": [ - { "type": "number" }, - { "type": "number" } - ], - "additionalItems": false, - "minItems": 2, - "maxItems": 2 - } - } - } -} + "openrpc": "1.2.4", + "info": { + "title": "Localization", + "description": "Methods for accessessing location and language preferences", + "version": "0.0.0" + }, + "methods": [ + { + "name": "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": "https://meta.rdkcentral.com/firebolt/schemas/localization#/definitions/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": "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": "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": "https://meta.rdkcentral.com/firebolt/schemas/localization#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/localization#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/localization#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/localization#/definitions/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": "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": "additionalInfo", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:localization:additional-info" + ] + } + ], + "summary": "Get any platform-specific localization information, in an Map", + "params": [], + "result": { + "name": "info", + "summary": "the additional info", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string", + "maxLength": 1024 + }, + "maxProperties": 32 + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "info", + "value": {} + } + } + ] + }, + { + "name": "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", + "schema": { + "type": "string" + }, + "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": "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": "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": "https://meta.rdkcentral.com/firebolt/schemas/localization#/definitions/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" + } + } + ] + } + ], + "components": { + "schemas": { + "LatLon": { + "type": "array", + "items": [ + { + "type": "number" + }, + { + "type": "number" + } + ], + "additionalItems": false, + "minItems": 2, + "maxItems": 2 + } + } + } +} \ No newline at end of file diff --git a/src/openrpc/metrics.json b/src/openrpc/metrics.json index d3a9516c5..0fee85631 100644 --- a/src/openrpc/metrics.json +++ b/src/openrpc/metrics.json @@ -1,1153 +1,1148 @@ { - "openrpc": "1.2.4", - "info": { - "title": "Metrics", - "description": "Methods for sending metrics", - "version": "0.0.0" - }, - "methods": [ - { - "name": "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": "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": "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": "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": "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": "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": "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": "https://meta.comcast.com/firebolt/types#/definitions/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": "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": "https://meta.comcast.com/firebolt/types#/definitions/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": "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": "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": "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": "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": "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": "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": "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.50 - } - ], - "result": { - "name": "success", - "value": true - } - } - ] - }, - { - "name": "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": "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": "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": "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": "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 - } - } - ] - } - ], - "components": { - "schemas": { - "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" - } - ] - } - } - } - } + "openrpc": "1.2.4", + "info": { + "title": "Metrics", + "description": "Methods for sending metrics", + "version": "0.0.0" + }, + "methods": [ + { + "name": "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": "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": "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": "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": "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": "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": "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": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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 + } + } + ] + } + ], + "components": { + "schemas": { + "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" + } + ] + } + } + } + } } \ No newline at end of file diff --git a/src/openrpc/parameters.json b/src/openrpc/parameters.json index 101d140bd..d510d3c65 100644 --- a/src/openrpc/parameters.json +++ b/src/openrpc/parameters.json @@ -1,90 +1,90 @@ { - "openrpc": "1.2.4", - "info": { - "title": "Parameters", - "description": "Methods for getting initialization parameters for an app cold launch.", - "version": "0.0.0" - }, - "methods": [ - { - "name": "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" - } - } - } - } - } - } - ] - } - ], - "components": { - "schemas": { - "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": "https://meta.comcast.com/firebolt/intents#/definitions/NavigationIntent" - } - } - }, - "secondScreen": { - "type": "object", - "properties": { - "launchRequest": { - "$ref": "https://meta.comcast.com/firebolt/secondscreen#/definitions/SecondScreenEvent" - } - } - } - } - } - } - } - } \ No newline at end of file + "openrpc": "1.2.4", + "info": { + "title": "Parameters", + "description": "Methods for getting initialization parameters for an app cold launch.", + "version": "0.0.0" + }, + "methods": [ + { + "name": "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" + } + } + } + } + } + } + ] + } + ], + "components": { + "schemas": { + "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": "https://meta.rdkcentral.com/firebolt/schemas/intents#/definitions/NavigationIntent" + } + } + }, + "secondScreen": { + "type": "object", + "properties": { + "launchRequest": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/secondscreen#/definitions/SecondScreenEvent" + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/openrpc/pin_challenge.json b/src/openrpc/pin_challenge.json index c1a61ef7b..275d0b4c6 100644 --- a/src/openrpc/pin_challenge.json +++ b/src/openrpc/pin_challenge.json @@ -1,174 +1,174 @@ { - "openrpc": "1.2.4", - "info": { - "title": "PinChallenge", - "description": "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", - "version": "0.0.0" - }, - "methods": [ - { - "name": "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": [], - "tags": [ - { - "name": "event", - "x-response": { - "$ref": "#/components/schemas/PinChallengeResult", - "examples": [ - { - "granted": true, - "reason": "correctPin" - }, - { - "granted": false, - "reason": "exceededPinFailures" - }, - { - "granted": null, - "reason": "cancelled" - } - ] - } - }, - { - "name": "capabilities", - "x-provides": "xrn:firebolt:capability:usergrant:pinchallenge", - "x-allow-focus": true - } - ], - "result": { - "name": "challenge", - "summary": "The request to challenge the user", - "schema": { - "$ref": "#/components/schemas/PinChallengeProviderRequest" - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "Default Result", - "value": { - "correlationId": "abc", - "parameters": { - "capability": "xrn:firebolt:capability:commerce::purchase", - "requestor": { - "id": "ReferenceApp", - "name": "Firebolt Reference App" - }, - "pinSpace": "purchase" - } - } - } - } - ] - } - ], - "components": { - "schemas": { - "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" - } - } - }, - "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" - } - } - }, - "PinChallengeProviderRequest": { - "title": "PinChallengeProviderRequest", - "allOf": [ - { - "$ref": "https://meta.comcast.com/firebolt/types#/definitions/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 " - } - } - } - } - } + "openrpc": "1.2.4", + "info": { + "title": "PinChallenge", + "description": "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", + "version": "0.0.0" + }, + "methods": [ + { + "name": "challenge", + "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": "requestor", + "required": true, + "schema": { + "description": "The identity of which app is requesting access to this capability", + "$ref": "#/components/schemas/ChallengeRequestor" + } + }, + { + "name": "pinSpace", + "required": true, + "schema": { + "type": "string", + "description": "The pin space that this challenge is for", + "enum": [ + "purchase", + "content" + ] + } + }, + { + "name": "capability", + "required": false, + "schema": { + "type": "string", + "description": "The capability that is gated by a pin challenge" + } + } + ], + "tags": [ + { + "name": "capabilities", + "x-provides": "xrn:firebolt:capability:usergrant:pinchallenge", + "x-allow-focus": true + } + ], + "result": { + "name": "result", + "schema": { + "$ref": "#/components/schemas/PinChallengeResult" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "capability", + "value": "xrn:firebolt:capability:commerce::purchase" + }, + { + "name": "requestor", + "value": { + "id": "ReferenceApp", + "name": "Firebolt Reference App" + } + }, + { + "name": "pinSpace", + "value": "purchase" + } + ], + "result": { + "name": "result", + "value": { + "granted": true, + "reason": "correctPin" + } + } + } + ] + } + ], + "components": { + "schemas": { + "PinChallenge": { + "title": "PinChallenge", + "type": "object", + "required": [ + "requestor", + "pinSpace" + ], + "properties": {} + }, + "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" + } + } + }, + "PinChallengeProviderRequest": { + "title": "PinChallengeProviderRequest", + "allOf": [ + { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/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 " + } + } + } + } + } } \ No newline at end of file diff --git a/src/openrpc/privacy.json b/src/openrpc/privacy.json index ed117f6c1..f5e489d5f 100644 --- a/src/openrpc/privacy.json +++ b/src/openrpc/privacy.json @@ -1,632 +1,632 @@ { - "openrpc": "1.2.4", - "info": { - "title": "Privacy", - "description": "A module for managing device settings.", - "version": "0.0.0" - }, - "methods": [ - { - "name": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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 - } - } - } - ] - } - ], - "components": { - "schemas": { - "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 - } - ] - } - } - } + "openrpc": "1.2.4", + "info": { + "title": "Privacy", + "description": "A module for managing device settings.", + "version": "0.0.0" + }, + "methods": [ + { + "name": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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": "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 + } + } + } + ] + } + ], + "components": { + "schemas": { + "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 + } + ] + } + } + } } \ No newline at end of file diff --git a/src/openrpc/profile.json b/src/openrpc/profile.json index 15019931e..428904495 100644 --- a/src/openrpc/profile.json +++ b/src/openrpc/profile.json @@ -1,102 +1,102 @@ { - "openrpc": "1.2.4", - "info": { - "title": "Profile", - "description": "Methods for getting information about the current user/account profile", - "version": "0.0.0" - }, - "methods": [ - { - "name": "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": "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": "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": "https://meta.comcast.com/firebolt/types#/definitions/FlatMap" - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "flags", - "value": { - "userExperience": "1000" - } - } - } - ] - } - ] + "openrpc": "1.2.4", + "info": { + "title": "Profile", + "description": "Methods for getting information about the current user/account profile", + "version": "0.0.0" + }, + "methods": [ + { + "name": "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": "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": "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": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/FlatMap" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "flags", + "value": { + "userExperience": "1000" + } + } + } + ] + } + ] } \ No newline at end of file diff --git a/src/openrpc/second_screen.json b/src/openrpc/second_screen.json index af25e2c9d..e2734a419 100644 --- a/src/openrpc/second_screen.json +++ b/src/openrpc/second_screen.json @@ -1,186 +1,192 @@ { - "openrpc": "1.2.4", - "info": { - "title": "SecondScreen", - "version": "0.0.0", - "description": "Methods for communicating with second screen devices" - }, - "methods": [ - { - "name": "protocols", - "summary": "Get the supported second screen discovery protocols", - "tags": [ - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:device:info" - ] - } - ], - "params": [], - "result": { - "name": "protocols", - "summary": "the supported protocols", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/types#/definitions/BooleanMap" - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "Default Result", - "value": { - "dial1.7": true - } - } - } - ] - }, - { - "name": "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": "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": "onLaunchRequest", - "tags": [ - { - "name": "event" - }, - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:protocol:dial" - ] - } - ], - "summary": "Listen to the launchRequest event", - "params": [], - "result": { - "name": "launchRequestEvent", - "summary": "Dispatched when a second screen device on the local network has requested this app to be launched", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/secondscreen#/definitions/SecondScreenEvent" - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "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": "onCloseRequest", - "tags": [ - { - "name": "event" - }, - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:protocol:dial" - ] - } - ], - "summary": "Listen to the closeRequest event", - "params": [], - "result": { - "name": "closeRequestEvent", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/secondscreen#/definitions/SecondScreenEvent" - } - }, - "examples": [ - { - "name": "Default Example", - "params": [], - "result": { - "name": "Default Result", - "value": { - "type": "dial", - "version": "1.7" - } - } - } - ] - } - ] + "openrpc": "1.2.4", + "info": { + "title": "SecondScreen", + "version": "0.0.0", + "description": "Methods for communicating with second screen devices" + }, + "methods": [ + { + "name": "protocols", + "summary": "Get the supported second screen discovery protocols", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:device:info" + ] + } + ], + "params": [], + "result": { + "name": "protocols", + "summary": "the supported protocols", + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/BooleanMap" + } + }, + "examples": [ + { + "name": "Default Example", + "params": [], + "result": { + "name": "Default Result", + "value": { + "dial1.7": true + } + } + } + ] + }, + { + "name": "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": "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": "launchRequest", + "tags": [ + { + "name": "notifier", + "x-event": "SecondScreen.onLaunchRequest" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "summary": "Listen to the launchRequest event", + "params": [ + { + "name": "launchRequestEvent", + "summary": "Dispatched when a second screen device on the local network has requested this app to be launched", + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/secondscreen#/definitions/SecondScreenEvent" + } + } + ], + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "launchRequestEvent", + "value": { + "type": "dial", + "version": "1.7", + "data": "{\"code\":\"AQDPQZiQcb3KQ7gY7yy5tHTMbbkGHR9Zjp-KL53H3eKBZIeAt7O9UKYPu6B21l2UZVmIqkFXDXBmXvK4g2e3EgZtjMNmKPsTltgnRl95DImtOXjSpWtTjSaOkW4w1kZKUTwLKdwVWTzBVH8ERHorvLU6vCGOVHxXt65LNwdl5HKRweShVC1V9QsyvRnQS61ov0UclmrH_xZML2Bt-Q-rZFjey5MjwupIb4x4f53XUJMhjHpDHoIUKrjpdPDQvK2a\",\"friendlyName\":\"Operator_TX061AEI\",\"UDN\":\"608fef11-2800-482a-962b-23a6690c93c1\"}" + } + } + ] + } + ] + }, + { + "name": "closeRequest", + "tags": [ + { + "name": "notifier", + "x-event": "SecondScreen.onCloseRequest" + }, + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:dial" + ] + } + ], + "summary": "Listen to the closeRequest event", + "params": [ + { + "name": "closeRequestEvent", + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/secondscreen#/definitions/SecondScreenEvent" + } + } + ], + "examples": [ + { + "name": "Default Example", + "params": [ + { + "name": "closeRequestEvent", + "value": { + "type": "dial", + "version": "1.7" + } + } + ] + } + ] + } + ] } \ No newline at end of file diff --git a/src/openrpc/secure_storage.json b/src/openrpc/secure_storage.json index 1d65c1d4b..ae79d07da 100644 --- a/src/openrpc/secure_storage.json +++ b/src/openrpc/secure_storage.json @@ -1,571 +1,577 @@ { - "openrpc": "1.2.4", - "info": { - "title": "SecureStorage", - "version": "0.0.0", - "description": "A module for storing and retrieving secure data owned by the app" - }, - "methods": [ - { - "name": "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": "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": "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": "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": "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": "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": "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": { - "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" - } - } - } - } - } + "openrpc": "1.2.4", + "info": { + "title": "SecureStorage", + "version": "0.0.0", + "description": "A module for storing and retrieving secure data owned by the app" + }, + "methods": [ + { + "name": "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": "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": "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": "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": "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": "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": "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": { + "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" + } + } + } + } + } } \ No newline at end of file diff --git a/src/openrpc/user_grants.json b/src/openrpc/user_grants.json index fcfe8b1c0..d54f6c205 100644 --- a/src/openrpc/user_grants.json +++ b/src/openrpc/user_grants.json @@ -1,591 +1,591 @@ { - "openrpc": "1.2.4", - "info": { - "title": "UserGrants", - "description": "A module for managing grants given by the user", - "version": "0.0.0" - }, - "methods": [ - { - "name": "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": "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": "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": "https://meta.comcast.com/firebolt/capabilities#/definitions/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": "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": "https://meta.comcast.com/firebolt/capabilities#/definitions/Role" - }, - "required": true - }, - { - "name": "capability", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/capabilities#/definitions/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": "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": "https://meta.comcast.com/firebolt/capabilities#/definitions/Role" - }, - "required": true - }, - { - "name": "capability", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/capabilities#/definitions/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": "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": "https://meta.comcast.com/firebolt/capabilities#/definitions/Role" - }, - "required": true - }, - { - "name": "capability", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/capabilities#/definitions/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": "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": "https://meta.comcast.com/firebolt/capabilities#/definitions/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" - } - ] - } - } - ] - } - ], - "components": { - "schemas": { - "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": "https://meta.comcast.com/firebolt/capabilities#/definitions/Capability" - }, - "role": { - "$ref": "https://meta.comcast.com/firebolt/capabilities#/definitions/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" - } - } - } - } - } + "openrpc": "1.2.4", + "info": { + "title": "UserGrants", + "description": "A module for managing grants given by the user", + "version": "0.0.0" + }, + "methods": [ + { + "name": "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": "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": "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": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/Role" + }, + "required": true + }, + { + "name": "capability", + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/Role" + }, + "required": true + }, + { + "name": "capability", + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/Role" + }, + "required": true + }, + { + "name": "capability", + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/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": "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": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/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" + } + ] + } + } + ] + } + ], + "components": { + "schemas": { + "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": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/Capability" + }, + "role": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/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" + } + } + } + } + } } \ No newline at end of file diff --git a/src/openrpc/voice_guidance.json b/src/openrpc/voice_guidance.json index ead88fa48..5e18a009f 100644 --- a/src/openrpc/voice_guidance.json +++ b/src/openrpc/voice_guidance.json @@ -1,100 +1,93 @@ { - "openrpc": "1.2.4", - "info": { - "title": "VoiceGuidance", - "description": "A module for managing voice-guidance Settings.", - "version": "0.0.0" - }, - "methods": [ - { - "name": "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": "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": "https://meta.comcast.com/firebolt/accessibility#/definitions/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 - } - } - ] - } - ], - "components": { - "schemas": { - } - } + "openrpc": "1.2.4", + "info": { + "title": "VoiceGuidance", + "description": "A module for managing voice-guidance Settings.", + "version": "0.0.0" + }, + "methods": [ + { + "name": "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": "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": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/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 + } + } + ] + } + ], + "components": { + "schemas": {} + } } \ No newline at end of file diff --git a/src/openrpc/wifi.json b/src/openrpc/wifi.json index 1661ed2e6..165ac2361 100644 --- a/src/openrpc/wifi.json +++ b/src/openrpc/wifi.json @@ -1,351 +1,355 @@ { - "openrpc": "1.2.4", - "info": { - "title": "Wifi", - "description": "A module for providing support for Wifi.", - "version": "0.0.0" - }, - "components": { - "schemas": { - "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": "https://meta.comcast.com/firebolt/types#/definitions/Timeout" - } - } - } - } - } - }, - "methods": [ - { - "name": "scan", - "summary": "Scan available wifi networks in the location.", - "tags": [ - { - "name": "capabilities", - "x-uses": [ - "xrn:firebolt:capability:protocol:wifi" - ] - } - ], - "params": [ - { - "name": "timeout", - "schema": { - "$ref": "https://meta.comcast.com/firebolt/types#/definitions/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": "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": "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": "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 - } - } - } - ] - } - ] -} + "openrpc": "1.2.4", + "info": { + "title": "Wifi", + "description": "A module for providing support for Wifi.", + "version": "0.0.0" + }, + "components": { + "schemas": { + "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": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/Timeout" + } + } + } + } + } + }, + "methods": [ + { + "name": "scan", + "summary": "Scan available wifi networks in the location.", + "tags": [ + { + "name": "capabilities", + "x-uses": [ + "xrn:firebolt:capability:protocol:wifi" + ] + } + ], + "params": [ + { + "name": "timeout", + "schema": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/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": "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": "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": "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 + } + } + } + ] + } + ] +} \ No newline at end of file diff --git a/src/schemas/accessibility.json b/src/schemas/accessibility.json index ce6ad419a..0cdf6f317 100644 --- a/src/schemas/accessibility.json +++ b/src/schemas/accessibility.json @@ -1,6 +1,6 @@ { - "$id": "https://meta.comcast.com/firebolt/accessibility", "title": "Accessibility", + "$id": "https://meta.rdkcentral.com/firebolt/schemas/accessibility", "anyOf": [ { "$ref": "#/definitions/ClosedCaptionsStyles" @@ -114,7 +114,7 @@ "preferredLanguages": { "type": "array", "items": { - "$ref": "https://meta.comcast.com/firebolt/localization#/definitions/ISO639_2Language" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/localization#/definitions/ISO639_2Language" } } }, @@ -161,7 +161,7 @@ "description": "Whether or not voice guidance should be enabled by default" }, "speed": { - "$ref": "https://meta.comcast.com/firebolt/accessibility#/definitions/VoiceSpeed", + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/accessibility#/definitions/VoiceSpeed", "description": "The speed at which voice guidance speech will be read back to the user" } }, diff --git a/src/schemas/advertising.json b/src/schemas/advertising.json new file mode 100644 index 000000000..5d7fa8b54 --- /dev/null +++ b/src/schemas/advertising.json @@ -0,0 +1,23 @@ +{ + "title": "Advertising", + "$id": "https://meta.rdkcentral.com/firebolt/schemas/advertising", + "oneOf": [ + { + "$ref": "#/definitions/SkipRestriction" + } + ], + "definitions": { + "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" + } + } + } diff --git a/src/schemas/capabilities.json b/src/schemas/capabilities.json index 3ed851624..91617c777 100644 --- a/src/schemas/capabilities.json +++ b/src/schemas/capabilities.json @@ -1,6 +1,6 @@ { - "$id": "https://meta.comcast.com/firebolt/capabilities", "title": "Capabilities", + "$id": "https://meta.rdkcentral.com/firebolt/schemas/capabilities", "oneOf": [ { "$ref": "#/definitions/Capability" @@ -202,9 +202,10 @@ } }, "GrantKey": { + "title": "GrantKey", "allOf": [ { - "$ref": "https://meta.comcast.com/firebolt/capabilities#/definitions/Capability" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/capabilities#/definitions/Capability" }, { "type": "string", diff --git a/src/schemas/discovery.json b/src/schemas/discovery.json new file mode 100644 index 000000000..beb249c92 --- /dev/null +++ b/src/schemas/discovery.json @@ -0,0 +1,79 @@ +{ + "title": "Discovery", + "$id": "https://meta.rdkcentral.com/firebolt/schemas/discovery", + "anyOf": [ + { + "$ref": "#/definitions/PurchasedContentResult" + } + ], + "definitions": { + "PurchasedContentResult": { + "title": "PurchasedContentResult", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "totalCount": { + "type": "integer", + "minimum": 0 + }, + "entries": { + "type": "array", + "items": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/EntityInfo" + } + } + }, + "required": [ + "expires", + "totalCount", + "entries" + ], + "additionalProperties": false + }, + "EntityInfoResult": { + "title": "EntityInfoResult", + "description": "The result for an `entityInfo()` push or pull.", + "type": "object", + "properties": { + "expires": { + "type": "string", + "format": "date-time" + }, + "entity": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/EntityInfo" + }, + "related": { + "type": "array", + "items": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/EntityInfo" + } + } + }, + "required": [ + "expires", + "entity" + ], + "additionalProperties": false + }, + "InterestType": { + "title": "InterestType", + "type": "string", + "enum": [ + "interest", + "disinterest" + ] + }, + "InterestReason": { + "title": "InterestReason", + "type": "string", + "enum": [ + "playlist", + "reaction", + "recording" + ] + } + } + } diff --git a/src/schemas/entertainment.json b/src/schemas/entertainment.json index 8fd14ee38..f1ea8d0e7 100644 --- a/src/schemas/entertainment.json +++ b/src/schemas/entertainment.json @@ -1,6 +1,6 @@ { - "$id": "https://meta.comcast.com/firebolt/entertainment", "title": "Entertainment", + "$id": "https://meta.rdkcentral.com/firebolt/schemas/entertainment", "anyOf": [ { "$ref": "#/definitions/ProgramType" @@ -80,7 +80,6 @@ "required": [ "identifiers", "entityType", - "programType", "title" ], "properties": { @@ -100,10 +99,10 @@ "description": "The type of the entity, e.g. `program` or `music`." }, "programType": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/ProgramType" + "$ref": "#/definitions/ProgramType" }, "musicType": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/MusicType" + "$ref": "#/definitions/MusicType" }, "synopsis": { "type": "string", @@ -210,7 +209,7 @@ "description": "Time when the entity is no longer entitled." }, "offeringType": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/OfferingType" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/OfferingType" }, "hasAds": { "type": "boolean", @@ -235,7 +234,7 @@ "audioProfile": { "type": "array", "items": { - "$ref": "https://meta.comcast.com/firebolt/types#/definitions/AudioProfile" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/types#/definitions/AudioProfile" }, "description": "List of the audio types available via the WayToWatch." }, diff --git a/src/schemas/entity.json b/src/schemas/entity.json new file mode 100644 index 000000000..afd76bac7 --- /dev/null +++ b/src/schemas/entity.json @@ -0,0 +1,456 @@ +{ + "$id": "https://meta.rdkcentral.com/firebolt/schemas/entity", + "title": "Entity", + "oneOf": [ + { + "$ref": "#/definitions/Entity" + }, + { + "$ref": "#/definitions/PlayableEntity" + }, + { + "$ref": "#/definitions/EntityDetails" + } + ], + "definitions": { + "Entity": { + "oneOf": [ + { + "$ref": "#/definitions/ProgramEntity" + }, + { + "$ref": "#/definitions/MusicEntity" + }, + { + "$ref": "#/definitions/ChannelEntity" + }, + { + "$ref": "#/definitions/UntypedEntity" + }, + { + "$ref": "#/definitions/PlaylistEntity" + } + ] + }, + "EntityDetails": { + "title": "EntityDetails", + "type": "object", + "required": [ + "identifiers" + ], + "properties": { + "identifiers": { + "$ref": "#/definitions/Entity" + }, + "info": { + "$ref": "#/definitions/Metadata" + }, + "waysToWatch": { + "type": "array", + "items": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/WayToWatch" + }, + "description": "An array of ways a user is might watch this entity, regardless of entitlements." + } + } + }, + "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 + }, + "ProgramEntity": { + "title": "ProgramEntity", + "oneOf": [ + { + "$ref": "#/definitions/MovieEntity" + }, + { + "$ref": "#/definitions/TVEpisodeEntity" + }, + { + "$ref": "#/definitions/TVSeasonEntity" + }, + { + "$ref": "#/definitions/TVSeriesEntity" + }, + { + "$ref": "#/definitions/AdditionalEntity" + } + ] + }, + "MusicEntity": { + "title": "MusicEntity", + "type": "object", + "properties": { + "entityType": { + "const": "music" + }, + "musicType": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/MusicType" + }, + "entityId": { + "type": "string" + } + }, + "required": [ + "entityType", + "musicType", + "entityId" + ] + }, + "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" + } + ] + }, + "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" + } + ] + }, + "PlayableEntity": { + "title": "PlayableEntity", + "anyOf": [ + { + "$ref": "#/definitions/MovieEntity" + }, + { + "$ref": "#/definitions/TVEpisodeEntity" + }, + { + "$ref": "#/definitions/PlaylistEntity" + }, + { + "$ref": "#/definitions/MusicEntity" + }, + { + "$ref": "#/definitions/AdditionalEntity" + } + ] + }, + "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" + } + ] + }, + "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" + } + ] + }, + "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": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/ContentRating" + }, + "description": "A list of ContentRating objects, describing the entity's ratings in various rating schemes." + } + } + } + } +} \ No newline at end of file diff --git a/src/schemas/errors.json b/src/schemas/errors.json index c8116a53f..f826bd4f3 100644 --- a/src/schemas/errors.json +++ b/src/schemas/errors.json @@ -1,6 +1,6 @@ { - "$id": "https://meta.comcast.com/firebolt/errors", "title": "Errors", + "$id": "https://meta.rdkcentral.com/firebolt/schemas/errors", "oneOf": [ { "$ref": "#/definitions/FireboltError" }, { "$ref": "#/definitions/UserNotAuthenticatedError" } diff --git a/src/schemas/intents.json b/src/schemas/intents.json index 6fa2a5807..421527282 100644 --- a/src/schemas/intents.json +++ b/src/schemas/intents.json @@ -1,6 +1,6 @@ { - "$id": "https://meta.comcast.com/firebolt/intents", "title": "Intents", + "$id": "https://meta.rdkcentral.com/firebolt/schemas/intents", "oneOf": [ { "$ref": "#/definitions/AppIntentMessage" @@ -243,12 +243,33 @@ { "$ref": "#/definitions/ButtonIntent" }, + { + "$ref": "#/definitions/FocusIntent" + }, + { + "$ref": "#/definitions/SelectIntent" + }, + { + "$ref": "#/definitions/BackIntent" + }, + { + "$ref": "#/definitions/ExitIntent" + }, + { + "$ref": "#/definitions/ChannelIntent" + }, + { + "$ref": "#/definitions/ScrollIntent" + }, { "$ref": "#/definitions/PowerIntent" }, { "$ref": "#/definitions/VolumeIntent" }, + { + "$ref": "#/definitions/MuteIntent" + }, { "$ref": "#/definitions/MicrophoneIntent" }, @@ -257,15 +278,36 @@ }, { "$ref": "#/definitions/TuneIntent" + }, + { + "$ref": "#/definitions/VoiceGuidanceIntent" + }, + { + "$ref": "#/definitions/HighContrastIntent" + }, + { + "$ref": "#/definitions/ScreenMagnificationIntent" } ] }, "PlaybackControlIntent": { "description": "A Firebolt compliant representation of a user intention to control some aspect of in-progress playback.", "anyOf": [ + { + "$ref": "#/definitions/PlayIntent" + }, { "$ref": "#/definitions/PauseIntent" }, + { + "$ref": "#/definitions/ReplayIntent" + }, + { + "$ref": "#/definitions/StopIntent" + }, + { + "$ref": "#/definitions/PlaybackSpeedIntent" + }, { "$ref": "#/definitions/SeekIntent" }, @@ -273,13 +315,16 @@ "$ref": "#/definitions/SkipIntent" }, { - "$ref": "#/definitions/TrickPlayIntent" + "$ref": "#/definitions/FastForwardIntent" + }, + { + "$ref": "#/definitions/RewindIntent" }, { "$ref": "#/definitions/ClosedCaptionsIntent" }, { - "$ref": "#/definitions/AudioDescriptionIntent" + "$ref": "#/definitions/AudioDescriptionsIntent" } ] }, @@ -307,6 +352,9 @@ "action": { "const": "launch" } + }, + "not": { + "required": [ "data" ] } } ], @@ -338,6 +386,9 @@ "action": { "const": "home" } + }, + "not": { + "required": [ "data" ] } } ], @@ -370,32 +421,7 @@ "const": "entity" }, "data": { - "anyOf": [ - { - "$ref": "#/definitions/MovieEntity" - }, - { - "$ref": "#/definitions/TVEpisodeEntity" - }, - { - "$ref": "#/definitions/TVSeriesEntity" - }, - { - "$ref": "#/definitions/TVSeasonEntity" - }, - { - "$ref": "#/definitions/MusicEntity" - }, - { - "$ref": "#/definitions/PlaylistEntity" - }, - { - "$ref": "#/definitions/AdditionalEntity" - }, - { - "$ref": "#/definitions/UntypedEntity" - } - ] + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/Entity" } } } @@ -414,395 +440,31 @@ } ] }, - "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 - }, - "ProgramEntity": { - "title": "ProgramEntity", - "type": "object", - "properties": { - "entityType": { - "const": "program" - }, - "programType": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/ProgramType" - }, - "entityId": { - "type": "string" - } - }, - "required": [ - "entityType", - "programType", - "entityId" - ] - }, - "MusicEntity": { - "title": "MusicEntity", - "type": "object", - "properties": { - "entityType": { - "const": "music" - }, - "musicType": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/MusicType" - }, - "entityId": { - "type": "string" - } - }, - "required": [ - "entityType", - "musicType", - "entityId" - ] - }, - "MovieEntity": { - "title": "MovieEntity", - "allOf": [ - { - "$ref": "#/definitions/ProgramEntity" - }, - { - "description": "A Firebolt compliant representation of a Movie entity.", - "title": "MovieEntity", - "type": "object", - "required": [ - "entityType", - "programType", - "entityId" - ], - "properties": { - "entityType": { - "const": "program" - }, - "programType": { - "const": "movie" - }, - "entityId": { - "$ref": "#/definitions/Identifier" - }, - "assetId": { - "$ref": "#/definitions/Identifier" - }, - "appContentData": { - "type": "string", - "maxLength": 256 - } - }, - "additionalProperties": false - } - ], - "examples": [ - { - "entityType": "program", - "programType": "movie", - "entityId": "el-camino" - } - ] - }, - "TVEpisodeEntity": { - "title": "TVEpisodeEntity", - "allOf": [ - { - "$ref": "#/definitions/ProgramEntity" - }, - { - "description": "A Firebolt compliant representation of a TV Episode entity.", - "title": "TVEpisodeEntity", - "type": "object", - "required": [ - "entityType", - "programType", - "entityId", - "seriesId", - "seasonId" - ], - "properties": { - "entityType": { - "const": "program" - }, - "programType": { - "const": "episode" - }, - "entityId": { - "$ref": "#/definitions/Identifier" - }, - "seriesId": { - "$ref": "#/definitions/Identifier" - }, - "seasonId": { - "$ref": "#/definitions/Identifier" - }, - "assetId": { - "$ref": "#/definitions/Identifier" - }, - "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.", - "allOf": [ - { - "$ref": "#/definitions/ProgramEntity" - }, - { - "type": "object", - "required": [ - "entityType", - "programType", - "entityId", - "seriesId" - ], - "properties": { - "entityType": { - "const": "program" - }, - "programType": { - "const": "season" - }, - "entityId": { - "$ref": "#/definitions/Identifier" - }, - "seriesId": { - "$ref": "#/definitions/Identifier" - }, - "assetId": { - "$ref": "#/definitions/Identifier" - }, - "appContentData": { - "type": "string", - "maxLength": 256 - } - }, - "additionalProperties": false - } - ], - "examples": [ - { - "entityType": "program", - "programType": "season", - "entityId": "breaking-bad-season-1", - "seriesId": "breaking-bad" - } - ] - }, - "TVSeriesEntity": { - "title": "TVSeriesEntity", + "ChannelIntent": { + "description": "A Firebolt compliant representation of a user intent to 'surf' to the next or previous channel.", + "title": "ChannelIntent", "allOf": [ { - "$ref": "#/definitions/ProgramEntity" - }, - { - "description": "A Firebolt compliant representation of a TV Series entity.", - "type": "object", - "required": [ - "entityType", - "programType", - "entityId" - ], - "properties": { - "entityType": { - "const": "program" - }, - "programType": { - "const": "series" - }, - "entityId": { - "$ref": "#/definitions/Identifier" - }, - "assetId": { - "$ref": "#/definitions/Identifier" - }, - "appContentData": { - "type": "string", - "maxLength": 256 - } - }, - "additionalProperties": false - } - ], - "examples": [ - { - "entityType": "program", - "programType": "series", - "entityId": "breaking-bad" - } - ] - }, - "PlaylistEntity": { - "title": "PlaylistEntity", - "description": "A Firebolt compliant representation of a Playlist entity.", - "type": "object", - "required": [ - "entityType", - "entityId" - ], - "properties": { - "entityType": { - "const": "playlist" - }, - "entityId": { - "$ref": "#/definitions/Identifier" - }, - "assetId": { - "$ref": "#/definitions/Identifier" - }, - "appContentData": { - "type": "string", - "maxLength": 256 - } - }, - "additionalProperties": false, - "examples": [ - { - "entityType": "playlist", - "entityId": "playlist/xyz" - } - ] - }, - "PlayableEntity": { - "title": "PlayableEntity", - "anyOf": [ - { - "$ref": "#/definitions/MovieEntity" - }, - { - "$ref": "#/definitions/TVEpisodeEntity" - }, - { - "$ref": "#/definitions/PlaylistEntity" - }, - { - "$ref": "#/definitions/MusicEntity" + "$ref": "#/definitions/Intent" }, { - "$ref": "#/definitions/AdditionalEntity" - } - ] - }, - "AdditionalEntity": { - "title": "AdditionalEntity", - "allOf": [ - { - "$ref": "#/definitions/ProgramEntity" + "$ref": "#/definitions/IntentProperties" }, { - "description": "A Firebolt compliant representation of the remaining entity types.", "type": "object", - "required": [ - "entityType", - "entityId" - ], + "required": [ "data" ], "properties": { - "entityType": { - "const": "program" + "action": { + "const": "channel" }, - "programType": { + "data": { "type": "string", "enum": [ - "concert", - "sportingEvent", - "preview", - "other", - "advertisement", - "musicVideo", - "minisode", - "extra" + "next", + "previous" ] - }, - "entityId": { - "$ref": "#/definitions/Identifier" - }, - "assetId": { - "$ref": "#/definitions/Identifier" - }, - "appContentData": { - "type": "string", - "maxLength": 256 - } - }, - "additionalProperties": false - } - ], - "examples": [ - { - "entityType": "program", - "programType": "concert", - "entityId": "live-aid" - } - ] - }, - "UntypedEntity": { - "title": "UntypedEntity", - "allOf": [ - { - "description": "A Firebolt compliant representation of the remaining entity types.", - "type": "object", - "required": [ - "entityId" - ], - "properties": { - "entityId": { - "$ref": "#/definitions/Identifier" - }, - "assetId": { - "$ref": "#/definitions/Identifier" - }, - "appContentData": { - "type": "string", - "maxLength": 256 } - }, - "additionalProperties": false - } - ], - "examples": [ - { - "entityId": "an-entity" + } } ] }, @@ -833,7 +495,7 @@ "additionalProperties": false, "properties": { "entity": { - "$ref": "#/definitions/ChannelEntity" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/ChannelEntity" }, "options": { "description": "The options property of the data property MUST have only one of the following fields.", @@ -902,7 +564,7 @@ "const": "playback" }, "data": { - "$ref": "#/definitions/PlayableEntity" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/PlayableEntity" } } } @@ -994,7 +656,8 @@ }, "additionalProperties": false } - } + }, + "required": [ "data" ] } ], "examples": [ @@ -1032,7 +695,7 @@ "type": "object", "properties": { "entity": { - "$ref": "#/definitions/PlayableEntity" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/PlayableEntity" }, "options": { "type": "object", @@ -1076,6 +739,7 @@ "type": "object", "properties": { "options": { + "type": "object", "maxProperties": 1 } } @@ -1084,6 +748,7 @@ "type": "object", "properties": { "options": { + "type": "object", "maxProperties": 0 } } @@ -1156,13 +821,13 @@ "programTypes": { "type": "array", "items": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/ProgramType" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/ProgramType" } }, "musicTypes": { "type": "array", "items": { - "$ref": "https://meta.comcast.com/firebolt/entertainment#/definitions/MusicType" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entertainment#/definitions/MusicType" } } }, @@ -1272,7 +937,7 @@ "menus": { "type": "array", "items": { - "$ref": "#/definitions/Identifier" + "type": "string" }, "minItems": 1, "maxItems": 100 @@ -1283,7 +948,7 @@ "type": "object", "properties": { "appId": { - "$ref": "#/definitions/Identifier" + "type": "string" }, "exclude": { "type": "boolean" @@ -1369,19 +1034,19 @@ "entity": { "anyOf": [ { - "$ref": "#/definitions/MovieEntity" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/MovieEntity" }, { - "$ref": "#/definitions/TVEpisodeEntity" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/TVEpisodeEntity" }, { - "$ref": "#/definitions/TVSeriesEntity" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/TVSeriesEntity" }, { - "$ref": "#/definitions/TVSeasonEntity" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/TVSeasonEntity" }, { - "$ref": "#/definitions/AdditionalEntity" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/AdditionalEntity" } ] }, @@ -1391,24 +1056,24 @@ "type": "object", "properties": { "appId": { - "$ref": "#/definitions/Identifier" + "type": "string" }, "entity": { "anyOf": [ { - "$ref": "#/definitions/MovieEntity" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/MovieEntity" }, { - "$ref": "#/definitions/TVEpisodeEntity" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/TVEpisodeEntity" }, { - "$ref": "#/definitions/TVSeriesEntity" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/TVSeriesEntity" }, { - "$ref": "#/definitions/TVSeasonEntity" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/TVSeasonEntity" }, { - "$ref": "#/definitions/AdditionalEntity" + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/entity#/definitions/AdditionalEntity" } ] } @@ -1419,7 +1084,7 @@ "menus": { "type": "array", "items": { - "$ref": "#/definitions/Identifier" + "type": "string" }, "minItems": 1, "maxItems": 100 @@ -1430,7 +1095,7 @@ "type": "object", "properties": { "appId": { - "$ref": "#/definitions/Identifier" + "type": "string" }, "exclude": { "type": "boolean" @@ -1487,9 +1152,9 @@ } ] }, - "ButtonIntent": { - "description": "A Firebolt compliant representation of a user intention to interact with their device in a way analogous to pressing one of the remote buttons.", - "title": "ButtonIntent", + "FocusIntent": { + "description": "A Firebolt compliant representation of a user intention to interact with their device in a way analogous to pressing remote directional pad buttons.", + "title": "FocusIntent", "allOf": [ { "$ref": "#/definitions/Intent" @@ -1499,30 +1164,24 @@ }, { "type": "object", + "required": [ "data" ], "properties": { "action": { - "const": "button" + "const": "focus" }, "data": { "type": "object", "required": [ - "operation" + "direction" ], "properties": { - "operation": { + "direction": { "type": "string", "enum": [ - "down", "up", - "prev", - "next", - "enter", - "exit", - "info", - "menu", - "back", - "cancel", - "record" + "down", + "left", + "right" ] } }, @@ -1533,9 +1192,9 @@ ], "examples": [ { - "action": "button", + "action": "focus", "data": { - "operation": "menu" + "direction": "up" }, "context": { "source": "voice" @@ -1543,9 +1202,9 @@ } ] }, - "VolumeIntent": { - "description": "A Firebolt compliant representation of a user intention to change the device volume.", - "title": "VolumeIntent", + "SelectIntent": { + "description": "A Firebolt compliant representation of a user intention to interact with their device in a way analogous to pressing the remote 'select' button.", + "title": "SelectIntent", "allOf": [ { "$ref": "#/definitions/Intent" @@ -1557,79 +1216,88 @@ "type": "object", "properties": { "action": { - "const": "volume" - }, - "data": { - "anyOf": [ - { - "type": "object", - "properties": { - "value": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "toggle": { - "const": true - } - }, - "minProperties": 1, - "maxProperties": 1, - "additionalProperties": false - }, - { - "type": "object", - "properties": { - "value": { - "type": "number", - "minimum": 0, - "maximum": 1 - }, - "relative": { - "const": true - } - }, - "additionalProperties": false - } - ] + "const": "select" } + }, + "not": { + "required": [ "data" ] } } ], "examples": [ { - "action": "volume", - "data": { - "toggle": true - }, + "action": "select", "context": { "source": "voice" } + } + ] + }, + "BackIntent": { + "description": "A Firebolt compliant representation of a user intention to interact with their device in a way analogous to pressing the remote 'back' button.", + "title": "BackIntent", + "allOf": [ + { + "$ref": "#/definitions/Intent" }, { - "action": "volume", - "data": { - "value": 0.7 + "$ref": "#/definitions/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "back" + } }, + "not": { + "required": [ "data" ] + } + } + ], + "examples": [ + { + "action": "back", "context": { "source": "voice" } + } + ] + }, + "ExitIntent": { + "description": "A Firebolt compliant representation of a user intention to interact with their device in a way analogous to pressing the remote 'back' button.", + "title": "ExitIntent", + "allOf": [ + { + "$ref": "#/definitions/Intent" }, { - "action": "volume", - "data": { - "value": 0.1, - "relative": true + "$ref": "#/definitions/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "exit" + } }, + "not": { + "required": [ "data" ] + } + } + ], + "examples": [ + { + "action": "exit", "context": { "source": "voice" } } ] - }, - "PowerIntent": { - "description": "A Firebolt compliant representation of a user intention to turn their device on or off.", - "title": "PowerIntent", + }, + "ScrollIntent": { + "description": "A Firebolt compliant representation of a user intention to interact with their device in a way analogous to pressing remote directional pad buttons.", + "title": "ScrollIntent", "allOf": [ { "$ref": "#/definitions/Intent" @@ -1639,30 +1307,101 @@ }, { "type": "object", + "required": [ "data" ], "properties": { "action": { - "const": "power" + "const": "scroll" }, "data": { - "$ref": "#/definitions/BooleanToggle" + "type": "object", + "required": [ + "direction" + ], + "properties": { + "direction": { + "type": "string", + "enum": [ + "up", + "down", + "left", + "right" + ] + }, + "unit": { + "type": "string", + "enum": [ + "line", + "page", + "percent" + ] + } + }, + "additionalProperties": false } } } ], "examples": [ { - "action": "power", + "action": "scroll", "data": { - "value": false + "direction": "up" }, "context": { "source": "voice" } + } + ] + }, + "ButtonIntent": { + "description": "A Firebolt compliant representation of a user intention to interact with their device in a way analogous to pressing one of the remote buttons.", + "title": "ButtonIntent", + "allOf": [ + { + "$ref": "#/definitions/Intent" }, { - "action": "power", + "$ref": "#/definitions/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "button" + }, + "data": { + "type": "object", + "required": [ + "operation" + ], + "properties": { + "operation": { + "type": "string", + "enum": [ + "down", + "up", + "prev", + "next", + "enter", + "exit", + "info", + "menu", + "back", + "cancel", + "record" + ] + } + }, + "additionalProperties": false + } + } + } + ], + "examples": [ + { + "action": "button", "data": { - "toggle": true + "operation": "menu" }, "context": { "source": "voice" @@ -1670,9 +1409,9 @@ } ] }, - "MicrophoneIntent": { - "description": "A Firebolt compliant representation of a user intention to turn their microphone on or off.", - "title": "MicrophoneIntent", + "VolumeIntent": { + "description": "A Firebolt compliant representation of a user intention to change the device volume.", + "title": "VolumeIntent", "allOf": [ { "$ref": "#/definitions/Intent" @@ -1684,28 +1423,60 @@ "type": "object", "properties": { "action": { - "const": "microphone" + "const": "volume" }, "data": { - "$ref": "#/definitions/BooleanToggle" + "type": "object", + "properties": { + "value": { + "type": "number" + }, + "relative": { + "const": true + } + }, + "required": [ "value" ], + "if": { + "required": [ "relative" ] + }, + "then": { + "properties": { + "value": { + "type": "number", + "minimum": -50, + "maximum": 50 + } + } + }, + "else": { + "properties": { + "value": { + "type": "number", + "minimum": 0, + "maximum": 100 + } + } + }, + "additionalProperties": false } } } ], "examples": [ { - "action": "microphone", + "action": "volume", "data": { - "value": false + "value": 70 }, "context": { "source": "voice" } }, { - "action": "microphone", + "action": "volume", "data": { - "toggle": true + "value": 10, + "relative": true }, "context": { "source": "voice" @@ -1713,9 +1484,9 @@ } ] }, - "InputIntent": { - "description": "A Firebolt compliant representation of a user intention to change which video input is active.", - "title": "InputIntent", + "MuteIntent": { + "description": "A Firebolt compliant representation of a user intention to mute or unmute the device.", + "title": "MuteIntent", "allOf": [ { "$ref": "#/definitions/Intent" @@ -1727,49 +1498,28 @@ "type": "object", "properties": { "action": { - "const": "input" + "const": "mute" }, "data": { - "type": "object", - "required": [ - "interface" - ], - "properties": { - "interface": { - "type": "string", - "enum": [ - "hdmi", - "rca", - "vga", - "etc..." - ] - }, - "number": { - "type": "integer", - "minimum": 1, - "maximum": 100 - } - }, - "additionalProperties": false + "$ref": "#/definitions/BooleanToggle" } } } ], "examples": [ { - "action": "input", + "action": "mute", "data": { - "interface": "hdmi" + "value": false }, "context": { "source": "voice" } }, { - "action": "input", + "action": "mute", "data": { - "interface": "hdmi", - "number": 1 + "toggle": true }, "context": { "source": "voice" @@ -1777,9 +1527,9 @@ } ] }, - "PauseIntent": { - "description": "A Firebolt compliant representation of a user intention to pause/unpause in-progress playback.", - "title": "PauseIntent", + "PowerIntent": { + "description": "A Firebolt compliant representation of a user intention to turn their device on or off.", + "title": "PowerIntent", "allOf": [ { "$ref": "#/definitions/Intent" @@ -1791,28 +1541,529 @@ "type": "object", "properties": { "action": { - "const": "pause" + "const": "power" }, "data": { - "$ref": "#/definitions/BooleanToggle" + "type": "object", + "properties": { + "value": { + "type": "boolean" + }, + "toggle": { + "const": true + }, + "delay": { + "type": "integer", + "minimum": 0 + } + }, + "if": { + "required": [ "value" ] + }, + "then": { + "not": { + "required": [ "toggle" ] + } + }, + "else": { + "required": [ "toggle" ] + }, + "additionalProperties": false + } + } + } + ], + "examples": [ + { + "action": "power", + "data": { + "value": false + }, + "context": { + "source": "voice" + } + }, + { + "action": "power", + "data": { + "toggle": true + }, + "context": { + "source": "voice" + } + }, + { + "action": "power", + "data": { + "value": false, + "delay": 900 + }, + "context": { + "source": "voice" + } + } + ] + }, + "MicrophoneIntent": { + "description": "A Firebolt compliant representation of a user intention to turn their microphone on or off.", + "title": "MicrophoneIntent", + "allOf": [ + { + "$ref": "#/definitions/Intent" + }, + { + "$ref": "#/definitions/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "microphone" + }, + "data": { + "$ref": "#/definitions/BooleanToggle" + } + } + } + ], + "examples": [ + { + "action": "microphone", + "data": { + "value": false + }, + "context": { + "source": "voice" + } + }, + { + "action": "microphone", + "data": { + "toggle": true + }, + "context": { + "source": "voice" + } + } + ] + }, + "InputIntent": { + "description": "A Firebolt compliant representation of a user intention to change which video input is active.", + "title": "InputIntent", + "allOf": [ + { + "$ref": "#/definitions/Intent" + }, + { + "$ref": "#/definitions/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "input" + }, + "data": { + "type": "object", + "required": [ + "interface" + ], + "properties": { + "interface": { + "type": "string", + "enum": [ + "hdmi" + ] + }, + "number": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + "additionalProperties": false + } + } + } + ], + "examples": [ + { + "action": "input", + "data": { + "interface": "hdmi" + }, + "context": { + "source": "voice" + } + }, + { + "action": "input", + "data": { + "interface": "hdmi", + "number": 1 + }, + "context": { + "source": "voice" + } + } + ] + }, + "PauseIntent": { + "description": "A Firebolt compliant representation of a user intention to pause in-progress playback.", + "title": "PauseIntent", + "allOf": [ + { + "$ref": "#/definitions/Intent" + }, + { + "$ref": "#/definitions/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "pause" + } + } + } + ], + "examples": [ + { + "action": "pause", + "context": { + "source": "voice" + } + } + ] + }, + "PlayIntent": { + "description": "A Firebolt compliant representation of a user intention to play/resume content.", + "title": "PlayIntent", + "allOf": [ + { + "$ref": "#/definitions/Intent" + }, + { + "$ref": "#/definitions/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "play" + } + } + } + ], + "examples": [ + { + "action": "play", + "context": { + "source": "voice" + } + } + ] + }, + "ReplayIntent": { + "description": "A Firebolt compliant representation of a user intention to replay content.", + "title": "ReplayIntent", + "allOf": [ + { + "$ref": "#/definitions/Intent" + }, + { + "$ref": "#/definitions/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "replay" + } + } + } + ], + "examples": [ + { + "action": "replay", + "context": { + "source": "voice" + } + } + ] + }, + "StopIntent": { + "description": "A Firebolt compliant representation of a user intention to stop content.", + "title": "StopIntent", + "allOf": [ + { + "$ref": "#/definitions/Intent" + }, + { + "$ref": "#/definitions/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "stop" + } + } + } + ], + "examples": [ + { + "action": "stop", + "context": { + "source": "voice" + } + } + ] + }, + "PlaybackSpeedIntent": { + "description": "A Firebolt compliant representation of a user intention to change the speed of in-progress playback.", + "title": "PlaybackSpeedIntent", + "allOf": [ + { + "$ref": "#/definitions/Intent" + }, + { + "$ref": "#/definitions/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "speed" + }, + "data": { + "type": "object", + "properties": { + "value": { + "type": "number", + "exclusiveMinimum": 0, + "maximum": 4 + }, + "toggle": { + "type": "boolean" + } + }, + "minProperties": 1, + "maxProperties": 1, + "additionalProperties": false + } + } + } + ], + "examples": [ + { + "action": "speed", + "data": { + "value": 2 + }, + "context": { + "source": "voice" + } + }, + { + "action": "speed", + "data": { + "toggle": true + }, + "context": { + "source": "voice" + } + } + ] + }, + "FastForwardIntent": { + "description": "A Firebolt compliant representation of a user intention to fast-forward in-progress playback.", + "title": "FastForwardIntent", + "allOf": [ + { + "$ref": "#/definitions/Intent" + }, + { + "$ref": "#/definitions/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "fast-forward" + }, + "data": { + "type": "object", + "properties": { + "speed": { + "type": "number", + "exclusiveMinimum": 0, + "maximum": 10 + } + } + } + } + } + ], + "examples": [ + { + "action": "fast-forward", + "data": { + "speed": 2 + }, + "context": { + "source": "voice" + } + }, + { + "action": "fast-forward", + "data": { + "speed": 0.5 + }, + "context": { + "source": "voice" + } + }, + { + "action": "fast-forward", + "context": { + "source": "voice" + } + } + ] + }, + "RewindIntent": { + "description": "A Firebolt compliant representation of a user intention to rewind in-progress playback.", + "title": "RewindIntent", + "allOf": [ + { + "$ref": "#/definitions/Intent" + }, + { + "$ref": "#/definitions/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "rewind" + }, + "data": { + "type": "object", + "properties": { + "speed": { + "type": "number", + "exclusiveMinimum": 0, + "maximum": 10 + } + } + } + } + } + ], + "examples": [ + { + "action": "rewind", + "data": { + "speed": 2 + }, + "context": { + "source": "voice" + } + }, + { + "action": "rewind", + "data": { + "speed": 0.5 + }, + "context": { + "source": "voice" + } + }, + { + "action": "rewind", + "context": { + "source": "voice" + } + } + ] + }, + "SeekIntent": { + "description": "A Firebolt compliant representation of a user intention to seek to a different time for in-progress playback.", + "title": "SeekIntent", + "allOf": [ + { + "$ref": "#/definitions/Intent" + }, + { + "$ref": "#/definitions/IntentProperties" + }, + { + "type": "object", + "properties": { + "action": { + "const": "seek" + }, + "data": { + "allOf": [ + { + "$ref": "#/definitions/DirectionalOperation" + }, + { + "type": "object", + "properties": { + "seconds": { + "type": "number" + }, + "relative": { + "const": true + } + }, + "required": [ "seconds" ], + "if": { + "not": { + "required": [ "relative" ] + } + }, + "then": { + "properties": { + "seconds": { + "type": "number", + "minimum": 0, + "maximum": 86400 + } + } + }, + "else": { + "properties": { + "seconds": { + "type": "number", + "minimum": -43200, + "maximum": 43200 + } + } + } + } + ] } } } ], "examples": [ { - "action": "pause", + "action": "seek", "data": { - "value": false + "seconds": 300 }, "context": { "source": "voice" } }, { - "action": "pause", + "action": "seek", "data": { - "toggle": true + "relative": true, + "seconds": -30 }, "context": { "source": "voice" @@ -1820,9 +2071,9 @@ } ] }, - "PlaybackSpeedIntent": { - "description": "A Firebolt compliant representation of a user intention to change the speed of in-progress playback.", - "title": "PlaybackSpeedIntent", + "SkipIntent": { + "description": "A Firebolt compliant representation of a user intention to skip a scene/chapter/ad during in-progress playback.", + "title": "SkipIntent", "allOf": [ { "$ref": "#/definitions/Intent" @@ -1834,41 +2085,50 @@ "type": "object", "properties": { "action": { - "const": "speed" + "const": "skip" }, "data": { - "type": "object", - "properties": { - "value": { - "type": "number", - "exclusiveMinimum": 0, - "maximum": 4 + "allOf": [ + { + "$ref": "#/definitions/DirectionalOperation" }, - "toggle": { - "type": "boolean" + { + "type": "object", + "properties": { + "count": { + "type": "number", + "exclusiveMinimum": 0, + "maximum": 100 + } + }, + "propertyNames": { + "enum": [ + "direction", + "count" + ] + } } - }, - "minProperties": 1, - "maxProperties": 1, - "additionalProperties": false + ] } } } ], "examples": [ { - "action": "speed", + "action": "skip", "data": { - "value": 2 + "direction": "forward", + "count": 1 }, "context": { "source": "voice" } }, { - "action": "speed", + "action": "skip", "data": { - "toggle": true + "direction": "backward", + "count": 1 }, "context": { "source": "voice" @@ -1876,9 +2136,9 @@ } ] }, - "TrickPlayIntent": { - "description": "A Firebolt compliant representation of a user intention to fast-forward or rewind in-progress playback.", - "title": "TrickPlayIntent", + "ClosedCaptionsIntent": { + "description": "A Firebolt compliant representation of a user intention to enable/disable closed captions.", + "title": "ClosedCaptionsIntent", "allOf": [ { "$ref": "#/definitions/Intent" @@ -1890,50 +2150,28 @@ "type": "object", "properties": { "action": { - "const": "trickplay" + "const": "closed-captions" }, "data": { - "allOf": [ - { - "$ref": "#/definitions/DirectionalOperation" - }, - { - "type": "object", - "properties": { - "speed": { - "type": "number", - "exclusiveMinimum": 0, - "maximum": 10 - } - }, - "propertyNames": { - "enum": [ - "direction", - "speed" - ] - } - } - ] + "$ref": "#/definitions/BooleanToggle" } } } ], "examples": [ { - "action": "trickplay", + "action": "closed-captions", "data": { - "direction": "forward", - "speed": 2 + "value": false }, "context": { "source": "voice" } }, { - "action": "trickplay", + "action": "closed-captions", "data": { - "direction": "backward", - "speed": 2 + "toggle": true }, "context": { "source": "voice" @@ -1941,9 +2179,9 @@ } ] }, - "SeekIntent": { - "description": "A Firebolt compliant representation of a user intention to seek to a different time for in-progress playback.", - "title": "SeekIntent", + "VoiceGuidanceIntent": { + "description": "A Firebolt compliant representation of a user intention to enable/disable voice guidance.", + "title": "VoiceGuidanceIntent", "allOf": [ { "$ref": "#/definitions/Intent" @@ -1955,59 +2193,100 @@ "type": "object", "properties": { "action": { - "const": "seek" + "const": "voice-guidance" }, "data": { - "allOf": [ - { - "$ref": "#/definitions/DirectionalOperation" + "type": "object", + "properties": { + "value": { + "type": "boolean" }, - { - "type": "object", + "toggle": { + "const": true + }, + "speed": { + "type": "integer" + }, + "relative": { + "const": true + }, + "verbosity": { + "type": "string", + "enum": [ + "low", + "hight" + ] + } + }, + "if": { + "required": [ "value" ] + }, + "then": { + "not": { + "required": [ "toggle" ] + }, + "if": { + "required": [ "relative" ] + }, + "then": { "properties": { - "seconds": { - "type": "number", - "minimum": 0, - "maximum": 1800 + "speed": { + "type": "integer", + "minimum": -10, + "maximum": 10 + } + } + }, + "else": { + "properties": { + "speed": { + "type": "integer", + "exclusiveMinimum": 0, + "maximum": 10 } - }, - "propertyNames": { - "enum": [ - "direction", - "seconds" - ] } } - ] + }, + "else": { + "if": { + "required": [ "toggle" ] + }, + "then": { + "not": { + "required": [ "value" ] + } + } + }, + "additionalProperties": false } } } ], "examples": [ { - "action": "seek", + "action": "voice-guidance", "data": { - "seconds": 300 + "value": true, + "verbosity": "low" }, "context": { "source": "voice" } }, { - "action": "seek", + "action": "voice-guidance", "data": { - "direction": "forward", - "seconds": 30 + "speed": -1, + "relative": true }, "context": { "source": "voice" } - }, + }, { - "action": "seek", + "action": "voice-guidance", "data": { - "direction": "backward", - "seconds": 30 + "toggle": true }, "context": { "source": "voice" @@ -2015,9 +2294,9 @@ } ] }, - "SkipIntent": { - "description": "A Firebolt compliant representation of a user intention to skip a scene/chapter/ad during in-progress playback.", - "title": "SkipIntent", + "AudioDescriptionsIntent": { + "description": "A Firebolt compliant representation of a user intention to enable/disable audio descriptions.", + "title": "AudioDescriptionsIntent", "allOf": [ { "$ref": "#/definitions/Intent" @@ -2029,50 +2308,61 @@ "type": "object", "properties": { "action": { - "const": "skip" + "const": "audio-descriptions" }, "data": { - "allOf": [ - { - "$ref": "#/definitions/DirectionalOperation" + "type": "object", + "properties": { + "value": { + "type": "boolean" }, - { - "type": "object", - "properties": { - "count": { - "type": "number", - "exclusiveMinimum": 0, - "maximum": 100 - } - }, - "propertyNames": { - "enum": [ - "direction", - "count" - ] - } + "toggle": { + "const": true + }, + "language": { + "$ref": "https://meta.rdkcentral.com/firebolt/schemas/localization#/definitions/ISO639_2Language" } - ] + }, + "if": { + "required": [ "value" ] + }, + "then": { + "not": { + "required": [ "toggle" ] + } + }, + "else": { + "required": [ "toggle" ] + }, + "additionalProperties": false } } } ], "examples": [ { - "action": "skip", + "action": "audio-descriptions", "data": { - "direction": "forward", - "count": 1 + "value": false }, "context": { "source": "voice" } }, { - "action": "skip", + "action": "audio-descriptions", "data": { - "direction": "backward", - "count": 1 + "toggle": true + }, + "context": { + "source": "voice" + } + }, + { + "action": "audio-descriptions", + "data": { + "value": true, + "language": "eng" }, "context": { "source": "voice" @@ -2080,9 +2370,9 @@ } ] }, - "ClosedCaptionsIntent": { - "description": "A Firebolt compliant representation of a user intention to enable/disable closed captions.", - "title": "ClosedCaptionsIntent", + "HighContrastIntent": { + "description": "A Firebolt compliant representation of a user intention to enable or disable high contrast mode.", + "title": "HighContrastIntent", "allOf": [ { "$ref": "#/definitions/Intent" @@ -2094,7 +2384,7 @@ "type": "object", "properties": { "action": { - "const": "closedcaptions" + "const": "high-contrast" }, "data": { "$ref": "#/definitions/BooleanToggle" @@ -2104,7 +2394,7 @@ ], "examples": [ { - "action": "closedcaptions", + "action": "high-contrast", "data": { "value": false }, @@ -2113,7 +2403,7 @@ } }, { - "action": "closedcaptions", + "action": "high-contrast", "data": { "toggle": true }, @@ -2122,10 +2412,10 @@ } } ] - }, - "AudioDescriptionIntent": { - "description": "A Firebolt compliant representation of a user intention to enable/disable audio descriptions.", - "title": "AudioDescriptionIntent", + }, + "ScreenMagnificationIntent": { + "description": "A Firebolt compliant representation of a user intention to turn screen magnification on or off.", + "title": "ScreenMagnificationIntent", "allOf": [ { "$ref": "#/definitions/Intent" @@ -2137,17 +2427,40 @@ "type": "object", "properties": { "action": { - "const": "audiodescriptions" + "const": "screen-magnification" }, "data": { - "$ref": "#/definitions/BooleanToggle" + "type": "object", + "properties": { + "value": { + "type": "boolean" + }, + "toggle": { + "const": true + }, + "scale": { + "type": "number", + "minimum": 1, + "maximum": 10 + } + }, + "if": { + "required": [ + "toggle" + ] + }, + "then": { + "type": "object", + "maxProperties": 1 + }, + "additionalProperties": false } } } ], "examples": [ { - "action": "audiodescriptions", + "action": "screen-magnification", "data": { "value": false }, @@ -2156,14 +2469,33 @@ } }, { - "action": "audiodescriptions", + "action": "screen-magnification", + "data": { + "value": true, + "scale": 2.5 + }, + "context": { + "source": "voice" + } + }, + { + "action": "screen-magnification", "data": { "toggle": true }, "context": { "source": "voice" } - } + }, + { + "action": "screen-magnification", + "data": { + "value": false + }, + "context": { + "source": "voice" + } + } ] }, "MessageIntent": { @@ -2205,6 +2537,7 @@ } ] }, + "Identifier": { "type": "string" }, @@ -2229,7 +2562,7 @@ "type": "string" }, "appId": { - "$ref": "#/definitions/Identifier" + "type": "string" } } }, diff --git a/src/schemas/lifecycle.json b/src/schemas/lifecycle.json new file mode 100644 index 000000000..d4de17f95 --- /dev/null +++ b/src/schemas/lifecycle.json @@ -0,0 +1,38 @@ +{ + "title": "Lifecycle", + "$id": "https://meta.rdkcentral.com/firebolt/schemas/lifecycle", + "oneOf": [ + { + "$ref": "#/definitions/LifecycleState" + }, + { + "$ref": "#/definitions/CloseReason" + } + ], + "definitions": { + "LifecycleState": { + "title": "LifecycleState", + "description": "The application lifecycle state", + "type": "string", + "enum": [ + "initializing", + "inactive", + "foreground", + "background", + "unloading", + "suspended" + ] + }, + "CloseReason": { + "title": "CloseReason", + "description": "The application close reason", + "type": "string", + "enum": [ + "remoteButton", + "userExit", + "done", + "error" + ] + } + } + } diff --git a/src/schemas/localization.json b/src/schemas/localization.json index 1bc606672..0e6d17471 100644 --- a/src/schemas/localization.json +++ b/src/schemas/localization.json @@ -1,6 +1,6 @@ { - "$id": "https://meta.comcast.com/firebolt/localization", "title": "Localization", + "$id": "https://meta.rdkcentral.com/firebolt/schemas/localization", "oneOf": [ { "$ref": "#/definitions/Locality" diff --git a/src/schemas/secondscreen.json b/src/schemas/secondscreen.json index 03ce1593b..9a44c6824 100644 --- a/src/schemas/secondscreen.json +++ b/src/schemas/secondscreen.json @@ -1,6 +1,6 @@ { - "$id": "https://meta.comcast.com/firebolt/secondscreen", "title": "SecondScreen", + "$id": "https://meta.rdkcentral.com/firebolt/schemas/secondscreen", "anyOf": [ { "$ref": "#/definitions/SecondScreenEvent" } ], diff --git a/src/schemas/types.json b/src/schemas/types.json new file mode 100644 index 000000000..ba9233d41 --- /dev/null +++ b/src/schemas/types.json @@ -0,0 +1,194 @@ +{ + "title": "Types", + "$id": "https://meta.rdkcentral.com/firebolt/schemas/types", + "definitions": { + "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 + }, + "AudioProfile": { + "title": "AudioProfile", + "type": "string", + "enum": [ + "stereo", + "dolbyDigital5.1", + "dolbyDigital7.1", + "dolbyDigital5.1+", + "dolbyDigital7.1+", + "dolbyAtmos" + ] + }, + "BooleanMap": { + "title": "BooleanMap", + "type": "object", + "additionalProperties": { + "type": "boolean" + } + }, + "FlatMap": { + "type": "object", + "additionalProperties": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "number" + }, + { + "type": "boolean" + } + ] + } + }, + "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" + } + ] + }, + "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" + } + } + }, + "ProviderResponse": { + "title": "ProviderResponse", + "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" + }, + "result": { + "description": "The result of the provider response." + } + } + }, + "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 + }, + "Dimensions": { + "type": "object", + "properties": { + "width": { + "type": "integer", + "minimum": 1 + }, + "height": { + "type": "integer", + "minimum": 1 + } + }, + "required": [ "width", "height" ] + }, + "Image": { + "type": "object", + "properties": { + "uri": { + "description": "URI for the image. May be a relative path (e.g. ./foo/image.png) or absolute (e.g. https://foo.com/bar.png) depending on usage.", + "type": "string" + }, + "aspectRatio": { + "description": "The aspect ratio of the image", + "type": "string", + "pattern": "^\\d+x\\d+" + }, + "description": { + "description": "Description of the image.", + "type": "string" + }, + "type": { + "description": "The type of the image.", + "type": "string", + "enum": [ + "icon", "poster", "banner", "splash", "hero" + ] + } + }, + "required": [ + "uri", "aspectRatio", "type" + ] + } + } +} \ No newline at end of file diff --git a/src/sdks/core/package.json b/src/sdks/core/package.json index b97be4a3f..15abb1f23 100644 --- a/src/sdks/core/package.json +++ b/src/sdks/core/package.json @@ -1,6 +1,6 @@ { "name": "@firebolt-js/sdk", - "version": "1.2.0-next.2", + "version": "1.2.0-next.5", "description": "The Firebolt JS SDK", "main": "./dist/lib/firebolt.mjs", "types": "./dist/lib/firebolt.d.ts", @@ -9,19 +9,16 @@ }, "type": "module", "scripts": { - "validate": "npx firebolt-openrpc validate --input ./dist/firebolt-core-open-rpc.json", - "sdk": "npx firebolt-openrpc sdk --input ./dist/firebolt-core-open-rpc.json --template ./src/js --output ./build/javascript/src --static-module Platform", - "native": "npx firebolt-openrpc sdk --input ./dist/firebolt-core-open-rpc.json --template ./src/cpp --output ./build/c/src --static-module Platform --language ../../../node_modules/@firebolt-js/openrpc/languages/c", - "cpp": "npm run cpp:compile && npm run cpp:install", - "cpp:compile": "npx firebolt-openrpc sdk --input ./dist/firebolt-core-open-rpc.json --template ./src/cpp --output ./build/cpp/src --static-module Platform --language ../../../node_modules/@firebolt-js/openrpc/languages/cpp", - "cpp:install": "./build/cpp/src/scripts/install.sh -i ./build/cpp/src -s ./build/cpp/src/ -m core", + "validate": "npx firebolt-openrpc validate --input ./dist/firebolt-open-rpc.json", + "sdk": "npx firebolt-openrpc sdk --server ./dist/firebolt-open-rpc.json --template ./src/js --output ./build/javascript/src", + "native": "npx firebolt-openrpc sdk --server ./dist/firebolt-open-rpc.json --client ./dist/firebolt-app-open-rpc.json --template ./src/cpp --output ./build/c/src --static-module Platform --language ../../../node_modules/@firebolt-js/openrpc/languages/cpp", "compile": "cd ../../.. && npm run compile", - "slice": "npx firebolt-openrpc slice -i ../../../dist/firebolt-open-rpc.json --sdk ./sdk.config.json -o ./dist/firebolt-core-open-rpc.json", - "docs": "npx firebolt-openrpc docs --input ./dist/firebolt-core-open-rpc.json --output build/docs/markdown --as-path", - "wiki": "npx firebolt-openrpc docs --input ./dist/firebolt-core-open-rpc.json --output build/docs/markdown", + "slice": "npx firebolt-openrpc slice -i ../../../dist/firebolt-open-rpc.json --sdk ./sdk.config.json -o ./dist/firebolt-open-rpc.json", + "docs": "npx firebolt-openrpc docs --server ./dist/firebolt-open-rpc.json --output build/docs/markdown --as-path", + "wiki": "npx firebolt-openrpc docs --server ./dist/firebolt-open-rpc.json --output build/docs/markdown", "dist:notest": "npm run clean && npm run slice && npm run validate && npm run sdk && npm run docs && npm run prettier && npm run dist:copy && echo 'Firebolt Core SDK /dist/ is ready.\n'", "dist:copy": "npm run dist:copy:sdk && npm run dist:copy:docs", - "dist:copy:sdk": "mkdirp ./dist && cp -R build/javascript/src dist/lib && cp ./dist/firebolt-core-open-rpc.json ../../../dist/firebolt-core-open-rpc.json", + "dist:copy:sdk": "mkdirp ./dist && cp -R build/javascript/src dist/lib && cp ./dist/firebolt-open-rpc.json ../../../dist/firebolt-core-open-rpc.json", "dist:copy:docs": "mkdirp ./dist && cp -R build/docs/markdown dist/docs", "dist": "npm run dist:notest && npm run test", "clean": "rm -rf ./build && rm -rf ./dist", diff --git a/src/sdks/core/sdk.config.json b/src/sdks/core/sdk.config.json index f406f8bea..14ba4d55c 100644 --- a/src/sdks/core/sdk.config.json +++ b/src/sdks/core/sdk.config.json @@ -69,7 +69,8 @@ ], "provide": [ "xrn:firebolt:capability:discovery:entity-info", - "xrn:firebolt:capability:discovery:purchased-content" + "xrn:firebolt:capability:discovery:purchased-content", + "xrn:firebolt:capability:discovery:interest" ] }, { diff --git a/src/sdks/core/src/js/sdk/Device/index.mjs b/src/sdks/core/src/js/sdk/Device/index.mjs index 86f9fb39a..ed129a42c 100644 --- a/src/sdks/core/src/js/sdk/Device/index.mjs +++ b/src/sdks/core/src/js/sdk/Device/index.mjs @@ -22,7 +22,7 @@ function version() { return new Promise( (resolve, reject) => { - Transport.send('device', 'version').then( v => { + Gateway.request('Device.version').then( v => { v = v || {} v.sdk = v.sdk || {} v.sdk.major = parseInt('${major}') @@ -41,7 +41,7 @@ function version() { export default { /* ${EVENTS_ENUM} */ - /* ${ENUMS} */ + /* ${ENUM_IMPLEMENTATIONS} */ version, /* ${METHOD_LIST} */ diff --git a/src/sdks/core/src/js/sdk/Lifecycle/defaults.mjs b/src/sdks/core/src/js/sdk/Lifecycle/defaults.mjs index 324d4267a..38a16c72c 100644 --- a/src/sdks/core/src/js/sdk/Lifecycle/defaults.mjs +++ b/src/sdks/core/src/js/sdk/Lifecycle/defaults.mjs @@ -16,16 +16,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -import MockTransport from '../Transport/MockTransport.mjs' +import Gateway from '../Gateway/index.mjs' -let inactive = 0 /* ${EXAMPLE:onInactive} */ -let foreground = 0 /* ${EXAMPLE:onForeground} */ -let background = 0 /* ${EXAMPLE:onBackground} */ -let suspended = 0 /* ${EXAMPLE:onSuspended} */ -let unloading = 0 /* ${EXAMPLE:onUnloading} */ +let inactive = { previous: '', state: 'inactive' } +let foreground = { previous: '', state: 'foreground' } +let unloading = { previous: '', state: 'unloading' } const emit = (value) => { - MockTransport.event('Lifecycle', value.state, value) + Gateway.simulate(`Lifecycle.${value.state}`, value) } const win = typeof window !== 'undefined' ? window : {} diff --git a/src/sdks/core/src/js/sdk/Lifecycle/index.mjs b/src/sdks/core/src/js/sdk/Lifecycle/index.mjs index e0184ff91..02a723137 100644 --- a/src/sdks/core/src/js/sdk/Lifecycle/index.mjs +++ b/src/sdks/core/src/js/sdk/Lifecycle/index.mjs @@ -31,10 +31,10 @@ export const store = { async function ready() { let readyRes; - await prioritize('Lifecycle', (event, value) => { + prioritize('Lifecycle', (event, value) => { store._current = event }) - readyRes =await Transport.send('lifecycle', 'ready', {}) + readyRes = await Gateway.request('Lifecycle.ready', {}) setTimeout(_ => { logReady() }) @@ -49,7 +49,7 @@ function state() { function finished() { if (store.current === 'unloading') { - return Transport.send('lifecycle', 'finished') + return Gateway.request('Lifecycle.finished') } else { throw 'Cannot call finished() except when in the unloading transition' } @@ -60,7 +60,7 @@ export default { /* ${EVENTS_ENUM} */ - /* ${ENUMS} */ + /* ${ENUM_IMPLEMENTATIONS} */ ready, state, diff --git a/src/sdks/core/src/js/sdk/Metrics/index.mjs b/src/sdks/core/src/js/sdk/Metrics/index.mjs index 630914358..86499a2da 100644 --- a/src/sdks/core/src/js/sdk/Metrics/index.mjs +++ b/src/sdks/core/src/js/sdk/Metrics/index.mjs @@ -21,15 +21,15 @@ /* ${INITIALIZATION} */ function ready() { - return Transport.send('metrics', 'ready', {}) + return Gateway.request('Metrics.ready', {}) } function signIn() { - return Transport.send('metrics', 'signIn', {}) + return Gateway.request('Metrics.signIn', {}) } function signOut() { - return Transport.send('metrics', 'signOut', {}) + return Gateway.request('Metrics.signOut', {}) } @@ -38,7 +38,7 @@ function signOut() { export default { /* ${EVENTS_ENUM} */ - /* ${ENUMS} */ + /* ${ENUM_IMPLEMENTATIONS} */ /* ${METHOD_LIST} */ } diff --git a/src/sdks/core/test/suite/declarations.test.ts b/src/sdks/core/test/suite/declarations.test.ts index 8ec319eeb..744c2dbbc 100644 --- a/src/sdks/core/test/suite/declarations.test.ts +++ b/src/sdks/core/test/suite/declarations.test.ts @@ -67,7 +67,7 @@ test('entityInfo pull', () => { return Promise.resolve(result) }) - Setup.emit('discovery', 'pullEntityInfo', { + Setup.emit('Discovery', 'pullEntityInfo', { correlationId: '123', parameters: { entityId: '123' diff --git a/src/sdks/core/test/suite/discovery.test.ts b/src/sdks/core/test/suite/discovery.test.ts index 638c57432..7402dce42 100644 --- a/src/sdks/core/test/suite/discovery.test.ts +++ b/src/sdks/core/test/suite/discovery.test.ts @@ -150,3 +150,12 @@ test("clear()", () => { const result: boolean = Discovery.clear(-1000); expect(result).toBeFalsy(); }); + +test("details() provider", () => { + + class myUserInterestProvider implements Discovery.UserInterestProvider { + userInterest(parameters?: object, session?: Discovery.ProviderSession): Promise { + return null + } + } +}) \ No newline at end of file diff --git a/src/sdks/core/test/suite/lazy-transport.test.ts b/src/sdks/core/test/suite/lazy-transport.test.ts deleted file mode 100644 index ebfb739fe..000000000 --- a/src/sdks/core/test/suite/lazy-transport.test.ts +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright 2021 Comcast Cable Communications Management, LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - * SPDX-License-Identifier: Apache-2.0 - */ - -// NOTE: this test SHOULD NOT include Setup, since it does it's own -// setup for Firebolt SDK/TL handshake -const win = globalThis || window - -import Setup from '../../../../../test/Setup' -import { beforeAll, test, expect } from '@jest/globals'; -import { Lifecycle, Discovery } from "../../build/javascript/src/firebolt"; - -// holds test transport layer state, e.g. callback -type stateType = { - callback: (arg0: string) => void | null -} - -const state:stateType = { - callback: null -} - -let navigateToListenCount = 0 -let pullEntityInfoListenCount = 0 -let callbackWiredUp = false -let sendCalled = false - -const transport = { - send: function(message) { - sendCalled = true - const json = JSON.parse(message) - console.log('transport.send: ' + json.method) - if (json.method.toLowerCase() === 'lifecycle.ready') { - // we'll assert on this later... - navigateToListenCount++ - if (state.callback) { - // we'll assert on this later... - callbackWiredUp = true - let response = { - jsonrpc: '2.0', - id: json.id, - result: true - } - // catching errors, so all tests don't fail if this breaks - try { - // send back the onInactive event immediately, to test for race conditions - state.callback(JSON.stringify(response)) - } - catch (err) { - // fail silenetly (the boolean-based tests below will figure it out...) - } - } - } - else if (json.method.toLowerCase() === 'discovery.onpullentityinfo') { - pullEntityInfoListenCount++ - } - }, - receive: function(callback) { - console.log('transport.receive') - // store the callback - state.callback = callback - } -} - -beforeAll(()=> { - - // listen twice, using event-specific call FIRST - Discovery.listen("navigateTo", (value) => { callbackWiredUp = true }) - Discovery.listen("navigateTo", (value) => { /* this just adds more listen calls to make sure we don't spam */ }) - Discovery.listen((event, value) => { /* testing both listen signatures */ }) - Discovery.listen((event, value) => { /* testing both listen signatures */ }) - // listen three more times, using wildcard FIRST (from above) - - let p = new Promise( (resolve, reject) => { - setTimeout( _ => { - resolve(null) - }, 4000) - }) - - Lifecycle.ready() - - win.__firebolt.setTransportLayer(transport) - - return p -}) - - -test('Transport injected after SDK', () => { - expect(callbackWiredUp).toBe(true) -}); - -test('Transport send method working', () => { - expect(sendCalled).toBe(true) -}); - -test('Transport was sent listeners', () => { - expect(navigateToListenCount).toBeGreaterThan(0) -}); - -test('Transport was sent each listener only once', () => { - expect(navigateToListenCount).toBe(1) -}); diff --git a/src/sdks/core/test/suite/lifecycle.test.ts b/src/sdks/core/test/suite/lifecycle.test.ts index 00d777575..46602f332 100644 --- a/src/sdks/core/test/suite/lifecycle.test.ts +++ b/src/sdks/core/test/suite/lifecycle.test.ts @@ -18,7 +18,7 @@ import { jest, test, expect, beforeAll } from "@jest/globals"; import { testHarness } from "../../../../../test/Setup"; -import { Lifecycle } from "../../build/javascript/src/firebolt"; +import { Lifecycle, Settings } from "../../build/javascript/src/firebolt"; let readyResolved: boolean = false; let readyCalled: boolean = false; @@ -41,6 +41,8 @@ const callback = jest.fn(); const startupState: Lifecycle.LifecycleState = Lifecycle.state(); beforeAll(() => { + Settings.setLogLevel('DEBUG') + Lifecycle.listen((event: string, _) => { callback(event); }); diff --git a/src/sdks/core/test/suite/listeners-transport.test.ts b/src/sdks/core/test/suite/listeners-transport.test.ts index bec4db1b7..b61fb569a 100644 --- a/src/sdks/core/test/suite/listeners-transport.test.ts +++ b/src/sdks/core/test/suite/listeners-transport.test.ts @@ -94,4 +94,4 @@ test("Transport was sent listeners", () => { test("Transport was sent each listener only once", () => { expect(navigateToListenCount).toBe(1); -}); +}); \ No newline at end of file diff --git a/src/sdks/core/test/suite/synchronous-transport.test.ts b/src/sdks/core/test/suite/synchronous-transport.test.ts index f7ab896d4..d9bd40db8 100644 --- a/src/sdks/core/test/suite/synchronous-transport.test.ts +++ b/src/sdks/core/test/suite/synchronous-transport.test.ts @@ -79,4 +79,4 @@ test("Transport `receive` callback wired up", () => { return Device.name().then((name) => { expect(name).toBe("Test Name"); }); -}); +}); \ No newline at end of file diff --git a/src/sdks/discovery/.npmignore b/src/sdks/discovery/.npmignore new file mode 100644 index 000000000..0e2ba4d22 --- /dev/null +++ b/src/sdks/discovery/.npmignore @@ -0,0 +1,6 @@ +build/* +src/* +test/* +.DS_Store +jest.config.* +tsconfig.* \ No newline at end of file diff --git a/src/sdks/discovery/CHANGELOG.md b/src/sdks/discovery/CHANGELOG.md new file mode 100644 index 000000000..e69de29bb diff --git a/src/sdks/discovery/CONTRIBUTING.md b/src/sdks/discovery/CONTRIBUTING.md new file mode 120000 index 000000000..c97564d93 --- /dev/null +++ b/src/sdks/discovery/CONTRIBUTING.md @@ -0,0 +1 @@ +../../../CONTRIBUTING.md \ No newline at end of file diff --git a/src/sdks/discovery/LICENSE b/src/sdks/discovery/LICENSE new file mode 120000 index 000000000..5853aaea5 --- /dev/null +++ b/src/sdks/discovery/LICENSE @@ -0,0 +1 @@ +../../../LICENSE \ No newline at end of file diff --git a/src/sdks/discovery/NOTICE b/src/sdks/discovery/NOTICE new file mode 120000 index 000000000..295f6bdb3 --- /dev/null +++ b/src/sdks/discovery/NOTICE @@ -0,0 +1 @@ +../../../NOTICE \ No newline at end of file diff --git a/src/sdks/discovery/README.md b/src/sdks/discovery/README.md new file mode 100644 index 000000000..2ec46b95d --- /dev/null +++ b/src/sdks/discovery/README.md @@ -0,0 +1,26 @@ +--- +title: Firebolt Discovery SDK +--- + +[![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/src/sdks/discovery/jest.config.json b/src/sdks/discovery/jest.config.json new file mode 100644 index 000000000..745370cfa --- /dev/null +++ b/src/sdks/discovery/jest.config.json @@ -0,0 +1,8 @@ +{ + "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|js?)$", + "transform": {}, + "testPathIgnorePatterns": ["/node_modules/", "/../../../test"], + "moduleFileExtensions": ["js", "jsx", "mjs"], + "verbose": true, + "testEnvironment": "jest-environment-jsdom" + } \ No newline at end of file diff --git a/src/sdks/discovery/package.json b/src/sdks/discovery/package.json new file mode 100644 index 000000000..c550e3820 --- /dev/null +++ b/src/sdks/discovery/package.json @@ -0,0 +1,53 @@ +{ + "name": "@firebolt-js/discovery-sdk", + "version": "1.2.0-next.5", + "description": "The Firebolt Discovery JS SDK", + "main": "./dist/lib/firebolt-discovery.mjs", + "types": "./dist/lib/firebolt-discovery.d.ts", + "exports": { + ".": "./dist/lib/firebolt-discovery.mjs" + }, + "type": "module", + "scripts": { + "validate": "npx firebolt-openrpc validate --input ./dist/firebolt-discovery-open-rpc.json", + "sdk": "npx firebolt-openrpc sdk --server ./dist/firebolt-discovery-open-rpc.json --template ./src/js --output ./build/javascript/src", + "native": "npx firebolt-openrpc sdk --server ./dist/firebolt-discovery-open-rpc.json --template ./src/js --output ./build/c/src --language ../../../node_modules/@firebolt-js/openrpc/languages/c", + "compile": "cd ../../.. && npm run compile", + "slice": "npx firebolt-openrpc slice -i ../../../dist/firebolt-open-rpc.json --sdk ./sdk.config.json -o ./dist/firebolt-discovery-open-rpc.json", + "docs": "npx firebolt-openrpc docs --server ./dist/firebolt-discovery-open-rpc.json --output build/docs/markdown --as-path", + "wiki": "npx firebolt-openrpc docs --server ./dist/firebolt-discovery-open-rpc.json --output build/docs/markdown", + "dist:notest": "npm run clean && npm run slice && npm run validate && npm run sdk && npm run docs && npm run prettier && npm run dist:copy && echo 'Firebolt Discovery SDK /dist/ is ready.\n'", + "dist:copy": "npm run dist:copy:sdk && npm run dist:copy:docs", + "dist:copy:sdk": "mkdirp ./dist && cp -R build/javascript/src dist/lib && cp ./dist/firebolt-discovery-open-rpc.json ../../../dist/firebolt-discovery-open-rpc.json", + "dist:copy:docs": "mkdirp ./dist && cp -R build/docs/markdown dist/docs", + "dist": "npm run dist:notest && npm run test", + "clean": "rm -rf ./build && rm -rf ./dist", + "test:setup": "rm -rf test/transpiled-suite && npx tsc --target es6 --moduleResolution node --outDir test/transpiled-suite", + "test": "npm run test:setup && NODE_OPTIONS=--experimental-vm-modules npx --config=jest.config.json --detectOpenHandles jest", + "prepack": "node ../../js/version.mjs validate && npm run broilerplate", + "broilerplate": "rm ./CONTRIBUTING.md && cp ../../../CONTRIBUTING.md ./CONTRIBUTING.md && rm ./LICENSE && cp ../../../LICENSE ./LICENSE && rm ./NOTICE && cp ../../../NOTICE ./NOTICE", + "prettier": "prettier build/**/*.mjs --write --parser babel && prettier build/**/*.md --write --parser markdown" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/rdkcentral/firebolt-core-sdk", + "directory": "src/sdks/discovery" + }, + "author": "", + "bugs": { + "url": "https://github.com/rdkcentral/firebolt-core-sdk/issues" + }, + "homepage": "https://github.com/rdkcentral/firebolt-core-sdk#readme", + "devDependencies": { + "jest": "^28.1.0", + "jest-environment-jsdom": "^28.1.3", + "prettier": "^3.1.0", + "typescript": "^4.6.4" + }, + "keywords": [ + "firebolt", + "apps", + "sdk" + ], + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/src/sdks/discovery/sdk.config.json b/src/sdks/discovery/sdk.config.json new file mode 100644 index 000000000..535d3bb12 --- /dev/null +++ b/src/sdks/discovery/sdk.config.json @@ -0,0 +1,15 @@ +{ + "info": { + "title": "Firebolt Discovery SDK" + }, + "methods": [ + { + "module": "Content", + "use": [ + "xrn:firebolt:capability:discovery:purchased-content", + "xrn:firebolt:capability:discovery:entity-info", + "xrn:firebolt:capability:discovery:interest" + ] + } + ] +} diff --git a/src/sdks/discovery/src/js/sdk/index.mjs b/src/sdks/discovery/src/js/sdk/index.mjs new file mode 100644 index 000000000..a9f2f5ca6 --- /dev/null +++ b/src/sdks/discovery/src/js/sdk/index.mjs @@ -0,0 +1,30 @@ +/* + * Copyright 2021 Comcast Cable Communications Management, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { setMockResponses } from './Transport/MockTransport.mjs' + +/* ${MOCK_IMPORTS} */ + +setMockResponses({ + /* ${MOCK_OBJECTS} */ +}) + +/* ${EXPORTS} */ +export { default as Log } from './Log/index.mjs' +export { default as Events } from './Events/index.mjs' +export { default as Settings } from './Settings/index.mjs' diff --git a/src/sdks/discovery/test/suite/content.test.ts b/src/sdks/discovery/test/suite/content.test.ts new file mode 100644 index 000000000..1ab4e98c8 --- /dev/null +++ b/src/sdks/discovery/test/suite/content.test.ts @@ -0,0 +1,43 @@ +/* + * Copyright 2021 Comcast Cable Communications Management, LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { test, expect } from "@jest/globals"; +import { Content } from "../../build/javascript/src/firebolt-discovery"; + +test("Content.requestUserInterest()", () => { + return Content.requestUserInterest(Content.InterestType.INTEREST, Content.InterestReason.PLAYLIST).then((interest: Content.InterestResult) => { + const entity = interest.entity + const appId = interest.appId + expect(appId).toBeDefined() + expect(entity).toBeDefined() + expect(entity.info.title).toBe("Cool Runnings") + }) +}); + +test("Content.onUserInterest()", () => { + return Content.listen('userInterest', (interest: Content.InterestEvent) => { + const entity = interest.entity + const appId = interest.appId + const reason = interest.reason + expect(interest['type']).toBeDefined() + expect(reason).toBeDefined() + expect(appId).toBeDefined() + expect(entity).toBeDefined() + expect(entity.info.title).toBe("Cool Runnings") + }) +}); diff --git a/src/sdks/discovery/tsconfig.json b/src/sdks/discovery/tsconfig.json new file mode 100644 index 000000000..56ff58bc8 --- /dev/null +++ b/src/sdks/discovery/tsconfig.json @@ -0,0 +1,5 @@ +{ + "include": [ + "test/suite/*" + ] +} \ No newline at end of file diff --git a/src/sdks/manage/package.json b/src/sdks/manage/package.json index c21e6138e..ff749a6d1 100644 --- a/src/sdks/manage/package.json +++ b/src/sdks/manage/package.json @@ -1,6 +1,6 @@ { "name": "@firebolt-js/manage-sdk", - "version": "1.2.0-next.2", + "version": "1.2.0-next.5", "description": "The Firebolt Manage JS SDK", "main": "./dist/lib/firebolt-manage.mjs", "types": "./dist/lib/firebolt-manage.d.ts", @@ -10,15 +10,14 @@ "type": "module", "scripts": { "validate": "npx firebolt-openrpc validate --input ./dist/firebolt-manage-open-rpc.json", - "sdk": "npx firebolt-openrpc sdk --input ./dist/firebolt-manage-open-rpc.json --template ./src/js --output ./build/javascript/src", - "native": "npx firebolt-openrpc sdk --input ./dist/firebolt-manage-open-rpc.json --template ./src/js --output ./build/c/src --language ../../../node_modules/@firebolt-js/openrpc/languages/c", + "sdk": "npx firebolt-openrpc sdk --server ./dist/firebolt-manage-open-rpc.json --template ./src/js --output ./build/javascript/src", "cpp": "npm run cpp:compile && npm run cpp:install", - "cpp:compile": "npx firebolt-openrpc sdk --input ./dist/firebolt-manage-open-rpc.json --template ./src/cpp --output ./build/cpp/src --static-module Platform --language ../../../node_modules/@firebolt-js/openrpc/languages/cpp", + "cpp:compile": "npx firebolt-openrpc sdk --server ./dist/firebolt-manage-open-rpc.json --template ./src/cpp --output ./build/cpp/src --static-module Platform --language ../../../node_modules/@firebolt-js/openrpc/languages/cpp", "cpp:install": "./build/cpp/src/scripts/install.sh -i ./build/cpp/src -s ./build/cpp/src/ -m manage", "compile": "cd ../../.. && npm run compile", "slice": "npx firebolt-openrpc slice -i ../../../dist/firebolt-open-rpc.json --sdk ./sdk.config.json -o ./dist/firebolt-manage-open-rpc.json", - "docs": "npx firebolt-openrpc docs --input ./dist/firebolt-manage-open-rpc.json --output build/docs/markdown --as-path", - "wiki": "npx firebolt-openrpc docs --input ./dist/firebolt-manage-open-rpc.json --output build/docs/markdown", + "docs": "npx firebolt-openrpc docs --server ./dist/firebolt-manage-open-rpc.json --output build/docs/markdown --as-path", + "wiki": "npx firebolt-openrpc docs --server ./dist/firebolt-manage-open-rpc.json --output build/docs/markdown", "dist:notest": "npm run clean && npm run slice && npm run validate && npm run sdk && npm run docs && npm run prettier && npm run dist:copy && echo 'Firebolt Manage SDK /dist/ is ready.\n'", "dist:copy": "npm run dist:copy:sdk && npm run dist:copy:docs", "dist:copy:sdk": "mkdirp ./dist && cp -R build/javascript/src dist/lib && cp ./dist/firebolt-manage-open-rpc.json ../../../dist/firebolt-manage-open-rpc.json", diff --git a/src/sdks/manage/test/suite/acknowledgeChallenge.test.ts b/src/sdks/manage/test/suite/acknowledgeChallenge.test.ts index 50b180d0d..433c719c6 100644 --- a/src/sdks/manage/test/suite/acknowledgeChallenge.test.ts +++ b/src/sdks/manage/test/suite/acknowledgeChallenge.test.ts @@ -20,31 +20,16 @@ import { test, expect } from "@jest/globals"; import { AcknowledgeChallenge } from "../../build/javascript/src/firebolt-manage"; class ACKPovider implements AcknowledgeChallenge.ChallengeProvider { - challenge( - parameters: object, - session: AcknowledgeChallenge.FocusableProviderSession - ): Promise { - return Promise.resolve(null); + challenge(parameters: AcknowledgeChallenge.ChallengeParameters, session: AcknowledgeChallenge.FocusableProviderSession): Promise { + return Promise.resolve(null) } } test("AcknowledgeChallenge.provide() declarations", () => { - AcknowledgeChallenge.provide( - "xrn:firebolt:capability:usergrant:acknowledgechallenge", - new ACKPovider() - ); + AcknowledgeChallenge.provide('xrn:firebolt:capability:usergrant:acknowledgechallenge', new ACKPovider()); expect(1).toBe(1); }); -test("AcknowledgeChallenge.provide() with blank object", () => { - expect(() => { - AcknowledgeChallenge.provide( - "xrn:firebolt:capability:usergrant:acknowledgechallenge", - {} - ); - }).toThrow(); -}); - // Events Test cases // test("AcknowledgeChallenge.listen() for requestChallenge event", () => { diff --git a/src/sdks/manage/test/suite/device.test.ts b/src/sdks/manage/test/suite/device.test.ts index a3793547e..b21c328ce 100644 --- a/src/sdks/manage/test/suite/device.test.ts +++ b/src/sdks/manage/test/suite/device.test.ts @@ -20,7 +20,7 @@ import { test, expect } from "@jest/globals"; import { Device } from "../../build/javascript/src/firebolt-manage"; test("Device.name()", () => { - return Device.name(() => {}).then((res: number) => { + return Device.name((n:string) => {}).then((res: number) => { expect(res > 0).toBe(true); }); }); diff --git a/src/sdks/manage/test/suite/keyboard.test.ts b/src/sdks/manage/test/suite/keyboard.test.ts index c40b7d40e..1553d105a 100644 --- a/src/sdks/manage/test/suite/keyboard.test.ts +++ b/src/sdks/manage/test/suite/keyboard.test.ts @@ -36,6 +36,7 @@ class MockProviderBroker { state.eventId = parsed.id } if ((parsed.method === 'keyboard.standardResponse') || (parsed.method === 'keyboard.standardError')) { + console.dir(state.pending) let pending = state.pending.find(p => p.correlationId === parsed.params.correlationId) state.pending = state.pending.filter(p => p.correlationId === parsed.params.correlationId) if (pending) { @@ -68,9 +69,9 @@ const broker = new MockProviderBroker() let provider = null beforeAll(async () => { - Settings.setLogLevel('DEBUG') window['__firebolt'].setTransportLayer(new MockProviderBroker()) provider = new DelegatingKBProvider(new KBProvider()) + Settings.setLogLevel('DEBUG') await Keyboard.provide("xrn:firebolt:capability:input:keyboard", provider); }) @@ -80,65 +81,63 @@ class DelegatingKBProvider implements Keyboard.KeyboardInputProvider { this.delegate = delegate; } standard( - parameters: Keyboard.KeyboardParameters, + parameters: Keyboard.StandardParameters, session: Keyboard.FocusableProviderSession - ): Promise { + ): Promise { return this.delegate.standard(parameters, session) } password( - parameters: Keyboard.KeyboardParameters, + parameters: Keyboard.PasswordParameters, session: Keyboard.FocusableProviderSession - ): Promise { + ): Promise { return this.delegate.password(parameters, session) } email( - parameters: Keyboard.KeyboardParameters, + parameters: Keyboard.EmailParameters, session: Keyboard.FocusableProviderSession - ): Promise { + ): Promise { return this.delegate.email(parameters, session) } } class KBProvider implements Keyboard.KeyboardInputProvider { standard( - parameters: Keyboard.KeyboardParameters, + parameters: Keyboard.StandardParameters, session: Keyboard.FocusableProviderSession - ): Promise { - return Promise.resolve({ - text: 'foo' - }); + ): Promise { + return Promise.resolve('foo'); } password( - parameters: Keyboard.KeyboardParameters, + parameters: Keyboard.PasswordParameters, session: Keyboard.FocusableProviderSession - ): Promise { + ): Promise { return Promise.resolve(null); } email( - parameters: Keyboard.KeyboardParameters, + parameters: Keyboard.EmailParameters, session: Keyboard.FocusableProviderSession - ): Promise { + ): Promise { return Promise.resolve(null); } } class KBProviderWithError implements Keyboard.KeyboardInputProvider { async standard( - parameters: Keyboard.KeyboardParameters, + parameters: Keyboard.StandardParameters, session: Keyboard.FocusableProviderSession - ): Promise { + ): Promise { throw new Error('failed') } async password( - parameters: Keyboard.KeyboardParameters, + parameters: Keyboard.PasswordParameters, session: Keyboard.FocusableProviderSession - ): Promise { + ): Promise { throw new Error('failed') } async email( - parameters: Keyboard.KeyboardParameters, + parameters: Keyboard.EmailParameters, session: Keyboard.FocusableProviderSession - ): Promise { + ): Promise { throw new Error('failed') } } @@ -156,7 +155,7 @@ test("Keyboard.provide() declarations", async () => { let result = await promise console.log(result) expect(result.method).toStrictEqual('keyboard.standardResponse') - expect(result.params.result.text).toStrictEqual('foo') + expect(result.params.result).toStrictEqual('foo') }); test("Keyboard.provide() with blank object", () => { @@ -223,4 +222,4 @@ test("Keyboard.provide() with error response", async () => { // test("Keyboard.clear()", () => { // const result = Keyboard.clear(2); // expect(result).toBeFalsy(); -// }); +// }); \ No newline at end of file diff --git a/src/sdks/manage/test/suite/pinChallenge.test.ts b/src/sdks/manage/test/suite/pinChallenge.test.ts index 2612cfa5d..8f3250d6c 100644 --- a/src/sdks/manage/test/suite/pinChallenge.test.ts +++ b/src/sdks/manage/test/suite/pinChallenge.test.ts @@ -20,28 +20,16 @@ import { test, expect } from "@jest/globals"; import { PinChallenge } from "../../build/javascript/src/firebolt-manage"; class PCProvider implements PinChallenge.ChallengeProvider { - challenge( - parameters: object, - session: PinChallenge.FocusableProviderSession - ): Promise { - return Promise.resolve(null); + challenge(parameters: PinChallenge.ChallengeParameters, session: PinChallenge.FocusableProviderSession): Promise { + return Promise.resolve(null) } } test("PinChallenge.provide() declarations", () => { - PinChallenge.provide( - "xrn:firebolt:capability:usergrant:pinchallenge", - new PCProvider() - ); + PinChallenge.provide('xrn:firebolt:capability:usergrant:pinchallenge', new PCProvider()); expect(1).toBe(1); }); -test("PinChallenge.provide() with blank object", () => { - expect(() => { - PinChallenge.provide("xrn:firebolt:capability:usergrant:pinchallenge", {}); - }).toThrow(); -}); - // Events Test cases // test("PinChallenge.listen() for requestChallenge event", () => { diff --git a/tsconfig.json b/tsconfig.json index 0e5a8d3af..56ff58bc8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,5 @@ { "include": [ - "src/sdks/core/test/suite/*", - "src/sdks/manage/test/suite/*" + "test/suite/*" ] } \ No newline at end of file