import { Awaitable } from "../util-types"; import { FirebotParameterCategories, FirebotParams, } from "./firebot-parameters"; export type Integration = { definition: IntegrationDefinition; integration: IntegrationController; }; export type IntegrationDefinition< Params extends FirebotParams = FirebotParams > = { id: string; name: string; description: string; connectionToggle?: boolean; configurable?: boolean; settingCategories: FirebotParameterCategories; } & ( | { linkType: "id"; idDetails: { steps: string; }; } | { linkType: "auth"; authProviderDetails: { id: string; name: string; redirectUriHost?: string; client: { id: string; secret: string; }; auth: { tokenHost: string; tokenPath: string; authorizePath: string; }; autoRefreshToken?: boolean; scopes: string; }; } | { linkType: "other" | "none" } ); export interface IntegrationEvents { connected: (id: string) => void; disconnected: (id: string) => void; "settings-update": (id: string, settings: Record) => void; } // export class IntegrationEventEmitter extends TypedEmitter {} type LinkData = | { accountId: string; } | { auth: Record; } | null; export type IntegrationData = { settings: any; userSettings?: Params; oauth?: any; accountId?: string; }; export interface IntegrationController< Params extends FirebotParams = FirebotParams > { connected: boolean; init( linked: boolean, integrationData: IntegrationData ): Awaitable; link?(linkData: LinkData): Awaitable; connect?(integrationData: IntegrationData): Awaitable; disconnect?(): Awaitable; onUserSettingsUpdate?( integrationData: IntegrationData ): Awaitable; } type ObjectOfUnknowns = { [key: string]: any; }; type IntegrationWithUnknowns = { definition: IntegrationDefinition & ObjectOfUnknowns; integration: IntegrationController & ObjectOfUnknowns; }; export type IntegrationManager = { registerIntegration(integration: Integration): void; getIntegrationById(integrationId: string): IntegrationWithUnknowns; getIntegrationDefinitionById( integrationId: string ): (IntegrationDefinition & ObjectOfUnknowns) | null; integrationIsConnectable(integrationId: string): boolean; getAllIntegrationDefinitions(): IntegrationDefinition[]; };