mirror of
https://github.com/hensm/fx_cast.git
synced 2026-06-12 02:29:59 +00:00
Improve session message handling
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
import { Channel } from "castv2";
|
||||||
|
|
||||||
import Session from "./Session";
|
import Session from "./Session";
|
||||||
|
|
||||||
import { Message
|
import { Message
|
||||||
@@ -27,7 +29,7 @@ export default class Media {
|
|||||||
private mediaSessionId: number;
|
private mediaSessionId: number;
|
||||||
private referenceId: string;
|
private referenceId: string;
|
||||||
private session: Session;
|
private session: Session;
|
||||||
private channel: any;
|
private channel: Channel;
|
||||||
private sendMessageCallback: SendMessageCallback;
|
private sendMessageCallback: SendMessageCallback;
|
||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
|
|||||||
@@ -37,10 +37,12 @@ export default class Session {
|
|||||||
, port: number
|
, port: number
|
||||||
, appId: string
|
, appId: string
|
||||||
, sessionId: number
|
, sessionId: number
|
||||||
|
, referenceId: string
|
||||||
, sendMessageCallback: SendMessageCallback) {
|
, sendMessageCallback: SendMessageCallback) {
|
||||||
|
|
||||||
this.sendMessageCallback = sendMessageCallback;
|
|
||||||
this.sessionId = sessionId;
|
this.sessionId = sessionId;
|
||||||
|
this.referenceId = referenceId;
|
||||||
|
this.sendMessageCallback = sendMessageCallback;
|
||||||
|
|
||||||
this.client = new Client();
|
this.client = new Client();
|
||||||
|
|
||||||
|
|||||||
@@ -97,6 +97,7 @@ async function handleMessage (message: Message) {
|
|||||||
, message.data.port
|
, message.data.port
|
||||||
, message.data.appId
|
, message.data.appId
|
||||||
, message.data.sessionId
|
, message.data.sessionId
|
||||||
|
, message._id
|
||||||
, sendMessage));
|
, sendMessage));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,9 @@ import { ErrorCode
|
|||||||
, SessionStatus
|
, SessionStatus
|
||||||
, VolumeControlType } from "../enums";
|
, VolumeControlType } from "../enums";
|
||||||
|
|
||||||
import { onMessage, sendMessageResponse } from "../../messageBridge";
|
import { ListenerObject
|
||||||
|
, onMessage
|
||||||
|
, sendMessageResponse } from "../../messageBridge";
|
||||||
|
|
||||||
import { Callbacks
|
import { Callbacks
|
||||||
, CallbacksMap
|
, CallbacksMap
|
||||||
@@ -29,6 +31,7 @@ import { Callbacks
|
|||||||
|
|
||||||
|
|
||||||
const _id = new WeakMap<Session, string>();
|
const _id = new WeakMap<Session, string>();
|
||||||
|
const _listener = new WeakMap<Session, ListenerObject>();
|
||||||
|
|
||||||
const _messageListeners = new WeakMap<
|
const _messageListeners = new WeakMap<
|
||||||
Session, Map<string, Set<MessageListener>>>();
|
Session, Map<string, Set<MessageListener>>>();
|
||||||
@@ -90,7 +93,7 @@ export default class Session {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
onMessage(message => {
|
const listenerObject = onMessage(message => {
|
||||||
// Filter other session messages
|
// Filter other session messages
|
||||||
if (message._id && message._id !== _id.get(this)) {
|
if (message._id && message._id !== _id.get(this)) {
|
||||||
return;
|
return;
|
||||||
@@ -98,6 +101,9 @@ export default class Session {
|
|||||||
|
|
||||||
switch (message.subject) {
|
switch (message.subject) {
|
||||||
case "shim:/session/stopped": {
|
case "shim:/session/stopped": {
|
||||||
|
// Disconnect from extension messages
|
||||||
|
_listener.get(this).disconnect();
|
||||||
|
|
||||||
this.status = SessionStatus.STOPPED;
|
this.status = SessionStatus.STOPPED;
|
||||||
|
|
||||||
for (const listener of _updateListeners.get(this)) {
|
for (const listener of _updateListeners.get(this)) {
|
||||||
@@ -215,6 +221,9 @@ export default class Session {
|
|||||||
const [ successCallback, errorCallback ]
|
const [ successCallback, errorCallback ]
|
||||||
= _stopCallbacks.get(this).get(stopId);
|
= _stopCallbacks.get(this).get(stopId);
|
||||||
|
|
||||||
|
// Disconnect from extension messages
|
||||||
|
_listener.get(this).disconnect();
|
||||||
|
|
||||||
if (error && errorCallback) {
|
if (error && errorCallback) {
|
||||||
errorCallback(new _Error(ErrorCode.SESSION_ERROR));
|
errorCallback(new _Error(ErrorCode.SESSION_ERROR));
|
||||||
} else {
|
} else {
|
||||||
@@ -235,6 +244,8 @@ export default class Session {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_listener.set(this, listenerObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,16 @@
|
|||||||
|
|
||||||
import { Message } from "../types";
|
import { Message } from "../types";
|
||||||
|
|
||||||
|
|
||||||
type ListenerFunc = (message: Message) => void;
|
type ListenerFunc = (message: Message) => void;
|
||||||
|
|
||||||
|
export interface ListenerObject {
|
||||||
|
disconnect (): void;
|
||||||
|
}
|
||||||
|
|
||||||
export function onMessage (listener: ListenerFunc) {
|
|
||||||
document.addEventListener("__castMessage", (ev: CustomEvent) => {
|
export function onMessage (listener: ListenerFunc): ListenerObject {
|
||||||
|
function on__castMessage (ev: CustomEvent) {
|
||||||
listener(JSON.parse(ev.detail));
|
listener(JSON.parse(ev.detail));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -18,7 +23,19 @@ export function onMessage (listener: ListenerFunc) {
|
|||||||
* intercept the event, and cancel it.
|
* intercept the event, and cancel it.
|
||||||
*/
|
*/
|
||||||
ev.stopPropagation();
|
ev.stopPropagation();
|
||||||
}, true);
|
}
|
||||||
|
|
||||||
|
document.addEventListener(
|
||||||
|
"__castMessage"
|
||||||
|
, on__castMessage, true);
|
||||||
|
|
||||||
|
return {
|
||||||
|
disconnect () {
|
||||||
|
document.removeEventListener(
|
||||||
|
"__castMessage"
|
||||||
|
, on__castMessage, true);
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function sendMessageResponse (message: Message) {
|
export function sendMessageResponse (message: Message) {
|
||||||
@@ -30,10 +47,22 @@ export function sendMessageResponse (message: Message) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function onMessageResponse (listener: ListenerFunc) {
|
export function onMessageResponse (listener: ListenerFunc): ListenerObject {
|
||||||
document.addEventListener("__castMessageResponse", (ev: CustomEvent) => {
|
function on__castMessageResponse (ev: CustomEvent) {
|
||||||
listener(JSON.parse(ev.detail));
|
listener(JSON.parse(ev.detail));
|
||||||
}, true);
|
}
|
||||||
|
|
||||||
|
document.addEventListener(
|
||||||
|
"__castMessageResponse"
|
||||||
|
, on__castMessageResponse, true);
|
||||||
|
|
||||||
|
return {
|
||||||
|
disconnect () {
|
||||||
|
document.removeEventListener(
|
||||||
|
"__castMessageResponse"
|
||||||
|
, on__castMessageResponse, true);
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function sendMessage (message: Message) {
|
export function sendMessage (message: Message) {
|
||||||
|
|||||||
Reference in New Issue
Block a user