mirror of
https://github.com/hensm/fx_cast.git
synced 2026-06-11 01:59:58 +00:00
Make private API object properties inaccessible to page scripts
This commit is contained in:
@@ -28,6 +28,18 @@ import { Callbacks
|
|||||||
, UpdateListener } from "../../types";
|
, UpdateListener } from "../../types";
|
||||||
|
|
||||||
|
|
||||||
|
const _id = new WeakMap<Session, string>();
|
||||||
|
|
||||||
|
const _messageListeners = new WeakMap<Session, Map<string, Set<MessageListener>>>();
|
||||||
|
const _updateListeners = new WeakMap<Session, Set<UpdateListener>>();
|
||||||
|
|
||||||
|
const _leaveCallbacks = new WeakMap<Session, CallbacksMap>();
|
||||||
|
const _sendMessageCallbacks = new WeakMap<Session, CallbacksMap>();
|
||||||
|
const _setReceiverMutedCallbacks = new WeakMap<Session, CallbacksMap>();
|
||||||
|
const _setReceiverVolumeLevelCallbacks = new WeakMap<Session, CallbacksMap>();
|
||||||
|
const _stopCallbacks = new WeakMap<Session, CallbacksMap>();
|
||||||
|
|
||||||
|
|
||||||
export default class Session {
|
export default class Session {
|
||||||
public media: Media[];
|
public media: Media[];
|
||||||
public namespaces: Array<{ name: "string" }>;
|
public namespaces: Array<{ name: "string" }>;
|
||||||
@@ -36,18 +48,6 @@ export default class Session {
|
|||||||
public statusText: string;
|
public statusText: string;
|
||||||
public transportId: string;
|
public transportId: string;
|
||||||
|
|
||||||
|
|
||||||
private _id: string = uuid();
|
|
||||||
private _messageListeners = new Map<string, Set<MessageListener>>();
|
|
||||||
private _updateListeners = new Set<UpdateListener>();
|
|
||||||
|
|
||||||
private _leaveCallbacks: CallbacksMap = new Map();
|
|
||||||
private _sendMessageCallbacks: CallbacksMap = new Map();
|
|
||||||
private _setReceiverMutedCallbacks: CallbacksMap = new Map();
|
|
||||||
private _setReceiverVolumeLevelCallbacks: CallbacksMap = new Map();
|
|
||||||
private _stopCallbacks: CallbacksMap = new Map();
|
|
||||||
|
|
||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
public sessionId: string
|
public sessionId: string
|
||||||
, public appId: string
|
, public appId: string
|
||||||
@@ -56,6 +56,18 @@ export default class Session {
|
|||||||
, public receiver: Receiver
|
, public receiver: Receiver
|
||||||
, _successCallback: (session: Session) => void) {
|
, _successCallback: (session: Session) => void) {
|
||||||
|
|
||||||
|
_id.set(this, uuid());
|
||||||
|
|
||||||
|
_messageListeners.set(this, new Map());
|
||||||
|
_updateListeners.set(this, new Set());
|
||||||
|
|
||||||
|
_leaveCallbacks.set(this, new Map());
|
||||||
|
_sendMessageCallbacks.set(this, new Map());
|
||||||
|
_setReceiverMutedCallbacks.set(this, new Map());
|
||||||
|
_setReceiverVolumeLevelCallbacks.set(this, new Map());
|
||||||
|
_stopCallbacks.set(this, new Map());
|
||||||
|
|
||||||
|
|
||||||
this.media = [];
|
this.media = [];
|
||||||
this.namespaces = [];
|
this.namespaces = [];
|
||||||
this.senderApps = [];
|
this.senderApps = [];
|
||||||
@@ -72,13 +84,13 @@ export default class Session {
|
|||||||
, appId
|
, appId
|
||||||
, sessionId
|
, sessionId
|
||||||
}
|
}
|
||||||
, _id: this._id
|
, _id: _id.get(this)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
onMessage(message => {
|
onMessage(message => {
|
||||||
// Filter other session messages
|
// Filter other session messages
|
||||||
if (message._id && message._id !== this._id) {
|
if (message._id && message._id !== _id.get(this)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,7 +98,7 @@ export default class Session {
|
|||||||
case "shim:/session/stopped": {
|
case "shim:/session/stopped": {
|
||||||
this.status = SessionStatus.STOPPED;
|
this.status = SessionStatus.STOPPED;
|
||||||
|
|
||||||
for (const listener of this._updateListeners) {
|
for (const listener of _updateListeners.get(this)) {
|
||||||
listener(false);
|
listener(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,7 +146,7 @@ export default class Session {
|
|||||||
case "shim:/session/impl_addMessageListener": {
|
case "shim:/session/impl_addMessageListener": {
|
||||||
const { namespace, data } = message.data;
|
const { namespace, data } = message.data;
|
||||||
for (const listener of
|
for (const listener of
|
||||||
this._messageListeners.get(namespace)) {
|
_messageListeners.get(this).get(namespace)) {
|
||||||
listener(namespace, data);
|
listener(namespace, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,7 +156,7 @@ export default class Session {
|
|||||||
case "shim:/session/impl_sendMessage": {
|
case "shim:/session/impl_sendMessage": {
|
||||||
const { messageId, error } = message.data;
|
const { messageId, error } = message.data;
|
||||||
const [ successCallback, errorCallback ]
|
const [ successCallback, errorCallback ]
|
||||||
= this._sendMessageCallbacks.get(messageId);
|
= _sendMessageCallbacks.get(this).get(messageId);
|
||||||
|
|
||||||
if (error && errorCallback) {
|
if (error && errorCallback) {
|
||||||
errorCallback(new _Error(ErrorCode.SESSION_ERROR));
|
errorCallback(new _Error(ErrorCode.SESSION_ERROR));
|
||||||
@@ -152,7 +164,7 @@ export default class Session {
|
|||||||
successCallback();
|
successCallback();
|
||||||
}
|
}
|
||||||
|
|
||||||
this._sendMessageCallbacks.delete(messageId);
|
_sendMessageCallbacks.get(this).delete(messageId);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -160,7 +172,7 @@ export default class Session {
|
|||||||
case "shim:/session/impl_setReceiverMuted": {
|
case "shim:/session/impl_setReceiverMuted": {
|
||||||
const { volumeId, error } = message.data;
|
const { volumeId, error } = message.data;
|
||||||
const [ successCallback, errorCallback ]
|
const [ successCallback, errorCallback ]
|
||||||
= this._setReceiverMutedCallbacks.get(volumeId);
|
= _setReceiverMutedCallbacks.get(this).get(volumeId);
|
||||||
|
|
||||||
if (error && errorCallback) {
|
if (error && errorCallback) {
|
||||||
errorCallback(new _Error(ErrorCode.SESSION_ERROR));
|
errorCallback(new _Error(ErrorCode.SESSION_ERROR));
|
||||||
@@ -168,7 +180,7 @@ export default class Session {
|
|||||||
successCallback();
|
successCallback();
|
||||||
}
|
}
|
||||||
|
|
||||||
this._setReceiverMutedCallbacks.delete(volumeId);
|
_setReceiverMutedCallbacks.get(this).delete(volumeId);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -176,7 +188,7 @@ export default class Session {
|
|||||||
case "shim:/session/impl_setReceiverVolumeLevel": {
|
case "shim:/session/impl_setReceiverVolumeLevel": {
|
||||||
const { volumeId, error } = message.data;
|
const { volumeId, error } = message.data;
|
||||||
const [ successCallback, errorCallback ]
|
const [ successCallback, errorCallback ]
|
||||||
= this._setReceiverVolumeLevelCallbacks
|
= _setReceiverVolumeLevelCallbacks.get(this)
|
||||||
.get(volumeId);
|
.get(volumeId);
|
||||||
|
|
||||||
if (error && errorCallback) {
|
if (error && errorCallback) {
|
||||||
@@ -185,7 +197,7 @@ export default class Session {
|
|||||||
successCallback();
|
successCallback();
|
||||||
}
|
}
|
||||||
|
|
||||||
this._setReceiverVolumeLevelCallbacks.delete(volumeId);
|
_setReceiverVolumeLevelCallbacks.get(this).delete(volumeId);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -193,14 +205,14 @@ export default class Session {
|
|||||||
case "shim:/session/impl_stop": {
|
case "shim:/session/impl_stop": {
|
||||||
const { stopId, error } = message.data;
|
const { stopId, error } = message.data;
|
||||||
const [ successCallback, errorCallback ]
|
const [ successCallback, errorCallback ]
|
||||||
= this._stopCallbacks.get(stopId);
|
= _stopCallbacks.get(this).get(stopId);
|
||||||
|
|
||||||
if (error && errorCallback) {
|
if (error && errorCallback) {
|
||||||
errorCallback(new _Error(ErrorCode.SESSION_ERROR));
|
errorCallback(new _Error(ErrorCode.SESSION_ERROR));
|
||||||
} else {
|
} else {
|
||||||
this.status = SessionStatus.STOPPED;
|
this.status = SessionStatus.STOPPED;
|
||||||
|
|
||||||
for (const listener of this._updateListeners) {
|
for (const listener of _updateListeners.get(this)) {
|
||||||
listener(false);
|
listener(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -209,7 +221,7 @@ export default class Session {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this._stopCallbacks.delete(stopId);
|
_stopCallbacks.get(this).delete(stopId);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -226,21 +238,21 @@ export default class Session {
|
|||||||
namespace: string
|
namespace: string
|
||||||
, listener: MessageListener) {
|
, listener: MessageListener) {
|
||||||
|
|
||||||
if (!this._messageListeners.has(namespace)) {
|
if (!_messageListeners.get(this).has(namespace)) {
|
||||||
this._messageListeners.set(namespace, new Set());
|
_messageListeners.get(this).set(namespace, new Set());
|
||||||
}
|
}
|
||||||
|
|
||||||
this._messageListeners.get(namespace).add(listener);
|
_messageListeners.get(this).get(namespace).add(listener);
|
||||||
|
|
||||||
sendMessageResponse({
|
sendMessageResponse({
|
||||||
subject: "bridge:/session/impl_addMessageListener"
|
subject: "bridge:/session/impl_addMessageListener"
|
||||||
, data: { namespace }
|
, data: { namespace }
|
||||||
, _id: this._id
|
, _id: _id.get(this)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public addUpdateListener (listener: UpdateListener) {
|
public addUpdateListener (listener: UpdateListener) {
|
||||||
this._updateListeners.add(listener);
|
_updateListeners.get(this).add(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public leave (
|
public leave (
|
||||||
@@ -252,10 +264,10 @@ export default class Session {
|
|||||||
sendMessageResponse({
|
sendMessageResponse({
|
||||||
subject: "bridge:/session/impl_leave"
|
subject: "bridge:/session/impl_leave"
|
||||||
, data: { id }
|
, data: { id }
|
||||||
, _id: this._id
|
, _id: _id.get(this)
|
||||||
});
|
});
|
||||||
|
|
||||||
this._leaveCallbacks.set(id, [
|
_leaveCallbacks.get(this).set(id, [
|
||||||
successCallback
|
successCallback
|
||||||
, errorCallback
|
, errorCallback
|
||||||
]);
|
]);
|
||||||
@@ -295,7 +307,7 @@ export default class Session {
|
|||||||
const media = new Media(
|
const media = new Media(
|
||||||
this.sessionId
|
this.sessionId
|
||||||
, mediaObject.status[0].mediaSessionId
|
, mediaObject.status[0].mediaSessionId
|
||||||
, this._id);
|
, _id.get(this));
|
||||||
|
|
||||||
media.media = loadRequest.media;
|
media.media = loadRequest.media;
|
||||||
this.media = [ media ];
|
this.media = [ media ];
|
||||||
@@ -324,14 +336,14 @@ export default class Session {
|
|||||||
namespace: string
|
namespace: string
|
||||||
, listener: MessageListener): void {
|
, listener: MessageListener): void {
|
||||||
|
|
||||||
this._messageListeners.get(namespace).delete(listener);
|
_messageListeners.get(this).get(namespace).delete(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public removeUpdateListener (
|
public removeUpdateListener (
|
||||||
namespace: string
|
namespace: string
|
||||||
, listener: UpdateListener): void {
|
, listener: UpdateListener): void {
|
||||||
|
|
||||||
this._updateListeners.delete(listener);
|
_updateListeners.get(this).delete(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public sendMessage (
|
public sendMessage (
|
||||||
@@ -349,10 +361,10 @@ export default class Session {
|
|||||||
, message
|
, message
|
||||||
, messageId
|
, messageId
|
||||||
}
|
}
|
||||||
, _id: this._id
|
, _id: _id.get(this)
|
||||||
});
|
});
|
||||||
|
|
||||||
this._sendMessageCallbacks.set(messageId, [
|
_sendMessageCallbacks.get(this).set(messageId, [
|
||||||
successCallback
|
successCallback
|
||||||
, errorCallback
|
, errorCallback
|
||||||
]);
|
]);
|
||||||
@@ -368,10 +380,10 @@ export default class Session {
|
|||||||
sendMessageResponse({
|
sendMessageResponse({
|
||||||
subject: "bridge:/session/impl_setReceiverMuted"
|
subject: "bridge:/session/impl_setReceiverMuted"
|
||||||
, data: { muted, volumeId }
|
, data: { muted, volumeId }
|
||||||
, _id: this._id
|
, _id: _id.get(this)
|
||||||
});
|
});
|
||||||
|
|
||||||
this._setReceiverMutedCallbacks.set(volumeId, [
|
_setReceiverMutedCallbacks.get(this).set(volumeId, [
|
||||||
successCallback
|
successCallback
|
||||||
, errorCallback
|
, errorCallback
|
||||||
]);
|
]);
|
||||||
@@ -387,10 +399,10 @@ export default class Session {
|
|||||||
sendMessageResponse({
|
sendMessageResponse({
|
||||||
subject: "bridge:/session/impl_setReceiverVolumeLevel"
|
subject: "bridge:/session/impl_setReceiverVolumeLevel"
|
||||||
, data: { newLevel, volumeId }
|
, data: { newLevel, volumeId }
|
||||||
, _id: this._id
|
, _id: _id.get(this)
|
||||||
});
|
});
|
||||||
|
|
||||||
this._setReceiverVolumeLevelCallbacks.set(volumeId, [
|
_setReceiverVolumeLevelCallbacks.get(this).set(volumeId, [
|
||||||
successCallback
|
successCallback
|
||||||
, errorCallback
|
, errorCallback
|
||||||
]);
|
]);
|
||||||
@@ -405,10 +417,10 @@ export default class Session {
|
|||||||
sendMessageResponse({
|
sendMessageResponse({
|
||||||
subject: "bridge:/session/impl_stop"
|
subject: "bridge:/session/impl_stop"
|
||||||
, data: { stopId }
|
, data: { stopId }
|
||||||
, _id: this._id
|
, _id: _id.get(this)
|
||||||
});
|
});
|
||||||
|
|
||||||
this._stopCallbacks.set(stopId, [
|
_stopCallbacks.get(this).set(stopId, [
|
||||||
successCallback
|
successCallback
|
||||||
, errorCallback
|
, errorCallback
|
||||||
]);
|
]);
|
||||||
|
|||||||
@@ -32,6 +32,14 @@ import { Callbacks
|
|||||||
, UpdateListener } from "../../types";
|
, UpdateListener } from "../../types";
|
||||||
|
|
||||||
|
|
||||||
|
const _id = new WeakMap<Media, string>();
|
||||||
|
|
||||||
|
const _updateListeners = new WeakMap<Media, Set<UpdateListener>>();
|
||||||
|
const _sendMediaMessageCallbacks = new WeakMap<Media, CallbacksMap>();
|
||||||
|
|
||||||
|
const _lastCurrentTime = new WeakMap<Media, number>();
|
||||||
|
|
||||||
|
|
||||||
export default class Media {
|
export default class Media {
|
||||||
public activeTrackIds: number[] = null;
|
public activeTrackIds: number[] = null;
|
||||||
public currentItemId: number = null;
|
public currentItemId: number = null;
|
||||||
@@ -49,18 +57,19 @@ export default class Media {
|
|||||||
public volume: Volume = new Volume();
|
public volume: Volume = new Volume();
|
||||||
|
|
||||||
|
|
||||||
private _id: string = uuid();
|
|
||||||
|
|
||||||
private _updateListeners = new Set<UpdateListener>();
|
|
||||||
private _sendMediaMessageCallbacks: CallbacksMap = new Map();
|
|
||||||
|
|
||||||
private _lastCurrentTime: number;
|
|
||||||
|
|
||||||
constructor (
|
constructor (
|
||||||
public sessionId: string
|
public sessionId: string
|
||||||
, public mediaSessionId: number
|
, public mediaSessionId: number
|
||||||
, _internalSessionId: string) {
|
, _internalSessionId: string) {
|
||||||
|
|
||||||
|
_id.set(this, uuid());
|
||||||
|
|
||||||
|
_updateListeners.set(this, new Set());
|
||||||
|
_sendMediaMessageCallbacks.set(this, new Map());
|
||||||
|
|
||||||
|
_lastCurrentTime.set(this, undefined);
|
||||||
|
|
||||||
|
|
||||||
sendMessageResponse({
|
sendMessageResponse({
|
||||||
subject: "bridge:/media/initialize"
|
subject: "bridge:/media/initialize"
|
||||||
, data: {
|
, data: {
|
||||||
@@ -68,11 +77,11 @@ export default class Media {
|
|||||||
, mediaSessionId
|
, mediaSessionId
|
||||||
, _internalSessionId
|
, _internalSessionId
|
||||||
}
|
}
|
||||||
, _id: this._id
|
, _id: _id.get(this)
|
||||||
});
|
});
|
||||||
|
|
||||||
onMessage(message => {
|
onMessage(message => {
|
||||||
if (!message._id || message._id !== this._id) {
|
if (!message._id || message._id !== _id.get(this)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,7 +90,7 @@ export default class Media {
|
|||||||
const status = message.data;
|
const status = message.data;
|
||||||
|
|
||||||
this.currentTime = status.currentTime;
|
this.currentTime = status.currentTime;
|
||||||
this._lastCurrentTime = status._lastCurrentTime;
|
_lastCurrentTime.set(this, status._lastCurrentTime);
|
||||||
this.customData = status.customData;
|
this.customData = status.customData;
|
||||||
this.volume = new Volume(
|
this.volume = new Volume(
|
||||||
status._volumeLevel
|
status._volumeLevel
|
||||||
@@ -98,7 +107,7 @@ export default class Media {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Call update listeners
|
// Call update listeners
|
||||||
for (const listener of this._updateListeners) {
|
for (const listener of _updateListeners.get(this)) {
|
||||||
listener(true);
|
listener(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,7 +117,7 @@ export default class Media {
|
|||||||
case "shim:/media/sendMediaMessageResponse": {
|
case "shim:/media/sendMediaMessageResponse": {
|
||||||
const { messageId, error } = message.data;
|
const { messageId, error } = message.data;
|
||||||
const [ successCallback, errorCallback ]
|
const [ successCallback, errorCallback ]
|
||||||
= this._sendMediaMessageCallbacks.get(messageId);
|
= _sendMediaMessageCallbacks.get(this).get(messageId);
|
||||||
|
|
||||||
if (error && errorCallback) {
|
if (error && errorCallback) {
|
||||||
errorCallback(new _Error(ErrorCode.SESSION_ERROR));
|
errorCallback(new _Error(ErrorCode.SESSION_ERROR));
|
||||||
@@ -124,7 +133,7 @@ export default class Media {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public addUpdateListener (listener: UpdateListener): void {
|
public addUpdateListener (listener: UpdateListener): void {
|
||||||
this._updateListeners.add(listener);
|
_updateListeners.get(this).add(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public editTracksInfo (
|
public editTracksInfo (
|
||||||
@@ -141,7 +150,7 @@ export default class Media {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return this.currentTime
|
return this.currentTime
|
||||||
+ ((Date.now() / 1000) - this._lastCurrentTime);
|
+ ((Date.now() / 1000) - _lastCurrentTime.get(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
public getStatus (
|
public getStatus (
|
||||||
@@ -241,7 +250,7 @@ export default class Media {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public removeUpdateListener (listener: UpdateListener) {
|
public removeUpdateListener (listener: UpdateListener) {
|
||||||
this._updateListeners.delete(listener);
|
_updateListeners.get(this).delete(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public seek (
|
public seek (
|
||||||
@@ -294,7 +303,7 @@ export default class Media {
|
|||||||
|
|
||||||
const messageId = uuid();
|
const messageId = uuid();
|
||||||
|
|
||||||
this._sendMediaMessageCallbacks.set(messageId, [
|
_sendMediaMessageCallbacks.get(this).set(messageId, [
|
||||||
successCallback
|
successCallback
|
||||||
, errorCallback
|
, errorCallback
|
||||||
]);
|
]);
|
||||||
@@ -305,7 +314,7 @@ export default class Media {
|
|||||||
message
|
message
|
||||||
, messageId
|
, messageId
|
||||||
}
|
}
|
||||||
, _id: this._id
|
, _id: _id.get(this)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user