Add initial status bridge implementation

This commit is contained in:
hensm
2019-04-13 04:35:08 +01:00
committed by Matt Hensman
parent 0b494fa908
commit 01546e81dd
8 changed files with 191 additions and 42 deletions

View File

@@ -59,9 +59,11 @@ export default class StatusListener extends EventEmitter {
}
case "RECEIVER_STATUS": {
// Send update message
this.emit("statusUpdate", data.status);
this.emit("receiverStatus", data.status);
break;
}
case "MEDIA_STATUS": {
this.emit("mediaStatus", data.status);
break;
}
}

54
app/src/castTypes.ts Normal file
View File

@@ -0,0 +1,54 @@
"use strict";
export interface ReceiverStatus {
volume: {
muted: boolean;
stepInterval: number;
controlType: string;
level: number;
};
applications?: {
displayName: string;
statusText: string;
transportId: string;
isIdleScreen: boolean;
sessionId: string;
namespaces: { name: string }[];
appId: string;
}[];
userEq?: {};
}
export interface MediaStatus {
mediaSessionId: number;
supportedMediaCommands: number;
currentTime: number;
media: {
duration: number;
contentId: string;
streamType: string;
contentType: string;
};
playbackRate: number;
volume: {
muted: boolean;
level: number;
}
currentItemId: number;
idleReason: string;
playerState: string;
extendedStatus: {
playerState: string;
media: {
contentId: string;
streamType: string;
contentType: string;
metadata: {
images: { url: string }[];
metadataType: number;
artist: string;
title: string;
};
}
}
}

View File

@@ -11,6 +11,8 @@ import Session from "./Session";
import StatusListener from "./StatusListener";
import * as transforms from "./transforms";
import { ReceiverStatus, MediaStatus } from "./castTypes";
import { Message } from "./types";
import { __applicationName
@@ -185,29 +187,48 @@ function initialize (options: InitializeOptions) {
const statusListeners = new Map<string, StatusListener>();
browser.on("serviceUp", (service: dnssd.Service) => {
const address = service.addresses[0];
const host = service.addresses[0];
const port = service.port;
const id = service.txt.id;
if (options.shouldWatchStatus) {
const listener = new StatusListener(address, port);
const listener = new StatusListener(host, port);
listener.on("statusUpdate", (status: any) => {
sendMessage({
subject: "main:/receiverStatusUpdate"
, data: { id, status }
});
listener.on("receiverStatus", (status: ReceiverStatus) => {
const receiverStatusMessage: any = {
subject: "receiverStatus"
, data: {
id
, status: {
volume: {
level: status.volume.level
, muted: status.volume.muted
}
}
}
};
if ("applications" in status) {
const application = status.applications[0];
receiverStatusMessage.data.status.application = {
displayName: application.displayName
, isIdleScreen: application.isIdleScreen
, statusText: application.statusText
};
}
sendMessage(receiverStatusMessage);
});
statusListeners.set(id, listener);
}
transforms.encode.write({
sendMessage({
subject: "shim:/serviceUp"
, data: {
address, port, id
host, port, id
, friendlyName: service.txt.fn
, currentApp: service.txt.rs
}
});
});
@@ -215,11 +236,12 @@ function initialize (options: InitializeOptions) {
browser.on("serviceDown", (service: dnssd.Service) => {
const id = service.txt.id;
// De-register status listener
if (options.shouldWatchStatus && statusListeners.has(id)) {
statusListeners.get(id).deregister();
}
transforms.encode.write({
sendMessage({
subject: "shim:/serviceDown"
, data: { id }
});