@trigger.dev/sdk 2.2.6 → 2.2.8
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/dist/index.d.ts +274 -19
- package/dist/index.js +2319 -1564
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
package/dist/index.js
CHANGED
|
@@ -70,6 +70,8 @@ __export(src_exports, {
|
|
|
70
70
|
MissingConnectionNotification: () => MissingConnectionNotification,
|
|
71
71
|
MissingConnectionResolvedNotification: () => MissingConnectionResolvedNotification,
|
|
72
72
|
TriggerClient: () => TriggerClient,
|
|
73
|
+
WebhookSource: () => WebhookSource,
|
|
74
|
+
WebhookTrigger: () => WebhookTrigger,
|
|
73
75
|
cronTrigger: () => cronTrigger,
|
|
74
76
|
eventTrigger: () => eventTrigger,
|
|
75
77
|
intervalTrigger: () => intervalTrigger,
|
|
@@ -80,6 +82,7 @@ __export(src_exports, {
|
|
|
80
82
|
omit: () => omit,
|
|
81
83
|
redactString: () => redactString,
|
|
82
84
|
retry: () => retry,
|
|
85
|
+
slugifyId: () => slugifyId,
|
|
83
86
|
verifyHmacSha256: () => verifyHmacSha256,
|
|
84
87
|
verifyRequestSignature: () => verifyRequestSignature,
|
|
85
88
|
waitForEventSchema: () => waitForEventSchema
|
|
@@ -292,1721 +295,2067 @@ var import_core8 = require("@trigger.dev/core");
|
|
|
292
295
|
var import_colorette = require("colorette");
|
|
293
296
|
|
|
294
297
|
// src/apiClient.ts
|
|
298
|
+
var import_core3 = require("@trigger.dev/core");
|
|
299
|
+
var import_zod3 = require("zod");
|
|
300
|
+
|
|
301
|
+
// src/io.ts
|
|
302
|
+
var import_core2 = require("@trigger.dev/core");
|
|
303
|
+
var import_core_backend = require("@trigger.dev/core-backend");
|
|
304
|
+
var import_node_async_hooks2 = require("async_hooks");
|
|
305
|
+
var import_node_crypto = require("crypto");
|
|
306
|
+
|
|
307
|
+
// src/errors.ts
|
|
308
|
+
var ResumeWithTaskError = class {
|
|
309
|
+
constructor(task) {
|
|
310
|
+
this.task = task;
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
__name(ResumeWithTaskError, "ResumeWithTaskError");
|
|
314
|
+
var ResumeWithParallelTaskError = class {
|
|
315
|
+
constructor(task, childErrors) {
|
|
316
|
+
this.task = task;
|
|
317
|
+
this.childErrors = childErrors;
|
|
318
|
+
}
|
|
319
|
+
};
|
|
320
|
+
__name(ResumeWithParallelTaskError, "ResumeWithParallelTaskError");
|
|
321
|
+
var RetryWithTaskError = class {
|
|
322
|
+
constructor(cause, task, retryAt) {
|
|
323
|
+
this.cause = cause;
|
|
324
|
+
this.task = task;
|
|
325
|
+
this.retryAt = retryAt;
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
__name(RetryWithTaskError, "RetryWithTaskError");
|
|
329
|
+
var CanceledWithTaskError = class {
|
|
330
|
+
constructor(task) {
|
|
331
|
+
this.task = task;
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
__name(CanceledWithTaskError, "CanceledWithTaskError");
|
|
335
|
+
var YieldExecutionError = class {
|
|
336
|
+
constructor(key) {
|
|
337
|
+
this.key = key;
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
__name(YieldExecutionError, "YieldExecutionError");
|
|
341
|
+
var AutoYieldExecutionError = class {
|
|
342
|
+
constructor(location, timeRemaining, timeElapsed) {
|
|
343
|
+
this.location = location;
|
|
344
|
+
this.timeRemaining = timeRemaining;
|
|
345
|
+
this.timeElapsed = timeElapsed;
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
__name(AutoYieldExecutionError, "AutoYieldExecutionError");
|
|
349
|
+
var AutoYieldWithCompletedTaskExecutionError = class {
|
|
350
|
+
constructor(id, properties, data, output) {
|
|
351
|
+
this.id = id;
|
|
352
|
+
this.properties = properties;
|
|
353
|
+
this.data = data;
|
|
354
|
+
this.output = output;
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
__name(AutoYieldWithCompletedTaskExecutionError, "AutoYieldWithCompletedTaskExecutionError");
|
|
358
|
+
var ParsedPayloadSchemaError = class {
|
|
359
|
+
constructor(schemaErrors) {
|
|
360
|
+
this.schemaErrors = schemaErrors;
|
|
361
|
+
}
|
|
362
|
+
};
|
|
363
|
+
__name(ParsedPayloadSchemaError, "ParsedPayloadSchemaError");
|
|
364
|
+
function isTriggerError(err) {
|
|
365
|
+
return err instanceof ResumeWithTaskError || err instanceof RetryWithTaskError || err instanceof CanceledWithTaskError || err instanceof YieldExecutionError || err instanceof AutoYieldExecutionError || err instanceof AutoYieldWithCompletedTaskExecutionError || err instanceof ResumeWithParallelTaskError;
|
|
366
|
+
}
|
|
367
|
+
__name(isTriggerError, "isTriggerError");
|
|
368
|
+
var ErrorWithTask = class extends Error {
|
|
369
|
+
constructor(cause, message) {
|
|
370
|
+
super(message);
|
|
371
|
+
this.cause = cause;
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
__name(ErrorWithTask, "ErrorWithTask");
|
|
375
|
+
|
|
376
|
+
// src/retry.ts
|
|
295
377
|
var import_core = require("@trigger.dev/core");
|
|
296
|
-
var
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
378
|
+
var retry = {
|
|
379
|
+
standardBackoff: {
|
|
380
|
+
limit: 8,
|
|
381
|
+
factor: 1.8,
|
|
382
|
+
minTimeoutInMs: 500,
|
|
383
|
+
maxTimeoutInMs: 3e4,
|
|
384
|
+
randomize: true
|
|
385
|
+
},
|
|
386
|
+
exponentialBackoff: {
|
|
387
|
+
limit: 8,
|
|
388
|
+
factor: 2,
|
|
389
|
+
minTimeoutInMs: 1e3,
|
|
390
|
+
maxTimeoutInMs: 3e4,
|
|
391
|
+
randomize: true
|
|
307
392
|
}
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
})
|
|
324
|
-
});
|
|
325
|
-
if (response.status >= 400 && response.status < 500) {
|
|
326
|
-
const body = await response.json();
|
|
327
|
-
throw new Error(body.error);
|
|
393
|
+
};
|
|
394
|
+
|
|
395
|
+
// src/status.ts
|
|
396
|
+
var TriggerStatus = class {
|
|
397
|
+
constructor(id, io) {
|
|
398
|
+
this.id = id;
|
|
399
|
+
this.io = io;
|
|
400
|
+
}
|
|
401
|
+
async update(key, status) {
|
|
402
|
+
const properties = [];
|
|
403
|
+
if (status.label) {
|
|
404
|
+
properties.push({
|
|
405
|
+
label: "Label",
|
|
406
|
+
text: status.label
|
|
407
|
+
});
|
|
328
408
|
}
|
|
329
|
-
if (
|
|
330
|
-
|
|
409
|
+
if (status.state) {
|
|
410
|
+
properties.push({
|
|
411
|
+
label: "State",
|
|
412
|
+
text: status.state
|
|
413
|
+
});
|
|
331
414
|
}
|
|
332
|
-
return await
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
return await zodfetchWithVersions({
|
|
340
|
-
[import_core.API_VERSIONS.LAZY_LOADED_CACHED_TASKS]: import_core.RunTaskResponseWithCachedTasksBodySchema
|
|
341
|
-
}, import_core.ServerTaskSchema, `${__privateGet(this, _apiUrl)}/api/v1/runs/${runId}/tasks`, {
|
|
342
|
-
method: "POST",
|
|
343
|
-
headers: {
|
|
344
|
-
"Content-Type": "application/json",
|
|
345
|
-
Authorization: `Bearer ${apiKey}`,
|
|
346
|
-
"Idempotency-Key": task.idempotencyKey,
|
|
347
|
-
"X-Cached-Tasks-Cursor": options.cachedTasksCursor ?? "",
|
|
348
|
-
"Trigger-Version": import_core.API_VERSIONS.LAZY_LOADED_CACHED_TASKS
|
|
415
|
+
return await this.io.runTask(key, async (task) => {
|
|
416
|
+
return await this.io.triggerClient.updateStatus(this.io.runId, this.id, status);
|
|
417
|
+
}, {
|
|
418
|
+
name: status.label ?? `Status update`,
|
|
419
|
+
icon: "bell",
|
|
420
|
+
params: {
|
|
421
|
+
...status
|
|
349
422
|
},
|
|
350
|
-
|
|
423
|
+
properties
|
|
351
424
|
});
|
|
352
425
|
}
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
426
|
+
};
|
|
427
|
+
__name(TriggerStatus, "TriggerStatus");
|
|
428
|
+
|
|
429
|
+
// src/types.ts
|
|
430
|
+
var import_zod = require("zod");
|
|
431
|
+
var EventSpecificationExampleSchema = import_zod.z.object({
|
|
432
|
+
id: import_zod.z.string(),
|
|
433
|
+
name: import_zod.z.string(),
|
|
434
|
+
icon: import_zod.z.string().optional(),
|
|
435
|
+
payload: import_zod.z.any()
|
|
436
|
+
});
|
|
437
|
+
function waitForEventSchema(schema) {
|
|
438
|
+
return import_zod.z.object({
|
|
439
|
+
id: import_zod.z.string(),
|
|
440
|
+
name: import_zod.z.string(),
|
|
441
|
+
source: import_zod.z.string(),
|
|
442
|
+
payload: schema,
|
|
443
|
+
timestamp: import_zod.z.coerce.date(),
|
|
444
|
+
context: import_zod.z.any().optional(),
|
|
445
|
+
accountId: import_zod.z.string().optional()
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
__name(waitForEventSchema, "waitForEventSchema");
|
|
449
|
+
|
|
450
|
+
// src/io.ts
|
|
451
|
+
var import_zod2 = require("zod");
|
|
452
|
+
|
|
453
|
+
// src/store/keyValueStore.ts
|
|
454
|
+
var _namespacedKey, namespacedKey_fn, _sharedProperties, sharedProperties_fn;
|
|
455
|
+
var KeyValueStore = class {
|
|
456
|
+
constructor(apiClient, type = null, namespace = "") {
|
|
457
|
+
__privateAdd(this, _namespacedKey);
|
|
458
|
+
__privateAdd(this, _sharedProperties);
|
|
459
|
+
this.apiClient = apiClient;
|
|
460
|
+
this.type = type;
|
|
461
|
+
this.namespace = namespace;
|
|
462
|
+
}
|
|
463
|
+
async delete(param1, param2) {
|
|
464
|
+
const runStore = runLocalStorage.getStore();
|
|
465
|
+
if (!runStore) {
|
|
466
|
+
if (typeof param1 !== "string") {
|
|
467
|
+
throw new Error("Please use the store without a cacheKey when accessing from outside a run.");
|
|
468
|
+
}
|
|
469
|
+
return await this.apiClient.store.delete(__privateMethod(this, _namespacedKey, namespacedKey_fn).call(this, param1));
|
|
470
|
+
}
|
|
471
|
+
const { io } = runStore;
|
|
472
|
+
if (!param2) {
|
|
473
|
+
throw new Error("Please provide a non-empty key when accessing the store from inside a run.");
|
|
474
|
+
}
|
|
475
|
+
return await io.runTask(param1, async (task) => {
|
|
476
|
+
return await this.apiClient.store.delete(__privateMethod(this, _namespacedKey, namespacedKey_fn).call(this, param2));
|
|
477
|
+
}, {
|
|
478
|
+
name: "Key-Value Store Delete",
|
|
479
|
+
icon: "database-minus",
|
|
480
|
+
params: {
|
|
481
|
+
key: param2
|
|
364
482
|
},
|
|
365
|
-
|
|
483
|
+
properties: __privateMethod(this, _sharedProperties, sharedProperties_fn).call(this, param2),
|
|
484
|
+
style: {
|
|
485
|
+
style: "minimal"
|
|
486
|
+
}
|
|
366
487
|
});
|
|
367
488
|
}
|
|
368
|
-
async
|
|
369
|
-
const
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
489
|
+
async get(param1, param2) {
|
|
490
|
+
const runStore = runLocalStorage.getStore();
|
|
491
|
+
if (!runStore) {
|
|
492
|
+
if (typeof param1 !== "string") {
|
|
493
|
+
throw new Error("Please use the store without a cacheKey when accessing from outside a run.");
|
|
494
|
+
}
|
|
495
|
+
return await this.apiClient.store.get(__privateMethod(this, _namespacedKey, namespacedKey_fn).call(this, param1));
|
|
496
|
+
}
|
|
497
|
+
const { io } = runStore;
|
|
498
|
+
if (!param2) {
|
|
499
|
+
throw new Error("Please provide a non-empty key when accessing the store from inside a run.");
|
|
500
|
+
}
|
|
501
|
+
return await io.runTask(param1, async (task) => {
|
|
502
|
+
return await this.apiClient.store.get(__privateMethod(this, _namespacedKey, namespacedKey_fn).call(this, param2));
|
|
503
|
+
}, {
|
|
504
|
+
name: "Key-Value Store Get",
|
|
505
|
+
icon: "database-export",
|
|
506
|
+
params: {
|
|
507
|
+
key: param2
|
|
380
508
|
},
|
|
381
|
-
|
|
509
|
+
properties: __privateMethod(this, _sharedProperties, sharedProperties_fn).call(this, param2),
|
|
510
|
+
style: {
|
|
511
|
+
style: "minimal"
|
|
512
|
+
}
|
|
382
513
|
});
|
|
383
514
|
}
|
|
384
|
-
async
|
|
385
|
-
const
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
515
|
+
async has(param1, param2) {
|
|
516
|
+
const runStore = runLocalStorage.getStore();
|
|
517
|
+
if (!runStore) {
|
|
518
|
+
if (typeof param1 !== "string") {
|
|
519
|
+
throw new Error("Please use the store without a cacheKey when accessing from outside a run.");
|
|
520
|
+
}
|
|
521
|
+
return await this.apiClient.store.has(__privateMethod(this, _namespacedKey, namespacedKey_fn).call(this, param1));
|
|
522
|
+
}
|
|
523
|
+
const { io } = runStore;
|
|
524
|
+
if (!param2) {
|
|
525
|
+
throw new Error("Please provide a non-empty key when accessing the store from inside a run.");
|
|
526
|
+
}
|
|
527
|
+
return await io.runTask(param1, async (task) => {
|
|
528
|
+
return await this.apiClient.store.has(__privateMethod(this, _namespacedKey, namespacedKey_fn).call(this, param2));
|
|
529
|
+
}, {
|
|
530
|
+
name: "Key-Value Store Has",
|
|
531
|
+
icon: "database-search",
|
|
532
|
+
params: {
|
|
533
|
+
key: param2
|
|
394
534
|
},
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
}
|
|
535
|
+
properties: __privateMethod(this, _sharedProperties, sharedProperties_fn).call(this, param2),
|
|
536
|
+
style: {
|
|
537
|
+
style: "minimal"
|
|
538
|
+
}
|
|
399
539
|
});
|
|
400
540
|
}
|
|
401
|
-
async
|
|
402
|
-
const
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
return await zodfetch(import_core.ApiEventLogSchema.array(), `${__privateGet(this, _apiUrl)}/api/v1/events/bulk`, {
|
|
407
|
-
method: "POST",
|
|
408
|
-
headers: {
|
|
409
|
-
"Content-Type": "application/json",
|
|
410
|
-
Authorization: `Bearer ${apiKey}`
|
|
411
|
-
},
|
|
412
|
-
body: JSON.stringify({
|
|
413
|
-
events,
|
|
414
|
-
options
|
|
415
|
-
})
|
|
416
|
-
});
|
|
417
|
-
}
|
|
418
|
-
async cancelEvent(eventId) {
|
|
419
|
-
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
420
|
-
__privateGet(this, _logger).debug("Cancelling event", {
|
|
421
|
-
eventId
|
|
422
|
-
});
|
|
423
|
-
return await zodfetch(import_core.ApiEventLogSchema, `${__privateGet(this, _apiUrl)}/api/v1/events/${eventId}/cancel`, {
|
|
424
|
-
method: "POST",
|
|
425
|
-
headers: {
|
|
426
|
-
"Content-Type": "application/json",
|
|
427
|
-
Authorization: `Bearer ${apiKey}`
|
|
541
|
+
async set(param1, param2, param3) {
|
|
542
|
+
const runStore = runLocalStorage.getStore();
|
|
543
|
+
if (!runStore) {
|
|
544
|
+
if (typeof param1 !== "string") {
|
|
545
|
+
throw new Error("Please use the store without a cacheKey when accessing from outside a run.");
|
|
428
546
|
}
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
return await
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
547
|
+
return await this.apiClient.store.set(__privateMethod(this, _namespacedKey, namespacedKey_fn).call(this, param1), param2);
|
|
548
|
+
}
|
|
549
|
+
const { io } = runStore;
|
|
550
|
+
if (!param2 || typeof param2 !== "string") {
|
|
551
|
+
throw new Error("Please provide a non-empty key when accessing the store from inside a run.");
|
|
552
|
+
}
|
|
553
|
+
const value = param3;
|
|
554
|
+
return await io.runTask(param1, async (task) => {
|
|
555
|
+
return await this.apiClient.store.set(__privateMethod(this, _namespacedKey, namespacedKey_fn).call(this, param2), value);
|
|
556
|
+
}, {
|
|
557
|
+
name: "Key-Value Store Set",
|
|
558
|
+
icon: "database-plus",
|
|
559
|
+
params: {
|
|
560
|
+
key: param2,
|
|
561
|
+
value
|
|
562
|
+
},
|
|
563
|
+
properties: [
|
|
564
|
+
...__privateMethod(this, _sharedProperties, sharedProperties_fn).call(this, param2),
|
|
565
|
+
...typeof value !== "object" || value === null ? [
|
|
566
|
+
{
|
|
567
|
+
label: "value",
|
|
568
|
+
text: String(value) ?? "undefined"
|
|
569
|
+
}
|
|
570
|
+
] : []
|
|
571
|
+
],
|
|
572
|
+
style: {
|
|
573
|
+
style: "minimal"
|
|
441
574
|
}
|
|
442
575
|
});
|
|
443
576
|
}
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
577
|
+
};
|
|
578
|
+
__name(KeyValueStore, "KeyValueStore");
|
|
579
|
+
_namespacedKey = new WeakSet();
|
|
580
|
+
namespacedKey_fn = /* @__PURE__ */ __name(function(key) {
|
|
581
|
+
const parts = [];
|
|
582
|
+
if (this.type) {
|
|
583
|
+
parts.push(this.type);
|
|
584
|
+
}
|
|
585
|
+
if (this.namespace) {
|
|
586
|
+
parts.push(this.namespace);
|
|
587
|
+
}
|
|
588
|
+
parts.push(key);
|
|
589
|
+
return parts.join(":");
|
|
590
|
+
}, "#namespacedKey");
|
|
591
|
+
_sharedProperties = new WeakSet();
|
|
592
|
+
sharedProperties_fn = /* @__PURE__ */ __name(function(key1) {
|
|
593
|
+
return [
|
|
594
|
+
{
|
|
595
|
+
label: "namespace",
|
|
596
|
+
text: this.type ?? "env"
|
|
597
|
+
},
|
|
598
|
+
{
|
|
599
|
+
label: "key",
|
|
600
|
+
text: key1
|
|
601
|
+
}
|
|
602
|
+
];
|
|
603
|
+
}, "#sharedProperties");
|
|
604
|
+
|
|
605
|
+
// src/io.ts
|
|
606
|
+
var JSONOutputSerializer = class {
|
|
607
|
+
serialize(value) {
|
|
608
|
+
return JSON.stringify(value);
|
|
458
609
|
}
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
__privateGet(this, _logger).debug("activating http source", {
|
|
462
|
-
source
|
|
463
|
-
});
|
|
464
|
-
const response = await zodfetch(import_core.TriggerSourceSchema, `${__privateGet(this, _apiUrl)}/api/v2/${client}/sources/${key}`, {
|
|
465
|
-
method: "PUT",
|
|
466
|
-
headers: {
|
|
467
|
-
"Content-Type": "application/json",
|
|
468
|
-
Authorization: `Bearer ${apiKey}`
|
|
469
|
-
},
|
|
470
|
-
body: JSON.stringify(source)
|
|
471
|
-
});
|
|
472
|
-
return response;
|
|
610
|
+
deserialize(value) {
|
|
611
|
+
return value ? JSON.parse(value) : void 0;
|
|
473
612
|
}
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
613
|
+
};
|
|
614
|
+
__name(JSONOutputSerializer, "JSONOutputSerializer");
|
|
615
|
+
var _addToCachedTasks, addToCachedTasks_fn, _detectAutoYield, detectAutoYield_fn, _forceYield, forceYield_fn, _getTimeElapsed, getTimeElapsed_fn, _getRemainingTimeInMillis, getRemainingTimeInMillis_fn;
|
|
616
|
+
var IO = class {
|
|
617
|
+
constructor(options) {
|
|
618
|
+
__privateAdd(this, _addToCachedTasks);
|
|
619
|
+
__privateAdd(this, _detectAutoYield);
|
|
620
|
+
__privateAdd(this, _forceYield);
|
|
621
|
+
__privateAdd(this, _getTimeElapsed);
|
|
622
|
+
__privateAdd(this, _getRemainingTimeInMillis);
|
|
623
|
+
__publicField(this, "_outputSerializer", new JSONOutputSerializer());
|
|
624
|
+
__publicField(this, "_visitedCacheKeys", /* @__PURE__ */ new Set());
|
|
625
|
+
__publicField(this, "brb", this.yield.bind(this));
|
|
626
|
+
this._id = options.id;
|
|
627
|
+
this._jobId = options.jobId;
|
|
628
|
+
this._apiClient = options.apiClient;
|
|
629
|
+
this._triggerClient = options.client;
|
|
630
|
+
this._logger = options.logger ?? new import_core2.Logger("trigger.dev", options.logLevel);
|
|
631
|
+
this._cachedTasks = /* @__PURE__ */ new Map();
|
|
632
|
+
this._jobLogger = options.jobLogger;
|
|
633
|
+
this._jobLogLevel = options.jobLogLevel;
|
|
634
|
+
this._timeOrigin = options.timeOrigin;
|
|
635
|
+
this._executionTimeout = options.executionTimeout;
|
|
636
|
+
this._envStore = new KeyValueStore(options.apiClient);
|
|
637
|
+
this._jobStore = new KeyValueStore(options.apiClient, "job", options.jobId);
|
|
638
|
+
this._runStore = new KeyValueStore(options.apiClient, "run", options.id);
|
|
639
|
+
this._stats = {
|
|
640
|
+
initialCachedTasks: 0,
|
|
641
|
+
lazyLoadedCachedTasks: 0,
|
|
642
|
+
executedTasks: 0,
|
|
643
|
+
cachedTaskHits: 0,
|
|
644
|
+
cachedTaskMisses: 0,
|
|
645
|
+
noopCachedTaskHits: 0,
|
|
646
|
+
noopCachedTaskMisses: 0
|
|
483
647
|
};
|
|
484
|
-
if (
|
|
485
|
-
|
|
648
|
+
if (options.cachedTasks) {
|
|
649
|
+
options.cachedTasks.forEach((task) => {
|
|
650
|
+
this._cachedTasks.set(task.idempotencyKey, task);
|
|
651
|
+
});
|
|
652
|
+
this._stats.initialCachedTasks = options.cachedTasks.length;
|
|
486
653
|
}
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
654
|
+
this._taskStorage = new import_node_async_hooks2.AsyncLocalStorage();
|
|
655
|
+
this._context = options.context;
|
|
656
|
+
this._yieldedExecutions = options.yieldedExecutions ?? [];
|
|
657
|
+
if (options.noopTasksSet) {
|
|
658
|
+
this._noopTasksBloomFilter = import_core_backend.BloomFilter.deserialize(options.noopTasksSet, import_core_backend.BloomFilter.NOOP_TASK_SET_SIZE);
|
|
659
|
+
}
|
|
660
|
+
this._cachedTasksCursor = options.cachedTasksCursor;
|
|
661
|
+
this._serverVersion = options.serverVersion ?? "unversioned";
|
|
493
662
|
}
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
__privateGet(this, _logger).debug("registering schedule", {
|
|
497
|
-
id,
|
|
498
|
-
payload
|
|
499
|
-
});
|
|
500
|
-
const response = await zodfetch(import_core.RegisterScheduleResponseBodySchema, `${__privateGet(this, _apiUrl)}/api/v1/${client}/schedules/${id}/registrations`, {
|
|
501
|
-
method: "POST",
|
|
502
|
-
headers: {
|
|
503
|
-
"Content-Type": "application/json",
|
|
504
|
-
Authorization: `Bearer ${apiKey}`
|
|
505
|
-
},
|
|
506
|
-
body: JSON.stringify({
|
|
507
|
-
id: key,
|
|
508
|
-
...payload
|
|
509
|
-
})
|
|
510
|
-
});
|
|
511
|
-
return response;
|
|
663
|
+
get stats() {
|
|
664
|
+
return this._stats;
|
|
512
665
|
}
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
__privateGet(this, _logger).debug("unregistering schedule", {
|
|
516
|
-
id
|
|
517
|
-
});
|
|
518
|
-
const response = await zodfetch(import_zod.z.object({
|
|
519
|
-
ok: import_zod.z.boolean()
|
|
520
|
-
}), `${__privateGet(this, _apiUrl)}/api/v1/${client}/schedules/${id}/registrations/${encodeURIComponent(key)}`, {
|
|
521
|
-
method: "DELETE",
|
|
522
|
-
headers: {
|
|
523
|
-
"Content-Type": "application/json",
|
|
524
|
-
Authorization: `Bearer ${apiKey}`
|
|
525
|
-
}
|
|
526
|
-
});
|
|
527
|
-
return response;
|
|
666
|
+
get runId() {
|
|
667
|
+
return this._id;
|
|
528
668
|
}
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
__privateGet(this, _logger).debug("getting auth", {
|
|
532
|
-
id
|
|
533
|
-
});
|
|
534
|
-
const response = await zodfetch(import_core.ConnectionAuthSchema, `${__privateGet(this, _apiUrl)}/api/v1/${client}/auth/${id}`, {
|
|
535
|
-
method: "GET",
|
|
536
|
-
headers: {
|
|
537
|
-
Accept: "application/json",
|
|
538
|
-
Authorization: `Bearer ${apiKey}`
|
|
539
|
-
}
|
|
540
|
-
}, {
|
|
541
|
-
optional: true
|
|
542
|
-
});
|
|
543
|
-
return response;
|
|
669
|
+
get triggerClient() {
|
|
670
|
+
return this._triggerClient;
|
|
544
671
|
}
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
672
|
+
get logger() {
|
|
673
|
+
return new IOLogger(async (level, message, data) => {
|
|
674
|
+
let logLevel = "info";
|
|
675
|
+
if (import_core2.Logger.satisfiesLogLevel(logLevel, this._jobLogLevel)) {
|
|
676
|
+
await this.runTask([
|
|
677
|
+
message,
|
|
678
|
+
level
|
|
679
|
+
], async (task) => {
|
|
680
|
+
switch (level) {
|
|
681
|
+
case "LOG": {
|
|
682
|
+
this._jobLogger?.log(message, data);
|
|
683
|
+
logLevel = "log";
|
|
684
|
+
break;
|
|
685
|
+
}
|
|
686
|
+
case "DEBUG": {
|
|
687
|
+
this._jobLogger?.debug(message, data);
|
|
688
|
+
logLevel = "debug";
|
|
689
|
+
break;
|
|
690
|
+
}
|
|
691
|
+
case "INFO": {
|
|
692
|
+
this._jobLogger?.info(message, data);
|
|
693
|
+
logLevel = "info";
|
|
694
|
+
break;
|
|
695
|
+
}
|
|
696
|
+
case "WARN": {
|
|
697
|
+
this._jobLogger?.warn(message, data);
|
|
698
|
+
logLevel = "warn";
|
|
699
|
+
break;
|
|
700
|
+
}
|
|
701
|
+
case "ERROR": {
|
|
702
|
+
this._jobLogger?.error(message, data);
|
|
703
|
+
logLevel = "error";
|
|
704
|
+
break;
|
|
705
|
+
}
|
|
706
|
+
}
|
|
707
|
+
}, {
|
|
708
|
+
name: "log",
|
|
709
|
+
icon: "log",
|
|
710
|
+
description: message,
|
|
711
|
+
params: data,
|
|
712
|
+
properties: [
|
|
713
|
+
{
|
|
714
|
+
label: "Level",
|
|
715
|
+
text: level
|
|
716
|
+
}
|
|
717
|
+
],
|
|
718
|
+
style: {
|
|
719
|
+
style: "minimal",
|
|
720
|
+
variant: level.toLowerCase()
|
|
721
|
+
},
|
|
722
|
+
noop: true
|
|
723
|
+
});
|
|
554
724
|
}
|
|
555
725
|
});
|
|
556
726
|
}
|
|
557
|
-
async
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
});
|
|
562
|
-
return await zodfetch(import_core.GetRunSchema, (0, import_core.urlWithSearchParams)(`${__privateGet(this, _apiUrl)}/api/v1/runs/${runId}`, options), {
|
|
563
|
-
method: "GET",
|
|
564
|
-
headers: {
|
|
565
|
-
Authorization: `Bearer ${apiKey}`
|
|
727
|
+
async random(cacheKey, { min = 0, max = 1, round = false } = {}) {
|
|
728
|
+
return await this.runTask(cacheKey, async (task) => {
|
|
729
|
+
if (min > max) {
|
|
730
|
+
throw new Error(`Lower bound can't be higher than upper bound - min: ${min}, max: ${max}`);
|
|
566
731
|
}
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
732
|
+
if (min === max) {
|
|
733
|
+
await this.logger.warn(`Lower and upper bounds are identical. The return value is not random and will always be: ${min}`);
|
|
734
|
+
}
|
|
735
|
+
const withinBounds = (max - min) * Math.random() + min;
|
|
736
|
+
if (!round) {
|
|
737
|
+
return withinBounds;
|
|
738
|
+
}
|
|
739
|
+
if (!Number.isInteger(min) || !Number.isInteger(max)) {
|
|
740
|
+
await this.logger.warn("Rounding enabled with floating-point bounds. This may cause unexpected skew and boundary inclusivity.");
|
|
741
|
+
}
|
|
742
|
+
const rounded = Math.round(withinBounds);
|
|
743
|
+
return rounded;
|
|
744
|
+
}, {
|
|
745
|
+
name: "random",
|
|
746
|
+
icon: "dice-5-filled",
|
|
747
|
+
params: {
|
|
748
|
+
min,
|
|
749
|
+
max,
|
|
750
|
+
round
|
|
751
|
+
},
|
|
752
|
+
properties: [
|
|
753
|
+
...min === 0 ? [] : [
|
|
754
|
+
{
|
|
755
|
+
label: "min",
|
|
756
|
+
text: String(min)
|
|
757
|
+
}
|
|
758
|
+
],
|
|
759
|
+
...max === 1 ? [] : [
|
|
760
|
+
{
|
|
761
|
+
label: "max",
|
|
762
|
+
text: String(max)
|
|
763
|
+
}
|
|
764
|
+
],
|
|
765
|
+
...round === false ? [] : [
|
|
766
|
+
{
|
|
767
|
+
label: "round",
|
|
768
|
+
text: String(round)
|
|
769
|
+
}
|
|
770
|
+
]
|
|
771
|
+
],
|
|
772
|
+
style: {
|
|
773
|
+
style: "minimal"
|
|
579
774
|
}
|
|
580
775
|
});
|
|
581
776
|
}
|
|
582
|
-
async
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
777
|
+
async wait(cacheKey, seconds) {
|
|
778
|
+
return await this.runTask(cacheKey, async (task) => {
|
|
779
|
+
}, {
|
|
780
|
+
name: "wait",
|
|
781
|
+
icon: "clock",
|
|
782
|
+
params: {
|
|
783
|
+
seconds
|
|
784
|
+
},
|
|
785
|
+
noop: true,
|
|
786
|
+
delayUntil: new Date(Date.now() + seconds * 1e3),
|
|
787
|
+
style: {
|
|
788
|
+
style: "minimal"
|
|
591
789
|
}
|
|
592
790
|
});
|
|
593
791
|
}
|
|
594
|
-
async
|
|
595
|
-
const
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
792
|
+
async waitForEvent(cacheKey, event, options) {
|
|
793
|
+
const timeoutInSeconds = options?.timeoutInSeconds ?? 60 * 60;
|
|
794
|
+
return await this.runTask(cacheKey, async (task, io) => {
|
|
795
|
+
if (!task.callbackUrl) {
|
|
796
|
+
throw new Error("No callbackUrl found on task");
|
|
797
|
+
}
|
|
798
|
+
await this.triggerClient.createEphemeralEventDispatcher({
|
|
799
|
+
url: task.callbackUrl,
|
|
800
|
+
name: event.name,
|
|
801
|
+
filter: event.filter,
|
|
802
|
+
contextFilter: event.contextFilter,
|
|
803
|
+
source: event.source,
|
|
804
|
+
accountId: event.accountId,
|
|
805
|
+
timeoutInSeconds
|
|
806
|
+
});
|
|
807
|
+
return {};
|
|
808
|
+
}, {
|
|
809
|
+
name: "Wait for Event",
|
|
810
|
+
icon: "custom-event",
|
|
811
|
+
params: {
|
|
812
|
+
name: event.name,
|
|
813
|
+
source: event.source,
|
|
814
|
+
filter: event.filter,
|
|
815
|
+
contextFilter: event.contextFilter,
|
|
816
|
+
accountId: event.accountId
|
|
817
|
+
},
|
|
818
|
+
callback: {
|
|
819
|
+
enabled: true,
|
|
820
|
+
timeoutInSeconds
|
|
821
|
+
},
|
|
822
|
+
properties: [
|
|
823
|
+
{
|
|
824
|
+
label: "Event",
|
|
825
|
+
text: event.name
|
|
826
|
+
},
|
|
827
|
+
{
|
|
828
|
+
label: "Timeout",
|
|
829
|
+
text: `${timeoutInSeconds}s`
|
|
830
|
+
},
|
|
831
|
+
...event.source ? [
|
|
832
|
+
{
|
|
833
|
+
label: "Source",
|
|
834
|
+
text: event.source
|
|
835
|
+
}
|
|
836
|
+
] : [],
|
|
837
|
+
...event.accountId ? [
|
|
838
|
+
{
|
|
839
|
+
label: "Account ID",
|
|
840
|
+
text: event.accountId
|
|
841
|
+
}
|
|
842
|
+
] : []
|
|
843
|
+
],
|
|
844
|
+
parseOutput: (output) => {
|
|
845
|
+
return waitForEventSchema(event.schema ?? import_zod2.z.any()).parse(output);
|
|
603
846
|
}
|
|
604
847
|
});
|
|
605
848
|
}
|
|
606
|
-
async
|
|
607
|
-
const
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
const body = {
|
|
612
|
-
payload,
|
|
613
|
-
context: options.context ?? {},
|
|
614
|
-
options: {
|
|
615
|
-
accountId: options.accountId,
|
|
616
|
-
callbackUrl: options.callbackUrl
|
|
849
|
+
async waitForRequest(cacheKey, callback, options) {
|
|
850
|
+
const timeoutInSeconds = options?.timeoutInSeconds ?? 60 * 60;
|
|
851
|
+
return await this.runTask(cacheKey, async (task, io) => {
|
|
852
|
+
if (!task.callbackUrl) {
|
|
853
|
+
throw new Error("No callbackUrl found on task");
|
|
617
854
|
}
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
855
|
+
task.outputProperties = [
|
|
856
|
+
{
|
|
857
|
+
label: "Callback URL",
|
|
858
|
+
text: task.callbackUrl
|
|
859
|
+
}
|
|
860
|
+
];
|
|
861
|
+
return callback(task.callbackUrl);
|
|
862
|
+
}, {
|
|
863
|
+
name: "Wait for Request",
|
|
864
|
+
icon: "clock",
|
|
865
|
+
callback: {
|
|
866
|
+
enabled: true,
|
|
867
|
+
timeoutInSeconds: options?.timeoutInSeconds
|
|
627
868
|
},
|
|
628
|
-
|
|
869
|
+
properties: [
|
|
870
|
+
{
|
|
871
|
+
label: "Timeout",
|
|
872
|
+
text: `${timeoutInSeconds}s`
|
|
873
|
+
}
|
|
874
|
+
]
|
|
629
875
|
});
|
|
630
876
|
}
|
|
631
|
-
async
|
|
632
|
-
const
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
877
|
+
async createStatus(cacheKey, initialStatus) {
|
|
878
|
+
const id = typeof cacheKey === "string" ? cacheKey : cacheKey.join("-");
|
|
879
|
+
const status = new TriggerStatus(id, this);
|
|
880
|
+
await status.update(cacheKey, initialStatus);
|
|
881
|
+
return status;
|
|
882
|
+
}
|
|
883
|
+
async backgroundFetch(cacheKey, url, requestInit, options) {
|
|
884
|
+
const urlObject = new URL(url);
|
|
885
|
+
return await this.runTask(cacheKey, async (task) => {
|
|
886
|
+
console.log("task context", task.context);
|
|
887
|
+
return task.output;
|
|
888
|
+
}, {
|
|
889
|
+
name: `fetch ${urlObject.hostname}${urlObject.pathname}`,
|
|
890
|
+
params: {
|
|
891
|
+
url,
|
|
892
|
+
requestInit,
|
|
893
|
+
retry: options?.retry,
|
|
894
|
+
timeout: options?.timeout
|
|
641
895
|
},
|
|
642
|
-
|
|
896
|
+
operation: "fetch",
|
|
897
|
+
icon: "background",
|
|
898
|
+
noop: false,
|
|
899
|
+
properties: [
|
|
900
|
+
{
|
|
901
|
+
label: "url",
|
|
902
|
+
text: url,
|
|
903
|
+
url
|
|
904
|
+
},
|
|
905
|
+
{
|
|
906
|
+
label: "method",
|
|
907
|
+
text: requestInit?.method ?? "GET"
|
|
908
|
+
},
|
|
909
|
+
{
|
|
910
|
+
label: "background",
|
|
911
|
+
text: "true"
|
|
912
|
+
},
|
|
913
|
+
...options?.timeout ? [
|
|
914
|
+
{
|
|
915
|
+
label: "timeout",
|
|
916
|
+
text: `${options.timeout.durationInMs}ms`
|
|
917
|
+
}
|
|
918
|
+
] : []
|
|
919
|
+
],
|
|
920
|
+
retry: {
|
|
921
|
+
limit: 0
|
|
922
|
+
}
|
|
643
923
|
});
|
|
644
|
-
return response;
|
|
645
924
|
}
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
},
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
};
|
|
674
|
-
}
|
|
675
|
-
return {
|
|
676
|
-
status: "valid",
|
|
677
|
-
apiKey
|
|
678
|
-
};
|
|
679
|
-
}
|
|
680
|
-
__name(getApiKey, "getApiKey");
|
|
681
|
-
async function zodfetchWithVersions(versionedSchemaMap, unversionedSchema, url, requestInit, options, retryCount = 0) {
|
|
682
|
-
const response = await fetch(url, {
|
|
683
|
-
...requestInit,
|
|
684
|
-
cache: "no-cache"
|
|
685
|
-
});
|
|
686
|
-
if ((!requestInit || requestInit.method === "GET") && response.status === 404 && options?.optional) {
|
|
687
|
-
return;
|
|
925
|
+
async backgroundPoll(cacheKey, params) {
|
|
926
|
+
const urlObject = new URL(params.url);
|
|
927
|
+
return await this.runTask(cacheKey, async (task) => {
|
|
928
|
+
return task.output;
|
|
929
|
+
}, {
|
|
930
|
+
name: `poll ${urlObject.hostname}${urlObject.pathname}`,
|
|
931
|
+
params,
|
|
932
|
+
operation: "fetch-poll",
|
|
933
|
+
icon: "clock-bolt",
|
|
934
|
+
noop: false,
|
|
935
|
+
properties: [
|
|
936
|
+
{
|
|
937
|
+
label: "url",
|
|
938
|
+
text: params.url
|
|
939
|
+
},
|
|
940
|
+
{
|
|
941
|
+
label: "interval",
|
|
942
|
+
text: `${params.interval}s`
|
|
943
|
+
},
|
|
944
|
+
{
|
|
945
|
+
label: "timeout",
|
|
946
|
+
text: `${params.timeout}s`
|
|
947
|
+
}
|
|
948
|
+
],
|
|
949
|
+
retry: {
|
|
950
|
+
limit: 0
|
|
951
|
+
}
|
|
952
|
+
});
|
|
688
953
|
}
|
|
689
|
-
|
|
690
|
-
const
|
|
691
|
-
|
|
954
|
+
async backgroundFetchResponse(cacheKey, url, requestInit, options) {
|
|
955
|
+
const urlObject = new URL(url);
|
|
956
|
+
return await this.runTask(cacheKey, async (task) => {
|
|
957
|
+
return task.output;
|
|
958
|
+
}, {
|
|
959
|
+
name: `fetch response ${urlObject.hostname}${urlObject.pathname}`,
|
|
960
|
+
params: {
|
|
961
|
+
url,
|
|
962
|
+
requestInit,
|
|
963
|
+
retry: options?.retry,
|
|
964
|
+
timeout: options?.timeout
|
|
965
|
+
},
|
|
966
|
+
operation: "fetch-response",
|
|
967
|
+
icon: "background",
|
|
968
|
+
noop: false,
|
|
969
|
+
properties: [
|
|
970
|
+
{
|
|
971
|
+
label: "url",
|
|
972
|
+
text: url,
|
|
973
|
+
url
|
|
974
|
+
},
|
|
975
|
+
{
|
|
976
|
+
label: "method",
|
|
977
|
+
text: requestInit?.method ?? "GET"
|
|
978
|
+
},
|
|
979
|
+
{
|
|
980
|
+
label: "background",
|
|
981
|
+
text: "true"
|
|
982
|
+
},
|
|
983
|
+
...options?.timeout ? [
|
|
984
|
+
{
|
|
985
|
+
label: "timeout",
|
|
986
|
+
text: `${options.timeout.durationInMs}ms`
|
|
987
|
+
}
|
|
988
|
+
] : []
|
|
989
|
+
],
|
|
990
|
+
retry: {
|
|
991
|
+
limit: 0
|
|
992
|
+
}
|
|
993
|
+
});
|
|
692
994
|
}
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
995
|
+
async sendEvent(cacheKey, event, options) {
|
|
996
|
+
return await this.runTask(cacheKey, async (task) => {
|
|
997
|
+
return await this._triggerClient.sendEvent(event, options);
|
|
998
|
+
}, {
|
|
999
|
+
name: "Send Event",
|
|
1000
|
+
params: {
|
|
1001
|
+
event,
|
|
1002
|
+
options
|
|
1003
|
+
},
|
|
1004
|
+
icon: "send",
|
|
1005
|
+
properties: [
|
|
1006
|
+
{
|
|
1007
|
+
label: "name",
|
|
1008
|
+
text: event.name
|
|
1009
|
+
},
|
|
1010
|
+
...event?.id ? [
|
|
1011
|
+
{
|
|
1012
|
+
label: "ID",
|
|
1013
|
+
text: event.id
|
|
1014
|
+
}
|
|
1015
|
+
] : [],
|
|
1016
|
+
...sendEventOptionsProperties(options)
|
|
1017
|
+
]
|
|
1018
|
+
});
|
|
697
1019
|
}
|
|
698
|
-
|
|
699
|
-
|
|
1020
|
+
async sendEvents(cacheKey, events, options) {
|
|
1021
|
+
return await this.runTask(cacheKey, async (task) => {
|
|
1022
|
+
return await this._triggerClient.sendEvents(events, options);
|
|
1023
|
+
}, {
|
|
1024
|
+
name: "Send Multiple Events",
|
|
1025
|
+
params: {
|
|
1026
|
+
events,
|
|
1027
|
+
options
|
|
1028
|
+
},
|
|
1029
|
+
icon: "send",
|
|
1030
|
+
properties: [
|
|
1031
|
+
{
|
|
1032
|
+
label: "Total Events",
|
|
1033
|
+
text: String(events.length)
|
|
1034
|
+
},
|
|
1035
|
+
...sendEventOptionsProperties(options)
|
|
1036
|
+
]
|
|
1037
|
+
});
|
|
700
1038
|
}
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
1039
|
+
async getEvent(cacheKey, id) {
|
|
1040
|
+
return await this.runTask(cacheKey, async (task) => {
|
|
1041
|
+
return await this._triggerClient.getEvent(id);
|
|
1042
|
+
}, {
|
|
1043
|
+
name: "getEvent",
|
|
1044
|
+
params: {
|
|
1045
|
+
id
|
|
1046
|
+
},
|
|
1047
|
+
properties: [
|
|
1048
|
+
{
|
|
1049
|
+
label: "id",
|
|
1050
|
+
text: id
|
|
1051
|
+
}
|
|
1052
|
+
]
|
|
1053
|
+
});
|
|
708
1054
|
}
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
1055
|
+
async cancelEvent(cacheKey, eventId) {
|
|
1056
|
+
return await this.runTask(cacheKey, async (task) => {
|
|
1057
|
+
return await this._triggerClient.cancelEvent(eventId);
|
|
1058
|
+
}, {
|
|
1059
|
+
name: "cancelEvent",
|
|
1060
|
+
params: {
|
|
1061
|
+
eventId
|
|
1062
|
+
},
|
|
1063
|
+
properties: [
|
|
1064
|
+
{
|
|
1065
|
+
label: "id",
|
|
1066
|
+
text: eventId
|
|
1067
|
+
}
|
|
1068
|
+
]
|
|
1069
|
+
});
|
|
712
1070
|
}
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
1071
|
+
async updateSource(cacheKey, options) {
|
|
1072
|
+
return this.runTask(cacheKey, async (task) => {
|
|
1073
|
+
return await this._apiClient.updateSource(this._triggerClient.id, options.key, options);
|
|
1074
|
+
}, {
|
|
1075
|
+
name: "Update Source",
|
|
1076
|
+
description: "Update Source",
|
|
1077
|
+
properties: [
|
|
1078
|
+
{
|
|
1079
|
+
label: "key",
|
|
1080
|
+
text: options.key
|
|
1081
|
+
}
|
|
1082
|
+
],
|
|
1083
|
+
params: options,
|
|
1084
|
+
redact: {
|
|
1085
|
+
paths: [
|
|
1086
|
+
"secret"
|
|
1087
|
+
]
|
|
1088
|
+
}
|
|
1089
|
+
});
|
|
726
1090
|
}
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
1091
|
+
async updateWebhook(cacheKey, options) {
|
|
1092
|
+
return this.runTask(cacheKey, async (task) => {
|
|
1093
|
+
return await this._apiClient.updateWebhook(options.key, options);
|
|
1094
|
+
}, {
|
|
1095
|
+
name: "Update Webhook Source",
|
|
1096
|
+
icon: "refresh",
|
|
1097
|
+
properties: [
|
|
1098
|
+
{
|
|
1099
|
+
label: "key",
|
|
1100
|
+
text: options.key
|
|
1101
|
+
}
|
|
1102
|
+
],
|
|
1103
|
+
params: options
|
|
1104
|
+
});
|
|
730
1105
|
}
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
1106
|
+
async registerInterval(cacheKey, dynamicSchedule, id, options) {
|
|
1107
|
+
return await this.runTask(cacheKey, async (task) => {
|
|
1108
|
+
return dynamicSchedule.register(id, {
|
|
1109
|
+
type: "interval",
|
|
1110
|
+
options
|
|
1111
|
+
});
|
|
1112
|
+
}, {
|
|
1113
|
+
name: "register-interval",
|
|
1114
|
+
properties: [
|
|
1115
|
+
{
|
|
1116
|
+
label: "schedule",
|
|
1117
|
+
text: dynamicSchedule.id
|
|
1118
|
+
},
|
|
1119
|
+
{
|
|
1120
|
+
label: "id",
|
|
1121
|
+
text: id
|
|
1122
|
+
},
|
|
1123
|
+
{
|
|
1124
|
+
label: "seconds",
|
|
1125
|
+
text: options.seconds.toString()
|
|
1126
|
+
}
|
|
1127
|
+
],
|
|
1128
|
+
params: options
|
|
1129
|
+
});
|
|
735
1130
|
}
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
constructor(task) {
|
|
753
|
-
this.task = task;
|
|
754
|
-
}
|
|
755
|
-
};
|
|
756
|
-
__name(ResumeWithTaskError, "ResumeWithTaskError");
|
|
757
|
-
var ResumeWithParallelTaskError = class {
|
|
758
|
-
constructor(task, childErrors) {
|
|
759
|
-
this.task = task;
|
|
760
|
-
this.childErrors = childErrors;
|
|
761
|
-
}
|
|
762
|
-
};
|
|
763
|
-
__name(ResumeWithParallelTaskError, "ResumeWithParallelTaskError");
|
|
764
|
-
var RetryWithTaskError = class {
|
|
765
|
-
constructor(cause, task, retryAt) {
|
|
766
|
-
this.cause = cause;
|
|
767
|
-
this.task = task;
|
|
768
|
-
this.retryAt = retryAt;
|
|
769
|
-
}
|
|
770
|
-
};
|
|
771
|
-
__name(RetryWithTaskError, "RetryWithTaskError");
|
|
772
|
-
var CanceledWithTaskError = class {
|
|
773
|
-
constructor(task) {
|
|
774
|
-
this.task = task;
|
|
775
|
-
}
|
|
776
|
-
};
|
|
777
|
-
__name(CanceledWithTaskError, "CanceledWithTaskError");
|
|
778
|
-
var YieldExecutionError = class {
|
|
779
|
-
constructor(key) {
|
|
780
|
-
this.key = key;
|
|
781
|
-
}
|
|
782
|
-
};
|
|
783
|
-
__name(YieldExecutionError, "YieldExecutionError");
|
|
784
|
-
var AutoYieldExecutionError = class {
|
|
785
|
-
constructor(location, timeRemaining, timeElapsed) {
|
|
786
|
-
this.location = location;
|
|
787
|
-
this.timeRemaining = timeRemaining;
|
|
788
|
-
this.timeElapsed = timeElapsed;
|
|
789
|
-
}
|
|
790
|
-
};
|
|
791
|
-
__name(AutoYieldExecutionError, "AutoYieldExecutionError");
|
|
792
|
-
var AutoYieldWithCompletedTaskExecutionError = class {
|
|
793
|
-
constructor(id, properties, data, output) {
|
|
794
|
-
this.id = id;
|
|
795
|
-
this.properties = properties;
|
|
796
|
-
this.data = data;
|
|
797
|
-
this.output = output;
|
|
798
|
-
}
|
|
799
|
-
};
|
|
800
|
-
__name(AutoYieldWithCompletedTaskExecutionError, "AutoYieldWithCompletedTaskExecutionError");
|
|
801
|
-
var ParsedPayloadSchemaError = class {
|
|
802
|
-
constructor(schemaErrors) {
|
|
803
|
-
this.schemaErrors = schemaErrors;
|
|
804
|
-
}
|
|
805
|
-
};
|
|
806
|
-
__name(ParsedPayloadSchemaError, "ParsedPayloadSchemaError");
|
|
807
|
-
function isTriggerError(err) {
|
|
808
|
-
return err instanceof ResumeWithTaskError || err instanceof RetryWithTaskError || err instanceof CanceledWithTaskError || err instanceof YieldExecutionError || err instanceof AutoYieldExecutionError || err instanceof AutoYieldWithCompletedTaskExecutionError || err instanceof ResumeWithParallelTaskError;
|
|
809
|
-
}
|
|
810
|
-
__name(isTriggerError, "isTriggerError");
|
|
811
|
-
var ErrorWithTask = class extends Error {
|
|
812
|
-
constructor(cause, message) {
|
|
813
|
-
super(message);
|
|
814
|
-
this.cause = cause;
|
|
1131
|
+
async unregisterInterval(cacheKey, dynamicSchedule, id) {
|
|
1132
|
+
return await this.runTask(cacheKey, async (task) => {
|
|
1133
|
+
return dynamicSchedule.unregister(id);
|
|
1134
|
+
}, {
|
|
1135
|
+
name: "unregister-interval",
|
|
1136
|
+
properties: [
|
|
1137
|
+
{
|
|
1138
|
+
label: "schedule",
|
|
1139
|
+
text: dynamicSchedule.id
|
|
1140
|
+
},
|
|
1141
|
+
{
|
|
1142
|
+
label: "id",
|
|
1143
|
+
text: id
|
|
1144
|
+
}
|
|
1145
|
+
]
|
|
1146
|
+
});
|
|
815
1147
|
}
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
1148
|
+
async registerCron(cacheKey, dynamicSchedule, id, options) {
|
|
1149
|
+
return await this.runTask(cacheKey, async (task) => {
|
|
1150
|
+
return dynamicSchedule.register(id, {
|
|
1151
|
+
type: "cron",
|
|
1152
|
+
options
|
|
1153
|
+
});
|
|
1154
|
+
}, {
|
|
1155
|
+
name: "register-cron",
|
|
1156
|
+
properties: [
|
|
1157
|
+
{
|
|
1158
|
+
label: "schedule",
|
|
1159
|
+
text: dynamicSchedule.id
|
|
1160
|
+
},
|
|
1161
|
+
{
|
|
1162
|
+
label: "id",
|
|
1163
|
+
text: id
|
|
1164
|
+
},
|
|
1165
|
+
{
|
|
1166
|
+
label: "cron",
|
|
1167
|
+
text: options.cron
|
|
1168
|
+
}
|
|
1169
|
+
],
|
|
1170
|
+
params: options
|
|
1171
|
+
});
|
|
838
1172
|
}
|
|
839
|
-
|
|
840
|
-
return this.
|
|
1173
|
+
async unregisterCron(cacheKey, dynamicSchedule, id) {
|
|
1174
|
+
return await this.runTask(cacheKey, async (task) => {
|
|
1175
|
+
return dynamicSchedule.unregister(id);
|
|
1176
|
+
}, {
|
|
1177
|
+
name: "unregister-cron",
|
|
1178
|
+
properties: [
|
|
1179
|
+
{
|
|
1180
|
+
label: "schedule",
|
|
1181
|
+
text: dynamicSchedule.id
|
|
1182
|
+
},
|
|
1183
|
+
{
|
|
1184
|
+
label: "id",
|
|
1185
|
+
text: id
|
|
1186
|
+
}
|
|
1187
|
+
]
|
|
1188
|
+
});
|
|
841
1189
|
}
|
|
842
|
-
|
|
843
|
-
return
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
1190
|
+
async registerTrigger(cacheKey, trigger, id, params) {
|
|
1191
|
+
return await this.runTask(cacheKey, async (task) => {
|
|
1192
|
+
const registration = await this.runTask("register-source", async (subtask1) => {
|
|
1193
|
+
return trigger.register(id, params);
|
|
1194
|
+
}, {
|
|
1195
|
+
name: "register-source"
|
|
1196
|
+
});
|
|
1197
|
+
return {
|
|
1198
|
+
id: registration.id,
|
|
1199
|
+
key: registration.source.key
|
|
1200
|
+
};
|
|
1201
|
+
}, {
|
|
1202
|
+
name: "register-trigger",
|
|
1203
|
+
properties: [
|
|
1204
|
+
{
|
|
1205
|
+
label: "trigger",
|
|
1206
|
+
text: trigger.id
|
|
1207
|
+
},
|
|
1208
|
+
{
|
|
1209
|
+
label: "id",
|
|
1210
|
+
text: id
|
|
1211
|
+
}
|
|
1212
|
+
],
|
|
1213
|
+
params
|
|
848
1214
|
});
|
|
849
1215
|
}
|
|
850
|
-
async
|
|
851
|
-
if (!
|
|
1216
|
+
async getAuth(cacheKey, clientId) {
|
|
1217
|
+
if (!clientId) {
|
|
852
1218
|
return;
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
return this.
|
|
1219
|
+
}
|
|
1220
|
+
return this.runTask(cacheKey, async (task) => {
|
|
1221
|
+
return await this._triggerClient.getAuth(clientId);
|
|
1222
|
+
}, {
|
|
1223
|
+
name: "get-auth"
|
|
856
1224
|
});
|
|
857
1225
|
}
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
}
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
1226
|
+
async parallel(cacheKey, items, callback, options) {
|
|
1227
|
+
const results = await this.runTask(cacheKey, async (task) => {
|
|
1228
|
+
const outcomes = await Promise.allSettled(items.map((item, index) => spaceOut(() => callback(item, index), index, 15)));
|
|
1229
|
+
if (outcomes.every((outcome) => outcome.status === "fulfilled")) {
|
|
1230
|
+
return outcomes.map((outcome) => outcome.value);
|
|
1231
|
+
}
|
|
1232
|
+
const nonInternalErrors = outcomes.filter((outcome) => outcome.status === "rejected" && !isTriggerError(outcome.reason)).map((outcome) => outcome);
|
|
1233
|
+
if (nonInternalErrors.length > 0) {
|
|
1234
|
+
throw nonInternalErrors[0].reason;
|
|
1235
|
+
}
|
|
1236
|
+
const internalErrors = outcomes.filter((outcome) => outcome.status === "rejected" && isTriggerError(outcome.reason)).map((outcome) => outcome).map((outcome) => outcome.reason);
|
|
1237
|
+
throw new ResumeWithParallelTaskError(task, internalErrors);
|
|
1238
|
+
}, {
|
|
1239
|
+
name: "parallel",
|
|
1240
|
+
parallel: true,
|
|
1241
|
+
...options ?? {}
|
|
1242
|
+
});
|
|
1243
|
+
return results;
|
|
875
1244
|
}
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
1245
|
+
async runTask(cacheKey, callback, options, onError) {
|
|
1246
|
+
__privateMethod(this, _detectAutoYield, detectAutoYield_fn).call(this, "start_task", 500);
|
|
1247
|
+
const parentId = this._taskStorage.getStore()?.taskId;
|
|
1248
|
+
if (parentId) {
|
|
1249
|
+
this._logger.debug("Using parent task", {
|
|
1250
|
+
parentId,
|
|
1251
|
+
cacheKey,
|
|
1252
|
+
options
|
|
1253
|
+
});
|
|
1254
|
+
}
|
|
1255
|
+
const idempotencyKey = await generateIdempotencyKey([
|
|
1256
|
+
this._id,
|
|
1257
|
+
parentId ?? "",
|
|
1258
|
+
cacheKey
|
|
1259
|
+
].flat());
|
|
1260
|
+
if (this._visitedCacheKeys.has(idempotencyKey)) {
|
|
1261
|
+
if (typeof cacheKey === "string") {
|
|
1262
|
+
throw new Error(`Task with cacheKey "${cacheKey}" has already been executed in this run. Each task must have a unique cacheKey.`);
|
|
1263
|
+
} else {
|
|
1264
|
+
throw new Error(`Task with cacheKey "${cacheKey.join("-")}" has already been executed in this run. Each task must have a unique cacheKey.`);
|
|
892
1265
|
}
|
|
1266
|
+
}
|
|
1267
|
+
this._visitedCacheKeys.add(idempotencyKey);
|
|
1268
|
+
const cachedTask = this._cachedTasks.get(idempotencyKey);
|
|
1269
|
+
if (cachedTask && cachedTask.status === "COMPLETED") {
|
|
1270
|
+
this._logger.debug("Using completed cached task", {
|
|
1271
|
+
idempotencyKey
|
|
1272
|
+
});
|
|
1273
|
+
this._stats.cachedTaskHits++;
|
|
1274
|
+
return options?.parseOutput ? options.parseOutput(cachedTask.output) : cachedTask.output;
|
|
1275
|
+
}
|
|
1276
|
+
if (options?.noop && this._noopTasksBloomFilter) {
|
|
1277
|
+
if (this._noopTasksBloomFilter.test(idempotencyKey)) {
|
|
1278
|
+
this._logger.debug("task idempotency key exists in noopTasksBloomFilter", {
|
|
1279
|
+
idempotencyKey
|
|
1280
|
+
});
|
|
1281
|
+
this._stats.noopCachedTaskHits++;
|
|
1282
|
+
return {};
|
|
1283
|
+
}
|
|
1284
|
+
}
|
|
1285
|
+
const runOptions = {
|
|
1286
|
+
...options ?? {},
|
|
1287
|
+
parseOutput: void 0
|
|
893
1288
|
};
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
}
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
icon: options.icon ?? "webhook",
|
|
920
|
-
properties: options.properties,
|
|
921
|
-
examples: options.examples ? options.examples : [
|
|
922
|
-
{
|
|
923
|
-
id: "basic-request",
|
|
924
|
-
name: "Basic Request",
|
|
925
|
-
icon: "http-post",
|
|
926
|
-
payload: {
|
|
927
|
-
url: "https://cloud.trigger.dev",
|
|
928
|
-
method: "POST",
|
|
929
|
-
headers: {
|
|
930
|
-
"Content-Type": "application/json"
|
|
931
|
-
},
|
|
932
|
-
rawBody: JSON.stringify({
|
|
933
|
-
foo: "bar"
|
|
934
|
-
})
|
|
935
|
-
}
|
|
936
|
-
}
|
|
937
|
-
],
|
|
938
|
-
parsePayload: (rawPayload) => {
|
|
939
|
-
const result = import_core2.RequestWithRawBodySchema.safeParse(rawPayload);
|
|
940
|
-
if (!result.success) {
|
|
941
|
-
throw new ParsedPayloadSchemaError(formatSchemaErrors(result.error.issues));
|
|
1289
|
+
const response = await this._apiClient.runTask(this._id, {
|
|
1290
|
+
idempotencyKey,
|
|
1291
|
+
displayKey: typeof cacheKey === "string" ? cacheKey : void 0,
|
|
1292
|
+
noop: false,
|
|
1293
|
+
...runOptions ?? {},
|
|
1294
|
+
parentId
|
|
1295
|
+
}, {
|
|
1296
|
+
cachedTasksCursor: this._cachedTasksCursor
|
|
1297
|
+
});
|
|
1298
|
+
const task = response.version === import_core2.API_VERSIONS.LAZY_LOADED_CACHED_TASKS ? response.body.task : response.body;
|
|
1299
|
+
if (task.forceYield) {
|
|
1300
|
+
this._logger.debug("Forcing yield after run task", {
|
|
1301
|
+
idempotencyKey
|
|
1302
|
+
});
|
|
1303
|
+
__privateMethod(this, _forceYield, forceYield_fn).call(this, "after_run_task");
|
|
1304
|
+
}
|
|
1305
|
+
if (response.version === import_core2.API_VERSIONS.LAZY_LOADED_CACHED_TASKS) {
|
|
1306
|
+
this._cachedTasksCursor = response.body.cachedTasks?.cursor;
|
|
1307
|
+
for (const cachedTask2 of response.body.cachedTasks?.tasks ?? []) {
|
|
1308
|
+
if (!this._cachedTasks.has(cachedTask2.idempotencyKey)) {
|
|
1309
|
+
this._cachedTasks.set(cachedTask2.idempotencyKey, cachedTask2);
|
|
1310
|
+
this._logger.debug("Injecting lazy loaded task into task cache", {
|
|
1311
|
+
idempotencyKey: cachedTask2.idempotencyKey
|
|
1312
|
+
});
|
|
1313
|
+
this._stats.lazyLoadedCachedTasks++;
|
|
942
1314
|
}
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
1315
|
+
}
|
|
1316
|
+
}
|
|
1317
|
+
if (task.status === "CANCELED") {
|
|
1318
|
+
this._logger.debug("Task canceled", {
|
|
1319
|
+
idempotencyKey,
|
|
1320
|
+
task
|
|
1321
|
+
});
|
|
1322
|
+
throw new CanceledWithTaskError(task);
|
|
1323
|
+
}
|
|
1324
|
+
if (task.status === "COMPLETED") {
|
|
1325
|
+
if (task.noop) {
|
|
1326
|
+
this._logger.debug("Noop Task completed", {
|
|
1327
|
+
idempotencyKey
|
|
1328
|
+
});
|
|
1329
|
+
this._noopTasksBloomFilter?.add(task.idempotencyKey);
|
|
1330
|
+
} else {
|
|
1331
|
+
this._logger.debug("Cache miss", {
|
|
1332
|
+
idempotencyKey
|
|
947
1333
|
});
|
|
1334
|
+
this._stats.cachedTaskMisses++;
|
|
1335
|
+
__privateMethod(this, _addToCachedTasks, addToCachedTasks_fn).call(this, task);
|
|
948
1336
|
}
|
|
1337
|
+
return options?.parseOutput ? options.parseOutput(task.output) : task.output;
|
|
949
1338
|
}
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
};
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
1339
|
+
if (task.status === "ERRORED") {
|
|
1340
|
+
this._logger.debug("Task errored", {
|
|
1341
|
+
idempotencyKey,
|
|
1342
|
+
task
|
|
1343
|
+
});
|
|
1344
|
+
throw new ErrorWithTask(task, task.error ?? task?.output ? JSON.stringify(task.output) : "Task errored");
|
|
1345
|
+
}
|
|
1346
|
+
__privateMethod(this, _detectAutoYield, detectAutoYield_fn).call(this, "before_execute_task", 1500);
|
|
1347
|
+
const executeTask = /* @__PURE__ */ __name(async () => {
|
|
1348
|
+
try {
|
|
1349
|
+
const result = await callback(task, this);
|
|
1350
|
+
if (task.status === "WAITING" && task.callbackUrl) {
|
|
1351
|
+
this._logger.debug("Waiting for remote callback", {
|
|
1352
|
+
idempotencyKey,
|
|
1353
|
+
task
|
|
1354
|
+
});
|
|
1355
|
+
return {};
|
|
1356
|
+
}
|
|
1357
|
+
const output = this._outputSerializer.serialize(result);
|
|
1358
|
+
this._logger.debug("Completing using output", {
|
|
1359
|
+
idempotencyKey,
|
|
1360
|
+
task
|
|
1361
|
+
});
|
|
1362
|
+
__privateMethod(this, _detectAutoYield, detectAutoYield_fn).call(this, "before_complete_task", 500, task, output);
|
|
1363
|
+
const completedTask = await this._apiClient.completeTask(this._id, task.id, {
|
|
1364
|
+
output,
|
|
1365
|
+
properties: task.outputProperties ?? void 0
|
|
1366
|
+
});
|
|
1367
|
+
if (completedTask.forceYield) {
|
|
1368
|
+
this._logger.debug("Forcing yield after task completed", {
|
|
1369
|
+
idempotencyKey
|
|
1370
|
+
});
|
|
1371
|
+
__privateMethod(this, _forceYield, forceYield_fn).call(this, "after_complete_task");
|
|
1372
|
+
}
|
|
1373
|
+
this._stats.executedTasks++;
|
|
1374
|
+
if (completedTask.status === "CANCELED") {
|
|
1375
|
+
throw new CanceledWithTaskError(completedTask);
|
|
1376
|
+
}
|
|
1377
|
+
__privateMethod(this, _detectAutoYield, detectAutoYield_fn).call(this, "after_complete_task", 500);
|
|
1378
|
+
const deserializedOutput = this._outputSerializer.deserialize(output);
|
|
1379
|
+
return options?.parseOutput ? options.parseOutput(deserializedOutput) : deserializedOutput;
|
|
1380
|
+
} catch (error) {
|
|
1381
|
+
if (isTriggerError(error)) {
|
|
1382
|
+
throw error;
|
|
1383
|
+
}
|
|
1384
|
+
let skipRetrying = false;
|
|
1385
|
+
if (onError) {
|
|
1386
|
+
try {
|
|
1387
|
+
const onErrorResult = onError(error, task, this);
|
|
1388
|
+
if (onErrorResult) {
|
|
1389
|
+
if (onErrorResult instanceof Error) {
|
|
1390
|
+
error = onErrorResult;
|
|
1391
|
+
} else {
|
|
1392
|
+
skipRetrying = !!onErrorResult.skipRetrying;
|
|
1393
|
+
if (onErrorResult.retryAt && !skipRetrying) {
|
|
1394
|
+
const parsedError2 = import_core2.ErrorWithStackSchema.safeParse(onErrorResult.error);
|
|
1395
|
+
throw new RetryWithTaskError(parsedError2.success ? parsedError2.data : {
|
|
1396
|
+
message: "Unknown error"
|
|
1397
|
+
}, task, onErrorResult.retryAt);
|
|
1398
|
+
}
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
} catch (innerError) {
|
|
1402
|
+
if (isTriggerError(innerError)) {
|
|
1403
|
+
throw innerError;
|
|
1404
|
+
}
|
|
1405
|
+
error = innerError;
|
|
1406
|
+
}
|
|
1407
|
+
}
|
|
1408
|
+
if (error instanceof ErrorWithTask) {
|
|
1409
|
+
await this._apiClient.failTask(this._id, task.id, {
|
|
1410
|
+
error: error.cause.output
|
|
1411
|
+
});
|
|
1412
|
+
}
|
|
1413
|
+
const parsedError = import_core2.ErrorWithStackSchema.safeParse(error);
|
|
1414
|
+
if (options?.retry && !skipRetrying) {
|
|
1415
|
+
const retryAt = (0, import_core.calculateRetryAt)(options.retry, task.attempts - 1);
|
|
1416
|
+
if (retryAt) {
|
|
1417
|
+
throw new RetryWithTaskError(parsedError.success ? parsedError.data : {
|
|
1418
|
+
message: "Unknown error"
|
|
1419
|
+
}, task, retryAt);
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
if (parsedError.success) {
|
|
1423
|
+
await this._apiClient.failTask(this._id, task.id, {
|
|
1424
|
+
error: parsedError.data
|
|
1425
|
+
});
|
|
1426
|
+
} else {
|
|
1427
|
+
const message = typeof error === "string" ? error : JSON.stringify(error);
|
|
1428
|
+
await this._apiClient.failTask(this._id, task.id, {
|
|
1429
|
+
error: {
|
|
1430
|
+
name: "Unknown error",
|
|
1431
|
+
message
|
|
1432
|
+
}
|
|
1433
|
+
});
|
|
1434
|
+
}
|
|
1435
|
+
throw error;
|
|
1436
|
+
}
|
|
1437
|
+
}, "executeTask");
|
|
1438
|
+
if (task.status === "WAITING") {
|
|
1439
|
+
this._logger.debug("Task waiting", {
|
|
1440
|
+
idempotencyKey,
|
|
1441
|
+
task
|
|
991
1442
|
});
|
|
1443
|
+
if (task.callbackUrl) {
|
|
1444
|
+
await this._taskStorage.run({
|
|
1445
|
+
taskId: task.id
|
|
1446
|
+
}, executeTask);
|
|
1447
|
+
}
|
|
1448
|
+
throw new ResumeWithTaskError(task);
|
|
992
1449
|
}
|
|
993
|
-
if (status.
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
1450
|
+
if (task.status === "RUNNING" && typeof task.operation === "string") {
|
|
1451
|
+
this._logger.debug("Task running operation", {
|
|
1452
|
+
idempotencyKey,
|
|
1453
|
+
task
|
|
997
1454
|
});
|
|
1455
|
+
throw new ResumeWithTaskError(task);
|
|
998
1456
|
}
|
|
999
|
-
return
|
|
1000
|
-
|
|
1001
|
-
},
|
|
1002
|
-
name: status.label ?? `Status update`,
|
|
1003
|
-
icon: "bell",
|
|
1004
|
-
params: {
|
|
1005
|
-
...status
|
|
1006
|
-
},
|
|
1007
|
-
properties
|
|
1008
|
-
});
|
|
1457
|
+
return this._taskStorage.run({
|
|
1458
|
+
taskId: task.id
|
|
1459
|
+
}, executeTask);
|
|
1009
1460
|
}
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
payload: import_zod2.z.any()
|
|
1020
|
-
});
|
|
1021
|
-
function waitForEventSchema(schema) {
|
|
1022
|
-
return import_zod2.z.object({
|
|
1023
|
-
id: import_zod2.z.string(),
|
|
1024
|
-
name: import_zod2.z.string(),
|
|
1025
|
-
source: import_zod2.z.string(),
|
|
1026
|
-
payload: schema,
|
|
1027
|
-
timestamp: import_zod2.z.coerce.date(),
|
|
1028
|
-
context: import_zod2.z.any().optional(),
|
|
1029
|
-
accountId: import_zod2.z.string().optional()
|
|
1030
|
-
});
|
|
1031
|
-
}
|
|
1032
|
-
__name(waitForEventSchema, "waitForEventSchema");
|
|
1033
|
-
|
|
1034
|
-
// src/io.ts
|
|
1035
|
-
var import_zod3 = require("zod");
|
|
1036
|
-
var JSONOutputSerializer = class {
|
|
1037
|
-
serialize(value) {
|
|
1038
|
-
return JSON.stringify(value);
|
|
1461
|
+
yield(cacheKey) {
|
|
1462
|
+
if (!(0, import_core2.supportsFeature)("yieldExecution", this._serverVersion)) {
|
|
1463
|
+
console.warn("[trigger.dev] io.yield() is not support by the version of the Trigger.dev server you are using, you will need to upgrade your self-hosted Trigger.dev instance.");
|
|
1464
|
+
return;
|
|
1465
|
+
}
|
|
1466
|
+
if (this._yieldedExecutions.includes(cacheKey)) {
|
|
1467
|
+
return;
|
|
1468
|
+
}
|
|
1469
|
+
throw new YieldExecutionError(cacheKey);
|
|
1039
1470
|
}
|
|
1040
|
-
|
|
1041
|
-
|
|
1471
|
+
async try(tryCallback, catchCallback) {
|
|
1472
|
+
try {
|
|
1473
|
+
return await tryCallback();
|
|
1474
|
+
} catch (error) {
|
|
1475
|
+
if (isTriggerError(error)) {
|
|
1476
|
+
throw error;
|
|
1477
|
+
}
|
|
1478
|
+
return await catchCallback(error);
|
|
1479
|
+
}
|
|
1042
1480
|
}
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
__privateAdd(this, _addToCachedTasks);
|
|
1049
|
-
__privateAdd(this, _detectAutoYield);
|
|
1050
|
-
__privateAdd(this, _forceYield);
|
|
1051
|
-
__privateAdd(this, _getTimeElapsed);
|
|
1052
|
-
__privateAdd(this, _getRemainingTimeInMillis);
|
|
1053
|
-
__publicField(this, "_outputSerializer", new JSONOutputSerializer());
|
|
1054
|
-
__publicField(this, "_visitedCacheKeys", /* @__PURE__ */ new Set());
|
|
1055
|
-
__publicField(this, "brb", this.yield.bind(this));
|
|
1056
|
-
this._id = options.id;
|
|
1057
|
-
this._apiClient = options.apiClient;
|
|
1058
|
-
this._triggerClient = options.client;
|
|
1059
|
-
this._logger = options.logger ?? new import_core4.Logger("trigger.dev", options.logLevel);
|
|
1060
|
-
this._cachedTasks = /* @__PURE__ */ new Map();
|
|
1061
|
-
this._jobLogger = options.jobLogger;
|
|
1062
|
-
this._jobLogLevel = options.jobLogLevel;
|
|
1063
|
-
this._timeOrigin = options.timeOrigin;
|
|
1064
|
-
this._executionTimeout = options.executionTimeout;
|
|
1065
|
-
this._stats = {
|
|
1066
|
-
initialCachedTasks: 0,
|
|
1067
|
-
lazyLoadedCachedTasks: 0,
|
|
1068
|
-
executedTasks: 0,
|
|
1069
|
-
cachedTaskHits: 0,
|
|
1070
|
-
cachedTaskMisses: 0,
|
|
1071
|
-
noopCachedTaskHits: 0,
|
|
1072
|
-
noopCachedTaskMisses: 0
|
|
1481
|
+
get store() {
|
|
1482
|
+
return {
|
|
1483
|
+
env: this._envStore,
|
|
1484
|
+
job: this._jobStore,
|
|
1485
|
+
run: this._runStore
|
|
1073
1486
|
};
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1487
|
+
}
|
|
1488
|
+
};
|
|
1489
|
+
__name(IO, "IO");
|
|
1490
|
+
_addToCachedTasks = new WeakSet();
|
|
1491
|
+
addToCachedTasks_fn = /* @__PURE__ */ __name(function(task) {
|
|
1492
|
+
this._cachedTasks.set(task.idempotencyKey, task);
|
|
1493
|
+
}, "#addToCachedTasks");
|
|
1494
|
+
_detectAutoYield = new WeakSet();
|
|
1495
|
+
detectAutoYield_fn = /* @__PURE__ */ __name(function(location, threshold = 1500, task1, output) {
|
|
1496
|
+
const timeRemaining = __privateMethod(this, _getRemainingTimeInMillis, getRemainingTimeInMillis_fn).call(this);
|
|
1497
|
+
if (timeRemaining && timeRemaining < threshold) {
|
|
1498
|
+
if (task1) {
|
|
1499
|
+
throw new AutoYieldWithCompletedTaskExecutionError(task1.id, task1.outputProperties ?? [], {
|
|
1500
|
+
location,
|
|
1501
|
+
timeRemaining,
|
|
1502
|
+
timeElapsed: __privateMethod(this, _getTimeElapsed, getTimeElapsed_fn).call(this)
|
|
1503
|
+
}, output);
|
|
1504
|
+
} else {
|
|
1505
|
+
throw new AutoYieldExecutionError(location, timeRemaining, __privateMethod(this, _getTimeElapsed, getTimeElapsed_fn).call(this));
|
|
1085
1506
|
}
|
|
1086
|
-
this._cachedTasksCursor = options.cachedTasksCursor;
|
|
1087
|
-
this._serverVersion = options.serverVersion ?? "unversioned";
|
|
1088
1507
|
}
|
|
1089
|
-
|
|
1090
|
-
|
|
1508
|
+
}, "#detectAutoYield");
|
|
1509
|
+
_forceYield = new WeakSet();
|
|
1510
|
+
forceYield_fn = /* @__PURE__ */ __name(function(location1) {
|
|
1511
|
+
const timeRemaining = __privateMethod(this, _getRemainingTimeInMillis, getRemainingTimeInMillis_fn).call(this);
|
|
1512
|
+
if (timeRemaining) {
|
|
1513
|
+
throw new AutoYieldExecutionError(location1, timeRemaining, __privateMethod(this, _getTimeElapsed, getTimeElapsed_fn).call(this));
|
|
1091
1514
|
}
|
|
1092
|
-
|
|
1093
|
-
|
|
1515
|
+
}, "#forceYield");
|
|
1516
|
+
_getTimeElapsed = new WeakSet();
|
|
1517
|
+
getTimeElapsed_fn = /* @__PURE__ */ __name(function() {
|
|
1518
|
+
return performance.now() - this._timeOrigin;
|
|
1519
|
+
}, "#getTimeElapsed");
|
|
1520
|
+
_getRemainingTimeInMillis = new WeakSet();
|
|
1521
|
+
getRemainingTimeInMillis_fn = /* @__PURE__ */ __name(function() {
|
|
1522
|
+
if (this._executionTimeout) {
|
|
1523
|
+
return this._executionTimeout - (performance.now() - this._timeOrigin);
|
|
1094
1524
|
}
|
|
1095
|
-
|
|
1096
|
-
|
|
1525
|
+
return void 0;
|
|
1526
|
+
}, "#getRemainingTimeInMillis");
|
|
1527
|
+
async function generateIdempotencyKey(keyMaterial) {
|
|
1528
|
+
const keys = keyMaterial.map((key2) => {
|
|
1529
|
+
if (typeof key2 === "string") {
|
|
1530
|
+
return key2;
|
|
1531
|
+
}
|
|
1532
|
+
return stableStringify(key2);
|
|
1533
|
+
});
|
|
1534
|
+
const key = keys.join(":");
|
|
1535
|
+
const hash = await import_node_crypto.webcrypto.subtle.digest("SHA-256", Buffer.from(key));
|
|
1536
|
+
return Buffer.from(hash).toString("hex");
|
|
1537
|
+
}
|
|
1538
|
+
__name(generateIdempotencyKey, "generateIdempotencyKey");
|
|
1539
|
+
function stableStringify(obj) {
|
|
1540
|
+
function sortKeys(obj2) {
|
|
1541
|
+
if (typeof obj2 !== "object" || obj2 === null) {
|
|
1542
|
+
return obj2;
|
|
1543
|
+
}
|
|
1544
|
+
if (Array.isArray(obj2)) {
|
|
1545
|
+
return obj2.map(sortKeys);
|
|
1546
|
+
}
|
|
1547
|
+
const sortedKeys = Object.keys(obj2).sort();
|
|
1548
|
+
const sortedObj2 = {};
|
|
1549
|
+
for (const key of sortedKeys) {
|
|
1550
|
+
sortedObj2[key] = sortKeys(obj2[key]);
|
|
1551
|
+
}
|
|
1552
|
+
return sortedObj2;
|
|
1097
1553
|
}
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
switch (level) {
|
|
1107
|
-
case "LOG": {
|
|
1108
|
-
this._jobLogger?.log(message, data);
|
|
1109
|
-
logLevel = "log";
|
|
1110
|
-
break;
|
|
1111
|
-
}
|
|
1112
|
-
case "DEBUG": {
|
|
1113
|
-
this._jobLogger?.debug(message, data);
|
|
1114
|
-
logLevel = "debug";
|
|
1115
|
-
break;
|
|
1116
|
-
}
|
|
1117
|
-
case "INFO": {
|
|
1118
|
-
this._jobLogger?.info(message, data);
|
|
1119
|
-
logLevel = "info";
|
|
1120
|
-
break;
|
|
1121
|
-
}
|
|
1122
|
-
case "WARN": {
|
|
1123
|
-
this._jobLogger?.warn(message, data);
|
|
1124
|
-
logLevel = "warn";
|
|
1125
|
-
break;
|
|
1126
|
-
}
|
|
1127
|
-
case "ERROR": {
|
|
1128
|
-
this._jobLogger?.error(message, data);
|
|
1129
|
-
logLevel = "error";
|
|
1130
|
-
break;
|
|
1131
|
-
}
|
|
1132
|
-
}
|
|
1133
|
-
}, {
|
|
1134
|
-
name: "log",
|
|
1135
|
-
icon: "log",
|
|
1136
|
-
description: message,
|
|
1137
|
-
params: data,
|
|
1138
|
-
properties: [
|
|
1139
|
-
{
|
|
1140
|
-
label: "Level",
|
|
1141
|
-
text: level
|
|
1142
|
-
}
|
|
1143
|
-
],
|
|
1144
|
-
style: {
|
|
1145
|
-
style: "minimal",
|
|
1146
|
-
variant: level.toLowerCase()
|
|
1147
|
-
},
|
|
1148
|
-
noop: true
|
|
1149
|
-
});
|
|
1150
|
-
}
|
|
1151
|
-
});
|
|
1554
|
+
__name(sortKeys, "sortKeys");
|
|
1555
|
+
const sortedObj = sortKeys(obj);
|
|
1556
|
+
return JSON.stringify(sortedObj);
|
|
1557
|
+
}
|
|
1558
|
+
__name(stableStringify, "stableStringify");
|
|
1559
|
+
var IOLogger = class {
|
|
1560
|
+
constructor(callback) {
|
|
1561
|
+
this.callback = callback;
|
|
1152
1562
|
}
|
|
1153
|
-
|
|
1154
|
-
return
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1563
|
+
log(message, properties) {
|
|
1564
|
+
return this.callback("LOG", message, properties);
|
|
1565
|
+
}
|
|
1566
|
+
debug(message, properties) {
|
|
1567
|
+
return this.callback("DEBUG", message, properties);
|
|
1568
|
+
}
|
|
1569
|
+
info(message, properties) {
|
|
1570
|
+
return this.callback("INFO", message, properties);
|
|
1571
|
+
}
|
|
1572
|
+
warn(message, properties) {
|
|
1573
|
+
return this.callback("WARN", message, properties);
|
|
1574
|
+
}
|
|
1575
|
+
error(message, properties) {
|
|
1576
|
+
return this.callback("ERROR", message, properties);
|
|
1577
|
+
}
|
|
1578
|
+
};
|
|
1579
|
+
__name(IOLogger, "IOLogger");
|
|
1580
|
+
async function spaceOut(callback, index, delay) {
|
|
1581
|
+
await new Promise((resolve) => setTimeout(resolve, index * delay));
|
|
1582
|
+
return await callback();
|
|
1583
|
+
}
|
|
1584
|
+
__name(spaceOut, "spaceOut");
|
|
1585
|
+
function sendEventOptionsProperties(options) {
|
|
1586
|
+
return [
|
|
1587
|
+
...options?.accountId ? [
|
|
1588
|
+
{
|
|
1589
|
+
label: "Account ID",
|
|
1590
|
+
text: options.accountId
|
|
1164
1591
|
}
|
|
1165
|
-
|
|
1166
|
-
|
|
1592
|
+
] : [],
|
|
1593
|
+
...options?.deliverAfter ? [
|
|
1594
|
+
{
|
|
1595
|
+
label: "Deliver After",
|
|
1596
|
+
text: `${options.deliverAfter}s`
|
|
1167
1597
|
}
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
params: {
|
|
1174
|
-
min,
|
|
1175
|
-
max,
|
|
1176
|
-
round
|
|
1177
|
-
},
|
|
1178
|
-
properties: [
|
|
1179
|
-
...min === 0 ? [] : [
|
|
1180
|
-
{
|
|
1181
|
-
label: "min",
|
|
1182
|
-
text: String(min)
|
|
1183
|
-
}
|
|
1184
|
-
],
|
|
1185
|
-
...max === 1 ? [] : [
|
|
1186
|
-
{
|
|
1187
|
-
label: "max",
|
|
1188
|
-
text: String(max)
|
|
1189
|
-
}
|
|
1190
|
-
],
|
|
1191
|
-
...round === false ? [] : [
|
|
1192
|
-
{
|
|
1193
|
-
label: "round",
|
|
1194
|
-
text: String(round)
|
|
1195
|
-
}
|
|
1196
|
-
]
|
|
1197
|
-
],
|
|
1198
|
-
style: {
|
|
1199
|
-
style: "minimal"
|
|
1598
|
+
] : [],
|
|
1599
|
+
...options?.deliverAt ? [
|
|
1600
|
+
{
|
|
1601
|
+
label: "Deliver At",
|
|
1602
|
+
text: options.deliverAt.toISOString()
|
|
1200
1603
|
}
|
|
1604
|
+
] : []
|
|
1605
|
+
];
|
|
1606
|
+
}
|
|
1607
|
+
__name(sendEventOptionsProperties, "sendEventOptionsProperties");
|
|
1608
|
+
|
|
1609
|
+
// src/store/keyValueStoreClient.ts
|
|
1610
|
+
var _serializer, _namespacedKey2, namespacedKey_fn2;
|
|
1611
|
+
var KeyValueStoreClient = class {
|
|
1612
|
+
constructor(queryStore, type = null, namespace = "") {
|
|
1613
|
+
__privateAdd(this, _namespacedKey2);
|
|
1614
|
+
__privateAdd(this, _serializer, void 0);
|
|
1615
|
+
this.queryStore = queryStore;
|
|
1616
|
+
this.type = type;
|
|
1617
|
+
this.namespace = namespace;
|
|
1618
|
+
__privateSet(this, _serializer, new JSONOutputSerializer());
|
|
1619
|
+
}
|
|
1620
|
+
async delete(key) {
|
|
1621
|
+
const result = await this.queryStore("DELETE", {
|
|
1622
|
+
key: __privateMethod(this, _namespacedKey2, namespacedKey_fn2).call(this, key)
|
|
1201
1623
|
});
|
|
1624
|
+
if (result.action !== "DELETE") {
|
|
1625
|
+
throw new Error(`Unexpected key-value store response: ${result.action}`);
|
|
1626
|
+
}
|
|
1627
|
+
return result.deleted;
|
|
1202
1628
|
}
|
|
1203
|
-
async
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
name: "wait",
|
|
1207
|
-
icon: "clock",
|
|
1208
|
-
params: {
|
|
1209
|
-
seconds
|
|
1210
|
-
},
|
|
1211
|
-
noop: true,
|
|
1212
|
-
delayUntil: new Date(Date.now() + seconds * 1e3),
|
|
1213
|
-
style: {
|
|
1214
|
-
style: "minimal"
|
|
1215
|
-
}
|
|
1629
|
+
async get(key) {
|
|
1630
|
+
const result = await this.queryStore("GET", {
|
|
1631
|
+
key: __privateMethod(this, _namespacedKey2, namespacedKey_fn2).call(this, key)
|
|
1216
1632
|
});
|
|
1633
|
+
if (result.action !== "GET") {
|
|
1634
|
+
throw new Error(`Unexpected key-value store response: ${result.action}`);
|
|
1635
|
+
}
|
|
1636
|
+
return __privateGet(this, _serializer).deserialize(result.value);
|
|
1217
1637
|
}
|
|
1218
|
-
async
|
|
1219
|
-
const
|
|
1220
|
-
|
|
1221
|
-
if (!task.callbackUrl) {
|
|
1222
|
-
throw new Error("No callbackUrl found on task");
|
|
1223
|
-
}
|
|
1224
|
-
await this.triggerClient.createEphemeralEventDispatcher({
|
|
1225
|
-
url: task.callbackUrl,
|
|
1226
|
-
name: event.name,
|
|
1227
|
-
filter: event.filter,
|
|
1228
|
-
contextFilter: event.contextFilter,
|
|
1229
|
-
source: event.source,
|
|
1230
|
-
accountId: event.accountId,
|
|
1231
|
-
timeoutInSeconds
|
|
1232
|
-
});
|
|
1233
|
-
return {};
|
|
1234
|
-
}, {
|
|
1235
|
-
name: "Wait for Event",
|
|
1236
|
-
icon: "custom-event",
|
|
1237
|
-
params: {
|
|
1238
|
-
name: event.name,
|
|
1239
|
-
source: event.source,
|
|
1240
|
-
filter: event.filter,
|
|
1241
|
-
contextFilter: event.contextFilter,
|
|
1242
|
-
accountId: event.accountId
|
|
1243
|
-
},
|
|
1244
|
-
callback: {
|
|
1245
|
-
enabled: true,
|
|
1246
|
-
timeoutInSeconds
|
|
1247
|
-
},
|
|
1248
|
-
properties: [
|
|
1249
|
-
{
|
|
1250
|
-
label: "Event",
|
|
1251
|
-
text: event.name
|
|
1252
|
-
},
|
|
1253
|
-
{
|
|
1254
|
-
label: "Timeout",
|
|
1255
|
-
text: `${timeoutInSeconds}s`
|
|
1256
|
-
},
|
|
1257
|
-
...event.source ? [
|
|
1258
|
-
{
|
|
1259
|
-
label: "Source",
|
|
1260
|
-
text: event.source
|
|
1261
|
-
}
|
|
1262
|
-
] : [],
|
|
1263
|
-
...event.accountId ? [
|
|
1264
|
-
{
|
|
1265
|
-
label: "Account ID",
|
|
1266
|
-
text: event.accountId
|
|
1267
|
-
}
|
|
1268
|
-
] : []
|
|
1269
|
-
],
|
|
1270
|
-
parseOutput: (output) => {
|
|
1271
|
-
return waitForEventSchema(event.schema ?? import_zod3.z.any()).parse(output);
|
|
1272
|
-
}
|
|
1638
|
+
async has(key) {
|
|
1639
|
+
const result = await this.queryStore("HAS", {
|
|
1640
|
+
key: __privateMethod(this, _namespacedKey2, namespacedKey_fn2).call(this, key)
|
|
1273
1641
|
});
|
|
1642
|
+
if (result.action !== "HAS") {
|
|
1643
|
+
throw new Error(`Unexpected key-value store response: ${result.action}`);
|
|
1644
|
+
}
|
|
1645
|
+
return result.has;
|
|
1274
1646
|
}
|
|
1275
|
-
async
|
|
1276
|
-
const
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
throw new Error("No callbackUrl found on task");
|
|
1280
|
-
}
|
|
1281
|
-
task.outputProperties = [
|
|
1282
|
-
{
|
|
1283
|
-
label: "Callback URL",
|
|
1284
|
-
text: task.callbackUrl
|
|
1285
|
-
}
|
|
1286
|
-
];
|
|
1287
|
-
return callback(task.callbackUrl);
|
|
1288
|
-
}, {
|
|
1289
|
-
name: "Wait for Request",
|
|
1290
|
-
icon: "clock",
|
|
1291
|
-
callback: {
|
|
1292
|
-
enabled: true,
|
|
1293
|
-
timeoutInSeconds: options?.timeoutInSeconds
|
|
1294
|
-
},
|
|
1295
|
-
properties: [
|
|
1296
|
-
{
|
|
1297
|
-
label: "Timeout",
|
|
1298
|
-
text: `${timeoutInSeconds}s`
|
|
1299
|
-
}
|
|
1300
|
-
]
|
|
1647
|
+
async set(key, value) {
|
|
1648
|
+
const result = await this.queryStore("SET", {
|
|
1649
|
+
key: __privateMethod(this, _namespacedKey2, namespacedKey_fn2).call(this, key),
|
|
1650
|
+
value: __privateGet(this, _serializer).serialize(value)
|
|
1301
1651
|
});
|
|
1652
|
+
if (result.action !== "SET") {
|
|
1653
|
+
throw new Error(`Unexpected key-value store response: ${result.action}`);
|
|
1654
|
+
}
|
|
1655
|
+
return __privateGet(this, _serializer).deserialize(result.value);
|
|
1302
1656
|
}
|
|
1303
|
-
|
|
1304
|
-
|
|
1305
|
-
|
|
1306
|
-
|
|
1307
|
-
|
|
1657
|
+
};
|
|
1658
|
+
__name(KeyValueStoreClient, "KeyValueStoreClient");
|
|
1659
|
+
_serializer = new WeakMap();
|
|
1660
|
+
_namespacedKey2 = new WeakSet();
|
|
1661
|
+
namespacedKey_fn2 = /* @__PURE__ */ __name(function(key) {
|
|
1662
|
+
const parts = [];
|
|
1663
|
+
if (this.type) {
|
|
1664
|
+
parts.push(this.type);
|
|
1665
|
+
}
|
|
1666
|
+
if (this.namespace) {
|
|
1667
|
+
parts.push(this.namespace);
|
|
1668
|
+
}
|
|
1669
|
+
parts.push(key);
|
|
1670
|
+
return parts.join(":");
|
|
1671
|
+
}, "#namespacedKey");
|
|
1672
|
+
|
|
1673
|
+
// src/apiClient.ts
|
|
1674
|
+
var _apiUrl, _options, _logger, _storeClient, _queryKeyValueStore, queryKeyValueStore_fn, _apiKey, apiKey_fn;
|
|
1675
|
+
var ApiClient = class {
|
|
1676
|
+
constructor(options) {
|
|
1677
|
+
__privateAdd(this, _queryKeyValueStore);
|
|
1678
|
+
__privateAdd(this, _apiKey);
|
|
1679
|
+
__privateAdd(this, _apiUrl, void 0);
|
|
1680
|
+
__privateAdd(this, _options, void 0);
|
|
1681
|
+
__privateAdd(this, _logger, void 0);
|
|
1682
|
+
__privateAdd(this, _storeClient, void 0);
|
|
1683
|
+
__privateSet(this, _options, options);
|
|
1684
|
+
__privateSet(this, _apiUrl, __privateGet(this, _options).apiUrl ?? process.env.TRIGGER_API_URL ?? "https://api.trigger.dev");
|
|
1685
|
+
__privateSet(this, _logger, new import_core3.Logger("trigger.dev", __privateGet(this, _options).logLevel));
|
|
1686
|
+
__privateSet(this, _storeClient, new KeyValueStoreClient(__privateMethod(this, _queryKeyValueStore, queryKeyValueStore_fn).bind(this)));
|
|
1308
1687
|
}
|
|
1309
|
-
async
|
|
1310
|
-
const
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
}
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
properties: [
|
|
1326
|
-
{
|
|
1327
|
-
label: "url",
|
|
1328
|
-
text: url,
|
|
1329
|
-
url
|
|
1330
|
-
},
|
|
1331
|
-
{
|
|
1332
|
-
label: "method",
|
|
1333
|
-
text: requestInit?.method ?? "GET"
|
|
1334
|
-
},
|
|
1335
|
-
{
|
|
1336
|
-
label: "background",
|
|
1337
|
-
text: "true"
|
|
1338
|
-
},
|
|
1339
|
-
...options?.timeout ? [
|
|
1340
|
-
{
|
|
1341
|
-
label: "timeout",
|
|
1342
|
-
text: `${options.timeout.durationInMs}ms`
|
|
1343
|
-
}
|
|
1344
|
-
] : []
|
|
1345
|
-
],
|
|
1346
|
-
retry: {
|
|
1347
|
-
limit: 0
|
|
1348
|
-
}
|
|
1688
|
+
async registerEndpoint(options) {
|
|
1689
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1690
|
+
__privateGet(this, _logger).debug("Registering endpoint", {
|
|
1691
|
+
url: options.url,
|
|
1692
|
+
name: options.name
|
|
1693
|
+
});
|
|
1694
|
+
const response = await fetch(`${__privateGet(this, _apiUrl)}/api/v1/endpoints`, {
|
|
1695
|
+
method: "POST",
|
|
1696
|
+
headers: {
|
|
1697
|
+
"Content-Type": "application/json",
|
|
1698
|
+
Authorization: `Bearer ${apiKey}`
|
|
1699
|
+
},
|
|
1700
|
+
body: JSON.stringify({
|
|
1701
|
+
url: options.url,
|
|
1702
|
+
name: options.name
|
|
1703
|
+
})
|
|
1349
1704
|
});
|
|
1705
|
+
if (response.status >= 400 && response.status < 500) {
|
|
1706
|
+
const body = await response.json();
|
|
1707
|
+
throw new Error(body.error);
|
|
1708
|
+
}
|
|
1709
|
+
if (response.status !== 200) {
|
|
1710
|
+
throw new Error(`Failed to register entry point, got status code ${response.status}`);
|
|
1711
|
+
}
|
|
1712
|
+
return await response.json();
|
|
1350
1713
|
}
|
|
1351
|
-
async
|
|
1352
|
-
const
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
}, {
|
|
1356
|
-
name: `poll ${urlObject.hostname}${urlObject.pathname}`,
|
|
1357
|
-
params,
|
|
1358
|
-
operation: "fetch-poll",
|
|
1359
|
-
icon: "clock-bolt",
|
|
1360
|
-
noop: false,
|
|
1361
|
-
properties: [
|
|
1362
|
-
{
|
|
1363
|
-
label: "url",
|
|
1364
|
-
text: params.url
|
|
1365
|
-
},
|
|
1366
|
-
{
|
|
1367
|
-
label: "interval",
|
|
1368
|
-
text: `${params.interval}s`
|
|
1369
|
-
},
|
|
1370
|
-
{
|
|
1371
|
-
label: "timeout",
|
|
1372
|
-
text: `${params.timeout}s`
|
|
1373
|
-
}
|
|
1374
|
-
],
|
|
1375
|
-
retry: {
|
|
1376
|
-
limit: 0
|
|
1377
|
-
}
|
|
1714
|
+
async runTask(runId, task, options = {}) {
|
|
1715
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1716
|
+
__privateGet(this, _logger).debug("Running Task", {
|
|
1717
|
+
task
|
|
1378
1718
|
});
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
retry: options?.retry,
|
|
1390
|
-
timeout: options?.timeout
|
|
1719
|
+
return await zodfetchWithVersions({
|
|
1720
|
+
[import_core3.API_VERSIONS.LAZY_LOADED_CACHED_TASKS]: import_core3.RunTaskResponseWithCachedTasksBodySchema
|
|
1721
|
+
}, import_core3.ServerTaskSchema, `${__privateGet(this, _apiUrl)}/api/v1/runs/${runId}/tasks`, {
|
|
1722
|
+
method: "POST",
|
|
1723
|
+
headers: {
|
|
1724
|
+
"Content-Type": "application/json",
|
|
1725
|
+
Authorization: `Bearer ${apiKey}`,
|
|
1726
|
+
"Idempotency-Key": task.idempotencyKey,
|
|
1727
|
+
"X-Cached-Tasks-Cursor": options.cachedTasksCursor ?? "",
|
|
1728
|
+
"Trigger-Version": import_core3.API_VERSIONS.LAZY_LOADED_CACHED_TASKS
|
|
1391
1729
|
},
|
|
1392
|
-
|
|
1393
|
-
icon: "background",
|
|
1394
|
-
noop: false,
|
|
1395
|
-
properties: [
|
|
1396
|
-
{
|
|
1397
|
-
label: "url",
|
|
1398
|
-
text: url,
|
|
1399
|
-
url
|
|
1400
|
-
},
|
|
1401
|
-
{
|
|
1402
|
-
label: "method",
|
|
1403
|
-
text: requestInit?.method ?? "GET"
|
|
1404
|
-
},
|
|
1405
|
-
{
|
|
1406
|
-
label: "background",
|
|
1407
|
-
text: "true"
|
|
1408
|
-
},
|
|
1409
|
-
...options?.timeout ? [
|
|
1410
|
-
{
|
|
1411
|
-
label: "timeout",
|
|
1412
|
-
text: `${options.timeout.durationInMs}ms`
|
|
1413
|
-
}
|
|
1414
|
-
] : []
|
|
1415
|
-
],
|
|
1416
|
-
retry: {
|
|
1417
|
-
limit: 0
|
|
1418
|
-
}
|
|
1730
|
+
body: JSON.stringify(task)
|
|
1419
1731
|
});
|
|
1420
1732
|
}
|
|
1421
|
-
async
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1733
|
+
async completeTask(runId, id, task) {
|
|
1734
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1735
|
+
__privateGet(this, _logger).debug("Complete Task", {
|
|
1736
|
+
task
|
|
1737
|
+
});
|
|
1738
|
+
return await zodfetch(import_core3.ServerTaskSchema, `${__privateGet(this, _apiUrl)}/api/v1/runs/${runId}/tasks/${id}/complete`, {
|
|
1739
|
+
method: "POST",
|
|
1740
|
+
headers: {
|
|
1741
|
+
"Content-Type": "application/json",
|
|
1742
|
+
Authorization: `Bearer ${apiKey}`,
|
|
1743
|
+
"Trigger-Version": import_core3.API_VERSIONS.SERIALIZED_TASK_OUTPUT
|
|
1429
1744
|
},
|
|
1430
|
-
|
|
1431
|
-
{
|
|
1432
|
-
label: "name",
|
|
1433
|
-
text: event.name
|
|
1434
|
-
},
|
|
1435
|
-
...event?.id ? [
|
|
1436
|
-
{
|
|
1437
|
-
label: "ID",
|
|
1438
|
-
text: event.id
|
|
1439
|
-
}
|
|
1440
|
-
] : [],
|
|
1441
|
-
...sendEventOptionsProperties(options)
|
|
1442
|
-
]
|
|
1745
|
+
body: JSON.stringify(task)
|
|
1443
1746
|
});
|
|
1444
1747
|
}
|
|
1445
|
-
async
|
|
1446
|
-
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1748
|
+
async failTask(runId, id, body) {
|
|
1749
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1750
|
+
__privateGet(this, _logger).debug("Fail Task", {
|
|
1751
|
+
id,
|
|
1752
|
+
runId,
|
|
1753
|
+
body
|
|
1754
|
+
});
|
|
1755
|
+
return await zodfetch(import_core3.ServerTaskSchema, `${__privateGet(this, _apiUrl)}/api/v1/runs/${runId}/tasks/${id}/fail`, {
|
|
1756
|
+
method: "POST",
|
|
1757
|
+
headers: {
|
|
1758
|
+
"Content-Type": "application/json",
|
|
1759
|
+
Authorization: `Bearer ${apiKey}`
|
|
1453
1760
|
},
|
|
1454
|
-
|
|
1455
|
-
{
|
|
1456
|
-
label: "Total Events",
|
|
1457
|
-
text: String(events.length)
|
|
1458
|
-
},
|
|
1459
|
-
...sendEventOptionsProperties(options)
|
|
1460
|
-
]
|
|
1761
|
+
body: JSON.stringify(body)
|
|
1461
1762
|
});
|
|
1462
1763
|
}
|
|
1463
|
-
async
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1764
|
+
async sendEvent(event, options = {}) {
|
|
1765
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1766
|
+
__privateGet(this, _logger).debug("Sending event", {
|
|
1767
|
+
event
|
|
1768
|
+
});
|
|
1769
|
+
return await zodfetch(import_core3.ApiEventLogSchema, `${__privateGet(this, _apiUrl)}/api/v1/events`, {
|
|
1770
|
+
method: "POST",
|
|
1771
|
+
headers: {
|
|
1772
|
+
"Content-Type": "application/json",
|
|
1773
|
+
Authorization: `Bearer ${apiKey}`
|
|
1470
1774
|
},
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
|
-
}
|
|
1476
|
-
]
|
|
1775
|
+
body: JSON.stringify({
|
|
1776
|
+
event,
|
|
1777
|
+
options
|
|
1778
|
+
})
|
|
1477
1779
|
});
|
|
1478
1780
|
}
|
|
1479
|
-
async
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1781
|
+
async sendEvents(events, options = {}) {
|
|
1782
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1783
|
+
__privateGet(this, _logger).debug("Sending multiple events", {
|
|
1784
|
+
events
|
|
1785
|
+
});
|
|
1786
|
+
return await zodfetch(import_core3.ApiEventLogSchema.array(), `${__privateGet(this, _apiUrl)}/api/v1/events/bulk`, {
|
|
1787
|
+
method: "POST",
|
|
1788
|
+
headers: {
|
|
1789
|
+
"Content-Type": "application/json",
|
|
1790
|
+
Authorization: `Bearer ${apiKey}`
|
|
1486
1791
|
},
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
}
|
|
1492
|
-
]
|
|
1792
|
+
body: JSON.stringify({
|
|
1793
|
+
events,
|
|
1794
|
+
options
|
|
1795
|
+
})
|
|
1493
1796
|
});
|
|
1494
1797
|
}
|
|
1495
|
-
async
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
}
|
|
1506
|
-
],
|
|
1507
|
-
params: options,
|
|
1508
|
-
redact: {
|
|
1509
|
-
paths: [
|
|
1510
|
-
"secret"
|
|
1511
|
-
]
|
|
1798
|
+
async cancelEvent(eventId) {
|
|
1799
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1800
|
+
__privateGet(this, _logger).debug("Cancelling event", {
|
|
1801
|
+
eventId
|
|
1802
|
+
});
|
|
1803
|
+
return await zodfetch(import_core3.ApiEventLogSchema, `${__privateGet(this, _apiUrl)}/api/v1/events/${eventId}/cancel`, {
|
|
1804
|
+
method: "POST",
|
|
1805
|
+
headers: {
|
|
1806
|
+
"Content-Type": "application/json",
|
|
1807
|
+
Authorization: `Bearer ${apiKey}`
|
|
1512
1808
|
}
|
|
1513
1809
|
});
|
|
1514
1810
|
}
|
|
1515
|
-
async
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
{
|
|
1525
|
-
|
|
1526
|
-
text: dynamicSchedule.id
|
|
1527
|
-
},
|
|
1528
|
-
{
|
|
1529
|
-
label: "id",
|
|
1530
|
-
text: id
|
|
1531
|
-
},
|
|
1532
|
-
{
|
|
1533
|
-
label: "seconds",
|
|
1534
|
-
text: options.seconds.toString()
|
|
1535
|
-
}
|
|
1536
|
-
],
|
|
1537
|
-
params: options
|
|
1811
|
+
async cancelRunsForEvent(eventId) {
|
|
1812
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1813
|
+
__privateGet(this, _logger).debug("Cancelling runs for event", {
|
|
1814
|
+
eventId
|
|
1815
|
+
});
|
|
1816
|
+
return await zodfetch(import_core3.CancelRunsForEventSchema, `${__privateGet(this, _apiUrl)}/api/v1/events/${eventId}/cancel-runs`, {
|
|
1817
|
+
method: "POST",
|
|
1818
|
+
headers: {
|
|
1819
|
+
"Content-Type": "application/json",
|
|
1820
|
+
Authorization: `Bearer ${apiKey}`
|
|
1821
|
+
}
|
|
1538
1822
|
});
|
|
1539
1823
|
}
|
|
1540
|
-
async
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
properties: [
|
|
1546
|
-
{
|
|
1547
|
-
label: "schedule",
|
|
1548
|
-
text: dynamicSchedule.id
|
|
1549
|
-
},
|
|
1550
|
-
{
|
|
1551
|
-
label: "id",
|
|
1552
|
-
text: id
|
|
1553
|
-
}
|
|
1554
|
-
]
|
|
1824
|
+
async updateStatus(runId, id, status) {
|
|
1825
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1826
|
+
__privateGet(this, _logger).debug("Update status", {
|
|
1827
|
+
id,
|
|
1828
|
+
status
|
|
1555
1829
|
});
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
}, {
|
|
1564
|
-
name: "register-cron",
|
|
1565
|
-
properties: [
|
|
1566
|
-
{
|
|
1567
|
-
label: "schedule",
|
|
1568
|
-
text: dynamicSchedule.id
|
|
1569
|
-
},
|
|
1570
|
-
{
|
|
1571
|
-
label: "id",
|
|
1572
|
-
text: id
|
|
1573
|
-
},
|
|
1574
|
-
{
|
|
1575
|
-
label: "cron",
|
|
1576
|
-
text: options.cron
|
|
1577
|
-
}
|
|
1578
|
-
],
|
|
1579
|
-
params: options
|
|
1830
|
+
return await zodfetch(import_core3.JobRunStatusRecordSchema, `${__privateGet(this, _apiUrl)}/api/v1/runs/${runId}/statuses/${id}`, {
|
|
1831
|
+
method: "PUT",
|
|
1832
|
+
headers: {
|
|
1833
|
+
"Content-Type": "application/json",
|
|
1834
|
+
Authorization: `Bearer ${apiKey}`
|
|
1835
|
+
},
|
|
1836
|
+
body: JSON.stringify(status)
|
|
1580
1837
|
});
|
|
1581
1838
|
}
|
|
1582
|
-
async
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
}
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
text: id
|
|
1595
|
-
}
|
|
1596
|
-
]
|
|
1839
|
+
async updateSource(client, key, source) {
|
|
1840
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1841
|
+
__privateGet(this, _logger).debug("activating http source", {
|
|
1842
|
+
source
|
|
1843
|
+
});
|
|
1844
|
+
const response = await zodfetch(import_core3.TriggerSourceSchema, `${__privateGet(this, _apiUrl)}/api/v2/${client}/sources/${key}`, {
|
|
1845
|
+
method: "PUT",
|
|
1846
|
+
headers: {
|
|
1847
|
+
"Content-Type": "application/json",
|
|
1848
|
+
Authorization: `Bearer ${apiKey}`
|
|
1849
|
+
},
|
|
1850
|
+
body: JSON.stringify(source)
|
|
1597
1851
|
});
|
|
1852
|
+
return response;
|
|
1598
1853
|
}
|
|
1599
|
-
async
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
}, {
|
|
1604
|
-
name: "register-source"
|
|
1605
|
-
});
|
|
1606
|
-
return {
|
|
1607
|
-
id: registration.id,
|
|
1608
|
-
key: registration.source.key
|
|
1609
|
-
};
|
|
1610
|
-
}, {
|
|
1611
|
-
name: "register-trigger",
|
|
1612
|
-
properties: [
|
|
1613
|
-
{
|
|
1614
|
-
label: "trigger",
|
|
1615
|
-
text: trigger.id
|
|
1616
|
-
},
|
|
1617
|
-
{
|
|
1618
|
-
label: "id",
|
|
1619
|
-
text: id
|
|
1620
|
-
}
|
|
1621
|
-
],
|
|
1622
|
-
params
|
|
1854
|
+
async updateWebhook(key, webhookData) {
|
|
1855
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1856
|
+
__privateGet(this, _logger).debug("activating webhook", {
|
|
1857
|
+
webhookData
|
|
1623
1858
|
});
|
|
1859
|
+
const response = await zodfetch(import_core3.TriggerSourceSchema, `${__privateGet(this, _apiUrl)}/api/v1/webhooks/${key}`, {
|
|
1860
|
+
method: "PUT",
|
|
1861
|
+
headers: {
|
|
1862
|
+
"Content-Type": "application/json",
|
|
1863
|
+
Authorization: `Bearer ${apiKey}`
|
|
1864
|
+
},
|
|
1865
|
+
body: JSON.stringify(webhookData)
|
|
1866
|
+
});
|
|
1867
|
+
return response;
|
|
1624
1868
|
}
|
|
1625
|
-
async
|
|
1626
|
-
|
|
1627
|
-
|
|
1869
|
+
async registerTrigger(client, id, key, payload, idempotencyKey) {
|
|
1870
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1871
|
+
__privateGet(this, _logger).debug("registering trigger", {
|
|
1872
|
+
id,
|
|
1873
|
+
payload
|
|
1874
|
+
});
|
|
1875
|
+
const headers = {
|
|
1876
|
+
"Content-Type": "application/json",
|
|
1877
|
+
Authorization: `Bearer ${apiKey}`
|
|
1878
|
+
};
|
|
1879
|
+
if (idempotencyKey) {
|
|
1880
|
+
headers["Idempotency-Key"] = idempotencyKey;
|
|
1628
1881
|
}
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1882
|
+
const response = await zodfetch(import_core3.RegisterSourceEventSchemaV2, `${__privateGet(this, _apiUrl)}/api/v2/${client}/triggers/${id}/registrations/${key}`, {
|
|
1883
|
+
method: "PUT",
|
|
1884
|
+
headers,
|
|
1885
|
+
body: JSON.stringify(payload)
|
|
1633
1886
|
});
|
|
1887
|
+
return response;
|
|
1634
1888
|
}
|
|
1635
|
-
async
|
|
1636
|
-
const
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1889
|
+
async registerSchedule(client, id, key, payload) {
|
|
1890
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1891
|
+
__privateGet(this, _logger).debug("registering schedule", {
|
|
1892
|
+
id,
|
|
1893
|
+
payload
|
|
1894
|
+
});
|
|
1895
|
+
const response = await zodfetch(import_core3.RegisterScheduleResponseBodySchema, `${__privateGet(this, _apiUrl)}/api/v1/${client}/schedules/${id}/registrations`, {
|
|
1896
|
+
method: "POST",
|
|
1897
|
+
headers: {
|
|
1898
|
+
"Content-Type": "application/json",
|
|
1899
|
+
Authorization: `Bearer ${apiKey}`
|
|
1900
|
+
},
|
|
1901
|
+
body: JSON.stringify({
|
|
1902
|
+
id: key,
|
|
1903
|
+
...payload
|
|
1904
|
+
})
|
|
1905
|
+
});
|
|
1906
|
+
return response;
|
|
1907
|
+
}
|
|
1908
|
+
async unregisterSchedule(client, id, key) {
|
|
1909
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1910
|
+
__privateGet(this, _logger).debug("unregistering schedule", {
|
|
1911
|
+
id
|
|
1912
|
+
});
|
|
1913
|
+
const response = await zodfetch(import_zod3.z.object({
|
|
1914
|
+
ok: import_zod3.z.boolean()
|
|
1915
|
+
}), `${__privateGet(this, _apiUrl)}/api/v1/${client}/schedules/${id}/registrations/${encodeURIComponent(key)}`, {
|
|
1916
|
+
method: "DELETE",
|
|
1917
|
+
headers: {
|
|
1918
|
+
"Content-Type": "application/json",
|
|
1919
|
+
Authorization: `Bearer ${apiKey}`
|
|
1640
1920
|
}
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1921
|
+
});
|
|
1922
|
+
return response;
|
|
1923
|
+
}
|
|
1924
|
+
async getAuth(client, id) {
|
|
1925
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1926
|
+
__privateGet(this, _logger).debug("getting auth", {
|
|
1927
|
+
id
|
|
1928
|
+
});
|
|
1929
|
+
const response = await zodfetch(import_core3.ConnectionAuthSchema, `${__privateGet(this, _apiUrl)}/api/v1/${client}/auth/${id}`, {
|
|
1930
|
+
method: "GET",
|
|
1931
|
+
headers: {
|
|
1932
|
+
Accept: "application/json",
|
|
1933
|
+
Authorization: `Bearer ${apiKey}`
|
|
1644
1934
|
}
|
|
1645
|
-
const internalErrors = outcomes.filter((outcome) => outcome.status === "rejected" && isTriggerError(outcome.reason)).map((outcome) => outcome).map((outcome) => outcome.reason);
|
|
1646
|
-
throw new ResumeWithParallelTaskError(task, internalErrors);
|
|
1647
1935
|
}, {
|
|
1648
|
-
|
|
1649
|
-
parallel: true,
|
|
1650
|
-
...options ?? {}
|
|
1936
|
+
optional: true
|
|
1651
1937
|
});
|
|
1652
|
-
return
|
|
1938
|
+
return response;
|
|
1653
1939
|
}
|
|
1654
|
-
async
|
|
1655
|
-
__privateMethod(this,
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
}
|
|
1676
|
-
this._visitedCacheKeys.add(idempotencyKey);
|
|
1677
|
-
const cachedTask = this._cachedTasks.get(idempotencyKey);
|
|
1678
|
-
if (cachedTask && cachedTask.status === "COMPLETED") {
|
|
1679
|
-
this._logger.debug("Using completed cached task", {
|
|
1680
|
-
idempotencyKey
|
|
1681
|
-
});
|
|
1682
|
-
this._stats.cachedTaskHits++;
|
|
1683
|
-
return options?.parseOutput ? options.parseOutput(cachedTask.output) : cachedTask.output;
|
|
1684
|
-
}
|
|
1685
|
-
if (options?.noop && this._noopTasksBloomFilter) {
|
|
1686
|
-
if (this._noopTasksBloomFilter.test(idempotencyKey)) {
|
|
1687
|
-
this._logger.debug("task idempotency key exists in noopTasksBloomFilter", {
|
|
1688
|
-
idempotencyKey
|
|
1689
|
-
});
|
|
1690
|
-
this._stats.noopCachedTaskHits++;
|
|
1691
|
-
return {};
|
|
1940
|
+
async getEvent(eventId) {
|
|
1941
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1942
|
+
__privateGet(this, _logger).debug("Getting Event", {
|
|
1943
|
+
eventId
|
|
1944
|
+
});
|
|
1945
|
+
return await zodfetch(import_core3.GetEventSchema, `${__privateGet(this, _apiUrl)}/api/v1/events/${eventId}`, {
|
|
1946
|
+
method: "GET",
|
|
1947
|
+
headers: {
|
|
1948
|
+
Authorization: `Bearer ${apiKey}`
|
|
1949
|
+
}
|
|
1950
|
+
});
|
|
1951
|
+
}
|
|
1952
|
+
async getRun(runId, options) {
|
|
1953
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1954
|
+
__privateGet(this, _logger).debug("Getting Run", {
|
|
1955
|
+
runId
|
|
1956
|
+
});
|
|
1957
|
+
return await zodfetch(import_core3.GetRunSchema, (0, import_core3.urlWithSearchParams)(`${__privateGet(this, _apiUrl)}/api/v1/runs/${runId}`, options), {
|
|
1958
|
+
method: "GET",
|
|
1959
|
+
headers: {
|
|
1960
|
+
Authorization: `Bearer ${apiKey}`
|
|
1692
1961
|
}
|
|
1693
|
-
}
|
|
1694
|
-
const runOptions = {
|
|
1695
|
-
...options ?? {},
|
|
1696
|
-
parseOutput: void 0
|
|
1697
|
-
};
|
|
1698
|
-
const response = await this._apiClient.runTask(this._id, {
|
|
1699
|
-
idempotencyKey,
|
|
1700
|
-
displayKey: typeof cacheKey === "string" ? cacheKey : void 0,
|
|
1701
|
-
noop: false,
|
|
1702
|
-
...runOptions ?? {},
|
|
1703
|
-
parentId
|
|
1704
|
-
}, {
|
|
1705
|
-
cachedTasksCursor: this._cachedTasksCursor
|
|
1706
1962
|
});
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1713
|
-
}
|
|
1714
|
-
|
|
1715
|
-
|
|
1716
|
-
|
|
1717
|
-
|
|
1718
|
-
this._cachedTasks.set(cachedTask2.idempotencyKey, cachedTask2);
|
|
1719
|
-
this._logger.debug("Injecting lazy loaded task into task cache", {
|
|
1720
|
-
idempotencyKey: cachedTask2.idempotencyKey
|
|
1721
|
-
});
|
|
1722
|
-
this._stats.lazyLoadedCachedTasks++;
|
|
1723
|
-
}
|
|
1963
|
+
}
|
|
1964
|
+
async cancelRun(runId) {
|
|
1965
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1966
|
+
__privateGet(this, _logger).debug("Cancelling Run", {
|
|
1967
|
+
runId
|
|
1968
|
+
});
|
|
1969
|
+
return await zodfetch(import_core3.GetRunSchema, `${__privateGet(this, _apiUrl)}/api/v1/runs/${runId}/cancel`, {
|
|
1970
|
+
method: "POST",
|
|
1971
|
+
headers: {
|
|
1972
|
+
"Content-Type": "application/json",
|
|
1973
|
+
Authorization: `Bearer ${apiKey}`
|
|
1724
1974
|
}
|
|
1725
|
-
}
|
|
1726
|
-
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
}
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
idempotencyKey
|
|
1737
|
-
});
|
|
1738
|
-
this._noopTasksBloomFilter?.add(task.idempotencyKey);
|
|
1739
|
-
} else {
|
|
1740
|
-
this._logger.debug("Cache miss", {
|
|
1741
|
-
idempotencyKey
|
|
1742
|
-
});
|
|
1743
|
-
this._stats.cachedTaskMisses++;
|
|
1744
|
-
__privateMethod(this, _addToCachedTasks, addToCachedTasks_fn).call(this, task);
|
|
1975
|
+
});
|
|
1976
|
+
}
|
|
1977
|
+
async getRunStatuses(runId) {
|
|
1978
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1979
|
+
__privateGet(this, _logger).debug("Getting Run statuses", {
|
|
1980
|
+
runId
|
|
1981
|
+
});
|
|
1982
|
+
return await zodfetch(import_core3.GetRunStatusesSchema, `${__privateGet(this, _apiUrl)}/api/v1/runs/${runId}/statuses`, {
|
|
1983
|
+
method: "GET",
|
|
1984
|
+
headers: {
|
|
1985
|
+
Authorization: `Bearer ${apiKey}`
|
|
1745
1986
|
}
|
|
1746
|
-
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1755
|
-
|
|
1756
|
-
|
|
1757
|
-
try {
|
|
1758
|
-
const result = await callback(task, this);
|
|
1759
|
-
if (task.status === "WAITING" && task.callbackUrl) {
|
|
1760
|
-
this._logger.debug("Waiting for remote callback", {
|
|
1761
|
-
idempotencyKey,
|
|
1762
|
-
task
|
|
1763
|
-
});
|
|
1764
|
-
return {};
|
|
1765
|
-
}
|
|
1766
|
-
const output = this._outputSerializer.serialize(result);
|
|
1767
|
-
this._logger.debug("Completing using output", {
|
|
1768
|
-
idempotencyKey,
|
|
1769
|
-
task
|
|
1770
|
-
});
|
|
1771
|
-
__privateMethod(this, _detectAutoYield, detectAutoYield_fn).call(this, "before_complete_task", 500, task, output);
|
|
1772
|
-
const completedTask = await this._apiClient.completeTask(this._id, task.id, {
|
|
1773
|
-
output,
|
|
1774
|
-
properties: task.outputProperties ?? void 0
|
|
1775
|
-
});
|
|
1776
|
-
if (completedTask.forceYield) {
|
|
1777
|
-
this._logger.debug("Forcing yield after task completed", {
|
|
1778
|
-
idempotencyKey
|
|
1779
|
-
});
|
|
1780
|
-
__privateMethod(this, _forceYield, forceYield_fn).call(this, "after_complete_task");
|
|
1781
|
-
}
|
|
1782
|
-
this._stats.executedTasks++;
|
|
1783
|
-
if (completedTask.status === "CANCELED") {
|
|
1784
|
-
throw new CanceledWithTaskError(completedTask);
|
|
1785
|
-
}
|
|
1786
|
-
__privateMethod(this, _detectAutoYield, detectAutoYield_fn).call(this, "after_complete_task", 500);
|
|
1787
|
-
const deserializedOutput = this._outputSerializer.deserialize(output);
|
|
1788
|
-
return options?.parseOutput ? options.parseOutput(deserializedOutput) : deserializedOutput;
|
|
1789
|
-
} catch (error) {
|
|
1790
|
-
if (isTriggerError(error)) {
|
|
1791
|
-
throw error;
|
|
1792
|
-
}
|
|
1793
|
-
let skipRetrying = false;
|
|
1794
|
-
if (onError) {
|
|
1795
|
-
try {
|
|
1796
|
-
const onErrorResult = onError(error, task, this);
|
|
1797
|
-
if (onErrorResult) {
|
|
1798
|
-
if (onErrorResult instanceof Error) {
|
|
1799
|
-
error = onErrorResult;
|
|
1800
|
-
} else {
|
|
1801
|
-
skipRetrying = !!onErrorResult.skipRetrying;
|
|
1802
|
-
if (onErrorResult.retryAt && !skipRetrying) {
|
|
1803
|
-
const parsedError2 = import_core4.ErrorWithStackSchema.safeParse(onErrorResult.error);
|
|
1804
|
-
throw new RetryWithTaskError(parsedError2.success ? parsedError2.data : {
|
|
1805
|
-
message: "Unknown error"
|
|
1806
|
-
}, task, onErrorResult.retryAt);
|
|
1807
|
-
}
|
|
1808
|
-
}
|
|
1809
|
-
}
|
|
1810
|
-
} catch (innerError) {
|
|
1811
|
-
if (isTriggerError(innerError)) {
|
|
1812
|
-
throw innerError;
|
|
1813
|
-
}
|
|
1814
|
-
error = innerError;
|
|
1815
|
-
}
|
|
1816
|
-
}
|
|
1817
|
-
if (error instanceof ErrorWithTask) {
|
|
1818
|
-
await this._apiClient.failTask(this._id, task.id, {
|
|
1819
|
-
error: error.cause.output
|
|
1820
|
-
});
|
|
1821
|
-
}
|
|
1822
|
-
const parsedError = import_core4.ErrorWithStackSchema.safeParse(error);
|
|
1823
|
-
if (options?.retry && !skipRetrying) {
|
|
1824
|
-
const retryAt = (0, import_core3.calculateRetryAt)(options.retry, task.attempts - 1);
|
|
1825
|
-
if (retryAt) {
|
|
1826
|
-
throw new RetryWithTaskError(parsedError.success ? parsedError.data : {
|
|
1827
|
-
message: "Unknown error"
|
|
1828
|
-
}, task, retryAt);
|
|
1829
|
-
}
|
|
1830
|
-
}
|
|
1831
|
-
if (parsedError.success) {
|
|
1832
|
-
await this._apiClient.failTask(this._id, task.id, {
|
|
1833
|
-
error: parsedError.data
|
|
1834
|
-
});
|
|
1835
|
-
} else {
|
|
1836
|
-
const message = typeof error === "string" ? error : JSON.stringify(error);
|
|
1837
|
-
await this._apiClient.failTask(this._id, task.id, {
|
|
1838
|
-
error: {
|
|
1839
|
-
name: "Unknown error",
|
|
1840
|
-
message
|
|
1841
|
-
}
|
|
1842
|
-
});
|
|
1843
|
-
}
|
|
1844
|
-
throw error;
|
|
1987
|
+
});
|
|
1988
|
+
}
|
|
1989
|
+
async getRuns(jobSlug, options) {
|
|
1990
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
1991
|
+
__privateGet(this, _logger).debug("Getting Runs", {
|
|
1992
|
+
jobSlug
|
|
1993
|
+
});
|
|
1994
|
+
return await zodfetch(import_core3.GetRunsSchema, (0, import_core3.urlWithSearchParams)(`${__privateGet(this, _apiUrl)}/api/v1/jobs/${jobSlug}/runs`, options), {
|
|
1995
|
+
method: "GET",
|
|
1996
|
+
headers: {
|
|
1997
|
+
Authorization: `Bearer ${apiKey}`
|
|
1845
1998
|
}
|
|
1846
|
-
}
|
|
1847
|
-
|
|
1848
|
-
|
|
1849
|
-
|
|
1850
|
-
|
|
1851
|
-
|
|
1852
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1999
|
+
});
|
|
2000
|
+
}
|
|
2001
|
+
async invokeJob(jobId, payload, options = {}) {
|
|
2002
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
2003
|
+
__privateGet(this, _logger).debug("Invoking Job", {
|
|
2004
|
+
jobId
|
|
2005
|
+
});
|
|
2006
|
+
const body = {
|
|
2007
|
+
payload,
|
|
2008
|
+
context: options.context ?? {},
|
|
2009
|
+
options: {
|
|
2010
|
+
accountId: options.accountId,
|
|
2011
|
+
callbackUrl: options.callbackUrl
|
|
1856
2012
|
}
|
|
1857
|
-
|
|
1858
|
-
}
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1863
|
-
|
|
1864
|
-
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
}
|
|
2013
|
+
};
|
|
2014
|
+
return await zodfetch(import_core3.InvokeJobResponseSchema, `${__privateGet(this, _apiUrl)}/api/v1/jobs/${jobId}/invoke`, {
|
|
2015
|
+
method: "POST",
|
|
2016
|
+
headers: {
|
|
2017
|
+
"Content-Type": "application/json",
|
|
2018
|
+
Authorization: `Bearer ${apiKey}`,
|
|
2019
|
+
...options.idempotencyKey ? {
|
|
2020
|
+
"Idempotency-Key": options.idempotencyKey
|
|
2021
|
+
} : {}
|
|
2022
|
+
},
|
|
2023
|
+
body: JSON.stringify(body)
|
|
2024
|
+
});
|
|
1869
2025
|
}
|
|
1870
|
-
|
|
1871
|
-
|
|
1872
|
-
|
|
1873
|
-
|
|
2026
|
+
async createEphemeralEventDispatcher(payload) {
|
|
2027
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
2028
|
+
__privateGet(this, _logger).debug("Creating ephemeral event dispatcher", {
|
|
2029
|
+
payload
|
|
2030
|
+
});
|
|
2031
|
+
const response = await zodfetch(import_core3.EphemeralEventDispatcherResponseBodySchema, `${__privateGet(this, _apiUrl)}/api/v1/event-dispatchers/ephemeral`, {
|
|
2032
|
+
method: "POST",
|
|
2033
|
+
headers: {
|
|
2034
|
+
"Content-Type": "application/json",
|
|
2035
|
+
Authorization: `Bearer ${apiKey}`
|
|
2036
|
+
},
|
|
2037
|
+
body: JSON.stringify(payload)
|
|
2038
|
+
});
|
|
2039
|
+
return response;
|
|
2040
|
+
}
|
|
2041
|
+
get store() {
|
|
2042
|
+
return __privateGet(this, _storeClient);
|
|
2043
|
+
}
|
|
2044
|
+
};
|
|
2045
|
+
__name(ApiClient, "ApiClient");
|
|
2046
|
+
_apiUrl = new WeakMap();
|
|
2047
|
+
_options = new WeakMap();
|
|
2048
|
+
_logger = new WeakMap();
|
|
2049
|
+
_storeClient = new WeakMap();
|
|
2050
|
+
_queryKeyValueStore = new WeakSet();
|
|
2051
|
+
queryKeyValueStore_fn = /* @__PURE__ */ __name(async function(action, data) {
|
|
2052
|
+
const apiKey = await __privateMethod(this, _apiKey, apiKey_fn).call(this);
|
|
2053
|
+
__privateGet(this, _logger).debug("accessing key-value store", {
|
|
2054
|
+
action,
|
|
2055
|
+
data
|
|
2056
|
+
});
|
|
2057
|
+
const STORE_URL = `${__privateGet(this, _apiUrl)}/api/v1/store/${data.key}`;
|
|
2058
|
+
const authHeader = {
|
|
2059
|
+
Authorization: `Bearer ${apiKey}`
|
|
2060
|
+
};
|
|
2061
|
+
let requestInit;
|
|
2062
|
+
switch (action) {
|
|
2063
|
+
case "DELETE": {
|
|
2064
|
+
requestInit = {
|
|
2065
|
+
method: "DELETE",
|
|
2066
|
+
headers: authHeader
|
|
2067
|
+
};
|
|
2068
|
+
break;
|
|
1874
2069
|
}
|
|
1875
|
-
|
|
1876
|
-
|
|
2070
|
+
case "GET": {
|
|
2071
|
+
requestInit = {
|
|
2072
|
+
method: "GET",
|
|
2073
|
+
headers: authHeader
|
|
2074
|
+
};
|
|
2075
|
+
break;
|
|
1877
2076
|
}
|
|
1878
|
-
|
|
1879
|
-
|
|
1880
|
-
|
|
1881
|
-
|
|
1882
|
-
return
|
|
1883
|
-
|
|
1884
|
-
|
|
1885
|
-
|
|
2077
|
+
case "HAS": {
|
|
2078
|
+
const headResponse = await fetchHead(STORE_URL, {
|
|
2079
|
+
headers: authHeader
|
|
2080
|
+
});
|
|
2081
|
+
return {
|
|
2082
|
+
action: "HAS",
|
|
2083
|
+
key: data.key,
|
|
2084
|
+
has: !!headResponse.ok
|
|
2085
|
+
};
|
|
2086
|
+
}
|
|
2087
|
+
case "SET": {
|
|
2088
|
+
const MAX_BODY_BYTE_LENGTH = 256 * 1024;
|
|
2089
|
+
if ((data.value?.length ?? 0) > MAX_BODY_BYTE_LENGTH) {
|
|
2090
|
+
throw new Error(`Max request body size exceeded: ${MAX_BODY_BYTE_LENGTH} bytes`);
|
|
1886
2091
|
}
|
|
1887
|
-
|
|
2092
|
+
requestInit = {
|
|
2093
|
+
method: "PUT",
|
|
2094
|
+
headers: {
|
|
2095
|
+
...authHeader,
|
|
2096
|
+
"Content-Type": "text/plain"
|
|
2097
|
+
},
|
|
2098
|
+
body: data.value
|
|
2099
|
+
};
|
|
2100
|
+
break;
|
|
1888
2101
|
}
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
__name(IO, "IO");
|
|
1892
|
-
_addToCachedTasks = new WeakSet();
|
|
1893
|
-
addToCachedTasks_fn = /* @__PURE__ */ __name(function(task) {
|
|
1894
|
-
this._cachedTasks.set(task.idempotencyKey, task);
|
|
1895
|
-
}, "#addToCachedTasks");
|
|
1896
|
-
_detectAutoYield = new WeakSet();
|
|
1897
|
-
detectAutoYield_fn = /* @__PURE__ */ __name(function(location, threshold = 1500, task1, output) {
|
|
1898
|
-
const timeRemaining = __privateMethod(this, _getRemainingTimeInMillis, getRemainingTimeInMillis_fn).call(this);
|
|
1899
|
-
if (timeRemaining && timeRemaining < threshold) {
|
|
1900
|
-
if (task1) {
|
|
1901
|
-
throw new AutoYieldWithCompletedTaskExecutionError(task1.id, task1.outputProperties ?? [], {
|
|
1902
|
-
location,
|
|
1903
|
-
timeRemaining,
|
|
1904
|
-
timeElapsed: __privateMethod(this, _getTimeElapsed, getTimeElapsed_fn).call(this)
|
|
1905
|
-
}, output);
|
|
1906
|
-
} else {
|
|
1907
|
-
throw new AutoYieldExecutionError(location, timeRemaining, __privateMethod(this, _getTimeElapsed, getTimeElapsed_fn).call(this));
|
|
2102
|
+
default: {
|
|
2103
|
+
(0, import_core3.assertExhaustive)(action);
|
|
1908
2104
|
}
|
|
1909
2105
|
}
|
|
1910
|
-
|
|
1911
|
-
|
|
1912
|
-
|
|
1913
|
-
|
|
1914
|
-
|
|
1915
|
-
|
|
2106
|
+
const response = await zodfetch(import_core3.KeyValueStoreResponseBodySchema, STORE_URL, requestInit);
|
|
2107
|
+
return response;
|
|
2108
|
+
}, "#queryKeyValueStore");
|
|
2109
|
+
_apiKey = new WeakSet();
|
|
2110
|
+
apiKey_fn = /* @__PURE__ */ __name(async function() {
|
|
2111
|
+
const apiKey = getApiKey(__privateGet(this, _options).apiKey);
|
|
2112
|
+
if (apiKey.status === "invalid") {
|
|
2113
|
+
throw new Error("Invalid API key");
|
|
2114
|
+
} else if (apiKey.status === "missing") {
|
|
2115
|
+
throw new Error("Missing API key");
|
|
1916
2116
|
}
|
|
1917
|
-
|
|
1918
|
-
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
return this._executionTimeout - (performance.now() - this._timeOrigin);
|
|
2117
|
+
return apiKey.apiKey;
|
|
2118
|
+
}, "#apiKey");
|
|
2119
|
+
function getApiKey(key) {
|
|
2120
|
+
const apiKey = key ?? process.env.TRIGGER_API_KEY;
|
|
2121
|
+
if (!apiKey) {
|
|
2122
|
+
return {
|
|
2123
|
+
status: "missing"
|
|
2124
|
+
};
|
|
1926
2125
|
}
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
2126
|
+
const isValid = apiKey.match(/^tr_[a-z]+_[a-zA-Z0-9]+$/);
|
|
2127
|
+
if (!isValid) {
|
|
2128
|
+
return {
|
|
2129
|
+
status: "invalid",
|
|
2130
|
+
apiKey
|
|
2131
|
+
};
|
|
2132
|
+
}
|
|
2133
|
+
return {
|
|
2134
|
+
status: "valid",
|
|
2135
|
+
apiKey
|
|
2136
|
+
};
|
|
2137
|
+
}
|
|
2138
|
+
__name(getApiKey, "getApiKey");
|
|
2139
|
+
async function zodfetchWithVersions(versionedSchemaMap, unversionedSchema, url, requestInit, options, retryCount = 0) {
|
|
2140
|
+
const response = await fetch(url, {
|
|
2141
|
+
...requestInit,
|
|
2142
|
+
cache: "no-cache"
|
|
1935
2143
|
});
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
2144
|
+
if ((!requestInit || requestInit.method === "GET") && response.status === 404 && options?.optional) {
|
|
2145
|
+
return;
|
|
2146
|
+
}
|
|
2147
|
+
if (response.status >= 400 && response.status < 500) {
|
|
2148
|
+
const body = await response.json();
|
|
2149
|
+
throw new Error(body.error);
|
|
2150
|
+
}
|
|
2151
|
+
if (response.status >= 500 && retryCount < 6) {
|
|
2152
|
+
const delay = exponentialBackoff(retryCount + 1, 2, 50, 1150, 50);
|
|
2153
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
2154
|
+
return zodfetchWithVersions(versionedSchemaMap, unversionedSchema, url, requestInit, options, retryCount + 1);
|
|
2155
|
+
}
|
|
2156
|
+
if (response.status !== 200) {
|
|
2157
|
+
throw new Error(options?.errorMessage ?? `Failed to fetch ${url}, got status code ${response.status}`);
|
|
2158
|
+
}
|
|
2159
|
+
const jsonBody = await response.json();
|
|
2160
|
+
const version2 = response.headers.get("trigger-version");
|
|
2161
|
+
if (!version2) {
|
|
2162
|
+
return {
|
|
2163
|
+
version: "unversioned",
|
|
2164
|
+
body: unversionedSchema.parse(jsonBody)
|
|
2165
|
+
};
|
|
2166
|
+
}
|
|
2167
|
+
const versionedSchema = versionedSchemaMap[version2];
|
|
2168
|
+
if (!versionedSchema) {
|
|
2169
|
+
throw new Error(`Unknown version ${version2}`);
|
|
2170
|
+
}
|
|
2171
|
+
return {
|
|
2172
|
+
version: version2,
|
|
2173
|
+
body: versionedSchema.parse(jsonBody)
|
|
2174
|
+
};
|
|
1939
2175
|
}
|
|
1940
|
-
__name(
|
|
1941
|
-
function
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
1950
|
-
|
|
1951
|
-
|
|
1952
|
-
|
|
1953
|
-
|
|
1954
|
-
return sortedObj2;
|
|
2176
|
+
__name(zodfetchWithVersions, "zodfetchWithVersions");
|
|
2177
|
+
async function fetchHead(url, requestInitWithoutMethod, retryCount = 0) {
|
|
2178
|
+
const requestInit = {
|
|
2179
|
+
...requestInitWithoutMethod,
|
|
2180
|
+
method: "HEAD"
|
|
2181
|
+
};
|
|
2182
|
+
const response = await fetch(url, {
|
|
2183
|
+
...requestInit,
|
|
2184
|
+
cache: "no-cache"
|
|
2185
|
+
});
|
|
2186
|
+
if (response.status >= 500 && retryCount < 6) {
|
|
2187
|
+
const delay = exponentialBackoff(retryCount + 1, 2, 50, 1150, 50);
|
|
2188
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
2189
|
+
return fetchHead(url, requestInitWithoutMethod, retryCount + 1);
|
|
1955
2190
|
}
|
|
1956
|
-
|
|
1957
|
-
const sortedObj = sortKeys(obj);
|
|
1958
|
-
return JSON.stringify(sortedObj);
|
|
2191
|
+
return response;
|
|
1959
2192
|
}
|
|
1960
|
-
__name(
|
|
1961
|
-
|
|
1962
|
-
|
|
1963
|
-
|
|
2193
|
+
__name(fetchHead, "fetchHead");
|
|
2194
|
+
async function zodfetch(schema, url, requestInit, options, retryCount = 0) {
|
|
2195
|
+
const response = await fetch(url, {
|
|
2196
|
+
...requestInit,
|
|
2197
|
+
cache: "no-cache"
|
|
2198
|
+
});
|
|
2199
|
+
if ((!requestInit || requestInit.method === "GET") && response.status === 404 && options?.optional) {
|
|
2200
|
+
return;
|
|
1964
2201
|
}
|
|
1965
|
-
|
|
1966
|
-
|
|
2202
|
+
if (response.status >= 400 && response.status < 500) {
|
|
2203
|
+
const body = await response.json();
|
|
2204
|
+
throw new Error(body.error);
|
|
1967
2205
|
}
|
|
1968
|
-
|
|
1969
|
-
|
|
2206
|
+
if (response.status >= 500 && retryCount < 6) {
|
|
2207
|
+
const delay = exponentialBackoff(retryCount + 1, 2, 50, 1150, 50);
|
|
2208
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
2209
|
+
return zodfetch(schema, url, requestInit, options, retryCount + 1);
|
|
1970
2210
|
}
|
|
1971
|
-
|
|
1972
|
-
|
|
2211
|
+
if (response.status !== 200) {
|
|
2212
|
+
throw new Error(options?.errorMessage ?? `Failed to fetch ${url}, got status code ${response.status}`);
|
|
1973
2213
|
}
|
|
1974
|
-
|
|
1975
|
-
|
|
2214
|
+
const jsonBody = await response.json();
|
|
2215
|
+
return schema.parse(jsonBody);
|
|
2216
|
+
}
|
|
2217
|
+
__name(zodfetch, "zodfetch");
|
|
2218
|
+
function exponentialBackoff(retryCount, exponential, minDelay, maxDelay, jitter) {
|
|
2219
|
+
const delay = Math.min(Math.pow(exponential, retryCount) * minDelay, maxDelay);
|
|
2220
|
+
const jitterValue = Math.random() * jitter;
|
|
2221
|
+
return delay + jitterValue;
|
|
2222
|
+
}
|
|
2223
|
+
__name(exponentialBackoff, "exponentialBackoff");
|
|
2224
|
+
|
|
2225
|
+
// src/httpEndpoint.ts
|
|
2226
|
+
var import_core4 = require("@trigger.dev/core");
|
|
2227
|
+
|
|
2228
|
+
// src/utils/formatSchemaErrors.ts
|
|
2229
|
+
function formatSchemaErrors(errors) {
|
|
2230
|
+
return errors.map((error) => {
|
|
2231
|
+
const { path, message } = error;
|
|
2232
|
+
return {
|
|
2233
|
+
path: path.map(String),
|
|
2234
|
+
message
|
|
2235
|
+
};
|
|
2236
|
+
});
|
|
2237
|
+
}
|
|
2238
|
+
__name(formatSchemaErrors, "formatSchemaErrors");
|
|
2239
|
+
|
|
2240
|
+
// src/httpEndpoint.ts
|
|
2241
|
+
var HttpEndpoint = class {
|
|
2242
|
+
constructor(options) {
|
|
2243
|
+
this.options = options;
|
|
1976
2244
|
}
|
|
1977
|
-
|
|
1978
|
-
return this.
|
|
2245
|
+
get id() {
|
|
2246
|
+
return this.options.id;
|
|
2247
|
+
}
|
|
2248
|
+
onRequest(options) {
|
|
2249
|
+
return new HttpTrigger({
|
|
2250
|
+
endpointId: this.id,
|
|
2251
|
+
event: this.options.event,
|
|
2252
|
+
filter: options?.filter,
|
|
2253
|
+
verify: this.options.verify
|
|
2254
|
+
});
|
|
2255
|
+
}
|
|
2256
|
+
async handleRequest(request) {
|
|
2257
|
+
if (!this.options.respondWith)
|
|
2258
|
+
return;
|
|
2259
|
+
return this.options.respondWith.handler(request, () => {
|
|
2260
|
+
const clonedRequest = request.clone();
|
|
2261
|
+
return this.options.verify(clonedRequest);
|
|
2262
|
+
});
|
|
2263
|
+
}
|
|
2264
|
+
toJSON() {
|
|
2265
|
+
return {
|
|
2266
|
+
id: this.id,
|
|
2267
|
+
icon: this.options.event.icon,
|
|
2268
|
+
version: "1",
|
|
2269
|
+
enabled: this.options.enabled ?? true,
|
|
2270
|
+
event: this.options.event,
|
|
2271
|
+
immediateResponseFilter: this.options.respondWith?.filter,
|
|
2272
|
+
skipTriggeringRuns: this.options.respondWith?.skipTriggeringRuns,
|
|
2273
|
+
source: this.options.event.source
|
|
2274
|
+
};
|
|
1979
2275
|
}
|
|
1980
2276
|
};
|
|
1981
|
-
__name(
|
|
1982
|
-
|
|
1983
|
-
|
|
1984
|
-
|
|
1985
|
-
}
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
{
|
|
1997
|
-
|
|
1998
|
-
|
|
2277
|
+
__name(HttpEndpoint, "HttpEndpoint");
|
|
2278
|
+
var HttpTrigger = /* @__PURE__ */ __name(class HttpTrigger2 {
|
|
2279
|
+
constructor(options) {
|
|
2280
|
+
this.options = options;
|
|
2281
|
+
}
|
|
2282
|
+
toJSON() {
|
|
2283
|
+
return {
|
|
2284
|
+
type: "static",
|
|
2285
|
+
title: this.options.endpointId,
|
|
2286
|
+
properties: this.options.event.properties,
|
|
2287
|
+
rule: {
|
|
2288
|
+
event: `httpendpoint.${this.options.endpointId}`,
|
|
2289
|
+
payload: this.options.filter ?? {},
|
|
2290
|
+
source: this.options.event.source
|
|
2291
|
+
},
|
|
2292
|
+
link: `http-endpoints/${this.options.endpointId}`,
|
|
2293
|
+
help: {
|
|
2294
|
+
noRuns: {
|
|
2295
|
+
text: "To start triggering runs click here to setup your HTTP Endpoint with the external API service you want to receive webhooks from.",
|
|
2296
|
+
link: `http-endpoints/${this.options.endpointId}`
|
|
2297
|
+
}
|
|
1999
2298
|
}
|
|
2000
|
-
|
|
2001
|
-
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2299
|
+
};
|
|
2300
|
+
}
|
|
2301
|
+
get event() {
|
|
2302
|
+
return this.options.event;
|
|
2303
|
+
}
|
|
2304
|
+
attachToJob(triggerClient, job) {
|
|
2305
|
+
}
|
|
2306
|
+
get preprocessRuns() {
|
|
2307
|
+
return false;
|
|
2308
|
+
}
|
|
2309
|
+
async verifyPayload(payload) {
|
|
2310
|
+
const clonedRequest = payload.clone();
|
|
2311
|
+
return this.options.verify(clonedRequest);
|
|
2312
|
+
}
|
|
2313
|
+
}, "HttpTrigger");
|
|
2314
|
+
function httpEndpoint(options) {
|
|
2315
|
+
const id = slugifyId(options.id);
|
|
2316
|
+
return new HttpEndpoint({
|
|
2317
|
+
id,
|
|
2318
|
+
enabled: options.enabled,
|
|
2319
|
+
respondWith: options.respondWith,
|
|
2320
|
+
verify: options.verify,
|
|
2321
|
+
event: {
|
|
2322
|
+
name: id,
|
|
2323
|
+
title: options.title ?? "HTTP Trigger",
|
|
2324
|
+
source: options.source,
|
|
2325
|
+
icon: options.icon ?? "webhook",
|
|
2326
|
+
properties: options.properties,
|
|
2327
|
+
examples: options.examples ? options.examples : [
|
|
2328
|
+
{
|
|
2329
|
+
id: "basic-request",
|
|
2330
|
+
name: "Basic Request",
|
|
2331
|
+
icon: "http-post",
|
|
2332
|
+
payload: {
|
|
2333
|
+
url: "https://cloud.trigger.dev",
|
|
2334
|
+
method: "POST",
|
|
2335
|
+
headers: {
|
|
2336
|
+
"Content-Type": "application/json"
|
|
2337
|
+
},
|
|
2338
|
+
rawBody: JSON.stringify({
|
|
2339
|
+
foo: "bar"
|
|
2340
|
+
})
|
|
2341
|
+
}
|
|
2342
|
+
}
|
|
2343
|
+
],
|
|
2344
|
+
parsePayload: (rawPayload) => {
|
|
2345
|
+
const result = import_core4.RequestWithRawBodySchema.safeParse(rawPayload);
|
|
2346
|
+
if (!result.success) {
|
|
2347
|
+
throw new ParsedPayloadSchemaError(formatSchemaErrors(result.error.issues));
|
|
2348
|
+
}
|
|
2349
|
+
return new Request(new URL(result.data.url), {
|
|
2350
|
+
method: result.data.method,
|
|
2351
|
+
headers: result.data.headers,
|
|
2352
|
+
body: result.data.rawBody
|
|
2353
|
+
});
|
|
2005
2354
|
}
|
|
2006
|
-
|
|
2007
|
-
|
|
2355
|
+
}
|
|
2356
|
+
});
|
|
2008
2357
|
}
|
|
2009
|
-
__name(
|
|
2358
|
+
__name(httpEndpoint, "httpEndpoint");
|
|
2010
2359
|
|
|
2011
2360
|
// src/ioWithIntegrations.ts
|
|
2012
2361
|
function createIOWithIntegrations(io, auths, integrations) {
|
|
@@ -2158,6 +2507,12 @@ var EventTrigger = class {
|
|
|
2158
2507
|
return false;
|
|
2159
2508
|
}
|
|
2160
2509
|
async verifyPayload(payload) {
|
|
2510
|
+
if (__privateGet(this, _options3).verify) {
|
|
2511
|
+
if (payload instanceof Request) {
|
|
2512
|
+
const clonedRequest = payload.clone();
|
|
2513
|
+
return __privateGet(this, _options3).verify(clonedRequest);
|
|
2514
|
+
}
|
|
2515
|
+
}
|
|
2161
2516
|
return {
|
|
2162
2517
|
success: true
|
|
2163
2518
|
};
|
|
@@ -2397,10 +2752,20 @@ var DynamicSchedule = class {
|
|
|
2397
2752
|
};
|
|
2398
2753
|
__name(DynamicSchedule, "DynamicSchedule");
|
|
2399
2754
|
|
|
2755
|
+
// src/triggerClient.ts
|
|
2756
|
+
var import_node_events = __toESM(require("events"));
|
|
2757
|
+
|
|
2400
2758
|
// package.json
|
|
2401
|
-
var version = "2.2.
|
|
2759
|
+
var version = "2.2.8";
|
|
2402
2760
|
|
|
2403
2761
|
// src/triggerClient.ts
|
|
2762
|
+
var registerWebhookEvent = /* @__PURE__ */ __name((key) => ({
|
|
2763
|
+
name: `${import_core8.REGISTER_WEBHOOK}.${key}`,
|
|
2764
|
+
title: "Register Webhook",
|
|
2765
|
+
source: "internal",
|
|
2766
|
+
icon: "webhook",
|
|
2767
|
+
parsePayload: import_core8.RegisterWebhookPayloadSchema.parse
|
|
2768
|
+
}), "registerWebhookEvent");
|
|
2404
2769
|
var registerSourceEvent = {
|
|
2405
2770
|
name: import_core8.REGISTER_SOURCE_EVENT_V2,
|
|
2406
2771
|
title: "Register Source",
|
|
@@ -2408,7 +2773,7 @@ var registerSourceEvent = {
|
|
|
2408
2773
|
icon: "register-source",
|
|
2409
2774
|
parsePayload: import_core8.RegisterSourceEventSchemaV2.parse
|
|
2410
2775
|
};
|
|
2411
|
-
var _options4, _registeredJobs, _registeredSources, _registeredHttpSourceHandlers, _registeredDynamicTriggers, _jobMetadataByDynamicTriggers, _registeredSchedules, _registeredHttpEndpoints, _authResolvers, _client2, _internalLogger, _preprocessRun, preprocessRun_fn, _executeJob, executeJob_fn, _convertErrorToExecutionResponse, convertErrorToExecutionResponse_fn, _createRunContext, createRunContext_fn, _createPreprocessRunContext, createPreprocessRunContext_fn, _handleHttpSourceRequest, handleHttpSourceRequest_fn, _handleHttpEndpointRequestForResponse, handleHttpEndpointRequestForResponse_fn, _resolveConnections, resolveConnections_fn, _resolveConnection, resolveConnection_fn, _buildJobsIndex, buildJobsIndex_fn, _buildJobIndex, buildJobIndex_fn, _buildJobIntegrations, buildJobIntegrations_fn, _buildJobIntegration, buildJobIntegration_fn, _logIOStats, logIOStats_fn, _standardResponseHeaders, standardResponseHeaders_fn;
|
|
2776
|
+
var _options4, _registeredJobs, _registeredSources, _registeredWebhooks, _registeredHttpSourceHandlers, _registeredWebhookSourceHandlers, _registeredDynamicTriggers, _jobMetadataByDynamicTriggers, _registeredSchedules, _registeredHttpEndpoints, _authResolvers, _envStore, _eventEmitter, _client2, _internalLogger, _preprocessRun, preprocessRun_fn, _executeJob, executeJob_fn, _convertErrorToExecutionResponse, convertErrorToExecutionResponse_fn, _createRunContext, createRunContext_fn, _createPreprocessRunContext, createPreprocessRunContext_fn, _handleHttpSourceRequest, handleHttpSourceRequest_fn, _handleHttpEndpointRequestForResponse, handleHttpEndpointRequestForResponse_fn, _handleWebhookRequest, handleWebhookRequest_fn, _resolveConnections, resolveConnections_fn, _resolveConnection, resolveConnection_fn, _buildJobsIndex, buildJobsIndex_fn, _buildJobIndex, buildJobIndex_fn, _buildJobIntegrations, buildJobIntegrations_fn, _buildJobIntegration, buildJobIntegration_fn, _logIOStats, logIOStats_fn, _standardResponseHeaders, standardResponseHeaders_fn, _serializeRunMetadata, serializeRunMetadata_fn, _deliverSuccessfulRunNotification, deliverSuccessfulRunNotification_fn, _deliverFailedRunNotification, deliverFailedRunNotification_fn;
|
|
2412
2777
|
var TriggerClient = class {
|
|
2413
2778
|
constructor(options) {
|
|
2414
2779
|
__privateAdd(this, _preprocessRun);
|
|
@@ -2418,6 +2783,7 @@ var TriggerClient = class {
|
|
|
2418
2783
|
__privateAdd(this, _createPreprocessRunContext);
|
|
2419
2784
|
__privateAdd(this, _handleHttpSourceRequest);
|
|
2420
2785
|
__privateAdd(this, _handleHttpEndpointRequestForResponse);
|
|
2786
|
+
__privateAdd(this, _handleWebhookRequest);
|
|
2421
2787
|
__privateAdd(this, _resolveConnections);
|
|
2422
2788
|
__privateAdd(this, _resolveConnection);
|
|
2423
2789
|
__privateAdd(this, _buildJobsIndex);
|
|
@@ -2426,17 +2792,25 @@ var TriggerClient = class {
|
|
|
2426
2792
|
__privateAdd(this, _buildJobIntegration);
|
|
2427
2793
|
__privateAdd(this, _logIOStats);
|
|
2428
2794
|
__privateAdd(this, _standardResponseHeaders);
|
|
2795
|
+
__privateAdd(this, _serializeRunMetadata);
|
|
2796
|
+
__privateAdd(this, _deliverSuccessfulRunNotification);
|
|
2797
|
+
__privateAdd(this, _deliverFailedRunNotification);
|
|
2429
2798
|
__privateAdd(this, _options4, void 0);
|
|
2430
2799
|
__privateAdd(this, _registeredJobs, {});
|
|
2431
2800
|
__privateAdd(this, _registeredSources, {});
|
|
2801
|
+
__privateAdd(this, _registeredWebhooks, {});
|
|
2432
2802
|
__privateAdd(this, _registeredHttpSourceHandlers, {});
|
|
2803
|
+
__privateAdd(this, _registeredWebhookSourceHandlers, {});
|
|
2433
2804
|
__privateAdd(this, _registeredDynamicTriggers, {});
|
|
2434
2805
|
__privateAdd(this, _jobMetadataByDynamicTriggers, {});
|
|
2435
2806
|
__privateAdd(this, _registeredSchedules, {});
|
|
2436
2807
|
__privateAdd(this, _registeredHttpEndpoints, {});
|
|
2437
2808
|
__privateAdd(this, _authResolvers, {});
|
|
2809
|
+
__privateAdd(this, _envStore, void 0);
|
|
2810
|
+
__privateAdd(this, _eventEmitter, new import_node_events.default());
|
|
2438
2811
|
__privateAdd(this, _client2, void 0);
|
|
2439
2812
|
__privateAdd(this, _internalLogger, void 0);
|
|
2813
|
+
__publicField(this, "on", __privateGet(this, _eventEmitter).on.bind(__privateGet(this, _eventEmitter)));
|
|
2440
2814
|
this.id = options.id;
|
|
2441
2815
|
__privateSet(this, _options4, options);
|
|
2442
2816
|
__privateSet(this, _client2, new ApiClient(__privateGet(this, _options4)));
|
|
@@ -2444,6 +2818,7 @@ var TriggerClient = class {
|
|
|
2444
2818
|
"output",
|
|
2445
2819
|
"noopTasksSet"
|
|
2446
2820
|
]));
|
|
2821
|
+
__privateSet(this, _envStore, new KeyValueStore(__privateGet(this, _client2)));
|
|
2447
2822
|
}
|
|
2448
2823
|
async handleRequest(request, timeOrigin = performance.now()) {
|
|
2449
2824
|
__privateGet(this, _internalLogger).debug("handling request", {
|
|
@@ -2540,6 +2915,7 @@ var TriggerClient = class {
|
|
|
2540
2915
|
const body = {
|
|
2541
2916
|
jobs: __privateMethod(this, _buildJobsIndex, buildJobsIndex_fn).call(this),
|
|
2542
2917
|
sources: Object.values(__privateGet(this, _registeredSources)),
|
|
2918
|
+
webhooks: Object.values(__privateGet(this, _registeredWebhooks)),
|
|
2543
2919
|
dynamicTriggers: Object.values(__privateGet(this, _registeredDynamicTriggers)).map((trigger) => ({
|
|
2544
2920
|
id: trigger.id,
|
|
2545
2921
|
jobs: __privateGet(this, _jobMetadataByDynamicTriggers)[trigger.id] ?? [],
|
|
@@ -2613,10 +2989,12 @@ var TriggerClient = class {
|
|
|
2613
2989
|
version: job.version,
|
|
2614
2990
|
triggerVersion
|
|
2615
2991
|
});
|
|
2992
|
+
const standardHeaders = __privateMethod(this, _standardResponseHeaders, standardResponseHeaders_fn).call(this, timeOrigin);
|
|
2993
|
+
standardHeaders["x-trigger-run-metadata"] = __privateMethod(this, _serializeRunMetadata, serializeRunMetadata_fn).call(this, job);
|
|
2616
2994
|
return {
|
|
2617
2995
|
status: 200,
|
|
2618
2996
|
body: results,
|
|
2619
|
-
headers:
|
|
2997
|
+
headers: standardHeaders
|
|
2620
2998
|
};
|
|
2621
2999
|
}
|
|
2622
3000
|
case "PREPROCESS_RUN": {
|
|
@@ -2732,6 +3110,48 @@ var TriggerClient = class {
|
|
|
2732
3110
|
headers: __privateMethod(this, _standardResponseHeaders, standardResponseHeaders_fn).call(this, timeOrigin)
|
|
2733
3111
|
};
|
|
2734
3112
|
}
|
|
3113
|
+
case "DELIVER_WEBHOOK_REQUEST": {
|
|
3114
|
+
const headers = import_core8.WebhookSourceRequestHeadersSchema.safeParse(Object.fromEntries(request.headers.entries()));
|
|
3115
|
+
if (!headers.success) {
|
|
3116
|
+
return {
|
|
3117
|
+
status: 400,
|
|
3118
|
+
body: {
|
|
3119
|
+
message: "Invalid headers"
|
|
3120
|
+
}
|
|
3121
|
+
};
|
|
3122
|
+
}
|
|
3123
|
+
const sourceRequestNeedsBody = headers.data["x-ts-http-method"] !== "GET";
|
|
3124
|
+
const sourceRequestInit = {
|
|
3125
|
+
method: headers.data["x-ts-http-method"],
|
|
3126
|
+
headers: headers.data["x-ts-http-headers"],
|
|
3127
|
+
body: sourceRequestNeedsBody ? request.body : void 0
|
|
3128
|
+
};
|
|
3129
|
+
if (sourceRequestNeedsBody) {
|
|
3130
|
+
try {
|
|
3131
|
+
sourceRequestInit.duplex = "half";
|
|
3132
|
+
} catch (error2) {
|
|
3133
|
+
}
|
|
3134
|
+
}
|
|
3135
|
+
const webhookRequest = new Request(headers.data["x-ts-http-url"], sourceRequestInit);
|
|
3136
|
+
const key = headers.data["x-ts-key"];
|
|
3137
|
+
const secret = headers.data["x-ts-secret"];
|
|
3138
|
+
const params = headers.data["x-ts-params"];
|
|
3139
|
+
const ctx = {
|
|
3140
|
+
key,
|
|
3141
|
+
secret,
|
|
3142
|
+
params
|
|
3143
|
+
};
|
|
3144
|
+
const { response, verified, error } = await __privateMethod(this, _handleWebhookRequest, handleWebhookRequest_fn).call(this, webhookRequest, ctx);
|
|
3145
|
+
return {
|
|
3146
|
+
status: 200,
|
|
3147
|
+
body: {
|
|
3148
|
+
response,
|
|
3149
|
+
verified,
|
|
3150
|
+
error
|
|
3151
|
+
},
|
|
3152
|
+
headers: __privateMethod(this, _standardResponseHeaders, standardResponseHeaders_fn).call(this, timeOrigin)
|
|
3153
|
+
};
|
|
3154
|
+
}
|
|
2735
3155
|
case "VALIDATE": {
|
|
2736
3156
|
return {
|
|
2737
3157
|
status: 200,
|
|
@@ -2754,6 +3174,22 @@ var TriggerClient = class {
|
|
|
2754
3174
|
headers: __privateMethod(this, _standardResponseHeaders, standardResponseHeaders_fn).call(this, timeOrigin)
|
|
2755
3175
|
};
|
|
2756
3176
|
}
|
|
3177
|
+
case "RUN_NOTIFICATION": {
|
|
3178
|
+
const rawJson = await request.json();
|
|
3179
|
+
const runNotification = rawJson;
|
|
3180
|
+
if (runNotification.ok) {
|
|
3181
|
+
await __privateMethod(this, _deliverSuccessfulRunNotification, deliverSuccessfulRunNotification_fn).call(this, runNotification);
|
|
3182
|
+
} else {
|
|
3183
|
+
await __privateMethod(this, _deliverFailedRunNotification, deliverFailedRunNotification_fn).call(this, runNotification);
|
|
3184
|
+
}
|
|
3185
|
+
return {
|
|
3186
|
+
status: 200,
|
|
3187
|
+
body: {
|
|
3188
|
+
ok: true
|
|
3189
|
+
},
|
|
3190
|
+
headers: __privateMethod(this, _standardResponseHeaders, standardResponseHeaders_fn).call(this, timeOrigin)
|
|
3191
|
+
};
|
|
3192
|
+
}
|
|
2757
3193
|
}
|
|
2758
3194
|
return {
|
|
2759
3195
|
status: 405,
|
|
@@ -2780,9 +3216,9 @@ var TriggerClient = class {
|
|
|
2780
3216
|
defineDynamicTrigger(options) {
|
|
2781
3217
|
return new DynamicTrigger(this, options);
|
|
2782
3218
|
}
|
|
2783
|
-
defineHttpEndpoint(options) {
|
|
3219
|
+
defineHttpEndpoint(options, suppressWarnings = false) {
|
|
2784
3220
|
const existingHttpEndpoint = __privateGet(this, _registeredHttpEndpoints)[options.id];
|
|
2785
|
-
if (existingHttpEndpoint) {
|
|
3221
|
+
if (!suppressWarnings && existingHttpEndpoint) {
|
|
2786
3222
|
console.warn((0, import_colorette.yellow)(`[@trigger.dev/sdk] Warning: The HttpEndpoint "${existingHttpEndpoint.id}" you're attempting to define has already been defined. Please assign a different ID to the HttpEndpoint.`));
|
|
2787
3223
|
}
|
|
2788
3224
|
const endpoint = httpEndpoint(options);
|
|
@@ -2903,6 +3339,94 @@ var TriggerClient = class {
|
|
|
2903
3339
|
});
|
|
2904
3340
|
__privateGet(this, _registeredSchedules)[key] = jobs;
|
|
2905
3341
|
}
|
|
3342
|
+
attachWebhook(options) {
|
|
3343
|
+
const { source } = options;
|
|
3344
|
+
__privateGet(this, _registeredWebhookSourceHandlers)[options.key] = {
|
|
3345
|
+
verify: source.verify.bind(source),
|
|
3346
|
+
generateEvents: source.generateEvents.bind(source)
|
|
3347
|
+
};
|
|
3348
|
+
let registeredWebhook = __privateGet(this, _registeredWebhooks)[options.key];
|
|
3349
|
+
if (!registeredWebhook) {
|
|
3350
|
+
registeredWebhook = {
|
|
3351
|
+
key: options.key,
|
|
3352
|
+
params: options.params,
|
|
3353
|
+
config: options.config,
|
|
3354
|
+
integration: {
|
|
3355
|
+
id: source.integration.id,
|
|
3356
|
+
metadata: source.integration.metadata,
|
|
3357
|
+
authSource: source.integration.authSource
|
|
3358
|
+
},
|
|
3359
|
+
httpEndpoint: {
|
|
3360
|
+
id: options.key
|
|
3361
|
+
}
|
|
3362
|
+
};
|
|
3363
|
+
} else {
|
|
3364
|
+
registeredWebhook.config = deepMergeOptions(registeredWebhook.config, options.config);
|
|
3365
|
+
}
|
|
3366
|
+
__privateGet(this, _registeredWebhooks)[options.key] = registeredWebhook;
|
|
3367
|
+
new Job(this, {
|
|
3368
|
+
id: `webhook.register.${options.key}`,
|
|
3369
|
+
name: `webhook.register.${options.key}`,
|
|
3370
|
+
version: source.version,
|
|
3371
|
+
trigger: new EventTrigger({
|
|
3372
|
+
event: registerWebhookEvent(options.key)
|
|
3373
|
+
}),
|
|
3374
|
+
integrations: {
|
|
3375
|
+
integration: source.integration
|
|
3376
|
+
},
|
|
3377
|
+
run: async (registerPayload, io, ctx) => {
|
|
3378
|
+
return await io.try(async () => {
|
|
3379
|
+
__privateGet(this, _internalLogger).debug("[webhook.register] Start");
|
|
3380
|
+
const crudOptions = {
|
|
3381
|
+
io,
|
|
3382
|
+
ctx: registerPayload
|
|
3383
|
+
};
|
|
3384
|
+
if (!registerPayload.active) {
|
|
3385
|
+
__privateGet(this, _internalLogger).debug("[webhook.register] Not active, run create");
|
|
3386
|
+
await io.try(async () => {
|
|
3387
|
+
await source.crud.create(crudOptions);
|
|
3388
|
+
}, async (error) => {
|
|
3389
|
+
__privateGet(this, _internalLogger).debug("[webhook.register] Error during create, re-trying with delete first", {
|
|
3390
|
+
error
|
|
3391
|
+
});
|
|
3392
|
+
await io.runTask("create-retry", async () => {
|
|
3393
|
+
await source.crud.delete(crudOptions);
|
|
3394
|
+
await source.crud.create(crudOptions);
|
|
3395
|
+
});
|
|
3396
|
+
});
|
|
3397
|
+
return await io.updateWebhook("update-webhook-success", {
|
|
3398
|
+
key: options.key,
|
|
3399
|
+
active: true,
|
|
3400
|
+
config: registerPayload.config.desired
|
|
3401
|
+
});
|
|
3402
|
+
}
|
|
3403
|
+
__privateGet(this, _internalLogger).debug("[webhook.register] Already active, run update");
|
|
3404
|
+
if (source.crud.update) {
|
|
3405
|
+
await source.crud.update(crudOptions);
|
|
3406
|
+
} else {
|
|
3407
|
+
__privateGet(this, _internalLogger).debug("[webhook.register] Run delete and create instead of update");
|
|
3408
|
+
await source.crud.delete(crudOptions);
|
|
3409
|
+
await source.crud.create(crudOptions);
|
|
3410
|
+
}
|
|
3411
|
+
return await io.updateWebhook("update-webhook-success", {
|
|
3412
|
+
key: options.key,
|
|
3413
|
+
active: true,
|
|
3414
|
+
config: registerPayload.config.desired
|
|
3415
|
+
});
|
|
3416
|
+
}, async (error) => {
|
|
3417
|
+
__privateGet(this, _internalLogger).debug("[webhook.register] Error", {
|
|
3418
|
+
error
|
|
3419
|
+
});
|
|
3420
|
+
await io.updateWebhook("update-webhook-error", {
|
|
3421
|
+
key: options.key,
|
|
3422
|
+
active: false
|
|
3423
|
+
});
|
|
3424
|
+
throw error;
|
|
3425
|
+
});
|
|
3426
|
+
},
|
|
3427
|
+
__internal: true
|
|
3428
|
+
});
|
|
3429
|
+
}
|
|
2906
3430
|
async registerTrigger(id, key, options, idempotencyKey) {
|
|
2907
3431
|
return __privateGet(this, _client2).registerTrigger(this.id, id, key, options, idempotencyKey);
|
|
2908
3432
|
}
|
|
@@ -2951,6 +3475,11 @@ var TriggerClient = class {
|
|
|
2951
3475
|
async createEphemeralEventDispatcher(payload) {
|
|
2952
3476
|
return __privateGet(this, _client2).createEphemeralEventDispatcher(payload);
|
|
2953
3477
|
}
|
|
3478
|
+
get store() {
|
|
3479
|
+
return {
|
|
3480
|
+
env: __privateGet(this, _envStore)
|
|
3481
|
+
};
|
|
3482
|
+
}
|
|
2954
3483
|
authorized(apiKey) {
|
|
2955
3484
|
if (typeof apiKey !== "string") {
|
|
2956
3485
|
return "missing-header";
|
|
@@ -2969,12 +3498,16 @@ __name(TriggerClient, "TriggerClient");
|
|
|
2969
3498
|
_options4 = new WeakMap();
|
|
2970
3499
|
_registeredJobs = new WeakMap();
|
|
2971
3500
|
_registeredSources = new WeakMap();
|
|
3501
|
+
_registeredWebhooks = new WeakMap();
|
|
2972
3502
|
_registeredHttpSourceHandlers = new WeakMap();
|
|
3503
|
+
_registeredWebhookSourceHandlers = new WeakMap();
|
|
2973
3504
|
_registeredDynamicTriggers = new WeakMap();
|
|
2974
3505
|
_jobMetadataByDynamicTriggers = new WeakMap();
|
|
2975
3506
|
_registeredSchedules = new WeakMap();
|
|
2976
3507
|
_registeredHttpEndpoints = new WeakMap();
|
|
2977
3508
|
_authResolvers = new WeakMap();
|
|
3509
|
+
_envStore = new WeakMap();
|
|
3510
|
+
_eventEmitter = new WeakMap();
|
|
2978
3511
|
_client2 = new WeakMap();
|
|
2979
3512
|
_internalLogger = new WeakMap();
|
|
2980
3513
|
_preprocessRun = new WeakSet();
|
|
@@ -2998,6 +3531,7 @@ executeJob_fn = /* @__PURE__ */ __name(async function(body1, job1, timeOrigin, t
|
|
|
2998
3531
|
const context = __privateMethod(this, _createRunContext, createRunContext_fn).call(this, body1);
|
|
2999
3532
|
const io = new IO({
|
|
3000
3533
|
id: body1.run.id,
|
|
3534
|
+
jobId: job1.id,
|
|
3001
3535
|
cachedTasks: body1.tasks,
|
|
3002
3536
|
cachedTasksCursor: body1.cachedTaskCursor,
|
|
3003
3537
|
yieldedExecutions: body1.yieldedExecutions ?? [],
|
|
@@ -3342,8 +3876,44 @@ handleHttpEndpointRequestForResponse_fn = /* @__PURE__ */ __name(async function(
|
|
|
3342
3876
|
response
|
|
3343
3877
|
};
|
|
3344
3878
|
}, "#handleHttpEndpointRequestForResponse");
|
|
3879
|
+
_handleWebhookRequest = new WeakSet();
|
|
3880
|
+
handleWebhookRequest_fn = /* @__PURE__ */ __name(async function(request, ctx) {
|
|
3881
|
+
__privateGet(this, _internalLogger).debug("Handling webhook request", {
|
|
3882
|
+
ctx
|
|
3883
|
+
});
|
|
3884
|
+
const okResponse = {
|
|
3885
|
+
status: 200,
|
|
3886
|
+
body: {
|
|
3887
|
+
ok: true
|
|
3888
|
+
}
|
|
3889
|
+
};
|
|
3890
|
+
const handlers = __privateGet(this, _registeredWebhookSourceHandlers)[ctx.key];
|
|
3891
|
+
if (!handlers) {
|
|
3892
|
+
__privateGet(this, _internalLogger).debug("No handler registered for webhook", {
|
|
3893
|
+
ctx
|
|
3894
|
+
});
|
|
3895
|
+
return {
|
|
3896
|
+
response: okResponse,
|
|
3897
|
+
verified: false
|
|
3898
|
+
};
|
|
3899
|
+
}
|
|
3900
|
+
const { verify, generateEvents } = handlers;
|
|
3901
|
+
const verifyResult = await verify(request, this, ctx);
|
|
3902
|
+
if (!verifyResult.success) {
|
|
3903
|
+
return {
|
|
3904
|
+
response: okResponse,
|
|
3905
|
+
verified: false,
|
|
3906
|
+
error: verifyResult.reason
|
|
3907
|
+
};
|
|
3908
|
+
}
|
|
3909
|
+
await generateEvents(request, this, ctx);
|
|
3910
|
+
return {
|
|
3911
|
+
response: okResponse,
|
|
3912
|
+
verified: true
|
|
3913
|
+
};
|
|
3914
|
+
}, "#handleWebhookRequest");
|
|
3345
3915
|
_resolveConnections = new WeakSet();
|
|
3346
|
-
resolveConnections_fn = /* @__PURE__ */ __name(async function(
|
|
3916
|
+
resolveConnections_fn = /* @__PURE__ */ __name(async function(ctx1, integrations, connections) {
|
|
3347
3917
|
if (!integrations) {
|
|
3348
3918
|
return {
|
|
3349
3919
|
ok: true,
|
|
@@ -3353,7 +3923,7 @@ resolveConnections_fn = /* @__PURE__ */ __name(async function(ctx, integrations,
|
|
|
3353
3923
|
const resolvedAuthResults = await Promise.all(Object.keys(integrations).map(async (key) => {
|
|
3354
3924
|
const integration = integrations[key];
|
|
3355
3925
|
const auth = (connections ?? {})[key];
|
|
3356
|
-
const result = await __privateMethod(this, _resolveConnection, resolveConnection_fn).call(this,
|
|
3926
|
+
const result = await __privateMethod(this, _resolveConnection, resolveConnection_fn).call(this, ctx1, integration, auth);
|
|
3357
3927
|
if (result.ok) {
|
|
3358
3928
|
return {
|
|
3359
3929
|
ok: true,
|
|
@@ -3395,7 +3965,7 @@ resolveConnections_fn = /* @__PURE__ */ __name(async function(ctx, integrations,
|
|
|
3395
3965
|
}
|
|
3396
3966
|
}, "#resolveConnections");
|
|
3397
3967
|
_resolveConnection = new WeakSet();
|
|
3398
|
-
resolveConnection_fn = /* @__PURE__ */ __name(async function(
|
|
3968
|
+
resolveConnection_fn = /* @__PURE__ */ __name(async function(ctx2, integration, auth) {
|
|
3399
3969
|
if (auth) {
|
|
3400
3970
|
return {
|
|
3401
3971
|
ok: true,
|
|
@@ -3416,7 +3986,7 @@ resolveConnection_fn = /* @__PURE__ */ __name(async function(ctx1, integration,
|
|
|
3416
3986
|
};
|
|
3417
3987
|
}
|
|
3418
3988
|
try {
|
|
3419
|
-
const resolvedAuth = await authResolver(
|
|
3989
|
+
const resolvedAuth = await authResolver(ctx2, integration);
|
|
3420
3990
|
if (!resolvedAuth) {
|
|
3421
3991
|
return {
|
|
3422
3992
|
ok: false,
|
|
@@ -3504,6 +4074,45 @@ standardResponseHeaders_fn = /* @__PURE__ */ __name(function(start) {
|
|
|
3504
4074
|
"X-Trigger-Request-Timing": `dur=${performance.now() - start / 1e3}`
|
|
3505
4075
|
};
|
|
3506
4076
|
}, "#standardResponseHeaders");
|
|
4077
|
+
_serializeRunMetadata = new WeakSet();
|
|
4078
|
+
serializeRunMetadata_fn = /* @__PURE__ */ __name(function(job4) {
|
|
4079
|
+
const metadata = {};
|
|
4080
|
+
if (__privateGet(this, _eventEmitter).listenerCount("runSucceeeded") > 0 || typeof job4.options.onSuccess === "function") {
|
|
4081
|
+
metadata["successSubscription"] = true;
|
|
4082
|
+
}
|
|
4083
|
+
if (__privateGet(this, _eventEmitter).listenerCount("runFailed") > 0 || typeof job4.options.onFailure === "function") {
|
|
4084
|
+
metadata["failedSubscription"] = true;
|
|
4085
|
+
}
|
|
4086
|
+
return JSON.stringify(metadata);
|
|
4087
|
+
}, "#serializeRunMetadata");
|
|
4088
|
+
_deliverSuccessfulRunNotification = new WeakSet();
|
|
4089
|
+
deliverSuccessfulRunNotification_fn = /* @__PURE__ */ __name(async function(notification) {
|
|
4090
|
+
__privateGet(this, _internalLogger).debug("delivering successful run notification", {
|
|
4091
|
+
notification
|
|
4092
|
+
});
|
|
4093
|
+
__privateGet(this, _eventEmitter).emit("runSucceeeded", notification);
|
|
4094
|
+
const job = __privateGet(this, _registeredJobs)[notification.job.id];
|
|
4095
|
+
if (!job) {
|
|
4096
|
+
return;
|
|
4097
|
+
}
|
|
4098
|
+
if (typeof job.options.onSuccess === "function") {
|
|
4099
|
+
await job.options.onSuccess(notification);
|
|
4100
|
+
}
|
|
4101
|
+
}, "#deliverSuccessfulRunNotification");
|
|
4102
|
+
_deliverFailedRunNotification = new WeakSet();
|
|
4103
|
+
deliverFailedRunNotification_fn = /* @__PURE__ */ __name(async function(notification1) {
|
|
4104
|
+
__privateGet(this, _internalLogger).debug("delivering failed run notification", {
|
|
4105
|
+
notification: notification1
|
|
4106
|
+
});
|
|
4107
|
+
__privateGet(this, _eventEmitter).emit("runFailed", notification1);
|
|
4108
|
+
const job = __privateGet(this, _registeredJobs)[notification1.job.id];
|
|
4109
|
+
if (!job) {
|
|
4110
|
+
return;
|
|
4111
|
+
}
|
|
4112
|
+
if (typeof job.options.onFailure === "function") {
|
|
4113
|
+
await job.options.onFailure(notification1);
|
|
4114
|
+
}
|
|
4115
|
+
}, "#deliverFailedRunNotification");
|
|
3507
4116
|
function dynamicTriggerRegisterSourceJobId(id) {
|
|
3508
4117
|
return `register-dynamic-trigger-${id}`;
|
|
3509
4118
|
}
|
|
@@ -3808,9 +4417,152 @@ function invokeTrigger(options) {
|
|
|
3808
4417
|
}
|
|
3809
4418
|
__name(invokeTrigger, "invokeTrigger");
|
|
3810
4419
|
|
|
4420
|
+
// src/triggers/webhook.ts
|
|
4421
|
+
var import_core11 = require("@trigger.dev/core");
|
|
4422
|
+
var import_node_crypto2 = require("crypto");
|
|
4423
|
+
var _shortHash, shortHash_fn;
|
|
4424
|
+
var WebhookSource = class {
|
|
4425
|
+
constructor(options) {
|
|
4426
|
+
__privateAdd(this, _shortHash);
|
|
4427
|
+
this.options = options;
|
|
4428
|
+
}
|
|
4429
|
+
async generateEvents(request, client, ctx) {
|
|
4430
|
+
return this.options.generateEvents({
|
|
4431
|
+
request,
|
|
4432
|
+
client,
|
|
4433
|
+
ctx
|
|
4434
|
+
});
|
|
4435
|
+
}
|
|
4436
|
+
filter(params, config) {
|
|
4437
|
+
return this.options.filter?.(params, config) ?? {};
|
|
4438
|
+
}
|
|
4439
|
+
properties(params) {
|
|
4440
|
+
return this.options.properties?.(params) ?? [];
|
|
4441
|
+
}
|
|
4442
|
+
get crud() {
|
|
4443
|
+
return this.options.crud;
|
|
4444
|
+
}
|
|
4445
|
+
async register(params, registerEvent, io, ctx) {
|
|
4446
|
+
if (!this.options.register) {
|
|
4447
|
+
return;
|
|
4448
|
+
}
|
|
4449
|
+
const updates = await this.options.register({
|
|
4450
|
+
...registerEvent,
|
|
4451
|
+
params
|
|
4452
|
+
}, io, ctx);
|
|
4453
|
+
return updates;
|
|
4454
|
+
}
|
|
4455
|
+
async verify(request, client, ctx) {
|
|
4456
|
+
if (this.options.verify) {
|
|
4457
|
+
const clonedRequest = request.clone();
|
|
4458
|
+
return this.options.verify({
|
|
4459
|
+
request: clonedRequest,
|
|
4460
|
+
client,
|
|
4461
|
+
ctx
|
|
4462
|
+
});
|
|
4463
|
+
}
|
|
4464
|
+
return {
|
|
4465
|
+
success: true
|
|
4466
|
+
};
|
|
4467
|
+
}
|
|
4468
|
+
key(params) {
|
|
4469
|
+
const parts = [
|
|
4470
|
+
"webhook"
|
|
4471
|
+
];
|
|
4472
|
+
parts.push(this.options.key(params));
|
|
4473
|
+
parts.push(this.integration.id);
|
|
4474
|
+
return `${this.options.id}-${__privateMethod(this, _shortHash, shortHash_fn).call(this, parts.join(""))}`;
|
|
4475
|
+
}
|
|
4476
|
+
get integration() {
|
|
4477
|
+
return this.options.integration;
|
|
4478
|
+
}
|
|
4479
|
+
get integrationConfig() {
|
|
4480
|
+
return {
|
|
4481
|
+
id: this.integration.id,
|
|
4482
|
+
metadata: this.integration.metadata
|
|
4483
|
+
};
|
|
4484
|
+
}
|
|
4485
|
+
get id() {
|
|
4486
|
+
return this.options.id;
|
|
4487
|
+
}
|
|
4488
|
+
get version() {
|
|
4489
|
+
return this.options.version;
|
|
4490
|
+
}
|
|
4491
|
+
};
|
|
4492
|
+
__name(WebhookSource, "WebhookSource");
|
|
4493
|
+
_shortHash = new WeakSet();
|
|
4494
|
+
shortHash_fn = /* @__PURE__ */ __name(function(str) {
|
|
4495
|
+
const hash = (0, import_node_crypto2.createHash)("sha1").update(str).digest("hex");
|
|
4496
|
+
return hash.slice(0, 7);
|
|
4497
|
+
}, "#shortHash");
|
|
4498
|
+
var WebhookTrigger = class {
|
|
4499
|
+
constructor(options) {
|
|
4500
|
+
this.options = options;
|
|
4501
|
+
}
|
|
4502
|
+
get event() {
|
|
4503
|
+
return this.options.event;
|
|
4504
|
+
}
|
|
4505
|
+
get source() {
|
|
4506
|
+
return this.options.source;
|
|
4507
|
+
}
|
|
4508
|
+
get key() {
|
|
4509
|
+
return slugifyId(this.options.source.key(this.options.params));
|
|
4510
|
+
}
|
|
4511
|
+
toJSON() {
|
|
4512
|
+
return {
|
|
4513
|
+
type: "static",
|
|
4514
|
+
title: "Webhook",
|
|
4515
|
+
rule: {
|
|
4516
|
+
event: this.event.name,
|
|
4517
|
+
payload: (0, import_core11.deepMergeFilters)(this.options.source.filter(this.options.params, this.options.config), this.event.filter ?? {}),
|
|
4518
|
+
source: this.event.source
|
|
4519
|
+
},
|
|
4520
|
+
properties: this.options.source.properties(this.options.params),
|
|
4521
|
+
link: `http-endpoints/${this.key}`
|
|
4522
|
+
};
|
|
4523
|
+
}
|
|
4524
|
+
filter(eventFilter) {
|
|
4525
|
+
const { event, ...optionsWithoutEvent } = this.options;
|
|
4526
|
+
const { filter, ...eventWithoutFilter } = event;
|
|
4527
|
+
return new WebhookTrigger({
|
|
4528
|
+
...optionsWithoutEvent,
|
|
4529
|
+
event: {
|
|
4530
|
+
...eventWithoutFilter,
|
|
4531
|
+
filter: (0, import_core11.deepMergeFilters)(filter ?? {}, eventFilter)
|
|
4532
|
+
}
|
|
4533
|
+
});
|
|
4534
|
+
}
|
|
4535
|
+
attachToJob(triggerClient, job) {
|
|
4536
|
+
triggerClient.defineHttpEndpoint({
|
|
4537
|
+
id: this.key,
|
|
4538
|
+
source: "trigger.dev",
|
|
4539
|
+
icon: this.event.icon,
|
|
4540
|
+
verify: async () => ({
|
|
4541
|
+
success: true
|
|
4542
|
+
})
|
|
4543
|
+
}, true);
|
|
4544
|
+
triggerClient.attachWebhook({
|
|
4545
|
+
key: this.key,
|
|
4546
|
+
source: this.options.source,
|
|
4547
|
+
event: this.options.event,
|
|
4548
|
+
params: this.options.params,
|
|
4549
|
+
config: this.options.config
|
|
4550
|
+
});
|
|
4551
|
+
}
|
|
4552
|
+
get preprocessRuns() {
|
|
4553
|
+
return true;
|
|
4554
|
+
}
|
|
4555
|
+
async verifyPayload(payload) {
|
|
4556
|
+
return {
|
|
4557
|
+
success: true
|
|
4558
|
+
};
|
|
4559
|
+
}
|
|
4560
|
+
};
|
|
4561
|
+
__name(WebhookTrigger, "WebhookTrigger");
|
|
4562
|
+
|
|
3811
4563
|
// src/security.ts
|
|
3812
4564
|
var import_crypto = __toESM(require("crypto"));
|
|
3813
|
-
async function verifyRequestSignature({ request, headerName, secret, algorithm }) {
|
|
4565
|
+
async function verifyRequestSignature({ request, headerName, headerEncoding = "hex", secret, algorithm }) {
|
|
3814
4566
|
if (!secret) {
|
|
3815
4567
|
return {
|
|
3816
4568
|
success: false,
|
|
@@ -3826,7 +4578,7 @@ async function verifyRequestSignature({ request, headerName, secret, algorithm }
|
|
|
3826
4578
|
}
|
|
3827
4579
|
switch (algorithm) {
|
|
3828
4580
|
case "sha256":
|
|
3829
|
-
const success = verifyHmacSha256(headerValue, secret, await request.text());
|
|
4581
|
+
const success = verifyHmacSha256(headerValue, headerEncoding, secret, await request.text());
|
|
3830
4582
|
if (success) {
|
|
3831
4583
|
return {
|
|
3832
4584
|
success
|
|
@@ -3842,9 +4594,9 @@ async function verifyRequestSignature({ request, headerName, secret, algorithm }
|
|
|
3842
4594
|
}
|
|
3843
4595
|
}
|
|
3844
4596
|
__name(verifyRequestSignature, "verifyRequestSignature");
|
|
3845
|
-
function verifyHmacSha256(headerValue, secret, body) {
|
|
3846
|
-
const bodyDigest = import_crypto.default.createHmac("sha256", secret).update(body).digest(
|
|
3847
|
-
const signature = headerValue?.replace("sha256=", "") ?? "";
|
|
4597
|
+
function verifyHmacSha256(headerValue, headerEncoding, secret, body) {
|
|
4598
|
+
const bodyDigest = import_crypto.default.createHmac("sha256", secret).update(body).digest(headerEncoding);
|
|
4599
|
+
const signature = headerValue?.replace("hmac-sha256=", "").replace("sha256=", "") ?? "";
|
|
3848
4600
|
return signature === bodyDigest;
|
|
3849
4601
|
}
|
|
3850
4602
|
__name(verifyHmacSha256, "verifyHmacSha256");
|
|
@@ -3876,6 +4628,8 @@ __name(redactString, "redactString");
|
|
|
3876
4628
|
MissingConnectionNotification,
|
|
3877
4629
|
MissingConnectionResolvedNotification,
|
|
3878
4630
|
TriggerClient,
|
|
4631
|
+
WebhookSource,
|
|
4632
|
+
WebhookTrigger,
|
|
3879
4633
|
cronTrigger,
|
|
3880
4634
|
eventTrigger,
|
|
3881
4635
|
intervalTrigger,
|
|
@@ -3886,6 +4640,7 @@ __name(redactString, "redactString");
|
|
|
3886
4640
|
omit,
|
|
3887
4641
|
redactString,
|
|
3888
4642
|
retry,
|
|
4643
|
+
slugifyId,
|
|
3889
4644
|
verifyHmacSha256,
|
|
3890
4645
|
verifyRequestSignature,
|
|
3891
4646
|
waitForEventSchema
|