@ninenity/neutrun 1.0.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/README.md +5 -0
- package/dist/CLI/Bootstrap.d.ts +2 -0
- package/dist/CLI/Bootstrap.d.ts.map +1 -0
- package/dist/CLI/Bootstrap.js +71 -0
- package/dist/CLI/Bootstrap.js.map +1 -0
- package/dist/CLI/Localize.d.ts +2 -0
- package/dist/CLI/Localize.d.ts.map +1 -0
- package/dist/CLI/Localize.js +248 -0
- package/dist/CLI/Localize.js.map +1 -0
- package/dist/CLI/Translate.d.ts +2 -0
- package/dist/CLI/Translate.d.ts.map +1 -0
- package/dist/CLI/Translate.js +82 -0
- package/dist/CLI/Translate.js.map +1 -0
- package/dist/CLI/bin.d.ts +3 -0
- package/dist/CLI/bin.d.ts.map +1 -0
- package/dist/CLI/bin.js +36 -0
- package/dist/CLI/bin.js.map +1 -0
- package/dist/Emojis/EmojiLoader.d.ts +4 -0
- package/dist/Emojis/EmojiLoader.d.ts.map +1 -0
- package/dist/Emojis/EmojiLoader.js +262 -0
- package/dist/Emojis/EmojiLoader.js.map +1 -0
- package/dist/Emojis/Pool.d.ts +3 -0
- package/dist/Emojis/Pool.d.ts.map +1 -0
- package/dist/Emojis/Pool.js +33 -0
- package/dist/Emojis/Pool.js.map +1 -0
- package/dist/Emojis/index.d.ts +3 -0
- package/dist/Emojis/index.d.ts.map +1 -0
- package/dist/Emojis/index.js +9 -0
- package/dist/Emojis/index.js.map +1 -0
- package/dist/Emojis/types.d.ts +15 -0
- package/dist/Emojis/types.d.ts.map +1 -0
- package/dist/Emojis/types.js +3 -0
- package/dist/Emojis/types.js.map +1 -0
- package/dist/I18n/index.d.ts +34 -0
- package/dist/I18n/index.d.ts.map +1 -0
- package/dist/I18n/index.js +77 -0
- package/dist/I18n/index.js.map +1 -0
- package/dist/Logger/Color.d.ts +15 -0
- package/dist/Logger/Color.d.ts.map +1 -0
- package/dist/Logger/Color.js +54 -0
- package/dist/Logger/Color.js.map +1 -0
- package/dist/Logger/index.d.ts +38 -0
- package/dist/Logger/index.d.ts.map +1 -0
- package/dist/Logger/index.js +577 -0
- package/dist/Logger/index.js.map +1 -0
- package/dist/Modules/Bots/index.d.ts +4 -0
- package/dist/Modules/Bots/index.d.ts.map +1 -0
- package/dist/Modules/Bots/index.js +45 -0
- package/dist/Modules/Bots/index.js.map +1 -0
- package/dist/Modules/Component/index.d.ts +14 -0
- package/dist/Modules/Component/index.d.ts.map +1 -0
- package/dist/Modules/Component/index.js +32 -0
- package/dist/Modules/Component/index.js.map +1 -0
- package/dist/Modules/Config/index.d.ts +5 -0
- package/dist/Modules/Config/index.d.ts.map +1 -0
- package/dist/Modules/Config/index.js +13 -0
- package/dist/Modules/Config/index.js.map +1 -0
- package/dist/Modules/Database/index.d.ts +15 -0
- package/dist/Modules/Database/index.d.ts.map +1 -0
- package/dist/Modules/Database/index.js +22 -0
- package/dist/Modules/Database/index.js.map +1 -0
- package/dist/Modules/Diagnostics/ModuleDiagnostics.d.ts +18 -0
- package/dist/Modules/Diagnostics/ModuleDiagnostics.d.ts.map +1 -0
- package/dist/Modules/Diagnostics/ModuleDiagnostics.js +101 -0
- package/dist/Modules/Diagnostics/ModuleDiagnostics.js.map +1 -0
- package/dist/Modules/Diagnostics/index.d.ts +3 -0
- package/dist/Modules/Diagnostics/index.d.ts.map +1 -0
- package/dist/Modules/Diagnostics/index.js +7 -0
- package/dist/Modules/Diagnostics/index.js.map +1 -0
- package/dist/Modules/Logs/index.d.ts +4 -0
- package/dist/Modules/Logs/index.d.ts.map +1 -0
- package/dist/Modules/Logs/index.js +11 -0
- package/dist/Modules/Logs/index.js.map +1 -0
- package/dist/Modules/Storage/index.d.ts +3 -0
- package/dist/Modules/Storage/index.d.ts.map +1 -0
- package/dist/Modules/Storage/index.js +11 -0
- package/dist/Modules/Storage/index.js.map +1 -0
- package/dist/Modules/index.d.ts +8 -0
- package/dist/Modules/index.d.ts.map +1 -0
- package/dist/Modules/index.js +45 -0
- package/dist/Modules/index.js.map +1 -0
- package/dist/Shared/Autocomplete.d.ts +31 -0
- package/dist/Shared/Autocomplete.d.ts.map +1 -0
- package/dist/Shared/Autocomplete.js +37 -0
- package/dist/Shared/Autocomplete.js.map +1 -0
- package/dist/Shared/ChannelLoader.d.ts +4 -0
- package/dist/Shared/ChannelLoader.d.ts.map +1 -0
- package/dist/Shared/ChannelLoader.js +133 -0
- package/dist/Shared/ChannelLoader.js.map +1 -0
- package/dist/Shared/Client.d.ts +30 -0
- package/dist/Shared/Client.d.ts.map +1 -0
- package/dist/Shared/Client.js +517 -0
- package/dist/Shared/Client.js.map +1 -0
- package/dist/Shared/ComponentAutoDeploy.d.ts +3 -0
- package/dist/Shared/ComponentAutoDeploy.d.ts.map +1 -0
- package/dist/Shared/ComponentAutoDeploy.js +230 -0
- package/dist/Shared/ComponentAutoDeploy.js.map +1 -0
- package/dist/Shared/ComponentRuntime.d.ts +43 -0
- package/dist/Shared/ComponentRuntime.d.ts.map +1 -0
- package/dist/Shared/ComponentRuntime.js +393 -0
- package/dist/Shared/ComponentRuntime.js.map +1 -0
- package/dist/Shared/Config.d.ts +6 -0
- package/dist/Shared/Config.d.ts.map +1 -0
- package/dist/Shared/Config.js +15 -0
- package/dist/Shared/Config.js.map +1 -0
- package/dist/Shared/ConfigLoader.d.ts +2 -0
- package/dist/Shared/ConfigLoader.d.ts.map +1 -0
- package/dist/Shared/ConfigLoader.js +74 -0
- package/dist/Shared/ConfigLoader.js.map +1 -0
- package/dist/Shared/ConfigProxy.d.ts +2 -0
- package/dist/Shared/ConfigProxy.d.ts.map +1 -0
- package/dist/Shared/ConfigProxy.js +46 -0
- package/dist/Shared/ConfigProxy.js.map +1 -0
- package/dist/Shared/ConsoleLog.d.ts +7 -0
- package/dist/Shared/ConsoleLog.d.ts.map +1 -0
- package/dist/Shared/ConsoleLog.js +23 -0
- package/dist/Shared/ConsoleLog.js.map +1 -0
- package/dist/Shared/CooldownManager.d.ts +16 -0
- package/dist/Shared/CooldownManager.d.ts.map +1 -0
- package/dist/Shared/CooldownManager.js +167 -0
- package/dist/Shared/CooldownManager.js.map +1 -0
- package/dist/Shared/Definer.d.ts +10 -0
- package/dist/Shared/Definer.d.ts.map +1 -0
- package/dist/Shared/Definer.js +711 -0
- package/dist/Shared/Definer.js.map +1 -0
- package/dist/Shared/EventBus.d.ts +48 -0
- package/dist/Shared/EventBus.d.ts.map +1 -0
- package/dist/Shared/EventBus.js +181 -0
- package/dist/Shared/EventBus.js.map +1 -0
- package/dist/Shared/InteractionContext.d.ts +12 -0
- package/dist/Shared/InteractionContext.d.ts.map +1 -0
- package/dist/Shared/InteractionContext.js +34 -0
- package/dist/Shared/InteractionContext.js.map +1 -0
- package/dist/Shared/InteractionManager.d.ts +27 -0
- package/dist/Shared/InteractionManager.d.ts.map +1 -0
- package/dist/Shared/InteractionManager.js +256 -0
- package/dist/Shared/InteractionManager.js.map +1 -0
- package/dist/Shared/LocalBotRegistry.d.ts +14 -0
- package/dist/Shared/LocalBotRegistry.d.ts.map +1 -0
- package/dist/Shared/LocalBotRegistry.js +140 -0
- package/dist/Shared/LocalBotRegistry.js.map +1 -0
- package/dist/Shared/LogTransport.d.ts +49 -0
- package/dist/Shared/LogTransport.d.ts.map +1 -0
- package/dist/Shared/LogTransport.js +357 -0
- package/dist/Shared/LogTransport.js.map +1 -0
- package/dist/Shared/Neutrun.d.ts +55 -0
- package/dist/Shared/Neutrun.d.ts.map +1 -0
- package/dist/Shared/Neutrun.js +269 -0
- package/dist/Shared/Neutrun.js.map +1 -0
- package/dist/Shared/Plugin.d.ts +8 -0
- package/dist/Shared/Plugin.d.ts.map +1 -0
- package/dist/Shared/Plugin.js +3 -0
- package/dist/Shared/Plugin.js.map +1 -0
- package/dist/Shared/Pool.d.ts +3 -0
- package/dist/Shared/Pool.d.ts.map +1 -0
- package/dist/Shared/Pool.js +29 -0
- package/dist/Shared/Pool.js.map +1 -0
- package/dist/Shared/ProcessManager.d.ts +11 -0
- package/dist/Shared/ProcessManager.d.ts.map +1 -0
- package/dist/Shared/ProcessManager.js +56 -0
- package/dist/Shared/ProcessManager.js.map +1 -0
- package/dist/Shared/QueueManager.d.ts +9 -0
- package/dist/Shared/QueueManager.d.ts.map +1 -0
- package/dist/Shared/QueueManager.js +65 -0
- package/dist/Shared/QueueManager.js.map +1 -0
- package/dist/Shared/RoleLoader.d.ts +4 -0
- package/dist/Shared/RoleLoader.d.ts.map +1 -0
- package/dist/Shared/RoleLoader.js +138 -0
- package/dist/Shared/RoleLoader.js.map +1 -0
- package/dist/Shared/Supervisor.d.ts +67 -0
- package/dist/Shared/Supervisor.d.ts.map +1 -0
- package/dist/Shared/Supervisor.js +308 -0
- package/dist/Shared/Supervisor.js.map +1 -0
- package/dist/Shared/TelemetryService.d.ts +63 -0
- package/dist/Shared/TelemetryService.d.ts.map +1 -0
- package/dist/Shared/TelemetryService.js +631 -0
- package/dist/Shared/TelemetryService.js.map +1 -0
- package/dist/Shared/Utils.d.ts +94 -0
- package/dist/Shared/Utils.d.ts.map +1 -0
- package/dist/Shared/Utils.js +390 -0
- package/dist/Shared/Utils.js.map +1 -0
- package/dist/Shared/WebSocket.d.ts +15 -0
- package/dist/Shared/WebSocket.d.ts.map +1 -0
- package/dist/Shared/WebSocket.js +599 -0
- package/dist/Shared/WebSocket.js.map +1 -0
- package/dist/Types/Client.Type.d.ts +130 -0
- package/dist/Types/Client.Type.d.ts.map +1 -0
- package/dist/Types/Client.Type.js +182 -0
- package/dist/Types/Client.Type.js.map +1 -0
- package/dist/Types/Command.Type.d.ts +28 -0
- package/dist/Types/Command.Type.d.ts.map +1 -0
- package/dist/Types/Command.Type.js +4 -0
- package/dist/Types/Command.Type.js.map +1 -0
- package/dist/Types/Definer.Type.d.ts +37 -0
- package/dist/Types/Definer.Type.d.ts.map +1 -0
- package/dist/Types/Definer.Type.js +4 -0
- package/dist/Types/Definer.Type.js.map +1 -0
- package/dist/Types/InputInteraction.Type.d.ts +90 -0
- package/dist/Types/InputInteraction.Type.d.ts.map +1 -0
- package/dist/Types/InputInteraction.Type.js +339 -0
- package/dist/Types/InputInteraction.Type.js.map +1 -0
- package/dist/Types/Interaction.Type.d.ts +47 -0
- package/dist/Types/Interaction.Type.d.ts.map +1 -0
- package/dist/Types/Interaction.Type.js +4 -0
- package/dist/Types/Interaction.Type.js.map +1 -0
- package/dist/Types/Log.Type.d.ts +28 -0
- package/dist/Types/Log.Type.d.ts.map +1 -0
- package/dist/Types/Log.Type.js +3 -0
- package/dist/Types/Log.Type.js.map +1 -0
- package/dist/Types/Permission.Type.d.ts +17 -0
- package/dist/Types/Permission.Type.d.ts.map +1 -0
- package/dist/Types/Permission.Type.js +13 -0
- package/dist/Types/Permission.Type.js.map +1 -0
- package/dist/Types/PrefixCommandBuilder.Type.d.ts +81 -0
- package/dist/Types/PrefixCommandBuilder.Type.d.ts.map +1 -0
- package/dist/Types/PrefixCommandBuilder.Type.js +203 -0
- package/dist/Types/PrefixCommandBuilder.Type.js.map +1 -0
- package/dist/Types/TaskDefiner.Type.d.ts +14 -0
- package/dist/Types/TaskDefiner.Type.d.ts.map +1 -0
- package/dist/Types/TaskDefiner.Type.js +4 -0
- package/dist/Types/TaskDefiner.Type.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +122 -0
- package/dist/index.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
// ────────────────────────────────────────────────────────────────────────────────
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const ConsoleLog_1 = require("./ConsoleLog");
|
|
10
|
+
const Color_1 = __importDefault(require("../Logger/Color"));
|
|
11
|
+
const Neutrun_1 = __importDefault(require("./Neutrun"));
|
|
12
|
+
const InteractionContext_1 = require("./InteractionContext");
|
|
13
|
+
// ────────────────────────────────────────────────────────────────────────────────
|
|
14
|
+
const NeedsQuoting = (name) => /^[0-9]|[^a-zA-Z0-9_]/.test(name);
|
|
15
|
+
const FormatKey = (name) => {
|
|
16
|
+
return name.toLowerCase().replace(/[\s-]+/g, '_');
|
|
17
|
+
};
|
|
18
|
+
const QuoteName = (name) => {
|
|
19
|
+
if (NeedsQuoting(name))
|
|
20
|
+
return `'${name}'`;
|
|
21
|
+
return name;
|
|
22
|
+
};
|
|
23
|
+
const GenerateRolesFile = (rolesData) => {
|
|
24
|
+
const FilePath = Neutrun_1.default.getGeneratedPath('Roles.ts');
|
|
25
|
+
const OutputDir = path_1.default.dirname(FilePath);
|
|
26
|
+
if (!fs_1.default.existsSync(OutputDir)) {
|
|
27
|
+
fs_1.default.mkdirSync(OutputDir, { recursive: true });
|
|
28
|
+
}
|
|
29
|
+
const Names = Object.keys(rolesData).sort();
|
|
30
|
+
const Lines = [];
|
|
31
|
+
Lines.push("import type { RoleData } from '@ninenity/neutrun'");
|
|
32
|
+
Lines.push("import { Bot } from '@ninenity/neutrun'");
|
|
33
|
+
Lines.push('');
|
|
34
|
+
Lines.push('export interface AppRoles {');
|
|
35
|
+
for (const Name of Names) {
|
|
36
|
+
const SafeName = FormatKey(Name);
|
|
37
|
+
Lines.push(` readonly ${QuoteName(SafeName)}: RoleData`);
|
|
38
|
+
}
|
|
39
|
+
Lines.push('}');
|
|
40
|
+
Lines.push('');
|
|
41
|
+
Lines.push('const FallbackRoles: AppRoles = {');
|
|
42
|
+
for (const Name of Names) {
|
|
43
|
+
const SafeName = FormatKey(Name);
|
|
44
|
+
const Role = rolesData[Name];
|
|
45
|
+
Lines.push(` ${QuoteName(SafeName)}: {`);
|
|
46
|
+
Lines.push(` Id: '${Role.Id}',`);
|
|
47
|
+
Lines.push(` Name: '${Role.Name.replace(/'/g, "\\'")}',`);
|
|
48
|
+
Lines.push(` Color: ${Role.Color},`);
|
|
49
|
+
Lines.push(` Position: ${Role.Position},`);
|
|
50
|
+
Lines.push(` Mention: '${Role.Mention}',`);
|
|
51
|
+
Lines.push(` toString: () => '${Role.Mention}'`);
|
|
52
|
+
Lines.push(' },');
|
|
53
|
+
}
|
|
54
|
+
Lines.push('}');
|
|
55
|
+
Lines.push('');
|
|
56
|
+
Lines.push('const Roles = new Proxy(FallbackRoles, {');
|
|
57
|
+
Lines.push(' get(target, prop, receiver) {');
|
|
58
|
+
Lines.push(" if (typeof prop === 'symbol') return Reflect.get(target, prop, receiver)");
|
|
59
|
+
Lines.push(' const scoped = Bot.Instance?.getAppRoles?.() as AppRoles | undefined');
|
|
60
|
+
Lines.push(' if (scoped && scoped !== target) return Reflect.get(scoped, prop, scoped)');
|
|
61
|
+
Lines.push(' return Reflect.get(target, prop, receiver)');
|
|
62
|
+
Lines.push(' }');
|
|
63
|
+
Lines.push('}) as AppRoles');
|
|
64
|
+
Lines.push('');
|
|
65
|
+
Lines.push('export default Roles');
|
|
66
|
+
Lines.push('export type RoleName = keyof AppRoles');
|
|
67
|
+
fs_1.default.writeFileSync(FilePath, Lines.join('\n'), 'utf-8');
|
|
68
|
+
};
|
|
69
|
+
// ────────────────────────────────────────────────────────────────────────────────
|
|
70
|
+
const CreateEmptyRole = (key) => ({
|
|
71
|
+
Id: '',
|
|
72
|
+
Name: key,
|
|
73
|
+
Color: 0,
|
|
74
|
+
Position: 0,
|
|
75
|
+
Mention: '',
|
|
76
|
+
toString: () => ''
|
|
77
|
+
});
|
|
78
|
+
const CreateRolesProxy = (fallback, byGuild) => new Proxy(fallback, {
|
|
79
|
+
get(target, prop) {
|
|
80
|
+
if (typeof prop === 'symbol')
|
|
81
|
+
return target[prop];
|
|
82
|
+
const guildId = (0, InteractionContext_1.GetGuildId)();
|
|
83
|
+
const scoped = guildId ? byGuild[guildId] : undefined;
|
|
84
|
+
// A known interaction must never fall back to another guild's alias.
|
|
85
|
+
const source = guildId ? scoped || {} : target;
|
|
86
|
+
const key = FormatKey(String(prop));
|
|
87
|
+
if (key in source)
|
|
88
|
+
return source[key];
|
|
89
|
+
if (String(prop) in source)
|
|
90
|
+
return source[String(prop)];
|
|
91
|
+
return CreateEmptyRole(key);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
const LoadRoles = async (client) => {
|
|
95
|
+
const RolesData = {};
|
|
96
|
+
const RolesByGuild = {};
|
|
97
|
+
for (const [GuildId, Guild] of client.guilds.cache) {
|
|
98
|
+
const GuildRolesData = {};
|
|
99
|
+
try {
|
|
100
|
+
await Guild.roles.fetch();
|
|
101
|
+
for (const [_, Role] of Guild.roles.cache) {
|
|
102
|
+
if (Role.name === '@everyone')
|
|
103
|
+
continue;
|
|
104
|
+
const Key = FormatKey(Role.name);
|
|
105
|
+
const roleData = {
|
|
106
|
+
Id: Role.id,
|
|
107
|
+
Name: Role.name,
|
|
108
|
+
Color: Role.color,
|
|
109
|
+
Position: Role.position,
|
|
110
|
+
Mention: `<@&${Role.id}>`,
|
|
111
|
+
toString: () => `<@&${Role.id}>`
|
|
112
|
+
};
|
|
113
|
+
GuildRolesData[Key] = roleData;
|
|
114
|
+
// Preserve the generated flat file and access path. It is
|
|
115
|
+
// only used when there is no active guild context.
|
|
116
|
+
RolesData[Key] = roleData;
|
|
117
|
+
}
|
|
118
|
+
RolesByGuild[String(GuildId)] = GuildRolesData;
|
|
119
|
+
const Total = Object.keys(GuildRolesData).length;
|
|
120
|
+
if (Total > 0) {
|
|
121
|
+
(0, ConsoleLog_1.logSuccess)(`${(0, Color_1.default)(String(Total), 'cyan', 'bold')} cargos indexados`, 'Loader');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (error) {
|
|
125
|
+
(0, ConsoleLog_1.logError)(`Erro ao indexar cargos em ${Guild.name}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
GenerateRolesFile(RolesData);
|
|
129
|
+
client.appRolesByGuild = Object.fromEntries(Object.entries(RolesByGuild).map(([guildId, roles]) => [
|
|
130
|
+
guildId,
|
|
131
|
+
CreateRolesProxy(roles, { [guildId]: roles })
|
|
132
|
+
]));
|
|
133
|
+
client.appRoles = CreateRolesProxy(RolesData, RolesByGuild);
|
|
134
|
+
};
|
|
135
|
+
// ────────────────────────────────────────────────────────────────────────────────
|
|
136
|
+
exports.default = LoadRoles;
|
|
137
|
+
// ────────────────────────────────────────────────────────────────────────────────
|
|
138
|
+
//# sourceMappingURL=RoleLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RoleLoader.js","sourceRoot":"","sources":["../../src/Shared/RoleLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supervisor de processo: o objetivo é que o bot NUNCA morra.
|
|
3
|
+
*
|
|
4
|
+
* Quando ativo, `Neutrun.init` transforma o processo atual em um supervisor
|
|
5
|
+
* fino e executa o bot em um processo filho idêntico. Se o filho morrer —
|
|
6
|
+
* crash, OOM, exit não intencional — o supervisor o reinicia com backoff
|
|
7
|
+
* exponencial e trava de crash-loop. O filho, por sua vez, reporta heartbeats
|
|
8
|
+
* (um event loop travado é detectado e morto) e roda watchdogs de gateway e
|
|
9
|
+
* de memória que escalonam para um restart limpo antes da morte real.
|
|
10
|
+
*/
|
|
11
|
+
export declare const SUPERVISED_ENV = "NEUTRUN_SUPERVISED";
|
|
12
|
+
export declare const NO_SUPERVISOR_ENV = "NEUTRUN_NO_SUPERVISOR";
|
|
13
|
+
/** Código de saída que significa "quero reiniciar limpo". */
|
|
14
|
+
export declare const RESTART_EXIT_CODE = 75;
|
|
15
|
+
export interface SupervisorOptions {
|
|
16
|
+
/** Liga/desliga explicitamente (default: só em produção). */
|
|
17
|
+
enabled?: boolean;
|
|
18
|
+
/** Teto de reinícios por hora antes de desistir (trava de crash-loop). */
|
|
19
|
+
maxRestartsPerHour?: number;
|
|
20
|
+
/** Base do backoff exponencial entre reinícios. */
|
|
21
|
+
backoffBaseMs?: number;
|
|
22
|
+
/** Teto do backoff entre reinícios. */
|
|
23
|
+
backoffMaxMs?: number;
|
|
24
|
+
/** Tempo de estabilidade que zera o backoff. */
|
|
25
|
+
stableResetMs?: number;
|
|
26
|
+
/** Intervalo do heartbeat do filho (0 desliga o detector de hang). */
|
|
27
|
+
heartbeatMs?: number;
|
|
28
|
+
/** Sem heartbeat por este tempo = processo travado → kill + restart. */
|
|
29
|
+
heartbeatTimeoutMs?: number;
|
|
30
|
+
/** Reinicia o processo quando o RSS exceder este limite (0 desliga). */
|
|
31
|
+
memoryLimitMB?: number;
|
|
32
|
+
/** Gateway continuamente desconectado por este tempo → restart limpo. */
|
|
33
|
+
gatewayDeadThresholdMs?: number;
|
|
34
|
+
}
|
|
35
|
+
/** Erro que interrompe o fluxo do entry no processo pai. */
|
|
36
|
+
export declare class SupervisedParentHandoff extends Error {
|
|
37
|
+
readonly neutrunSupervisorHandoff = true;
|
|
38
|
+
constructor();
|
|
39
|
+
}
|
|
40
|
+
export declare const isHandoffError: (error: unknown) => boolean;
|
|
41
|
+
export declare const resolveSupervisorEnabled: (options: SupervisorOptions | boolean | undefined, env?: NodeJS.ProcessEnv) => boolean;
|
|
42
|
+
export declare const computeBackoffDelay: (restartCount: number, options?: SupervisorOptions) => number;
|
|
43
|
+
export declare const isRestartCapped: (restartTimestamps: number[], maxRestartsPerHour?: number, now?: number) => boolean;
|
|
44
|
+
export declare const shouldRespawn: (intentionalStop: boolean, exitCode: number | null, restartTimestamps: number[], maxRestartsPerHour?: number) => boolean;
|
|
45
|
+
/** Avisa o supervisor que o shutdown é intencional (não reiniciar). */
|
|
46
|
+
export declare const notifyIntentionalStop: () => void;
|
|
47
|
+
/**
|
|
48
|
+
* Executado no início do `Neutrun.init`. Retorna `true` quando o processo
|
|
49
|
+
* atual virou o supervisor (e o bot já está rodando no filho) — nesse caso o
|
|
50
|
+
* init interrompe o fluxo do entry com SupervisedParentHandoff.
|
|
51
|
+
*/
|
|
52
|
+
export declare const maybeFork: (options?: SupervisorOptions | boolean) => boolean;
|
|
53
|
+
/** Interrompe o fluxo do entry no processo pai (o bot roda no filho). */
|
|
54
|
+
export declare const throwParentHandoff: () => never;
|
|
55
|
+
export declare const Supervisor: {
|
|
56
|
+
maybeFork: (options?: SupervisorOptions | boolean) => boolean;
|
|
57
|
+
throwParentHandoff: () => never;
|
|
58
|
+
startChildDuties: (raw?: SupervisorOptions | boolean) => void;
|
|
59
|
+
notifyIntentionalStop: () => void;
|
|
60
|
+
resolveSupervisorEnabled: (options: SupervisorOptions | boolean | undefined, env?: NodeJS.ProcessEnv) => boolean;
|
|
61
|
+
computeBackoffDelay: (restartCount: number, options?: SupervisorOptions) => number;
|
|
62
|
+
isRestartCapped: (restartTimestamps: number[], maxRestartsPerHour?: number, now?: number) => boolean;
|
|
63
|
+
shouldRespawn: (intentionalStop: boolean, exitCode: number | null, restartTimestamps: number[], maxRestartsPerHour?: number) => boolean;
|
|
64
|
+
isHandoffError: (error: unknown) => boolean;
|
|
65
|
+
};
|
|
66
|
+
export default Supervisor;
|
|
67
|
+
//# sourceMappingURL=Supervisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Supervisor.d.ts","sourceRoot":"","sources":["../../src/Shared/Supervisor.ts"],"names":[],"mappings":"AAOA;;;;;;;;;GASG;AAEH,eAAO,MAAM,cAAc,uBAAuB,CAAA;AAClD,eAAO,MAAM,iBAAiB,0BAA0B,CAAA;AACxD,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,KAAK,CAAA;AAEnC,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,0EAA0E;IAC1E,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,wEAAwE;IACxE,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC;AAkBD,4DAA4D;AAC5D,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,SAAgB,wBAAwB,QAAO;;CAOhD;AAED,eAAO,MAAM,cAAc,GAAI,OAAO,OAAO,KAAG,OACG,CAAA;AAMnD,eAAO,MAAM,wBAAwB,GACnC,SAAS,iBAAiB,GAAG,OAAO,GAAG,SAAS,EAChD,MAAK,MAAM,CAAC,UAAwB,KACnC,OASF,CAAA;AAED,eAAO,MAAM,mBAAmB,GAC9B,cAAc,MAAM,EACpB,UAAU,iBAAiB,KAC1B,MAMF,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,mBAAmB,MAAM,EAAE,EAC3B,qBAAoB,MAAoC,EACxD,MAAK,MAAmB,KACvB,OAGF,CAAA;AAED,eAAO,MAAM,aAAa,GACxB,iBAAiB,OAAO,EACxB,UAAU,MAAM,GAAG,IAAI,EACvB,mBAAmB,MAAM,EAAE,EAC3B,qBAAqB,MAAM,KAC1B,OAQF,CAAA;AA4GD,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,QAAO,IAExC,CAAA;AAyFD;;;;GAIG;AACH,eAAO,MAAM,SAAS,GACpB,UAAU,iBAAiB,GAAG,OAAO,KACpC,OAcF,CAAA;AAED,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,QAAO,KAErC,CAAA;AAED,eAAO,MAAM,UAAU;0BAtBX,iBAAiB,GAAG,OAAO,KACpC,OAAO;8BAiB4B,KAAK;6BAlGX,iBAAiB,GAAG,OAAO,KAAG,IAAI;iCAjBzB,IAAI;wCA3JlC,iBAAiB,GAAG,OAAO,GAAG,SAAS,QAC3C,MAAM,CAAC,UAAU,KACrB,OAAO;wCAYM,MAAM,YACV,iBAAiB,KAC1B,MAAM;yCASY,MAAM,EAAE,uBACP,MAAM,QACrB,MAAM,KACV,OAAO;qCAMS,OAAO,YACd,MAAM,GAAG,IAAI,qBACJ,MAAM,EAAE,uBACN,MAAM,KAC1B,OAAO;4BA9C4B,OAAO,KAAG,OAAO;CAoStD,CAAA;AAED,eAAe,UAAU,CAAA"}
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Supervisor = exports.throwParentHandoff = exports.maybeFork = exports.notifyIntentionalStop = exports.shouldRespawn = exports.isRestartCapped = exports.computeBackoffDelay = exports.resolveSupervisorEnabled = exports.isHandoffError = exports.SupervisedParentHandoff = exports.RESTART_EXIT_CODE = exports.NO_SUPERVISOR_ENV = exports.SUPERVISED_ENV = void 0;
|
|
7
|
+
// --------------------------------------------------------------------------------
|
|
8
|
+
const node_child_process_1 = require("node:child_process");
|
|
9
|
+
const discord_js_1 = require("discord.js");
|
|
10
|
+
const EventBus_1 = __importDefault(require("./EventBus"));
|
|
11
|
+
const ConsoleLog_1 = require("./ConsoleLog");
|
|
12
|
+
// --------------------------------------------------------------------------------
|
|
13
|
+
/**
|
|
14
|
+
* Supervisor de processo: o objetivo é que o bot NUNCA morra.
|
|
15
|
+
*
|
|
16
|
+
* Quando ativo, `Neutrun.init` transforma o processo atual em um supervisor
|
|
17
|
+
* fino e executa o bot em um processo filho idêntico. Se o filho morrer —
|
|
18
|
+
* crash, OOM, exit não intencional — o supervisor o reinicia com backoff
|
|
19
|
+
* exponencial e trava de crash-loop. O filho, por sua vez, reporta heartbeats
|
|
20
|
+
* (um event loop travado é detectado e morto) e roda watchdogs de gateway e
|
|
21
|
+
* de memória que escalonam para um restart limpo antes da morte real.
|
|
22
|
+
*/
|
|
23
|
+
exports.SUPERVISED_ENV = 'NEUTRUN_SUPERVISED';
|
|
24
|
+
exports.NO_SUPERVISOR_ENV = 'NEUTRUN_NO_SUPERVISOR';
|
|
25
|
+
/** Código de saída que significa "quero reiniciar limpo". */
|
|
26
|
+
exports.RESTART_EXIT_CODE = 75;
|
|
27
|
+
const DEFAULTS = {
|
|
28
|
+
maxRestartsPerHour: 12,
|
|
29
|
+
backoffBaseMs: 1_000,
|
|
30
|
+
backoffMaxMs: 60_000,
|
|
31
|
+
stableResetMs: 5 * 60_000,
|
|
32
|
+
heartbeatMs: 30_000,
|
|
33
|
+
heartbeatTimeoutMs: 120_000,
|
|
34
|
+
memoryLimitMB: 0,
|
|
35
|
+
gatewayDeadThresholdMs: 5 * 60_000
|
|
36
|
+
};
|
|
37
|
+
const normalizeOptions = (options) => ({ ...DEFAULTS, ...options });
|
|
38
|
+
/** Erro que interrompe o fluxo do entry no processo pai. */
|
|
39
|
+
class SupervisedParentHandoff extends Error {
|
|
40
|
+
neutrunSupervisorHandoff = true;
|
|
41
|
+
constructor() {
|
|
42
|
+
super('Neutrun Supervisor: este processo agora supervisiona o filho — a execução do bot segue no processo filho.');
|
|
43
|
+
this.name = 'SupervisedParentHandoff';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.SupervisedParentHandoff = SupervisedParentHandoff;
|
|
47
|
+
const isHandoffError = (error) => error?.neutrunSupervisorHandoff === true;
|
|
48
|
+
exports.isHandoffError = isHandoffError;
|
|
49
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
50
|
+
// Funções puras (testáveis sem processos)
|
|
51
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
52
|
+
const resolveSupervisorEnabled = (options, env = process.env) => {
|
|
53
|
+
const flag = String(env[exports.NO_SUPERVISOR_ENV] || '').trim().toLowerCase();
|
|
54
|
+
if (flag === '1' || flag === 'true')
|
|
55
|
+
return false;
|
|
56
|
+
// O filho nunca fork novamente — senão seria uma bomba de processos.
|
|
57
|
+
if (env[exports.SUPERVISED_ENV])
|
|
58
|
+
return false;
|
|
59
|
+
if (typeof options === 'boolean')
|
|
60
|
+
return options;
|
|
61
|
+
if (typeof options?.enabled === 'boolean')
|
|
62
|
+
return options.enabled;
|
|
63
|
+
const environment = String(env.NODE_ENV || env.BOT_ENV || '').toLowerCase();
|
|
64
|
+
return environment === 'production';
|
|
65
|
+
};
|
|
66
|
+
exports.resolveSupervisorEnabled = resolveSupervisorEnabled;
|
|
67
|
+
const computeBackoffDelay = (restartCount, options) => {
|
|
68
|
+
const base = options?.backoffBaseMs ?? DEFAULTS.backoffBaseMs;
|
|
69
|
+
const max = options?.backoffMaxMs ?? DEFAULTS.backoffMaxMs;
|
|
70
|
+
const exponent = Math.min(Math.max(restartCount, 0), 6);
|
|
71
|
+
const delay = Math.min(base * 2 ** exponent, max);
|
|
72
|
+
return delay + Math.floor(Math.random() * 500);
|
|
73
|
+
};
|
|
74
|
+
exports.computeBackoffDelay = computeBackoffDelay;
|
|
75
|
+
const isRestartCapped = (restartTimestamps, maxRestartsPerHour = DEFAULTS.maxRestartsPerHour, now = Date.now()) => {
|
|
76
|
+
const hourAgo = now - 3_600_000;
|
|
77
|
+
return restartTimestamps.filter((at) => at > hourAgo).length >= maxRestartsPerHour;
|
|
78
|
+
};
|
|
79
|
+
exports.isRestartCapped = isRestartCapped;
|
|
80
|
+
const shouldRespawn = (intentionalStop, exitCode, restartTimestamps, maxRestartsPerHour) => {
|
|
81
|
+
if (intentionalStop)
|
|
82
|
+
return false;
|
|
83
|
+
if (exitCode === 0 && !intentionalStop) {
|
|
84
|
+
// Exit 0 sem aviso intencional é ambíguo: reiniciar por segurança —
|
|
85
|
+
// quem quer parar de fato envia o stop via IPC ou usa o exit 0 assistido.
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
return !(0, exports.isRestartCapped)(restartTimestamps, maxRestartsPerHour);
|
|
89
|
+
};
|
|
90
|
+
exports.shouldRespawn = shouldRespawn;
|
|
91
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
92
|
+
// Lado pai: supervisionar
|
|
93
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
94
|
+
const runParent = (options) => {
|
|
95
|
+
const restarts = [];
|
|
96
|
+
let attempt = 0;
|
|
97
|
+
let intentionalStop = false;
|
|
98
|
+
let childStartedAt = Date.now();
|
|
99
|
+
let lastHeartbeatAt = Date.now();
|
|
100
|
+
let current = null;
|
|
101
|
+
const spawnChild = () => {
|
|
102
|
+
const child = (0, node_child_process_1.spawn)(process.argv[0], process.argv.slice(1), {
|
|
103
|
+
stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
|
|
104
|
+
env: { ...process.env, [exports.SUPERVISED_ENV]: '1' }
|
|
105
|
+
});
|
|
106
|
+
childStartedAt = Date.now();
|
|
107
|
+
lastHeartbeatAt = Date.now();
|
|
108
|
+
child.on('message', (message) => {
|
|
109
|
+
if (message?.type === 'neutrun:heartbeat') {
|
|
110
|
+
lastHeartbeatAt = Date.now();
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (message?.type === 'neutrun:stop') {
|
|
114
|
+
intentionalStop = true;
|
|
115
|
+
(0, ConsoleLog_1.logInfo)('Desligamento intencional recebido — supervisor será encerrado.', 'Supervisor');
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
child.on('exit', (code, signal) => {
|
|
119
|
+
current = null;
|
|
120
|
+
if (intentionalStop)
|
|
121
|
+
process.exit(0);
|
|
122
|
+
// Rodou estável por tempo suficiente: o backoff volta ao início.
|
|
123
|
+
if (Date.now() - childStartedAt >= options.stableResetMs)
|
|
124
|
+
attempt = 0;
|
|
125
|
+
if ((0, exports.isRestartCapped)(restarts, options.maxRestartsPerHour)) {
|
|
126
|
+
(0, ConsoleLog_1.logError)(`Crash-loop: ${options.maxRestartsPerHour} reinícios na última hora. ` +
|
|
127
|
+
'Supervisor encerrado — investigue os logs do bot.', 'Supervisor');
|
|
128
|
+
process.exit(70);
|
|
129
|
+
}
|
|
130
|
+
attempt += 1;
|
|
131
|
+
restarts.push(Date.now());
|
|
132
|
+
const delay = (0, exports.computeBackoffDelay)(attempt - 1, options);
|
|
133
|
+
(0, ConsoleLog_1.logWarn)(`Bot morreu (code=${code} signal=${signal}). Reiniciando em ${Math.round(delay / 100) / 10}s…`, 'Supervisor');
|
|
134
|
+
// Timer propositalmente SEM unref: entre a morte e o renascimento ele
|
|
135
|
+
// é o único responsável por manter o supervisor vivo.
|
|
136
|
+
setTimeout(() => {
|
|
137
|
+
current = spawnChild();
|
|
138
|
+
}, delay);
|
|
139
|
+
});
|
|
140
|
+
return child;
|
|
141
|
+
};
|
|
142
|
+
// Um processo vivo que para de bater heartbeats está travado (event loop
|
|
143
|
+
// bloqueado): matar e renascer é a única recuperação possível.
|
|
144
|
+
if (options.heartbeatMs > 0) {
|
|
145
|
+
setInterval(() => {
|
|
146
|
+
if (intentionalStop || !current)
|
|
147
|
+
return;
|
|
148
|
+
if (Date.now() - lastHeartbeatAt <= options.heartbeatTimeoutMs)
|
|
149
|
+
return;
|
|
150
|
+
(0, ConsoleLog_1.logWarn)('Bot sem heartbeat — processo travado será encerrado à força.', 'Supervisor');
|
|
151
|
+
try {
|
|
152
|
+
current.kill();
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// O processo pode ter acabado de sair por conta própria.
|
|
156
|
+
}
|
|
157
|
+
}, Math.max(10_000, Math.floor(options.heartbeatMs / 2)));
|
|
158
|
+
}
|
|
159
|
+
// O pai não executa código de bot: erros dele são fatais e reportados.
|
|
160
|
+
process.on('uncaughtException', (error) => {
|
|
161
|
+
if ((0, exports.isHandoffError)(error))
|
|
162
|
+
return;
|
|
163
|
+
(0, ConsoleLog_1.logError)(`Supervisor com erro interno: ${error?.stack || error}`, 'Supervisor');
|
|
164
|
+
process.exit(1);
|
|
165
|
+
});
|
|
166
|
+
process.on('unhandledRejection', (reason) => {
|
|
167
|
+
(0, ConsoleLog_1.logError)(`Supervisor com rejeição interna: ${reason?.stack || reason}`, 'Supervisor');
|
|
168
|
+
process.exit(1);
|
|
169
|
+
});
|
|
170
|
+
current = spawnChild();
|
|
171
|
+
(0, ConsoleLog_1.logInfo)('Supervisor ativo — o bot roda no processo filho supervisionado.', 'Supervisor');
|
|
172
|
+
};
|
|
173
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
174
|
+
// Lado filho: bater heartbeat e se auto-diagnosticar
|
|
175
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
176
|
+
const notifySupervisor = (message) => {
|
|
177
|
+
try {
|
|
178
|
+
if (typeof process.send === 'function')
|
|
179
|
+
process.send(message);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// Canal IPC fechado (supervisor morto): seguir rodando sem ele.
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
/** Avisa o supervisor que o shutdown é intencional (não reiniciar). */
|
|
186
|
+
const notifyIntentionalStop = () => {
|
|
187
|
+
notifySupervisor({ type: 'neutrun:stop' });
|
|
188
|
+
};
|
|
189
|
+
exports.notifyIntentionalStop = notifyIntentionalStop;
|
|
190
|
+
const restartClean = (reason) => {
|
|
191
|
+
(0, ConsoleLog_1.logError)(`Reinício limpo acionado: ${reason}`, 'Supervisor');
|
|
192
|
+
EventBus_1.default.emit('supervisor:restart', { reason, at: new Date().toISOString() });
|
|
193
|
+
try {
|
|
194
|
+
// Telemetria de última hora antes de renascer (best-effort).
|
|
195
|
+
const { Telemetry } = require('./TelemetryService');
|
|
196
|
+
Telemetry.registerCounter('supervisorCleanRestarts');
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
// Nunca bloquear a saída por telemetria.
|
|
200
|
+
}
|
|
201
|
+
process.exit(exports.RESTART_EXIT_CODE);
|
|
202
|
+
};
|
|
203
|
+
const startChildDuties = (raw) => {
|
|
204
|
+
if (!process.env[exports.SUPERVISED_ENV])
|
|
205
|
+
return;
|
|
206
|
+
const options = normalizeOptions(typeof raw === 'boolean' ? {} : raw);
|
|
207
|
+
// Heartbeat: prova de vida para o supervisor.
|
|
208
|
+
if (options.heartbeatMs > 0) {
|
|
209
|
+
const timer = setInterval(() => {
|
|
210
|
+
notifySupervisor({ type: 'neutrun:heartbeat' });
|
|
211
|
+
}, options.heartbeatMs);
|
|
212
|
+
timer.unref?.();
|
|
213
|
+
}
|
|
214
|
+
// Enxame de exceções não capturadas = estado corrupto: renascer limpo é
|
|
215
|
+
// mais seguro do que seguir manco. O ProcessManager já loga cada uma.
|
|
216
|
+
const uncaughtAt = [];
|
|
217
|
+
process.on('uncaughtException', (error) => {
|
|
218
|
+
if ((0, exports.isHandoffError)(error))
|
|
219
|
+
return;
|
|
220
|
+
const now = Date.now();
|
|
221
|
+
uncaughtAt.push(now);
|
|
222
|
+
while (uncaughtAt.length > 0 && now - uncaughtAt[0] > 60_000)
|
|
223
|
+
uncaughtAt.shift();
|
|
224
|
+
if (uncaughtAt.length >= 10) {
|
|
225
|
+
restartClean('mais de 10 exceções não capturadas em 60s');
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
// Watchdogs periódicos: gateway morto e memória.
|
|
229
|
+
let gatewayDeadForMs = 0;
|
|
230
|
+
let memoryStrikes = 0;
|
|
231
|
+
setInterval(() => {
|
|
232
|
+
const CHECK_MS = 60_000;
|
|
233
|
+
try {
|
|
234
|
+
const { Bot } = require('./Client');
|
|
235
|
+
const bot = Bot.Instance;
|
|
236
|
+
// Gateway: discord.js alterna para Reconnecting ao retentar; ficar em
|
|
237
|
+
// Disconnected sem parar significa que ele desistiu sozinho.
|
|
238
|
+
if (bot && bot.ws && bot.destroyed !== true) {
|
|
239
|
+
if (bot.ws.status === discord_js_1.Status.Disconnected) {
|
|
240
|
+
gatewayDeadForMs += CHECK_MS;
|
|
241
|
+
if (gatewayDeadForMs >= options.gatewayDeadThresholdMs) {
|
|
242
|
+
restartClean(`gateway desconectado por ${Math.round(gatewayDeadForMs / 1000)}s`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
gatewayDeadForMs = 0;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
gatewayDeadForMs = 0;
|
|
251
|
+
}
|
|
252
|
+
// Memória: acima do limite em 3 checagens seguidas (leitura única pode
|
|
253
|
+
// ser um pico de GC legítimo).
|
|
254
|
+
if (options.memoryLimitMB > 0) {
|
|
255
|
+
const rssMB = process.memoryUsage().rss / (1024 * 1024);
|
|
256
|
+
if (rssMB > options.memoryLimitMB) {
|
|
257
|
+
memoryStrikes += 1;
|
|
258
|
+
if (memoryStrikes >= 3) {
|
|
259
|
+
restartClean(`memória em ${Math.round(rssMB)}MB (limite ${options.memoryLimitMB}MB)`);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
memoryStrikes = 0;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
(0, ConsoleLog_1.logWarn)(`Watchdog falhou ao checar: ${error?.message || error}`, 'Supervisor');
|
|
269
|
+
}
|
|
270
|
+
}, 60_000).unref?.();
|
|
271
|
+
};
|
|
272
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
273
|
+
/**
|
|
274
|
+
* Executado no início do `Neutrun.init`. Retorna `true` quando o processo
|
|
275
|
+
* atual virou o supervisor (e o bot já está rodando no filho) — nesse caso o
|
|
276
|
+
* init interrompe o fluxo do entry com SupervisedParentHandoff.
|
|
277
|
+
*/
|
|
278
|
+
const maybeFork = (options) => {
|
|
279
|
+
if (!(0, exports.resolveSupervisorEnabled)(options))
|
|
280
|
+
return false;
|
|
281
|
+
try {
|
|
282
|
+
runParent(normalizeOptions(typeof options === 'boolean' ? {} : options));
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
(0, ConsoleLog_1.logError)(`Supervisor não pôde iniciar (${error?.message || error}) — seguindo sem supervisão.`, 'Supervisor');
|
|
287
|
+
return false;
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
exports.maybeFork = maybeFork;
|
|
291
|
+
/** Interrompe o fluxo do entry no processo pai (o bot roda no filho). */
|
|
292
|
+
const throwParentHandoff = () => {
|
|
293
|
+
throw new SupervisedParentHandoff();
|
|
294
|
+
};
|
|
295
|
+
exports.throwParentHandoff = throwParentHandoff;
|
|
296
|
+
exports.Supervisor = {
|
|
297
|
+
maybeFork: exports.maybeFork,
|
|
298
|
+
throwParentHandoff: exports.throwParentHandoff,
|
|
299
|
+
startChildDuties,
|
|
300
|
+
notifyIntentionalStop: exports.notifyIntentionalStop,
|
|
301
|
+
resolveSupervisorEnabled: exports.resolveSupervisorEnabled,
|
|
302
|
+
computeBackoffDelay: exports.computeBackoffDelay,
|
|
303
|
+
isRestartCapped: exports.isRestartCapped,
|
|
304
|
+
shouldRespawn: exports.shouldRespawn,
|
|
305
|
+
isHandoffError: exports.isHandoffError
|
|
306
|
+
};
|
|
307
|
+
exports.default = exports.Supervisor;
|
|
308
|
+
//# sourceMappingURL=Supervisor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Supervisor.js","sourceRoot":"","sources":["../../src/Shared/Supervisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import 'dotenv/config';
|
|
2
|
+
export declare class TelemetryService {
|
|
3
|
+
private telemetryTimer;
|
|
4
|
+
private isConnected;
|
|
5
|
+
private started;
|
|
6
|
+
private lastErrorLogTime;
|
|
7
|
+
private readonly logCooldownMs;
|
|
8
|
+
private lastCpuUsage;
|
|
9
|
+
private lastCpuTime;
|
|
10
|
+
private readonly actionMap;
|
|
11
|
+
private readonly eventMap;
|
|
12
|
+
private readonly counterMap;
|
|
13
|
+
private clientReadyAt;
|
|
14
|
+
private queueWriteChain;
|
|
15
|
+
private queueFlushPromise;
|
|
16
|
+
private transportBound;
|
|
17
|
+
private getTransport;
|
|
18
|
+
private bindTransport;
|
|
19
|
+
/**
|
|
20
|
+
* Usa o transporte autenticado do Neutrun.
|
|
21
|
+
* O bot passa a ter uma única conexão para auth, config, recursos e métricas.
|
|
22
|
+
*/
|
|
23
|
+
connect(): Promise<void>;
|
|
24
|
+
disconnect(): void;
|
|
25
|
+
private handleConnectionState;
|
|
26
|
+
private handleConnected;
|
|
27
|
+
/** Marca o instante do ClientReady e publica o evento no EventBus. */
|
|
28
|
+
markClientReady(): void;
|
|
29
|
+
/** Contador genérico e limitado de ocorrências (rejeições, reconexões…). */
|
|
30
|
+
registerCounter(key: string, increment?: number): void;
|
|
31
|
+
/**
|
|
32
|
+
* Agrega ocorrências de eventos (gateway Discord ou handlers customizados)
|
|
33
|
+
* com contagem, erros e duração média da última execução.
|
|
34
|
+
*/
|
|
35
|
+
registerEvent(name: string, options?: {
|
|
36
|
+
error?: boolean;
|
|
37
|
+
durationMs?: number;
|
|
38
|
+
}): void;
|
|
39
|
+
private sendLiveMetrics;
|
|
40
|
+
private logConnectionFailure;
|
|
41
|
+
registerAction(type: 'slash' | 'prefix' | 'context' | 'component' | 'job' | 'event' | 'autocomplete' | 'modal', name: string, success: boolean, data: any, errorMessage?: string, durationMs?: number): void;
|
|
42
|
+
/**
|
|
43
|
+
* Fotografia do estado vivo do bot: registradores de comandos, filas,
|
|
44
|
+
* cooldowns, gateway e processo. Enviada junto de cada bulk.
|
|
45
|
+
*/
|
|
46
|
+
getRuntimeSnapshot(): Record<string, unknown>;
|
|
47
|
+
private buildSystemPayload;
|
|
48
|
+
private send;
|
|
49
|
+
private startTelemetryLoop;
|
|
50
|
+
private stopTelemetryLoop;
|
|
51
|
+
private calculateCpuUsage;
|
|
52
|
+
private serializeActions;
|
|
53
|
+
private serializeEvents;
|
|
54
|
+
private fitToFrame;
|
|
55
|
+
sendTelemetryBulk(): Promise<void>;
|
|
56
|
+
private readQueue;
|
|
57
|
+
private writeQueue;
|
|
58
|
+
private queueData;
|
|
59
|
+
private sendQueuedData;
|
|
60
|
+
}
|
|
61
|
+
export declare const Telemetry: TelemetryService;
|
|
62
|
+
export default Telemetry;
|
|
63
|
+
//# sourceMappingURL=TelemetryService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelemetryService.d.ts","sourceRoot":"","sources":["../../src/Shared/TelemetryService.ts"],"names":[],"mappings":"AAGA,OAAO,eAAe,CAAA;AAuMtB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,gBAAgB,CAAI;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiB;IAC/C,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,WAAW,CAAI;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgC;IACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4B;IACvD,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,eAAe,CAAoB;IAC3C,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,cAAc,CAAQ;IAE9B,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,aAAa;IAarB;;;OAGG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAY9B,UAAU,IAAI,IAAI;YAOX,qBAAqB;YAYrB,eAAe;IAW7B,sEAAsE;IAC/D,eAAe,IAAI,IAAI;IAO9B,4EAA4E;IACrE,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,SAAI,GAAG,IAAI;IAYxD;;;OAGG;IACI,aAAa,CAClB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO,GACrD,IAAI;YAkCO,eAAe;IAiB7B,OAAO,CAAC,oBAAoB;IASrB,cAAc,CACnB,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,KAAK,GAAG,OAAO,GAAG,cAAc,GAAG,OAAO,EAC/F,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,GAAG,EACT,YAAY,CAAC,EAAE,MAAM,EACrB,UAAU,CAAC,EAAE,MAAM,GAClB,IAAI;IAmDP;;;OAGG;IACI,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IA6CpD,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,UAAU;IAyCL,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;YAyBjC,SAAS;YAYT,UAAU;YAeV,SAAS;YAmBT,cAAc;CAwB7B;AAED,eAAO,MAAM,SAAS,kBAAyB,CAAA;AAC/C,eAAe,SAAS,CAAA"}
|