@aforoai/metering 1.0.0 → 1.1.2
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 +37 -9
- package/dist/cjs/buffer.d.ts +7 -1
- package/dist/cjs/buffer.d.ts.map +1 -1
- package/dist/cjs/buffer.js +11 -3
- package/dist/cjs/buffer.js.map +1 -1
- package/dist/cjs/client.d.ts +27 -11
- package/dist/cjs/client.d.ts.map +1 -1
- package/dist/cjs/client.js +212 -55
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/idempotency.d.ts +9 -9
- package/dist/cjs/idempotency.js +9 -9
- package/dist/cjs/index.d.ts +8 -8
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +20 -19
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/limits.d.ts +47 -7
- package/dist/cjs/limits.d.ts.map +1 -1
- package/dist/cjs/limits.js +65 -10
- package/dist/cjs/limits.js.map +1 -1
- package/dist/cjs/middleware/common.d.ts +8 -2
- package/dist/cjs/middleware/common.d.ts.map +1 -1
- package/dist/cjs/middleware/common.js +12 -4
- package/dist/cjs/middleware/common.js.map +1 -1
- package/dist/cjs/middleware/express.d.ts +1 -1
- package/dist/cjs/middleware/express.d.ts.map +1 -1
- package/dist/cjs/middleware/express.js +8 -8
- package/dist/cjs/middleware/express.js.map +1 -1
- package/dist/cjs/middleware/fastify.d.ts +1 -1
- package/dist/cjs/middleware/fastify.d.ts.map +1 -1
- package/dist/cjs/middleware/fastify.js +8 -8
- package/dist/cjs/middleware/fastify.js.map +1 -1
- package/dist/cjs/middleware/koa.d.ts +1 -1
- package/dist/cjs/middleware/koa.d.ts.map +1 -1
- package/dist/cjs/middleware/koa.js +8 -8
- package/dist/cjs/middleware/koa.js.map +1 -1
- package/dist/cjs/transport.d.ts +4 -2
- package/dist/cjs/transport.d.ts.map +1 -1
- package/dist/cjs/transport.js +75 -5
- package/dist/cjs/transport.js.map +1 -1
- package/dist/cjs/types.d.ts +53 -1
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/buffer.js +11 -3
- package/dist/esm/buffer.js.map +1 -1
- package/dist/esm/client.js +209 -52
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/idempotency.js +9 -9
- package/dist/esm/index.js +7 -7
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/limits.js +62 -10
- package/dist/esm/limits.js.map +1 -1
- package/dist/esm/middleware/common.js +11 -4
- package/dist/esm/middleware/common.js.map +1 -1
- package/dist/esm/middleware/express.js +3 -3
- package/dist/esm/middleware/express.js.map +1 -1
- package/dist/esm/middleware/fastify.js +3 -3
- package/dist/esm/middleware/fastify.js.map +1 -1
- package/dist/esm/middleware/koa.js +3 -3
- package/dist/esm/middleware/koa.js.map +1 -1
- package/dist/esm/package.json +1 -0
- package/dist/esm/transport.js +75 -5
- package/dist/esm/transport.js.map +1 -1
- package/dist/types/buffer.d.ts +7 -1
- package/dist/types/buffer.d.ts.map +1 -1
- package/dist/types/client.d.ts +27 -11
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/idempotency.d.ts +9 -9
- package/dist/types/index.d.ts +8 -8
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/limits.d.ts +47 -7
- package/dist/types/limits.d.ts.map +1 -1
- package/dist/types/middleware/common.d.ts +8 -2
- package/dist/types/middleware/common.d.ts.map +1 -1
- package/dist/types/middleware/express.d.ts +1 -1
- package/dist/types/middleware/express.d.ts.map +1 -1
- package/dist/types/middleware/fastify.d.ts +1 -1
- package/dist/types/middleware/fastify.d.ts.map +1 -1
- package/dist/types/middleware/koa.d.ts +1 -1
- package/dist/types/middleware/koa.d.ts.map +1 -1
- package/dist/types/transport.d.ts +4 -2
- package/dist/types/transport.d.ts.map +1 -1
- package/dist/types/types.d.ts +53 -1
- package/dist/types/types.d.ts.map +1 -1
- package/package.json +22 -6
package/dist/esm/client.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { RingBuffer } from './buffer';
|
|
2
|
-
import { Transport } from './transport';
|
|
3
|
-
import { generateRandomKey } from './idempotency';
|
|
4
|
-
import { describeLimitViolation } from './limits';
|
|
1
|
+
import { RingBuffer } from './buffer.js';
|
|
2
|
+
import { Transport } from './transport.js';
|
|
3
|
+
import { generateRandomKey } from './idempotency.js';
|
|
4
|
+
import { describeLimitViolation } from './limits.js';
|
|
5
5
|
const DEFAULT_BASE_URL = 'https://api.aforo.ai';
|
|
6
6
|
const DEFAULT_PRODUCT_TYPE = 'API';
|
|
7
7
|
const DEFAULT_SESSION_PRODUCT_TYPE = 'AI_AGENT';
|
|
@@ -34,6 +34,11 @@ const DEFAULT_SHUTDOWN_TIMEOUT = 5000;
|
|
|
34
34
|
*/
|
|
35
35
|
export class AforoClient {
|
|
36
36
|
constructor(options) {
|
|
37
|
+
// Drop accounting — events permanently lost (overflow eviction, failed
|
|
38
|
+
// batch, or an event that failed client-side validation)
|
|
39
|
+
this.dropped = 0;
|
|
40
|
+
this.overflowDrops = 0;
|
|
41
|
+
this.invalidDrops = 0;
|
|
37
42
|
this.flushTimer = null;
|
|
38
43
|
this.flushing = false;
|
|
39
44
|
this.closed = false;
|
|
@@ -49,6 +54,7 @@ export class AforoClient {
|
|
|
49
54
|
this.productType = normalizeProductType(options.productType) ?? DEFAULT_PRODUCT_TYPE;
|
|
50
55
|
this.flushInterval = options.flushInterval ?? DEFAULT_FLUSH_INTERVAL;
|
|
51
56
|
this.shutdownTimeoutMs = options.shutdownTimeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT;
|
|
57
|
+
this.onDrop = options.onDrop;
|
|
52
58
|
this.buffer = new RingBuffer(options.maxQueueSize ?? DEFAULT_MAX_QUEUE_SIZE);
|
|
53
59
|
this.transport = new Transport({
|
|
54
60
|
baseUrl: options.baseUrl ?? DEFAULT_BASE_URL,
|
|
@@ -65,12 +71,12 @@ export class AforoClient {
|
|
|
65
71
|
if (this.flushTimer && typeof this.flushTimer === 'object' && 'unref' in this.flushTimer) {
|
|
66
72
|
this.flushTimer.unref();
|
|
67
73
|
}
|
|
68
|
-
// Register graceful shutdown handlers
|
|
69
|
-
|
|
74
|
+
// Register graceful shutdown handlers (deregistered in shutdown())
|
|
75
|
+
this.signalHandler = () => {
|
|
70
76
|
this.shutdown().catch(() => { });
|
|
71
77
|
};
|
|
72
|
-
process.once('SIGTERM',
|
|
73
|
-
process.once('SIGINT',
|
|
78
|
+
process.once('SIGTERM', this.signalHandler);
|
|
79
|
+
process.once('SIGINT', this.signalHandler);
|
|
74
80
|
}
|
|
75
81
|
// ─── Session lifecycle with heartbeat ─────────────────────────────
|
|
76
82
|
/**
|
|
@@ -142,6 +148,8 @@ export class AforoClient {
|
|
|
142
148
|
sdkLanguage: 'node',
|
|
143
149
|
},
|
|
144
150
|
};
|
|
151
|
+
// Sent alone and outside the usage buffer; a failed heartbeat is not a
|
|
152
|
+
// usage drop, so it is never counted in droppedCount or handed to onDrop.
|
|
145
153
|
return this.transport.sendSingleBestEffort(heartbeat).then(() => undefined, () => undefined);
|
|
146
154
|
}
|
|
147
155
|
// ─── Event tracking ──────────────────────────────────────────────
|
|
@@ -150,54 +158,35 @@ export class AforoClient {
|
|
|
150
158
|
* Returns immediately — does not await HTTP.
|
|
151
159
|
* Triggers a flush if the buffer reaches flushCount.
|
|
152
160
|
*
|
|
153
|
-
* Throws
|
|
154
|
-
* or over-long `customerId` / `metricName` /
|
|
155
|
-
* that is not positive or carries more than
|
|
156
|
-
* places, an `occurredAt` that is not an
|
|
157
|
-
* capped field that is too long
|
|
158
|
-
*
|
|
159
|
-
*
|
|
160
|
-
*
|
|
161
|
-
*
|
|
162
|
-
* See `limits.ts` for the limits and where each one comes from.
|
|
161
|
+
* Throws only when the client is shut down. An event the ingestor would
|
|
162
|
+
* reject — a blank or over-long `customerId` / `metricName` /
|
|
163
|
+
* `idempotencyKey`, a `quantity` that is not positive or carries more than
|
|
164
|
+
* 14 integer digits / 6 decimal places, an `occurredAt` that is not an
|
|
165
|
+
* ISO-8601 instant, or any other capped field that is too long — is NOT
|
|
166
|
+
* buffered and NOT sent. It is counted in `droppedCount`, WARN-logged with
|
|
167
|
+
* the field, the limit and the offending value, and passed to the opt-in
|
|
168
|
+
* `onDrop` hook with reason `'invalid'`. Limits the server makes
|
|
169
|
+
* configurable (event age, clock skew, metadata size) are left to the
|
|
170
|
+
* server. See `limits.ts` for the limits and where each one comes from.
|
|
163
171
|
*/
|
|
164
172
|
async track(event) {
|
|
165
173
|
if (this.closed) {
|
|
166
174
|
throw new Error('AforoClient is shut down — cannot track new events');
|
|
167
175
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}
|
|
171
|
-
if (event.metricName === undefined || event.metricName === null || !String(event.metricName).trim()) {
|
|
172
|
-
throw new Error('metricName is required');
|
|
173
|
-
}
|
|
176
|
+
// A missing event object is reported as an invalid event, not a TypeError.
|
|
177
|
+
event = (event ?? {});
|
|
174
178
|
const occurredAt = resolveOccurredAt(event.occurredAt);
|
|
175
179
|
const quantity = event.quantity ?? 1;
|
|
176
|
-
if (typeof quantity !== 'number' || !Number.isFinite(quantity) || quantity <= 0) {
|
|
177
|
-
throw new Error('quantity must be a positive number (> 0)');
|
|
178
|
-
}
|
|
179
180
|
const productType = normalizeProductType(event.productType) ?? this.productType;
|
|
180
181
|
// Minted once, here, when the event is enqueued — never at flush/retry
|
|
181
182
|
// time, so a retried batch carries the same keys and the ingestor
|
|
182
183
|
// deduplicates it. A caller-supplied key is passed through verbatim;
|
|
183
|
-
// otherwise each event gets its own random UUID
|
|
184
|
-
// the event fields would make two
|
|
185
|
-
//
|
|
186
|
-
//
|
|
187
|
-
//
|
|
184
|
+
// otherwise each event gets its own random UUID (no caller key = dedup
|
|
185
|
+
// opt-out). A deterministic hash of the event fields would make two
|
|
186
|
+
// genuinely distinct events in the same millisecond collide, and the
|
|
187
|
+
// ingestor would silently drop the second. Minted before the validity
|
|
188
|
+
// check so a dropped event reaches onDrop with its key.
|
|
188
189
|
const idempotencyKey = event.idempotencyKey ?? generateRandomKey();
|
|
189
|
-
const violation = describeLimitViolation({
|
|
190
|
-
customerId: event.customerId,
|
|
191
|
-
metricName: event.metricName,
|
|
192
|
-
quantity,
|
|
193
|
-
idempotencyKey,
|
|
194
|
-
occurredAt,
|
|
195
|
-
productType,
|
|
196
|
-
endpointPath: event.endpointPath,
|
|
197
|
-
httpMethod: event.httpMethod,
|
|
198
|
-
});
|
|
199
|
-
if (violation)
|
|
200
|
-
throw new Error(violation);
|
|
201
190
|
const resolved = {
|
|
202
191
|
customerId: event.customerId,
|
|
203
192
|
metricName: event.metricName,
|
|
@@ -211,12 +200,76 @@ export class AforoClient {
|
|
|
211
200
|
...(event.statusCode !== undefined ? { statusCode: event.statusCode } : {}),
|
|
212
201
|
...(event.responseTimeMs !== undefined ? { responseTimeMs: event.responseTimeMs } : {}),
|
|
213
202
|
};
|
|
214
|
-
|
|
203
|
+
const executionStatus = normalizeExecutionStatus(event.executionStatus);
|
|
204
|
+
if (executionStatus) {
|
|
205
|
+
if (CANONICAL_EXECUTION_STATUSES.has(executionStatus)) {
|
|
206
|
+
resolved.executionStatus = executionStatus;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
// The ingestor rejects an event carrying an unknown status, so an
|
|
210
|
+
// unknown value is reported and the field omitted (the event still
|
|
211
|
+
// bills, at full weight) instead of losing the event.
|
|
212
|
+
warnUnknownExecutionStatus(executionStatus);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
const violation = describeInvalidEvent(event, resolved);
|
|
216
|
+
if (violation) {
|
|
217
|
+
// Not buffered, not sent, never thrown: an un-awaited rejected track()
|
|
218
|
+
// would crash the process on the hot path. Same shape as every other drop.
|
|
219
|
+
this.recordDrop([resolved], 'invalid', violation);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
this.enqueue(resolved);
|
|
215
223
|
// Trigger flush if buffer threshold reached
|
|
216
224
|
if (this.buffer.size >= this.flushCount) {
|
|
217
225
|
this.flush().catch(() => { });
|
|
218
226
|
}
|
|
219
227
|
}
|
|
228
|
+
/** Buffer an event; surface the evicted-oldest event if the push overflowed. */
|
|
229
|
+
enqueue(resolved) {
|
|
230
|
+
const evicted = this.buffer.pushEvict(resolved);
|
|
231
|
+
if (evicted) {
|
|
232
|
+
this.recordDrop([evicted], 'overflow');
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Account for permanently lost events: bump the counter, WARN-log, and
|
|
237
|
+
* invoke the opt-in onDrop hook. Overflow logs are throttled (first, then
|
|
238
|
+
* every 1000th eviction) so sustained overflow can't storm the log;
|
|
239
|
+
* failed-batch drops log every time (bounded by flush cadence).
|
|
240
|
+
*/
|
|
241
|
+
recordDrop(events, reason, detail) {
|
|
242
|
+
if (events.length === 0)
|
|
243
|
+
return;
|
|
244
|
+
this.dropped += events.length;
|
|
245
|
+
if (reason === 'invalid') {
|
|
246
|
+
// Throttled like overflow: a tight loop of bad events can't storm the log.
|
|
247
|
+
this.invalidDrops += events.length;
|
|
248
|
+
if (this.invalidDrops === 1 || this.invalidDrops % 1000 === 0) {
|
|
249
|
+
console.warn(`[aforo] Invalid event dropped — ${detail ?? 'failed validation'} ` +
|
|
250
|
+
`(${this.invalidDrops} invalid, ${this.dropped} total dropped). It was not sent.`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
else if (reason === 'overflow') {
|
|
254
|
+
this.overflowDrops += events.length;
|
|
255
|
+
if (this.overflowDrops === 1 || this.overflowDrops % 1000 === 0) {
|
|
256
|
+
console.warn(`[aforo] Buffer overflow: oldest event dropped (${this.dropped} total dropped). ` +
|
|
257
|
+
`Consider raising maxQueueSize or checking ingest connectivity.`);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
console.warn(`[aforo] Dropped ${events.length} event(s) — ${reason}` +
|
|
262
|
+
`${detail ? `: ${detail}` : ''} (${this.dropped} total dropped).`);
|
|
263
|
+
}
|
|
264
|
+
if (this.onDrop) {
|
|
265
|
+
try {
|
|
266
|
+
this.onDrop(events, reason);
|
|
267
|
+
}
|
|
268
|
+
catch {
|
|
269
|
+
// A hook bug must never break tracking/flushing.
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
220
273
|
/**
|
|
221
274
|
* Force-flush all buffered events to the ingestor.
|
|
222
275
|
* Safe to call concurrently — only one flush runs at a time.
|
|
@@ -245,6 +298,27 @@ export class AforoClient {
|
|
|
245
298
|
const result = await this.transport.send(batch);
|
|
246
299
|
totalSent += result.sent;
|
|
247
300
|
totalFailed += result.failed;
|
|
301
|
+
if (result.failed > 0) {
|
|
302
|
+
// The batch was already drained from the buffer — without this it
|
|
303
|
+
// vanishes silently. Surface it (counter + WARN + opt-in hook).
|
|
304
|
+
// A partially accepted batch drops only the events the server
|
|
305
|
+
// rejected: by index when the response names them; otherwise they are
|
|
306
|
+
// counted and logged but not handed to onDrop (which ones is unknown).
|
|
307
|
+
if (result.sent > 0 || result.rejected) {
|
|
308
|
+
if (result.rejected) {
|
|
309
|
+
const lost = result.rejected.map((r) => batch[r.index]).filter(Boolean);
|
|
310
|
+
this.recordDrop(lost, 'rejected', result.message);
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
this.dropped += result.failed;
|
|
314
|
+
console.warn(`[aforo] Ingestor rejected ${result.failed} of ${batch.length} event(s) in a batch` +
|
|
315
|
+
`${result.message ? `: ${result.message}` : ''} (${this.dropped} total dropped).`);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
else {
|
|
319
|
+
this.recordDrop(batch, result.reason ?? 'retry_exhausted', result.message);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
248
322
|
}
|
|
249
323
|
return { sent: totalSent, failed: totalFailed };
|
|
250
324
|
}
|
|
@@ -256,6 +330,10 @@ export class AforoClient {
|
|
|
256
330
|
if (this.closed)
|
|
257
331
|
return;
|
|
258
332
|
this.closed = true;
|
|
333
|
+
// Deregister signal handlers so repeated create/shutdown cycles don't
|
|
334
|
+
// accumulate process listeners (safe if already fired — once() removed it).
|
|
335
|
+
process.removeListener('SIGTERM', this.signalHandler);
|
|
336
|
+
process.removeListener('SIGINT', this.signalHandler);
|
|
259
337
|
// Stop session heartbeats
|
|
260
338
|
this.stopHeartbeatTimer();
|
|
261
339
|
// Clear periodic flush timer
|
|
@@ -263,16 +341,32 @@ export class AforoClient {
|
|
|
263
341
|
clearInterval(this.flushTimer);
|
|
264
342
|
this.flushTimer = null;
|
|
265
343
|
}
|
|
266
|
-
// Flush with timeout
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
344
|
+
// Flush with timeout. The escape-hatch timer MUST be cleared once the
|
|
345
|
+
// race settles — left dangling it holds the event loop open for up to
|
|
346
|
+
// shutdownTimeoutMs after a clean shutdown, delaying process exit in
|
|
347
|
+
// short-lived producers (CLIs, jobs, serverless handlers).
|
|
348
|
+
let escapeTimer;
|
|
349
|
+
try {
|
|
350
|
+
await Promise.race([
|
|
351
|
+
this.flush(),
|
|
352
|
+
new Promise((resolve) => {
|
|
353
|
+
escapeTimer = setTimeout(resolve, this.shutdownTimeoutMs);
|
|
354
|
+
}),
|
|
355
|
+
]);
|
|
356
|
+
}
|
|
357
|
+
finally {
|
|
358
|
+
if (escapeTimer)
|
|
359
|
+
clearTimeout(escapeTimer);
|
|
360
|
+
}
|
|
271
361
|
}
|
|
272
362
|
/** Number of events currently buffered. */
|
|
273
363
|
get bufferedCount() {
|
|
274
364
|
return this.buffer.size;
|
|
275
365
|
}
|
|
366
|
+
/** Total events permanently dropped (overflow, failed batches, server-rejected and invalid events) since creation. */
|
|
367
|
+
get droppedCount() {
|
|
368
|
+
return this.dropped;
|
|
369
|
+
}
|
|
276
370
|
/** Whether the client has been shut down. */
|
|
277
371
|
get isShutdown() {
|
|
278
372
|
return this.closed;
|
|
@@ -284,14 +378,77 @@ function normalizeProductType(value) {
|
|
|
284
378
|
const trimmed = String(value).trim();
|
|
285
379
|
return trimmed ? trimmed.toUpperCase() : undefined;
|
|
286
380
|
}
|
|
381
|
+
/** Shorten an offending value for a log line. */
|
|
382
|
+
function clip(value) {
|
|
383
|
+
return String(value).slice(0, 80);
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* First reason the ingestor would reject this event, or null when it is
|
|
387
|
+
* acceptable. Required fields and quantity sign first, then the size limits.
|
|
388
|
+
*/
|
|
389
|
+
function describeInvalidEvent(event, resolved) {
|
|
390
|
+
for (const field of ['customerId', 'metricName']) {
|
|
391
|
+
const value = event?.[field];
|
|
392
|
+
if (value === undefined || value === null || !String(value).trim()) {
|
|
393
|
+
return `${field} is required (got "${clip(value)}")`;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
const quantity = resolved.quantity;
|
|
397
|
+
if (typeof quantity !== 'number' || !Number.isFinite(quantity) || quantity <= 0) {
|
|
398
|
+
return `quantity must be a positive number (> 0), got "${clip(quantity)}"`;
|
|
399
|
+
}
|
|
400
|
+
if (typeof resolved.occurredAt !== 'string') {
|
|
401
|
+
return `occurredAt must be an ISO-8601 string or epoch milliseconds, got "${clip(resolved.occurredAt)}"`;
|
|
402
|
+
}
|
|
403
|
+
return describeLimitViolation({
|
|
404
|
+
customerId: resolved.customerId,
|
|
405
|
+
metricName: resolved.metricName,
|
|
406
|
+
quantity,
|
|
407
|
+
idempotencyKey: resolved.idempotencyKey,
|
|
408
|
+
occurredAt: resolved.occurredAt,
|
|
409
|
+
productType: resolved.productType,
|
|
410
|
+
endpointPath: resolved.endpointPath,
|
|
411
|
+
httpMethod: resolved.httpMethod,
|
|
412
|
+
});
|
|
413
|
+
}
|
|
287
414
|
function randomSuffix() {
|
|
288
415
|
return Math.random().toString(36).slice(2, 10);
|
|
289
416
|
}
|
|
290
417
|
function resolveOccurredAt(value) {
|
|
291
418
|
if (!value)
|
|
292
419
|
return new Date().toISOString();
|
|
293
|
-
if (typeof value === 'number')
|
|
294
|
-
|
|
420
|
+
if (typeof value === 'number') {
|
|
421
|
+
const date = new Date(value);
|
|
422
|
+
// An out-of-range epoch must not throw from track(); it is reported as invalid.
|
|
423
|
+
return Number.isNaN(date.getTime()) ? String(value) : date.toISOString();
|
|
424
|
+
}
|
|
295
425
|
return value;
|
|
296
426
|
}
|
|
427
|
+
/**
|
|
428
|
+
* Statuses the ingestor accepts (contract/ingest-contract.json, max 20 chars).
|
|
429
|
+
* Anything else would make it reject the event.
|
|
430
|
+
*/
|
|
431
|
+
const CANONICAL_EXECUTION_STATUSES = new Set([
|
|
432
|
+
'SUCCESS', 'PARTIAL', 'TIMEOUT', 'ERROR', 'VALIDATION_FAILED', 'FAILED',
|
|
433
|
+
'FAILURE', 'CANCELLED', 'PENDING', 'BLOCKED', 'HITL_REQUIRED',
|
|
434
|
+
]);
|
|
435
|
+
// Warn once per distinct bad value (bounded) so a misconfigured static status
|
|
436
|
+
// can't storm the log on every request.
|
|
437
|
+
const MAX_WARNED_STATUSES = 100;
|
|
438
|
+
const warnedStatuses = new Set();
|
|
439
|
+
function warnUnknownExecutionStatus(value) {
|
|
440
|
+
if (warnedStatuses.has(value))
|
|
441
|
+
return;
|
|
442
|
+
if (warnedStatuses.size < MAX_WARNED_STATUSES)
|
|
443
|
+
warnedStatuses.add(value);
|
|
444
|
+
console.warn(`[aforo] Unknown executionStatus "${value.slice(0, 40)}" — field omitted from the event. ` +
|
|
445
|
+
`Expected one of: ${[...CANONICAL_EXECUTION_STATUSES].join(', ')}.`);
|
|
446
|
+
}
|
|
447
|
+
/** Trim + upper-case; blank/absent → undefined (key omitted from the wire body). */
|
|
448
|
+
function normalizeExecutionStatus(value) {
|
|
449
|
+
if (typeof value !== 'string')
|
|
450
|
+
return undefined;
|
|
451
|
+
const trimmed = value.trim();
|
|
452
|
+
return trimmed ? trimmed.toUpperCase() : undefined;
|
|
453
|
+
}
|
|
297
454
|
//# sourceMappingURL=client.js.map
|
package/dist/esm/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/idempotency.js
CHANGED
|
@@ -5,21 +5,21 @@ import { createHash, randomUUID } from 'node:crypto';
|
|
|
5
5
|
*
|
|
6
6
|
* Formula: SHA256(customerId + metricName + quantity + occurredAt)
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
8
|
+
* WARNING - collapse hazard: two legitimately DISTINCT events with identical
|
|
9
|
+
* fields in the same timestamp instant produce the SAME key, so the second
|
|
10
|
+
* dedups away (silent under-billing). The SDK therefore no longer uses this
|
|
11
|
+
* as the automatic fallback for keyless track() calls (2026-07-05 - mirrors
|
|
12
|
+
* Aforo ingest's April 2026 H4 fix). Use it only when your events are
|
|
13
|
+
* guaranteed unique per (customer, metric, quantity, occurredAt).
|
|
14
14
|
*/
|
|
15
15
|
export function generateIdempotencyKey(customerId, metricName, quantity, occurredAt) {
|
|
16
16
|
const input = `${customerId}:${metricName}:${quantity}:${occurredAt}`;
|
|
17
17
|
return createHash('sha256').update(input).digest('hex').substring(0, 32);
|
|
18
18
|
}
|
|
19
19
|
/**
|
|
20
|
-
* Generate a random UUID
|
|
21
|
-
*
|
|
22
|
-
*
|
|
20
|
+
* Generate a random UUID key - the automatic fallback for keyless track()
|
|
21
|
+
* calls. No caller key = dedup opt-out: every call is a distinct event; the
|
|
22
|
+
* key is stamped once at enqueue so flush retries stay dedup-safe.
|
|
23
23
|
*/
|
|
24
24
|
export function generateRandomKey() {
|
|
25
25
|
return randomUUID();
|
package/dist/esm/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// Public API for @aforoai/metering
|
|
2
|
-
export { AforoClient } from './client';
|
|
3
|
-
export { expressMiddleware, middleware } from './middleware/express';
|
|
4
|
-
export { fastifyPlugin } from './middleware/fastify';
|
|
5
|
-
export { koaMiddleware } from './middleware/koa';
|
|
6
|
-
export { normalizePath } from './path-normalizer';
|
|
7
|
-
export { DEFAULT_METRIC_NAME } from './middleware/common';
|
|
8
|
-
export { MAX_LENGTHS, MAX_QUANTITY_DECIMAL_PLACES, MAX_QUANTITY_INTEGER_DIGITS, describeLimitViolation, } from './limits';
|
|
2
|
+
export { AforoClient } from './client.js';
|
|
3
|
+
export { expressMiddleware, middleware } from './middleware/express.js';
|
|
4
|
+
export { fastifyPlugin } from './middleware/fastify.js';
|
|
5
|
+
export { koaMiddleware } from './middleware/koa.js';
|
|
6
|
+
export { normalizePath } from './path-normalizer.js';
|
|
7
|
+
export { DEFAULT_METRIC_NAME } from './middleware/common.js';
|
|
8
|
+
export { MAX_LENGTHS, MAX_QUANTITY_DECIMAL_PLACES, MAX_QUANTITY_INTEGER_DIGITS, describeLimitViolation, truncateToLimit, } from './limits.js';
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EACL,WAAW,EACX,2BAA2B,EAC3B,2BAA2B,EAC3B,sBAAsB,EACtB,eAAe,GAChB,MAAM,aAAa,CAAC"}
|
package/dist/esm/limits.js
CHANGED
|
@@ -5,8 +5,10 @@
|
|
|
5
5
|
* billed. The server reports it per event (`errors[]` in the batch response,
|
|
6
6
|
* indexed), so the rest of the batch survives — but the SDK sends in the
|
|
7
7
|
* background, so that report reaches nobody: the usage is simply gone. Checking
|
|
8
|
-
* the same limits at `track()`
|
|
9
|
-
*
|
|
8
|
+
* the same limits at `track()` reports the problem where it happens: the event
|
|
9
|
+
* is not buffered or sent, it is counted in `droppedCount`, WARN-logged with
|
|
10
|
+
* the field, the limit and the offending value, and handed to the opt-in
|
|
11
|
+
* `onDrop` hook with reason `'invalid'`. `track()` does not throw for it.
|
|
10
12
|
*
|
|
11
13
|
* Source: `dto/IngestUsageEventRequest` (aforo-nextgen-usage-ingestor-service) —
|
|
12
14
|
* the `@Size` and `@Digits` bean constraints, which are compiled into the
|
|
@@ -21,9 +23,15 @@
|
|
|
21
23
|
* Only `occurredAt`'s shape is checked, since a malformed timestamp is invalid
|
|
22
24
|
* under every configuration.
|
|
23
25
|
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* offending value.
|
|
26
|
+
* The limit check never truncates or rounds a value the caller set — that would
|
|
27
|
+
* change what is billed. The offending event is dropped instead (reason
|
|
28
|
+
* `'invalid'`), naming the field, the limit, and the offending value.
|
|
29
|
+
*
|
|
30
|
+
* The one exception is a label the SDK itself reads off an incoming request
|
|
31
|
+
* (the middlewares' `endpointPath` and `httpMethod`): dropping there would let
|
|
32
|
+
* an API consumer avoid metering by sending an over-long path. Those are cut to
|
|
33
|
+
* the limit where they are derived (`truncateRequestLabel`) and the event is
|
|
34
|
+
* still sent.
|
|
27
35
|
*/
|
|
28
36
|
/** Maximum characters the ingestor accepts per string field (`@Size(max = ...)`). */
|
|
29
37
|
export const MAX_LENGTHS = {
|
|
@@ -36,8 +44,16 @@ export const MAX_LENGTHS = {
|
|
|
36
44
|
sessionId: 64,
|
|
37
45
|
agentId: 36,
|
|
38
46
|
toolName: 64,
|
|
47
|
+
capabilityName: 64,
|
|
39
48
|
endpointPath: 512,
|
|
40
49
|
httpMethod: 16,
|
|
50
|
+
subscriptionId: 64,
|
|
51
|
+
grpcService: 255,
|
|
52
|
+
grpcMethod: 128,
|
|
53
|
+
gqlOperationName: 255,
|
|
54
|
+
wsConnectionId: 64,
|
|
55
|
+
mqttTopic: 500,
|
|
56
|
+
mqttClientId: 128,
|
|
41
57
|
};
|
|
42
58
|
/** `@Digits(integer = 14, fraction = 6)` — `usage_events.quantity` is NUMERIC(20,6). */
|
|
43
59
|
export const MAX_QUANTITY_INTEGER_DIGITS = 14;
|
|
@@ -56,6 +72,42 @@ const ISO_DATE_TIME = /^\d{4}-\d{2}-\d{2}[Tt]\d{2}:\d{2}(:\d{2}(\.\d{1,9})?)?([Z
|
|
|
56
72
|
function lengthOf(value) {
|
|
57
73
|
return value.length;
|
|
58
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Cut `value` to at most `max` UTF-16 code units — how the ingestor counts —
|
|
77
|
+
* without leaving half a surrogate pair at the end.
|
|
78
|
+
*/
|
|
79
|
+
export function truncateToLimit(value, max) {
|
|
80
|
+
if (value.length <= max)
|
|
81
|
+
return value;
|
|
82
|
+
let end = Math.max(0, max);
|
|
83
|
+
const last = end > 0 ? value.charCodeAt(end - 1) : 0;
|
|
84
|
+
// A high surrogate at the cut means its low half was cut off: drop it too.
|
|
85
|
+
if (last >= 0xd800 && last <= 0xdbff)
|
|
86
|
+
end -= 1;
|
|
87
|
+
return value.slice(0, end);
|
|
88
|
+
}
|
|
89
|
+
/** Labels already reported as truncated — one WARN per label name per process. */
|
|
90
|
+
const truncationWarned = new Set();
|
|
91
|
+
/**
|
|
92
|
+
* Bound a label the SDK derived from an incoming request to the ingestor's
|
|
93
|
+
* limit for `field`. Logs one WARN per field per process. Not for values the
|
|
94
|
+
* SDK caller sets: those are never altered (an over-long one drops the event).
|
|
95
|
+
*/
|
|
96
|
+
export function truncateRequestLabel(field, value) {
|
|
97
|
+
const max = MAX_LENGTHS[field];
|
|
98
|
+
if (typeof value !== 'string' || value.length <= max)
|
|
99
|
+
return value;
|
|
100
|
+
if (!truncationWarned.has(field)) {
|
|
101
|
+
truncationWarned.add(field);
|
|
102
|
+
console.warn(`[aforo] ${field} taken from the request was longer than the ingestor's limit and was `
|
|
103
|
+
+ `truncated to ${max} characters; the event is still sent. Logged once per label.`);
|
|
104
|
+
}
|
|
105
|
+
return truncateToLimit(value, max);
|
|
106
|
+
}
|
|
107
|
+
/** Test hook: forget which labels were already reported as truncated. */
|
|
108
|
+
export function resetTruncationWarnings() {
|
|
109
|
+
truncationWarned.clear();
|
|
110
|
+
}
|
|
59
111
|
function lengthError(field, value) {
|
|
60
112
|
if (value === undefined || value === null)
|
|
61
113
|
return null;
|
|
@@ -65,7 +117,7 @@ function lengthError(field, value) {
|
|
|
65
117
|
if (len <= max)
|
|
66
118
|
return null;
|
|
67
119
|
return `${field} is ${len} characters, exceeding the ingestor's ${max}-character limit `
|
|
68
|
-
+ `(value starts "${text.slice(0,
|
|
120
|
+
+ `(value starts "${text.slice(0, 80)}"). Shorten it — the SDK will not truncate it, `
|
|
69
121
|
+ 'because a truncated id bills the wrong thing.';
|
|
70
122
|
}
|
|
71
123
|
/**
|
|
@@ -107,18 +159,18 @@ function quantityError(quantity) {
|
|
|
107
159
|
}
|
|
108
160
|
function occurredAtError(occurredAt) {
|
|
109
161
|
if (!ISO_DATE_TIME.test(occurredAt)) {
|
|
110
|
-
return `occurredAt "${occurredAt}" is not an ISO-8601 timestamp `
|
|
162
|
+
return `occurredAt "${String(occurredAt).slice(0, 80)}" is not an ISO-8601 timestamp `
|
|
111
163
|
+ '(expected e.g. "2026-03-01T14:30:00Z").';
|
|
112
164
|
}
|
|
113
165
|
if (Number.isNaN(Date.parse(occurredAt))) {
|
|
114
|
-
return `occurredAt "${occurredAt}" is not a valid date.`;
|
|
166
|
+
return `occurredAt "${String(occurredAt).slice(0, 80)}" is not a valid date.`;
|
|
115
167
|
}
|
|
116
168
|
return null;
|
|
117
169
|
}
|
|
118
170
|
/**
|
|
119
171
|
* Describe the first ingestor constraint this event breaks, or `null` when it
|
|
120
|
-
* would be accepted.
|
|
121
|
-
*
|
|
172
|
+
* would be accepted. `AforoClient.track()` uses it to drop an invalid event
|
|
173
|
+
* (reason `'invalid'`) before it is buffered.
|
|
122
174
|
*/
|
|
123
175
|
export function describeLimitViolation(event) {
|
|
124
176
|
if (event.idempotencyKey !== undefined && event.idempotencyKey !== null
|
package/dist/esm/limits.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/limits.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/limits.ts"],"names":[],"mappings":"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"}
|