@nodecg/types
Version:
Dynamic broadcast graphics rendered in a browser
1,310 lines (1,309 loc) • 37.7 kB
TypeScript
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