From a37e0950f5278c8345d9c2c7d966febbd0f937a8 Mon Sep 17 00:00:00 2001 From: Sam Lee <32639580+Sam-Lee-17@users.noreply.github.com> Date: Thu, 6 Jun 2024 00:00:20 +0100 Subject: [PATCH] Added backwards compatible type supporting for events to have multiple values --- src/CogsConnection.ts | 15 ++++++++++++--- src/types/CogsPluginManifest.ts | 2 +- src/types/ManifestTypes.ts | 16 ++++++++++++++-- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/CogsConnection.ts b/src/CogsConnection.ts index cf5671f..5a2fae0 100644 --- a/src/CogsConnection.ts +++ b/src/CogsConnection.ts @@ -5,9 +5,9 @@ import CogsClientMessage from './types/CogsClientMessage'; import { COGS_SERVER_PORT, assetUrl } from './helpers/urls'; import MediaClipStateMessage from './types/MediaClipStateMessage'; import AllMediaClipStatesMessage from './types/AllMediaClipStatesMessage'; -import { CogsPluginManifest, PluginManifestEventJson } from './types/CogsPluginManifest'; +import { CogsPluginManifest, CogsValueType, PluginManifestEventJson } from './types/CogsPluginManifest'; import * as ManifestTypes from './types/ManifestTypes'; -import { DeepReadonly } from './types/utils'; +import { DeepReadonly, DistributeObject } from './types/utils'; export default class CogsConnection { private websocket: WebSocket | ReconnectingWebSocket; @@ -358,7 +358,16 @@ export class CogsStateChangedEvent extends Event { export class CogsIncomingEvent | PluginManifestEventJson> extends Event { public readonly _cogsConnectionEventType = 'event'; - constructor(public readonly name: CogsEvent['name'], public readonly value: ManifestTypes.TypeFromCogsValueType) { + constructor( + public readonly name: CogsEvent['name'], + public readonly value: CogsEvent extends { name: string; value: CogsValueType } + ? ManifestTypes.TypeFromCogsValueType + : CogsEvent extends { name: string; value: { name: string; value: CogsValueType }[] } + ? DistributeObject< + { [ValueName in CogsEvent['value'][number]['name']]: ManifestTypes.TypeFromCogsValueType } + > + : undefined + ) { super('event'); } } diff --git a/src/types/CogsPluginManifest.ts b/src/types/CogsPluginManifest.ts index f0b2476..d64b90e 100644 --- a/src/types/CogsPluginManifest.ts +++ b/src/types/CogsPluginManifest.ts @@ -38,7 +38,7 @@ export type PluginManifestConfigJson = { export type PluginManifestEventJson = { name: string; - value?: CogsValueType; + value?: CogsValueType | { name: string; value: CogsValueType }[]; }; export type PluginManifestStateJson = { diff --git a/src/types/ManifestTypes.ts b/src/types/ManifestTypes.ts index fdd8b3e..6af7e87 100644 --- a/src/types/ManifestTypes.ts +++ b/src/types/ManifestTypes.ts @@ -51,7 +51,13 @@ export type EventFromCogs = NonNullable = DistributeObject< { - [Name in EventNameFromCogs]: TypeFromCogsValueType>, { name: Name }>['value']>; + [Name in EventNameFromCogs]: + Extract>, { name: Name }> extends { name: Name; value: infer V extends CogsValueType } ? TypeFromCogsValueType : + Extract>, { name: Name }> extends { name: Name; value: infer V extends { name: string; value: CogsValueType }[] } ? DistributeObject< + { + [ValueName in V[number]['name']]: TypeFromCogsValueType + } + > : undefined; } >; @@ -61,6 +67,12 @@ export type EventToCogs = NonNullable = DistributeObject< { - [Name in EventNameToCogs]: TypeFromCogsValueType>, { name: Name }>['value']>; + [Name in EventNameToCogs]: + Extract>, { name: Name }> extends { name: Name; value: infer V extends CogsValueType } ? TypeFromCogsValueType : + Extract>, { name: Name }> extends { name: Name; value: infer V extends { name: string; value: CogsValueType }[] } ? DistributeObject< + { + [ValueName in V[number]['name']]: TypeFromCogsValueType + } + > : undefined; } >;