Skip to content
This repository was archived by the owner on Dec 17, 2024. It is now read-only.
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions src/CogsConnection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<Manifest extends CogsPluginManifest> {
private websocket: WebSocket | ReconnectingWebSocket;
Expand Down Expand Up @@ -358,7 +358,16 @@ export class CogsStateChangedEvent<CogsState> extends Event {

export class CogsIncomingEvent<CogsEvent extends DeepReadonly<PluginManifestEventJson> | PluginManifestEventJson> extends Event {
public readonly _cogsConnectionEventType = 'event';
constructor(public readonly name: CogsEvent['name'], public readonly value: ManifestTypes.TypeFromCogsValueType<CogsEvent['value']>) {
constructor(
public readonly name: CogsEvent['name'],
public readonly value: CogsEvent extends { name: string; value: CogsValueType }
? ManifestTypes.TypeFromCogsValueType<CogsEvent['value']>
: CogsEvent extends { name: string; value: { name: string; value: CogsValueType }[] }
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

e.g. CogsEvent extends PluginManifestEventMultiParameterJson

? DistributeObject<
{ [ValueName in CogsEvent['value'][number]['name']]: ManifestTypes.TypeFromCogsValueType<CogsEvent['value'][number]['value']> }
>
: undefined
) {
super('event');
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/types/CogsPluginManifest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export type PluginManifestConfigJson = {

export type PluginManifestEventJson = {
name: string;
value?: CogsValueType;
value?: CogsValueType | { name: string; value: CogsValueType }[];
};
Comment on lines 39 to 42
Copy link
Collaborator

@chetbox chetbox Jun 6, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about?

/** @deprecated */
export type PluginManifestEventSingleParameterJson = {
  name: string;
  value?: CogsValueType;
};

export type PluginManifestEventMultiParameterJson = {
  name: string;
  value?: { name: string; value: CogsValueType }[];
};

export type PluginManifestEventJson = PluginManifestEventMultiParameterJson | PluginManifestEventSingleParameterJson;


export type PluginManifestStateJson = {
Expand Down
16 changes: 14 additions & 2 deletions src/types/ManifestTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,13 @@ export type EventFromCogs<Manifest extends CogsPluginManifest> = NonNullable<Non

export type EventFromCogsAsObject<Manifest extends CogsPluginManifest> = DistributeObject<
{
[Name in EventNameFromCogs<Manifest>]: TypeFromCogsValueType<Extract<DeepMutable<EventFromCogs<Manifest>>, { name: Name }>['value']>;
[Name in EventNameFromCogs<Manifest>]:
Extract<DeepMutable<EventFromCogs<Manifest>>, { name: Name }> extends { name: Name; value: infer V extends CogsValueType } ? TypeFromCogsValueType<V> :
Extract<DeepMutable<EventFromCogs<Manifest>>, { name: Name }> extends { name: Name; value: infer V extends { name: string; value: CogsValueType }[] } ? DistributeObject<
{
[ValueName in V[number]['name']]: TypeFromCogsValueType<V[number]['value']>
}
> : undefined;
}
Comment on lines 52 to 61
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about separate utility types for the old and new version?

>;

Expand All @@ -61,6 +67,12 @@ export type EventToCogs<Manifest extends CogsPluginManifest> = NonNullable<NonNu

export type EventToCogsAsObject<Manifest extends CogsPluginManifest> = DistributeObject<
{
[Name in EventNameToCogs<Manifest>]: TypeFromCogsValueType<Extract<DeepMutable<EventToCogs<Manifest>>, { name: Name }>['value']>;
[Name in EventNameToCogs<Manifest>]:
Extract<DeepMutable<EventToCogs<Manifest>>, { name: Name }> extends { name: Name; value: infer V extends CogsValueType } ? TypeFromCogsValueType<V> :
Extract<DeepMutable<EventToCogs<Manifest>>, { name: Name }> extends { name: Name; value: infer V extends { name: string; value: CogsValueType }[] } ? DistributeObject<
{
[ValueName in V[number]['name']]: TypeFromCogsValueType<V[number]['value']>
}
> : undefined;
}
>;