delaykit 0.1.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +264 -0
  3. package/dist/delaykit.d.ts +77 -0
  4. package/dist/delaykit.d.ts.map +1 -0
  5. package/dist/delaykit.js +525 -0
  6. package/dist/delaykit.js.map +1 -0
  7. package/dist/duration.d.ts +7 -0
  8. package/dist/duration.d.ts.map +1 -0
  9. package/dist/duration.js +38 -0
  10. package/dist/duration.js.map +1 -0
  11. package/dist/emitter.d.ts +9 -0
  12. package/dist/emitter.d.ts.map +1 -0
  13. package/dist/emitter.js +41 -0
  14. package/dist/emitter.js.map +1 -0
  15. package/dist/executor.d.ts +41 -0
  16. package/dist/executor.d.ts.map +1 -0
  17. package/dist/executor.js +98 -0
  18. package/dist/executor.js.map +1 -0
  19. package/dist/index.d.ts +10 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +6 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/result-handler.d.ts +23 -0
  24. package/dist/result-handler.d.ts.map +1 -0
  25. package/dist/result-handler.js +155 -0
  26. package/dist/result-handler.js.map +1 -0
  27. package/dist/schedulers/polling.d.ts +46 -0
  28. package/dist/schedulers/polling.d.ts.map +1 -0
  29. package/dist/schedulers/polling.js +148 -0
  30. package/dist/schedulers/polling.js.map +1 -0
  31. package/dist/schedulers/posthook.d.ts +29 -0
  32. package/dist/schedulers/posthook.d.ts.map +1 -0
  33. package/dist/schedulers/posthook.js +49 -0
  34. package/dist/schedulers/posthook.js.map +1 -0
  35. package/dist/stores/memory.d.ts +28 -0
  36. package/dist/stores/memory.d.ts.map +1 -0
  37. package/dist/stores/memory.js +282 -0
  38. package/dist/stores/memory.js.map +1 -0
  39. package/dist/stores/postgres-migrations.d.ts +6 -0
  40. package/dist/stores/postgres-migrations.d.ts.map +1 -0
  41. package/dist/stores/postgres-migrations.js +65 -0
  42. package/dist/stores/postgres-migrations.js.map +1 -0
  43. package/dist/stores/postgres.d.ts +32 -0
  44. package/dist/stores/postgres.d.ts.map +1 -0
  45. package/dist/stores/postgres.js +382 -0
  46. package/dist/stores/postgres.js.map +1 -0
  47. package/dist/types.d.ts +192 -0
  48. package/dist/types.d.ts.map +1 -0
  49. package/dist/types.js +4 -0
  50. package/dist/types.js.map +1 -0
  51. package/package.json +80 -0
@@ -0,0 +1,525 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { delayToDate, parseDuration } from "./duration.js";
3
+ import { executeJob } from "./executor.js";
4
+ import { DEFAULT_TIMEOUT_MS, STALLED_GRACE_MS } from "./types.js";
5
+ import { handleResult } from "./result-handler.js";
6
+ import { JobEventEmitter, emitStalled } from "./emitter.js";
7
+ /** Grace window for early delivery — absorbs clock drift between Posthook and the app. */
8
+ const CLOCK_DRIFT_MS = 5_000;
9
+ export class DelayKit {
10
+ store;
11
+ scheduler;
12
+ handlerConfigs = new Map();
13
+ retryConfigCache = new Map();
14
+ started = false;
15
+ emitter = new JobEventEmitter();
16
+ constructor(options) {
17
+ this.store = options.store;
18
+ this.scheduler = options.scheduler;
19
+ }
20
+ on(event, listener) {
21
+ return this.emitter.on(event, listener);
22
+ }
23
+ handle(name, handlerOrConfig) {
24
+ if (this.started) {
25
+ throw new Error(`Cannot register handler "${name}" after start() or createHandler(). Register all handlers before starting.`);
26
+ }
27
+ if (this.handlerConfigs.has(name)) {
28
+ throw new Error(`Handler "${name}" is already registered.`);
29
+ }
30
+ if (!name || /[^a-zA-Z0-9_-]/.test(name)) {
31
+ throw new Error(`Invalid handler name "${name}". Use only letters, numbers, hyphens, and underscores.`);
32
+ }
33
+ this.handlerConfigs.set(name, handlerOrConfig);
34
+ // Pre-compute retry config (avoids parseDuration on every schedule call)
35
+ if (typeof handlerOrConfig !== "function" && handlerOrConfig.retry && handlerOrConfig.retry.attempts > 1) {
36
+ const r = handlerOrConfig.retry;
37
+ this.retryConfigCache.set(name, {
38
+ attempts: r.attempts,
39
+ backoff: r.backoff ?? "fixed",
40
+ initialDelayMs: r.initialDelay ? parseDuration(r.initialDelay) : 1_000,
41
+ maxDelayMs: r.maxDelay ? parseDuration(r.maxDelay) : Infinity,
42
+ jitter: r.jitter ?? false,
43
+ });
44
+ }
45
+ }
46
+ async schedule(handler, options) {
47
+ this.validateHandler(handler);
48
+ this.validateScheduleOptions(options);
49
+ const scheduledFor = options.at ?? delayToDate(options.delay);
50
+ const onDuplicate = options.onDuplicate ?? "skip";
51
+ for (let attempt = 0; attempt < 2; attempt++) {
52
+ const existing = await this.store.getActiveJobByKey(handler, options.key);
53
+ if (existing) {
54
+ if (existing.kind !== "once") {
55
+ throw new Error(`Cannot schedule key "${options.key}": a ${existing.kind} pattern is active for this key.`);
56
+ }
57
+ if (onDuplicate === "skip") {
58
+ return { job: existing, created: false };
59
+ }
60
+ if (existing.status === "running") {
61
+ return { job: existing, created: false };
62
+ }
63
+ const replaced = await this.store.replaceJob(existing.id, scheduledFor, this.getMaxAttempts(handler));
64
+ if (!replaced) {
65
+ const current = await this.store.getActiveJobByKey(handler, options.key);
66
+ return { job: current ?? existing, created: false };
67
+ }
68
+ // Materialize new wake first, then cancel old. If cancel fails,
69
+ // the stale hook is harmless — schedulerRef guard rejects it.
70
+ // If we cancelled first and materialize failed, the job would be stranded.
71
+ try {
72
+ await this.materializeWakeup(replaced.id, replaced.version, scheduledFor, handler, options.key);
73
+ }
74
+ catch (err) {
75
+ await this.store.markRunning(replaced.id, replaced.version);
76
+ await this.store.markFailed(replaced.id, replaced.version, err instanceof Error ? err : new Error(String(err)));
77
+ throw err;
78
+ }
79
+ if (existing.schedulerRef) {
80
+ try {
81
+ await this.scheduler.cancel(existing.schedulerRef);
82
+ }
83
+ catch {
84
+ // Best-effort — old delivery rejected by schedulerRef guard
85
+ }
86
+ }
87
+ this.emitScheduled(replaced);
88
+ return { job: replaced, created: true };
89
+ }
90
+ // No existing job — scheduler-first, then insert
91
+ const id = randomUUID();
92
+ const ref = await this.scheduler.schedule({ id, version: 1, at: scheduledFor, handler, key: options.key, retry: this.getRetryConfig(handler) });
93
+ try {
94
+ const job = await this.store.createJob({
95
+ id,
96
+ kind: "once",
97
+ handler,
98
+ key: options.key,
99
+ version: 1,
100
+ claimedVersion: null,
101
+ status: "pending",
102
+ scheduledFor,
103
+ startedAt: null,
104
+ completedAt: null,
105
+ attempt: 0,
106
+ maxAttempts: this.getMaxAttempts(handler),
107
+ schedulerRef: ref,
108
+ lastError: null,
109
+ firstAt: null,
110
+ lastAt: null,
111
+ waitMs: null,
112
+ maxWaitMs: null,
113
+ });
114
+ this.emitScheduled(job);
115
+ return { job, created: true };
116
+ }
117
+ catch (err) {
118
+ if (err.message?.includes("concurrent insert") && attempt === 0) {
119
+ continue; // Retry — loop re-reads and applies full validation
120
+ }
121
+ throw err;
122
+ }
123
+ }
124
+ // Should not reach here, but satisfy TypeScript
125
+ throw new Error(`Failed to schedule key "${options.key}" after retry`);
126
+ }
127
+ async debounce(handler, options) {
128
+ this.validateHandler(handler);
129
+ if (!options.key)
130
+ throw new Error("Key is required for debounce.");
131
+ if (!options.wait)
132
+ throw new Error('Wait is required for debounce (e.g., "5m").');
133
+ const waitMs = parseDuration(options.wait);
134
+ const maxWaitMs = options.maxWait ? parseDuration(options.maxWait) : null;
135
+ const now = new Date();
136
+ // Try to update existing window (no new hook needed)
137
+ const updated = await this.store.updatePatternEvent(options.key, handler, "debounce", now, waitMs, maxWaitMs);
138
+ if (updated)
139
+ return;
140
+ // New window: scheduler-first, then insert
141
+ const id = randomUUID();
142
+ const scheduledFor = new Date(now.getTime() + waitMs);
143
+ const ref = await this.scheduler.schedule({ id, version: 1, at: scheduledFor, handler, key: options.key, retry: this.getRetryConfig(handler) });
144
+ try {
145
+ const job = await this.store.createJob({
146
+ id,
147
+ kind: "debounce",
148
+ handler,
149
+ key: options.key,
150
+ version: 1,
151
+ claimedVersion: null,
152
+ status: "pending",
153
+ scheduledFor,
154
+ startedAt: null,
155
+ completedAt: null,
156
+ attempt: 0,
157
+ maxAttempts: this.getMaxAttempts(handler),
158
+ schedulerRef: ref,
159
+ lastError: null,
160
+ firstAt: now,
161
+ lastAt: now,
162
+ waitMs,
163
+ maxWaitMs,
164
+ });
165
+ this.emitScheduled(job);
166
+ }
167
+ catch (err) {
168
+ if (err.message?.includes("concurrent insert")) {
169
+ // Another call won the insert — our hook is stale (harmless)
170
+ // Retry as update on the winner
171
+ await this.store.updatePatternEvent(options.key, handler, "debounce", now, waitMs, maxWaitMs);
172
+ return;
173
+ }
174
+ throw err;
175
+ }
176
+ }
177
+ async throttle(handler, options) {
178
+ this.validateHandler(handler);
179
+ if (!options.key)
180
+ throw new Error("Key is required for throttle.");
181
+ if (!options.wait)
182
+ throw new Error('Wait is required for throttle (e.g., "2m").');
183
+ const waitMs = parseDuration(options.wait);
184
+ const now = new Date();
185
+ // Try to update existing window
186
+ const updated = await this.store.updatePatternEvent(options.key, handler, "throttle", now, waitMs, null);
187
+ if (updated)
188
+ return;
189
+ // New window: scheduler-first, then insert
190
+ const id = randomUUID();
191
+ const scheduledFor = new Date(now.getTime() + waitMs);
192
+ const ref = await this.scheduler.schedule({ id, version: 1, at: scheduledFor, handler, key: options.key, retry: this.getRetryConfig(handler) });
193
+ try {
194
+ const job = await this.store.createJob({
195
+ id,
196
+ kind: "throttle",
197
+ handler,
198
+ key: options.key,
199
+ version: 1,
200
+ claimedVersion: null,
201
+ status: "pending",
202
+ scheduledFor,
203
+ startedAt: null,
204
+ completedAt: null,
205
+ attempt: 0,
206
+ maxAttempts: this.getMaxAttempts(handler),
207
+ schedulerRef: ref,
208
+ lastError: null,
209
+ firstAt: now,
210
+ lastAt: now,
211
+ waitMs,
212
+ maxWaitMs: null,
213
+ });
214
+ this.emitScheduled(job);
215
+ }
216
+ catch (err) {
217
+ if (err.message?.includes("concurrent insert")) {
218
+ await this.store.updatePatternEvent(options.key, handler, "throttle", now, waitMs, null);
219
+ return;
220
+ }
221
+ throw err;
222
+ }
223
+ }
224
+ async cancel(id) {
225
+ const job = await this.store.getJob(id);
226
+ if (!job || job.status !== "pending") {
227
+ return false;
228
+ }
229
+ const cancelled = await this.store.cancelJob(id);
230
+ if (!cancelled)
231
+ return false;
232
+ const now = new Date();
233
+ this.emitter.emit({
234
+ type: "job:cancelled",
235
+ job: { ...job, status: "cancelled", completedAt: now },
236
+ timestamp: now,
237
+ });
238
+ if (job.schedulerRef) {
239
+ try {
240
+ await this.scheduler.cancel(job.schedulerRef);
241
+ }
242
+ catch {
243
+ // Logical cancellation succeeded; physical cleanup is best-effort
244
+ }
245
+ }
246
+ return true;
247
+ }
248
+ async getJob(id) {
249
+ return this.store.getJob(id);
250
+ }
251
+ async getJobByKey(handler, key) {
252
+ return this.store.getActiveJobByKey(handler, key);
253
+ }
254
+ async unschedule(handler, key) {
255
+ const job = await this.store.getActiveJobByKey(handler, key);
256
+ if (!job)
257
+ return false;
258
+ if (job.status !== "pending")
259
+ return false;
260
+ return this.cancel(job.id);
261
+ }
262
+ async start() {
263
+ if (this.started)
264
+ return;
265
+ this.scheduler.init?.({
266
+ store: this.store,
267
+ handlers: this.buildPollingHandlers(),
268
+ emit: this.emitter.emit,
269
+ });
270
+ await this.scheduler.start();
271
+ this.started = true;
272
+ }
273
+ async stop() {
274
+ if (!this.started)
275
+ return;
276
+ await this.scheduler.stop();
277
+ this.started = false;
278
+ }
279
+ /**
280
+ * Run one poll cycle: find due jobs and execute them concurrently.
281
+ * Use this from a Vercel cron route instead of start():
282
+ *
283
+ * ```ts
284
+ * // app/api/delaykit/poll/route.ts
285
+ * export async function GET() {
286
+ * await dk().poll({ batchSize: 10, timeout: "8s" });
287
+ * return Response.json({ ok: true });
288
+ * }
289
+ * ```
290
+ *
291
+ * ```json
292
+ * // vercel.json
293
+ * { "crons": [{ "path": "/api/delaykit/poll", "schedule": "* * * * *" }] }
294
+ * ```
295
+ *
296
+ * @param options.batchSize - Jobs per batch, run concurrently. Keeps
297
+ * processing batches until no more due jobs or timeout. Default: 10.
298
+ * @param options.timeout - Hard deadline for the poll cycle. If the timeout
299
+ * elapses, poll() returns. Jobs still running are left in 'running' state
300
+ * and recovered by stalled job recovery on the next cycle.
301
+ * Example: "8s" on Vercel Hobby (10s function limit).
302
+ */
303
+ async poll(options) {
304
+ this.started = true; // freeze handler registration
305
+ const handlers = this.buildPollingHandlers();
306
+ const batchSize = options?.batchSize ?? 10;
307
+ // Reclaim stalled jobs from previous cycles (e.g., timeout killed the function)
308
+ const timeouts = new Map();
309
+ for (const [name, entry] of handlers) {
310
+ timeouts.set(name, entry.timeoutMs);
311
+ }
312
+ const reclaimed = await this.store.reclaimStalledJobs(timeouts);
313
+ for (const job of reclaimed) {
314
+ const timeout = timeouts.get(job.handler) ?? DEFAULT_TIMEOUT_MS;
315
+ emitStalled(this.emitter.emit, job, timeout + STALLED_GRACE_MS);
316
+ }
317
+ const emit = this.emitter.emit;
318
+ const deadline = options?.timeout
319
+ ? Date.now() + parseDuration(options.timeout)
320
+ : null;
321
+ // Process due jobs in batches. Loop until no more due jobs or deadline reached.
322
+ while (true) {
323
+ if (deadline && Date.now() >= deadline)
324
+ break;
325
+ const dueJobs = await this.store.getDueJobs(batchSize);
326
+ if (dueJobs.length === 0)
327
+ break;
328
+ const batch = Promise.all(dueJobs.map(async (job) => {
329
+ try {
330
+ const result = await executeJob({ jobId: job.id, version: job.version }, this.store, handlers, emit);
331
+ await handleResult(result, {
332
+ store: this.store,
333
+ handlers,
334
+ schedule: this.scheduler.schedule.bind(this.scheduler),
335
+ cancel: this.scheduler.cancel.bind(this.scheduler),
336
+ emit,
337
+ });
338
+ }
339
+ catch (err) {
340
+ console.error(`[delaykit] Error processing job ${job.id}:`, err);
341
+ }
342
+ }));
343
+ if (deadline) {
344
+ const remaining = deadline - Date.now();
345
+ if (remaining <= 0)
346
+ break;
347
+ await Promise.race([
348
+ batch,
349
+ new Promise((resolve) => setTimeout(resolve, remaining)),
350
+ ]);
351
+ }
352
+ else {
353
+ await batch;
354
+ }
355
+ // If we got fewer than limit, there are no more due jobs
356
+ if (dueJobs.length < batchSize)
357
+ break;
358
+ }
359
+ }
360
+ /**
361
+ * Creates a webhook route handler for PosthookScheduler delivery.
362
+ * Mount this as a POST handler in your Next.js app:
363
+ *
364
+ * ```ts
365
+ * // app/api/delaykit/route.ts
366
+ * export const runtime = 'nodejs';
367
+ * export const POST = dk().createHandler();
368
+ * ```
369
+ */
370
+ createHandler() {
371
+ this.started = true; // freeze handler registration
372
+ const store = this.store;
373
+ const scheduler = this.scheduler;
374
+ const handlers = this.buildPollingHandlers();
375
+ const emit = this.emitter.emit;
376
+ return async (req) => {
377
+ // Verify the delivery
378
+ if (!scheduler.verifyDelivery) {
379
+ return new Response(JSON.stringify({ error: "Scheduler does not support webhook delivery" }), { status: 500, headers: { "Content-Type": "application/json" } });
380
+ }
381
+ let jobId;
382
+ let hookId;
383
+ try {
384
+ const body = await req.text();
385
+ const delivery = scheduler.verifyDelivery(body, req.headers);
386
+ jobId = delivery.data.jobId;
387
+ hookId = delivery.hookId;
388
+ }
389
+ catch (err) {
390
+ const message = err instanceof Error ? err.message : "Verification failed";
391
+ return new Response(JSON.stringify({ error: message }), { status: 401, headers: { "Content-Type": "application/json" } });
392
+ }
393
+ // Load current row — Posthook hooks carry only jobId, not version.
394
+ const job = await store.getJob(jobId);
395
+ if (!job || !["pending", "running"].includes(job.status)) {
396
+ return new Response(JSON.stringify({ status: "ok" }), { status: 200, headers: { "Content-Type": "application/json" } });
397
+ }
398
+ // Primary guard: artifact identity.
399
+ // If the row has a schedulerRef and it doesn't match this hook's ID,
400
+ // this is a stale artifact from a previous schedule/replace/reschedule.
401
+ // A current hook should still exist for this job — safe to ignore.
402
+ if (job.schedulerRef && hookId !== job.schedulerRef) {
403
+ return new Response(JSON.stringify({ status: "ok" }), { status: 200, headers: { "Content-Type": "application/json" } });
404
+ }
405
+ // Secondary guard: timing.
406
+ // If this IS the current artifact but scheduledFor hasn't arrived yet,
407
+ // return 500 so the scheduler retries later. Returning 200 would strand
408
+ // the job if no other wake is coming.
409
+ if (job.kind === "once" && job.scheduledFor.getTime() > Date.now() + CLOCK_DRIFT_MS) {
410
+ return new Response(JSON.stringify({ status: "retry" }), { status: 500, headers: { "Content-Type": "application/json" } });
411
+ }
412
+ // Execute the job using its current version
413
+ const result = await executeJob({ jobId, version: job.version }, store, handlers, emit);
414
+ // Handle the result — PosthookScheduler owns retry timing
415
+ const outcome = await handleResult(result, {
416
+ store,
417
+ handlers,
418
+ schedule: scheduler.schedule.bind(scheduler),
419
+ cancel: scheduler.cancel.bind(scheduler),
420
+ externalRetries: true,
421
+ emit,
422
+ });
423
+ if (outcome === "retry") {
424
+ return new Response(JSON.stringify({ status: "retry" }), { status: 500, headers: { "Content-Type": "application/json" } });
425
+ }
426
+ return new Response(JSON.stringify({ status: "ok" }), { status: 200, headers: { "Content-Type": "application/json" } });
427
+ };
428
+ }
429
+ // --- Private ---
430
+ emitScheduled(job) {
431
+ this.emitter.emit({
432
+ type: "job:scheduled",
433
+ job: { ...job },
434
+ timestamp: new Date(),
435
+ });
436
+ }
437
+ async materializeWakeup(jobId, version, scheduledFor, handler, key) {
438
+ const ref = await this.scheduler.schedule({ id: jobId, version, at: scheduledFor, handler, key, retry: this.getRetryConfig(handler) });
439
+ if (!ref)
440
+ return;
441
+ const stored = await this.store.updateSchedulerRef(jobId, version, ref);
442
+ if (!stored) {
443
+ try {
444
+ await this.scheduler.cancel(ref);
445
+ }
446
+ catch { /* best-effort */ }
447
+ }
448
+ }
449
+ buildHandlers() {
450
+ const entries = new Map();
451
+ for (const [name, config] of this.handlerConfigs) {
452
+ if (typeof config === "function") {
453
+ entries.set(name, { fn: config, timeoutMs: DEFAULT_TIMEOUT_MS });
454
+ }
455
+ else {
456
+ entries.set(name, {
457
+ fn: config.handler,
458
+ timeoutMs: config.timeout ? parseDuration(config.timeout) : DEFAULT_TIMEOUT_MS,
459
+ });
460
+ }
461
+ }
462
+ return entries;
463
+ }
464
+ buildPollingHandlers() {
465
+ const entries = new Map();
466
+ for (const [name, config] of this.handlerConfigs) {
467
+ if (typeof config === "function") {
468
+ entries.set(name, {
469
+ fn: config,
470
+ timeoutMs: DEFAULT_TIMEOUT_MS,
471
+ retry: {
472
+ maxAttempts: 1,
473
+ initialDelayMs: 1_000,
474
+ maxDelayMs: Infinity,
475
+ backoff: "fixed",
476
+ jitter: false,
477
+ },
478
+ });
479
+ }
480
+ else {
481
+ const retry = config.retry;
482
+ entries.set(name, {
483
+ fn: config.handler,
484
+ timeoutMs: config.timeout ? parseDuration(config.timeout) : DEFAULT_TIMEOUT_MS,
485
+ retry: {
486
+ maxAttempts: retry?.attempts ?? 1,
487
+ initialDelayMs: retry?.initialDelay ? parseDuration(retry.initialDelay) : 1_000,
488
+ maxDelayMs: retry?.maxDelay ? parseDuration(retry.maxDelay) : Infinity,
489
+ backoff: retry?.backoff ?? "fixed",
490
+ jitter: retry?.jitter ?? false,
491
+ onFailure: config.onFailure,
492
+ },
493
+ });
494
+ }
495
+ }
496
+ return entries;
497
+ }
498
+ getMaxAttempts(handler) {
499
+ const config = this.handlerConfigs.get(handler);
500
+ if (!config || typeof config === "function")
501
+ return 1;
502
+ const attempts = config.retry?.attempts ?? 1;
503
+ return this.scheduler.maxAttempts ? Math.min(attempts, this.scheduler.maxAttempts) : attempts;
504
+ }
505
+ getRetryConfig(handler) {
506
+ return this.retryConfigCache.get(handler);
507
+ }
508
+ validateHandler(name) {
509
+ if (!this.handlerConfigs.has(name)) {
510
+ throw new Error(`No handler registered for "${name}". Call dk.handle("${name}", ...) before scheduling.`);
511
+ }
512
+ }
513
+ validateScheduleOptions(options) {
514
+ if (!options.key) {
515
+ throw new Error("Key is required. DelayKit is reference-based — the key identifies the business object this job acts on.");
516
+ }
517
+ if (!options.delay && !options.at) {
518
+ throw new Error('Either "delay" (e.g., "24h") or "at" (Date) is required.');
519
+ }
520
+ if (options.delay && options.at) {
521
+ throw new Error('Provide either "delay" or "at", not both.');
522
+ }
523
+ }
524
+ }
525
+ //# sourceMappingURL=delaykit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delaykit.js","sourceRoot":"","sources":["../src/delaykit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAe3C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAElE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE5D,0FAA0F;AAC1F,MAAM,cAAc,GAAG,KAAK,CAAC;AAO7B,MAAM,OAAO,QAAQ;IACX,KAAK,CAAQ;IACb,SAAS,CAAY;IACrB,cAAc,GAAG,IAAI,GAAG,EAAqC,CAAC;IAC9D,gBAAgB,GAAG,IAAI,GAAG,EAAgC,CAAC;IAC3D,OAAO,GAAG,KAAK,CAAC;IAChB,OAAO,GAAG,IAAI,eAAe,EAAE,CAAC;IAExC,YAAY,OAAwB;QAClC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACrC,CAAC;IAED,EAAE,CAAyB,KAAQ,EAAE,QAA6B;QAChE,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,eAA0C;QAC7D,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,4BAA4B,IAAI,4EAA4E,CAC7G,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,0BAA0B,CAAC,CAAC;QAC9D,CAAC;QACD,IAAI,CAAC,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CACb,yBAAyB,IAAI,yDAAyD,CACvF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;QAE/C,yEAAyE;QACzE,IAAI,OAAO,eAAe,KAAK,UAAU,IAAI,eAAe,CAAC,KAAK,IAAI,eAAe,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;YACzG,MAAM,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC;YAChC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE;gBAC9B,QAAQ,EAAE,CAAC,CAAC,QAAQ;gBACpB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,OAAO;gBAC7B,cAAc,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK;gBACtE,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ;gBAC7D,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,KAAK;aAC1B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe,EAAE,OAAwB;QACtD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC;QAEtC,MAAM,YAAY,GAAG,OAAO,CAAC,EAAE,IAAI,WAAW,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,MAAM,CAAC;QAElD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,CAAC;YAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;YAE1E,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC7B,MAAM,IAAI,KAAK,CACb,wBAAwB,OAAO,CAAC,GAAG,QAAQ,QAAQ,CAAC,IAAI,kCAAkC,CAC3F,CAAC;gBACJ,CAAC;gBAED,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;oBAC3B,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBAC3C,CAAC;gBAED,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;oBAClC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBAC3C,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAC1C,QAAQ,CAAC,EAAE,EACX,YAAY,EACZ,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAC7B,CAAC;gBAEF,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;oBACzE,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBACtD,CAAC;gBAED,gEAAgE;gBAChE,8DAA8D;gBAC9D,2EAA2E;gBAC3E,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;gBAClG,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;oBAC5D,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAChH,MAAM,GAAG,CAAC;gBACZ,CAAC;gBAED,IAAI,QAAQ,CAAC,YAAY,EAAE,CAAC;oBAC1B,IAAI,CAAC;wBACH,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;oBACrD,CAAC;oBAAC,MAAM,CAAC;wBACP,4DAA4D;oBAC9D,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;gBAC7B,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAC1C,CAAC;YAED,iDAAiD;YACjD,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;YACxB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAEhJ,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;oBACrC,EAAE;oBACF,IAAI,EAAE,MAAM;oBACZ,OAAO;oBACP,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,OAAO,EAAE,CAAC;oBACV,cAAc,EAAE,IAAI;oBACpB,MAAM,EAAE,SAAS;oBACjB,YAAY;oBACZ,SAAS,EAAE,IAAI;oBACf,WAAW,EAAE,IAAI;oBACjB,OAAO,EAAE,CAAC;oBACV,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;oBACzC,YAAY,EAAE,GAAG;oBACjB,SAAS,EAAE,IAAI;oBACf,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,IAAI;oBACZ,SAAS,EAAE,IAAI;iBAChB,CAAC,CAAC;gBACH,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBACxB,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YAChC,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;oBAChE,SAAS,CAAC,oDAAoD;gBAChE,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QAED,gDAAgD;QAChD,MAAM,IAAI,KAAK,CAAC,2BAA2B,OAAO,CAAC,GAAG,eAAe,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe,EAAE,OAAwB;QACtD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnE,IAAI,CAAC,OAAO,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAElF,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,qDAAqD;QACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,CACjD,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,CACzD,CAAC;QACF,IAAI,OAAO;YAAE,OAAO;QAEpB,2CAA2C;QAC3C,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEhJ,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;gBACrC,EAAE;gBACF,IAAI,EAAE,UAAU;gBAChB,OAAO;gBACP,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,OAAO,EAAE,CAAC;gBACV,cAAc,EAAE,IAAI;gBACpB,MAAM,EAAE,SAAS;gBACjB,YAAY;gBACZ,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI;gBACjB,OAAO,EAAE,CAAC;gBACV,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;gBACzC,YAAY,EAAE,GAAG;gBACjB,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,GAAG;gBACZ,MAAM,EAAE,GAAG;gBACX,MAAM;gBACN,SAAS;aACV,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC/C,6DAA6D;gBAC7D,gCAAgC;gBAChC,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,CACjC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,CACzD,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe,EAAE,OAAwB;QACtD,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnE,IAAI,CAAC,OAAO,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAElF,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,gCAAgC;QAChC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,CACjD,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CACpD,CAAC;QACF,IAAI,OAAO;YAAE,OAAO;QAEpB,2CAA2C;QAC3C,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEhJ,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;gBACrC,EAAE;gBACF,IAAI,EAAE,UAAU;gBAChB,OAAO;gBACP,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,OAAO,EAAE,CAAC;gBACV,cAAc,EAAE,IAAI;gBACpB,MAAM,EAAE,SAAS;gBACjB,YAAY;gBACZ,SAAS,EAAE,IAAI;gBACf,WAAW,EAAE,IAAI;gBACjB,OAAO,EAAE,CAAC;gBACV,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;gBACzC,YAAY,EAAE,GAAG;gBACjB,SAAS,EAAE,IAAI;gBACf,OAAO,EAAE,GAAG;gBACZ,MAAM,EAAE,GAAG;gBACX,MAAM;gBACN,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,CACjC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CACpD,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS;YAAE,OAAO,KAAK,CAAC;QAE7B,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,eAAe;YACrB,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE;YACtD,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,kEAAkE;YACpE,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAe,EAAE,GAAW;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAe,EAAE,GAAW;QAC3C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QACvB,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAC3C,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAEzB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACpB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,oBAAoB,EAAE;YACrC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;SACxB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;QAC1B,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;IACvB,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,KAAK,CAAC,IAAI,CAAC,OAAkD;QAC3D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,8BAA8B;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,EAAE,CAAC;QAE3C,gFAAgF;QAChF,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;YACrC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAChE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,kBAAkB,CAAC;YAChE,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,GAAG,gBAAgB,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAC/B,MAAM,QAAQ,GAAG,OAAO,EAAE,OAAO;YAC/B,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC;YAC7C,CAAC,CAAC,IAAI,CAAC;QAET,gFAAgF;QAChF,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;gBAAE,MAAM;YAE9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACvD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM;YAEhC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CACvB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;gBACxB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EACvC,IAAI,CAAC,KAAK,EACV,QAAQ,EACR,IAAI,CACL,CAAC;oBACF,MAAM,YAAY,CAAC,MAAM,EAAE;wBACzB,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,QAAQ;wBACR,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;wBACtD,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;wBAClD,IAAI;qBACL,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC,CAAC,CACH,CAAC;YAEF,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACxC,IAAI,SAAS,IAAI,CAAC;oBAAE,MAAM;gBAC1B,MAAM,OAAO,CAAC,IAAI,CAAC;oBACjB,KAAK;oBACL,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;iBAC/D,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,CAAC;YACd,CAAC;YAED,yDAAyD;YACzD,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS;gBAAE,MAAM;QACxC,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACH,aAAa;QACX,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,8BAA8B;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QAE/B,OAAO,KAAK,EAAE,GAAY,EAAqB,EAAE;YAC/C,sBAAsB;YACtB,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;gBAC9B,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,6CAA6C,EAAE,CAAC,EACxE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CACjE,CAAC;YACJ,CAAC;YAED,IAAI,KAAa,CAAC;YAClB,IAAI,MAAc,CAAC;YAEnB,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,SAAS,CAAC,cAAc,CACvC,IAAI,EACJ,GAAG,CAAC,OAAO,CACZ,CAAC;gBACF,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC5B,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC3B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC;gBAC3E,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAClC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CACjE,CAAC;YACJ,CAAC;YAED,mEAAmE;YACnE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzD,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAChC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CACjE,CAAC;YACJ,CAAC;YAED,oCAAoC;YACpC,qEAAqE;YACrE,wEAAwE;YACxE,mEAAmE;YACnE,IAAI,GAAG,CAAC,YAAY,IAAI,MAAM,KAAK,GAAG,CAAC,YAAY,EAAE,CAAC;gBACpD,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAChC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CACjE,CAAC;YACJ,CAAC;YAED,2BAA2B;YAC3B,uEAAuE;YACvE,wEAAwE;YACxE,sCAAsC;YACtC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,EAAE,CAAC;gBACpF,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EACnC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CACjE,CAAC;YACJ,CAAC;YAED,4CAA4C;YAC5C,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAC/B,KAAK,EACL,QAAQ,EACR,IAAI,CACL,CAAC;YAEF,0DAA0D;YAC1D,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE;gBACzC,KAAK;gBACL,QAAQ;gBACR,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC5C,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;gBACxC,eAAe,EAAE,IAAI;gBACrB,IAAI;aACL,CAAC,CAAC;YAEH,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACxB,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EACnC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CACjE,CAAC;YACJ,CAAC;YAED,OAAO,IAAI,QAAQ,CACjB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAChC,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CACjE,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAED,kBAAkB;IAEV,aAAa,CAAC,GAAQ;QAC5B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,IAAI,EAAE,eAAe;YACrB,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE;YACf,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,KAAa,EAAE,OAAe,EAAE,YAAkB,EAAE,OAAe,EAAE,GAAY;QAC/G,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACvI,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;QACxE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC;gBAAC,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,aAAa;QACX,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACjD,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACnE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE;oBAChB,EAAE,EAAE,MAAM,CAAC,OAAO;oBAClB,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB;iBAC/E,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,oBAAoB;QAC1B,MAAM,OAAO,GAAG,IAAI,GAAG,EAA+B,CAAC;QACvD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACjD,IAAI,OAAO,MAAM,KAAK,UAAU,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE;oBAChB,EAAE,EAAE,MAAM;oBACV,SAAS,EAAE,kBAAkB;oBAC7B,KAAK,EAAE;wBACL,WAAW,EAAE,CAAC;wBACd,cAAc,EAAE,KAAK;wBACrB,UAAU,EAAE,QAAQ;wBACpB,OAAO,EAAE,OAAO;wBAChB,MAAM,EAAE,KAAK;qBACd;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE;oBAChB,EAAE,EAAE,MAAM,CAAC,OAAO;oBAClB,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,kBAAkB;oBAC9E,KAAK,EAAE;wBACL,WAAW,EAAE,KAAK,EAAE,QAAQ,IAAI,CAAC;wBACjC,cAAc,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK;wBAC/E,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ;wBACtE,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,OAAO;wBAClC,MAAM,EAAE,KAAK,EAAE,MAAM,IAAI,KAAK;wBAC9B,SAAS,EAAE,MAAM,CAAC,SAAS;qBAC5B;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,cAAc,CAAC,OAAe;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,UAAU;YAAE,OAAO,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,QAAQ,IAAI,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAChG,CAAC;IAEO,cAAc,CAAC,OAAe;QACpC,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC;IAEO,eAAe,CAAC,IAAY;QAClC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CACb,8BAA8B,IAAI,sBAAsB,IAAI,4BAA4B,CACzF,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,uBAAuB,CAAC,OAAwB;QACtD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CACb,yGAAyG,CAC1G,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAClC,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Parse a duration string like '5s', '30m', '24h', '7d', '500ms', or compound '1h30m'.
3
+ * Returns milliseconds. Rejects malformed input (trailing text, unknown units).
4
+ */
5
+ export declare function parseDuration(input: string): number;
6
+ export declare function delayToDate(delay: string): Date;
7
+ //# sourceMappingURL=duration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration.d.ts","sourceRoot":"","sources":["../src/duration.ts"],"names":[],"mappings":"AAUA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgCnD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/C"}
@@ -0,0 +1,38 @@
1
+ const UNITS = {
2
+ ms: 1,
3
+ s: 1_000,
4
+ m: 60_000,
5
+ h: 3_600_000,
6
+ d: 86_400_000,
7
+ };
8
+ const TOKEN_PATTERN = /(\d+)\s*(ms|s|m|h|d)/g;
9
+ /**
10
+ * Parse a duration string like '5s', '30m', '24h', '7d', '500ms', or compound '1h30m'.
11
+ * Returns milliseconds. Rejects malformed input (trailing text, unknown units).
12
+ */
13
+ export function parseDuration(input) {
14
+ let total = 0;
15
+ let lastIndex = 0;
16
+ let match;
17
+ TOKEN_PATTERN.lastIndex = 0;
18
+ while ((match = TOKEN_PATTERN.exec(input)) !== null) {
19
+ if (match.index !== lastIndex) {
20
+ throw new Error(`Invalid duration: "${input}". Unexpected text at position ${lastIndex}.`);
21
+ }
22
+ const value = parseInt(match[1], 10);
23
+ const unit = match[2];
24
+ total += value * UNITS[unit];
25
+ lastIndex = TOKEN_PATTERN.lastIndex;
26
+ }
27
+ if (lastIndex === 0) {
28
+ throw new Error(`Invalid duration: "${input}". Use a duration like "5s", "30m", "24h", "7d", or compound "1h30m".`);
29
+ }
30
+ if (lastIndex !== input.length) {
31
+ throw new Error(`Invalid duration: "${input}". Unexpected text at position ${lastIndex}.`);
32
+ }
33
+ return total;
34
+ }
35
+ export function delayToDate(delay) {
36
+ return new Date(Date.now() + parseDuration(delay));
37
+ }
38
+ //# sourceMappingURL=duration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration.js","sourceRoot":"","sources":["../src/duration.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAA2B;IACpC,EAAE,EAAE,CAAC;IACL,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,MAAM;IACT,CAAC,EAAE,SAAS;IACZ,CAAC,EAAE,UAAU;CACd,CAAC;AAEF,MAAM,aAAa,GAAG,uBAAuB,CAAC;AAE9C;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,IAAI,KAA6B,CAAC;IAClC,aAAa,CAAC,SAAS,GAAG,CAAC,CAAC;IAE5B,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CACb,sBAAsB,KAAK,kCAAkC,SAAS,GAAG,CAC1E,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,KAAK,IAAI,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,SAAS,GAAG,aAAa,CAAC,SAAS,CAAC;IACtC,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,sBAAsB,KAAK,uEAAuE,CACnG,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CACb,sBAAsB,KAAK,kCAAkC,SAAS,GAAG,CAC1E,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Job, JobEventType, JobEventListener, EmitFn } from "./types.js";
2
+ export declare class JobEventEmitter {
3
+ private listeners;
4
+ /** Bound emit function — safe to pass as a dependency. Single instance, no closure per access. */
5
+ readonly emit: EmitFn;
6
+ on<E extends JobEventType>(event: E, listener: JobEventListener<E>): () => void;
7
+ }
8
+ export declare function emitStalled(emit: EmitFn | undefined, job: Job, stalledMs: number): void;
9
+ //# sourceMappingURL=emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../src/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAe,YAAY,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAE3F,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAuD;IAExE,kGAAkG;IAClG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAenB;IAEF,EAAE,CAAC,CAAC,SAAS,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI;CAShF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAQvF"}