@jilimb0/tgwrapper 0.4.0 → 0.5.1
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
CHANGED
|
@@ -36,3 +36,12 @@ All examples require env vars (`BOT_TOKEN`, `WEBHOOK_SECRET`) and do not hardcod
|
|
|
36
36
|
Releases are CI-gated only via Changesets workflow.
|
|
37
37
|
Manual local publishing is not part of supported flow.
|
|
38
38
|
See `/Users/jilimbo/Documents/Personal/TGWrapper/docs/RELEASE_POLICY.md` for semver and process details.
|
|
39
|
+
|
|
40
|
+
## Release Readiness Docs
|
|
41
|
+
|
|
42
|
+
- API stability contract: `/Users/jilimbo/Documents/Personal/TGWrapper/docs/API_STABILITY_0.5.md`
|
|
43
|
+
- Observability contract: `/Users/jilimbo/Documents/Personal/TGWrapper/docs/OBSERVABILITY_CONTRACT.md`
|
|
44
|
+
- Production checklist: `/Users/jilimbo/Documents/Personal/TGWrapper/docs/PRODUCTION_CHECKLIST.md`
|
|
45
|
+
- Migration notes (`0.4.0 -> 0.5.0`): `/Users/jilimbo/Documents/Personal/TGWrapper/docs/MIGRATION_0.4_TO_0.5.md`
|
|
46
|
+
- Release runbook checklist: `/Users/jilimbo/Documents/Personal/TGWrapper/docs/RELEASE_CHECKLIST_0.5.0.md`
|
|
47
|
+
- Next patch release checklist: `/Users/jilimbo/Documents/Personal/TGWrapper/docs/RELEASE_CHECKLIST_0.5.1.md`
|
|
@@ -2,11 +2,12 @@ import type { MetricsCollector } from '../types/core.js';
|
|
|
2
2
|
export declare class InMemoryMetrics implements MetricsCollector {
|
|
3
3
|
private readonly counters;
|
|
4
4
|
private readonly histograms;
|
|
5
|
-
increment(metric: string, value?: number): void;
|
|
6
|
-
observe(metric: string, value: number): void;
|
|
7
|
-
getCounter(metric: string): number;
|
|
8
|
-
latencyP50(metric: string): number;
|
|
9
|
-
latencyP95(metric: string): number;
|
|
5
|
+
increment(metric: string, value?: number, tags?: Record<string, string>): void;
|
|
6
|
+
observe(metric: string, value: number, tags?: Record<string, string>): void;
|
|
7
|
+
getCounter(metric: string, tags?: Record<string, string>): number;
|
|
8
|
+
latencyP50(metric: string, tags?: Record<string, string>): number;
|
|
9
|
+
latencyP95(metric: string, tags?: Record<string, string>): number;
|
|
10
10
|
private quantile;
|
|
11
|
+
private makeKey;
|
|
11
12
|
}
|
|
12
13
|
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/observability/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAMzD,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsC;IAE1D,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/observability/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAMzD,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsC;IAE1D,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,SAAI,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAKzE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAO3E,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;IAIjE,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;IAIjE,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM;IAIxE,OAAO,CAAC,QAAQ;IAWhB,OAAO,CAAC,OAAO;CAWhB"}
|
|
@@ -1,25 +1,27 @@
|
|
|
1
1
|
export class InMemoryMetrics {
|
|
2
2
|
counters = new Map();
|
|
3
3
|
histograms = new Map();
|
|
4
|
-
increment(metric, value = 1) {
|
|
5
|
-
this.
|
|
4
|
+
increment(metric, value = 1, tags) {
|
|
5
|
+
const key = this.makeKey(metric, tags);
|
|
6
|
+
this.counters.set(key, (this.counters.get(key) ?? 0) + value);
|
|
6
7
|
}
|
|
7
|
-
observe(metric, value) {
|
|
8
|
-
const
|
|
8
|
+
observe(metric, value, tags) {
|
|
9
|
+
const key = this.makeKey(metric, tags);
|
|
10
|
+
const bucket = this.histograms.get(key) ?? { values: [] };
|
|
9
11
|
bucket.values.push(value);
|
|
10
|
-
this.histograms.set(
|
|
12
|
+
this.histograms.set(key, bucket);
|
|
11
13
|
}
|
|
12
|
-
getCounter(metric) {
|
|
13
|
-
return this.counters.get(metric) ?? 0;
|
|
14
|
+
getCounter(metric, tags) {
|
|
15
|
+
return this.counters.get(this.makeKey(metric, tags)) ?? 0;
|
|
14
16
|
}
|
|
15
|
-
latencyP50(metric) {
|
|
16
|
-
return this.quantile(metric, 0.5);
|
|
17
|
+
latencyP50(metric, tags) {
|
|
18
|
+
return this.quantile(metric, 0.5, tags);
|
|
17
19
|
}
|
|
18
|
-
latencyP95(metric) {
|
|
19
|
-
return this.quantile(metric, 0.95);
|
|
20
|
+
latencyP95(metric, tags) {
|
|
21
|
+
return this.quantile(metric, 0.95, tags);
|
|
20
22
|
}
|
|
21
|
-
quantile(metric, q) {
|
|
22
|
-
const bucket = this.histograms.get(metric);
|
|
23
|
+
quantile(metric, q, tags) {
|
|
24
|
+
const bucket = this.histograms.get(this.makeKey(metric, tags));
|
|
23
25
|
if (!bucket || bucket.values.length === 0) {
|
|
24
26
|
return 0;
|
|
25
27
|
}
|
|
@@ -27,5 +29,15 @@ export class InMemoryMetrics {
|
|
|
27
29
|
const index = Math.max(0, Math.min(sorted.length - 1, Math.floor((sorted.length - 1) * q)));
|
|
28
30
|
return sorted[index] ?? 0;
|
|
29
31
|
}
|
|
32
|
+
makeKey(metric, tags) {
|
|
33
|
+
if (!tags || Object.keys(tags).length === 0) {
|
|
34
|
+
return metric;
|
|
35
|
+
}
|
|
36
|
+
const tagSuffix = Object.entries(tags)
|
|
37
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
38
|
+
.map(([key, value]) => `${key}=${value}`)
|
|
39
|
+
.join(',');
|
|
40
|
+
return `${metric}|${tagSuffix}`;
|
|
41
|
+
}
|
|
30
42
|
}
|
|
31
43
|
//# sourceMappingURL=metrics.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/observability/metrics.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,eAAe;IACT,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrC,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE1D,SAAS,CAAC,MAAc,EAAE,KAAK,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/observability/metrics.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,eAAe;IACT,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrC,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;IAE1D,SAAS,CAAC,MAAc,EAAE,KAAK,GAAG,CAAC,EAAE,IAA6B;QACvE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;IAChE,CAAC;IAEM,OAAO,CAAC,MAAc,EAAE,KAAa,EAAE,IAA6B;QACzE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;IAEM,UAAU,CAAC,MAAc,EAAE,IAA6B;QAC7D,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAEM,UAAU,CAAC,MAAc,EAAE,IAA6B;QAC7D,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAEM,UAAU,CAAC,MAAc,EAAE,IAA6B;QAC7D,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAEO,QAAQ,CAAC,MAAc,EAAE,CAAS,EAAE,IAA6B;QACvE,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1C,OAAO,CAAC,CAAC;QACX,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAEO,OAAO,CAAC,MAAc,EAAE,IAA6B;QAC3D,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5C,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;aACnC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;aACtC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;aACxC,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,OAAO,GAAG,MAAM,IAAI,SAAS,EAAE,CAAC;IAClC,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jilimb0/tgwrapper",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "Serverless-first Telegram bot framework without external bot libraries",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -47,9 +47,15 @@
|
|
|
47
47
|
"test:chaos": "vitest run test/chaos/multi-tenant.chaos.test.ts",
|
|
48
48
|
"test:phase4": "pnpm test:load && pnpm test:chaos && pnpm test:integration",
|
|
49
49
|
"benchmark": "pnpm build && node benchmark/run-benchmark.mjs",
|
|
50
|
+
"benchmark:trend": "node scripts/check-benchmark-trend.mjs",
|
|
51
|
+
"pack:size": "node scripts/check-package-size-budget.mjs",
|
|
50
52
|
"docs": "typedoc src/index.ts --out docs/api",
|
|
53
|
+
"api:snapshot:check": "node scripts/check-api-snapshot.mjs",
|
|
54
|
+
"api:snapshot:update": "node scripts/update-api-snapshot.mjs",
|
|
51
55
|
"release:status": "changeset status",
|
|
52
56
|
"release:version": "changeset version",
|
|
53
|
-
"release:publish": "changeset publish"
|
|
57
|
+
"release:publish": "changeset publish",
|
|
58
|
+
"test:published-smoke": "node scripts/published-smoke.mjs",
|
|
59
|
+
"verify:release": "pnpm test && pnpm -r typecheck && pnpm build && pnpm -r build && pnpm api:snapshot:check && pnpm pack:size"
|
|
54
60
|
}
|
|
55
61
|
}
|