Make private API object properties inaccessible to page scripts

This commit is contained in:
hensm
2019-03-16 13:13:25 +00:00
parent 2fae7192b2
commit df5bcd597d
2 changed files with 81 additions and 60 deletions

View File

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

View File

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