Improve session message handling

This commit is contained in:
hensm
2019-03-21 21:07:37 +00:00
parent 6cbe079a91
commit c70c3ce7d8
5 changed files with 55 additions and 10 deletions

View File

@@ -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 (

View File

@@ -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();

View File

@@ -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));
} }
} }

View File

@@ -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);
} }

View File

@@ -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) {