@aforoai/metering 1.1.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +46 -28
  2. package/dist/cjs/client.d.ts +32 -50
  3. package/dist/cjs/client.d.ts.map +1 -1
  4. package/dist/cjs/client.js +104 -215
  5. package/dist/cjs/client.js.map +1 -1
  6. package/dist/cjs/middleware/common.d.ts +16 -0
  7. package/dist/cjs/middleware/common.d.ts.map +1 -1
  8. package/dist/cjs/middleware/common.js +54 -0
  9. package/dist/cjs/middleware/common.js.map +1 -1
  10. package/dist/cjs/middleware/express.d.ts +10 -5
  11. package/dist/cjs/middleware/express.d.ts.map +1 -1
  12. package/dist/cjs/middleware/express.js +22 -59
  13. package/dist/cjs/middleware/express.js.map +1 -1
  14. package/dist/cjs/middleware/fastify.d.ts +8 -4
  15. package/dist/cjs/middleware/fastify.d.ts.map +1 -1
  16. package/dist/cjs/middleware/fastify.js +25 -45
  17. package/dist/cjs/middleware/fastify.js.map +1 -1
  18. package/dist/cjs/middleware/koa.d.ts +10 -5
  19. package/dist/cjs/middleware/koa.d.ts.map +1 -1
  20. package/dist/cjs/middleware/koa.js +25 -43
  21. package/dist/cjs/middleware/koa.js.map +1 -1
  22. package/dist/cjs/transport-core/core.d.ts +355 -0
  23. package/dist/cjs/transport-core/core.d.ts.map +1 -0
  24. package/dist/cjs/transport-core/core.js +1047 -0
  25. package/dist/cjs/transport-core/core.js.map +1 -0
  26. package/dist/cjs/types.d.ts +82 -46
  27. package/dist/cjs/types.d.ts.map +1 -1
  28. package/dist/esm/client.js +103 -214
  29. package/dist/esm/client.js.map +1 -1
  30. package/dist/esm/middleware/common.js +51 -0
  31. package/dist/esm/middleware/common.js.map +1 -1
  32. package/dist/esm/middleware/express.js +23 -60
  33. package/dist/esm/middleware/express.js.map +1 -1
  34. package/dist/esm/middleware/fastify.js +26 -46
  35. package/dist/esm/middleware/fastify.js.map +1 -1
  36. package/dist/esm/middleware/koa.js +26 -44
  37. package/dist/esm/middleware/koa.js.map +1 -1
  38. package/dist/esm/transport-core/core.js +1038 -0
  39. package/dist/esm/transport-core/core.js.map +1 -0
  40. package/dist/types/client.d.ts +32 -50
  41. package/dist/types/client.d.ts.map +1 -1
  42. package/dist/types/middleware/common.d.ts +16 -0
  43. package/dist/types/middleware/common.d.ts.map +1 -1
  44. package/dist/types/middleware/express.d.ts +10 -5
  45. package/dist/types/middleware/express.d.ts.map +1 -1
  46. package/dist/types/middleware/fastify.d.ts +8 -4
  47. package/dist/types/middleware/fastify.d.ts.map +1 -1
  48. package/dist/types/middleware/koa.d.ts +10 -5
  49. package/dist/types/middleware/koa.d.ts.map +1 -1
  50. package/dist/types/transport-core/core.d.ts +355 -0
  51. package/dist/types/transport-core/core.d.ts.map +1 -0
  52. package/dist/types/types.d.ts +82 -46
  53. package/dist/types/types.d.ts.map +1 -1
  54. package/package.json +1 -1
  55. package/dist/cjs/buffer.d.ts +0 -33
  56. package/dist/cjs/buffer.d.ts.map +0 -1
  57. package/dist/cjs/buffer.js +0 -83
  58. package/dist/cjs/buffer.js.map +0 -1
  59. package/dist/cjs/transport.d.ts +0 -41
  60. package/dist/cjs/transport.d.ts.map +0 -1
  61. package/dist/cjs/transport.js +0 -186
  62. package/dist/cjs/transport.js.map +0 -1
  63. package/dist/esm/buffer.js +0 -79
  64. package/dist/esm/buffer.js.map +0 -1
  65. package/dist/esm/transport.js +0 -182
  66. package/dist/esm/transport.js.map +0 -1
  67. package/dist/types/buffer.d.ts +0 -33
  68. package/dist/types/buffer.d.ts.map +0 -1
  69. package/dist/types/transport.d.ts +0 -41
  70. package/dist/types/transport.d.ts.map +0 -1
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # @aforoai/metering
2
2
 
3
- Track API usage from your Node service and send it to Aforo for billing. A buffered, batched, retrying client plus Express / Fastify / Koa middleware — `track()` returns immediately and events flush in the background, so metering never sits in your request path.
3
+ Track API usage from your Node service and send it to Aforo for billing. A queued, batched, retrying client plus Express / Fastify / Koa middleware — `track()` returns immediately and one background sender ships events, so metering never sits in your request path and an ingestor outage does not lose usage.
4
4
 
5
- **Version:** 1.1.2 · Apache-2.0 · [Changelog](CHANGELOG.md) · [User guide](USER_GUIDE.md)
5
+ **Version:** 2.0.0 · Apache-2.0 · [Changelog](CHANGELOG.md) · [User guide](USER_GUIDE.md)
6
6
 
7
7
  ## Install
8
8
 
@@ -10,13 +10,13 @@ Track API usage from your Node service and send it to Aforo for billing. A buffe
10
10
  npm i @aforoai/metering
11
11
  ```
12
12
 
13
- > **Install `1.1.2` or later. `1.0.0` on npm was built from an older copy of this code and lacks the fixes listed in the changelog.** If `1.1.2` is not on npm yet, install from source:
13
+ > **Install `2.0.0` or later. `1.0.0` on npm was built from an older copy of this code and lacks the fixes listed in the changelog.** If `2.0.0` is not on npm yet, install from source:
14
14
  > ```bash
15
15
  > git clone https://github.com/aforoai/SDKs.git
16
16
  > cd SDKs/aforo-metering-sdks/node
17
17
  > npm install && npm run build
18
- > npm pack # produces aforo-metering-1.1.2.tgz to install in your app
19
- > # then in your app: npm i /path/to/aforo-metering-1.1.2.tgz
18
+ > npm pack # produces aforo-metering-2.0.0.tgz to install in your app
19
+ > # then in your app: npm i /path/to/aforo-metering-2.0.0.tgz
20
20
  > ```
21
21
 
22
22
  Requires Node >= 18 (uses the built-in `fetch`).
@@ -32,29 +32,39 @@ const aforo = new AforoClient({ apiKey: process.env.AFORO_API_KEY!, productType:
32
32
 
33
33
  await aforo.track({ customerId: 'cust_123', metricName: 'api_calls', quantity: 1 });
34
34
 
35
- // Flush remaining events before the process exits:
36
- await aforo.shutdown();
35
+ // The SDK installs no signal handlers. Flush from your own shutdown path:
36
+ process.once('SIGTERM', async () => {
37
+ await aforo.shutdown(); // sends what is queued, for at most shutdownTimeoutMs
38
+ process.exit(0);
39
+ });
37
40
  ```
38
41
 
39
42
  Or meter every HTTP request with middleware — no per-route code:
40
43
 
41
44
  ```ts
45
+ import { AforoClient } from '@aforoai/metering';
42
46
  import { expressMiddleware } from '@aforoai/metering/middleware/express';
43
47
 
48
+ const aforo = new AforoClient({ apiKey: process.env.AFORO_API_KEY!, productType: 'API' });
49
+
44
50
  app.use(expressMiddleware({
45
- apiKey: process.env.AFORO_API_KEY!,
46
- customerId: (req) => req.user?.id ?? null, // return null to skip metering this request
47
- metricName: 'api_calls', // or (req, res) => string; must exist in your Aforo catalog
48
- productType: 'API', // default: the client default ("API")
51
+ client: aforo, // your client: you flush and shut it down
52
+ customerResolver: (req) => req.user?.aforoCustomerId, // from identity your app authenticated
53
+ metricName: 'api_calls', // or (req, res) => string; must exist in your Aforo catalog
49
54
  }));
50
55
  ```
51
56
 
52
57
  The middleware hooks `res.on('finish')`, so it runs after the response is sent — zero added latency.
53
58
 
59
+ - **Customer (required):** `customerResolver: (req) => string | null | undefined` returns the Aforo customer id from identity your app verified — a session, a JWT subject, an API-key lookup. Without it, or the explicit opt-in below, the middleware throws when you create it. When the resolver returns nothing for a request, that event is dropped with reason `invalid` and counted in `droppedCount`; the request itself is never blocked.
60
+ - **`trustCustomerHeader: true`** reads the `X-Customer-Id` request header instead (or when the resolver returns nothing). That header is set by whoever calls your API, so turn this on only when a proxy you control sets it and strips any client copy. The caller's `X-Api-Key` header is never used — it is the end user's secret, not a customer id.
61
+ - **Client:** pass `client` (an `AforoClient` you own) so your code can `flush()`, read `droppedCount` and `shutdown()` it. With `apiKey` instead, the middleware creates a client and exposes it as `middleware.client` (Fastify shuts its own client down in `onClose`).
54
62
  - **Metric:** `metricName` is a fixed name or a `(req, res) => string` resolver; the default is `"api_calls"` (exported as `DEFAULT_METRIC_NAME`). The metric must exist in your tenant's Aforo catalog: the ingestor rejects an event with an unknown `metricName` (the other events in the batch are still ingested), and the SDK reports it as a drop with reason `rejected`.
55
- - **Customer:** `customerId` is a fixed id or a `(req) => string | null` resolver; the default is `req.user.id` / `req.user.sub`, then the `X-Customer-Id` header. The caller's `X-Api-Key` header is never used — it is the end user's secret, not a customer id. Requests with no customer are not metered.
63
+ - **Path:** `endpointPath` is normalized by default — the framework's route template when there is one (`req.route.path`, Koa's matched route, Fastify's route URL), otherwise dynamic segments collapse (`/users/123` → `/users/:id`, UUIDs and Mongo ids too). That keeps one label per route instead of one per id. `normalizePath: false` sends the raw path; a function `(path, req) => string` normalizes it your way.
56
64
  - **CORS preflights** (`OPTIONS`) are never metered, nor are requests whose quantity is `<= 0`.
57
- - **HTTP context:** each event carries top-level `endpointPath` (path without query string, max 512 chars), `httpMethod`, `statusCode` and `responseTimeMs`, plus `productType`.
65
+ - **HTTP context:** each event carries top-level `endpointPath` (no query string, max 512 chars), `httpMethod`, `statusCode` and `responseTimeMs`, plus `productType`.
66
+
67
+ Koa: `koaMiddleware({ client, customerResolver: (ctx) => ctx.state.user?.aforoCustomerId })`. Fastify: `fastify.register(fastifyPlugin, { client, customerResolver: (request) => request.user?.aforoCustomerId })`.
58
68
 
59
69
  ## Configuration
60
70
 
@@ -62,21 +72,27 @@ The middleware hooks `res.on('finish')`, so it runs after the response is sent
62
72
 
63
73
  | Option | Type | Default | What it does |
64
74
  |---|---|---|---|
65
- | `apiKey` | `string` | — (required) | Aforo API key, sent as `X-API-Key`. |
66
- | `baseUrl` | `string` | `https://api.aforo.ai` | Ingestor base URL. Events POST to `<baseUrl>/v1/ingest/batch`. |
75
+ | `apiKey` | `string` | — (required) | Aforo API key, sent only as `X-API-Key`. Never logged and never shown by `inspect()` / `JSON.stringify`. |
76
+ | `baseUrl` | `string` | `https://api.aforo.ai` | Ingestor base URL. Events POST to `<baseUrl>/v1/ingest/batch`. Must be `https://`; plain `http://` is accepted only for `localhost`, `127.0.0.1` and `::1`. |
77
+ | `allowInsecureHttp` | `boolean` | `false` | Accept a plain `http://` `baseUrl` on another host (a private network you trust). |
67
78
  | `productType` | `string` | `"API"` | Top-level `productType` stamped on every event (required by the ingestor). One of `API`, `AGENTIC_API`, `AI_AGENT`, `MCP_SERVER`, `GRPC_API`, `GRAPHQL_API`, `WEBSOCKET_API`, `MQTT_BROKER`; trimmed and uppercased. |
68
- | `flushCount` | `number` | `50` | Buffered events that trigger a flush (and events per request; capped at 1000). |
69
- | `flushInterval` | `number` (ms) | `5000` | Background flush cadence. |
70
- | `maxQueueSize` | `number` | `10000` | Ring-buffer cap; oldest events drop on overflow. |
71
- | `onDrop` | `(events, reason) => void` | none | Called with events the SDK is about to lose. See [Dropped events](#dropped-events). |
72
- | `maxRetries` | `number` | `3` | Retries on 5xx, 408, 429 and network errors (exponential backoff; `Retry-After` honoured on 429). Other 4xx are not retried. |
73
- | `retryBaseMs` | `number` (ms) | `1000` | Base backoff delay. |
74
- | `timeout` | `number` (ms) | `10000` | Per-request timeout. |
75
- | `shutdownTimeoutMs` | `number` (ms) | `5000` | Max time `shutdown()` waits for a final flush. |
79
+ | `flushCount` | `number` | `500` | Events per request (capped at 1000). Reaching it wakes the background sender. |
80
+ | `flushInterval` | `number` (ms) | `5000` | The background sender also runs this often. |
81
+ | `maxQueueSize` | `number` | `10000` | Queue capacity; the oldest event is dropped on overflow. |
82
+ | `onDrop` | `(events, reason) => void` | none | Called with events the SDK loses for good. See [Dropped events](#dropped-events). |
83
+ | `maxRetries` | `number` | `3` | Retries on network errors, timeouts, 408, 429 and 5xx, with full-jitter backoff. `Retry-After` (seconds or an HTTP date) is honoured, capped at 60 s. |
84
+ | `retryBaseMs` | `number` (ms) | `500` | Backoff base: attempt *n* waits a random time up to `min(30 s, retryBaseMs · 2ⁿ)`. |
85
+ | `timeout` | `number` (ms) | `10000` | Total deadline per request. |
86
+ | `shutdownTimeoutMs` | `number` (ms) | `5000` | How long `shutdown()` keeps sending. Events still queued then are dropped with reason `shutdown`. |
87
+ | `flushOnExit` | `boolean` | `true` | Send queued events when the process is about to exit on its own (`beforeExit`), within `shutdownTimeoutMs`. |
88
+
89
+ ### Delivery
90
+
91
+ One background sender per client sends one request at a time; `track()` only queues. If the ingestor is unreachable, keeps answering 408/429/5xx after the retries, or answers 401/403 (wrong or revoked key — logged as an error), the batch goes back to the front of the queue with its idempotency keys and sending pauses (5 s, doubling to 5 min, randomized). New events keep queueing up to `maxQueueSize`. The first successful request resumes normal sending; the ingestor deduplicates the re-sent keys. A 413 splits the batch in half. Other 4xx drop the batch with reason `rejected`. Request bodies are plain JSON (no gzip: the ingestor does not decode compressed bodies).
76
92
 
77
93
  `track(event)` — `event: TrackEvent`: `customerId` (required, non-blank), `metricName` (required, non-blank), `quantity` (default 1, must be > 0), `productType` (overrides the client default for this event), `idempotencyKey` (a fresh random UUID v4 per event if omitted — pass your own key if you want the ingestor to deduplicate retries), `occurredAt` (ISO string or epoch ms; defaults to now), `executionStatus` (optional, see below), `endpointPath` / `httpMethod` / `statusCode` / `responseTimeMs` (optional HTTP context), `metadata` (string/number/boolean map).
78
94
 
79
- `track()` throws only when the client is shut down. It never throws for the content of an event — see [Dropped events](#dropped-events).
95
+ `track()` never throws. After `shutdown()` an event is counted and reported with reason `closed`; an event the ingestor would reject is reported with reason `invalid` — see [Dropped events](#dropped-events).
80
96
 
81
97
  ### Execution status
82
98
 
@@ -94,10 +110,12 @@ Every event the SDK loses is counted in `client.droppedCount`, WARN-logged, and
94
110
 
95
111
  | `reason` | When |
96
112
  |---|---|
97
- | `overflow` | The ring buffer was full; the oldest event was evicted. |
98
- | `retry_exhausted` | A batch failed after all retries. |
99
- | `rejected` | The ingestor refused the batch with a non-retryable 4xx, or refused these events individually inside a batch it otherwise accepted. |
100
- | `invalid` | The event failed a client-side check at `track()` and was never buffered or sent. |
113
+ | `overflow` | The queue was full; the oldest event was evicted. |
114
+ | `rejected` | The ingestor refused the batch with a non-retryable 4xx, refused these events individually inside a batch it otherwise accepted, or answered 413 to a single event. |
115
+ | `invalid` | The event failed a client-side check at `track()`, or a middleware `customerResolver` returned no customer. It was never queued or sent. |
116
+ | `shutdown` | Still queued when `shutdownTimeoutMs` ran out. |
117
+ | `closed` | `track()` was called after `shutdown()`. |
118
+ | `retry_exhausted` | Not produced by 2.x (kept in the type for compatibility): an outage requeues the batch instead of dropping it. |
101
119
 
102
120
  `invalid` covers what the ingestor would reject for any deployment: blank `customerId` / `metricName`, `quantity <= 0`, a `quantity` with more than 14 integer digits or 6 decimal places, a malformed `occurredAt`, and fields over the server's size limit (`customerId` 64, `metricName` 255, `idempotencyKey` 255, `productType` 20, `endpointPath` 512, `httpMethod` 16). Nothing you pass to `track()` or set in the middleware options is truncated or rounded. The one exception is what the middlewares read off the request: a path over 512 characters or a method over 16 is cut to the limit and the event is still sent (one WARN per label). The WARN names the field, the limit and the value; it is logged for the first invalid event and then every 1000th. Limits the server makes configurable (event age, clock skew, metadata size) are not checked client-side.
103
121
 
@@ -1,38 +1,28 @@
1
- import { AforoOptions, TrackEvent, FlushResult } from './types.js';
1
+ import { AforoOptions, TrackEvent, ResolvedEvent, FlushResult } from './types.js';
2
+ /** Package version, sent in User-Agent. Keep in step with package.json. */
3
+ export declare const SDK_VERSION = "2.0.0";
2
4
  /**
3
5
  * Aforo metering client.
4
6
  *
5
- * Enqueues usage events into a ring buffer, flushes them in batches
6
- * to the Aforo ingestor service via HTTP. Non-blocking — `track()`
7
- * returns immediately, flushing happens in the background.
7
+ * `track()` validates the event and puts it on a bounded queue; one background
8
+ * flusher sends batches to the ingestor. If the ingestor is down, batches go
9
+ * back on the queue (same idempotency keys) and are sent when it recovers.
8
10
  *
9
11
  * ```typescript
10
- * const client = new AforoClient({ apiKey: 'your-key', productType: 'API' });
12
+ * const client = new AforoClient({ apiKey: process.env.AFORO_API_KEY!, productType: 'API' });
11
13
  * await client.track({ customerId: 'cust_1', metricName: 'api_calls', quantity: 1 });
12
- * // On shutdown:
13
- * await client.shutdown();
14
+ * // The SDK installs no signal handlers. Flush from your own:
15
+ * process.once('SIGTERM', async () => { await client.shutdown(); process.exit(0); });
14
16
  * ```
15
17
  */
16
18
  export declare class AforoClient {
17
- private readonly buffer;
18
- private readonly transport;
19
- private readonly flushCount;
20
- private readonly flushInterval;
21
- private readonly shutdownTimeoutMs;
19
+ private readonly core;
20
+ private readonly sendHeartbeat;
22
21
  private readonly productType;
23
- private readonly onDrop?;
24
- private dropped;
25
- private overflowDrops;
26
- private invalidDrops;
27
- private flushTimer;
28
- private flushing;
29
- private closed;
30
- private pendingFlush;
31
22
  private heartbeatTimer;
32
23
  private activeSessionId;
33
24
  private sessionStartedAt;
34
25
  private sessionProductType;
35
- private readonly signalHandler;
36
26
  constructor(options: AforoOptions);
37
27
  /**
38
28
  * Start a session and emit `system.session.heartbeat` events: one now, then
@@ -56,47 +46,39 @@ export declare class AforoClient {
56
46
  private stopHeartbeatTimer;
57
47
  private emitSessionHeartbeat;
58
48
  /**
59
- * Enqueue a usage event for batched delivery.
60
- * Returns immediately — does not await HTTP.
61
- * Triggers a flush if the buffer reaches flushCount.
49
+ * Queue a usage event. Returns at once — it never waits on HTTP and never
50
+ * starts a request (the background flusher sends batches).
62
51
  *
63
- * Throws only when the client is shut down. An event the ingestor would
64
- * reject — a blank or over-long `customerId` / `metricName` /
65
- * `idempotencyKey`, a `quantity` that is not positive or carries more than
66
- * 14 integer digits / 6 decimal places, an `occurredAt` that is not an
67
- * ISO-8601 instant, or any other capped field that is too long — is NOT
68
- * buffered and NOT sent. It is counted in `droppedCount`, WARN-logged with
69
- * the field, the limit and the offending value, and passed to the opt-in
70
- * `onDrop` hook with reason `'invalid'`. Limits the server makes
71
- * configurable (event age, clock skew, metadata size) are left to the
72
- * server. See `limits.ts` for the limits and where each one comes from.
52
+ * Never throws. An event the ingestor would reject — a blank or over-long
53
+ * `customerId` / `metricName` / `idempotencyKey`, a `quantity` that is not
54
+ * positive or carries more than 14 integer digits / 6 decimal places, an
55
+ * `occurredAt` that is not an ISO-8601 instant, or any other capped field
56
+ * that is too long — is NOT queued and NOT sent. It is counted in
57
+ * `droppedCount`, WARN-logged with the field and the limit, and passed to
58
+ * the opt-in `onDrop` hook with reason `'invalid'`. After `shutdown()` the
59
+ * event is counted and reported with reason `'closed'`.
73
60
  */
74
61
  track(event: TrackEvent): Promise<void>;
75
- /** Buffer an event; surface the evicted-oldest event if the push overflowed. */
76
- private enqueue;
62
+ /** @internal Count and report an event a middleware could not build (reason 'invalid'). */
63
+ reportInvalid(event: ResolvedEvent, detail: string): void;
77
64
  /**
78
- * Account for permanently lost events: bump the counter, WARN-log, and
79
- * invoke the opt-in onDrop hook. Overflow logs are throttled (first, then
80
- * every 1000th eviction) so sustained overflow can't storm the log;
81
- * failed-batch drops log every time (bounded by flush cadence).
82
- */
83
- private recordDrop;
84
- /**
85
- * Force-flush all buffered events to the ingestor.
86
- * Safe to call concurrently — only one flush runs at a time.
65
+ * Send everything queued now and wait for it. Runs on the single flusher —
66
+ * never a second concurrent request. While the ingestor is down this makes
67
+ * one attempt; unsent events stay queued.
87
68
  */
88
69
  flush(): Promise<FlushResult>;
89
- private doFlush;
90
70
  /**
91
- * Flush remaining events and stop the client.
92
- * After shutdown, track() will throw.
71
+ * Stop accepting events and send what is queued, for at most
72
+ * `shutdownTimeoutMs`. Events still queued at the deadline are counted and
73
+ * reported through onDrop with reason 'shutdown'. Safe to call more than once.
93
74
  */
94
75
  shutdown(): Promise<void>;
95
- /** Number of events currently buffered. */
76
+ /** Number of events currently queued. */
96
77
  get bufferedCount(): number;
97
- /** Total events permanently dropped (overflow, failed batches, server-rejected and invalid events) since creation. */
78
+ /** Total events permanently dropped (every DropReason) since creation. */
98
79
  get droppedCount(): number;
99
80
  /** Whether the client has been shut down. */
100
81
  get isShutdown(): boolean;
82
+ toJSON(): Record<string, unknown>;
101
83
  }
102
84
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAiB,WAAW,EAAc,MAAM,YAAY,CAAC;AAuB9F;;;;;;;;;;;;;GAaG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAwD;IAIhF,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,YAAY,CAAK;IAEzB,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAAqC;IAGzD,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,kBAAkB,CAAwC;IAIlE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAa;gBAE/B,OAAO,EAAE,YAAY;IAuCjC;;;;;;;;;;;;OAYG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,GAAE,MAAqC,GAAG,IAAI;IAezF;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,oBAAoB;IAkC5B;;;;;;;;;;;;;;;OAeG;IACG,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA8D7C,gFAAgF;IAChF,OAAO,CAAC,OAAO;IAOf;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAqClB;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC;YAgBrB,OAAO;IAsCrB;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAmC/B,2CAA2C;IAC3C,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,sHAAsH;IACtH,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,6CAA6C;IAC7C,IAAI,UAAU,IAAI,OAAO,CAExB;CACF"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAc,MAAM,YAAY,CAAC;AAK9F,2EAA2E;AAC3E,eAAO,MAAM,WAAW,UAAU,CAAC;AAsCnC;;;;;;;;;;;;;GAaG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA+B;IACpD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAmB;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAGrC,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,kBAAkB,CAAwC;gBAEtD,OAAO,EAAE,YAAY;IAgCjC;;;;;;;;;;;;OAYG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,GAAE,MAAqC,GAAG,IAAI;IAezF;;;OAGG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,oBAAoB;IAkC5B;;;;;;;;;;;;OAYG;IACG,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAoD7C,2FAA2F;IAC3F,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAIzD;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,WAAW,CAAC;IAKnC;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,yCAAyC;IACzC,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,0EAA0E;IAC1E,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,6CAA6C;IAC7C,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAOlC"}