src/browser/main/carrier.js
/**
* A class in charge of building the payload expected by the native app
* the payload must be a {@link Payload}
*/
class Carrier {
/**
* Generate a new {@link Carrier}
*/
constructor () {
/**
*
* @type {Payload}
*/
this.last = {};
}
/**
* Clear the last payload sent
*/
clear () {
this.last = {};
}
/**
* Store the last payload sent
* @param {Payload} payload
*/
store (payload) {
this.last = payload;
}
/**
*
* @param {Playback} playback
* @returns {Payload}
*/
payloadFrom (playback) {
return {
PlaybackStatus: playback.getStatus(),
LoopStatus: playback.getLoopStatus(),
Shuffle: playback.isShuffle(),
Volume: playback.getVolume(),
CanGoNext: playback.canGoNext(),
CanGoPrevious: playback.canGoPrevious(),
Identity: playback.getIdentity(),
Rate: playback.getRate(),
Metadata: {
'mpris:trackid': playback.activePlayer.getId(),
'mpris:length': playback.activePlayer.getLength(),
'mpris:artUrl': playback.activePlayer.getCover(),
'xesam:url': playback.activePlayer.getUrl(),
'xesam:title': playback.activePlayer.getTitle(),
'xesam:artist': playback.activePlayer.getArtists(),
}
};
}
/**
*
* @param {Payload} payload
* @return {Payload}
*/
onlyUpdated (payload) {
let diffs = {
Metadata: {}
};
for (let prop in payload) {
if (prop === 'Metadata') {
let changed = false;
for (let meta in payload.Metadata) {
if (JSON.stringify(payload.Metadata[meta]) !== (this.last.Metadata && JSON.stringify(this.last.Metadata[meta]))) {
changed = true;
}
}
if (changed)
diffs.Metadata = payload.Metadata;
} else if (payload[prop] !== this.last[prop])
diffs[prop] = payload[prop];
}
if (Object.keys(diffs.Metadata).length === 0)
delete diffs.Metadata;
// noinspection JSValidateTypes
return diffs;
}
/**
*
* @param {Playback} playback
* @returns {Payload}
*/
requestPayload (playback) {
let payload = this.payloadFrom(playback);
let diffs = this.onlyUpdated(payload);
this.store(payload);
return diffs;
}
}