Store/disconnect media extension message listener

This commit is contained in:
hensm
2020-02-21 14:27:59 +00:00
parent e4cc88ec1e
commit 1c8d87ebd3

View File

@@ -40,6 +40,61 @@ export default class Media {
#sendMediaMessageCallbacks = new Map<string, Callbacks>();
#lastCurrentTime?: number;
#listener = onMessage(message => {
if ((message as any)._id !== this.#id) {
return;
}
switch (message.subject) {
case "shim:/media/update": {
const status = message.data;
this.currentTime = status.currentTime;
this.#lastCurrentTime = status._lastCurrentTime;
this.customData = status.customData;
this.playbackRate = status.playbackRate;
this.playerState = status.playerState;
this.repeatMode = status.repeatMode;
if (status._volumeLevel && status._volumeMuted) {
this.volume = new Volume(
status._volumeLevel
, status._volumeMuted);
}
if (status.media) {
this.media = status.media;
}
if (status.mediaSessionId) {
this.mediaSessionId = status.mediaSessionId;
}
// Call update listeners
for (const listener of this.#updateListeners) {
listener(true);
}
break;
}
case "shim:/media/sendMediaMessageResponse": {
const { messageId, error } = message.data;
const [ successCallback, errorCallback ]
= this.#sendMediaMessageCallbacks
.get(messageId) ?? [];
if (error && errorCallback) {
errorCallback(new _Error(ErrorCode.SESSION_ERROR));
} else if (successCallback) {
successCallback();
}
break;
}
}
});
public activeTrackIds: (number[] | null) = null;
public currentItemId: (number | null) = null;
public customData: any = null;
@@ -70,61 +125,6 @@ export default class Media {
}
, _id: this.#id
});
onMessage(message => {
if ((message as any)._id !== this.#id) {
return;
}
switch (message.subject) {
case "shim:/media/update": {
const status = message.data;
this.currentTime = status.currentTime;
this.#lastCurrentTime = status._lastCurrentTime;
this.customData = status.customData;
this.playbackRate = status.playbackRate;
this.playerState = status.playerState;
this.repeatMode = status.repeatMode;
if (status._volumeLevel && status._volumeMuted) {
this.volume = new Volume(
status._volumeLevel
, status._volumeMuted);
}
if (status.media) {
this.media = status.media;
}
if (status.mediaSessionId) {
this.mediaSessionId = status.mediaSessionId;
}
// Call update listeners
for (const listener of this.#updateListeners) {
listener(true);
}
break;
}
case "shim:/media/sendMediaMessageResponse": {
const { messageId, error } = message.data;
const [ successCallback, errorCallback ]
= this.#sendMediaMessageCallbacks
.get(messageId) ?? [];
if (error && errorCallback) {
errorCallback(new _Error(ErrorCode.SESSION_ERROR));
} else if (successCallback) {
successCallback();
}
break;
}
}
});
}
public addUpdateListener (listener: UpdateListener): void {
@@ -279,6 +279,8 @@ export default class Media {
{ type: "STOP" }
, () => {
this.#isActive = false;
this.#listener.disconnect();
if (successCallback) {
successCallback();
}