@buenojs/bueno 0.8.3 → 0.8.5
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 +136 -16
- package/dist/cli/{index.js → bin.js} +3036 -1421
- package/dist/container/index.js +250 -0
- package/dist/context/index.js +219 -0
- package/dist/database/index.js +493 -0
- package/dist/frontend/index.js +7697 -0
- package/dist/health/index.js +364 -0
- package/dist/i18n/index.js +345 -0
- package/dist/index.js +11043 -6482
- package/dist/jobs/index.js +819 -0
- package/dist/lock/index.js +367 -0
- package/dist/logger/index.js +281 -0
- package/dist/metrics/index.js +289 -0
- package/dist/middleware/index.js +77 -0
- package/dist/migrations/index.js +571 -0
- package/dist/modules/index.js +3346 -0
- package/dist/notification/index.js +484 -0
- package/dist/observability/index.js +331 -0
- package/dist/openapi/index.js +776 -0
- package/dist/orm/index.js +1356 -0
- package/dist/router/index.js +886 -0
- package/dist/rpc/index.js +691 -0
- package/dist/schema/index.js +400 -0
- package/dist/telemetry/index.js +595 -0
- package/dist/template/index.js +640 -0
- package/dist/templates/index.js +640 -0
- package/dist/testing/index.js +1111 -0
- package/dist/types/index.js +60 -0
- package/package.json +121 -27
- package/src/cache/index.ts +2 -1
- package/src/cli/bin.ts +2 -2
- package/src/cli/commands/build.ts +183 -165
- package/src/cli/commands/dev.ts +96 -89
- package/src/cli/commands/generate.ts +142 -111
- package/src/cli/commands/help.ts +20 -16
- package/src/cli/commands/index.ts +3 -6
- package/src/cli/commands/migration.ts +124 -105
- package/src/cli/commands/new.ts +392 -438
- package/src/cli/commands/start.ts +81 -79
- package/src/cli/core/args.ts +68 -50
- package/src/cli/core/console.ts +89 -95
- package/src/cli/core/index.ts +4 -4
- package/src/cli/core/prompt.ts +65 -62
- package/src/cli/core/spinner.ts +23 -20
- package/src/cli/index.ts +46 -38
- package/src/cli/templates/database/index.ts +61 -0
- package/src/cli/templates/database/mysql.ts +14 -0
- package/src/cli/templates/database/none.ts +16 -0
- package/src/cli/templates/database/postgresql.ts +14 -0
- package/src/cli/templates/database/sqlite.ts +14 -0
- package/src/cli/templates/deploy.ts +29 -26
- package/src/cli/templates/docker.ts +41 -30
- package/src/cli/templates/frontend/index.ts +63 -0
- package/src/cli/templates/frontend/none.ts +17 -0
- package/src/cli/templates/frontend/react.ts +140 -0
- package/src/cli/templates/frontend/solid.ts +134 -0
- package/src/cli/templates/frontend/svelte.ts +131 -0
- package/src/cli/templates/frontend/vue.ts +130 -0
- package/src/cli/templates/generators/index.ts +339 -0
- package/src/cli/templates/generators/types.ts +56 -0
- package/src/cli/templates/index.ts +35 -2
- package/src/cli/templates/project/api.ts +81 -0
- package/src/cli/templates/project/default.ts +140 -0
- package/src/cli/templates/project/fullstack.ts +111 -0
- package/src/cli/templates/project/index.ts +95 -0
- package/src/cli/templates/project/minimal.ts +45 -0
- package/src/cli/templates/project/types.ts +94 -0
- package/src/cli/templates/project/website.ts +263 -0
- package/src/cli/utils/fs.ts +55 -41
- package/src/cli/utils/index.ts +3 -2
- package/src/cli/utils/strings.ts +47 -33
- package/src/cli/utils/version.ts +47 -0
- package/src/config/env-validation.ts +100 -0
- package/src/config/env.ts +169 -41
- package/src/config/index.ts +28 -20
- package/src/config/loader.ts +25 -16
- package/src/config/merge.ts +21 -10
- package/src/config/types.ts +545 -25
- package/src/config/validation.ts +215 -7
- package/src/container/forward-ref.ts +22 -22
- package/src/container/index.ts +34 -12
- package/src/context/index.ts +11 -1
- package/src/database/index.ts +7 -190
- package/src/database/orm/builder.ts +457 -0
- package/src/database/orm/casts/index.ts +130 -0
- package/src/database/orm/casts/types.ts +25 -0
- package/src/database/orm/compiler.ts +304 -0
- package/src/database/orm/hooks/index.ts +114 -0
- package/src/database/orm/index.ts +61 -0
- package/src/database/orm/model-registry.ts +59 -0
- package/src/database/orm/model.ts +821 -0
- package/src/database/orm/relationships/base.ts +146 -0
- package/src/database/orm/relationships/belongs-to-many.ts +179 -0
- package/src/database/orm/relationships/belongs-to.ts +56 -0
- package/src/database/orm/relationships/has-many.ts +45 -0
- package/src/database/orm/relationships/has-one.ts +41 -0
- package/src/database/orm/relationships/index.ts +11 -0
- package/src/database/orm/scopes/index.ts +55 -0
- package/src/events/__tests__/event-system.test.ts +235 -0
- package/src/events/config.ts +238 -0
- package/src/events/example-usage.ts +185 -0
- package/src/events/index.ts +278 -0
- package/src/events/manager.ts +385 -0
- package/src/events/registry.ts +182 -0
- package/src/events/types.ts +124 -0
- package/src/frontend/api-routes.ts +65 -23
- package/src/frontend/bundler.ts +76 -34
- package/src/frontend/console-client.ts +2 -2
- package/src/frontend/console-stream.ts +94 -38
- package/src/frontend/dev-server.ts +94 -46
- package/src/frontend/file-router.ts +61 -19
- package/src/frontend/frameworks/index.ts +37 -10
- package/src/frontend/frameworks/react.ts +10 -8
- package/src/frontend/frameworks/solid.ts +11 -9
- package/src/frontend/frameworks/svelte.ts +15 -9
- package/src/frontend/frameworks/vue.ts +13 -11
- package/src/frontend/hmr-client.ts +12 -10
- package/src/frontend/hmr.ts +146 -103
- package/src/frontend/index.ts +14 -5
- package/src/frontend/islands.ts +41 -22
- package/src/frontend/isr.ts +59 -37
- package/src/frontend/layout.ts +36 -21
- package/src/frontend/ssr/react.ts +74 -27
- package/src/frontend/ssr/solid.ts +54 -20
- package/src/frontend/ssr/svelte.ts +48 -14
- package/src/frontend/ssr/vue.ts +50 -18
- package/src/frontend/ssr.ts +83 -39
- package/src/frontend/types.ts +91 -56
- package/src/health/index.ts +21 -9
- package/src/i18n/engine.ts +305 -0
- package/src/i18n/index.ts +38 -0
- package/src/i18n/loader.ts +218 -0
- package/src/i18n/middleware.ts +164 -0
- package/src/i18n/negotiator.ts +162 -0
- package/src/i18n/types.ts +158 -0
- package/src/index.ts +179 -27
- package/src/jobs/drivers/memory.ts +315 -0
- package/src/jobs/drivers/redis.ts +459 -0
- package/src/jobs/index.ts +30 -0
- package/src/jobs/queue.ts +281 -0
- package/src/jobs/types.ts +295 -0
- package/src/jobs/worker.ts +380 -0
- package/src/logger/index.ts +1 -3
- package/src/logger/transports/index.ts +62 -22
- package/src/metrics/index.ts +25 -16
- package/src/migrations/index.ts +9 -0
- package/src/modules/filters.ts +13 -17
- package/src/modules/guards.ts +49 -26
- package/src/modules/index.ts +409 -298
- package/src/modules/interceptors.ts +58 -20
- package/src/modules/lazy.ts +11 -19
- package/src/modules/lifecycle.ts +15 -7
- package/src/modules/metadata.ts +15 -5
- package/src/modules/pipes.ts +94 -72
- package/src/notification/channels/base.ts +68 -0
- package/src/notification/channels/email.ts +105 -0
- package/src/notification/channels/push.ts +104 -0
- package/src/notification/channels/sms.ts +105 -0
- package/src/notification/channels/whatsapp.ts +104 -0
- package/src/notification/index.ts +48 -0
- package/src/notification/service.ts +354 -0
- package/src/notification/types.ts +344 -0
- package/src/observability/__tests__/observability.test.ts +483 -0
- package/src/observability/breadcrumbs.ts +114 -0
- package/src/observability/index.ts +136 -0
- package/src/observability/interceptor.ts +85 -0
- package/src/observability/service.ts +303 -0
- package/src/observability/trace.ts +37 -0
- package/src/observability/types.ts +196 -0
- package/src/openapi/__tests__/decorators.test.ts +335 -0
- package/src/openapi/__tests__/document-builder.test.ts +285 -0
- package/src/openapi/__tests__/route-scanner.test.ts +334 -0
- package/src/openapi/__tests__/schema-generator.test.ts +275 -0
- package/src/openapi/decorators.ts +328 -0
- package/src/openapi/document-builder.ts +274 -0
- package/src/openapi/index.ts +112 -0
- package/src/openapi/metadata.ts +112 -0
- package/src/openapi/route-scanner.ts +289 -0
- package/src/openapi/schema-generator.ts +256 -0
- package/src/openapi/swagger-module.ts +166 -0
- package/src/openapi/types.ts +398 -0
- package/src/orm/index.ts +10 -0
- package/src/rpc/index.ts +3 -1
- package/src/schema/index.ts +9 -0
- package/src/security/index.ts +15 -6
- package/src/ssg/index.ts +9 -8
- package/src/telemetry/index.ts +76 -22
- package/src/template/index.ts +7 -0
- package/src/templates/engine.ts +224 -0
- package/src/templates/index.ts +9 -0
- package/src/templates/loader.ts +331 -0
- package/src/templates/renderers/markdown.ts +212 -0
- package/src/templates/renderers/simple.ts +269 -0
- package/src/templates/types.ts +154 -0
- package/src/testing/index.ts +100 -27
- package/src/types/optional-deps.d.ts +347 -187
- package/src/validation/index.ts +92 -2
- package/src/validation/schemas.ts +536 -0
- package/tests/integration/fullstack.test.ts +4 -4
- package/tests/unit/database.test.ts +2 -72
- package/tests/unit/env-validation.test.ts +166 -0
- package/tests/unit/events.test.ts +910 -0
- package/tests/unit/i18n.test.ts +455 -0
- package/tests/unit/jobs.test.ts +493 -0
- package/tests/unit/notification.test.ts +988 -0
- package/tests/unit/observability.test.ts +453 -0
- package/tests/unit/orm/builder.test.ts +323 -0
- package/tests/unit/orm/casts.test.ts +179 -0
- package/tests/unit/orm/compiler.test.ts +220 -0
- package/tests/unit/orm/eager-loading.test.ts +285 -0
- package/tests/unit/orm/hooks.test.ts +191 -0
- package/tests/unit/orm/model.test.ts +373 -0
- package/tests/unit/orm/relationships.test.ts +303 -0
- package/tests/unit/orm/scopes.test.ts +74 -0
- package/tests/unit/templates-simple.test.ts +53 -0
- package/tests/unit/templates.test.ts +454 -0
- package/tests/unit/validation.test.ts +18 -24
- package/tsconfig.json +11 -3
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __export = (target, all) => {
|
|
4
|
+
for (var name in all)
|
|
5
|
+
__defProp(target, name, {
|
|
6
|
+
get: all[name],
|
|
7
|
+
enumerable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
set: (newValue) => all[name] = () => newValue
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
var __legacyDecorateClassTS = function(decorators, target, key, desc) {
|
|
13
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
14
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
15
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
16
|
+
else
|
|
17
|
+
for (var i = decorators.length - 1;i >= 0; i--)
|
|
18
|
+
if (d = decorators[i])
|
|
19
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
20
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
21
|
+
};
|
|
22
|
+
var __legacyMetadataTS = (k, v) => {
|
|
23
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
24
|
+
return Reflect.metadata(k, v);
|
|
25
|
+
};
|
|
26
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
27
|
+
var __require = import.meta.require;
|
|
28
|
+
|
|
29
|
+
// src/metrics/index.ts
|
|
30
|
+
function formatBytes(bytes) {
|
|
31
|
+
if (bytes === 0)
|
|
32
|
+
return "0 B";
|
|
33
|
+
const units = ["B", "KB", "MB", "GB", "TB"];
|
|
34
|
+
const i = Math.floor(Math.log(bytes) / Math.log(1024));
|
|
35
|
+
const value = bytes / Math.pow(1024, i);
|
|
36
|
+
if (i === 0)
|
|
37
|
+
return `${value} ${units[i]}`;
|
|
38
|
+
if (value >= 100)
|
|
39
|
+
return `${value.toFixed(1)} ${units[i]}`;
|
|
40
|
+
return `${value.toFixed(2)} ${units[i]}`;
|
|
41
|
+
}
|
|
42
|
+
function formatMicroseconds(microseconds) {
|
|
43
|
+
if (microseconds < 1000) {
|
|
44
|
+
return `${microseconds.toFixed(0)} \xB5s`;
|
|
45
|
+
}
|
|
46
|
+
const ms = microseconds / 1000;
|
|
47
|
+
if (ms < 1000) {
|
|
48
|
+
return `${ms.toFixed(2)} ms`;
|
|
49
|
+
}
|
|
50
|
+
const seconds = ms / 1000;
|
|
51
|
+
return `${seconds.toFixed(2)} s`;
|
|
52
|
+
}
|
|
53
|
+
function formatUptime(seconds) {
|
|
54
|
+
const days = Math.floor(seconds / 86400);
|
|
55
|
+
const hours = Math.floor(seconds % 86400 / 3600);
|
|
56
|
+
const minutes = Math.floor(seconds % 3600 / 60);
|
|
57
|
+
const secs = Math.floor(seconds % 60);
|
|
58
|
+
const parts = [];
|
|
59
|
+
if (days > 0)
|
|
60
|
+
parts.push(`${days}d`);
|
|
61
|
+
if (hours > 0)
|
|
62
|
+
parts.push(`${hours}h`);
|
|
63
|
+
if (minutes > 0)
|
|
64
|
+
parts.push(`${minutes}m`);
|
|
65
|
+
if (secs > 0 || parts.length === 0)
|
|
66
|
+
parts.push(`${secs}s`);
|
|
67
|
+
return parts.join(" ");
|
|
68
|
+
}
|
|
69
|
+
function getMetricsSummary(metrics) {
|
|
70
|
+
return {
|
|
71
|
+
memoryHeapUsed: formatBytes(metrics.memoryHeapUsed),
|
|
72
|
+
memoryHeapTotal: formatBytes(metrics.memoryHeapTotal),
|
|
73
|
+
memoryExternal: formatBytes(metrics.memoryExternal),
|
|
74
|
+
memoryRss: formatBytes(metrics.memoryRss),
|
|
75
|
+
cpuUser: formatMicroseconds(metrics.cpuUser),
|
|
76
|
+
cpuSystem: formatMicroseconds(metrics.cpuSystem),
|
|
77
|
+
uptime: formatUptime(metrics.uptime),
|
|
78
|
+
eventLoopLag: `${metrics.eventLoopLag.toFixed(2)} ms`,
|
|
79
|
+
timestamp: metrics.timestamp
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
async function measureEventLoopLag() {
|
|
83
|
+
const start = Bun.nanoseconds();
|
|
84
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
85
|
+
const end = Bun.nanoseconds();
|
|
86
|
+
return (end - start) / 1e6;
|
|
87
|
+
}
|
|
88
|
+
async function measureEventLoopLagAverage(samples = 5) {
|
|
89
|
+
const measurements = [];
|
|
90
|
+
for (let i = 0;i < samples; i++) {
|
|
91
|
+
measurements.push(await measureEventLoopLag());
|
|
92
|
+
}
|
|
93
|
+
return measurements.reduce((a, b) => a + b, 0) / measurements.length;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
class MetricsCollector {
|
|
97
|
+
history = [];
|
|
98
|
+
maxHistorySize;
|
|
99
|
+
measureEventLoopLagEnabled;
|
|
100
|
+
periodicTimer = null;
|
|
101
|
+
lastCpuUsage = undefined;
|
|
102
|
+
constructor(options = {}) {
|
|
103
|
+
this.maxHistorySize = options.maxHistorySize ?? 100;
|
|
104
|
+
this.measureEventLoopLagEnabled = options.measureEventLoopLag ?? true;
|
|
105
|
+
}
|
|
106
|
+
async collect() {
|
|
107
|
+
const memUsage = process.memoryUsage();
|
|
108
|
+
const cpuUsage = process.cpuUsage(this.lastCpuUsage);
|
|
109
|
+
this.lastCpuUsage = process.cpuUsage();
|
|
110
|
+
const uptime = process.uptime();
|
|
111
|
+
let eventLoopLag = 0;
|
|
112
|
+
if (this.measureEventLoopLagEnabled) {
|
|
113
|
+
eventLoopLag = await measureEventLoopLag();
|
|
114
|
+
}
|
|
115
|
+
const metrics = {
|
|
116
|
+
memoryHeapUsed: memUsage.heapUsed,
|
|
117
|
+
memoryHeapTotal: memUsage.heapTotal,
|
|
118
|
+
memoryExternal: memUsage.external,
|
|
119
|
+
memoryRss: memUsage.rss,
|
|
120
|
+
cpuUser: cpuUsage.user,
|
|
121
|
+
cpuSystem: cpuUsage.system,
|
|
122
|
+
uptime,
|
|
123
|
+
eventLoopLag,
|
|
124
|
+
timestamp: new Date().toISOString()
|
|
125
|
+
};
|
|
126
|
+
this.history.push(metrics);
|
|
127
|
+
if (this.history.length > this.maxHistorySize) {
|
|
128
|
+
this.history.shift();
|
|
129
|
+
}
|
|
130
|
+
return metrics;
|
|
131
|
+
}
|
|
132
|
+
startPeriodicCollection(intervalMs = 5000) {
|
|
133
|
+
if (this.periodicTimer !== null) {
|
|
134
|
+
throw new Error("Periodic collection is already running");
|
|
135
|
+
}
|
|
136
|
+
this.collect().catch(() => {});
|
|
137
|
+
this.periodicTimer = setInterval(() => {
|
|
138
|
+
this.collect().catch(() => {});
|
|
139
|
+
}, intervalMs);
|
|
140
|
+
}
|
|
141
|
+
stopPeriodicCollection() {
|
|
142
|
+
if (this.periodicTimer !== null) {
|
|
143
|
+
clearInterval(this.periodicTimer);
|
|
144
|
+
this.periodicTimer = null;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
isCollecting() {
|
|
148
|
+
return this.periodicTimer !== null;
|
|
149
|
+
}
|
|
150
|
+
getHistory() {
|
|
151
|
+
return [...this.history];
|
|
152
|
+
}
|
|
153
|
+
getLatest() {
|
|
154
|
+
return this.history.length > 0 ? { ...this.history[this.history.length - 1] } : null;
|
|
155
|
+
}
|
|
156
|
+
getAverage() {
|
|
157
|
+
if (this.history.length === 0) {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
const count = this.history.length;
|
|
161
|
+
let sumHeapUsed = 0;
|
|
162
|
+
let sumHeapTotal = 0;
|
|
163
|
+
let sumExternal = 0;
|
|
164
|
+
let sumRss = 0;
|
|
165
|
+
let sumCpuUser = 0;
|
|
166
|
+
let sumCpuSystem = 0;
|
|
167
|
+
let sumEventLoopLag = 0;
|
|
168
|
+
let minHeapUsed = Number.POSITIVE_INFINITY;
|
|
169
|
+
let maxHeapUsed = 0;
|
|
170
|
+
for (const m of this.history) {
|
|
171
|
+
sumHeapUsed += m.memoryHeapUsed;
|
|
172
|
+
sumHeapTotal += m.memoryHeapTotal;
|
|
173
|
+
sumExternal += m.memoryExternal;
|
|
174
|
+
sumRss += m.memoryRss;
|
|
175
|
+
sumCpuUser += m.cpuUser;
|
|
176
|
+
sumCpuSystem += m.cpuSystem;
|
|
177
|
+
sumEventLoopLag += m.eventLoopLag;
|
|
178
|
+
minHeapUsed = Math.min(minHeapUsed, m.memoryHeapUsed);
|
|
179
|
+
maxHeapUsed = Math.max(maxHeapUsed, m.memoryHeapUsed);
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
avgMemoryHeapUsed: Math.round(sumHeapUsed / count),
|
|
183
|
+
avgMemoryHeapTotal: Math.round(sumHeapTotal / count),
|
|
184
|
+
avgMemoryExternal: Math.round(sumExternal / count),
|
|
185
|
+
avgMemoryRss: Math.round(sumRss / count),
|
|
186
|
+
avgCpuUser: Math.round(sumCpuUser / count),
|
|
187
|
+
avgCpuSystem: Math.round(sumCpuSystem / count),
|
|
188
|
+
avgEventLoopLag: Math.round(sumEventLoopLag / count * 100) / 100,
|
|
189
|
+
minMemoryHeapUsed: minHeapUsed === Number.POSITIVE_INFINITY ? 0 : minHeapUsed,
|
|
190
|
+
maxMemoryHeapUsed: maxHeapUsed,
|
|
191
|
+
sampleCount: count,
|
|
192
|
+
timeRange: {
|
|
193
|
+
start: this.history[0].timestamp,
|
|
194
|
+
end: this.history[count - 1].timestamp
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
reset() {
|
|
199
|
+
this.history = [];
|
|
200
|
+
this.lastCpuUsage = undefined;
|
|
201
|
+
}
|
|
202
|
+
getHistorySize() {
|
|
203
|
+
return this.history.length;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
function toPrometheusFormat(metrics) {
|
|
207
|
+
const timestamp = Date.now();
|
|
208
|
+
const lines = [];
|
|
209
|
+
lines.push("# HELP process_memory_heap_used_bytes Heap memory used in bytes");
|
|
210
|
+
lines.push("# TYPE process_memory_heap_used_bytes gauge");
|
|
211
|
+
lines.push(`process_memory_heap_used_bytes ${metrics.memoryHeapUsed} ${timestamp}`);
|
|
212
|
+
lines.push("# HELP process_memory_heap_total_bytes Total heap memory in bytes");
|
|
213
|
+
lines.push("# TYPE process_memory_heap_total_bytes gauge");
|
|
214
|
+
lines.push(`process_memory_heap_total_bytes ${metrics.memoryHeapTotal} ${timestamp}`);
|
|
215
|
+
lines.push("# HELP process_memory_external_bytes External memory in bytes");
|
|
216
|
+
lines.push("# TYPE process_memory_external_bytes gauge");
|
|
217
|
+
lines.push(`process_memory_external_bytes ${metrics.memoryExternal} ${timestamp}`);
|
|
218
|
+
lines.push("# HELP process_memory_rss_bytes Resident Set Size in bytes");
|
|
219
|
+
lines.push("# TYPE process_memory_rss_bytes gauge");
|
|
220
|
+
lines.push(`process_memory_rss_bytes ${metrics.memoryRss} ${timestamp}`);
|
|
221
|
+
lines.push("# HELP process_cpu_user_seconds_total Total user CPU time");
|
|
222
|
+
lines.push("# TYPE process_cpu_user_seconds_total counter");
|
|
223
|
+
lines.push(`process_cpu_user_seconds_total ${(metrics.cpuUser / 1e6).toFixed(6)} ${timestamp}`);
|
|
224
|
+
lines.push("# HELP process_cpu_system_seconds_total Total system CPU time");
|
|
225
|
+
lines.push("# TYPE process_cpu_system_seconds_total counter");
|
|
226
|
+
lines.push(`process_cpu_system_seconds_total ${(metrics.cpuSystem / 1e6).toFixed(6)} ${timestamp}`);
|
|
227
|
+
lines.push("# HELP process_uptime_seconds Process uptime in seconds");
|
|
228
|
+
lines.push("# TYPE process_uptime_seconds gauge");
|
|
229
|
+
lines.push(`process_uptime_seconds ${metrics.uptime.toFixed(2)} ${timestamp}`);
|
|
230
|
+
lines.push("# HELP nodejs_eventloop_lag_ms Event loop lag in milliseconds");
|
|
231
|
+
lines.push("# TYPE nodejs_eventloop_lag_ms gauge");
|
|
232
|
+
lines.push(`nodejs_eventloop_lag_ms ${metrics.eventLoopLag.toFixed(2)} ${timestamp}`);
|
|
233
|
+
return lines.join(`
|
|
234
|
+
`);
|
|
235
|
+
}
|
|
236
|
+
function averagedMetricsToPrometheus(averaged) {
|
|
237
|
+
const timestamp = Date.now();
|
|
238
|
+
const lines = [];
|
|
239
|
+
lines.push("# HELP process_memory_heap_used_avg_bytes Average heap memory used");
|
|
240
|
+
lines.push("# TYPE process_memory_heap_used_avg_bytes gauge");
|
|
241
|
+
lines.push(`process_memory_heap_used_avg_bytes ${averaged.avgMemoryHeapUsed} ${timestamp}`);
|
|
242
|
+
lines.push("# HELP process_memory_heap_used_min_bytes Minimum heap memory used");
|
|
243
|
+
lines.push("# TYPE process_memory_heap_used_min_bytes gauge");
|
|
244
|
+
lines.push(`process_memory_heap_used_min_bytes ${averaged.minMemoryHeapUsed} ${timestamp}`);
|
|
245
|
+
lines.push("# HELP process_memory_heap_used_max_bytes Maximum heap memory used");
|
|
246
|
+
lines.push("# TYPE process_memory_heap_used_max_bytes gauge");
|
|
247
|
+
lines.push(`process_memory_heap_used_max_bytes ${averaged.maxMemoryHeapUsed} ${timestamp}`);
|
|
248
|
+
lines.push("# HELP process_eventloop_lag_avg_ms Average event loop lag");
|
|
249
|
+
lines.push("# TYPE process_eventloop_lag_avg_ms gauge");
|
|
250
|
+
lines.push(`process_eventloop_lag_avg_ms ${averaged.avgEventLoopLag.toFixed(2)} ${timestamp}`);
|
|
251
|
+
lines.push("# HELP process_metrics_sample_count Number of samples collected");
|
|
252
|
+
lines.push("# TYPE process_metrics_sample_count gauge");
|
|
253
|
+
lines.push(`process_metrics_sample_count ${averaged.sampleCount} ${timestamp}`);
|
|
254
|
+
return lines.join(`
|
|
255
|
+
`);
|
|
256
|
+
}
|
|
257
|
+
function createMetricsCollector(options) {
|
|
258
|
+
return new MetricsCollector(options);
|
|
259
|
+
}
|
|
260
|
+
async function collectMetrics() {
|
|
261
|
+
const memUsage = process.memoryUsage();
|
|
262
|
+
const cpuUsage = process.cpuUsage();
|
|
263
|
+
const uptime = process.uptime();
|
|
264
|
+
const eventLoopLag = await measureEventLoopLag();
|
|
265
|
+
return {
|
|
266
|
+
memoryHeapUsed: memUsage.heapUsed,
|
|
267
|
+
memoryHeapTotal: memUsage.heapTotal,
|
|
268
|
+
memoryExternal: memUsage.external,
|
|
269
|
+
memoryRss: memUsage.rss,
|
|
270
|
+
cpuUser: cpuUsage.user,
|
|
271
|
+
cpuSystem: cpuUsage.system,
|
|
272
|
+
uptime,
|
|
273
|
+
eventLoopLag,
|
|
274
|
+
timestamp: new Date().toISOString()
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
export {
|
|
278
|
+
toPrometheusFormat,
|
|
279
|
+
measureEventLoopLagAverage,
|
|
280
|
+
measureEventLoopLag,
|
|
281
|
+
getMetricsSummary,
|
|
282
|
+
formatUptime,
|
|
283
|
+
formatMicroseconds,
|
|
284
|
+
formatBytes,
|
|
285
|
+
createMetricsCollector,
|
|
286
|
+
collectMetrics,
|
|
287
|
+
averagedMetricsToPrometheus,
|
|
288
|
+
MetricsCollector
|
|
289
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __export = (target, all) => {
|
|
4
|
+
for (var name in all)
|
|
5
|
+
__defProp(target, name, {
|
|
6
|
+
get: all[name],
|
|
7
|
+
enumerable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
set: (newValue) => all[name] = () => newValue
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
var __legacyDecorateClassTS = function(decorators, target, key, desc) {
|
|
13
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
14
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
15
|
+
r = Reflect.decorate(decorators, target, key, desc);
|
|
16
|
+
else
|
|
17
|
+
for (var i = decorators.length - 1;i >= 0; i--)
|
|
18
|
+
if (d = decorators[i])
|
|
19
|
+
r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
20
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
21
|
+
};
|
|
22
|
+
var __legacyMetadataTS = (k, v) => {
|
|
23
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
24
|
+
return Reflect.metadata(k, v);
|
|
25
|
+
};
|
|
26
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
27
|
+
var __require = import.meta.require;
|
|
28
|
+
|
|
29
|
+
// src/middleware/index.ts
|
|
30
|
+
var exports_middleware = {};
|
|
31
|
+
__export(exports_middleware, {
|
|
32
|
+
createPipeline: () => createPipeline,
|
|
33
|
+
compose: () => compose,
|
|
34
|
+
Pipeline: () => Pipeline
|
|
35
|
+
});
|
|
36
|
+
function compose(middleware) {
|
|
37
|
+
return async (context, handler) => {
|
|
38
|
+
let index = -1;
|
|
39
|
+
const dispatch = async (i) => {
|
|
40
|
+
if (i <= index) {
|
|
41
|
+
throw new Error("next() called multiple times");
|
|
42
|
+
}
|
|
43
|
+
index = i;
|
|
44
|
+
if (i >= middleware.length) {
|
|
45
|
+
return handler(context);
|
|
46
|
+
}
|
|
47
|
+
const fn = middleware[i];
|
|
48
|
+
return fn(context, async () => {
|
|
49
|
+
return dispatch(i + 1);
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
return dispatch(0);
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
class Pipeline {
|
|
57
|
+
middleware = [];
|
|
58
|
+
use(middleware) {
|
|
59
|
+
this.middleware.push(middleware);
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
async execute(context, handler) {
|
|
63
|
+
const fn = compose(this.middleware);
|
|
64
|
+
return fn(context, handler);
|
|
65
|
+
}
|
|
66
|
+
get length() {
|
|
67
|
+
return this.middleware.length;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function createPipeline() {
|
|
71
|
+
return new Pipeline;
|
|
72
|
+
}
|
|
73
|
+
export {
|
|
74
|
+
createPipeline,
|
|
75
|
+
compose,
|
|
76
|
+
Pipeline
|
|
77
|
+
};
|