kassza 0.13.0 → 0.14.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.en.md +48 -0
- package/README.md +152 -22
- package/agents/README.md +6 -1
- package/agents/api.md +64 -12
- package/agents/pitfalls.md +12 -1
- package/agents/recipes.md +67 -8
- package/agents/skills/kassza/SKILL.md +3 -0
- package/agents/skills/migrate-from-szamlazz-js/SKILL.md +39 -0
- package/dist/batch/index.cjs +346 -0
- package/dist/batch/index.d.cts +91 -0
- package/dist/batch/index.d.ts +91 -0
- package/dist/batch/index.js +339 -0
- package/dist/cli.cjs +105 -14
- package/dist/cli.js +104 -13
- package/dist/{client-C-PdfL_P.cjs → client-CLFvJCVW.cjs} +358 -181
- package/dist/{client-CfaS1-Jx.js → client-Cvf-hTz_.js} +311 -152
- package/dist/{client-6MkeuFqD.d.ts → client-DeWWQ-RZ.d.ts} +99 -26
- package/dist/{client-B5FryKxJ.d.cts → client-SVZu25MB.d.cts} +99 -26
- package/dist/{context-DXNbTPwz.d.cts → context-CFNKzStE.d.cts} +82 -58
- package/dist/{context-BxQlIlug.d.ts → context-kb33TgzE.d.ts} +82 -58
- package/dist/cookie-stores/index.cjs +21 -150
- package/dist/cookie-stores/index.d.cts +4 -63
- package/dist/cookie-stores/index.d.ts +4 -63
- package/dist/cookie-stores/index.js +3 -144
- package/dist/create-CflXrPip.js +204 -0
- package/dist/create-CvUvLUaT.cjs +257 -0
- package/dist/{create-once-DgMtKKcG.cjs → create-once-9yxR_Er_.cjs} +285 -33
- package/dist/create-once-Bh6fOWkW.d.cts +20 -0
- package/dist/{create-once-Cz621l8r.js → create-once-Ca2gMk1h.js} +250 -34
- package/dist/create-once-VKp0tVow.d.ts +20 -0
- package/dist/data-link/index.cjs +4 -4
- package/dist/data-link/index.d.cts +2 -52
- package/dist/data-link/index.d.ts +2 -52
- package/dist/data-link/index.js +4 -4
- package/dist/delegation/index.cjs +4 -4
- package/dist/delegation/index.d.cts +2 -2
- package/dist/delegation/index.d.ts +2 -2
- package/dist/delegation/index.js +4 -4
- package/dist/{errors-DLrb0g64.js → errors-DtN4g5Z9.js} +9 -1
- package/dist/{errors-DxeuTslP.cjs → errors-EE96_6D_.cjs} +20 -0
- package/dist/{get-Csm2n0rZ.cjs → get-BdMTseh4.cjs} +9 -183
- package/dist/{get-DT3JEgQ6.js → get-CZEShCcj.js} +4 -124
- package/dist/index-BhUPY_EH.d.cts +109 -0
- package/dist/index-BqGgQ4t3.d.ts +109 -0
- package/dist/{index-CYAGCdKJ.d.cts → index-C-7yWV7L.d.cts} +24 -1
- package/dist/{index-CYAGCdKJ.d.ts → index-C-7yWV7L.d.ts} +24 -1
- package/dist/index.cjs +19 -5
- package/dist/index.d.cts +10 -20
- package/dist/index.d.ts +10 -20
- package/dist/index.js +6 -6
- package/dist/ipn/index.cjs +26 -5
- package/dist/ipn/index.d.cts +12 -1
- package/dist/ipn/index.d.ts +12 -1
- package/dist/ipn/index.js +26 -6
- package/dist/{issue-AGRohSm7.cjs → issue-Bin4tKD_.cjs} +416 -342
- package/dist/{issue-DtSLpVdJ.js → issue-DMA1Nbr1.js} +394 -266
- package/dist/journal/index.cjs +454 -0
- package/dist/journal/index.d.cts +18 -0
- package/dist/journal/index.d.ts +18 -0
- package/dist/journal/index.js +445 -0
- package/dist/journal-DvI81Kt7.d.cts +114 -0
- package/dist/journal-Y9qrIB8G.d.ts +114 -0
- package/dist/mcp/index.cjs +1 -1
- package/dist/mcp/index.d.cts +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.js +1 -1
- package/dist/money/index.cjs +2 -1
- package/dist/money/index.d.cts +2 -2
- package/dist/money/index.d.ts +2 -2
- package/dist/money/index.js +2 -2
- package/dist/{money-t7uy1n91.js → money-Cw457SD6.js} +95 -3
- package/dist/{money-BxytJW6f.cjs → money-K9j0wPit.cjs} +99 -1
- package/dist/nav/index.cjs +2 -2
- package/dist/nav/index.d.cts +1 -1
- package/dist/nav/index.d.ts +1 -1
- package/dist/nav/index.js +2 -2
- package/dist/{nav-BEwcX7-N.cjs → nav-BNbc8U0R.cjs} +1 -1
- package/dist/{nav-CK1WgYo7.js → nav-BcCerwWS.js} +1 -1
- package/dist/node/index.cjs +124 -0
- package/dist/node/index.d.cts +35 -0
- package/dist/node/index.d.ts +35 -0
- package/dist/node/index.js +120 -0
- package/dist/observe/index.cjs +311 -0
- package/dist/observe/index.d.cts +53 -0
- package/dist/observe/index.d.ts +53 -0
- package/dist/observe/index.js +303 -0
- package/dist/once-BN_3B5OF.cjs +103 -0
- package/dist/once-CqqZxsXG.js +74 -0
- package/dist/{parse-C608ehqM.js → parse-Cr7yQ3_z.js} +2 -2
- package/dist/{parse-BJj-aqKy.cjs → parse-DOA2XQ3e.cjs} +2 -2
- package/dist/payments/barion.cjs +26 -2
- package/dist/payments/barion.d.cts +2 -2
- package/dist/payments/barion.d.ts +2 -2
- package/dist/payments/barion.js +26 -2
- package/dist/payments/index.cjs +7 -2
- package/dist/payments/index.d.cts +4 -4
- package/dist/payments/index.d.ts +4 -4
- package/dist/payments/index.js +3 -3
- package/dist/payments/paypal.cjs +16 -2
- package/dist/payments/paypal.d.cts +2 -2
- package/dist/payments/paypal.d.ts +2 -2
- package/dist/payments/paypal.js +16 -2
- package/dist/payments/revolut.cjs +16 -2
- package/dist/payments/revolut.d.cts +2 -2
- package/dist/payments/revolut.d.ts +2 -2
- package/dist/payments/revolut.js +16 -2
- package/dist/payments/simplepay.cjs +36 -4
- package/dist/payments/simplepay.d.cts +2 -2
- package/dist/payments/simplepay.d.ts +2 -2
- package/dist/payments/simplepay.js +36 -4
- package/dist/payments/stripe.cjs +19 -2
- package/dist/payments/stripe.d.cts +2 -2
- package/dist/payments/stripe.d.ts +2 -2
- package/dist/payments/stripe.js +19 -2
- package/dist/push-BXj0Sf0Z.d.ts +52 -0
- package/dist/push-D4nNbCNV.d.cts +52 -0
- package/dist/reference-B5TATqb5.js +124 -0
- package/dist/reference-BIdYMK0t.cjs +183 -0
- package/dist/reports/index.cjs +1 -1
- package/dist/reports/index.d.cts +1 -1
- package/dist/reports/index.d.ts +1 -1
- package/dist/reports/index.js +1 -1
- package/dist/{serialize-DSE_o9RK.js → serialize-B2eFh3D-.js} +5 -1
- package/dist/{serialize-BXOww1Uq.cjs → serialize-CquIsxA-.cjs} +5 -1
- package/dist/{server-Cd8HB661.js → server-BrJUbXs7.js} +8 -7
- package/dist/{server-C6PoNkdD.cjs → server-Dw9j8Mnd.cjs} +17 -16
- package/dist/session-Ckl5eJhV.d.ts +7 -0
- package/dist/{session-CKOuE6Jc.cjs → session-DeM5vjvC.cjs} +69 -13
- package/dist/{session-rMKaJcmq.js → session-SaEEXu2N.js} +58 -14
- package/dist/session-YbChChx7.d.cts +7 -0
- package/dist/storage/fs.cjs +1 -1
- package/dist/storage/fs.js +1 -1
- package/dist/storage/index.cjs +1 -1
- package/dist/storage/index.js +1 -1
- package/dist/store-C1rHd9DB.d.cts +19 -0
- package/dist/store-C1rHd9DB.d.ts +19 -0
- package/dist/stores/index.cjs +24 -0
- package/dist/stores/index.d.cts +4 -0
- package/dist/stores/index.d.ts +4 -0
- package/dist/stores/index.js +3 -0
- package/dist/stores-BNrS0dWl.cjs +506 -0
- package/dist/stores-DhjGBrl_.js +441 -0
- package/dist/testing/index.cjs +28 -16
- package/dist/testing/index.d.cts +6 -3
- package/dist/testing/index.d.ts +6 -3
- package/dist/testing/index.js +26 -14
- package/dist/{types-BVeR7KyU.d.ts → types-B1A8mUIE.d.cts} +13 -1
- package/dist/{types-BVeR7KyU.d.cts → types-ByAEvGsZ.d.ts} +13 -1
- package/dist/{types-k--zHf4l.d.ts → types-D1zDOH_F.d.ts} +1 -1
- package/dist/{types-DH8QoNZK.d.cts → types-lnKkQdot.d.cts} +1 -1
- package/dist/warnings-B3DXnveC.d.cts +31 -0
- package/dist/warnings-B3DXnveC.d.ts +31 -0
- package/dist/warnings-DeIw5RFj.cjs +20 -0
- package/dist/warnings-DwTl5J-2.js +15 -0
- package/dist/{webhook-CrEGohbg.js → webhook-CQVShAfI.js} +44 -1
- package/dist/{webhook-81giRMdQ.cjs → webhook-Ckj-_hPD.cjs} +67 -0
- package/dist/webhook-CmdhGiH5.d.cts +11 -0
- package/dist/webhook-D6lEejob.d.ts +11 -0
- package/llms.txt +4 -3
- package/package.json +92 -4
- package/dist/session-Dm_45x8K.d.cts +0 -11
- package/dist/session-Dm_45x8K.d.ts +0 -11
- package/dist/webhook-CpCMHhn2.d.ts +0 -6
- package/dist/webhook-CpMJuP6c.d.cts +0 -6
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const require_crypto = require("../crypto-Dpn4FHQ6.cjs");
|
|
3
|
+
//#region src/observe/metrics.ts
|
|
4
|
+
const DEFAULT_DURATION_BUCKETS_MS = [
|
|
5
|
+
50,
|
|
6
|
+
100,
|
|
7
|
+
250,
|
|
8
|
+
500,
|
|
9
|
+
1e3,
|
|
10
|
+
2500,
|
|
11
|
+
5e3,
|
|
12
|
+
1e4,
|
|
13
|
+
3e4,
|
|
14
|
+
6e4
|
|
15
|
+
];
|
|
16
|
+
const METRIC_HELP = {
|
|
17
|
+
kassza_requests_total: "Számla Agent próbálkozások száma kimenet szerint",
|
|
18
|
+
kassza_request_duration_ms: "Számla Agent próbálkozások időtartama ezredmásodpercben",
|
|
19
|
+
kassza_retries_total: "Automatikus újrapróbálások száma",
|
|
20
|
+
kassza_maintenance_total: "Karbantartás (1-es hiba) miatt elbukott kérések",
|
|
21
|
+
kassza_unexpected_response_total: "Ismeretlen formátumú Számlázz.hu válaszok",
|
|
22
|
+
kassza_store_errors_total: "Tároló (session, napló, zár, gyorsítótár) hibái",
|
|
23
|
+
kassza_warnings_total: "Figyelmeztetések fajta szerint",
|
|
24
|
+
kassza_documents_total: "Kiállított bizonylatok fajta és művelet szerint"
|
|
25
|
+
};
|
|
26
|
+
const NAME_PATTERN = /^[a-zA-Z_:][a-zA-Z0-9_:]*$/;
|
|
27
|
+
const LABEL_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
28
|
+
function escapeLabel(value) {
|
|
29
|
+
return value.replace(/\\/g, "\\\\").replace(/\n/g, "\\n").replace(/"/g, "\\\"");
|
|
30
|
+
}
|
|
31
|
+
function labelKey(labels) {
|
|
32
|
+
const entries = Object.entries(labels ?? {}).sort(([a], [b]) => a.localeCompare(b));
|
|
33
|
+
for (const [name] of entries) if (!LABEL_PATTERN.test(name)) throw new TypeError(`Érvénytelen metrika-címke: ${name}`);
|
|
34
|
+
return entries.map(([name, value]) => `${name}="${escapeLabel(value)}"`).join(",");
|
|
35
|
+
}
|
|
36
|
+
function assertName(name) {
|
|
37
|
+
if (!NAME_PATTERN.test(name)) throw new TypeError(`Érvénytelen metrikanév: ${name}`);
|
|
38
|
+
}
|
|
39
|
+
function series(name, key, extra) {
|
|
40
|
+
const labels = [key, extra].filter(Boolean).join(",");
|
|
41
|
+
return labels ? `${name}{${labels}}` : name;
|
|
42
|
+
}
|
|
43
|
+
function formatNumber(value) {
|
|
44
|
+
if (value === Number.POSITIVE_INFINITY) return "+Inf";
|
|
45
|
+
return String(value);
|
|
46
|
+
}
|
|
47
|
+
function createMetricsRegistry(buckets = DEFAULT_DURATION_BUCKETS_MS) {
|
|
48
|
+
const sorted = [...buckets].sort((a, b) => a - b);
|
|
49
|
+
if (sorted.some((bucket) => !Number.isFinite(bucket))) throw new TypeError("A hisztogram határai véges számok legyenek.");
|
|
50
|
+
const counters = /* @__PURE__ */ new Map();
|
|
51
|
+
const histograms = /* @__PURE__ */ new Map();
|
|
52
|
+
return {
|
|
53
|
+
counter(name, labels, value = 1) {
|
|
54
|
+
assertName(name);
|
|
55
|
+
if (!Number.isFinite(value) || value < 0) throw new TypeError(`A számláló csak nemnegatív értékkel nőhet, kapott: ${value}`);
|
|
56
|
+
const byLabels = counters.get(name) ?? /* @__PURE__ */ new Map();
|
|
57
|
+
const key = labelKey(labels);
|
|
58
|
+
byLabels.set(key, (byLabels.get(key) ?? 0) + value);
|
|
59
|
+
counters.set(name, byLabels);
|
|
60
|
+
},
|
|
61
|
+
histogram(name, value, labels) {
|
|
62
|
+
assertName(name);
|
|
63
|
+
if (!Number.isFinite(value)) throw new TypeError(`A hisztogram értéke véges szám legyen.`);
|
|
64
|
+
const byLabels = histograms.get(name) ?? /* @__PURE__ */ new Map();
|
|
65
|
+
const key = labelKey(labels);
|
|
66
|
+
const histogram = byLabels.get(key) ?? {
|
|
67
|
+
buckets: sorted.map(() => 0),
|
|
68
|
+
sum: 0,
|
|
69
|
+
count: 0
|
|
70
|
+
};
|
|
71
|
+
sorted.forEach((bound, index) => {
|
|
72
|
+
if (value <= bound) histogram.buckets[index] = (histogram.buckets[index] ?? 0) + 1;
|
|
73
|
+
});
|
|
74
|
+
histogram.sum += value;
|
|
75
|
+
histogram.count += 1;
|
|
76
|
+
byLabels.set(key, histogram);
|
|
77
|
+
histograms.set(name, byLabels);
|
|
78
|
+
},
|
|
79
|
+
renderPrometheus() {
|
|
80
|
+
const lines = [];
|
|
81
|
+
for (const name of [...counters.keys()].sort()) {
|
|
82
|
+
const help = METRIC_HELP[name];
|
|
83
|
+
if (help) lines.push(`# HELP ${name} ${help}`);
|
|
84
|
+
lines.push(`# TYPE ${name} counter`);
|
|
85
|
+
for (const [key, value] of [...counters.get(name) ?? []].sort()) lines.push(`${series(name, key)} ${formatNumber(value)}`);
|
|
86
|
+
}
|
|
87
|
+
for (const name of [...histograms.keys()].sort()) {
|
|
88
|
+
const help = METRIC_HELP[name];
|
|
89
|
+
if (help) lines.push(`# HELP ${name} ${help}`);
|
|
90
|
+
lines.push(`# TYPE ${name} histogram`);
|
|
91
|
+
for (const [key, histogram] of [...histograms.get(name) ?? []].sort()) {
|
|
92
|
+
sorted.forEach((bound, index) => {
|
|
93
|
+
lines.push(`${series(`${name}_bucket`, key, `le="${formatNumber(bound)}"`)} ${histogram.buckets[index] ?? 0}`);
|
|
94
|
+
});
|
|
95
|
+
lines.push(`${series(`${name}_bucket`, key, "le=\"+Inf\"")} ${histogram.count}`);
|
|
96
|
+
lines.push(`${series(`${name}_sum`, key)} ${formatNumber(histogram.sum)}`);
|
|
97
|
+
lines.push(`${series(`${name}_count`, key)} ${histogram.count}`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return lines.length > 0 ? `${lines.join("\n")}\n` : "";
|
|
101
|
+
},
|
|
102
|
+
reset() {
|
|
103
|
+
counters.clear();
|
|
104
|
+
histograms.clear();
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//#endregion
|
|
109
|
+
//#region src/observe/observe.ts
|
|
110
|
+
const SPAN_STATUS_OK = 1;
|
|
111
|
+
const SPAN_STATUS_ERROR = 2;
|
|
112
|
+
const MAX_OPEN_SPANS = 1e3;
|
|
113
|
+
const STORE_WARNINGS = /* @__PURE__ */ new Set([
|
|
114
|
+
"session",
|
|
115
|
+
"ledger",
|
|
116
|
+
"lock",
|
|
117
|
+
"dedupe",
|
|
118
|
+
"cache"
|
|
119
|
+
]);
|
|
120
|
+
function randomSalt() {
|
|
121
|
+
return Array.from(crypto.getRandomValues(/* @__PURE__ */ new Uint8Array(16)), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
122
|
+
}
|
|
123
|
+
function safely(run) {
|
|
124
|
+
try {
|
|
125
|
+
run();
|
|
126
|
+
} catch {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function orderNumberOf(event) {
|
|
131
|
+
if (event.kind === "receipt") return event.document.orderNumber;
|
|
132
|
+
if (event.action === "created") return event.input.orderNumber?.trim() || void 0;
|
|
133
|
+
}
|
|
134
|
+
function spanKey(event) {
|
|
135
|
+
return `${event.requestId}:${event.attempt}`;
|
|
136
|
+
}
|
|
137
|
+
function observe(options = {}) {
|
|
138
|
+
const { logger, tracer, metrics } = options;
|
|
139
|
+
const redact = options.redact !== false;
|
|
140
|
+
const salt = options.orderRefSalt ?? randomSalt();
|
|
141
|
+
const spans = /* @__PURE__ */ new Map();
|
|
142
|
+
async function orderRef(orderNumber) {
|
|
143
|
+
if (orderNumber === void 0) return void 0;
|
|
144
|
+
if (!redact) return orderNumber;
|
|
145
|
+
return `hmac:${(await require_crypto.hmacHex("SHA-256", salt, orderNumber)).slice(0, 16)}`;
|
|
146
|
+
}
|
|
147
|
+
const onRequest = (event) => {
|
|
148
|
+
if (tracer) safely(() => {
|
|
149
|
+
if (spans.size >= 1e3) {
|
|
150
|
+
const oldest = spans.keys().next().value;
|
|
151
|
+
if (oldest !== void 0) {
|
|
152
|
+
spans.get(oldest)?.end();
|
|
153
|
+
spans.delete(oldest);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
spans.set(spanKey(event), tracer.startSpan(`kassza ${event.action}`, { attributes: {
|
|
157
|
+
"kassza.action": event.action,
|
|
158
|
+
"kassza.attempt": event.attempt,
|
|
159
|
+
"kassza.request_id": event.requestId
|
|
160
|
+
} }));
|
|
161
|
+
});
|
|
162
|
+
if (options.logRequests === true) safely(() => logger?.debug?.({
|
|
163
|
+
event: "kassza.request.start",
|
|
164
|
+
...event
|
|
165
|
+
}, `kassza: ${event.action} kérés indul`));
|
|
166
|
+
};
|
|
167
|
+
const onResponse = (event) => {
|
|
168
|
+
const span = spans.get(spanKey(event));
|
|
169
|
+
if (!span) return;
|
|
170
|
+
safely(() => {
|
|
171
|
+
span.setAttribute("http.status_code", event.status);
|
|
172
|
+
span.setAttribute("kassza.response_bytes", event.responseBytes);
|
|
173
|
+
span.setAttribute("kassza.session_reused", event.sessionReused);
|
|
174
|
+
});
|
|
175
|
+
};
|
|
176
|
+
const onComplete = (event) => {
|
|
177
|
+
const key = spanKey(event);
|
|
178
|
+
const span = spans.get(key);
|
|
179
|
+
spans.delete(key);
|
|
180
|
+
const category = event.error?.category;
|
|
181
|
+
const code = event.error?.code;
|
|
182
|
+
if (span) safely(() => {
|
|
183
|
+
if (category) span.setAttribute("kassza.error.category", category);
|
|
184
|
+
if (code !== void 0) span.setAttribute("kassza.error.code", code);
|
|
185
|
+
if (event.error) {
|
|
186
|
+
span.recordException(event.error);
|
|
187
|
+
span.setStatus({
|
|
188
|
+
code: 2,
|
|
189
|
+
message: event.error.message
|
|
190
|
+
});
|
|
191
|
+
} else if (event.outcome === "error") span.setStatus({ code: 2 });
|
|
192
|
+
else span.setStatus({ code: 1 });
|
|
193
|
+
span.end();
|
|
194
|
+
});
|
|
195
|
+
if (metrics) safely(() => {
|
|
196
|
+
metrics.counter("kassza_requests_total", {
|
|
197
|
+
action: event.action,
|
|
198
|
+
outcome: event.outcome === "success" ? "success" : category ?? "error"
|
|
199
|
+
});
|
|
200
|
+
metrics.histogram("kassza_request_duration_ms", event.durationMs, { action: event.action });
|
|
201
|
+
if (event.willRetry) metrics.counter("kassza_retries_total", { action: event.action });
|
|
202
|
+
if (category === "maintenance") metrics.counter("kassza_maintenance_total");
|
|
203
|
+
if (category === "unexpected_response") metrics.counter("kassza_unexpected_response_total", { action: event.action });
|
|
204
|
+
});
|
|
205
|
+
const data = {
|
|
206
|
+
event: "kassza.request",
|
|
207
|
+
action: event.action,
|
|
208
|
+
attempt: event.attempt,
|
|
209
|
+
requestId: event.requestId,
|
|
210
|
+
outcome: event.outcome,
|
|
211
|
+
durationMs: event.durationMs,
|
|
212
|
+
willRetry: event.willRetry,
|
|
213
|
+
...category ? { errorCategory: category } : {},
|
|
214
|
+
...code === void 0 ? {} : { errorCode: code }
|
|
215
|
+
};
|
|
216
|
+
safely(() => {
|
|
217
|
+
if (event.outcome === "success") logger?.info?.(data, `kassza: ${event.action} sikeres (${event.durationMs} ms)`);
|
|
218
|
+
else logger?.warn?.(data, `kassza: ${event.action} sikertelen${category ? ` (${category})` : ""}${event.willRetry ? ", újrapróbálás" : ""}`);
|
|
219
|
+
});
|
|
220
|
+
};
|
|
221
|
+
const onWarning = (warning) => {
|
|
222
|
+
safely(() => {
|
|
223
|
+
metrics?.counter("kassza_warnings_total", { kind: warning.kind });
|
|
224
|
+
if (STORE_WARNINGS.has(warning.kind)) metrics?.counter("kassza_store_errors_total", { store: warning.kind });
|
|
225
|
+
});
|
|
226
|
+
safely(() => logger?.warn?.({
|
|
227
|
+
event: "kassza.warning",
|
|
228
|
+
kind: warning.kind,
|
|
229
|
+
...warning.action ? { action: warning.action } : {},
|
|
230
|
+
...warning.operation ? { operation: warning.operation } : {},
|
|
231
|
+
error: warning.error instanceof Error ? warning.error.message : String(warning.error)
|
|
232
|
+
}, warning.message));
|
|
233
|
+
};
|
|
234
|
+
const onDocument = async (event) => {
|
|
235
|
+
safely(() => metrics?.counter("kassza_documents_total", {
|
|
236
|
+
kind: event.kind,
|
|
237
|
+
action: event.action
|
|
238
|
+
}));
|
|
239
|
+
if (!logger?.info) return;
|
|
240
|
+
try {
|
|
241
|
+
const ref = await orderRef(orderNumberOf(event));
|
|
242
|
+
logger.info({
|
|
243
|
+
event: "kassza.document",
|
|
244
|
+
kind: event.kind,
|
|
245
|
+
action: event.action,
|
|
246
|
+
number: event.number,
|
|
247
|
+
...ref === void 0 ? {} : { orderRef: ref }
|
|
248
|
+
}, `kassza: ${event.kind} ${event.action} ${event.number}`);
|
|
249
|
+
} catch {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
return {
|
|
254
|
+
onRequest,
|
|
255
|
+
onResponse,
|
|
256
|
+
onComplete,
|
|
257
|
+
onWarning,
|
|
258
|
+
onDocument
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
const SYNC_HOOKS = [
|
|
262
|
+
"onRequest",
|
|
263
|
+
"onResponse",
|
|
264
|
+
"onError",
|
|
265
|
+
"onComplete",
|
|
266
|
+
"onWarning"
|
|
267
|
+
];
|
|
268
|
+
function combineSync(hooks, name) {
|
|
269
|
+
const handlers = hooks.map((hook) => hook[name]).filter((handler) => handler !== void 0);
|
|
270
|
+
if (handlers.length === 0) return void 0;
|
|
271
|
+
return (event) => {
|
|
272
|
+
let failure;
|
|
273
|
+
for (const handler of handlers) try {
|
|
274
|
+
const result = handler(event);
|
|
275
|
+
if (result instanceof Promise) result.catch(() => void 0);
|
|
276
|
+
} catch (error) {
|
|
277
|
+
failure ??= { error };
|
|
278
|
+
}
|
|
279
|
+
if (failure) throw failure.error;
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
function combineHooks(...hooks) {
|
|
283
|
+
const present = hooks.filter((hook) => hook !== void 0);
|
|
284
|
+
const combined = {};
|
|
285
|
+
for (const name of SYNC_HOOKS) {
|
|
286
|
+
const handler = combineSync(present, name);
|
|
287
|
+
if (handler) combined[name] = handler;
|
|
288
|
+
}
|
|
289
|
+
const documentHooks = present.map((hook) => hook.onDocument).filter((hook) => hook !== void 0);
|
|
290
|
+
if (documentHooks.length > 0) combined.onDocument = async (event) => {
|
|
291
|
+
let failure;
|
|
292
|
+
for (const hook of documentHooks) try {
|
|
293
|
+
await hook(event);
|
|
294
|
+
} catch (error) {
|
|
295
|
+
failure ??= { error };
|
|
296
|
+
}
|
|
297
|
+
if (failure) throw failure.error;
|
|
298
|
+
};
|
|
299
|
+
const mode = present.map((hook) => hook.onDocumentError).findLast((value) => value !== void 0);
|
|
300
|
+
if (mode !== void 0) combined.onDocumentError = mode;
|
|
301
|
+
return combined;
|
|
302
|
+
}
|
|
303
|
+
//#endregion
|
|
304
|
+
exports.DEFAULT_DURATION_BUCKETS_MS = DEFAULT_DURATION_BUCKETS_MS;
|
|
305
|
+
exports.MAX_OPEN_SPANS = MAX_OPEN_SPANS;
|
|
306
|
+
exports.METRIC_HELP = METRIC_HELP;
|
|
307
|
+
exports.SPAN_STATUS_ERROR = SPAN_STATUS_ERROR;
|
|
308
|
+
exports.SPAN_STATUS_OK = SPAN_STATUS_OK;
|
|
309
|
+
exports.combineHooks = combineHooks;
|
|
310
|
+
exports.createMetricsRegistry = createMetricsRegistry;
|
|
311
|
+
exports.observe = observe;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { c as SzamlazzHooks } from "../context-CFNKzStE.cjs";
|
|
2
|
+
//#region src/observe/metrics.d.ts
|
|
3
|
+
type MetricLabels = Readonly<Record<string, string>>;
|
|
4
|
+
interface Metrics {
|
|
5
|
+
counter(name: string, labels?: MetricLabels, value?: number): void;
|
|
6
|
+
histogram(name: string, value: number, labels?: MetricLabels): void;
|
|
7
|
+
}
|
|
8
|
+
interface MetricsRegistry extends Metrics {
|
|
9
|
+
renderPrometheus(): string;
|
|
10
|
+
reset(): void;
|
|
11
|
+
}
|
|
12
|
+
export declare const DEFAULT_DURATION_BUCKETS_MS: readonly number[];
|
|
13
|
+
export declare const METRIC_HELP: Readonly<Record<string, string>>;
|
|
14
|
+
export declare function createMetricsRegistry(buckets?: readonly number[]): MetricsRegistry;
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region src/observe/observe.d.ts
|
|
17
|
+
type LogMethod = (data: Readonly<Record<string, unknown>>, message: string) => void;
|
|
18
|
+
interface ObserveLogger {
|
|
19
|
+
readonly debug?: LogMethod | undefined;
|
|
20
|
+
readonly info?: LogMethod | undefined;
|
|
21
|
+
readonly warn?: LogMethod | undefined;
|
|
22
|
+
readonly error?: LogMethod | undefined;
|
|
23
|
+
}
|
|
24
|
+
type SpanAttributeValue = string | number | boolean;
|
|
25
|
+
interface ObserveSpan {
|
|
26
|
+
setAttribute(key: string, value: SpanAttributeValue): unknown;
|
|
27
|
+
setStatus(status: {
|
|
28
|
+
readonly code: number;
|
|
29
|
+
readonly message?: string;
|
|
30
|
+
}): unknown;
|
|
31
|
+
recordException(exception: unknown): unknown;
|
|
32
|
+
end(): unknown;
|
|
33
|
+
}
|
|
34
|
+
interface ObserveTracer {
|
|
35
|
+
startSpan(name: string, options?: {
|
|
36
|
+
readonly attributes?: Readonly<Record<string, SpanAttributeValue>>;
|
|
37
|
+
}): ObserveSpan;
|
|
38
|
+
}
|
|
39
|
+
interface ObserveOptions {
|
|
40
|
+
readonly logger?: ObserveLogger | undefined;
|
|
41
|
+
readonly tracer?: ObserveTracer | undefined;
|
|
42
|
+
readonly metrics?: Metrics | undefined;
|
|
43
|
+
readonly redact?: boolean | undefined;
|
|
44
|
+
readonly orderRefSalt?: string | undefined;
|
|
45
|
+
readonly logRequests?: boolean | undefined;
|
|
46
|
+
}
|
|
47
|
+
export declare const SPAN_STATUS_OK = 1;
|
|
48
|
+
export declare const SPAN_STATUS_ERROR = 2;
|
|
49
|
+
export declare const MAX_OPEN_SPANS = 1e3;
|
|
50
|
+
export declare function observe(options?: ObserveOptions): SzamlazzHooks;
|
|
51
|
+
export declare function combineHooks(...hooks: readonly (SzamlazzHooks | undefined)[]): SzamlazzHooks;
|
|
52
|
+
//#endregion
|
|
53
|
+
export type { LogMethod, MetricLabels, Metrics, MetricsRegistry, ObserveLogger, ObserveOptions, ObserveSpan, ObserveTracer, SpanAttributeValue };
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { c as SzamlazzHooks } from "../context-kb33TgzE.js";
|
|
2
|
+
//#region src/observe/metrics.d.ts
|
|
3
|
+
type MetricLabels = Readonly<Record<string, string>>;
|
|
4
|
+
interface Metrics {
|
|
5
|
+
counter(name: string, labels?: MetricLabels, value?: number): void;
|
|
6
|
+
histogram(name: string, value: number, labels?: MetricLabels): void;
|
|
7
|
+
}
|
|
8
|
+
interface MetricsRegistry extends Metrics {
|
|
9
|
+
renderPrometheus(): string;
|
|
10
|
+
reset(): void;
|
|
11
|
+
}
|
|
12
|
+
export declare const DEFAULT_DURATION_BUCKETS_MS: readonly number[];
|
|
13
|
+
export declare const METRIC_HELP: Readonly<Record<string, string>>;
|
|
14
|
+
export declare function createMetricsRegistry(buckets?: readonly number[]): MetricsRegistry;
|
|
15
|
+
//#endregion
|
|
16
|
+
//#region src/observe/observe.d.ts
|
|
17
|
+
type LogMethod = (data: Readonly<Record<string, unknown>>, message: string) => void;
|
|
18
|
+
interface ObserveLogger {
|
|
19
|
+
readonly debug?: LogMethod | undefined;
|
|
20
|
+
readonly info?: LogMethod | undefined;
|
|
21
|
+
readonly warn?: LogMethod | undefined;
|
|
22
|
+
readonly error?: LogMethod | undefined;
|
|
23
|
+
}
|
|
24
|
+
type SpanAttributeValue = string | number | boolean;
|
|
25
|
+
interface ObserveSpan {
|
|
26
|
+
setAttribute(key: string, value: SpanAttributeValue): unknown;
|
|
27
|
+
setStatus(status: {
|
|
28
|
+
readonly code: number;
|
|
29
|
+
readonly message?: string;
|
|
30
|
+
}): unknown;
|
|
31
|
+
recordException(exception: unknown): unknown;
|
|
32
|
+
end(): unknown;
|
|
33
|
+
}
|
|
34
|
+
interface ObserveTracer {
|
|
35
|
+
startSpan(name: string, options?: {
|
|
36
|
+
readonly attributes?: Readonly<Record<string, SpanAttributeValue>>;
|
|
37
|
+
}): ObserveSpan;
|
|
38
|
+
}
|
|
39
|
+
interface ObserveOptions {
|
|
40
|
+
readonly logger?: ObserveLogger | undefined;
|
|
41
|
+
readonly tracer?: ObserveTracer | undefined;
|
|
42
|
+
readonly metrics?: Metrics | undefined;
|
|
43
|
+
readonly redact?: boolean | undefined;
|
|
44
|
+
readonly orderRefSalt?: string | undefined;
|
|
45
|
+
readonly logRequests?: boolean | undefined;
|
|
46
|
+
}
|
|
47
|
+
export declare const SPAN_STATUS_OK = 1;
|
|
48
|
+
export declare const SPAN_STATUS_ERROR = 2;
|
|
49
|
+
export declare const MAX_OPEN_SPANS = 1e3;
|
|
50
|
+
export declare function observe(options?: ObserveOptions): SzamlazzHooks;
|
|
51
|
+
export declare function combineHooks(...hooks: readonly (SzamlazzHooks | undefined)[]): SzamlazzHooks;
|
|
52
|
+
//#endregion
|
|
53
|
+
export type { LogMethod, MetricLabels, Metrics, MetricsRegistry, ObserveLogger, ObserveOptions, ObserveSpan, ObserveTracer, SpanAttributeValue };
|