@enkaku/client 0.14.2 → 0.14.4

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/lib/client.d.ts CHANGED
@@ -2,7 +2,9 @@ import { Disposer } from '@enkaku/async';
2
2
  import { type Logger } from '@enkaku/log';
3
3
  import { type Tracer } from '@enkaku/otel';
4
4
  import type { AnyProcedureDefinition, AnyRequestProcedureDefinition, ChannelProcedureDefinition, ClientTransportOf, DataOf, EventProcedureDefinition, ProtocolDefinition, RequestProcedureDefinition, RequestType, ReturnOf, StreamProcedureDefinition } from '@enkaku/protocol';
5
+ import { type Runtime } from '@enkaku/runtime';
5
6
  import { type Identity } from '@enkaku/token';
7
+ import type { ClientEmitter } from './events.js';
6
8
  type FilterNever<T> = {
7
9
  [K in keyof T as T[K] extends never ? never : K]: T[K];
8
10
  };
@@ -67,6 +69,7 @@ export type RequestArguments<Param> = Param extends never ? [config?: {
67
69
  }];
68
70
  export type ClientParams<Protocol extends ProtocolDefinition> = {
69
71
  getRandomID?: () => string;
72
+ runtime?: Runtime;
70
73
  handleTransportDisposed?: (signal: AbortSignal) => ClientTransportOf<Protocol> | void;
71
74
  handleTransportError?: (error: Error) => ClientTransportOf<Protocol> | void;
72
75
  logger?: Logger;
@@ -78,6 +81,7 @@ export type ClientParams<Protocol extends ProtocolDefinition> = {
78
81
  export declare class Client<Protocol extends ProtocolDefinition, ClientDefinitions extends ClientDefinitionsType<Protocol> = ClientDefinitionsType<Protocol>> extends Disposer {
79
82
  #private;
80
83
  constructor(params: ClientParams<Protocol>);
84
+ get events(): ClientEmitter;
81
85
  sendEvent<Procedure extends keyof ClientDefinitions['Events'] & string, T extends ClientDefinitions['Events'][Procedure] = ClientDefinitions['Events'][Procedure]>(procedure: Procedure, ...args: T['Data'] extends never ? [config?: {
82
86
  data?: never;
83
87
  header?: AnyHeader;
@@ -120,4 +124,3 @@ export declare class Client<Protocol extends ProtocolDefinition, ClientDefinitio
120
124
  }]): ChannelCall<T['Receive'], T['Send'], T['Result']>;
121
125
  }
122
126
  export {};
123
- //# sourceMappingURL=client.d.ts.map
package/lib/client.js CHANGED
@@ -1,9 +1,12 @@
1
1
  import { Disposer, defer } from '@enkaku/async';
2
+ import { EventEmitter } from '@enkaku/event';
2
3
  import { getEnkakuLogger } from '@enkaku/log';
3
4
  import { AttributeKeys, createTracer, injectTraceContext as otelInjectTraceContext, SpanNames, SpanStatusCode, setSpanOnContext, withActiveContext, withSpan } from '@enkaku/otel';
5
+ import { createRuntime } from '@enkaku/runtime';
4
6
  import { createPipe, writeTo } from '@enkaku/stream';
5
7
  import { createUnsignedToken, isSigningIdentity } from '@enkaku/token';
6
8
  import { RequestError } from './error.js';
9
+ import { safeWrite } from './safe-write.js';
7
10
  const defaultTracer = createTracer('client');
8
11
  function createController(params, onDone) {
9
12
  const deferred = defer();
@@ -60,13 +63,10 @@ function getCreateMessage(identity, aud) {
60
63
  ...payload
61
64
  }, header) : createToken;
62
65
  }
63
- function defaultRandomID() {
64
- return globalThis.crypto.randomUUID();
65
- }
66
66
  export class Client extends Disposer {
67
67
  #controllers = {};
68
68
  #createMessage;
69
- #getRandomID;
69
+ #runtime;
70
70
  #spans = {};
71
71
  // biome-ignore lint/suspicious/noConfusingVoidType: return type
72
72
  #handleTransportDisposed;
@@ -75,20 +75,29 @@ export class Client extends Disposer {
75
75
  #logger;
76
76
  #tracer;
77
77
  #transport;
78
+ #events = new EventEmitter();
78
79
  constructor(params){
79
80
  super({
80
81
  dispose: async (reason)=>{
82
+ await this.#events.emit('disposing', {
83
+ reason
84
+ });
81
85
  this.#abortControllers(reason);
82
86
  await this.#transport.dispose(reason);
87
+ await this.#events.emit('disposed', {
88
+ reason
89
+ });
83
90
  this.#logger.debug('disposed');
84
91
  }
85
92
  });
86
93
  this.#createMessage = getCreateMessage(params.identity, params.serverID);
87
- this.#getRandomID = params.getRandomID ?? defaultRandomID;
94
+ this.#runtime = params.runtime ?? createRuntime({
95
+ getRandomID: params.getRandomID
96
+ });
88
97
  this.#handleTransportDisposed = params.handleTransportDisposed;
89
98
  this.#handleTransportError = params.handleTransportError;
90
99
  this.#logger = params.logger ?? getEnkakuLogger('client', {
91
- clientID: this.#getRandomID()
100
+ clientID: this.#runtime.getRandomID()
92
101
  });
93
102
  this.#tracer = params.tracer ?? defaultTracer;
94
103
  this.#transport = params.transport;
@@ -96,10 +105,11 @@ export class Client extends Disposer {
96
105
  this.#setupTransport();
97
106
  }
98
107
  #abortControllers(reason) {
99
- if (!this.signal.aborted) {
100
- for (const controller of Object.values(this.#controllers)){
101
- controller.abort(reason);
102
- }
108
+ // Runs during dispose (where this.signal is already aborted by the base
109
+ // Disposer) and on transport replacement. Clearing the map after the loop
110
+ // makes re-entry a no-op, so no guard is needed.
111
+ for (const controller of Object.values(this.#controllers)){
112
+ controller.abort(reason);
103
113
  }
104
114
  this.#controllers = {};
105
115
  }
@@ -118,18 +128,23 @@ export class Client extends Disposer {
118
128
  // Abort running procedures and start using new transport
119
129
  this.#abortControllers('TransportDisposed');
120
130
  this.#transport = newTransport;
131
+ this.#events.emit('transportReplaced', {});
121
132
  this.#setupTransport();
122
133
  }
123
134
  });
124
135
  this.#read();
125
136
  }
126
- #endSpanOnResult(span, result, rid) {
137
+ #endSpanOnResult(span, result, meta) {
127
138
  result.then(()=>{
128
139
  span.setStatus({
129
140
  code: SpanStatusCode.OK
130
141
  });
131
142
  span.end();
132
- if (rid != null) delete this.#spans[rid];
143
+ this.#events.emit('requestEnd', {
144
+ ...meta,
145
+ status: 'ok'
146
+ });
147
+ delete this.#spans[meta.rid];
133
148
  }, (error)=>{
134
149
  if (error instanceof RequestError) {
135
150
  span.setAttribute(AttributeKeys.ERROR_CODE, error.code);
@@ -141,7 +156,12 @@ export class Client extends Disposer {
141
156
  });
142
157
  span.recordException(error instanceof Error ? error : new Error(String(error)));
143
158
  span.end();
144
- if (rid != null) delete this.#spans[rid];
159
+ const status = error === 'Close' || error?.name === 'AbortError' ? 'aborted' : 'error';
160
+ this.#events.emit('requestEnd', {
161
+ ...meta,
162
+ status
163
+ });
164
+ delete this.#spans[meta.rid];
145
165
  });
146
166
  }
147
167
  async #read() {
@@ -163,6 +183,9 @@ export class Client extends Disposer {
163
183
  const error = new Error('Transport read failed', {
164
184
  cause
165
185
  });
186
+ this.#events.emit('transportError', {
187
+ error
188
+ });
166
189
  const newTransport = this.#handleTransportError?.(error);
167
190
  if (newTransport == null) {
168
191
  this.#logger.warn('aborting following unhanded transport error');
@@ -173,6 +196,7 @@ export class Client extends Disposer {
173
196
  // Abort running procedures and start using new transport
174
197
  this.#abortControllers(error);
175
198
  this.#transport = newTransport;
199
+ this.#events.emit('transportReplaced', {});
176
200
  this.#setupTransport();
177
201
  }
178
202
  return;
@@ -228,7 +252,7 @@ export class Client extends Disposer {
228
252
  }
229
253
  }
230
254
  }
231
- async #write(payload, header) {
255
+ async #write(payload, header, rid) {
232
256
  if (this.signal.aborted) {
233
257
  throw new Error('Client aborted', {
234
258
  cause: this.signal.reason
@@ -238,7 +262,46 @@ export class Client extends Disposer {
238
262
  const enrichedHeader = otelInjectTraceContext(baseHeader);
239
263
  const finalHeader = Object.keys(enrichedHeader).length > 0 ? enrichedHeader : undefined;
240
264
  const message = await this.#createMessage(payload, finalHeader);
241
- await this.#transport.write(message);
265
+ await safeWrite({
266
+ transport: this.#transport,
267
+ message,
268
+ rid,
269
+ events: this.#events,
270
+ signal: this.signal,
271
+ onFailure: (error)=>{
272
+ if (rid != null) {
273
+ // Surface the write failure on the per-rid controller so the
274
+ // awaited request/stream/channel promise rejects, instead of
275
+ // hanging on a server reply that will never arrive.
276
+ this.#controllers[rid]?.abort(error);
277
+ }
278
+ }
279
+ });
280
+ }
281
+ // Fire-and-forget abort notification for `#handleSignal`. Never rejects:
282
+ // `safeWrite` already absorbs benign teardown errors and routes non-benign
283
+ // ones through `writeFailed` + the per-rid controller. The try/catch here
284
+ // only covers `#write`'s synchronous preflight (`this.signal.aborted` ->
285
+ // throw) and signing errors from `#createMessage`, which are the only paths
286
+ // that still reject. `requestError` surfaces those so callers can observe
287
+ // mid-abort failures without each abort site needing its own `.catch`.
288
+ #notifyAbort(rid, reason, header) {
289
+ void (async ()=>{
290
+ try {
291
+ await this.#write({
292
+ typ: 'abort',
293
+ rid,
294
+ rsn: reason
295
+ }, header, rid);
296
+ } catch (error) {
297
+ if (!this.signal.aborted) {
298
+ await this.#events.emit('requestError', {
299
+ rid,
300
+ error: error
301
+ });
302
+ }
303
+ }
304
+ })();
242
305
  }
243
306
  #handleSignal(rid, controller, providedSignal) {
244
307
  const signal = providedSignal ? AbortSignal.any([
@@ -246,27 +309,24 @@ export class Client extends Disposer {
246
309
  providedSignal
247
310
  ]) : controller.signal;
248
311
  signal.addEventListener('abort', ()=>{
249
- const reason = signal.reason.name ?? signal.reason;
312
+ const reason = signal.reason?.name ?? signal.reason;
250
313
  this.#logger.trace('abort {type} {procedure} with ID {rid} and reason: {reason}', {
251
314
  type: controller.type,
252
315
  procedure: controller.procedure,
253
316
  rid,
254
317
  reason
255
318
  });
256
- void this.#write({
257
- typ: 'abort',
258
- rid,
259
- rsn: reason
260
- }, controller.header);
261
- if (signal.reason !== 'Close') {
262
- controller.aborted(signal);
263
- delete this.#controllers[rid];
264
- }
319
+ this.#notifyAbort(rid, reason, controller.header);
320
+ controller.aborted(signal);
321
+ delete this.#controllers[rid];
265
322
  }, {
266
323
  once: true
267
324
  });
268
325
  return signal;
269
326
  }
327
+ get events() {
328
+ return this.#events;
329
+ }
270
330
  async sendEvent(procedure, ...args) {
271
331
  const config = args[0] ?? {};
272
332
  return withSpan(this.#tracer, SpanNames.CLIENT_CALL, {
@@ -300,7 +360,7 @@ export class Client extends Disposer {
300
360
  }
301
361
  request(procedure, ...args) {
302
362
  const config = args[0] ?? {};
303
- const rid = config.id ?? this.#getRandomID();
363
+ const rid = config.id ?? this.#runtime.getRandomID();
304
364
  const span = this.#tracer.startSpan(SpanNames.CLIENT_CALL, {
305
365
  attributes: {
306
366
  [AttributeKeys.RPC_SYSTEM]: 'enkaku',
@@ -357,8 +417,16 @@ export class Client extends Disposer {
357
417
  param: prm
358
418
  });
359
419
  }
360
- const sent = withActiveContext(spanCtx, ()=>this.#write(payload, config.header));
361
- this.#endSpanOnResult(span, controller.result);
420
+ this.#events.emit('requestStart', {
421
+ rid,
422
+ procedure,
423
+ type: controller.type
424
+ });
425
+ const sent = withActiveContext(spanCtx, ()=>this.#write(payload, config.header, rid));
426
+ this.#endSpanOnResult(span, controller.result, {
427
+ rid,
428
+ procedure
429
+ });
362
430
  const signal = this.#handleSignal(rid, controller, providedSignal);
363
431
  return createRequest({
364
432
  id: rid,
@@ -369,7 +437,7 @@ export class Client extends Disposer {
369
437
  }
370
438
  createStream(procedure, ...args) {
371
439
  const config = args[0] ?? {};
372
- const rid = config.id ?? this.#getRandomID();
440
+ const rid = config.id ?? this.#runtime.getRandomID();
373
441
  const span = this.#tracer.startSpan(SpanNames.CLIENT_CALL, {
374
442
  attributes: {
375
443
  [AttributeKeys.RPC_SYSTEM]: 'enkaku',
@@ -432,8 +500,16 @@ export class Client extends Disposer {
432
500
  param: prm
433
501
  });
434
502
  }
435
- const sent = withActiveContext(spanCtx, ()=>this.#write(payload, config.header));
436
- this.#endSpanOnResult(span, controller.result, rid);
503
+ this.#events.emit('requestStart', {
504
+ rid,
505
+ procedure,
506
+ type: controller.type
507
+ });
508
+ const sent = withActiveContext(spanCtx, ()=>this.#write(payload, config.header, rid));
509
+ this.#endSpanOnResult(span, controller.result, {
510
+ rid,
511
+ procedure
512
+ });
437
513
  const signal = this.#handleSignal(rid, controller, providedSignal);
438
514
  return createStream({
439
515
  id: rid,
@@ -445,7 +521,7 @@ export class Client extends Disposer {
445
521
  }
446
522
  createChannel(procedure, ...args) {
447
523
  const config = args[0] ?? {};
448
- const rid = config.id ?? this.#getRandomID();
524
+ const rid = config.id ?? this.#runtime.getRandomID();
449
525
  const span = this.#tracer.startSpan(SpanNames.CLIENT_CALL, {
450
526
  attributes: {
451
527
  [AttributeKeys.RPC_SYSTEM]: 'enkaku',
@@ -513,8 +589,16 @@ export class Client extends Disposer {
513
589
  param: prm
514
590
  });
515
591
  }
516
- const sent = withActiveContext(spanCtx, ()=>this.#write(payload, config.header));
517
- this.#endSpanOnResult(span, controller.result, rid);
592
+ this.#events.emit('requestStart', {
593
+ rid,
594
+ procedure,
595
+ type: controller.type
596
+ });
597
+ const sent = withActiveContext(spanCtx, ()=>this.#write(payload, config.header, rid));
598
+ this.#endSpanOnResult(span, controller.result, {
599
+ rid,
600
+ procedure
601
+ });
518
602
  const signal = this.#handleSignal(rid, controller, providedSignal);
519
603
  const send = async (val)=>{
520
604
  const channelSpan = this.#spans[rid];
@@ -532,7 +616,7 @@ export class Client extends Disposer {
532
616
  typ: 'send',
533
617
  rid,
534
618
  val
535
- }, config.header);
619
+ }, config.header, rid);
536
620
  };
537
621
  return Object.assign(createStream({
538
622
  id: rid,
package/lib/error.d.ts CHANGED
@@ -14,4 +14,3 @@ export declare class RequestError<Code extends string = string, Data extends Rec
14
14
  toString(): string;
15
15
  toJSON(): ErrorObjectType<Code, Data>;
16
16
  }
17
- //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1,39 @@
1
+ import type { EventEmitter } from '@enkaku/event';
2
+ import type { RequestError } from './error.js';
3
+ export type ClientRequestStatus = 'ok' | 'error' | 'aborted';
4
+ export type ClientEvents = {
5
+ disposed: {
6
+ reason?: unknown;
7
+ };
8
+ disposing: {
9
+ reason?: unknown;
10
+ };
11
+ requestEnd: {
12
+ rid: string;
13
+ procedure: string;
14
+ status: ClientRequestStatus;
15
+ };
16
+ requestError: {
17
+ rid: string;
18
+ error: Error | RequestError;
19
+ };
20
+ requestStart: {
21
+ rid: string;
22
+ procedure: string;
23
+ type: string;
24
+ };
25
+ transportError: {
26
+ error: Error;
27
+ };
28
+ transportReplaced: Record<string, never>;
29
+ writeDropped: {
30
+ rid?: string;
31
+ reason: unknown;
32
+ error: Error;
33
+ };
34
+ writeFailed: {
35
+ error: Error;
36
+ rid?: string;
37
+ };
38
+ };
39
+ export type ClientEmitter = EventEmitter<ClientEvents>;
package/lib/events.js ADDED
@@ -0,0 +1 @@
1
+ export { };
package/lib/index.d.ts CHANGED
@@ -12,4 +12,4 @@
12
12
  export type { ChannelCall, ChannelDefinitionsType, ClientDefinitionsType, ClientParams, EventDefinitionsType, RequestCall, RequestDefinitionsType, StreamCall, StreamDefinitionsType, } from './client.js';
13
13
  export { Client } from './client.js';
14
14
  export { type ErrorObjectType, RequestError, type RequestErrorParams } from './error.js';
15
- //# sourceMappingURL=index.d.ts.map
15
+ export type { ClientEmitter, ClientEvents, ClientRequestStatus } from './events.js';
@@ -0,0 +1,28 @@
1
+ import type { ClientEmitter } from './events.js';
2
+ export type WriteTarget = {
3
+ write: (message: unknown) => Promise<void>;
4
+ };
5
+ export type SafeWriteParams = {
6
+ transport: WriteTarget;
7
+ message: unknown;
8
+ rid?: string;
9
+ events: ClientEmitter;
10
+ signal: AbortSignal;
11
+ /**
12
+ * Called with the raw transport error when a write fails for a reason that
13
+ * is NOT a benign teardown. Benign teardown errors are absorbed as
14
+ * `writeDropped` events and do NOT invoke this callback. The callback is
15
+ * the client's hook to propagate the failure into the per-rid controller so
16
+ * the request/stream/channel promise rejects rather than hanging.
17
+ */
18
+ onFailure?: (error: Error) => void;
19
+ };
20
+ /**
21
+ * Send a client message through the transport. Classifies any failure as
22
+ * either a benign teardown (swallowed → `writeDropped` event) or a real
23
+ * transport failure (`writeFailed` event + `onFailure` hook for per-call
24
+ * surfacing). Never rejects, so fire-and-forget callers do not need a
25
+ * `.catch`; direct callers can still observe the failure by subscribing to
26
+ * the events emitter or by supplying `onFailure`.
27
+ */
28
+ export declare function safeWrite(params: SafeWriteParams): Promise<void>;
@@ -0,0 +1,29 @@
1
+ import { isBenignTeardownError } from '@enkaku/async';
2
+ /**
3
+ * Send a client message through the transport. Classifies any failure as
4
+ * either a benign teardown (swallowed → `writeDropped` event) or a real
5
+ * transport failure (`writeFailed` event + `onFailure` hook for per-call
6
+ * surfacing). Never rejects, so fire-and-forget callers do not need a
7
+ * `.catch`; direct callers can still observe the failure by subscribing to
8
+ * the events emitter or by supplying `onFailure`.
9
+ */ export async function safeWrite(params) {
10
+ const { transport, message, rid, events, signal, onFailure } = params;
11
+ try {
12
+ await transport.write(message);
13
+ return;
14
+ } catch (error) {
15
+ if (isBenignTeardownError(error) && signal.aborted) {
16
+ await events.emit('writeDropped', {
17
+ rid,
18
+ reason: 'disposing',
19
+ error: error
20
+ });
21
+ return;
22
+ }
23
+ await events.emit('writeFailed', {
24
+ error: error,
25
+ rid
26
+ });
27
+ onFailure?.(error);
28
+ }
29
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@enkaku/client",
3
- "version": "0.14.2",
3
+ "version": "0.14.4",
4
4
  "license": "MIT",
5
5
  "homepage": "https://enkaku.dev",
6
6
  "description": "Enkaku RPC client",
@@ -27,23 +27,24 @@
27
27
  "sideEffects": false,
28
28
  "dependencies": {
29
29
  "@enkaku/execution": "^0.14.0",
30
- "@enkaku/stream": "^0.14.1",
30
+ "@enkaku/runtime": "^0.14.0",
31
31
  "@enkaku/log": "^0.14.0",
32
- "@enkaku/async": "^0.14.0",
32
+ "@enkaku/event": "^0.14.1",
33
33
  "@enkaku/otel": "^0.14.0",
34
- "@enkaku/token": "^0.14.0"
34
+ "@enkaku/stream": "^0.14.1",
35
+ "@enkaku/token": "^0.14.1",
36
+ "@enkaku/async": "^0.14.1"
35
37
  },
36
38
  "devDependencies": {
37
39
  "@enkaku/protocol": "^0.14.0",
38
- "@enkaku/transport": "^0.14.0"
40
+ "@enkaku/transport": "^0.14.1"
39
41
  },
40
42
  "scripts": {
41
43
  "build:clean": "del lib",
42
44
  "build:js": "swc src -d ./lib --config-file ../../swc.json --strip-leading-paths",
43
45
  "build:types": "tsc --emitDeclarationOnly --skipLibCheck",
44
- "build:types:ci": "tsc --emitDeclarationOnly --skipLibCheck --declarationMap false",
45
46
  "build": "pnpm run build:clean && pnpm run build:js && pnpm run build:types",
46
- "test:types": "tsc --noEmit --skipLibCheck",
47
+ "test:types": "tsc --noEmit --skipLibCheck -p tsconfig.test.json",
47
48
  "test:unit": "vitest run",
48
49
  "test": "pnpm run test:types && pnpm run test:unit"
49
50
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEzD,MAAM,MAAM,eAAe,CACzB,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC5D;IACF,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,IAAI,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,kBAAkB,CAC5B,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC5D,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AAE9C,qBAAa,YAAY,CACrB,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEhE,SAAQ,KACR,YAAW,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;;IAEtC,MAAM,CAAC,WAAW,CAChB,IAAI,SAAS,MAAM,GAAG,MAAM,EAC5B,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,OAAO,EAAE,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;gBAWvD,MAAM,EAAE,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC;IAOlD,IAAI,IAAI,IAAI,IAAI,CAEf;IAED,IAAI,IAAI,IAAI,IAAI,CAEf;IAED,QAAQ;IAIR,MAAM,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC;CAGtC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,YAAY,EACV,WAAW,EACX,sBAAsB,EACtB,qBAAqB,EACrB,YAAY,EACZ,oBAAoB,EACpB,WAAW,EACX,sBAAsB,EACtB,UAAU,EACV,qBAAqB,GACtB,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,KAAK,eAAe,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAA"}