From 4bccdecaa34fc839cde6a2b9573cd535ef50f337 Mon Sep 17 00:00:00 2001 From: hensm Date: Mon, 25 Apr 2022 15:59:58 +0100 Subject: [PATCH] Move cast API code to cast/sdk/ and create wrapper class --- ext/src/cast/api/index.ts | 493 ----------------- ext/src/cast/api/media/index.ts | 22 - ext/src/cast/export.ts | 5 +- ext/src/cast/framework/GoogleCastLauncher.ts | 86 --- .../classes/ActiveInputStateEventData.ts | 11 - .../framework/classes/ApplicationMetadata.ts | 21 - .../classes/ApplicationMetadataEventData.ts | 12 - .../classes/ApplicationStatusEventData.ts | 11 - ext/src/cast/framework/classes/CastContext.ts | 38 -- ext/src/cast/framework/classes/CastOptions.ts | 25 - ext/src/cast/framework/classes/CastSession.ts | 107 ---- .../framework/classes/CastStateEventData.ts | 11 - ext/src/cast/framework/classes/EventData.ts | 5 - .../classes/MediaSessionEventData.ts | 13 - .../cast/framework/classes/RemotePlayer.ts | 33 -- .../classes/RemotePlayerChangedEvent.ts | 5 - .../classes/RemotePlayerController.ts | 50 -- .../classes/SessionStateEventData.ts | 16 - .../cast/framework/classes/VolumeEventData.ts | 9 - ext/src/cast/framework/enums.ts | 64 --- ext/src/cast/framework/index.ts | 91 ---- ext/src/cast/index.ts | 5 +- ext/src/cast/{api => sdk}/Session.ts | 86 ++- .../{api/dataClasses.ts => sdk/classes.ts} | 2 +- ext/src/cast/{api => sdk}/enums.ts | 0 ext/src/cast/sdk/index.ts | 512 ++++++++++++++++++ ext/src/cast/{api => sdk}/media/Media.ts | 6 +- .../dataClasses.ts => sdk/media/classes.ts} | 2 +- ext/src/cast/{api => sdk}/media/enums.ts | 0 ext/src/cast/sdk/media/index.ts | 140 +++++ ext/src/cast/{api => sdk}/types.ts | 4 +- ext/src/cast/types.ts | 4 +- ext/src/messaging.ts | 2 +- ext/src/types.ts | 2 +- ext/src/ui/popup/index.tsx | 2 + 35 files changed, 707 insertions(+), 1188 deletions(-) delete mode 100644 ext/src/cast/api/index.ts delete mode 100644 ext/src/cast/api/media/index.ts delete mode 100644 ext/src/cast/framework/GoogleCastLauncher.ts delete mode 100644 ext/src/cast/framework/classes/ActiveInputStateEventData.ts delete mode 100644 ext/src/cast/framework/classes/ApplicationMetadata.ts delete mode 100644 ext/src/cast/framework/classes/ApplicationMetadataEventData.ts delete mode 100644 ext/src/cast/framework/classes/ApplicationStatusEventData.ts delete mode 100644 ext/src/cast/framework/classes/CastContext.ts delete mode 100644 ext/src/cast/framework/classes/CastOptions.ts delete mode 100644 ext/src/cast/framework/classes/CastSession.ts delete mode 100644 ext/src/cast/framework/classes/CastStateEventData.ts delete mode 100644 ext/src/cast/framework/classes/EventData.ts delete mode 100644 ext/src/cast/framework/classes/MediaSessionEventData.ts delete mode 100644 ext/src/cast/framework/classes/RemotePlayer.ts delete mode 100644 ext/src/cast/framework/classes/RemotePlayerChangedEvent.ts delete mode 100644 ext/src/cast/framework/classes/RemotePlayerController.ts delete mode 100644 ext/src/cast/framework/classes/SessionStateEventData.ts delete mode 100644 ext/src/cast/framework/classes/VolumeEventData.ts delete mode 100644 ext/src/cast/framework/enums.ts delete mode 100644 ext/src/cast/framework/index.ts rename ext/src/cast/{api => sdk}/Session.ts (90%) rename ext/src/cast/{api/dataClasses.ts => sdk/classes.ts} (98%) rename ext/src/cast/{api => sdk}/enums.ts (100%) create mode 100644 ext/src/cast/sdk/index.ts rename ext/src/cast/{api => sdk}/media/Media.ts (98%) rename ext/src/cast/{api/media/dataClasses.ts => sdk/media/classes.ts} (99%) rename ext/src/cast/{api => sdk}/media/enums.ts (100%) create mode 100644 ext/src/cast/sdk/media/index.ts rename ext/src/cast/{api => sdk}/types.ts (97%) diff --git a/ext/src/cast/api/index.ts b/ext/src/cast/api/index.ts deleted file mode 100644 index 6b01bf7..0000000 --- a/ext/src/cast/api/index.ts +++ /dev/null @@ -1,493 +0,0 @@ -"use strict"; - -import logger from "../../lib/logger"; - -import { - ReceiverDevice, - ReceiverDeviceCapabilities as ReceiverDeviceCapabilities -} from "../../types"; -import { ErrorCallback, SuccessCallback } from "../types"; - -import { onMessage, sendMessageResponse } from "../eventMessageChannel"; - -import { - AutoJoinPolicy, - Capability, - DefaultActionPolicy, - DialAppState, - ErrorCode, - ReceiverAction, - ReceiverAvailability, - ReceiverType, - SenderPlatform, - SessionStatus, - VolumeControlType -} from "./enums"; - -import { - ApiConfig, - CredentialsData, - DialRequest, - Error as Error_, - Image, - Receiver, - ReceiverDisplayStatus, - SenderApplication, - SessionRequest, - Timeout, - Volume -} from "./dataClasses"; - -import Session from "./Session"; - -type ReceiverActionListener = ( - receiver: Receiver, - receiverAction: string -) => void; - -type RequestSessionSuccessCallback = (session: Session) => void; - -let apiConfig: Nullable; -let sessionRequest: Nullable; - -let requestSessionSuccessCallback: Nullable; -let requestSessionErrorCallback: Nullable; - -const receiverActionListeners = new Set(); - -const receiverDevices = new Map(); -const sessions = new Map(); - -export { - AutoJoinPolicy, - Capability, - DefaultActionPolicy, - DialAppState, - ErrorCode, - ReceiverAction, - ReceiverAvailability, - ReceiverType, - SenderPlatform, - SessionStatus, - VolumeControlType -}; - -export { - ApiConfig, - CredentialsData, - DialRequest, - Error_ as Error, - Image, - Receiver, - ReceiverDisplayStatus, - SenderApplication, - SessionRequest, - Timeout, - Volume, - Session -}; - -export const VERSION = [1, 2]; -export let isAvailable = false; - -export const timeout = new Timeout(); - -// chrome.cast.media namespace -export * as media from "./media"; - -/** - * Create `chrome.cast.Receiver` object from receiver device info. - */ -function createReceiver(device: ReceiverDevice) { - // Convert capabilities bitflag to string array - const capabilities: Capability[] = []; - if (device.capabilities & ReceiverDeviceCapabilities.VIDEO_OUT) { - capabilities.push(Capability.VIDEO_OUT); - } else if (device.capabilities & ReceiverDeviceCapabilities.VIDEO_IN) { - capabilities.push(Capability.VIDEO_IN); - } else if (device.capabilities & ReceiverDeviceCapabilities.AUDIO_OUT) { - capabilities.push(Capability.AUDIO_OUT); - } else if (device.capabilities & ReceiverDeviceCapabilities.AUDIO_IN) { - capabilities.push(Capability.AUDIO_IN); - } else if ( - device.capabilities & ReceiverDeviceCapabilities.MULTIZONE_GROUP - ) { - capabilities.push(Capability.MULTIZONE_GROUP); - } - - const receiver = new Receiver(device.id, device.friendlyName, capabilities); - - // Currently only supports CAST receivers - receiver.receiverType = ReceiverType.CAST; - - return receiver; -} - -function sendSessionRequest( - sessionRequest: SessionRequest, - receiverDevice: ReceiverDevice -) { - for (const listener of receiverActionListeners) { - listener(createReceiver(receiverDevice), ReceiverAction.CAST); - } - - sendMessageResponse({ - subject: "bridge:createCastSession", - data: { - appId: sessionRequest.appId, - receiverDevice: receiverDevice - } - }); -} - -export function initialize( - newApiConfig: ApiConfig, - successCallback?: SuccessCallback, - errorCallback?: ErrorCallback -) { - logger.info("cast.initialize"); - - // Already initialized - if (apiConfig) { - errorCallback?.(new Error_(ErrorCode.INVALID_PARAMETER)); - return; - } - - apiConfig = newApiConfig; - - sendMessageResponse({ - subject: "main:initializeCast", - data: { appId: apiConfig.sessionRequest.appId } - }); - - successCallback?.(); - - apiConfig.receiverListener( - receiverDevices.size - ? ReceiverAvailability.AVAILABLE - : ReceiverAvailability.UNAVAILABLE - ); -} - -export function requestSession( - successCallback: RequestSessionSuccessCallback, - errorCallback: ErrorCallback, - newSessionRequest?: SessionRequest, - receiverDevice?: ReceiverDevice -) { - logger.info("cast.requestSession"); - - // Not yet initialized - if (!apiConfig) { - errorCallback?.(new Error_(ErrorCode.API_NOT_INITIALIZED)); - return; - } - - // Already requesting session - if (sessionRequest) { - errorCallback?.( - new Error_( - ErrorCode.INVALID_PARAMETER, - "Session request already in progress." - ) - ); - return; - } - - // No receivers available - if (!receiverDevices.size) { - errorCallback?.(new Error_(ErrorCode.RECEIVER_UNAVAILABLE)); - return; - } - - /** - * Store session request for use in return message from - * receiver selection. - */ - sessionRequest = newSessionRequest ?? apiConfig.sessionRequest; - - requestSessionSuccessCallback = successCallback; - requestSessionErrorCallback = errorCallback; - - /** - * If a receiver was provided, skip the receiver selector - * process. - */ - if (receiverDevice) { - if (receiverDevice?.id && receiverDevices.has(receiverDevice.id)) { - sendSessionRequest(sessionRequest, receiverDevice); - } - } else { - // Open receiver selector UI - sendMessageResponse({ - subject: "main:selectReceiver" - }); - } -} - -export function requestSessionById(_sessionId: string): void { - logger.info("STUB :: cast.requestSessionById"); -} - -export function setCustomReceivers( - _receivers: Receiver[], - _successCallback?: SuccessCallback, - _errorCallback?: ErrorCallback -): void { - logger.info("STUB :: cast.setCustomReceivers"); -} - -export function setPageContext(_win: Window): void { - logger.info("STUB :: cast.setPageContext"); -} - -export function setReceiverDisplayStatus(_sessionId: string): void { - logger.info("STUB :: cast.setReceiverDisplayStatus"); -} - -export function unescape(escaped: string): string { - return window.decodeURI(escaped); -} - -export function addReceiverActionListener(listener: ReceiverActionListener) { - receiverActionListeners.add(listener); -} -export function removeReceiverActionListener(listener: ReceiverActionListener) { - receiverActionListeners.delete(listener); -} - -export function logMessage(message: string) { - logger.info("cast.logMessage", message); -} - -export function precache(_data: string) { - logger.info("STUB :: cast.precache"); -} - -onMessage(message => { - switch (message.subject) { - case "cast:initialized": { - isAvailable = true; - break; - } - - /** - * Once the bridge detects a session creation, session info - * and data needed to create cast API objects is sent. - */ - case "cast:sessionCreated": { - // Notify background to close UI - sendMessageResponse({ - subject: "main:closeReceiverSelector" - }); - - const status = message.data; - const receiverDevice = receiverDevices.get(status.receiverId); - if (!receiverDevice) { - logger.error( - `Could not find receiver device "${status.receiverFriendlyName}" (${status.receiverId})` - ); - break; - } - - const receiver = createReceiver(receiverDevice); - receiver.volume = status.volume; - receiver.displayStatus = new ReceiverDisplayStatus( - status.statusText, - status.appImages - ); - - const session = new Session( - status.sessionId, // sessionId - status.appId, // appId - status.displayName, // displayName - status.appImages, // appImages - receiver // receiver - ); - - session.senderApps = status.senderApps; - session.transportId = status.transportId; - - sessions.set(session.sessionId, session); - } - // eslint-disable-next-line no-fallthrough - case "cast:sessionUpdated": { - const status = message.data; - const session = sessions.get(status.sessionId); - if (!session) { - logger.error(`Session not found (${status.sessionId})`); - return; - } - - session.statusText = status.statusText; - session.namespaces = status.namespaces; - session.receiver.volume = status.volume; - - /** - * If session created via requestSession, the success - * callback will be set, otherwise the session was created - * by the extension and the session listener should be - * called instead. - */ - if (requestSessionSuccessCallback) { - requestSessionSuccessCallback(session); - requestSessionSuccessCallback = null; - requestSessionErrorCallback = null; - } else { - apiConfig?.sessionListener(session); - } - - break; - } - - case "cast:sessionStopped": { - const { sessionId } = message.data; - const session = sessions.get(sessionId); - if (session) { - session.status = SessionStatus.STOPPED; - - const updateListeners = session?._updateListeners; - if (updateListeners) { - for (const listener of updateListeners) { - listener(false); - } - } - } - - break; - } - - case "cast:receivedSessionMessage": { - const { sessionId, namespace, messageData } = message.data; - const session = sessions.get(sessionId); - if (session) { - const _messageListeners = session._messageListeners; - const listeners = _messageListeners.get(namespace); - - if (listeners) { - for (const listener of listeners) { - listener(namespace, messageData); - } - } - } - - break; - } - - case "cast:impl_sendMessage": { - const { sessionId, messageId, error } = message.data; - - const session = sessions.get(sessionId); - if (!session) { - break; - } - - const callbacks = session._sendMessageCallbacks.get(messageId); - if (callbacks) { - const [successCallback, errorCallback] = callbacks; - - if (error) { - errorCallback?.(new Error_(error)); - return; - } - - successCallback?.(); - } - - break; - } - - case "cast:receiverDeviceUp": { - const { receiverDevice } = message.data; - if (receiverDevices.has(receiverDevice.id)) { - break; - } - - receiverDevices.set(receiverDevice.id, receiverDevice); - - if (apiConfig) { - // Notify listeners of new cast destination - apiConfig.receiverListener(ReceiverAvailability.AVAILABLE); - } - - break; - } - - case "cast:receiverDeviceDown": { - const { receiverDeviceId } = message.data; - - receiverDevices.delete(receiverDeviceId); - - if (receiverDevices.size === 0) { - if (apiConfig) { - apiConfig.receiverListener( - ReceiverAvailability.UNAVAILABLE - ); - } - } - - break; - } - - case "cast:selectReceiver/selected": { - logger.info("Selected receiver"); - - if (sessionRequest) { - sendSessionRequest(sessionRequest, message.data.receiverDevice); - sessionRequest = null; - } - - break; - } - - case "cast:selectReceiver/stopped": { - const { receiverDevice } = message.data; - - logger.info("Stopped receiver"); - - if (sessionRequest) { - sessionRequest = null; - - for (const listener of receiverActionListeners) { - listener( - // TODO: Use existing receiver object? - createReceiver(receiverDevice), - ReceiverAction.STOP - ); - } - } - - break; - } - - // Popup closed before session established - case "cast:selectReceiver/cancelled": { - if (sessionRequest) { - sessionRequest = null; - - requestSessionErrorCallback?.(new Error_(ErrorCode.CANCEL)); - } - - break; - } - - // Session request initiated via receiver selector - case "cast:launchApp": { - if (sessionRequest) { - logger.error("Session request already in progress."); - break; - } - if (!apiConfig?.sessionRequest) { - logger.error("Session request not found!"); - break; - } - - sendSessionRequest( - apiConfig.sessionRequest, - message.data.receiverDevice - ); - - break; - } - } -}); diff --git a/ext/src/cast/api/media/index.ts b/ext/src/cast/api/media/index.ts deleted file mode 100644 index c652bd6..0000000 --- a/ext/src/cast/api/media/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -"use strict"; - -import Media from "./Media"; - -export { Media }; - -export * from "./dataClasses"; -export * from "./enums"; - -export const timeout = { - editTracksInfo: 0, - getStatus: 0, - load: 0, - pause: 0, - play: 0, - queue: 0, - seek: 0, - setVolume: 0, - stop: 0 -}; - -export const DEFAULT_MEDIA_RECEIVER_APP_ID = "CC1AD845"; diff --git a/ext/src/cast/export.ts b/ext/src/cast/export.ts index 2461d5e..c405e44 100644 --- a/ext/src/cast/export.ts +++ b/ext/src/cast/export.ts @@ -1,6 +1,5 @@ "use strict"; -import * as cast from "./api"; import { Message } from "../messaging"; import { BridgeInfo } from "../lib/bridge"; @@ -12,6 +11,8 @@ import { sendMessage } from "./eventMessageChannel"; +import CastSDK from "./sdk"; + let initializedBridgeInfo: BridgeInfo; let initializedBackgroundPort: MessagePort; @@ -103,4 +104,4 @@ export function ensureInit(): Promise> { }); } -export default cast; +export default new CastSDK(); diff --git a/ext/src/cast/framework/GoogleCastLauncher.ts b/ext/src/cast/framework/GoogleCastLauncher.ts deleted file mode 100644 index e115a01..0000000 --- a/ext/src/cast/framework/GoogleCastLauncher.ts +++ /dev/null @@ -1,86 +0,0 @@ -"use strict"; - -import logger from "../../lib/logger"; - -/** - * Custom element for a cast button used by sites that injects - * a cast icon and manages visibility state and event handling. - */ -export default class GoogleCastLauncher extends HTMLElement { - constructor() { - super(); - - this.style.display = "none"; - - const style = document.createElement("style"); - style.textContent = ` - .cast_caf_state_c { - fill: var(--connected-color, #4285f4); - } - .cast_caf_state_d { - fill: var(--disconnected-color, #7d7d7d); - } - .cast_caf_state_h { - opacity: 0; - } - `; - - const SVG_NAMESPACE = "http://www.w3.org/2000/svg"; - - const icon = document.createElementNS(SVG_NAMESPACE, "svg"); - const iconArch0 = document.createElementNS(SVG_NAMESPACE, "path"); - const iconArch1 = document.createElementNS(SVG_NAMESPACE, "path"); - const iconArch2 = document.createElementNS(SVG_NAMESPACE, "path"); - const iconBox = document.createElementNS(SVG_NAMESPACE, "path"); - const iconBoxFill = document.createElementNS(SVG_NAMESPACE, "path"); - - // Set SVG attributes - icon.setAttribute("x", "0"); - icon.setAttribute("y", "0"); - icon.setAttribute("width", "100%"); - icon.setAttribute("height", "100%"); - icon.setAttribute("viewBox", "0 0 24 24"); - - iconArch0.classList.add("cast_caf_state_d"); - iconArch0.setAttribute("id", "cast_caf_icon_arch0"); - iconArch0.setAttribute("d", "M1 18v3h3c0-1.7-1.34-3-3-3z"); - - iconArch1.classList.add("cast_caf_state_d"); - iconArch1.setAttribute("id", "cast_caf_icon_arch1"); - iconArch1.setAttribute( - "d", - "M1 14v2c2.76 0 5 2.2 5 5h2c0-3.87-3.13-7-7-7z" - ); - - iconArch2.classList.add("cast_caf_state_d"); - iconArch2.setAttribute("id", "cast_caf_icon_arch2"); - iconArch2.setAttribute( - "d", - "M1 10v2c4.97 0 9 4 9 9h2c0-6.08-4.93-11-11-11z" - ); - - iconBox.classList.add("cast_caf_state_d"); - iconBox.setAttribute("id", "cast_caf_icon_box"); - iconBox.setAttribute( - "d", - "M21 3H3c-1.1 0-2 .9-2 2v3h2V5h18v14h-7v2h7c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z" - ); - - iconBoxFill.classList.add("cast_caf_state_h"); - iconBoxFill.setAttribute("id", "cast_caf_icon_boxfill"); - iconBoxFill.setAttribute( - "d", - "M5 7v1.63C8 8.6 13.37 14 13.37 17H19V7z" - ); - - // Add icon paths to SVG - icon.append(iconArch0, iconArch1, iconArch2, iconBox, iconBoxFill); - - const shadow = this.attachShadow({ mode: "open" }); - shadow.append(icon, style); - - this.addEventListener("click", () => { - logger.info(" onClick"); - }); - } -} diff --git a/ext/src/cast/framework/classes/ActiveInputStateEventData.ts b/ext/src/cast/framework/classes/ActiveInputStateEventData.ts deleted file mode 100644 index 39028a6..0000000 --- a/ext/src/cast/framework/classes/ActiveInputStateEventData.ts +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; - -import EventData from "./EventData"; - -import { SessionEventType } from "../enums"; - -export default class ActiveInputStateEventData extends EventData { - constructor(public activeInputState: number) { - super(SessionEventType.ACTIVE_INPUT_STATE_CHANGED); - } -} diff --git a/ext/src/cast/framework/classes/ApplicationMetadata.ts b/ext/src/cast/framework/classes/ApplicationMetadata.ts deleted file mode 100644 index 46622ce..0000000 --- a/ext/src/cast/framework/classes/ApplicationMetadata.ts +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; - -import * as cast from "../../api"; - -export default class ApplicationMetadata { - public applicationId: string; - public images: cast.Image[]; - public name: string; - public namespaces: string[]; - - constructor(sessionObj: cast.Session) { - this.applicationId = sessionObj.appId; - this.images = sessionObj.appImages; - this.name = sessionObj.displayName; - - // Convert [{ name: }, ...] to [ , ... ] - this.namespaces = sessionObj.namespaces.map( - namespaceObj => namespaceObj.name - ); - } -} diff --git a/ext/src/cast/framework/classes/ApplicationMetadataEventData.ts b/ext/src/cast/framework/classes/ApplicationMetadataEventData.ts deleted file mode 100644 index 9e4955c..0000000 --- a/ext/src/cast/framework/classes/ApplicationMetadataEventData.ts +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; - -import ApplicationMetadata from "./ApplicationMetadata"; -import EventData from "./EventData"; - -import { SessionEventType } from "../enums"; - -export default class ApplicationMetadataEventData extends EventData { - constructor(public metadata: ApplicationMetadata) { - super(SessionEventType.APPLICATION_METADATA_CHANGED); - } -} diff --git a/ext/src/cast/framework/classes/ApplicationStatusEventData.ts b/ext/src/cast/framework/classes/ApplicationStatusEventData.ts deleted file mode 100644 index 966fc27..0000000 --- a/ext/src/cast/framework/classes/ApplicationStatusEventData.ts +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; - -import EventData from "./EventData"; - -import { SessionEventType } from "../enums"; - -export default class ApplicationStatusEventData extends EventData { - constructor(public status: string) { - super(SessionEventType.APPLICATION_STATUS_CHANGED); - } -} diff --git a/ext/src/cast/framework/classes/CastContext.ts b/ext/src/cast/framework/classes/CastContext.ts deleted file mode 100644 index 3ddd1ff..0000000 --- a/ext/src/cast/framework/classes/CastContext.ts +++ /dev/null @@ -1,38 +0,0 @@ -"use strict"; - -import logger from "../../../lib/logger"; - -import CastOptions from "./CastOptions"; -import CastSession from "./CastSession"; - -export default class CastContext extends EventTarget { - public endCurrentSession(_stopCasting: boolean): void { - logger.info("STUB :: CastContext#endCurrentSession"); - } - - // @ts-ignore - public getCastState(): string { - logger.info("STUB :: CastContext#getCastState"); - } - - // @ts-ignore - public getCurrentSession(): CastSession { - logger.info("STUB :: CastContext#getCurrentSession"); - } - - // @ts-ignore - public getSessionState(): string { - logger.info("STUB :: CastContext#getSessionState"); - } - - // @ts-ignore - public requestSession(): Promise { - logger.info("STUB :: CastContext#requestSession"); - } - - public setOptions(_options: CastOptions): void { - logger.info("STUB :: CastContext#setOptions"); - } -} - -export const instance = new CastContext(); diff --git a/ext/src/cast/framework/classes/CastOptions.ts b/ext/src/cast/framework/classes/CastOptions.ts deleted file mode 100644 index 7ba0363..0000000 --- a/ext/src/cast/framework/classes/CastOptions.ts +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; - -import * as cast from "../../api"; - -export default class CastOptions { - public autoJoinPolicy: string = cast.AutoJoinPolicy.TAB_AND_ORIGIN_SCOPED; - public language: string | null = null; - public receiverApplicationId: string | null = null; - public resumeSavedSession = true; - - constructor(options: CastOptions = {} as CastOptions) { - if (options.autoJoinPolicy) { - this.autoJoinPolicy = options.autoJoinPolicy; - } - if (options.language) { - this.language = options.language; - } - if (options.receiverApplicationId) { - this.receiverApplicationId = options.receiverApplicationId; - } - if (options.resumeSavedSession) { - this.resumeSavedSession = options.resumeSavedSession; - } - } -} diff --git a/ext/src/cast/framework/classes/CastSession.ts b/ext/src/cast/framework/classes/CastSession.ts deleted file mode 100644 index 21448c5..0000000 --- a/ext/src/cast/framework/classes/CastSession.ts +++ /dev/null @@ -1,107 +0,0 @@ -"use strict"; - -import logger from "../../../lib/logger"; - -import * as cast from "../../api"; - -import ApplicationMetadata from "./ApplicationMetadata"; - -type MessageListener = (namespace: string, message: string) => void; - -export default class CastSession extends EventTarget { - constructor(_sessionObj: cast.Session, _state: string) { - super(); - logger.info("STUB :: CastSession#constructor"); - } - - public addMessageListener( - _namespace: string, - _listener: MessageListener - ): void { - logger.info("STUB :: CastSession#addMessageListener"); - } - - public endSession(_stopCasting: boolean): void { - logger.info("STUB :: CastSession#endSession"); - } - - // @ts-ignore - public getActiveInputState(): number { - logger.info("STUB :: CastSession#getActiveInputState"); - } - - // @ts-ignore - public getApplicationMetadata(): ApplicationMetadata { - logger.info("STUB :: CastSession#getApplicationMetadata"); - } - - // @ts-ignore - public getApplicationStatus(): string { - logger.info("STUB :: CastSession#getApplicationStatus"); - } - - // @ts-ignore - public getCastDevice(): cast.Receiver { - logger.info("STUB :: CastSession#getCastDevice"); - } - - // @ts-ignore - public getMediaSession(): cast.media.Media { - logger.info("STUB :: CastSession#getMediaSession"); - } - - // @ts-ignore - public getSessionId(): string { - logger.info("STUB :: CastSession#getSessionId"); - } - - // @ts-ignore - public getSessionObj(): cast.Session { - logger.info("STUB :: CastSession#getSessionObj"); - } - - // @ts-ignore - public getSessionState(): string { - logger.info("STUB :: CastSession#getSessionState"); - } - - // @ts-ignore - public getVolume(): number { - logger.info("STUB :: CastSession#getVolume"); - } - - // @ts-ignore - public isMute(): boolean { - logger.info("STUB :: CastSession#isMute"); - } - - // @ts-ignore - public loadMedia(_loadRequest: cast.media.LoadRequest): Promise { - logger.info("STUB :: CastSession#loadMedia"); - } - - public removeMessageListener( - _namespace: string, - _listener: MessageListener - ): void { - logger.info("STUB :: CastSession#removeMessageListener"); - } - - public sendMessage( - _namespace: string, - // @ts-ignore - _data: any - ): Promise { - logger.info("STUB :: CastSession#sendMessage"); - } - - // @ts-ignore - public setMute(_isMute: boolean): Promise { - logger.info("STUB :: CastSession#setMute"); - } - - // @ts-ignore - public setVolume(_volume: number): Promise { - logger.info("STUB :: CastSession#setVolume"); - } -} diff --git a/ext/src/cast/framework/classes/CastStateEventData.ts b/ext/src/cast/framework/classes/CastStateEventData.ts deleted file mode 100644 index 18e03bc..0000000 --- a/ext/src/cast/framework/classes/CastStateEventData.ts +++ /dev/null @@ -1,11 +0,0 @@ -"use strict"; - -import EventData from "./EventData"; - -import { CastContextEventType } from "../enums"; - -export default class CastStateEventData extends EventData { - constructor(public castState: string) { - super(CastContextEventType.CAST_STATE_CHANGED); - } -} diff --git a/ext/src/cast/framework/classes/EventData.ts b/ext/src/cast/framework/classes/EventData.ts deleted file mode 100644 index 342bb8c..0000000 --- a/ext/src/cast/framework/classes/EventData.ts +++ /dev/null @@ -1,5 +0,0 @@ -"use strict"; - -export default class EventData { - constructor(public type: string) {} -} diff --git a/ext/src/cast/framework/classes/MediaSessionEventData.ts b/ext/src/cast/framework/classes/MediaSessionEventData.ts deleted file mode 100644 index dd88ff5..0000000 --- a/ext/src/cast/framework/classes/MediaSessionEventData.ts +++ /dev/null @@ -1,13 +0,0 @@ -"use strict"; - -import * as cast from "../../api"; - -import EventData from "./EventData"; - -import { SessionEventType } from "../enums"; - -export default class MediaSessionEventData extends EventData { - constructor(public mediaSession: cast.media.Media) { - super(SessionEventType.MEDIA_SESSION); - } -} diff --git a/ext/src/cast/framework/classes/RemotePlayer.ts b/ext/src/cast/framework/classes/RemotePlayer.ts deleted file mode 100644 index 832a5a7..0000000 --- a/ext/src/cast/framework/classes/RemotePlayer.ts +++ /dev/null @@ -1,33 +0,0 @@ -"use strict"; - -import * as cast from "../../api"; - -import RemotePlayerController from "./RemotePlayerController"; - -interface SavedPlayerState { - mediaInfo: string; - currentTime: number; - isPaused: boolean; -} - -export default class RemotePlayer { - public canControlVolume = false; - public canPause = false; - public canSeek = false; - public controller: RemotePlayerController | null = null; - public currentTime = 0; - public displayName = ""; - public displayStatus = ""; - public duration = 0; - public imageUrl: string | null = null; - public isConnected = false; - public isMediaLoaded = false; - public isMuted = false; - public isPaused = false; - public mediaInfo: cast.media.MediaInfo | null = null; - public playerState: string | null = null; - public savedPlayerState: SavedPlayerState | null = null; - public statusText = ""; - public title = ""; - public volumeLevel = 1; -} diff --git a/ext/src/cast/framework/classes/RemotePlayerChangedEvent.ts b/ext/src/cast/framework/classes/RemotePlayerChangedEvent.ts deleted file mode 100644 index c68117d..0000000 --- a/ext/src/cast/framework/classes/RemotePlayerChangedEvent.ts +++ /dev/null @@ -1,5 +0,0 @@ -"use strict"; - -export default class RemotePlayerChangedEvent { - constructor(public type: string, public field: string, public value: any) {} -} diff --git a/ext/src/cast/framework/classes/RemotePlayerController.ts b/ext/src/cast/framework/classes/RemotePlayerController.ts deleted file mode 100644 index e4fd9b0..0000000 --- a/ext/src/cast/framework/classes/RemotePlayerController.ts +++ /dev/null @@ -1,50 +0,0 @@ -"use strict"; - -import logger from "../../../lib/logger"; - -import RemotePlayer from "./RemotePlayer"; - -export default class RemotePlayerController extends EventTarget { - constructor(_player: RemotePlayer) { - super(); - logger.info("STUB :: RemotePlayerController#constructor"); - } - - public getFormattedTime(timeInSec: number): string { - const hours = Math.floor(timeInSec / 3600) % 24; - const minutes = Math.floor(timeInSec / 60) % 60; - const seconds = timeInSec % 60; - - return [hours, minutes, seconds] - .map(c => c.toString().padStart(2, "0")) - .join(":"); - } - - public getSeekPosition(currentTime: number, duration: number) { - return (currentTime / duration) * 100; - } - - public getSeekTime(currentPosition: number, duration: number) { - return (duration / 100) * currentPosition; - } - - public muteOrUnmute(): void { - logger.info("STUB :: RemotePlayerController#muteOrUnmute"); - } - - public playOrPause(): void { - logger.info("STUB :: RemotePlayerController#playOrPause"); - } - - public seek(): void { - logger.info("STUB :: RemotePlayerController#seek"); - } - - public setVolumeLevel(): void { - logger.info("STUB :: RemotePlayerController#setVolumeLevel"); - } - - public stop(): void { - logger.info("STUB :: RemotePlayerController#stop"); - } -} diff --git a/ext/src/cast/framework/classes/SessionStateEventData.ts b/ext/src/cast/framework/classes/SessionStateEventData.ts deleted file mode 100644 index 1d3f523..0000000 --- a/ext/src/cast/framework/classes/SessionStateEventData.ts +++ /dev/null @@ -1,16 +0,0 @@ -"use strict"; - -import CastSession from "./CastSession"; -import EventData from "./EventData"; - -import { SessionEventType } from "../enums"; - -export default class SessionStateEventData extends EventData { - constructor( - public session: CastSession, - public sessionState: string, - public errorCode: string | null = null - ) { - super(SessionEventType.APPLICATION_STATUS_CHANGED); - } -} diff --git a/ext/src/cast/framework/classes/VolumeEventData.ts b/ext/src/cast/framework/classes/VolumeEventData.ts deleted file mode 100644 index 1e9244a..0000000 --- a/ext/src/cast/framework/classes/VolumeEventData.ts +++ /dev/null @@ -1,9 +0,0 @@ -"use strict"; - -import { SessionEventType } from "../enums"; - -export default class VolumeEventData { - public type = SessionEventType.VOLUME_CHANGED; - - constructor(public volume: number, public isMute: boolean) {} -} diff --git a/ext/src/cast/framework/enums.ts b/ext/src/cast/framework/enums.ts deleted file mode 100644 index f1ca537..0000000 --- a/ext/src/cast/framework/enums.ts +++ /dev/null @@ -1,64 +0,0 @@ -"use strict"; - -export enum ActiveInputState { - ACTIVE_INPUT_STATE_UNKNOWN = -1, - ACTIVE_INPUT_STATE_NO = 0, - ACTIVE_INPUT_YES = 1 -} - -export enum CastContextEventType { - CAST_STATE_CHANGED = "caststatechanged", - SESSION_STATE_CHANGED = "sessionstatechanged" -} - -export enum CastState { - NO_DEVICES_AVAILABLE = "NO_DEVICES_AVAILABLE", - NOT_CONNECTED = "NOT_CONNECTED", - CONNECTING = "CONNECTING", - CONNECTED = "CONNECTED" -} - -export enum LoggerLevel { - DEBUG = 0, - INFO = 800, - WARNING = 900, - ERROR = 1000, - NONE = 1500 -} - -export enum RemotePlayerEventType { - ANY_CHANGE = "anyChanged", - IS_CONNECTED_CHANGE = "isConnectedChanged", - IS_MEDIA_LOADED_CHANGED = "isMediaLoadedChanged", - DURATION_CHANGED = "durationChanged", - CURRENT_TIME_CHANGED = "currentTimeChanged", - IS_PAUSED_CHANGED = "isPausedChanged", - VOLUME_LEVEL_CHANGED = "volumeLevelChanged", - CAN_CONTROL_VOLUME_CHANGED = "canControlVolumeChanged", - IS_MUTED_CHANGED = "isMutedChanged", - CAN_PAUSE_CHANGED = "canPauseChanged", - CAN_SEEK_CHANGED = "canSeekChanged", - DISPLAY_NAME_CHANGED = "displayNameChanged", - STATUS_TEXT_CHANGED = "statusTextChanged", - MEDIA_INFO_CHANGED = "mediaInfoChanged", - IMAGE_URL_CHANGED = "imageUrlChanged", - PLAYER_STATE_CHANGED = "playerStateChanged" -} - -export enum SessionEventType { - APPLICATION_STATUS_CHANGED = "applicationstatuschanged", - APPLICATION_METADATA_CHANGED = "applicationmetadatachanged", - ACTIVE_INPUT_STATE_CHANGED = "activeinputstatechanged", - VOLUME_CHANGED = "volumechanged", - MEDIA_SESSION = "mediasession" -} - -export enum SessionState { - NO_SESSION = "NO_SESSION", - SESSION_STARTING = "SESSION_STARTING", - SESSION_STARTED = "SESSION_STARTED", - SESSION_START_FAILED = "SESSION_START_FAILED", - SESSION_ENDING = "SESSION_ENDING", - SESSION_ENDED = "SESSION_ENDED", - SESSION_RESUMED = "SESSION_RESUMED" -} diff --git a/ext/src/cast/framework/index.ts b/ext/src/cast/framework/index.ts deleted file mode 100644 index 8cacd8b..0000000 --- a/ext/src/cast/framework/index.ts +++ /dev/null @@ -1,91 +0,0 @@ -"use strict"; - -import logger from "../../lib/logger"; - -import ActiveInputStateEventData from "./classes/ActiveInputStateEventData"; -import ApplicationMetadata from "./classes/ApplicationMetadata"; -import ApplicationMetadataEventData from "./classes/ApplicationMetadataEventData"; -import ApplicationStatusEventData from "./classes/ApplicationStatusEventData"; -import CastContext, { instance } from "./classes/CastContext"; -import CastOptions from "./classes/CastOptions"; -import CastSession from "./classes/CastSession"; -import CastStateEventData from "./classes/CastStateEventData"; -import EventData from "./classes/EventData"; -import MediaSessionEventData from "./classes/MediaSessionEventData"; -import RemotePlayer from "./classes/RemotePlayer"; -import RemotePlayerChangedEvent from "./classes/RemotePlayerChangedEvent"; -import RemotePlayerController from "./classes/RemotePlayerController"; -import SessionStateEventData from "./classes/SessionStateEventData"; -import VolumeEventData from "./classes/VolumeEventData"; - -import { - ActiveInputState, - CastContextEventType, - CastState, - LoggerLevel, - RemotePlayerEventType, - SessionEventType, - SessionState -} from "./enums"; - -import GoogleCastLauncher from "./GoogleCastLauncher"; - -export default { - // Enums - ActiveInputState, - CastContextEventType, - CastState, - LoggerLevel, - RemotePlayerEventType, - SessionEventType, - SessionState, - - // Classes - ActiveInputStateEventData, - ApplicationMetadata, - ApplicationMetadataEventData, - ApplicationStatusEventData, - CastOptions, - CastSession, - CastStateEventData, - EventData, - MediaSessionEventData, - RemotePlayer, - RemotePlayerChangedEvent, - RemotePlayerController, - SessionStateEventData, - VolumeEventData, - - /** - * CastContext class with an extra getInstance method used to - * instantiate and fetch a singleton instance. - */ - CastContext: { - ...CastContext, - - getInstance() { - return instance; - } - }, - - VERSION: "1.0.07", - - setLoggerLevel(_level: number) { - logger.info("STUB :: cast.framework.setLoggerLevel"); - } -}; - -/** - * The Framework API defines a element - * and a