Improve app message types

This commit is contained in:
hensm
2021-04-24 07:28:07 +01:00
committed by Matt Hensman
parent 99a40d8302
commit e33531d1ba
11 changed files with 218 additions and 233 deletions

View File

@@ -4,8 +4,8 @@ import castv2 from "castv2";
import Session from "./Session";
import { Message } from "../../types";
import { sendMessage } from "../../lib/messaging"
import { Message } from "../../messaging";
import { sendMessage } from "../../lib/nativeMessaging"
const NS_MEDIA = "urn:x-cast:com.google.cast.media";

View File

@@ -2,8 +2,8 @@
import { Channel, Client } from "castv2";
import { Message } from "../../types";
import { sendMessage } from "../../lib/messaging";
import { Message } from "../../messaging";
import { sendMessage } from "../../lib/nativeMessaging";
export const NS_CONNECTION = "urn:x-cast:com.google.cast.tp.connection";

View File

@@ -4,7 +4,7 @@ import mdns from "mdns";
import StatusListener from "./chromecast/StatusListener";
import { ReceiverStatus } from "../types";
import { sendMessage } from "../lib/messaging";
import { sendMessage } from "../lib/nativeMessaging";
interface CastTxtRecord {
@@ -44,7 +44,7 @@ function onBrowserServiceUp (service: mdns.Service) {
});
}
function onBrowserServiceDown (service: mdns.Service) {
function onBrowserServiceDown (_service: mdns.Service) {
// TODO: Fix service down detection
}
@@ -109,7 +109,7 @@ export function startDiscovery (options: InitializeOptions) {
statusListeners.set(id, listener);
}
function onStatusBrowserServiceDown (service: mdns.Service) {
function onStatusBrowserServiceDown (_service: mdns.Service) {
// TODO: Fix service down detection
}
}

View File

@@ -8,7 +8,7 @@ import stream from "stream";
import mime from "mime-types";
import { sendMessage } from "../lib/messaging";
import { sendMessage } from "../lib/nativeMessaging";
import { convertSrtToVtt } from "../lib/subtitles";

View File

@@ -3,7 +3,7 @@
import child_process from "child_process";
import path from "path";
import { sendMessage } from "../lib/messaging";
import { sendMessage } from "../lib/nativeMessaging";
function fatal (message: string) {

View File

@@ -1,7 +1,7 @@
"use strict";
import { decodeTransform, encodeTransform } from "./lib/messaging";
import { Message } from "./types";
import { decodeTransform, encodeTransform } from "./lib/nativeMessaging";
import { Message } from "./messaging";
import { handleSessionMessage, handleMediaMessage, stopReceiverApp }
from "./components/chromecast";

View File

@@ -1,7 +1,7 @@
"use strict";
import { DecodeTransform, EncodeTransform } from "../../transforms";
import { Message } from "../types";
import { Message } from "../messaging";
export const decodeTransform = new DecodeTransform();

172
app/src/bridge/messaging.ts Normal file
View File

@@ -0,0 +1,172 @@
"use strict";
import { Receiver
, ReceiverSelectionCast
, ReceiverSelectionStop
, ReceiverStatus } from "./types";
type MessageDefinitions = {
"shim:serviceUp": { id: Receiver["id"] }
, "shim:serviceDown": { id: Receiver["id"] }
, "shim:launchApp": { receiver: Receiver }
// Session messages
, "shim:session/stopped": {}
, "shim:session/connected": {
sessionId: string
, namespaces: Array<{ name: string }>
, displayName: string
, statusText: string
}
, "shim:session/updateStatus": { volume: any /* Volume */ }
, "shim:session/impl_addMessageListener": {
namespace: string
, data: string
}
, "shim:session/impl_sendMessage": {
messageId: string
, error: boolean
}
, "shim:session/impl_setReceiverMuted": {
volumeId: string
, error: boolean
}
, "shim:session/impl_setReceiverVolumeLevel": {
volumeId: string
, error: boolean
}
, "shim:session/impl_stop": {
stopId: string
, error: boolean
}
// Bridge session messages
, "bridge:session/initialize": {
address: string
, port: number
, appId: string
, sessionId: string
, _id: string
}
, "bridge:session/close": {}
, "bridge:session/impl_leave": {
id: string
, _id: string
}
, "bridge:session/impl_sendMessage": {
namespace: string
, message: any
, messageId: string
, _id: string
}
, "bridge:session/impl_setReceiverMuted": {
muted: boolean
, volumeId: string
, _id: string
}
, "bridge:session/impl_setReceiverVolumeLevel": {
newLevel: number
, volumeId: string
, _id: string
}
, "bridge:session/impl_stop": {
stopId: string;
_id: string;
}
, "bridge:session/impl_addMessageListener": {
namespace: string;
_id: string;
}
// Media messages
, "shim:media/update": {
currentTime: number
, _lastCurrentTime: number
, customData: any
, playbackRate: number
, playerState: string
, repeatMode: string
, _volumeLevel: number
, _volumeMuted: boolean
, media: unknown // MediaInfo
, mediaSessionId: number
}
, "shim:media/sendMediaMessageResponse": {
messageId: string
, error: boolean
}
// Bridge media messages
, "bridge:media/initialize": {
sessionId: string
, mediaSessionId: number
, _internalSessionId: string
, _id: string
}
, "bridge:media/sendMediaMessage": {
message: any
, messageId: string
, _id: string
}
// Bridge messages
, "main:receiverSelector/selected": ReceiverSelectionCast
, "main:receiverSelector/error": string
, "main:receiverSelector/close": {}
, "main:receiverSelector/stop": ReceiverSelectionStop
, "bridge:getInfo": string
, "bridge:initialize": { shouldWatchStatus: boolean }
, "bridge:receiverSelector/open": any
, "bridge:receiverSelector/close": {}
, "bridge:stopReceiverApp": { receiver: Receiver }
, "bridge:mediaServer/start": {
filePath: string
, port: number
}
, "bridge:mediaServer/stop": {}
, "mediaCast:mediaServer/started": {
mediaPath: string
, subtitlePaths: string[]
, localAddress: string
}
, "mediaCast:mediaServer/stopped": {}
, "mediaCast:mediaServer/error": {}
, "main:serviceUp": Receiver
, "main:serviceDown": { id: string }
, "main:receiverStatus": {
id: string
, status: ReceiverStatus
}
}
interface MessageBase<K extends keyof MessageDefinitions> {
subject: K;
data: MessageDefinitions[K];
}
type Messages = {
[K in keyof MessageDefinitions]: MessageBase<K>;
}
/**
* For better call semantics, make message data key optional if
* specified as blank or with all-optional keys.
*/
type NarrowedMessage<L extends MessageBase<keyof MessageDefinitions>> =
L extends any
? {} extends L["data"]
? Omit<L, "data"> & Partial<L>
: L
: never;
export type Message = NarrowedMessage<Messages[keyof Messages]>;

View File

@@ -84,211 +84,3 @@ export interface Receiver {
port: number;
status?: ReceiverStatus;
}
export type Messages = [
{
subject: "shim:serviceUp"
, data: { id: Receiver["id"] }
}
, {
subject: "shim:serviceDown"
, data: { id: Receiver["id"] }
}
, {
subject: "shim:launchApp"
, data: { receiver: Receiver }
}
// Session messages
, {
subject: "shim:session/stopped"
}
, {
subject: "shim:session/connected"
, data: {
sessionId: string;
namespaces: Array<{ name: string }>;
displayName: string;
statusText: string;
}
}
, {
subject: "shim:session/updateStatus"
, data: any
}
, {
subject: "shim:session/impl_addMessageListener"
, data: { namespace: string, data: string }
}
, {
subject: "shim:session/impl_sendMessage"
, data: { messageId: string, error: boolean }
}
, {
subject: "shim:session/impl_setReceiverMuted"
, data: { volumeId: string, error: boolean }
}
, {
subject: "shim:session/impl_setReceiverVolumeLevel"
, data: { volumeId: string, error: boolean }
}
, {
subject: "shim:session/impl_stop"
, data: { stopId: string, error: boolean }
}
// Bridge session messages
, {
subject: "bridge:session/initialize"
, data: {
address: string
, port: number
, appId: string
, sessionId: string
}
, _id: string;
}
, {
subject: "bridge:session/close"
, _id: string;
}
, {
subject: "bridge:session/impl_leave"
, data: { id: string }
, _id: string
}
, {
subject: "bridge:session/impl_sendMessage"
, data: { namespace: string, message: any, messageId: string }
, _id: string
}
, {
subject: "bridge:session/impl_setReceiverMuted"
, data: { muted: boolean, volumeId: string }
, _id: string
}
, {
subject: "bridge:session/impl_setReceiverVolumeLevel"
, data: { newLevel: number, volumeId: string }
, _id: string
}
, {
subject: "bridge:session/impl_stop"
, data: { stopId: string }
, _id: string
}
, {
subject: "bridge:session/impl_addMessageListener"
, data: { namespace: string }
, _id: string
}
// Media messages
, {
subject: "shim:media/update"
, data: {
currentTime: number
, _lastCurrentTime: number
, customData: any
, playbackRate: number
, playerState: string
, repeatMode: string
, _volumeLevel: number
, _volumeMuted: boolean
, media: any
, mediaSessionId: number
}
}
, {
subject: "shim:media/sendMediaMessageResponse"
, data: { messageId: string, error: boolean }
}
// Bridge media messages
, {
subject: "bridge:media/initialize"
, data: {
sessionId: string
, mediaSessionId: number
, _internalSessionId: string
}
, _id: string;
}
, {
subject: "bridge:media/sendMediaMessage"
, data: { message: any, messageId: string }
, _id: string;
}
// Bridge messages
, {
subject: "main:receiverSelector/selected"
, data: ReceiverSelectionCast
}
, {
subject: "main:receiverSelector/error"
, data: string
}
, {
subject: "main:receiverSelector/close"
}
, {
subject: "main:receiverSelector/stop"
, data: ReceiverSelectionStop
}
, {
subject: "bridge:getInfo"
}
, {
subject: "bridge:initialize"
, data: { shouldWatchStatus: boolean }
}
, {
subject: "bridge:receiverSelector/open"
, data: any }
, {
subject: "bridge:receiverSelector/close"
}
, {
subject: "bridge:stopReceiverApp"
, data: { receiver: Receiver }
}
, {
subject: "bridge:mediaServer/start"
, data: { filePath: string, port: number }
}
, {
subject: "bridge:mediaServer/stop"
}
, {
subject: "mediaCast:mediaServer/started"
, data: {
mediaPath: string
, subtitlePaths: string[]
, localAddress: string
}
}
, {
subject: "mediaCast:mediaServer/stopped"
}
, {
subject: "mediaCast:mediaServer/error"
}
, {
subject: "main:serviceUp"
, data: Receiver
}
, {
subject: "main:serviceDown"
, data: { id: string }
}
, {
subject: "main:receiverStatus"
, data: { id: string, status: ReceiverStatus }
}
];
export type Message = Messages[number];

View File

@@ -1,7 +1,7 @@
"use strict";
import { Transform } from "stream";
import { Message } from "./bridge/types";
import { Message } from "./bridge/messaging";
type ResponseHandlerFunction = (message: Message) => Promise<any>;