Summary
I would like to clarify the naming convention specifications for implementing Account Login integration on Vega OS. Based on the verification results below, the system appears to operate under the assumption of a specific ID format: {package_id}.interface.provider.
Questions
- Is it mandatory for the Account Login integration service component ID to follow the format
{package_id}.interface.provider? Is there a way to use a custom ID? - Does the
keyin the[[extras]]section have to be the fixed valueinterface.providerfor it to be recognized by Vega OS as an interface provider? - Does the first argument of
registerHeadlessEntryPoint2inservice.jsalso need to be in the format{package_id}.interface.provider::{function_name}?
Verification Details
I created a sample app based on the documentation and verified four implementation patterns by monitoring logs during the installation process. In each case, the login state is configured to always return SIGNED_IN.
Verification Steps
-
Before installing the app, enter the Vega OS shell via
vega exec vda shell. -
Run the following two commands to monitor logs:
- Headless Service Logs:
loggingctl log -f --since now | grep -i "com.amazondeveloper.keplersampleapp\|KeplerScript-Native\|KeplerScript-JavaScript"- Account Login Status Logs:
loggingctl log -f --since now | grep -E 'ContentAppEndpoint.*KEP_VID.*login_status' -
Install the app.
a. Success Case
Implementation Details
- manifest.toml
- Set
interface.providerin the key of [extra] section - Set to
{packageId}.interface.providerin:-
components.service.id -
processes.group.id -
offers.service.id -
extras.value.application.interface.override_attribute_component
-
- Set
- service.js
- Set
{packageId}.interface.provider::{functionName}inregisterHeadlessEntryPoint2.
- Set
manifest.toml
schema-version = 1
[package]
title = "Account Login Integration Sample”
version = "0.1.0"
id = "com.amazondeveloper.keplersampleapp"
[components]
[[components.interactive]]
id = "com.amazondeveloper.keplersampleapp.main"
runtime-module = "/com.amazon.kepler.keplerscript.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"
categories = ["com.amazon.category.main", "com.amazon.category.kepler.media"]
[[components.service]]
id = "com.amazondeveloper.keplersampleapp.interface.provider"
runtime-module = "/com.amazon.kepler.headless.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"
[processes]
[[processes.group]]
component-ids = ["com.amazondeveloper.keplersampleapp.main"]
[[processes.group]]
component-ids = ["com.amazondeveloper.keplersampleapp.interface.provider"]
[[message]]
uri = "pkg://com.amazondeveloper.keplersampleapp.main"
sender-privileges = ["*"]
receiver-privileges = ["self"]
[offers]
[[offers.interaction]]
id = "com.amazondeveloper.keplersampleapp.main"
[[offers.service]]
id = "com.amazondeveloper.keplersampleapp.interface.provider"
required-privileges = ["com.amazon.multimedia.privilege.session.manage"]
[[offers.module]]
id = "/com.amazondeveloper.keplersampleapp.module@IUris1"
includes-messages = ["pkg://com.amazondeveloper.keplersampleapp.main"]
[[extras]]
key = "interface.provider"
component-id = "com.amazondeveloper.keplersampleapp.main"
[extras.value.application]
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IContentLauncherServer"
attribute_options = ["partner-id"]
static-values = { "partner-id" = "KEP_VID" }
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IAccountLoginServer"
attribute_options = ["Status"]
override_attribute_component = { Status = "com.amazondeveloper.keplersampleapp.interface.provider" }
[needs]
[[needs.module]]
id = "/com.amazon.kepler.media@IContentLauncher1"
[[needs.module]]
id = "/com.amazon.kepler.media.@IAccountLogin1"
service.js
import {HeadlessEntryPointRegistry} from '@amazon-devices/headless-task-manager';
import {onStartService, onStopService} from './src/AccountLoginWrapper';
{
HeadlessEntryPointRegistry.registerHeadlessEntryPoint2(
'com.amazondeveloper.keplersampleapp.interface.provider::onStartService',
() => onStartService,
);
HeadlessEntryPointRegistry.registerHeadlessEntryPoint2(
'com.amazondeveloper.keplersampleapp.interface.provider::onStopService',
() => onStopService,
);
}
Result
The headless service starts successfully upon app installation, and the account login status is returned as expected.
Logs
a1_headless_service_log.txt (45.2 KB)
a2_login_status_log.txt (437 バイト)
b. Failure Case 1
Implementation Details
- manifest.toml
- Set
account.login.providerin the key of [extra] section - Set to
{packageId}.account.login.providerin:-
components.service.id -
processes.group.id -
offers.service.id -
extras.value.application.interface.override_attribute_component
-
- Set
- service.js
- Set
{packageId}.account.login.provider::{functionName}inregisterHeadlessEntryPoint2.
- Set
manifest.toml
schema-version = 1
[package]
title = "Account Login Integration Sample”
version = "0.1.0"
id = "com.amazondeveloper.keplersampleapp"
[components]
[[components.interactive]]
id = "com.amazondeveloper.keplersampleapp.main"
runtime-module = "/com.amazon.kepler.keplerscript.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"
categories = ["com.amazon.category.main", "com.amazon.category.kepler.media"]
[[components.service]]
- id = "com.amazondeveloper.keplersampleapp.interface.provider"
+ id = "com.amazondeveloper.keplersampleapp.account.login.provider"
runtime-module = "/com.amazon.kepler.headless.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"
[processes]
[[processes.group]]
component-ids = ["com.amazondeveloper.keplersampleapp.main"]
[[processes.group]]
- component-ids = ["com.amazondeveloper.keplersampleapp.interface.provider"]
+ component-ids = ["com.amazondeveloper.keplersampleapp.account.login.provider"]
[[message]]
uri = "pkg://com.amazondeveloper.keplersampleapp.main"
sender-privileges = ["*"]
receiver-privileges = ["self"]
[offers]
[[offers.interaction]]
id = "com.amazondeveloper.keplersampleapp.main"
[[offers.service]]
- id = "com.amazondeveloper.keplersampleapp.interface.provider"
+ id = "com.amazondeveloper.keplersampleapp.account.login.provider"
required-privileges = ["com.amazon.multimedia.privilege.session.manage"]
[[offers.module]]
id = "/com.amazondeveloper.keplersampleapp.module@IUris1"
includes-messages = ["pkg://com.amazondeveloper.keplersampleapp.main"]
[[extras]]
- key = "interface.provider"
+ key = "account.login.provider"
component-id = "com.amazondeveloper.keplersampleapp.main"
[extras.value.application]
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IContentLauncherServer"
attribute_options = ["partner-id"]
static-values = { "partner-id" = "KEP_VID" }
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IAccountLoginServer"
attribute_options = ["Status"]
- override_attribute_component = { Status = "com.amazondeveloper.keplersampleapp.interface.provider" }
+ override_attribute_component = { Status = "com.amazondeveloper.keplersampleapp.account.login.provider" }
[needs]
[[needs.module]]
id = "/com.amazon.kepler.media@IContentLauncher1"
[[needs.module]]
id = "/com.amazon.kepler.media.@IAccountLogin1"
service.js
import {HeadlessEntryPointRegistry} from '@amazon-devices/headless-task-manager';
import {onStartService, onStopService} from './src/AccountLoginWrapper';
{
HeadlessEntryPointRegistry.registerHeadlessEntryPoint2(
- 'com.amazondeveloper.keplersampleapp.interface.provider::onStartService',
+ 'com.amazondeveloper.keplersampleapp.account.login.provider::onStartService',
() => onStartService,
);
HeadlessEntryPointRegistry.registerHeadlessEntryPoint2(
- 'com.amazondeveloper.keplersampleapp.interface.provider::onStopService',
+ 'com.amazondeveloper.keplersampleapp.account.login.provider::onStopService',
() => onStopService,
);
}
Result
The headless service does not start upon installation, and no login status is returned.
Logs
b1_headless_service_log.txt (21.5 KB)
As there were no logs, b2_login_status_log.txt does not exist.
c. Failure Case 2
Implementation Details
- manifest.toml
- Set to
{packageId}.account.login.providerin:-
components.service.id -
processes.group.id -
offers.service.id -
extras.value.application.interface.override_attribute_component
-
- Set to
- service.js
- Set
{packageId}.account.login.provider::{functionName}inregisterHeadlessEntryPoint2.
- Set
manifest.toml
schema-version = 1
[package]
title = "Account Login Integration Sample”
version = "0.1.0"
id = "com.amazondeveloper.keplersampleapp"
[components]
[[components.interactive]]
id = "com.amazondeveloper.keplersampleapp.main"
runtime-module = "/com.amazon.kepler.keplerscript.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"
categories = ["com.amazon.category.main", "com.amazon.category.kepler.media"]
[[components.service]]
- id = "com.amazondeveloper.keplersampleapp.interface.provider"
+ id = "com.amazondeveloper.keplersampleapp.account.login.provider"
runtime-module = "/com.amazon.kepler.headless.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"
[processes]
[[processes.group]]
component-ids = ["com.amazondeveloper.keplersampleapp.main"]
[[processes.group]]
- component-ids = ["com.amazondeveloper.keplersampleapp.interface.provider"]
+ component-ids = ["com.amazondeveloper.keplersampleapp.account.login.provider"]
[[message]]
uri = "pkg://com.amazondeveloper.keplersampleapp.main"
sender-privileges = ["*"]
receiver-privileges = ["self"]
[offers]
[[offers.interaction]]
id = "com.amazondeveloper.keplersampleapp.main"
[[offers.service]]
- id = "com.amazondeveloper.keplersampleapp.interface.provider"
+ id = "com.amazondeveloper.keplersampleapp.account.login.provider"
required-privileges = ["com.amazon.multimedia.privilege.session.manage"]
[[offers.module]]
id = "/com.amazondeveloper.keplersampleapp.module@IUris1"
includes-messages = ["pkg://com.amazondeveloper.keplersampleapp.main"]
[[extras]]
key = "interface.provider"
component-id = "com.amazondeveloper.keplersampleapp.main"
[extras.value.application]
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IContentLauncherServer"
attribute_options = ["partner-id"]
static-values = { "partner-id" = "KEP_VID" }
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IAccountLoginServer"
attribute_options = ["Status"]
- override_attribute_component = { Status = "com.amazondeveloper.keplersampleapp.interface.provider" }
+ override_attribute_component = { Status = "com.amazondeveloper.keplersampleapp.account.login.provider" }
[needs]
[[needs.module]]
id = "/com.amazon.kepler.media@IContentLauncher1"
[[needs.module]]
id = "/com.amazon.kepler.media.@IAccountLogin1"
service.js
import {HeadlessEntryPointRegistry} from '@amazon-devices/headless-task-manager';
import {onStartService, onStopService} from './src/AccountLoginWrapper';
{
HeadlessEntryPointRegistry.registerHeadlessEntryPoint2(
- 'com.amazondeveloper.keplersampleapp.interface.provider::onStartService',
+ 'com.amazondeveloper.keplersampleapp.account.login.provider::onStartService',
() => onStartService,
);
HeadlessEntryPointRegistry.registerHeadlessEntryPoint2(
- 'com.amazondeveloper.keplersampleapp.interface.provider::onStartService',
+ 'com.amazondeveloper.keplersampleapp.account.login.provider::onStopService',
() => onStopService,
);
}
Result
Upon app installation, it appears the headless service is not launching due to an unknown service error. The account login status is fixed at false and returned.
Logs
c1_headless_service_log.txt (31.7 KB)
c2_login_status_log.txt (436 バイト)
d. Failure Case 3
Implementation Details
- manifest.toml
- Set to
{packageId}.account.login.providerin:-
components.service.id -
processes.group.id -
offers.service.id -
extras.value.application.interface.override_attribute_component
-
- Set to
- service.js
- Set
{packageId}.interface.provider::{functionName}inregisterHeadlessEntryPoint2.
- Set
manifest.toml
schema-version = 1
[package]
title = "Account Login Integration Sample”
version = "0.1.0"
id = "com.amazondeveloper.keplersampleapp"
[components]
[[components.interactive]]
id = "com.amazondeveloper.keplersampleapp.main"
runtime-module = "/com.amazon.kepler.keplerscript.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"
categories = ["com.amazon.category.main", "com.amazon.category.kepler.media"]
[[components.service]]
- id = "com.amazondeveloper.keplersampleapp.interface.provider"
+ id = "com.amazondeveloper.keplersampleapp.account.login.provider"
runtime-module = "/com.amazon.kepler.headless.runtime.loader_2@IKeplerScript_2_0"
launch-type = "singleton"
[processes]
[[processes.group]]
component-ids = ["com.amazondeveloper.keplersampleapp.main"]
[[processes.group]]
- component-ids = ["com.amazondeveloper.keplersampleapp.interface.provider"]
+ component-ids = ["com.amazondeveloper.keplersampleapp.account.login.provider"]
[[message]]
uri = "pkg://com.amazondeveloper.keplersampleapp.main"
sender-privileges = ["*"]
receiver-privileges = ["self"]
[offers]
[[offers.interaction]]
id = "com.amazondeveloper.keplersampleapp.main"
[[offers.service]]
- id = "com.amazondeveloper.keplersampleapp.interface.provider"
+ id = "com.amazondeveloper.keplersampleapp.account.login.provider"
required-privileges = ["com.amazon.multimedia.privilege.session.manage"]
[[offers.module]]
id = "/com.amazondeveloper.keplersampleapp.module@IUris1"
includes-messages = ["pkg://com.amazondeveloper.keplersampleapp.main"]
[[extras]]
key = "interface.provider"
component-id = "com.amazondeveloper.keplersampleapp.main"
[extras.value.application]
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IContentLauncherServer"
attribute_options = ["partner-id"]
static-values = { "partner-id" = "KEP_VID" }
[[extras.value.application.interface]]
interface_name = "com.amazon.kepler.media.IAccountLoginServer"
attribute_options = ["Status"]
- override_attribute_component = { Status = "com.amazondeveloper.keplersampleapp.interface.provider" }
+ override_attribute_component = { Status = "com.amazondeveloper.keplersampleapp.account.login.provider" }
[needs]
[[needs.module]]
id = "/com.amazon.kepler.media@IContentLauncher1"
[[needs.module]]
id = "/com.amazon.kepler.media.@IAccountLogin1"
service.js
import {HeadlessEntryPointRegistry} from '@amazon-devices/headless-task-manager';
import {onStartService, onStopService} from './src/AccountLoginWrapper';
{
HeadlessEntryPointRegistry.registerHeadlessEntryPoint2(
'com.amazondeveloper.keplersampleapp.interface.provider::onStartService',
() => onStartService,
);
HeadlessEntryPointRegistry.registerHeadlessEntryPoint2(
'com.amazondeveloper.keplersampleapp.interface.provider::onStopService',
() => onStopService,
);
}
Result
Upon app installation, it appears the headless service is not launching due to an unknown service error. The account login status is fixed at false and returned.
Logs
d1_headless_service_log.txt (40.2 KB)
d2_login_status_log.txt (438 バイト)
Best regards,
Tatsuki