@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.
- package/README.md +46 -28
- package/dist/cjs/client.d.ts +32 -50
- package/dist/cjs/client.d.ts.map +1 -1
- package/dist/cjs/client.js +104 -215
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/middleware/common.d.ts +16 -0
- package/dist/cjs/middleware/common.d.ts.map +1 -1
- package/dist/cjs/middleware/common.js +54 -0
- package/dist/cjs/middleware/common.js.map +1 -1
- package/dist/cjs/middleware/express.d.ts +10 -5
- package/dist/cjs/middleware/express.d.ts.map +1 -1
- package/dist/cjs/middleware/express.js +22 -59
- package/dist/cjs/middleware/express.js.map +1 -1
- package/dist/cjs/middleware/fastify.d.ts +8 -4
- package/dist/cjs/middleware/fastify.d.ts.map +1 -1
- package/dist/cjs/middleware/fastify.js +25 -45
- package/dist/cjs/middleware/fastify.js.map +1 -1
- package/dist/cjs/middleware/koa.d.ts +10 -5
- package/dist/cjs/middleware/koa.d.ts.map +1 -1
- package/dist/cjs/middleware/koa.js +25 -43
- package/dist/cjs/middleware/koa.js.map +1 -1
- package/dist/cjs/transport-core/core.d.ts +355 -0
- package/dist/cjs/transport-core/core.d.ts.map +1 -0
- package/dist/cjs/transport-core/core.js +1047 -0
- package/dist/cjs/transport-core/core.js.map +1 -0
- package/dist/cjs/types.d.ts +82 -46
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/esm/client.js +103 -214
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/middleware/common.js +51 -0
- package/dist/esm/middleware/common.js.map +1 -1
- package/dist/esm/middleware/express.js +23 -60
- package/dist/esm/middleware/express.js.map +1 -1
- package/dist/esm/middleware/fastify.js +26 -46
- package/dist/esm/middleware/fastify.js.map +1 -1
- package/dist/esm/middleware/koa.js +26 -44
- package/dist/esm/middleware/koa.js.map +1 -1
- package/dist/esm/transport-core/core.js +1038 -0
- package/dist/esm/transport-core/core.js.map +1 -0
- package/dist/types/client.d.ts +32 -50
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/middleware/common.d.ts +16 -0
- package/dist/types/middleware/common.d.ts.map +1 -1
- package/dist/types/middleware/express.d.ts +10 -5
- package/dist/types/middleware/express.d.ts.map +1 -1
- package/dist/types/middleware/fastify.d.ts +8 -4
- package/dist/types/middleware/fastify.d.ts.map +1 -1
- package/dist/types/middleware/koa.d.ts +10 -5
- package/dist/types/middleware/koa.d.ts.map +1 -1
- package/dist/types/transport-core/core.d.ts +355 -0
- package/dist/types/transport-core/core.d.ts.map +1 -0
- package/dist/types/types.d.ts +82 -46
- package/dist/types/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/buffer.d.ts +0 -33
- package/dist/cjs/buffer.d.ts.map +0 -1
- package/dist/cjs/buffer.js +0 -83
- package/dist/cjs/buffer.js.map +0 -1
- package/dist/cjs/transport.d.ts +0 -41
- package/dist/cjs/transport.d.ts.map +0 -1
- package/dist/cjs/transport.js +0 -186
- package/dist/cjs/transport.js.map +0 -1
- package/dist/esm/buffer.js +0 -79
- package/dist/esm/buffer.js.map +0 -1
- package/dist/esm/transport.js +0 -182
- package/dist/esm/transport.js.map +0 -1
- package/dist/types/buffer.d.ts +0 -33
- package/dist/types/buffer.d.ts.map +0 -1
- package/dist/types/transport.d.ts +0 -41
- 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
|
|
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:**
|
|
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 `
|
|
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-
|
|
19
|
-
> # then in your app: npm i /path/to/aforo-metering-
|
|
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
|
|
36
|
-
|
|
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
|
-
|
|
46
|
-
|
|
47
|
-
metricName: 'api_calls',
|
|
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
|
-
- **
|
|
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` (
|
|
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` | `
|
|
69
|
-
| `flushInterval` | `number` (ms) | `5000` |
|
|
70
|
-
| `maxQueueSize` | `number` | `10000` |
|
|
71
|
-
| `onDrop` | `(events, reason) => void` | none | Called with events the SDK
|
|
72
|
-
| `maxRetries` | `number` | `3` | Retries on
|
|
73
|
-
| `retryBaseMs` | `number` (ms) | `
|
|
74
|
-
| `timeout` | `number` (ms) | `10000` |
|
|
75
|
-
| `shutdownTimeoutMs` | `number` (ms) | `5000` |
|
|
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
|
|
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
|
|
98
|
-
| `
|
|
99
|
-
| `
|
|
100
|
-
| `
|
|
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
|
|
package/dist/cjs/client.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
6
|
-
* to the
|
|
7
|
-
*
|
|
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:
|
|
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
|
-
* //
|
|
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
|
|
18
|
-
private readonly
|
|
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
|
-
*
|
|
60
|
-
*
|
|
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
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* the
|
|
70
|
-
*
|
|
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
|
-
/**
|
|
76
|
-
|
|
62
|
+
/** @internal Count and report an event a middleware could not build (reason 'invalid'). */
|
|
63
|
+
reportInvalid(event: ResolvedEvent, detail: string): void;
|
|
77
64
|
/**
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
*
|
|
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
|
-
*
|
|
92
|
-
*
|
|
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
|
|
76
|
+
/** Number of events currently queued. */
|
|
96
77
|
get bufferedCount(): number;
|
|
97
|
-
/** Total events permanently dropped (
|
|
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
|
package/dist/cjs/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,
|
|
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"}
|