--- title: "SecondScreen" slug: "170-core-secondscreen" updated: 2025-12-09T17:12:47Z published: 2025-12-09T18:02:06Z canonical: "docs.developer.comcast.com/170-core-secondscreen" --- > ## Documentation Index > Fetch the complete documentation index at: https://docs.developer.comcast.com/llms.txt > Use this file to discover all available pages before exploring further. # SecondScreen **SecondScreen Module 1.7.0 | Core SDK** ## Usage To use the SecondScreen module, you can import it into your project from the Firebolt SDK: ``` import { SecondScreen } from '@firebolt-js/sdk' ``` ## Overview Methods for communicating with second screen devices ## Methods ### device Get the broadcasted id for the device ``` function device(type: string): Promise ``` Parameters: | Param | Type | Required | Description | | --- | --- | --- | --- | | `type` | `string` | false | The type of second screen protocol, e.g. "dial" | Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:protocol:dial | #### Examples Default Example JavaScript: ``` import { SecondScreen } from '@firebolt-js/sdk' let deviceId = await SecondScreen.device() console.log(deviceId) ``` Value of `deviceId`: ``` 'device-id' ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "SecondScreen.device", "params": {} } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": "device-id" } ``` --- ### friendlyName Get the broadcasted friendly name for the device To get the value of `friendlyName` call the method like this: ``` function friendlyName(): Promise ``` Promise resolution: Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:protocol:dial | #### Examples Default Example JavaScript: ``` import { SecondScreen } from '@firebolt-js/sdk' let friendlyName = await SecondScreen.friendlyName() console.log(friendlyName) ``` Value of `friendlyName`: ``` 'Living Room' ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "SecondScreen.friendlyName", "params": {} } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": "Living Room" } ``` --- To subscribe to notifications when the value changes, call the method like this: ``` function friendlyName(callback: (value) => string): Promise ``` Promise resolution: ``` number ``` #### Examples Default Example JavaScript: ``` import { SecondScreen } from '@firebolt-js/sdk' let listenerId = await friendlyName((value) => { console.log(value) }) console.log(listenerId) ``` Value of `friendlyName`: ``` 'Living Room' ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "SecondScreen.onFriendlyNameChanged", "params": { "listen": true } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": "Living Room" } ``` --- ### listen To listen to a specific event pass the event name as the first parameter: ``` listen(event: string, callback: (data: any) => void): Promise ``` Parameters: | Param | Type | Required | Summary | | --- | --- | --- | --- | | `event` | `string` | Yes | The event to listen for, see [Events](/docs/170-core-secondscreen#events). | | *callback* | `function` | Yes | A function that will be invoked when the event occurs. | Promise resolution: | Type | Description | | --- | --- | | `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `SecondScreen.clear(id)` | Callback parameters: | Param | Type | Required | Summary | | --- | --- | --- | --- | | `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](/docs/170-core-secondscreen#events). | To listen to all events from this module pass only a callback, without specifying an event name: ``` listen(callback: (event: string, data: any) => void): Promise ``` Parameters: | Param | Type | Required | Summary | | --- | --- | --- | --- | | *callback* | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](/docs/170-core-secondscreen#events). | Callback parameters: | Param | Type | Required | Summary | | --- | --- | --- | --- | | `event` | `string` | Yes | The event that has occured listen for, see [Events](/docs/170-core-secondscreen#events). | | `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](/docs/170-core-secondscreen#events). | Promise resolution: | Type | Description | | --- | --- | | `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `SecondScreen.clear(id)` | See [Listening for events](/docs/listening-for-events/) for more information and examples. ### once To listen to a single instance of a specific event pass the event name as the first parameter: ``` once(event: string, callback: (data: any) => void): Promise ``` The `once` method will only pass the next instance of this event, and then dicard the listener you provided. Parameters: | Param | Type | Required | Summary | | --- | --- | --- | --- | | `event` | `string` | Yes | The event to listen for, see [Events](/docs/170-core-secondscreen#events). | | *callback* | `function` | Yes | A function that will be invoked when the event occurs. | Promise resolution: | Type | Description | | --- | --- | | `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `SecondScreen.clear(id)` | Callback parameters: | Param | Type | Required | Summary | | --- | --- | --- | --- | | `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](/docs/170-core-secondscreen#events). | To listen to the next instance only of any events from this module pass only a callback, without specifying an event name: ``` once(callback: (event: string, data: any) => void): Promise ``` Parameters: | Param | Type | Required | Summary | | --- | --- | --- | --- | | *callback* | `function` | Yes | A function that will be invoked when the event occurs. The event data depends on which event is firing, see [Events](/docs/170-core-secondscreen#events). | Callback parameters: | Param | Type | Required | Summary | | --- | --- | --- | --- | | `event` | `string` | Yes | The event that has occured listen for, see [Events](/docs/170-core-secondscreen#events). | | `data` | `any` | Yes | The event data, which depends on which event is firing, see [Events](/docs/170-core-secondscreen#events). | Promise resolution: | Type | Description | | --- | --- | | `number` | Listener ID to clear the callback method and stop receiving the event, e.g. `SecondScreen.clear(id)` | See [Listening for events](/docs/listening-for-events/) for more information and examples. ### protocols Get the supported second screen discovery protocols ``` function protocols(): Promise ``` Promise resolution: [BooleanMap](/docs/170-core-Types-schemas#BooleanMap) Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:secondscreen:protocol | #### Examples Default Example JavaScript: ``` import { SecondScreen } from '@firebolt-js/sdk' let protocols = await SecondScreen.protocols() console.log(protocols) ``` Value of `protocols`: ``` { "dial1.7": true } ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "SecondScreen.protocols", "params": {} } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": { "dial1.7": true } } ``` --- ## Events ### closeRequest ``` function listen('closeRequest', () => void): Promise ``` See also: [listen()](/docs/170-core-secondscreen#listen), [once()](/docs/170-core-secondscreen#listen), [clear()](/docs/170-core-secondscreen#listen). Event value: [SecondScreenEvent](/docs/170-core-SecondScreen-schemas#SecondScreenEvent) Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:protocol:dial | #### Examples Default Example JavaScript: ``` import { SecondScreen } from '@firebolt-js/sdk' SecondScreen.listen('closeRequest', (closeRequestEvent) => { console.log(closeRequestEvent) }) ``` Value of `closeRequestEvent`: ``` { "type": "dial", "version": "1.7" } ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "SecondScreen.onCloseRequest", "params": { "listen": true } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": { "type": "dial", "version": "1.7" } } ``` --- ### friendlyNameChanged See: [friendlyName](/docs/170-core-secondscreen#friendlyname) ### launchRequest ``` function listen('launchRequest', () => void): Promise ``` See also: [listen()](/docs/170-core-secondscreen#listen), [once()](/docs/170-core-secondscreen#listen), [clear()](/docs/170-core-secondscreen#listen). Event value: [SecondScreenEvent](/docs/170-core-SecondScreen-schemas#SecondScreenEvent) Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:protocol:dial | #### Examples Default Example JavaScript: ``` import { SecondScreen } from '@firebolt-js/sdk' SecondScreen.listen('launchRequest', (launchRequestEvent) => { console.log(launchRequestEvent) }) ``` Value of `launchRequestEvent`: ``` { "type": "dial", "version": "1.7", "data": "{\"code\":\"AQDPQZiQcb3KQ7gY7yy5tHTMbbkGHR9Zjp-KL53H3eKBZIeAt7O9UKYPu6B21l2UZVmIqkFXDXBmXvK4g2e3EgZtjMNmKPsTltgnRl95DImtOXjSpWtTjSaOkW4w1kZKUTwLKdwVWTzBVH8ERHorvLU6vCGOVHxXt65LNwdl5HKRweShVC1V9QsyvRnQS61ov0UclmrH_xZML2Bt-Q-rZFjey5MjwupIb4x4f53XUJMhjHpDHoIUKrjpdPDQvK2a\",\"friendlyName\":\"Operator_TX061AEI\",\"UDN\":\"608fef11-2800-482a-962b-23a6690c93c1\"}" } ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "SecondScreen.onLaunchRequest", "params": { "listen": true } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": { "type": "dial", "version": "1.7", "data": "{\"code\":\"AQDPQZiQcb3KQ7gY7yy5tHTMbbkGHR9Zjp-KL53H3eKBZIeAt7O9UKYPu6B21l2UZVmIqkFXDXBmXvK4g2e3EgZtjMNmKPsTltgnRl95DImtOXjSpWtTjSaOkW4w1kZKUTwLKdwVWTzBVH8ERHorvLU6vCGOVHxXt65LNwdl5HKRweShVC1V9QsyvRnQS61ov0UclmrH_xZML2Bt-Q-rZFjey5MjwupIb4x4f53XUJMhjHpDHoIUKrjpdPDQvK2a\",\"friendlyName\":\"Operator_TX061AEI\",\"UDN\":\"608fef11-2800-482a-962b-23a6690c93c1\"}" } } ``` --- ## Private Events **View** ### closeRequest ``` function listen('closeRequest', () => void): Promise ``` See also: [listen()](/docs/170-core-secondscreen#listen), [once()](/docs/170-core-secondscreen#listen), [clear()](/docs/170-core-secondscreen#listen). Event value: [SecondScreenEvent](/docs/170-core-SecondScreen-schemas#SecondScreenEvent) Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:protocol:dial | #### Examples Default Example JavaScript: ``` import { SecondScreen } from '@firebolt-js/sdk' SecondScreen.listen('closeRequest', (closeRequestEvent) => { console.log(closeRequestEvent) }) ``` Value of `closeRequestEvent`: ``` { "type": "dial", "version": "1.7" } ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "SecondScreen.onCloseRequest", "params": { "listen": true } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": { "type": "dial", "version": "1.7" } } ``` --- ### friendlyNameChanged See: [friendlyName](/docs/170-core-secondscreen#friendlyname) ### launchRequest ``` function listen('launchRequest', () => void): Promise ``` See also: [listen()](/docs/170-core-secondscreen#listen), [once()](/docs/170-core-secondscreen#listen), [clear()](/docs/170-core-secondscreen#listen). Event value: [SecondScreenEvent](/docs/170-core-SecondScreen-schemas#SecondScreenEvent) Capabilities: | Role | Capability | | --- | --- | | uses | xrn:firebolt:capability:protocol:dial | #### Examples Default Example JavaScript: ``` import { SecondScreen } from '@firebolt-js/sdk' SecondScreen.listen('launchRequest', (launchRequestEvent) => { console.log(launchRequestEvent) }) ``` Value of `launchRequestEvent`: ``` { "type": "dial", "version": "1.7", "data": "{\"code\":\"AQDPQZiQcb3KQ7gY7yy5tHTMbbkGHR9Zjp-KL53H3eKBZIeAt7O9UKYPu6B21l2UZVmIqkFXDXBmXvK4g2e3EgZtjMNmKPsTltgnRl95DImtOXjSpWtTjSaOkW4w1kZKUTwLKdwVWTzBVH8ERHorvLU6vCGOVHxXt65LNwdl5HKRweShVC1V9QsyvRnQS61ov0UclmrH_xZML2Bt-Q-rZFjey5MjwupIb4x4f53XUJMhjHpDHoIUKrjpdPDQvK2a\",\"friendlyName\":\"Operator_TX061AEI\",\"UDN\":\"608fef11-2800-482a-962b-23a6690c93c1\"}" } ``` **JSON-RPC:** Request: ``` { "jsonrpc": "2.0", "id": 1, "method": "SecondScreen.onLaunchRequest", "params": { "listen": true } } ``` Response: ``` { "jsonrpc": "2.0", "id": 1, "result": { "type": "dial", "version": "1.7", "data": "{\"code\":\"AQDPQZiQcb3KQ7gY7yy5tHTMbbkGHR9Zjp-KL53H3eKBZIeAt7O9UKYPu6B21l2UZVmIqkFXDXBmXvK4g2e3EgZtjMNmKPsTltgnRl95DImtOXjSpWtTjSaOkW4w1kZKUTwLKdwVWTzBVH8ERHorvLU6vCGOVHxXt65LNwdl5HKRweShVC1V9QsyvRnQS61ov0UclmrH_xZML2Bt-Q-rZFjey5MjwupIb4x4f53XUJMhjHpDHoIUKrjpdPDQvK2a\",\"friendlyName\":\"Operator_TX061AEI\",\"UDN\":\"608fef11-2800-482a-962b-23a6690c93c1\"}" } } ``` --- ## Types