import { DatabaseAdapter } from "@nodecg/database-adapter-types";
import express from "express";
import * as ExpressCore from "express-serve-static-core";
import { z } from "zod";
import { Namespace } from "socket.io";
import { Socket } from "socket.io-client";

//#region src/types/nodecg-config-schema.d.ts
declare const nodecgConfigSchema: z.ZodEffects<z.ZodObject<{
  host: z.ZodDefault<z.ZodString>;
  port: z.ZodDefault<z.ZodNumber>;
  baseURL: z.ZodOptional<z.ZodString>;
  exitOnUncaught: z.ZodDefault<z.ZodBoolean>;
  logging: z.ZodDefault<z.ZodObject<{
    console: z.ZodDefault<z.ZodObject<{
      enabled: z.ZodDefault<z.ZodBoolean>;
      level: z.ZodDefault<z.ZodEnum<["verbose", "debug", "info", "warn", "error", "silent"]>>;
      timestamps: z.ZodDefault<z.ZodBoolean>;
      replicants: z.ZodDefault<z.ZodBoolean>;
    }, "strip", z.ZodTypeAny, {
      enabled: boolean;
      level: "verbose" | "debug" | "info" | "warn" | "error" | "silent";
      timestamps: boolean;
      replicants: boolean;
    }, {
      enabled?: boolean | undefined;
      level?: "verbose" | "debug" | "info" | "warn" | "error" | "silent" | undefined;
      timestamps?: boolean | undefined;
      replicants?: boolean | undefined;
    }>>;
    file: z.ZodDefault<z.ZodObject<{
      enabled: z.ZodDefault<z.ZodBoolean>;
      level: z.ZodDefault<z.ZodEnum<["verbose", "debug", "info", "warn", "error", "silent"]>>;
      path: z.ZodDefault<z.ZodString>;
      timestamps: z.ZodDefault<z.ZodBoolean>;
      replicants: z.ZodDefault<z.ZodBoolean>;
    }, "strip", z.ZodTypeAny, {
      enabled: boolean;
      level: "verbose" | "debug" | "info" | "warn" | "error" | "silent";
      timestamps: boolean;
      replicants: boolean;
      path: string;
    }, {
      enabled?: boolean | undefined;
      level?: "verbose" | "debug" | "info" | "warn" | "error" | "silent" | undefined;
      timestamps?: boolean | undefined;
      replicants?: boolean | undefined;
      path?: string | undefined;
    }>>;
  }, "strip", z.ZodTypeAny, {
    console: {
      enabled: boolean;
      level: "verbose" | "debug" | "info" | "warn" | "error" | "silent";
      timestamps: boolean;
      replicants: boolean;
    };
    file: {
      enabled: boolean;
      level: "verbose" | "debug" | "info" | "warn" | "error" | "silent";
      timestamps: boolean;
      replicants: boolean;
      path: string;
    };
  }, {
    console?: {
      enabled?: boolean | undefined;
      level?: "verbose" | "debug" | "info" | "warn" | "error" | "silent" | undefined;
      timestamps?: boolean | undefined;
      replicants?: boolean | undefined;
    } | undefined;
    file?: {
      enabled?: boolean | undefined;
      level?: "verbose" | "debug" | "info" | "warn" | "error" | "silent" | undefined;
      timestamps?: boolean | undefined;
      replicants?: boolean | undefined;
      path?: string | undefined;
    } | undefined;
  }>>;
  bundles: z.ZodDefault<z.ZodObject<{
    enabled: z.ZodDefault<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
    disabled: z.ZodDefault<z.ZodNullable<z.ZodArray<z.ZodString, "many">>>;
    paths: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
  }, "strip", z.ZodTypeAny, {
    enabled: string[] | null;
    disabled: string[] | null;
    paths: string[];
  }, {
    enabled?: string[] | null | undefined;
    disabled?: string[] | null | undefined;
    paths?: string[] | undefined;
  }>>;
  login: z.ZodDefault<z.ZodEffects<z.ZodObject<{
    enabled: z.ZodDefault<z.ZodBoolean>;
    sessionSecret: z.ZodOptional<z.ZodString>;
    forceHttpsReturn: z.ZodDefault<z.ZodBoolean>;
    steam: z.ZodEffects<z.ZodOptional<z.ZodObject<{
      enabled: z.ZodDefault<z.ZodBoolean>;
      apiKey: z.ZodOptional<z.ZodString>;
      allowedIds: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
    }, "strip", z.ZodTypeAny, {
      enabled: boolean;
      allowedIds: string[];
      apiKey?: string | undefined;
    }, {
      enabled?: boolean | undefined;
      apiKey?: string | undefined;
      allowedIds?: string[] | undefined;
    }>>, {
      enabled: boolean;
      allowedIds: string[];
      apiKey?: string | undefined;
    } | undefined, {
      enabled?: boolean | undefined;
      apiKey?: string | undefined;
      allowedIds?: string[] | undefined;
    } | undefined>;
    twitch: z.ZodEffects<z.ZodEffects<z.ZodOptional<z.ZodObject<{
      enabled: z.ZodDefault<z.ZodBoolean>;
      clientID: z.ZodOptional<z.ZodString>;
      clientSecret: z.ZodOptional<z.ZodString>;
      scope: z.ZodDefault<z.ZodString>;
      allowedUsernames: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
      allowedIds: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
    }, "strip", z.ZodTypeAny, {
      enabled: boolean;
      allowedIds: string[];
      scope: string;
      allowedUsernames: string[];
      clientID?: string | undefined;
      clientSecret?: string | undefined;
    }, {
      enabled?: boolean | undefined;
      allowedIds?: string[] | undefined;
      clientID?: string | undefined;
      clientSecret?: string | undefined;
      scope?: string | undefined;
      allowedUsernames?: string[] | undefined;
    }>>, {
      enabled: boolean;
      allowedIds: string[];
      scope: string;
      allowedUsernames: string[];
      clientID?: string | undefined;
      clientSecret?: string | undefined;
    } | undefined, {
      enabled?: boolean | undefined;
      allowedIds?: string[] | undefined;
      clientID?: string | undefined;
      clientSecret?: string | undefined;
      scope?: string | undefined;
      allowedUsernames?: string[] | undefined;
    } | undefined>, {
      enabled: boolean;
      allowedIds: string[];
      scope: string;
      allowedUsernames: string[];
      clientID?: string | undefined;
      clientSecret?: string | undefined;
    } | undefined, {
      enabled?: boolean | undefined;
      allowedIds?: string[] | undefined;
      clientID?: string | undefined;
      clientSecret?: string | undefined;
      scope?: string | undefined;
      allowedUsernames?: string[] | undefined;
    } | undefined>;
    discord: z.ZodEffects<z.ZodEffects<z.ZodOptional<z.ZodObject<{
      enabled: z.ZodDefault<z.ZodBoolean>;
      clientID: z.ZodOptional<z.ZodString>;
      clientSecret: z.ZodOptional<z.ZodString>;
      scope: z.ZodDefault<z.ZodString>;
      allowedUserIDs: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
      allowedGuilds: z.ZodDefault<z.ZodArray<z.ZodObject<{
        guildID: z.ZodString;
        allowedRoleIDs: z.ZodDefault<z.ZodArray<z.ZodString, "many">>;
        guildBotToken: z.ZodDefault<z.ZodString>;
      }, "strip", z.ZodTypeAny, {
        guildID: string;
        allowedRoleIDs: string[];
        guildBotToken: string;
      }, {
        guildID: string;
        allowedRoleIDs?: string[] | undefined;
        guildBotToken?: string | undefined;
      }>, "many">>;
    }, "strip", z.ZodTypeAny, {
      enabled: boolean;
      scope: string;
      allowedUserIDs: string[];
      allowedGuilds: {
        guildID: string;
        allowedRoleIDs: string[];
        guildBotToken: string;
      }[];
      clientID?: string | undefined;
      clientSecret?: string | undefined;
    }, {
      enabled?: boolean | undefined;
      clientID?: string | undefined;
      clientSecret?: string | undefined;
      scope?: string | undefined;
      allowedUserIDs?: string[] | undefined;
      allowedGuilds?: {
        guildID: string;
        allowedRoleIDs?: string[] | undefined;
        guildBotToken?: string | undefined;
      }[] | undefined;
    }>>, {
      enabled: boolean;
      scope: string;
      allowedUserIDs: string[];
      allowedGuilds: {
        guildID: string;
        allowedRoleIDs: string[];
        guildBotToken: string;
      }[];
      clientID?: string | undefined;
      clientSecret?: string | undefined;
    } | undefined, {
      enabled?: boolean | undefined;
      clientID?: string | undefined;
      clientSecret?: string | undefined;
      scope?: string | undefined;
      allowedUserIDs?: string[] | undefined;
      allowedGuilds?: {
        guildID: string;
        allowedRoleIDs?: string[] | undefined;
        guildBotToken?: string | undefined;
      }[] | undefined;
    } | undefined>, {
      enabled: boolean;
      scope: string;
      allowedUserIDs: string[];
      allowedGuilds: {
        guildID: string;
        allowedRoleIDs: string[];
        guildBotToken: string;
      }[];
      clientID?: string | undefined;
      clientSecret?: string | undefined;
    } | undefined, {
      enabled?: boolean | undefined;
      clientID?: string | undefined;
      clientSecret?: string | undefined;
      scope?: string | undefined;
      allowedUserIDs?: string[] | undefined;
      allowedGuilds?: {
        guildID: string;
        allowedRoleIDs?: string[] | undefined;
        guildBotToken?: string | undefined;
      }[] | undefined;
    } | undefined>;
    local: z.ZodOptional<z.ZodObject<{
      enabled: z.ZodDefault<z.ZodBoolean>;
      allowedUsers: z.ZodDefault<z.ZodArray<z.ZodObject<{
        username: z.ZodString;
        password: z.ZodString;
      }, "strip", z.ZodTypeAny, {
        username: string;
        password: string;
      }, {
        username: string;
        password: string;
      }>, "many">>;
    }, "strip", z.ZodTypeAny, {
      enabled: boolean;
      allowedUsers: {
        username: string;
        password: string;
      }[];
    }, {
      enabled?: boolean | undefined;
      allowedUsers?: {
        username: string;
        password: string;
      }[] | undefined;
    }>>;
  }, "strip", z.ZodTypeAny, {
    enabled: boolean;
    forceHttpsReturn: boolean;
    sessionSecret?: string | undefined;
    steam?: {
      enabled: boolean;
      allowedIds: string[];
      apiKey?: string | undefined;
    } | undefined;
    twitch?: {
      enabled: boolean;
      allowedIds: string[];
      scope: string;
      allowedUsernames: string[];
      clientID?: string | undefined;
      clientSecret?: string | undefined;
    } | undefined;
    discord?: {
      enabled: boolean;
      scope: string;
      allowedUserIDs: string[];
      allowedGuilds: {
        guildID: string;
        allowedRoleIDs: string[];
        guildBotToken: string;
      }[];
      clientID?: string | undefined;
      clientSecret?: string | undefined;
    } | undefined;
    local?: {
      enabled: boolean;
      allowedUsers: {
        username: string;
        password: string;
      }[];
    } | undefined;
  }, {
    enabled?: boolean | undefined;
    sessionSecret?: string | undefined;
    forceHttpsReturn?: boolean | undefined;
    steam?: {
      enabled?: boolean | undefined;
      apiKey?: string | undefined;
      allowedIds?: string[] | undefined;
    } | undefined;
    twitch?: {
      enabled?: boolean | undefined;
      allowedIds?: string[] | undefined;
      clientID?: string | undefined;
      clientSecret?: string | undefined;
      scope?: string | undefined;
      allowedUsernames?: string[] | undefined;
    } | undefined;
    discord?: {
      enabled?: boolean | undefined;
      clientID?: string | undefined;
      clientSecret?: string | undefined;
      scope?: string | undefined;
      allowedUserIDs?: string[] | undefined;
      allowedGuilds?: {
        guildID: string;
        allowedRoleIDs?: string[] | undefined;
        guildBotToken?: string | undefined;
      }[] | undefined;
    } | undefined;
    local?: {
      enabled?: boolean | undefined;
      allowedUsers?: {
        username: string;
        password: string;
      }[] | undefined;
    } | undefined;
  }>, {
    enabled: boolean;
    forceHttpsReturn: boolean;
    sessionSecret?: string | undefined;
    steam?: {
      enabled: boolean;
      allowedIds: string[];
      apiKey?: string | undefined;
    } | undefined;
    twitch?: {
      enabled: boolean;
      allowedIds: string[];
      scope: string;
      allowedUsernames: string[];
      clientID?: string | undefined;
      clientSecret?: string | undefined;
    } | undefined;
    discord?: {
      enabled: boolean;
      scope: string;
      allowedUserIDs: string[];
      allowedGuilds: {
        guildID: string;
        allowedRoleIDs: string[];
        guildBotToken: string;
      }[];
      clientID?: string | undefined;
      clientSecret?: string | undefined;
    } | undefined;
    local?: {
      enabled: boolean;
      allowedUsers: {
        username: string;
        password: string;
      }[];
    } | undefined;
  }, {
    enabled?: boolean | undefined;
    sessionSecret?: string | undefined;
    forceHttpsReturn?: boolean | undefined;
    steam?: {
      enabled?: boolean | undefined;
      apiKey?: string | undefined;
      allowedIds?: string[] | undefined;
    } | undefined;
    twitch?: {
      enabled?: boolean | undefined;
      allowedIds?: string[] | undefined;
      clientID?: string | undefined;
      clientSecret?: string | undefined;
      scope?: string | undefined;
      allowedUsernames?: string[] | undefined;
    } | undefined;
    discord?: {
      enabled?: boolean | undefined;
      clientID?: string | undefined;
      clientSecret?: string | undefined;
      scope?: string | undefined;
      allowedUserIDs?: string[] | undefined;
      allowedGuilds?: {
        guildID: string;
        allowedRoleIDs?: string[] | undefined;
        guildBotToken?: string | undefined;
      }[] | undefined;
    } | undefined;
    local?: {
      enabled?: boolean | undefined;
      allowedUsers?: {
        username: string;
        password: string;
      }[] | undefined;
    } | undefined;
  }>>;
  ssl: z.ZodEffects<z.ZodEffects<z.ZodDefault<z.ZodObject<{
    enabled: z.ZodDefault<z.ZodBoolean>;
    allowHTTP: z.ZodDefault<z.ZodBoolean>;
    keyPath: z.ZodOptional<z.ZodString>;
    certificatePath: z.ZodOptional<z.ZodString>;
    passphrase: z.ZodOptional<z.ZodString>;
  }, "strip", z.ZodTypeAny, {
    enabled: boolean;
    allowHTTP: boolean;
    keyPath?: string | undefined;
    certificatePath?: string | undefined;
    passphrase?: string | undefined;
  }, {
    enabled?: boolean | undefined;
    allowHTTP?: boolean | undefined;
    keyPath?: string | undefined;
    certificatePath?: string | undefined;
    passphrase?: string | undefined;
  }>>, {
    enabled: boolean;
    allowHTTP: boolean;
    keyPath?: string | undefined;
    certificatePath?: string | undefined;
    passphrase?: string | undefined;
  }, {
    enabled?: boolean | undefined;
    allowHTTP?: boolean | undefined;
    keyPath?: string | undefined;
    certificatePath?: string | undefined;
    passphrase?: string | undefined;
  } | undefined>, {
    enabled: boolean;
    allowHTTP: boolean;
    keyPath?: string | undefined;
    certificatePath?: string | undefined;
    passphrase?: string | undefined;
  }, {
    enabled?: boolean | undefined;
    allowHTTP?: boolean | undefined;
    keyPath?: string | undefined;
    certificatePath?: string | undefined;
    passphrase?: string | undefined;
  } | undefined>;
  sentry: z.ZodEffects<z.ZodDefault<z.ZodObject<{
    enabled: z.ZodDefault<z.ZodBoolean>;
    dsn: z.ZodOptional<z.ZodString>;
  }, "strip", z.ZodTypeAny, {
    enabled: boolean;
    dsn?: string | undefined;
  }, {
    enabled?: boolean | undefined;
    dsn?: string | undefined;
  }>>, {
    enabled: boolean;
    dsn?: string | undefined;
  }, {
    enabled?: boolean | undefined;
    dsn?: string | undefined;
  } | undefined>;
}, "strip", z.ZodTypeAny, {
  host: string;
  port: number;
  exitOnUncaught: boolean;
  logging: {
    console: {
      enabled: boolean;
      level: "verbose" | "debug" | "info" | "warn" | "error" | "silent";
      timestamps: boolean;
      replicants: boolean;
    };
    file: {
      enabled: boolean;
      level: "verbose" | "debug" | "info" | "warn" | "error" | "silent";
      timestamps: boolean;
      replicants: boolean;
      path: string;
    };
  };
  bundles: {
    enabled: string[] | null;
    disabled: string[] | null;
    paths: string[];
  };
  login: {
    enabled: boolean;
    forceHttpsReturn: boolean;
    sessionSecret?: string | undefined;
    steam?: {
      enabled: boolean;
      allowedIds: string[];
      apiKey?: string | undefined;
    } | undefined;
    twitch?: {
      enabled: boolean;
      allowedIds: string[];
      scope: string;
      allowedUsernames: string[];
      clientID?: string | undefined;
      clientSecret?: string | undefined;
    } | undefined;
    discord?: {
      enabled: boolean;
      scope: string;
      allowedUserIDs: string[];
      allowedGuilds: {
        guildID: string;
        allowedRoleIDs: string[];
        guildBotToken: string;
      }[];
      clientID?: string | undefined;
      clientSecret?: string | undefined;
    } | undefined;
    local?: {
      enabled: boolean;
      allowedUsers: {
        username: string;
        password: string;
      }[];
    } | undefined;
  };
  ssl: {
    enabled: boolean;
    allowHTTP: boolean;
    keyPath?: string | undefined;
    certificatePath?: string | undefined;
    passphrase?: string | undefined;
  };
  sentry: {
    enabled: boolean;
    dsn?: string | undefined;
  };
  baseURL?: string | undefined;
}, {
  host?: string | undefined;
  port?: number | undefined;
  baseURL?: string | undefined;
  exitOnUncaught?: boolean | undefined;
  logging?: {
    console?: {
      enabled?: boolean | undefined;
      level?: "verbose" | "debug" | "info" | "warn" | "error" | "silent" | undefined;
      timestamps?: boolean | undefined;
      replicants?: boolean | undefined;
    } | undefined;
    file?: {
      enabled?: boolean | undefined;
      level?: "verbose" | "debug" | "info" | "warn" | "error" | "silent" | undefined;
      timestamps?: boolean | undefined;
      replicants?: boolean | undefined;
      path?: string | undefined;
    } | undefined;
  } | undefined;
  bundles?: {
    enabled?: string[] | null | undefined;
    disabled?: string[] | null | undefined;
    paths?: string[] | undefined;
  } | undefined;
  login?: {
    enabled?: boolean | undefined;
    sessionSecret?: string | undefined;
    forceHttpsReturn?: boolean | undefined;
    steam?: {
      enabled?: boolean | undefined;
      apiKey?: string | undefined;
      allowedIds?: string[] | undefined;
    } | undefined;
    twitch?: {
      enabled?: boolean | undefined;
      allowedIds?: string[] | undefined;
      clientID?: string | undefined;
      clientSecret?: string | undefined;
      scope?: string | undefined;
      allowedUsernames?: string[] | undefined;
    } | undefined;
    discord?: {
      enabled?: boolean | undefined;
      clientID?: string | undefined;
      clientSecret?: string | undefined;
      scope?: string | undefined;
      allowedUserIDs?: string[] | undefined;
      allowedGuilds?: {
        guildID: string;
        allowedRoleIDs?: string[] | undefined;
        guildBotToken?: string | undefined;
      }[] | undefined;
    } | undefined;
    local?: {
      enabled?: boolean | undefined;
      allowedUsers?: {
        username: string;
        password: string;
      }[] | undefined;
    } | undefined;
  } | undefined;
  ssl?: {
    enabled?: boolean | undefined;
    allowHTTP?: boolean | undefined;
    keyPath?: string | undefined;
    certificatePath?: string | undefined;
    passphrase?: string | undefined;
  } | undefined;
  sentry?: {
    enabled?: boolean | undefined;
    dsn?: string | undefined;
  } | undefined;
}>, {
  baseURL: string;
  host: string;
  port: number;
  exitOnUncaught: boolean;
  logging: {
    console: {
      enabled: boolean;
      level: "verbose" | "debug" | "info" | "warn" | "error" | "silent";
      timestamps: boolean;
      replicants: boolean;
    };
    file: {
      enabled: boolean;
      level: "verbose" | "debug" | "info" | "warn" | "error" | "silent";
      timestamps: boolean;
      replicants: boolean;
      path: string;
    };
  };
  bundles: {
    enabled: string[] | null;
    disabled: string[] | null;
    paths: string[];
  };
  login: {
    enabled: boolean;
    forceHttpsReturn: boolean;
    sessionSecret?: string | undefined;
    steam?: {
      enabled: boolean;
      allowedIds: string[];
      apiKey?: string | undefined;
    } | undefined;
    twitch?: {
      enabled: boolean;
      allowedIds: string[];
      scope: string;
      allowedUsernames: string[];
      clientID?: string | undefined;
      clientSecret?: string | undefined;
    } | undefined;
    discord?: {
      enabled: boolean;
      scope: string;
      allowedUserIDs: string[];
      allowedGuilds: {
        guildID: string;
        allowedRoleIDs: string[];
        guildBotToken: string;
      }[];
      clientID?: string | undefined;
      clientSecret?: string | undefined;
    } | undefined;
    local?: {
      enabled: boolean;
      allowedUsers: {
        username: string;
        password: string;
      }[];
    } | undefined;
  };
  ssl: {
    enabled: boolean;
    allowHTTP: boolean;
    keyPath?: string | undefined;
    certificatePath?: string | undefined;
    passphrase?: string | undefined;
  };
  sentry: {
    enabled: boolean;
    dsn?: string | undefined;
  };
}, {
  host?: string | undefined;
  port?: number | undefined;
  baseURL?: string | undefined;
  exitOnUncaught?: boolean | undefined;
  logging?: {
    console?: {
      enabled?: boolean | undefined;
      level?: "verbose" | "debug" | "info" | "warn" | "error" | "silent" | undefined;
      timestamps?: boolean | undefined;
      replicants?: boolean | undefined;
    } | undefined;
    file?: {
      enabled?: boolean | undefined;
      level?: "verbose" | "debug" | "info" | "warn" | "error" | "silent" | undefined;
      timestamps?: boolean | undefined;
      replicants?: boolean | undefined;
      path?: string | undefined;
    } | undefined;
  } | undefined;
  bundles?: {
    enabled?: string[] | null | undefined;
    disabled?: string[] | null | undefined;
    paths?: string[] | undefined;
  } | undefined;
  login?: {
    enabled?: boolean | undefined;
    sessionSecret?: string | undefined;
    forceHttpsReturn?: boolean | undefined;
    steam?: {
      enabled?: boolean | undefined;
      apiKey?: string | undefined;
      allowedIds?: string[] | undefined;
    } | undefined;
    twitch?: {
      enabled?: boolean | undefined;
      allowedIds?: string[] | undefined;
      clientID?: string | undefined;
      clientSecret?: string | undefined;
      scope?: string | undefined;
      allowedUsernames?: string[] | undefined;
    } | undefined;
    discord?: {
      enabled?: boolean | undefined;
      clientID?: string | undefined;
      clientSecret?: string | undefined;
      scope?: string | undefined;
      allowedUserIDs?: string[] | undefined;
      allowedGuilds?: {
        guildID: string;
        allowedRoleIDs?: string[] | undefined;
        guildBotToken?: string | undefined;
      }[] | undefined;
    } | undefined;
    local?: {
      enabled?: boolean | undefined;
      allowedUsers?: {
        username: string;
        password: string;
      }[] | undefined;
    } | undefined;
  } | undefined;
  ssl?: {
    enabled?: boolean | undefined;
    allowHTTP?: boolean | undefined;
    keyPath?: string | undefined;
    certificatePath?: string | undefined;
    passphrase?: string | undefined;
  } | undefined;
  sentry?: {
    enabled?: boolean | undefined;
    dsn?: string | undefined;
  } | undefined;
}>;
type NodeCGConfig = z.infer<typeof nodecgConfigSchema>;
//#endregion
//#region src/types/socket-protocol.d.ts
interface NodeCallback<T = undefined> {
  (err: string, response: undefined): void;
  (err: undefined, response: T): void;
}
declare enum UnAuthErrCode {
  CredentialsBadFormat = "credentials_bad_format",
  CredentialsRequired = "credentials_required",
  InternalError = "internal_error",
  InvalidToken = "invalid_token",
  TokenRevoked = "token_invalidated",
  InvalidSession = "invalid_session",
}
interface ProtocolError {
  message: string;
  code: UnAuthErrCode;
  type: string;
}
interface GraphicRegRequest {
  timestamp: number;
  pathName: string;
  bundleName: string;
  bundleVersion?: string;
  bundleGit: NodeCG.Bundle.GitData;
}
interface ServerToClientEvents {
  protocol_error: (error: ProtocolError) => void;
  "graphic:bundleRefresh": (bundleName: string) => void;
  "graphic:refreshAll": (graphic: NodeCG.Bundle.Graphic) => void;
  "graphic:refresh": (graphicInstance: NodeCG.GraphicsInstance) => void;
  "graphic:kill": (graphicInstance: NodeCG.GraphicsInstance) => void;
  "replicant:operations": (data: {
    name: string;
    namespace: string;
    revision: number;
    operations: NodeCG.Replicant.Operation<any>[];
  }) => void;
  message: (data: {
    messageName: string;
    bundleName: string;
    content: unknown;
  }) => void;
}
interface ClientToServerEvents {
  regenerateToken: (callback: NodeCallback) => Promise<void>;
  "graphic:registerSocket": (request: GraphicRegRequest, callback: NodeCallback<boolean>) => void;
  "graphic:queryAvailability": (request: string, callback: NodeCallback<boolean>) => void;
  "graphic:requestBundleRefresh": (request: string, callback: NodeCallback) => void;
  "graphic:requestRefreshAll": (request: NodeCG.Bundle.Graphic, callback: NodeCallback) => void;
  "graphic:requestRefresh": (request: NodeCG.GraphicsInstance, callback: NodeCallback) => void;
  "graphic:requestKill": (request: NodeCG.GraphicsInstance, callback: NodeCallback) => void;
  "replicant:declare": (request: {
    name: string;
    namespace: string;
    opts: NodeCG.Replicant.Options<any>;
  }, callback: NodeCallback<{
    value: any;
    revision: number;
  } | {
    value: any;
    revision: number;
    schema: Record<string, any>;
    schemaSum: string;
  }>) => void;
  "replicant:proposeOperations": (request: {
    name: string;
    namespace: string;
    operations: NodeCG.Replicant.Operation<any>[];
    opts: NodeCG.Replicant.Options<any>;
    revision: number;
  } | {
    name: string;
    namespace: string;
    operations: NodeCG.Replicant.Operation<any>[];
    opts: NodeCG.Replicant.Options<any>;
    revision: number;
    schema: Record<string, any>;
    schemaSum: string;
  }, callback: (rejectReason: string | undefined, data: {
    value: any;
    revision: number;
    schema?: Record<string, any>;
    schemaSum?: string;
  }) => void) => void;
  "replicant:read": (request: {
    name: string;
    namespace: string;
  }, callback: NodeCallback<unknown>) => void;
  message: (request: {
    messageName: string;
    bundleName: string;
    content: unknown;
  }, callback: NodeCallback<unknown>) => void;
  joinRoom: (request: string, callback: NodeCallback) => void;
}
type TypedClientSocket = Socket<ServerToClientEvents, ClientToServerEvents>;
type RootNS = Namespace<ClientToServerEvents, ServerToClientEvents>;
//#endregion
//#region src/types/nodecg.d.ts
type Person = {
  name: string;
  email?: string;
  url?: string;
} | string;
declare namespace NodeCG {
  /**
   * A collection of types that represent the raw data from the `nodecg` stanza in a bundle's `package.json`.
   */
  namespace Manifest {
    /**
     * An unparsed `assetCategory` from a bundle's `package.json`.
     */
    interface UnparsedAssetCategory {
      name: string;
      title: string;
      allowedTypes?: string[];
    }
    /**
     * An unparsed `panel` from a bundle's `package.json`.
     */
    interface UnparsedPanel {
      name: string;
      title: string;
      file: string;
      headerColor?: string;
      fullbleed?: boolean;
      workspace?: string;
      dialog?: boolean;
      dialogButtons?: {
        name: string;
        type: "dismiss" | "confirm";
      }[];
      width?: number;
    }
    /**
     * An unparsed `graphic` from a bundle's `package.json`.
     */
    interface UnparsedGraphic {
      file: string;
      width: number;
      height: number;
      singleInstance?: boolean;
    }
    /**
     * An unparsed `mount` configuration from a bundle's `package.json`.
     */
    interface UnparsedMount {
      directory: string;
      endpoint: string;
    }
    /**
     * An unparsed `soundCue` from a bundle's `package.json`.
     */
    interface UnparsedSoundCue {
      name: string;
      assignable?: boolean;
      defaultVolume?: number;
      defaultFile?: string;
    }
    /**
     * An unparsed record of `bundleDependencies` from a bundle's `package.json`.
     */
    type UnparsedBundleDependencies = Record<string, string>;
    /**
     * The actual structure of a bundle's `nodecg` stanza from it's `package.json`.
     */
    interface UnparsedManifest {
      compatibleRange?: string;
      transformBareModuleSpecifiers?: boolean;
      dashboardPanels?: UnparsedPanel[];
      graphics?: UnparsedGraphic[];
      assetCategories?: UnparsedAssetCategory[];
      mount?: UnparsedMount[];
      soundCues?: UnparsedSoundCue[];
      bundleDependencies?: UnparsedBundleDependencies;
    }
  }
  /**
   * The rough structure of a bundle's `package.json`.
   * Only includes types that NodeCG cares about.
   */
  interface PackageJSON {
    name: string;
    version: string;
    license?: string;
    description?: string;
    homepage?: string;
    author?: Person;
    contributors?: Person[];
    nodecg?: Manifest.UnparsedManifest;
  }
  /**
   * A _parsed_ bundle manifest as used internally by NodeCG.
   */
  type Manifest = Omit<PackageJSON, "nodecg"> & Manifest.UnparsedManifest & {
    transformBareModuleSpecifiers: boolean;
  };
  /**
   * A collection of types that comprise a `bundle`.
   */
  namespace Bundle {
    type GitData = undefined | {
      branch: string;
      hash: string;
      shortHash: string;
    } | {
      branch: string;
      hash: string;
      shortHash: string;
      date: string;
      message: string;
    };
    type Graphic = {
      url: string;
    } & Required<Manifest.UnparsedGraphic>;
    type Panel = Manifest.UnparsedPanel & {
      path: string;
      headerColor: string;
      bundleName: string;
      html: string;
    } & ({
      dialog: false;
      workspace: string;
    } | {
      dialog: true;
    }) & ({
      fullbleed: false;
      width: number;
    } | {
      fullbleed: true;
    });
    type Mount = Manifest.UnparsedMount;
    type SoundCue = Manifest.UnparsedSoundCue;
    type AssetCategory = Manifest.UnparsedAssetCategory;
    type BundleDependencies = Manifest.UnparsedBundleDependencies;
    type UnknownConfig = Record<string, unknown>;
  }
  interface NodecgBundleConfig {
    databaseAdapter?: DatabaseAdapter;
  }
  /**
   * The actual type of a `bundle`.
   */
  interface Bundle {
    name: string;
    version: string;
    license?: string;
    description?: string;
    homepage?: string;
    author?: Person;
    contributors?: Person[];
    dir: string;
    git: Bundle.GitData;
    transformBareModuleSpecifiers: boolean;
    hasAssignableSoundCues: boolean;
    hasExtension: boolean;
    config: Bundle.UnknownConfig;
    dashboard: {
      dir: string;
      panels: Bundle.Panel[];
    };
    graphics: Bundle.Graphic[];
    assetCategories: Bundle.AssetCategory[];
    mount: Bundle.Mount[];
    soundCues: Bundle.SoundCue[];
    compatibleRange?: string;
    bundleDependencies?: Bundle.BundleDependencies;
    nodecgBundleConfig: NodecgBundleConfig;
  }
  /**
   * NodeCG's socket protocol.
   * It is unikely that you will need to use this directly.
   * Does not include builtin Socket.IO events such as `connect`, `disconnect`, etc.
   */
  interface SocketProtocol {
    serverToClient: ServerToClientEvents;
    clientToServer: ClientToServerEvents;
  }
  /**
   * The full, parsed NodeCG config (i.e `cfg/nodecg.{json,yaml,js}`).
   * Contains sensitive secrets!
   * Available to server-side code (extensions) only.
   */
  type Config = NodeCGConfig;
  /**
   * The filtered, minimal, parsed NodeCG config (i.e `cfg/nodecg.{json,yaml,js}`).
   * Does not contain any sensitive secrets.
   * Available to client-side code (dashboard, graphics) only.
   */
  interface FilteredConfig {
    host: string;
    port: number;
    baseURL: string;
    logging: {
      console: {
        enabled: boolean;
        level: string;
        timestamps: boolean;
        replicants: boolean;
      };
      file: {
        enabled: boolean;
        level: string;
        timestamps: boolean;
        replicants: boolean;
      };
    };
    sentry: {
      enabled: boolean;
      dsn?: string;
    };
    login: {
      enabled: boolean;
      steam?: {
        enabled: boolean;
      };
      twitch?: {
        enabled: boolean;
        clientID?: string;
        scope?: string;
      };
      local?: {
        enabled: boolean;
      };
      discord?: {
        enabled: boolean;
        clientID?: string;
        scope?: string;
      };
    };
    ssl?: {
      enabled: boolean;
    };
  }
  /**
   * A sound cue `file`, as used in sound cue Replicants.
   */
  interface CueFile {
    sum: string;
    base: string;
    ext: string;
    name: string;
    url: string;
    default: boolean;
  }
  /**
   * A sound cue definition, as used in sound cue Replicants.
   */
  interface SoundCue {
    name: string;
    volume: number;
    file?: CueFile;
    assignable: boolean;
    channels?: number;
    bundleName?: TemplateStringsArray;
    defaultVolume?: number | undefined;
    defaultFile?: CueFile;
  }
  /**
   * An asset file, as used in assets Replicants.
   */
  interface AssetFile {
    sum: string;
    base: string;
    ext: string;
    name: string;
    namespace: string;
    category: string;
    url: string;
  }
  /**
   * A namespace containing various types used in the Replicant system.
   * It should be unlikely that you need to use these directly.
   */
  namespace Replicant {
    type Options<D> = OptionsNoDefault | OptionsWithDefault<D>;
    interface OptionsNoDefault {
      persistent?: boolean;
      persistenceInterval?: number;
      schemaPath?: string;
    }
    interface OptionsWithDefault<D> {
      persistent?: boolean;
      persistenceInterval?: number;
      schemaPath?: string;
      defaultValue: D;
    }
    type Operation<T> = {
      path: string;
    } & ({
      method: "overwrite";
      args: {
        newValue: T | undefined;
      };
    } | {
      method: "delete";
      args: {
        prop: string | number | symbol;
      };
    } | {
      method: "add";
      args: {
        prop: string;
        newValue: any;
      };
    } | {
      method: "update";
      args: {
        prop: string;
        newValue: any;
      };
    } | {
      method: "copyWithin";
      args: {
        mutatorArgs: Parameters<any[]["copyWithin"]>;
      };
    } | {
      method: "fill";
      args: {
        mutatorArgs: Parameters<any[]["fill"]>;
      };
    } | {
      method: "pop";
    } | {
      method: "push";
      args: {
        mutatorArgs: Parameters<any[]["push"]>;
      };
    } | {
      method: "reverse";
    } | {
      method: "shift";
    } | {
      method: "sort";
      args: {
        mutatorArgs: Parameters<any[]["sort"]>;
      };
    } | {
      method: "splice";
      args: {
        mutatorArgs: Parameters<any[]["splice"]>;
      };
    } | {
      method: "unshift";
      args: {
        mutatorArgs: Parameters<any[]["unshift"]>;
      };
    });
  }
  /**
   * Express middleware that can be mounted to NodeCG's webserver via `nodecg.mount`.
   */
  type Middleware = ExpressCore.ApplicationRequestHandler<express.Application>;
  /**
   * A description of an instance of a currently-open graphic.
   * It is unlikely that you will need to use this type directly.
   */
  interface GraphicsInstance {
    ipv4: string;
    timestamp: number;
    bundleName: string;
    bundleVersion?: string;
    bundleGit: Bundle.GitData;
    pathName: string;
    singleInstance: boolean;
    socketId: string;
    open: boolean;
    potentiallyOutOfDate: boolean;
  }
  /**
   * A description of a dashboard workspace.
   * It is unlikely that you will need to use this type directly.
   */
  interface Workspace {
    name: string;
    label: string;
    route: string;
    fullbleed?: boolean;
  }
  /**
   * A handled `listenFor` acknowledgement.
   * Attempting to call/invoke a handled acknowledgement will throw an error.
   */
  interface HandledAcknowledgement {
    handled: true;
  }
  /**
   * An unhandled `listenFor` acknowledgement.
   * It can safely be called/invoked.
   */
  interface UnhandledAcknowledgement {
    handled: false;
    (err?: any, response?: unknown): void;
  }
  /**
   * A `listenFor` acknowledgement, sent from client to server.
   */
  type Acknowledgement = HandledAcknowledgement | UnhandledAcknowledgement;
  /**
   * A `listenFor` handler function/callback.
   */
  type ListenHandler = (data: any, ack?: Acknowledgement) => void;
  /**
   * A description of NodeCG's logger interface.
   */
  interface Logger {
    name: string;
    trace: (...args: any[]) => void;
    debug: (...args: any[]) => void;
    info: (...args: any[]) => void;
    warn: (...args: any[]) => void;
    error: (...args: any[]) => void;
    replicants: (...args: any[]) => void;
  }
  /**
   * The logging levels available to NodeCG.
   */
  enum LogLevel {
    Trace = "verbose",
    Debug = "debug",
    Info = "info",
    Warn = "warn",
    Error = "error",
    Silent = "silent",
  }
  /**
   * A description of which platform/environment an instance of the NodeCG API is being used in.
   * It should not be necessary to ever use this type directly in your bundle's code.
   */
  type Platform = "server" | "client";
}
//#endregion
export { TypedClientSocket as i, RootNS as n, ServerToClientEvents as r, NodeCG as t };
//# sourceMappingURL=nodecg.d.ts.map