Fix SDK initialization timing issues

This commit is contained in:
hensm
2022-09-01 07:17:25 +01:00
committed by Matt Hensman
parent 29e92ad078
commit 715f645850
6 changed files with 65 additions and 52 deletions

View File

@@ -32,7 +32,7 @@ if (document.currentScript) {
pageMessenging.page.addListener(async message => {
switch (message.subject) {
case "cast:initialized": {
case "cast:instanceCreated": {
// If framework API is loading, wait until completed
await frameworkScriptPromise;

View File

@@ -65,7 +65,7 @@ export function ensureInit(contextTabId?: number): Promise<CastPort> {
// castManager -> cast instance
managerPort.addEventListener("message", ev => {
const message = ev.data as Message;
if (message.subject === "cast:initialized") {
if (message.subject === "cast:instanceCreated") {
if (message.data.isAvailable) {
resolve(existingPort);
} else {
@@ -91,7 +91,7 @@ export function ensureInit(contextTabId?: number): Promise<CastPort> {
backgroundPort.onMessage.addListener(function onManagerMessage(
message: Message
) {
if (message.subject === "cast:initialized") {
if (message.subject === "cast:instanceCreated") {
if (message.data.isAvailable) {
resolve(pageMessenging.page.messagePort);
} else {

View File

@@ -54,8 +54,10 @@ export default class {
#apiConfig?: ApiConfig;
#sessionRequest?: SessionRequest;
#isInitialized = false;
/** Current receiver availability. */
#receiverAvailability = ReceiverAvailability.UNAVAILABLE;
#receiverAvailability?: ReceiverAvailability;
#initializeSuccessCallback?: () => void;
@@ -105,10 +107,37 @@ export default class {
#onMessage(message: Message) {
switch (message.subject) {
case "cast:initialized":
case "cast:instanceCreated":
this.isAvailable = true;
this.#initializeSuccessCallback?.();
this.#apiConfig?.receiverListener(this.#receiverAvailability);
break;
case "cast:receiverAvailabilityUpdated": {
/**
* The first availability update happens after
* initialize is called.
*/
if (!this.#isInitialized) {
this.#isInitialized = true;
this.#initializeSuccessCallback?.();
}
const availability = message.data.isAvailable
? ReceiverAvailability.AVAILABLE
: ReceiverAvailability.UNAVAILABLE;
// If availability has changed, call receiver listeners
if (availability !== this.#receiverAvailability) {
this.#receiverAvailability = availability;
this.#apiConfig?.receiverListener(availability);
}
break;
}
case "cast:receiverAction":
for (const actionListener of this.#receiverActionListeners) {
actionListener(message.data.receiver, message.data.action);
}
break;
// Popup closed before session established
@@ -127,6 +156,7 @@ export default class {
* and data needed to create cast API objects is sent.
*/
case "cast:sessionCreated": {
this.#sessionRequest = undefined;
const status = message.data;
status.receiver.volume = status.volume;
@@ -248,26 +278,6 @@ export default class {
break;
}
case "cast:receiverAvailabilityUpdated": {
const availability = message.data.isAvailable
? ReceiverAvailability.AVAILABLE
: ReceiverAvailability.UNAVAILABLE;
// If availability has changed, call receiver listeners
if (availability !== this.#receiverAvailability) {
this.#receiverAvailability = availability;
this.#apiConfig?.receiverListener(availability);
}
break;
}
case "cast:receiverAction":
for (const actionListener of this.#receiverActionListeners) {
actionListener(message.data.receiver, message.data.action);
}
break;
}
}
@@ -291,7 +301,7 @@ export default class {
}
pageMessenging.page.sendMessage({
subject: "main:initializeCast",
subject: "main:initializeCastSdk",
data: { apiConfig: this.#apiConfig }
});
}