@babylonjs-toolkit/server 0.0.0-stage → 9.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CUSTOM.md +1690 -0
- package/DEPLOY.md +2012 -0
- package/README.md +1081 -2
- package/lib/AbuseLimits.d.ts +64 -0
- package/lib/AbuseLimits.js +121 -0
- package/lib/Authentication.d.ts +86 -0
- package/lib/Authentication.js +272 -0
- package/lib/BootSessionOwner.d.ts +86 -0
- package/lib/BootSessionOwner.js +116 -0
- package/lib/ColyseusLoggerAdapter.d.ts +32 -0
- package/lib/ColyseusLoggerAdapter.js +73 -0
- package/lib/DedicatedSceneRegistry.d.ts +52 -0
- package/lib/DedicatedSceneRegistry.js +74 -0
- package/lib/DedicatedSession.d.ts +152 -0
- package/lib/DedicatedSession.js +173 -0
- package/lib/DualTransport.d.ts +112 -0
- package/lib/DualTransport.js +197 -0
- package/lib/GameServer.d.ts +64 -0
- package/lib/GameServer.js +647 -0
- package/lib/GameServerConfig.d.ts +387 -0
- package/lib/GameServerConfig.js +1059 -0
- package/lib/GameServerLobbyRoom.d.ts +33 -0
- package/lib/GameServerLobbyRoom.js +56 -0
- package/lib/GameServerLogger.d.ts +111 -0
- package/lib/GameServerLogger.js +190 -0
- package/lib/GameServerMetrics.d.ts +158 -0
- package/lib/GameServerMetrics.js +276 -0
- package/lib/GameServerState.d.ts +164 -0
- package/lib/GameServerState.js +26 -0
- package/lib/HeadlessRuntime.d.ts +316 -0
- package/lib/HeadlessRuntime.js +380 -0
- package/lib/JoinGate.d.ts +34 -0
- package/lib/JoinGate.js +221 -0
- package/lib/NetworkAddresses.d.ts +33 -0
- package/lib/NetworkAddresses.js +90 -0
- package/lib/PlayerTokens.d.ts +17 -0
- package/lib/PlayerTokens.js +24 -0
- package/lib/RoomServerTransport.d.ts +73 -0
- package/lib/RoomServerTransport.js +90 -0
- package/lib/ServerEndpoints.d.ts +133 -0
- package/lib/ServerEndpoints.js +247 -0
- package/lib/ServerInit.d.ts +28 -0
- package/lib/ServerInit.js +113 -0
- package/lib/SessionRoom.d.ts +391 -0
- package/lib/SessionRoom.js +930 -0
- package/lib/TlsCertificates.d.ts +35 -0
- package/lib/TlsCertificates.js +130 -0
- package/lib/admin/AccountRoutes.d.ts +8 -0
- package/lib/admin/AccountRoutes.js +502 -0
- package/lib/admin/AdminAccounts.d.ts +329 -0
- package/lib/admin/AdminAccounts.js +607 -0
- package/lib/admin/AdminApiRouter.d.ts +202 -0
- package/lib/admin/AdminApiRouter.js +465 -0
- package/lib/admin/AdminApiTypes.d.ts +1782 -0
- package/lib/admin/AdminApiTypes.js +4 -0
- package/lib/admin/AdminAudit.d.ts +113 -0
- package/lib/admin/AdminAudit.js +266 -0
- package/lib/admin/AdminCli.d.ts +7 -0
- package/lib/admin/AdminCli.js +351 -0
- package/lib/admin/AdminClock.d.ts +51 -0
- package/lib/admin/AdminClock.js +10 -0
- package/lib/admin/AdminConsole.d.ts +39 -0
- package/lib/admin/AdminConsole.js +325 -0
- package/lib/admin/AdminConstants.d.ts +147 -0
- package/lib/admin/AdminConstants.js +167 -0
- package/lib/admin/AdminCrypto.d.ts +19 -0
- package/lib/admin/AdminCrypto.js +29 -0
- package/lib/admin/AdminExtensionsHost.d.ts +176 -0
- package/lib/admin/AdminExtensionsHost.js +307 -0
- package/lib/admin/AdminPasswords.d.ts +33 -0
- package/lib/admin/AdminPasswords.js +92 -0
- package/lib/admin/AdminPermissions.d.ts +28 -0
- package/lib/admin/AdminPermissions.js +74 -0
- package/lib/admin/AdminRecords.d.ts +196 -0
- package/lib/admin/AdminRecords.js +3 -0
- package/lib/admin/AdminRequestBodies.d.ts +47 -0
- package/lib/admin/AdminRequestBodies.js +84 -0
- package/lib/admin/AdminRequestGate.d.ts +38 -0
- package/lib/admin/AdminRequestGate.js +59 -0
- package/lib/admin/AdminResponses.d.ts +103 -0
- package/lib/admin/AdminResponses.js +164 -0
- package/lib/admin/AdminServices.d.ts +99 -0
- package/lib/admin/AdminServices.js +4 -0
- package/lib/admin/AdminStaticFiles.d.ts +29 -0
- package/lib/admin/AdminStaticFiles.js +97 -0
- package/lib/admin/AdminStore.d.ts +152 -0
- package/lib/admin/AdminStore.js +46 -0
- package/lib/admin/AlertChannels.d.ts +43 -0
- package/lib/admin/AlertChannels.js +120 -0
- package/lib/admin/AlertEngine.d.ts +231 -0
- package/lib/admin/AlertEngine.js +681 -0
- package/lib/admin/AlertRoutes.d.ts +8 -0
- package/lib/admin/AlertRoutes.js +180 -0
- package/lib/admin/ApiKeyRoutes.d.ts +8 -0
- package/lib/admin/ApiKeyRoutes.js +53 -0
- package/lib/admin/ApiKeys.d.ts +63 -0
- package/lib/admin/ApiKeys.js +167 -0
- package/lib/admin/AuditRoutes.d.ts +8 -0
- package/lib/admin/AuditRoutes.js +106 -0
- package/lib/admin/AuthToolRoutes.d.ts +13 -0
- package/lib/admin/AuthToolRoutes.js +164 -0
- package/lib/admin/BanList.d.ts +87 -0
- package/lib/admin/BanList.js +152 -0
- package/lib/admin/CborDecoder.d.ts +18 -0
- package/lib/admin/CborDecoder.js +201 -0
- package/lib/admin/ColyseusCloudClient.d.ts +313 -0
- package/lib/admin/ColyseusCloudClient.js +272 -0
- package/lib/admin/ColyseusCloudRoutes.d.ts +8 -0
- package/lib/admin/ColyseusCloudRoutes.js +91 -0
- package/lib/admin/ColyseusCloudService.d.ts +180 -0
- package/lib/admin/ColyseusCloudService.js +476 -0
- package/lib/admin/ColyseusCloudSettings.d.ts +16 -0
- package/lib/admin/ColyseusCloudSettings.js +29 -0
- package/lib/admin/ColyseusCloudViews.d.ts +105 -0
- package/lib/admin/ColyseusCloudViews.js +371 -0
- package/lib/admin/CommonPasswords.d.ts +6 -0
- package/lib/admin/CommonPasswords.js +19 -0
- package/lib/admin/ConfigOverrides.d.ts +174 -0
- package/lib/admin/ConfigOverrides.js +406 -0
- package/lib/admin/ConfigRoutes.d.ts +8 -0
- package/lib/admin/ConfigRoutes.js +91 -0
- package/lib/admin/ConsoleSessions.d.ts +112 -0
- package/lib/admin/ConsoleSessions.js +201 -0
- package/lib/admin/DedicatedRoutes.d.ts +21 -0
- package/lib/admin/DedicatedRoutes.js +254 -0
- package/lib/admin/ExtensionRoutes.d.ts +8 -0
- package/lib/admin/ExtensionRoutes.js +145 -0
- package/lib/admin/FileAdminStore.d.ts +157 -0
- package/lib/admin/FileAdminStore.js +349 -0
- package/lib/admin/FleetDirectory.d.ts +323 -0
- package/lib/admin/FleetDirectory.js +489 -0
- package/lib/admin/FleetLeader.d.ts +43 -0
- package/lib/admin/FleetLeader.js +89 -0
- package/lib/admin/FleetRoutes.d.ts +55 -0
- package/lib/admin/FleetRoutes.js +465 -0
- package/lib/admin/HealthWarnings.d.ts +10 -0
- package/lib/admin/HealthWarnings.js +95 -0
- package/lib/admin/LeaderboardRoutes.d.ts +8 -0
- package/lib/admin/LeaderboardRoutes.js +569 -0
- package/lib/admin/LogBuffer.d.ts +60 -0
- package/lib/admin/LogBuffer.js +92 -0
- package/lib/admin/LogRedaction.d.ts +15 -0
- package/lib/admin/LogRedaction.js +72 -0
- package/lib/admin/LogRoutes.d.ts +45 -0
- package/lib/admin/LogRoutes.js +307 -0
- package/lib/admin/MaintenanceMode.d.ts +41 -0
- package/lib/admin/MaintenanceMode.js +74 -0
- package/lib/admin/MaintenanceWindows.d.ts +91 -0
- package/lib/admin/MaintenanceWindows.js +207 -0
- package/lib/admin/MetricsRoutes.d.ts +8 -0
- package/lib/admin/MetricsRoutes.js +209 -0
- package/lib/admin/MetricsSampler.d.ts +124 -0
- package/lib/admin/MetricsSampler.js +211 -0
- package/lib/admin/OneTimeCodes.d.ts +60 -0
- package/lib/admin/OneTimeCodes.js +162 -0
- package/lib/admin/OpenIdConnect.d.ts +146 -0
- package/lib/admin/OpenIdConnect.js +335 -0
- package/lib/admin/Passkeys.d.ts +130 -0
- package/lib/admin/Passkeys.js +432 -0
- package/lib/admin/PlayerRoutes.d.ts +20 -0
- package/lib/admin/PlayerRoutes.js +676 -0
- package/lib/admin/RedisAdminStore.d.ts +114 -0
- package/lib/admin/RedisAdminStore.js +258 -0
- package/lib/admin/RolloutCoordinator.d.ts +99 -0
- package/lib/admin/RolloutCoordinator.js +321 -0
- package/lib/admin/ServerEvents.d.ts +57 -0
- package/lib/admin/ServerEvents.js +89 -0
- package/lib/admin/SessionRoutes.d.ts +113 -0
- package/lib/admin/SessionRoutes.js +386 -0
- package/lib/admin/UserRoutes.d.ts +8 -0
- package/lib/admin/UserRoutes.js +214 -0
- package/lib/cli.d.ts +2 -0
- package/lib/cli.js +221 -0
- package/lib/console/assets/index-CI5N7c-T.js +21 -0
- package/lib/console/assets/index-DPitvzLp.css +1 -0
- package/lib/console/favicon.svg +1 -0
- package/lib/console/index.html +16 -0
- package/lib/discord/DiscordOAuth.d.ts +57 -0
- package/lib/discord/DiscordOAuth.js +127 -0
- package/lib/discord/DiscordSessions.d.ts +79 -0
- package/lib/discord/DiscordSessions.js +135 -0
- package/lib/discord/DiscordSignInConstants.d.ts +54 -0
- package/lib/discord/DiscordSignInConstants.js +55 -0
- package/lib/discord/DiscordSignInRoutes.d.ts +51 -0
- package/lib/discord/DiscordSignInRoutes.js +359 -0
- package/lib/index.d.ts +24 -0
- package/lib/index.js +18 -0
- package/lib/leaderboards/FileLeaderboardRankStore.d.ts +293 -0
- package/lib/leaderboards/FileLeaderboardRankStore.js +808 -0
- package/lib/leaderboards/LeaderboardConstants.d.ts +63 -0
- package/lib/leaderboards/LeaderboardConstants.js +70 -0
- package/lib/leaderboards/LeaderboardError.d.ts +15 -0
- package/lib/leaderboards/LeaderboardError.js +20 -0
- package/lib/leaderboards/LeaderboardIdentity.d.ts +44 -0
- package/lib/leaderboards/LeaderboardIdentity.js +72 -0
- package/lib/leaderboards/LeaderboardPublicApi.d.ts +17 -0
- package/lib/leaderboards/LeaderboardPublicApi.js +389 -0
- package/lib/leaderboards/LeaderboardRankStore.d.ts +296 -0
- package/lib/leaderboards/LeaderboardRankStore.js +18 -0
- package/lib/leaderboards/LeaderboardRules.d.ts +122 -0
- package/lib/leaderboards/LeaderboardRules.js +472 -0
- package/lib/leaderboards/LeaderboardScheduler.d.ts +43 -0
- package/lib/leaderboards/LeaderboardScheduler.js +103 -0
- package/lib/leaderboards/LeaderboardService.d.ts +669 -0
- package/lib/leaderboards/LeaderboardService.js +1667 -0
- package/lib/leaderboards/LeaderboardTransfer.d.ts +35 -0
- package/lib/leaderboards/LeaderboardTransfer.js +580 -0
- package/lib/leaderboards/RedisLeaderboardRankStore.d.ts +282 -0
- package/lib/leaderboards/RedisLeaderboardRankStore.js +691 -0
- package/package.json +64 -4
- package/templates/init/Caddyfile +6 -0
- package/templates/init/DEPLOY.md +233 -0
- package/templates/init/Dockerfile +12 -0
- package/templates/init/app.json +21 -0
- package/templates/init/aws/README.md +118 -0
- package/templates/init/aws/ecs-fargate-alb.yml +207 -0
- package/templates/init/aws/ecs-fargate-nlb-quic.yml +210 -0
- package/templates/init/babylon-game-server.config.mjs +158 -0
- package/templates/init/colyseus-cloud/README.md +133 -0
- package/templates/init/colyseus-cloud/babylon-game-server.config.mjs +36 -0
- package/templates/init/colyseus-cloud/ecosystem.config.cjs +35 -0
- package/templates/init/colyseus-cloud/gitignore +6 -0
- package/templates/init/colyseus-cloud/package.json +15 -0
- package/templates/init/digitalocean-app.yaml +30 -0
- package/templates/init/docker-compose.full.yml +45 -0
- package/templates/init/docker-compose.websocket.yml +41 -0
- package/templates/init/fly.toml +56 -0
- package/templates/init/heroku.yml +11 -0
- package/templates/init/kubernetes/deployment.yaml +71 -0
- package/templates/init/kubernetes/redis.yaml +73 -0
- package/templates/init/kubernetes/service.yaml +24 -0
- package/templates/init/monitoring/grafana-dashboard.json +539 -0
- package/templates/init/monitoring/prometheus-alerts.yml +51 -0
- package/templates/init/monitoring/prometheus-scrape.yml +17 -0
- package/templates/init/railway.json +13 -0
- package/templates/init/render.yaml +19 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// Alert channels (game-server-admin-console D24, DR §8 channel payloads): a generic webhook, Slack, Discord, Microsoft
|
|
2
|
+
// Teams and PagerDuty Events v2, each one fetch POST with a timeout. Channel secrets (url, routingKey) stay in the store
|
|
3
|
+
// and never leave the server: views show the url as scheme://host/… and the routing key as set / not set.
|
|
4
|
+
import { ALERT_CHANNEL_TIMEOUT_MS } from "./AdminConstants.js";
|
|
5
|
+
/** Slack and Discord emoji of a firing alert. */
|
|
6
|
+
const FIRING_EMOJI = ":rotating_light:";
|
|
7
|
+
/** Slack and Discord emoji of a resolved alert. */
|
|
8
|
+
const RESOLVED_EMOJI = ":white_check_mark:";
|
|
9
|
+
/** The PagerDuty event source of an alert without an instance. */
|
|
10
|
+
const DEFAULT_PAGERDUTY_SOURCE = "babylon-game-server";
|
|
11
|
+
/** The Microsoft Teams card type and context (connector MessageCard). */
|
|
12
|
+
const TEAMS_CARD_TYPE = "MessageCard";
|
|
13
|
+
const TEAMS_CARD_CONTEXT = "https://schema.org/extensions";
|
|
14
|
+
/** Delivers alerts to their channels. */
|
|
15
|
+
export class AlertChannels {
|
|
16
|
+
/** Request timeout of a delivery, in milliseconds. */
|
|
17
|
+
timeoutMs;
|
|
18
|
+
/**
|
|
19
|
+
* Creates the deliverer.
|
|
20
|
+
* @param timeoutMs Request timeout, in milliseconds. Default ALERT_CHANNEL_TIMEOUT_MS.
|
|
21
|
+
*/
|
|
22
|
+
constructor(timeoutMs = ALERT_CHANNEL_TIMEOUT_MS) {
|
|
23
|
+
this.timeoutMs = timeoutMs;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Posts an alert to a channel with its DR §8 payload. A network failure, a timeout or a non-2xx answer is an
|
|
27
|
+
* outcome, never a throw.
|
|
28
|
+
* @param channel The channel with its secrets.
|
|
29
|
+
* @param alert The alert.
|
|
30
|
+
* @param state Whether it fired or resolved.
|
|
31
|
+
* @param pagerDutyUrl The PagerDuty Events v2 URL (tests replace it, R10).
|
|
32
|
+
* @returns Whether it was delivered, and why not.
|
|
33
|
+
*/
|
|
34
|
+
async deliver(channel, alert, state, pagerDutyUrl) {
|
|
35
|
+
const targetUrl = (channel.kind === "pagerduty") ? pagerDutyUrl : channel.url;
|
|
36
|
+
if (targetUrl == null || targetUrl === "")
|
|
37
|
+
return { ok: false, error: "the channel has no URL" };
|
|
38
|
+
try {
|
|
39
|
+
const answer = await fetch(targetUrl, {
|
|
40
|
+
method: "POST",
|
|
41
|
+
headers: { "content-type": "application/json" },
|
|
42
|
+
body: JSON.stringify(alertPayloadOf(channel, alert, state)),
|
|
43
|
+
signal: AbortSignal.timeout(this.timeoutMs)
|
|
44
|
+
});
|
|
45
|
+
await answer.arrayBuffer();
|
|
46
|
+
return answer.ok ? { ok: true, error: null } : { ok: false, error: "the channel answered " + answer.status };
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
return { ok: false, error: (error instanceof Error) ? error.message : String(error) };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* The JSON body a channel receives (DR §8).
|
|
55
|
+
* @param channel The channel.
|
|
56
|
+
* @param alert The alert.
|
|
57
|
+
* @param state Whether it fired or resolved.
|
|
58
|
+
* @returns The payload.
|
|
59
|
+
*/
|
|
60
|
+
export function alertPayloadOf(channel, alert, state) {
|
|
61
|
+
const text = alertText(alert, state);
|
|
62
|
+
switch (channel.kind) {
|
|
63
|
+
case "slack":
|
|
64
|
+
return { text: text };
|
|
65
|
+
case "discord":
|
|
66
|
+
return { content: text };
|
|
67
|
+
case "teams":
|
|
68
|
+
return { "@type": TEAMS_CARD_TYPE, "@context": TEAMS_CARD_CONTEXT, summary: alert.summary, text: text };
|
|
69
|
+
case "pagerduty":
|
|
70
|
+
return {
|
|
71
|
+
routing_key: channel.routingKey,
|
|
72
|
+
event_action: (state === "firing") ? "trigger" : "resolve",
|
|
73
|
+
dedup_key: alert.alertId,
|
|
74
|
+
payload: { summary: alert.summary, source: alert.processId ?? DEFAULT_PAGERDUTY_SOURCE, severity: alert.severity }
|
|
75
|
+
};
|
|
76
|
+
default:
|
|
77
|
+
return { alertId: alert.alertId, ruleId: alert.ruleId, severity: alert.severity, state: state, summary: alert.summary, processId: alert.processId, firedAt: alert.firedAt, resolvedAt: alert.resolvedAt };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* A channel as the console sees it: the url without its path, the routing key as set / not set.
|
|
82
|
+
* @param channel The stored channel.
|
|
83
|
+
* @returns The view.
|
|
84
|
+
*/
|
|
85
|
+
export function alertChannelView(channel) {
|
|
86
|
+
return {
|
|
87
|
+
channelId: channel.channelId,
|
|
88
|
+
kind: channel.kind,
|
|
89
|
+
name: channel.name,
|
|
90
|
+
url: maskedUrl(channel.url),
|
|
91
|
+
routingKey: (channel.routingKey != null && channel.routingKey !== "") ? "set" : "not set"
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* The chat text of an alert: "<emoji> [<severity>] <summary>".
|
|
96
|
+
* @param alert The alert.
|
|
97
|
+
* @param state Whether it fired or resolved.
|
|
98
|
+
* @returns The text.
|
|
99
|
+
*/
|
|
100
|
+
function alertText(alert, state) {
|
|
101
|
+
const emoji = (state === "firing") ? FIRING_EMOJI : RESOLVED_EMOJI;
|
|
102
|
+
const resolvedSuffix = (state === "resolved") ? " (resolved)" : "";
|
|
103
|
+
return emoji + " [" + alert.severity + "] " + alert.summary + resolvedSuffix;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* A URL shown as scheme://host/… so its secret path never reaches the console.
|
|
107
|
+
* @param url The stored URL, or null.
|
|
108
|
+
* @returns The masked URL, or null.
|
|
109
|
+
*/
|
|
110
|
+
function maskedUrl(url) {
|
|
111
|
+
if (url == null)
|
|
112
|
+
return null;
|
|
113
|
+
try {
|
|
114
|
+
const parsed = new URL(url);
|
|
115
|
+
return parsed.protocol + "//" + parsed.host + "/…";
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return "…";
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import type { AdminAlertSeverity, AlertChannelView, AlertRuleId, AlertRuleView, AlertsRulesRequest, AlertView, CreateAlertChannelRequest, PageView } from "./AdminApiTypes.js";
|
|
2
|
+
import type { AdminCoreServices } from "./AdminServices.js";
|
|
3
|
+
import type { FleetDirectory } from "./FleetDirectory.js";
|
|
4
|
+
import { type MetricsSampler } from "./MetricsSampler.js";
|
|
5
|
+
import type { ServerEvents } from "./ServerEvents.js";
|
|
6
|
+
/** A built-in rule: its label, default threshold and unit, default duration and severity (DR §8). */
|
|
7
|
+
interface AlertRuleDefinition {
|
|
8
|
+
label: string;
|
|
9
|
+
threshold: number | null;
|
|
10
|
+
thresholdUnit: string | null;
|
|
11
|
+
forMinutes: number;
|
|
12
|
+
severity: AdminAlertSeverity;
|
|
13
|
+
}
|
|
14
|
+
/** The built-in rules (DR §8). Every rule starts enabled. */
|
|
15
|
+
export declare const ALERT_RULE_DEFINITIONS: Record<AlertRuleId, AlertRuleDefinition>;
|
|
16
|
+
/** Called when an alert fires (the onAlertFired admin hook, R29). */
|
|
17
|
+
export type AlertFiredListener = (alert: AlertView) => void;
|
|
18
|
+
/** The rules, channels and alert history of the fleet. */
|
|
19
|
+
export declare class AlertEngine {
|
|
20
|
+
/** The shared core services. */
|
|
21
|
+
private readonly services;
|
|
22
|
+
/** The fleet directory (heartbeats). */
|
|
23
|
+
private readonly fleet;
|
|
24
|
+
/** The activity feed's server events. */
|
|
25
|
+
private readonly serverEvents;
|
|
26
|
+
/** This instance's metrics history (dedicated overruns without Redis). */
|
|
27
|
+
private readonly metricsSampler;
|
|
28
|
+
/** The channel deliverer. */
|
|
29
|
+
private readonly channels;
|
|
30
|
+
/** When each rule started breaching on this leader, in milliseconds. */
|
|
31
|
+
private readonly breachingSince;
|
|
32
|
+
/** Listeners of fired alerts. */
|
|
33
|
+
private readonly firedListeners;
|
|
34
|
+
/** The newest audit sequence already read, or null before the first evaluation. */
|
|
35
|
+
private lastAuditSequence;
|
|
36
|
+
/** True once the default rules were written to the store. */
|
|
37
|
+
private hasSeededRules;
|
|
38
|
+
/**
|
|
39
|
+
* Creates the engine; nothing runs until the leader calls evaluate().
|
|
40
|
+
* @param services The shared core services.
|
|
41
|
+
* @param fleet The fleet directory.
|
|
42
|
+
* @param serverEvents The activity feed's server events.
|
|
43
|
+
* @param metricsSampler This instance's metrics history.
|
|
44
|
+
*/
|
|
45
|
+
constructor(services: AdminCoreServices, fleet: FleetDirectory, serverEvents: ServerEvents, metricsSampler: MetricsSampler);
|
|
46
|
+
/**
|
|
47
|
+
* Calls back whenever an alert fires.
|
|
48
|
+
* @param listener The listener.
|
|
49
|
+
*/
|
|
50
|
+
onAlertFired(listener: AlertFiredListener): void;
|
|
51
|
+
/** One leader evaluation (DR §7.9): every enabled, unsilenced rule is checked, fired or resolved. */
|
|
52
|
+
evaluate(): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Every rule with its settings (stored settings over the defaults).
|
|
55
|
+
* @returns The rules, in the table's order.
|
|
56
|
+
*/
|
|
57
|
+
listRules(): Promise<AlertRuleView[]>;
|
|
58
|
+
/**
|
|
59
|
+
* Changes a rule's settings (PUT alerts/rules/:ruleId).
|
|
60
|
+
* @param ruleId The rule.
|
|
61
|
+
* @param request The new settings.
|
|
62
|
+
* @returns The rule.
|
|
63
|
+
* @throws AdminRequestError 404 for an unknown rule, 400 for an unknown channel or severity.
|
|
64
|
+
*/
|
|
65
|
+
updateRule(ruleId: string, request: AlertsRulesRequest): Promise<AlertRuleView>;
|
|
66
|
+
/**
|
|
67
|
+
* Silences a rule for some minutes (0 ends a silence).
|
|
68
|
+
* @param ruleId The rule.
|
|
69
|
+
* @param minutes How long.
|
|
70
|
+
* @returns The rule.
|
|
71
|
+
* @throws AdminRequestError 404 for an unknown rule, 400 for a negative duration.
|
|
72
|
+
*/
|
|
73
|
+
silenceRule(ruleId: string, minutes: number): Promise<AlertRuleView>;
|
|
74
|
+
/**
|
|
75
|
+
* Every channel, secrets masked.
|
|
76
|
+
* @returns The channels, oldest first.
|
|
77
|
+
*/
|
|
78
|
+
listChannels(): Promise<AlertChannelView[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Adds a channel (POST alerts/channels).
|
|
81
|
+
* @param request The channel.
|
|
82
|
+
* @param createdBy Who adds it.
|
|
83
|
+
* @returns The channel, secrets masked.
|
|
84
|
+
* @throws AdminRequestError 400 for an unknown kind, a missing name, URL or routing key.
|
|
85
|
+
*/
|
|
86
|
+
createChannel(request: CreateAlertChannelRequest, createdBy: string): Promise<AlertChannelView>;
|
|
87
|
+
/**
|
|
88
|
+
* Removes a channel and takes it off every rule.
|
|
89
|
+
* @param channelId The channel.
|
|
90
|
+
* @throws AdminRequestError 404 for an unknown channel.
|
|
91
|
+
*/
|
|
92
|
+
deleteChannel(channelId: string): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Sends a test alert to a channel (POST alerts/channels/:channelId/test).
|
|
95
|
+
* @param channelId The channel.
|
|
96
|
+
* @returns Whether it was delivered.
|
|
97
|
+
* @throws AdminRequestError 404 for an unknown channel.
|
|
98
|
+
*/
|
|
99
|
+
testChannel(channelId: string): Promise<{
|
|
100
|
+
delivered: boolean;
|
|
101
|
+
error: string | null;
|
|
102
|
+
}>;
|
|
103
|
+
/**
|
|
104
|
+
* One page of the alert history, newest first.
|
|
105
|
+
* @param state Only "firing" or "resolved" alerts, or null for both.
|
|
106
|
+
* @param page The page, from 1.
|
|
107
|
+
* @returns The page and the number of matches.
|
|
108
|
+
*/
|
|
109
|
+
listAlerts(state: AlertView["state"] | null, page: number): Promise<PageView<AlertView>>;
|
|
110
|
+
/**
|
|
111
|
+
* Acknowledges an alert: records who saw it and when.
|
|
112
|
+
* @param alertId The alert.
|
|
113
|
+
* @param acknowledgedBy The admin's name.
|
|
114
|
+
* @returns The alert.
|
|
115
|
+
* @throws AdminRequestError 404 for an unknown alert.
|
|
116
|
+
*/
|
|
117
|
+
acknowledge(alertId: string, acknowledgedBy: string): Promise<AlertView>;
|
|
118
|
+
/** Writes the default rules the store does not have yet, once record keeping is on (R3). */
|
|
119
|
+
private seedRulesOnce;
|
|
120
|
+
/**
|
|
121
|
+
* Reads what every rule needs once: the instances, the new audit records and the dedicated overrun rate.
|
|
122
|
+
* @returns The context.
|
|
123
|
+
*/
|
|
124
|
+
private buildContext;
|
|
125
|
+
/**
|
|
126
|
+
* Checks one rule and fires or resolves its alert (DR §7.9).
|
|
127
|
+
* @param rule The rule's settings.
|
|
128
|
+
* @param context The evaluation context.
|
|
129
|
+
* @param firing The rule's firing alert, or null.
|
|
130
|
+
*/
|
|
131
|
+
private evaluateRule;
|
|
132
|
+
/**
|
|
133
|
+
* Whether a rule breaches now (DR §8 conditions).
|
|
134
|
+
* @param rule The rule's settings.
|
|
135
|
+
* @param context The evaluation context.
|
|
136
|
+
* @returns The breach, or null.
|
|
137
|
+
*/
|
|
138
|
+
private breachOf;
|
|
139
|
+
/**
|
|
140
|
+
* nearLimits: an instance hosts at least threshold percent of limits.maxSessions.
|
|
141
|
+
* @param upInstances The live instances.
|
|
142
|
+
* @param thresholdPercent The threshold, in percent.
|
|
143
|
+
* @returns The breach, or null.
|
|
144
|
+
*/
|
|
145
|
+
private nearLimitsBreach;
|
|
146
|
+
/**
|
|
147
|
+
* newAdminAddress: a new second-factor sign-in from an address the account did not use in the lookback period. An
|
|
148
|
+
* account's first sign-in never counts.
|
|
149
|
+
* @param context The evaluation context.
|
|
150
|
+
* @returns The breach, or null.
|
|
151
|
+
*/
|
|
152
|
+
private newAdminAddressBreach;
|
|
153
|
+
/**
|
|
154
|
+
* Audit records appended since the last evaluation. The first evaluation only notes where the stream ends.
|
|
155
|
+
* @returns The new records, oldest first.
|
|
156
|
+
*/
|
|
157
|
+
private readNewAuditRecords;
|
|
158
|
+
/**
|
|
159
|
+
* The fleet's dedicated tick overruns per minute between each live instance's last two metrics samples.
|
|
160
|
+
* @param upInstances The live instances.
|
|
161
|
+
* @returns The rate.
|
|
162
|
+
*/
|
|
163
|
+
private dedicatedOverrunsPerMinute;
|
|
164
|
+
/**
|
|
165
|
+
* An instance's last two metrics samples: from this instance's ring, or from the store stream with Redis.
|
|
166
|
+
* @param instance The instance.
|
|
167
|
+
* @returns At most two samples, oldest first.
|
|
168
|
+
*/
|
|
169
|
+
private lastTwoSamples;
|
|
170
|
+
/**
|
|
171
|
+
* Fires an alert: stores it, delivers it to the rule's channels, records a server event and calls the listeners.
|
|
172
|
+
* Event rules store it resolved at once (one alert per event).
|
|
173
|
+
* @param rule The rule.
|
|
174
|
+
* @param breach What breaches.
|
|
175
|
+
* @param now The evaluation time.
|
|
176
|
+
*/
|
|
177
|
+
private fire;
|
|
178
|
+
/**
|
|
179
|
+
* Resolves a firing alert and delivers the resolve.
|
|
180
|
+
* @param rule The rule.
|
|
181
|
+
* @param firing The firing alert.
|
|
182
|
+
*/
|
|
183
|
+
private resolve;
|
|
184
|
+
/**
|
|
185
|
+
* Delivers an alert to every channel of its rule (missing channels are skipped).
|
|
186
|
+
* @param rule The rule.
|
|
187
|
+
* @param alert The alert.
|
|
188
|
+
* @param state Fired or resolved.
|
|
189
|
+
* @returns One delivery entry per channel.
|
|
190
|
+
*/
|
|
191
|
+
private deliverToRule;
|
|
192
|
+
/**
|
|
193
|
+
* Every alert in its newest state, newest fired first.
|
|
194
|
+
* @returns The alerts.
|
|
195
|
+
*/
|
|
196
|
+
private currentAlerts;
|
|
197
|
+
/**
|
|
198
|
+
* The firing alert of each rule.
|
|
199
|
+
* @returns Rule id → firing alert.
|
|
200
|
+
*/
|
|
201
|
+
private firingAlertsByRule;
|
|
202
|
+
/**
|
|
203
|
+
* Every rule's settings, stored or default.
|
|
204
|
+
* @returns The records, in the table's order.
|
|
205
|
+
*/
|
|
206
|
+
private ruleRecords;
|
|
207
|
+
/**
|
|
208
|
+
* The stored rule documents.
|
|
209
|
+
* @returns Rule id → document.
|
|
210
|
+
*/
|
|
211
|
+
private storedRules;
|
|
212
|
+
/**
|
|
213
|
+
* The stored channels.
|
|
214
|
+
* @returns The channels.
|
|
215
|
+
*/
|
|
216
|
+
private channelRecords;
|
|
217
|
+
/**
|
|
218
|
+
* A known rule's stored document.
|
|
219
|
+
* @param ruleId The rule.
|
|
220
|
+
* @returns The document, or null while the rule has its defaults.
|
|
221
|
+
* @throws AdminRequestError 404 for an unknown rule.
|
|
222
|
+
*/
|
|
223
|
+
private requireRule;
|
|
224
|
+
/**
|
|
225
|
+
* Checks that every channel id exists.
|
|
226
|
+
* @param channelIds The channel ids.
|
|
227
|
+
* @throws AdminRequestError 400 naming the first unknown channel.
|
|
228
|
+
*/
|
|
229
|
+
private requireChannels;
|
|
230
|
+
}
|
|
231
|
+
export {};
|