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; port: z.ZodDefault; baseURL: z.ZodOptional; exitOnUncaught: z.ZodDefault; logging: z.ZodDefault; level: z.ZodDefault>; timestamps: z.ZodDefault; replicants: z.ZodDefault; }, "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; level: z.ZodDefault>; path: z.ZodDefault; timestamps: z.ZodDefault; replicants: z.ZodDefault; }, "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>>; disabled: z.ZodDefault>>; paths: z.ZodDefault>; }, "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; sessionSecret: z.ZodOptional; forceHttpsReturn: z.ZodDefault; steam: z.ZodEffects; apiKey: z.ZodOptional; allowedIds: z.ZodDefault>; }, "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; clientID: z.ZodOptional; clientSecret: z.ZodOptional; scope: z.ZodDefault; allowedUsernames: z.ZodDefault>; allowedIds: z.ZodDefault>; }, "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; clientID: z.ZodOptional; clientSecret: z.ZodOptional; scope: z.ZodDefault; allowedUserIDs: z.ZodDefault>; allowedGuilds: z.ZodDefault>; guildBotToken: z.ZodDefault; }, "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; allowedUsers: z.ZodDefault, "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; allowHTTP: z.ZodDefault; keyPath: z.ZodOptional; certificatePath: z.ZodOptional; passphrase: z.ZodOptional; }, "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; dsn: z.ZodOptional; }, "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; //#endregion //#region src/types/socket-protocol.d.ts interface NodeCallback { (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[]; }) => void; message: (data: { messageName: string; bundleName: string; content: unknown; }) => void; } interface ClientToServerEvents { regenerateToken: (callback: NodeCallback) => Promise; "graphic:registerSocket": (request: GraphicRegRequest, callback: NodeCallback) => void; "graphic:queryAvailability": (request: string, callback: NodeCallback) => 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; }, callback: NodeCallback<{ value: any; revision: number; } | { value: any; revision: number; schema: Record; schemaSum: string; }>) => void; "replicant:proposeOperations": (request: { name: string; namespace: string; operations: NodeCG.Replicant.Operation[]; opts: NodeCG.Replicant.Options; revision: number; } | { name: string; namespace: string; operations: NodeCG.Replicant.Operation[]; opts: NodeCG.Replicant.Options; revision: number; schema: Record; schemaSum: string; }, callback: (rejectReason: string | undefined, data: { value: any; revision: number; schema?: Record; schemaSum?: string; }) => void) => void; "replicant:read": (request: { name: string; namespace: string; }, callback: NodeCallback) => void; message: (request: { messageName: string; bundleName: string; content: unknown; }, callback: NodeCallback) => void; joinRoom: (request: string, callback: NodeCallback) => void; } type TypedClientSocket = Socket; type RootNS = Namespace; //#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; /** * 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 & 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; 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; } 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 = OptionsNoDefault | OptionsWithDefault; interface OptionsNoDefault { persistent?: boolean; persistenceInterval?: number; schemaPath?: string; } interface OptionsWithDefault { persistent?: boolean; persistenceInterval?: number; schemaPath?: string; defaultValue: D; } type Operation = { 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; }; } | { method: "fill"; args: { mutatorArgs: Parameters; }; } | { method: "pop"; } | { method: "push"; args: { mutatorArgs: Parameters; }; } | { method: "reverse"; } | { method: "shift"; } | { method: "sort"; args: { mutatorArgs: Parameters; }; } | { method: "splice"; args: { mutatorArgs: Parameters; }; } | { method: "unshift"; args: { mutatorArgs: Parameters; }; }); } /** * Express middleware that can be mounted to NodeCG's webserver via `nodecg.mount`. */ type Middleware = ExpressCore.ApplicationRequestHandler; /** * 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