mirror of
https://github.com/hensm/fx_cast.git
synced 2026-06-12 18:39:58 +00:00
Restructure background script (#70)
Splits some background script functionality into separate modules: - Receiver selector handling is moved to ./SelectorManager. - Status bridge handling is moved to ./StatusManager. - Menu creation and updates are handled in ./createMenus. - Shim creation is handled in ./createShim. TypedEventTarget allows EventTarget-derived classes to export typed events. Options type definition is moved to ./lib/options, module assumes more responsibility for update handling and provides a "changed" event. Private cast._requestSession method allows bypassing receiver selector.
This commit is contained in:
@@ -4,7 +4,7 @@ import ApiConfig from "./classes/ApiConfig";
|
||||
import DialRequest from "./classes/DialRequest";
|
||||
import Error_ from "./classes/Error";
|
||||
import Image_ from "./classes/Image";
|
||||
import Receiver from "./classes/Receiver";
|
||||
import Receiver_ from "./classes/Receiver";
|
||||
import ReceiverDisplayStatus from "./classes/ReceiverDisplayStatus";
|
||||
import SenderApplication from "./classes/SenderApplication";
|
||||
import Session from "./classes/Session";
|
||||
@@ -26,18 +26,18 @@ import { AutoJoinPolicy
|
||||
|
||||
import * as media from "./media";
|
||||
|
||||
|
||||
import { ReceiverSelectorMediaType }
|
||||
from "../../receiver_selectors/ReceiverSelector";
|
||||
from "../../receiver_selectors/ReceiverSelector";
|
||||
import { Receiver } from "../../types";
|
||||
import { onMessage, sendMessageResponse } from "../eventMessageChannel";
|
||||
|
||||
|
||||
type ReceiverActionListener = (
|
||||
receiver: Receiver
|
||||
receiver: Receiver_
|
||||
, receiverAction: string) => void;
|
||||
|
||||
type RequestSessionSuccessCallback = (
|
||||
session: Session
|
||||
, selectedMedia: ReceiverSelectorMediaType) => void;
|
||||
type RequestSessionSuccessCallback = (session: Session) => void;
|
||||
|
||||
type SuccessCallback = () => void;
|
||||
type ErrorCallback = (err: Error_) => void;
|
||||
@@ -61,12 +61,13 @@ export {
|
||||
, SenderPlatform, SessionStatus, VolumeControlType
|
||||
|
||||
// Classes
|
||||
, ApiConfig, DialRequest, Receiver, ReceiverDisplayStatus
|
||||
, ApiConfig, DialRequest, ReceiverDisplayStatus
|
||||
, SenderApplication, Session, SessionRequest, Timeout
|
||||
, Volume
|
||||
|
||||
, Error_ as Error
|
||||
, Image_ as Image
|
||||
, Receiver_ as Receiver
|
||||
|
||||
, media
|
||||
};
|
||||
@@ -84,14 +85,17 @@ export function addReceiverActionListener (
|
||||
|
||||
export function initialize (
|
||||
newApiConfig: ApiConfig
|
||||
, successCallback: SuccessCallback
|
||||
, errorCallback: ErrorCallback): void {
|
||||
, successCallback?: SuccessCallback
|
||||
, errorCallback?: ErrorCallback): void {
|
||||
|
||||
console.info("fx_cast (Debug): cast.initialize");
|
||||
|
||||
// Already initialized
|
||||
if (apiConfig) {
|
||||
errorCallback(new Error_(ErrorCode.INVALID_PARAMETER));
|
||||
if (errorCallback) {
|
||||
errorCallback(new Error_(ErrorCode.INVALID_PARAMETER));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -106,7 +110,9 @@ export function initialize (
|
||||
? ReceiverAvailability.AVAILABLE
|
||||
: ReceiverAvailability.UNAVAILABLE);
|
||||
|
||||
successCallback();
|
||||
if (successCallback) {
|
||||
successCallback();
|
||||
}
|
||||
}
|
||||
|
||||
export function logMessage (message: string): void {
|
||||
@@ -125,29 +131,37 @@ export function removeReceiverActionListener (
|
||||
}
|
||||
|
||||
export function requestSession (
|
||||
successCallback: RequestSessionSuccessCallback
|
||||
, errorCallback: ErrorCallback
|
||||
, sessionRequest: SessionRequest
|
||||
= apiConfig.sessionRequest): void {
|
||||
successCallback?: RequestSessionSuccessCallback
|
||||
, errorCallback?: ErrorCallback
|
||||
, sessionRequest: SessionRequest = apiConfig.sessionRequest): void {
|
||||
|
||||
console.info("fx_cast (Debug): cast.requestSession");
|
||||
|
||||
// Called before initialization
|
||||
if (!apiConfig) {
|
||||
errorCallback(new Error_(ErrorCode.API_NOT_INITIALIZED));
|
||||
if (errorCallback) {
|
||||
errorCallback(new Error_(ErrorCode.API_NOT_INITIALIZED));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Already requesting session
|
||||
if (sessionRequestInProgress) {
|
||||
errorCallback(new Error_(ErrorCode.INVALID_PARAMETER
|
||||
, "Session request already in progress."));
|
||||
if (errorCallback) {
|
||||
errorCallback(new Error_(ErrorCode.INVALID_PARAMETER
|
||||
, "Session request already in progress."));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// No available receivers
|
||||
if (!receiverList.length) {
|
||||
errorCallback(new Error_(ErrorCode.RECEIVER_UNAVAILABLE));
|
||||
if (errorCallback) {
|
||||
errorCallback(new Error_(ErrorCode.RECEIVER_UNAVAILABLE));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -159,21 +173,94 @@ export function requestSession (
|
||||
// Open destination chooser
|
||||
sendMessageResponse({
|
||||
subject: "main:/selectReceiverBegin"
|
||||
, data: {
|
||||
defaultMediaType: apiConfig._defaultMediaType
|
||||
, availableMediaTypes: apiConfig._availableMediaTypes
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function _requestSession (
|
||||
_receiver: Receiver
|
||||
, successCallback?: RequestSessionSuccessCallback
|
||||
, errorCallback?: ErrorCallback): void {
|
||||
|
||||
console.info("fx_cast (Debug): cast._requestSession");
|
||||
|
||||
if (!apiConfig) {
|
||||
if (errorCallback) {
|
||||
errorCallback(new Error_(ErrorCode.API_NOT_INITIALIZED));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (sessionRequestInProgress) {
|
||||
if (errorCallback) {
|
||||
errorCallback(new Error_(ErrorCode.INVALID_PARAMETER
|
||||
, "Session request already in progress."));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!receiverList.length) {
|
||||
if (errorCallback) {
|
||||
errorCallback(new Error_(ErrorCode.RECEIVER_UNAVAILABLE));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
sessionRequestInProgress = true;
|
||||
|
||||
sessionSuccessCallback = successCallback;
|
||||
sessionErrorCallback = errorCallback;
|
||||
|
||||
|
||||
const selectedReceiver = new Receiver_(
|
||||
_receiver.id
|
||||
, _receiver.friendlyName);
|
||||
|
||||
(selectedReceiver as any)._address = _receiver.host;
|
||||
(selectedReceiver as any)._port = _receiver.port;
|
||||
|
||||
function createSession () {
|
||||
sessionList.push(new Session(
|
||||
sessionList.length.toString() // sessionId
|
||||
, apiConfig.sessionRequest.appId // appId
|
||||
, _receiver.friendlyName // displayName
|
||||
, [] // appImages
|
||||
, selectedReceiver // receiver
|
||||
, (session: Session) => {
|
||||
sendMessageResponse({
|
||||
subject: "main:/sessionCreated"
|
||||
});
|
||||
|
||||
sessionRequestInProgress = false;
|
||||
|
||||
if (sessionSuccessCallback) {
|
||||
sessionSuccessCallback(session);
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
// If an existing session is active, stop it and start new one
|
||||
if (sessionList.length) {
|
||||
const lastSession = sessionList[sessionList.length - 1];
|
||||
|
||||
if (lastSession.status !== SessionStatus.STOPPED) {
|
||||
lastSession.stop(createSession, null);
|
||||
}
|
||||
} else {
|
||||
createSession();
|
||||
}
|
||||
}
|
||||
|
||||
export function requestSessionById (sessionId: string): void {
|
||||
console.info("STUB :: cast.requestSessionById");
|
||||
}
|
||||
|
||||
export function setCustomReceivers (
|
||||
receivers: Receiver[]
|
||||
, successCallback: SuccessCallback
|
||||
, errorCallback: ErrorCallback): void {
|
||||
receivers: Receiver_[]
|
||||
, successCallback?: SuccessCallback
|
||||
, errorCallback?: ErrorCallback): void {
|
||||
|
||||
console.info("STUB :: cast.setCustomReceivers");
|
||||
}
|
||||
@@ -240,7 +327,7 @@ onMessage(async message => {
|
||||
case "shim:/selectReceiverEnd": {
|
||||
console.info("fx_cast (Debug): Selected receiver");
|
||||
|
||||
const selectedReceiver = new Receiver(
|
||||
const selectedReceiver = new Receiver_(
|
||||
message.data.receiver.id
|
||||
, message.data.receiver.friendlyName);
|
||||
|
||||
@@ -261,9 +348,9 @@ onMessage(async message => {
|
||||
|
||||
sessionRequestInProgress = false;
|
||||
|
||||
sessionSuccessCallback(
|
||||
session
|
||||
, message.data.mediaType);
|
||||
if (sessionSuccessCallback) {
|
||||
sessionSuccessCallback(session);
|
||||
}
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -287,7 +374,10 @@ onMessage(async message => {
|
||||
case "shim:/selectReceiverCancelled": {
|
||||
if (sessionRequestInProgress) {
|
||||
sessionRequestInProgress = false;
|
||||
sessionErrorCallback(new Error_(ErrorCode.CANCEL));
|
||||
|
||||
if (sessionErrorCallback) {
|
||||
sessionErrorCallback(new Error_(ErrorCode.CANCEL));
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user