Files
fx_cast/ext/src/shim/messageBridge.ts
2019-03-21 21:07:37 +00:00

75 lines
1.8 KiB
TypeScript

"use strict";
import { Message } from "../types";
type ListenerFunc = (message: Message) => void;
export interface ListenerObject {
disconnect (): void;
}
export function onMessage (listener: ListenerFunc): ListenerObject {
function on__castMessage (ev: CustomEvent) {
listener(JSON.parse(ev.detail));
/**
* TODO:
* Figure out a way to handle and stop propagation of this
* event to hide it from page scripts.
* Currently the event handler is set after the page loads the
* cast API, allowing pages set handlers before this script,
* intercept the event, and cancel it.
*/
ev.stopPropagation();
}
document.addEventListener(
"__castMessage"
, on__castMessage, true);
return {
disconnect () {
document.removeEventListener(
"__castMessage"
, on__castMessage, true);
}
};
}
export function sendMessageResponse (message: Message) {
const event = new CustomEvent("__castMessageResponse", {
detail: JSON.stringify(message)
});
document.dispatchEvent(event);
}
export function onMessageResponse (listener: ListenerFunc): ListenerObject {
function on__castMessageResponse (ev: CustomEvent) {
listener(JSON.parse(ev.detail));
}
document.addEventListener(
"__castMessageResponse"
, on__castMessageResponse, true);
return {
disconnect () {
document.removeEventListener(
"__castMessageResponse"
, on__castMessageResponse, true);
}
};
}
export function sendMessage (message: Message) {
const event = new CustomEvent("__castMessage", {
detail: JSON.stringify(message)
});
document.dispatchEvent(event);
}