@rytass/bpm-core-nestjs-module 0.13.3 → 0.13.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/package.json +13 -6
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/index.js.map +1 -1
- package/src/lib/attachment/attachment-storage.provider.d.ts +11 -0
- package/src/lib/attachment/attachment-storage.provider.js +15 -1
- package/src/lib/attachment/attachment-storage.provider.js.map +1 -1
- package/src/lib/bpm/bpm-root-options.d.ts +134 -0
- package/src/lib/bpm/bpm-root-options.js +61 -0
- package/src/lib/bpm/bpm-root-options.js.map +1 -0
- package/src/lib/bpm/bpm-root.module.d.ts +101 -137
- package/src/lib/bpm/bpm-root.module.js +83 -118
- package/src/lib/bpm/bpm-root.module.js.map +1 -1
- package/src/lib/bpm/index.d.ts +1 -0
- package/src/lib/bpm/index.js +1 -0
- package/src/lib/bpm/index.js.map +1 -1
- package/src/lib/calendar/business-calendar.provider.d.ts +8 -4
- package/src/lib/calendar/business-calendar.provider.js +15 -6
- package/src/lib/calendar/business-calendar.provider.js.map +1 -1
- package/src/lib/common/outbox.d.ts +26 -0
- package/src/lib/common/outbox.js +64 -0
- package/src/lib/common/outbox.js.map +1 -0
- package/src/lib/delegation/delegation.service.js +7 -7
- package/src/lib/delegation/delegation.service.js.map +1 -1
- package/src/lib/form-data-source/form-data-source.module.js +2 -4
- package/src/lib/form-data-source/form-data-source.module.js.map +1 -1
- package/src/lib/form-data-source/form-data-source.provider.d.ts +14 -0
- package/src/lib/form-data-source/form-data-source.provider.js +23 -0
- package/src/lib/form-data-source/form-data-source.provider.js.map +1 -0
- package/src/lib/form-data-source/index.d.ts +1 -0
- package/src/lib/form-data-source/index.js +1 -0
- package/src/lib/form-data-source/index.js.map +1 -1
- package/src/lib/identity/default-member-resolver.d.ts +39 -0
- package/src/lib/identity/default-member-resolver.js +81 -0
- package/src/lib/identity/default-member-resolver.js.map +1 -0
- package/src/lib/identity/identity.module.d.ts +12 -2
- package/src/lib/identity/identity.module.js +2 -1
- package/src/lib/identity/identity.module.js.map +1 -1
- package/src/lib/identity/index.d.ts +1 -0
- package/src/lib/identity/index.js +1 -0
- package/src/lib/identity/index.js.map +1 -1
- package/src/lib/migrations/0000000023000-workflow-webhook-deliveries.d.ts +17 -0
- package/src/lib/migrations/0000000023000-workflow-webhook-deliveries.js +61 -0
- package/src/lib/migrations/0000000023000-workflow-webhook-deliveries.js.map +1 -0
- package/src/lib/migrations/0000000024000-workflow-webhook-endpoints.d.ts +16 -0
- package/src/lib/migrations/0000000024000-workflow-webhook-endpoints.js +71 -0
- package/src/lib/migrations/0000000024000-workflow-webhook-endpoints.js.map +1 -0
- package/src/lib/migrations/index.d.ts +2 -0
- package/src/lib/migrations/index.js +6 -0
- package/src/lib/migrations/index.js.map +1 -1
- package/src/lib/notification/notification-delivery.service.js +4 -57
- package/src/lib/notification/notification-delivery.service.js.map +1 -1
- package/src/lib/notification/notification.service.js +4 -3
- package/src/lib/notification/notification.service.js.map +1 -1
- package/src/lib/template/template.service.d.ts +9 -0
- package/src/lib/template/template.service.js +31 -0
- package/src/lib/template/template.service.js.map +1 -1
- package/src/lib/template/workflow-definition.validator.js +54 -1
- package/src/lib/template/workflow-definition.validator.js.map +1 -1
- package/src/lib/workflow-engine/workflow-engine.enums.d.ts +3 -1
- package/src/lib/workflow-engine/workflow-engine.enums.js +2 -0
- package/src/lib/workflow-engine/workflow-engine.enums.js.map +1 -1
- package/src/lib/workflow-engine/workflow-engine.module.js +3 -0
- package/src/lib/workflow-engine/workflow-engine.module.js.map +1 -1
- package/src/lib/workflow-engine/workflow-engine.service.d.ts +5 -2
- package/src/lib/workflow-engine/workflow-engine.service.js +142 -26
- package/src/lib/workflow-engine/workflow-engine.service.js.map +1 -1
- package/src/lib/workflow-webhook/index.d.ts +24 -0
- package/src/lib/workflow-webhook/index.js +28 -0
- package/src/lib/workflow-webhook/index.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-allowlist.d.ts +38 -0
- package/src/lib/workflow-webhook/workflow-webhook-allowlist.js +296 -0
- package/src/lib/workflow-webhook/workflow-webhook-allowlist.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-database-source.d.ts +33 -0
- package/src/lib/workflow-webhook/workflow-webhook-database-source.js +129 -0
- package/src/lib/workflow-webhook/workflow-webhook-database-source.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery-scheduler.service.d.ts +25 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery-scheduler.service.js +92 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery-scheduler.service.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.entity.d.ts +53 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.entity.js +97 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.entity.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.enums.d.ts +28 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.enums.js +36 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.enums.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.object.d.ts +28 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.object.js +88 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.object.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.resolver.d.ts +9 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.resolver.js +66 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.resolver.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.service.d.ts +116 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.service.js +705 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.service.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.subscriber.d.ts +23 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.subscriber.js +85 -0
- package/src/lib/workflow-webhook/workflow-webhook-delivery.subscriber.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.dto.d.ts +85 -0
- package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.dto.js +345 -0
- package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.dto.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.resolver.d.ts +23 -0
- package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.resolver.js +159 -0
- package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.resolver.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.service.d.ts +93 -0
- package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.service.js +464 -0
- package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.service.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-endpoint.entity.d.ts +52 -0
- package/src/lib/workflow-webhook/workflow-webhook-endpoint.entity.js +135 -0
- package/src/lib/workflow-webhook/workflow-webhook-endpoint.entity.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-enqueue.d.ts +46 -0
- package/src/lib/workflow-webhook/workflow-webhook-enqueue.js +134 -0
- package/src/lib/workflow-webhook/workflow-webhook-enqueue.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-options.d.ts +86 -0
- package/src/lib/workflow-webhook/workflow-webhook-options.js +88 -0
- package/src/lib/workflow-webhook/workflow-webhook-options.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-options.module.d.ts +18 -0
- package/src/lib/workflow-webhook/workflow-webhook-options.module.js +57 -0
- package/src/lib/workflow-webhook/workflow-webhook-options.module.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook-secret-cipher.d.ts +20 -0
- package/src/lib/workflow-webhook/workflow-webhook-secret-cipher.js +66 -0
- package/src/lib/workflow-webhook/workflow-webhook-secret-cipher.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook.errors.d.ts +35 -0
- package/src/lib/workflow-webhook/workflow-webhook.errors.js +41 -0
- package/src/lib/workflow-webhook/workflow-webhook.errors.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook.module.d.ts +9 -0
- package/src/lib/workflow-webhook/workflow-webhook.module.js +62 -0
- package/src/lib/workflow-webhook/workflow-webhook.module.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook.provider.d.ts +12 -0
- package/src/lib/workflow-webhook/workflow-webhook.provider.js +21 -0
- package/src/lib/workflow-webhook/workflow-webhook.provider.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook.queries.d.ts +38 -0
- package/src/lib/workflow-webhook/workflow-webhook.queries.js +142 -0
- package/src/lib/workflow-webhook/workflow-webhook.queries.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook.service.d.ts +50 -0
- package/src/lib/workflow-webhook/workflow-webhook.service.js +221 -0
- package/src/lib/workflow-webhook/workflow-webhook.service.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook.types.d.ts +127 -0
- package/src/lib/workflow-webhook/workflow-webhook.types.js +33 -0
- package/src/lib/workflow-webhook/workflow-webhook.types.js.map +1 -0
- package/src/lib/workflow-webhook/workflow-webhook.validator.d.ts +20 -0
- package/src/lib/workflow-webhook/workflow-webhook.validator.js +97 -0
- package/src/lib/workflow-webhook/workflow-webhook.validator.js.map +1 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var WorkflowWebhookDeliverySchedulerService_1;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.WorkflowWebhookDeliverySchedulerService = void 0;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const common_1 = require("@nestjs/common");
|
|
7
|
+
const workflow_webhook_delivery_service_1 = require("./workflow-webhook-delivery.service");
|
|
8
|
+
const workflow_webhook_service_1 = require("./workflow-webhook.service");
|
|
9
|
+
/**
|
|
10
|
+
* The fallback that retries failed attempts, releases rows the immediate kick
|
|
11
|
+
* missed, and reclaims rows a crashed worker left in progress. `SKIP LOCKED`
|
|
12
|
+
* in the claim lets several API instances run it at once.
|
|
13
|
+
*/
|
|
14
|
+
let WorkflowWebhookDeliverySchedulerService = WorkflowWebhookDeliverySchedulerService_1 = class WorkflowWebhookDeliverySchedulerService {
|
|
15
|
+
constructor(deliveryService, webhookService) {
|
|
16
|
+
this.deliveryService = deliveryService;
|
|
17
|
+
this.webhookService = webhookService;
|
|
18
|
+
this.logger = new common_1.Logger(WorkflowWebhookDeliverySchedulerService_1.name);
|
|
19
|
+
this.timer = null;
|
|
20
|
+
this.scanning = false;
|
|
21
|
+
}
|
|
22
|
+
async onApplicationBootstrap() {
|
|
23
|
+
if (process.env.NODE_ENV === 'test' || !(await this.isEnabled())) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
this.timer = setInterval(() => {
|
|
27
|
+
void this.scan();
|
|
28
|
+
}, this.webhookService.readOptions().delivery.scanIntervalMs);
|
|
29
|
+
this.timer.unref();
|
|
30
|
+
}
|
|
31
|
+
onApplicationShutdown() {
|
|
32
|
+
if (this.timer) {
|
|
33
|
+
clearInterval(this.timer);
|
|
34
|
+
this.timer = null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Unset means "on when there is anything to deliver to": a host with no
|
|
39
|
+
* endpoints gets no idle timer, and one with endpoints never silently loses
|
|
40
|
+
* its retries.
|
|
41
|
+
*/
|
|
42
|
+
async isEnabled() {
|
|
43
|
+
const configured = this.webhookService.readOptions().delivery.schedulerEnabled;
|
|
44
|
+
if (configured !== null) {
|
|
45
|
+
return configured;
|
|
46
|
+
}
|
|
47
|
+
if (!this.webhookService.hasEndpointSources()) {
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
// Endpoints can be added in the database at any time, so an empty list
|
|
51
|
+
// at boot says nothing about tomorrow; a scan with nothing due is cheap.
|
|
52
|
+
if (this.webhookService.hasDatabaseSource()) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
return ((await this.webhookService.listEndpoints({ includeDeprecated: true }))
|
|
57
|
+
.length > 0);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// A source that cannot list its endpoints at boot may still have rows
|
|
61
|
+
// to retry; running an idle scan is cheaper than losing them.
|
|
62
|
+
this.logger.warn('Could not list webhook endpoints at boot; the delivery scheduler runs anyway');
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async scan() {
|
|
67
|
+
// A slow receiver must not stack scans on top of each other.
|
|
68
|
+
if (this.scanning) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
this.scanning = true;
|
|
72
|
+
try {
|
|
73
|
+
const count = await this.deliveryService.deliverDue();
|
|
74
|
+
if (count) {
|
|
75
|
+
this.logger.log(`Attempted ${count} webhook deliveries`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
this.logger.error(error instanceof Error ? error.message : 'Webhook delivery scan failed');
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
this.scanning = false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
exports.WorkflowWebhookDeliverySchedulerService = WorkflowWebhookDeliverySchedulerService;
|
|
87
|
+
exports.WorkflowWebhookDeliverySchedulerService = WorkflowWebhookDeliverySchedulerService = WorkflowWebhookDeliverySchedulerService_1 = tslib_1.__decorate([
|
|
88
|
+
(0, common_1.Injectable)(),
|
|
89
|
+
tslib_1.__metadata("design:paramtypes", [workflow_webhook_delivery_service_1.WorkflowWebhookDeliveryService,
|
|
90
|
+
workflow_webhook_service_1.WorkflowWebhookService])
|
|
91
|
+
], WorkflowWebhookDeliverySchedulerService);
|
|
92
|
+
//# sourceMappingURL=workflow-webhook-delivery-scheduler.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-webhook-delivery-scheduler.service.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-webhook/workflow-webhook-delivery-scheduler.service.ts"],"names":[],"mappings":";;;;;AAAA,2CAKwB;AACxB,2FAAqF;AACrF,yEAAoE;AAEpE;;;;GAIG;AAEI,IAAM,uCAAuC,+CAA7C,MAAM,uCAAuC;IASlD,YACmB,eAA+C,EAC/C,cAAsC;QADtC,oBAAe,GAAf,eAAe,CAAgC;QAC/C,mBAAc,GAAd,cAAc,CAAwB;QARxC,WAAM,GAAG,IAAI,eAAM,CAClC,yCAAuC,CAAC,IAAI,CAC7C,CAAC;QACM,UAAK,GAA0B,IAAI,CAAC;QACpC,aAAQ,GAAG,KAAK,CAAC;IAKtB,CAAC;IAEJ,KAAK,CAAC,sBAAsB;QAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC;YACjE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAS,EAAE;YAClC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;QACnB,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED,qBAAqB;QACnB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAS;QACb,MAAM,UAAU,GACd,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAE9D,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,kBAAkB,EAAE,EAAE,CAAC;YAC9C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,uEAAuE;QACvE,yEAAyE;QACzE,IAAI,IAAI,CAAC,cAAc,CAAC,iBAAiB,EAAE,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,OAAO,CACL,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;iBACnE,MAAM,GAAG,CAAC,CACd,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;YACtE,8DAA8D;YAC9D,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,8EAA8E,CAC/E,CAAC;YAEF,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,6DAA6D;QAC7D,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAC;YAEtD,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,KAAK,qBAAqB,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,8BAA8B,CACxE,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;CACF,CAAA;AA7FY,0FAAuC;kDAAvC,uCAAuC;IADnD,IAAA,mBAAU,GAAE;6CAWyB,kEAA8B;QAC/B,iDAAsB;GAX9C,uCAAuC,CA6FnD"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { WorkflowWebhookDeliveryStatusEnum } from './workflow-webhook-delivery.enums';
|
|
2
|
+
/**
|
|
3
|
+
* The part of a webhook event that is decided when the NOTIFY node runs and
|
|
4
|
+
* must not change between attempts. `deliveryId` and `attempt` are added at
|
|
5
|
+
* send time.
|
|
6
|
+
*/
|
|
7
|
+
export interface WorkflowWebhookFrozenEvent {
|
|
8
|
+
readonly endpoint: {
|
|
9
|
+
readonly key: string;
|
|
10
|
+
readonly version: number;
|
|
11
|
+
};
|
|
12
|
+
readonly initiator: {
|
|
13
|
+
readonly memberId: string;
|
|
14
|
+
};
|
|
15
|
+
readonly instance: {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly templateId: string;
|
|
18
|
+
readonly templateVersionId: string;
|
|
19
|
+
readonly title: string;
|
|
20
|
+
};
|
|
21
|
+
readonly node: {
|
|
22
|
+
readonly id: string;
|
|
23
|
+
readonly label: string;
|
|
24
|
+
};
|
|
25
|
+
readonly occurredAt: string;
|
|
26
|
+
readonly parameters: Readonly<Record<string, unknown>>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* One queued NOTIFY webhook delivery (ADR 18 §3.5). Not a GraphQL type: the
|
|
30
|
+
* admin-facing view arrives in P3 and deliberately omits
|
|
31
|
+
* `lastErrorDetail` from anyone who is not an administrator.
|
|
32
|
+
*/
|
|
33
|
+
export declare class WorkflowWebhookDeliveryEntity {
|
|
34
|
+
id: string;
|
|
35
|
+
instanceId: string;
|
|
36
|
+
nodeId: string;
|
|
37
|
+
tokenId: string;
|
|
38
|
+
targetId: string;
|
|
39
|
+
endpointKey: string;
|
|
40
|
+
endpointVersion: number;
|
|
41
|
+
event: WorkflowWebhookFrozenEvent;
|
|
42
|
+
status: WorkflowWebhookDeliveryStatusEnum;
|
|
43
|
+
attemptCount: number;
|
|
44
|
+
nextRetryAt: Date | null;
|
|
45
|
+
lastAttemptAt: Date | null;
|
|
46
|
+
lastResponseStatus: number | null;
|
|
47
|
+
lastErrorCode: string | null;
|
|
48
|
+
/** Up to 500 characters of the response body. Administrators only. */
|
|
49
|
+
lastErrorDetail: string | null;
|
|
50
|
+
sentAt: Date | null;
|
|
51
|
+
createdAt: Date;
|
|
52
|
+
updatedAt: Date;
|
|
53
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkflowWebhookDeliveryEntity = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const typeorm_1 = require("typeorm");
|
|
6
|
+
const workflow_webhook_delivery_enums_1 = require("./workflow-webhook-delivery.enums");
|
|
7
|
+
/**
|
|
8
|
+
* One queued NOTIFY webhook delivery (ADR 18 §3.5). Not a GraphQL type: the
|
|
9
|
+
* admin-facing view arrives in P3 and deliberately omits
|
|
10
|
+
* `lastErrorDetail` from anyone who is not an administrator.
|
|
11
|
+
*/
|
|
12
|
+
let WorkflowWebhookDeliveryEntity = class WorkflowWebhookDeliveryEntity {
|
|
13
|
+
};
|
|
14
|
+
exports.WorkflowWebhookDeliveryEntity = WorkflowWebhookDeliveryEntity;
|
|
15
|
+
tslib_1.__decorate([
|
|
16
|
+
(0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
|
|
17
|
+
tslib_1.__metadata("design:type", String)
|
|
18
|
+
], WorkflowWebhookDeliveryEntity.prototype, "id", void 0);
|
|
19
|
+
tslib_1.__decorate([
|
|
20
|
+
(0, typeorm_1.Column)('uuid', { name: 'instance_id' }),
|
|
21
|
+
tslib_1.__metadata("design:type", String)
|
|
22
|
+
], WorkflowWebhookDeliveryEntity.prototype, "instanceId", void 0);
|
|
23
|
+
tslib_1.__decorate([
|
|
24
|
+
(0, typeorm_1.Column)('text', { name: 'node_id' }),
|
|
25
|
+
tslib_1.__metadata("design:type", String)
|
|
26
|
+
], WorkflowWebhookDeliveryEntity.prototype, "nodeId", void 0);
|
|
27
|
+
tslib_1.__decorate([
|
|
28
|
+
(0, typeorm_1.Column)('uuid', { name: 'token_id' }),
|
|
29
|
+
tslib_1.__metadata("design:type", String)
|
|
30
|
+
], WorkflowWebhookDeliveryEntity.prototype, "tokenId", void 0);
|
|
31
|
+
tslib_1.__decorate([
|
|
32
|
+
(0, typeorm_1.Column)('text', { name: 'target_id' }),
|
|
33
|
+
tslib_1.__metadata("design:type", String)
|
|
34
|
+
], WorkflowWebhookDeliveryEntity.prototype, "targetId", void 0);
|
|
35
|
+
tslib_1.__decorate([
|
|
36
|
+
(0, typeorm_1.Column)('text', { name: 'endpoint_key' }),
|
|
37
|
+
tslib_1.__metadata("design:type", String)
|
|
38
|
+
], WorkflowWebhookDeliveryEntity.prototype, "endpointKey", void 0);
|
|
39
|
+
tslib_1.__decorate([
|
|
40
|
+
(0, typeorm_1.Column)('integer', { name: 'endpoint_version' }),
|
|
41
|
+
tslib_1.__metadata("design:type", Number)
|
|
42
|
+
], WorkflowWebhookDeliveryEntity.prototype, "endpointVersion", void 0);
|
|
43
|
+
tslib_1.__decorate([
|
|
44
|
+
(0, typeorm_1.Column)('jsonb'),
|
|
45
|
+
tslib_1.__metadata("design:type", Object)
|
|
46
|
+
], WorkflowWebhookDeliveryEntity.prototype, "event", void 0);
|
|
47
|
+
tslib_1.__decorate([
|
|
48
|
+
(0, typeorm_1.Column)('text'),
|
|
49
|
+
tslib_1.__metadata("design:type", String)
|
|
50
|
+
], WorkflowWebhookDeliveryEntity.prototype, "status", void 0);
|
|
51
|
+
tslib_1.__decorate([
|
|
52
|
+
(0, typeorm_1.Column)('integer', { default: 0, name: 'attempt_count' }),
|
|
53
|
+
tslib_1.__metadata("design:type", Number)
|
|
54
|
+
], WorkflowWebhookDeliveryEntity.prototype, "attemptCount", void 0);
|
|
55
|
+
tslib_1.__decorate([
|
|
56
|
+
(0, typeorm_1.Column)('timestamptz', { name: 'next_retry_at', nullable: true }),
|
|
57
|
+
tslib_1.__metadata("design:type", Object)
|
|
58
|
+
], WorkflowWebhookDeliveryEntity.prototype, "nextRetryAt", void 0);
|
|
59
|
+
tslib_1.__decorate([
|
|
60
|
+
(0, typeorm_1.Column)('timestamptz', { name: 'last_attempt_at', nullable: true }),
|
|
61
|
+
tslib_1.__metadata("design:type", Object)
|
|
62
|
+
], WorkflowWebhookDeliveryEntity.prototype, "lastAttemptAt", void 0);
|
|
63
|
+
tslib_1.__decorate([
|
|
64
|
+
(0, typeorm_1.Column)('integer', { name: 'last_response_status', nullable: true }),
|
|
65
|
+
tslib_1.__metadata("design:type", Object)
|
|
66
|
+
], WorkflowWebhookDeliveryEntity.prototype, "lastResponseStatus", void 0);
|
|
67
|
+
tslib_1.__decorate([
|
|
68
|
+
(0, typeorm_1.Column)('text', { name: 'last_error_code', nullable: true }),
|
|
69
|
+
tslib_1.__metadata("design:type", Object)
|
|
70
|
+
], WorkflowWebhookDeliveryEntity.prototype, "lastErrorCode", void 0);
|
|
71
|
+
tslib_1.__decorate([
|
|
72
|
+
(0, typeorm_1.Column)('text', { name: 'last_error_detail', nullable: true }),
|
|
73
|
+
tslib_1.__metadata("design:type", Object)
|
|
74
|
+
], WorkflowWebhookDeliveryEntity.prototype, "lastErrorDetail", void 0);
|
|
75
|
+
tslib_1.__decorate([
|
|
76
|
+
(0, typeorm_1.Column)('timestamptz', { name: 'sent_at', nullable: true }),
|
|
77
|
+
tslib_1.__metadata("design:type", Object)
|
|
78
|
+
], WorkflowWebhookDeliveryEntity.prototype, "sentAt", void 0);
|
|
79
|
+
tslib_1.__decorate([
|
|
80
|
+
(0, typeorm_1.CreateDateColumn)({ name: 'created_at', type: 'timestamptz' }),
|
|
81
|
+
tslib_1.__metadata("design:type", Date)
|
|
82
|
+
], WorkflowWebhookDeliveryEntity.prototype, "createdAt", void 0);
|
|
83
|
+
tslib_1.__decorate([
|
|
84
|
+
(0, typeorm_1.UpdateDateColumn)({ name: 'updated_at', type: 'timestamptz' }),
|
|
85
|
+
tslib_1.__metadata("design:type", Date)
|
|
86
|
+
], WorkflowWebhookDeliveryEntity.prototype, "updatedAt", void 0);
|
|
87
|
+
exports.WorkflowWebhookDeliveryEntity = WorkflowWebhookDeliveryEntity = tslib_1.__decorate([
|
|
88
|
+
(0, typeorm_1.Entity)('workflow_webhook_deliveries'),
|
|
89
|
+
(0, typeorm_1.Index)('IDX_workflow_webhook_deliveries_pending', [
|
|
90
|
+
'status',
|
|
91
|
+
'nextRetryAt',
|
|
92
|
+
'createdAt',
|
|
93
|
+
]),
|
|
94
|
+
(0, typeorm_1.Index)('IDX_workflow_webhook_deliveries_instance', ['instanceId', 'createdAt']),
|
|
95
|
+
(0, typeorm_1.Unique)('UQ_workflow_webhook_deliveries_token_target', ['tokenId', 'targetId'])
|
|
96
|
+
], WorkflowWebhookDeliveryEntity);
|
|
97
|
+
//# sourceMappingURL=workflow-webhook-delivery.entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-webhook-delivery.entity.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-webhook/workflow-webhook-delivery.entity.ts"],"names":[],"mappings":";;;;AAAA,qCAQiB;AACjB,uFAAsF;AA6BtF;;;;GAIG;AASI,IAAM,6BAA6B,GAAnC,MAAM,6BAA6B;CAuDzC,CAAA;AAvDY,sEAA6B;AAExC;IADC,IAAA,gCAAsB,EAAC,MAAM,CAAC;;yDACnB;AAGZ;IADC,IAAA,gBAAM,EAAC,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;iEACpB;AAGpB;IADC,IAAA,gBAAM,EAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;;6DACpB;AAGhB;IADC,IAAA,gBAAM,EAAC,MAAM,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;8DACpB;AAGjB;IADC,IAAA,gBAAM,EAAC,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;;+DACpB;AAGlB;IADC,IAAA,gBAAM,EAAC,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;;kEACpB;AAGrB;IADC,IAAA,gBAAM,EAAC,SAAS,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;;sEACvB;AAGzB;IADC,IAAA,gBAAM,EAAC,OAAO,CAAC;;4DACmB;AAGnC;IADC,IAAA,gBAAM,EAAC,MAAM,CAAC;;6DAC4B;AAG3C;IADC,IAAA,gBAAM,EAAC,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;;mEACnC;AAGtB;IADC,IAAA,gBAAM,EAAC,aAAa,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kEACvC;AAG1B;IADC,IAAA,gBAAM,EAAC,aAAa,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;oEACvC;AAG5B;IADC,IAAA,gBAAM,EAAC,SAAS,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yEACjC;AAGnC;IADC,IAAA,gBAAM,EAAC,MAAM,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;oEAC9B;AAI9B;IADC,IAAA,gBAAM,EAAC,MAAM,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sEAC9B;AAGhC;IADC,IAAA,gBAAM,EAAC,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6DACtC;AAGrB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;sCAClD,IAAI;gEAAC;AAGjB;IADC,IAAA,0BAAgB,EAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;sCAClD,IAAI;gEAAC;wCAtDN,6BAA6B;IARzC,IAAA,gBAAM,EAAC,6BAA6B,CAAC;IACrC,IAAA,eAAK,EAAC,yCAAyC,EAAE;QAChD,QAAQ;QACR,aAAa;QACb,WAAW;KACZ,CAAC;IACD,IAAA,eAAK,EAAC,0CAA0C,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;IAC9E,IAAA,gBAAM,EAAC,6CAA6C,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;GAClE,6BAA6B,CAuDzC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export declare enum WorkflowWebhookDeliveryStatusEnum {
|
|
2
|
+
DELIVERY_IN_PROGRESS = "DELIVERY_IN_PROGRESS",
|
|
3
|
+
FAILED = "FAILED",
|
|
4
|
+
PENDING = "PENDING",
|
|
5
|
+
SENT = "SENT"
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Why a delivery attempt did not end in `SENT` (ADR 18 §3.6). Stored on the
|
|
9
|
+
* row and copied into the terminal activity log; never contains the URL or
|
|
10
|
+
* the response body.
|
|
11
|
+
*/
|
|
12
|
+
export declare const WORKFLOW_WEBHOOK_DELIVERY_ERROR_CODES: {
|
|
13
|
+
readonly BUILD_REQUEST_FAILED: "WEBHOOK_BUILD_REQUEST_FAILED";
|
|
14
|
+
/** An administrator disabled the (database) endpoint. */
|
|
15
|
+
readonly ENDPOINT_DISABLED: "WEBHOOK_ENDPOINT_DISABLED";
|
|
16
|
+
/** The endpoint source threw while looking the endpoint up. */
|
|
17
|
+
readonly ENDPOINT_LOOKUP_FAILED: "WEBHOOK_ENDPOINT_LOOKUP_FAILED";
|
|
18
|
+
readonly ENDPOINT_MISSING: "WEBHOOK_ENDPOINT_MISSING";
|
|
19
|
+
/** An unexpected error inside BPM itself; retried like a transient one. */
|
|
20
|
+
readonly INTERNAL_ERROR: "WEBHOOK_INTERNAL_ERROR";
|
|
21
|
+
readonly INVALID_REQUEST: "WEBHOOK_INVALID_REQUEST";
|
|
22
|
+
readonly NETWORK: "WEBHOOK_NETWORK";
|
|
23
|
+
readonly PARAMETER_INVALID: "WEBHOOK_PARAMETER_INVALID";
|
|
24
|
+
readonly REDIRECT: "WEBHOOK_REDIRECT";
|
|
25
|
+
readonly TIMEOUT: "WEBHOOK_TIMEOUT";
|
|
26
|
+
readonly URL_NOT_ALLOWED: "WEBHOOK_URL_NOT_ALLOWED";
|
|
27
|
+
};
|
|
28
|
+
export type WorkflowWebhookDeliveryErrorCode = (typeof WORKFLOW_WEBHOOK_DELIVERY_ERROR_CODES)[keyof typeof WORKFLOW_WEBHOOK_DELIVERY_ERROR_CODES] | `WEBHOOK_HTTP_${number}`;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WORKFLOW_WEBHOOK_DELIVERY_ERROR_CODES = exports.WorkflowWebhookDeliveryStatusEnum = void 0;
|
|
4
|
+
const graphql_1 = require("@nestjs/graphql");
|
|
5
|
+
var WorkflowWebhookDeliveryStatusEnum;
|
|
6
|
+
(function (WorkflowWebhookDeliveryStatusEnum) {
|
|
7
|
+
WorkflowWebhookDeliveryStatusEnum["DELIVERY_IN_PROGRESS"] = "DELIVERY_IN_PROGRESS";
|
|
8
|
+
WorkflowWebhookDeliveryStatusEnum["FAILED"] = "FAILED";
|
|
9
|
+
WorkflowWebhookDeliveryStatusEnum["PENDING"] = "PENDING";
|
|
10
|
+
WorkflowWebhookDeliveryStatusEnum["SENT"] = "SENT";
|
|
11
|
+
})(WorkflowWebhookDeliveryStatusEnum || (exports.WorkflowWebhookDeliveryStatusEnum = WorkflowWebhookDeliveryStatusEnum = {}));
|
|
12
|
+
(0, graphql_1.registerEnumType)(WorkflowWebhookDeliveryStatusEnum, {
|
|
13
|
+
name: 'BPMWorkflowWebhookDeliveryStatus',
|
|
14
|
+
});
|
|
15
|
+
/**
|
|
16
|
+
* Why a delivery attempt did not end in `SENT` (ADR 18 §3.6). Stored on the
|
|
17
|
+
* row and copied into the terminal activity log; never contains the URL or
|
|
18
|
+
* the response body.
|
|
19
|
+
*/
|
|
20
|
+
exports.WORKFLOW_WEBHOOK_DELIVERY_ERROR_CODES = {
|
|
21
|
+
BUILD_REQUEST_FAILED: 'WEBHOOK_BUILD_REQUEST_FAILED',
|
|
22
|
+
/** An administrator disabled the (database) endpoint. */
|
|
23
|
+
ENDPOINT_DISABLED: 'WEBHOOK_ENDPOINT_DISABLED',
|
|
24
|
+
/** The endpoint source threw while looking the endpoint up. */
|
|
25
|
+
ENDPOINT_LOOKUP_FAILED: 'WEBHOOK_ENDPOINT_LOOKUP_FAILED',
|
|
26
|
+
ENDPOINT_MISSING: 'WEBHOOK_ENDPOINT_MISSING',
|
|
27
|
+
/** An unexpected error inside BPM itself; retried like a transient one. */
|
|
28
|
+
INTERNAL_ERROR: 'WEBHOOK_INTERNAL_ERROR',
|
|
29
|
+
INVALID_REQUEST: 'WEBHOOK_INVALID_REQUEST',
|
|
30
|
+
NETWORK: 'WEBHOOK_NETWORK',
|
|
31
|
+
PARAMETER_INVALID: 'WEBHOOK_PARAMETER_INVALID',
|
|
32
|
+
REDIRECT: 'WEBHOOK_REDIRECT',
|
|
33
|
+
TIMEOUT: 'WEBHOOK_TIMEOUT',
|
|
34
|
+
URL_NOT_ALLOWED: 'WEBHOOK_URL_NOT_ALLOWED',
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=workflow-webhook-delivery.enums.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-webhook-delivery.enums.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-webhook/workflow-webhook-delivery.enums.ts"],"names":[],"mappings":";;;AAAA,6CAAmD;AAEnD,IAAY,iCAKX;AALD,WAAY,iCAAiC;IAC3C,kFAA6C,CAAA;IAC7C,sDAAiB,CAAA;IACjB,wDAAmB,CAAA;IACnB,kDAAa,CAAA;AACf,CAAC,EALW,iCAAiC,iDAAjC,iCAAiC,QAK5C;AAED,IAAA,0BAAgB,EAAC,iCAAiC,EAAE;IAClD,IAAI,EAAE,kCAAkC;CACzC,CAAC,CAAC;AAEH;;;;GAIG;AACU,QAAA,qCAAqC,GAAG;IACnD,oBAAoB,EAAE,8BAA8B;IACpD,yDAAyD;IACzD,iBAAiB,EAAE,2BAA2B;IAC9C,+DAA+D;IAC/D,sBAAsB,EAAE,gCAAgC;IACxD,gBAAgB,EAAE,0BAA0B;IAC5C,2EAA2E;IAC3E,cAAc,EAAE,wBAAwB;IACxC,eAAe,EAAE,yBAAyB;IAC1C,OAAO,EAAE,iBAAiB;IAC1B,iBAAiB,EAAE,2BAA2B;IAC9C,QAAQ,EAAE,kBAAkB;IAC5B,OAAO,EAAE,iBAAiB;IAC1B,eAAe,EAAE,yBAAyB;CAClC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { WorkflowWebhookDeliveryStatusEnum } from './workflow-webhook-delivery.enums';
|
|
2
|
+
/**
|
|
3
|
+
* An administrator's view of one NOTIFY webhook delivery (ADR 18 §3.10).
|
|
4
|
+
*
|
|
5
|
+
* Carries the outcome and nothing that reaches the receiver: no URL, no
|
|
6
|
+
* headers, no parameters. `lastErrorDetail` (at most 500 characters of a
|
|
7
|
+
* failing response, or an error's kind) is why this is admin-only.
|
|
8
|
+
*/
|
|
9
|
+
export declare class WorkflowWebhookDeliveryObject {
|
|
10
|
+
attemptCount: number;
|
|
11
|
+
createdAt: Date;
|
|
12
|
+
endpointKey: string;
|
|
13
|
+
/** `null` when the endpoint is no longer registered. */
|
|
14
|
+
endpointLabel: string | null;
|
|
15
|
+
endpointVersion: number;
|
|
16
|
+
id: string;
|
|
17
|
+
instanceId: string;
|
|
18
|
+
lastAttemptAt: Date | null;
|
|
19
|
+
lastErrorCode: string | null;
|
|
20
|
+
lastErrorDetail: string | null;
|
|
21
|
+
lastResponseStatus: number | null;
|
|
22
|
+
nextRetryAt: Date | null;
|
|
23
|
+
nodeId: string;
|
|
24
|
+
sentAt: Date | null;
|
|
25
|
+
status: WorkflowWebhookDeliveryStatusEnum;
|
|
26
|
+
targetId: string;
|
|
27
|
+
updatedAt: Date;
|
|
28
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkflowWebhookDeliveryObject = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const graphql_1 = require("@nestjs/graphql");
|
|
6
|
+
const workflow_webhook_delivery_enums_1 = require("./workflow-webhook-delivery.enums");
|
|
7
|
+
/**
|
|
8
|
+
* An administrator's view of one NOTIFY webhook delivery (ADR 18 §3.10).
|
|
9
|
+
*
|
|
10
|
+
* Carries the outcome and nothing that reaches the receiver: no URL, no
|
|
11
|
+
* headers, no parameters. `lastErrorDetail` (at most 500 characters of a
|
|
12
|
+
* failing response, or an error's kind) is why this is admin-only.
|
|
13
|
+
*/
|
|
14
|
+
let WorkflowWebhookDeliveryObject = class WorkflowWebhookDeliveryObject {
|
|
15
|
+
};
|
|
16
|
+
exports.WorkflowWebhookDeliveryObject = WorkflowWebhookDeliveryObject;
|
|
17
|
+
tslib_1.__decorate([
|
|
18
|
+
(0, graphql_1.Field)(() => graphql_1.Int),
|
|
19
|
+
tslib_1.__metadata("design:type", Number)
|
|
20
|
+
], WorkflowWebhookDeliveryObject.prototype, "attemptCount", void 0);
|
|
21
|
+
tslib_1.__decorate([
|
|
22
|
+
(0, graphql_1.Field)(),
|
|
23
|
+
tslib_1.__metadata("design:type", Date)
|
|
24
|
+
], WorkflowWebhookDeliveryObject.prototype, "createdAt", void 0);
|
|
25
|
+
tslib_1.__decorate([
|
|
26
|
+
(0, graphql_1.Field)(),
|
|
27
|
+
tslib_1.__metadata("design:type", String)
|
|
28
|
+
], WorkflowWebhookDeliveryObject.prototype, "endpointKey", void 0);
|
|
29
|
+
tslib_1.__decorate([
|
|
30
|
+
(0, graphql_1.Field)(() => String, { nullable: true }),
|
|
31
|
+
tslib_1.__metadata("design:type", Object)
|
|
32
|
+
], WorkflowWebhookDeliveryObject.prototype, "endpointLabel", void 0);
|
|
33
|
+
tslib_1.__decorate([
|
|
34
|
+
(0, graphql_1.Field)(() => graphql_1.Int),
|
|
35
|
+
tslib_1.__metadata("design:type", Number)
|
|
36
|
+
], WorkflowWebhookDeliveryObject.prototype, "endpointVersion", void 0);
|
|
37
|
+
tslib_1.__decorate([
|
|
38
|
+
(0, graphql_1.Field)(() => graphql_1.ID),
|
|
39
|
+
tslib_1.__metadata("design:type", String)
|
|
40
|
+
], WorkflowWebhookDeliveryObject.prototype, "id", void 0);
|
|
41
|
+
tslib_1.__decorate([
|
|
42
|
+
(0, graphql_1.Field)(() => graphql_1.ID),
|
|
43
|
+
tslib_1.__metadata("design:type", String)
|
|
44
|
+
], WorkflowWebhookDeliveryObject.prototype, "instanceId", void 0);
|
|
45
|
+
tslib_1.__decorate([
|
|
46
|
+
(0, graphql_1.Field)(() => Date, { nullable: true }),
|
|
47
|
+
tslib_1.__metadata("design:type", Object)
|
|
48
|
+
], WorkflowWebhookDeliveryObject.prototype, "lastAttemptAt", void 0);
|
|
49
|
+
tslib_1.__decorate([
|
|
50
|
+
(0, graphql_1.Field)(() => String, { nullable: true }),
|
|
51
|
+
tslib_1.__metadata("design:type", Object)
|
|
52
|
+
], WorkflowWebhookDeliveryObject.prototype, "lastErrorCode", void 0);
|
|
53
|
+
tslib_1.__decorate([
|
|
54
|
+
(0, graphql_1.Field)(() => String, { nullable: true }),
|
|
55
|
+
tslib_1.__metadata("design:type", Object)
|
|
56
|
+
], WorkflowWebhookDeliveryObject.prototype, "lastErrorDetail", void 0);
|
|
57
|
+
tslib_1.__decorate([
|
|
58
|
+
(0, graphql_1.Field)(() => graphql_1.Int, { nullable: true }),
|
|
59
|
+
tslib_1.__metadata("design:type", Object)
|
|
60
|
+
], WorkflowWebhookDeliveryObject.prototype, "lastResponseStatus", void 0);
|
|
61
|
+
tslib_1.__decorate([
|
|
62
|
+
(0, graphql_1.Field)(() => Date, { nullable: true }),
|
|
63
|
+
tslib_1.__metadata("design:type", Object)
|
|
64
|
+
], WorkflowWebhookDeliveryObject.prototype, "nextRetryAt", void 0);
|
|
65
|
+
tslib_1.__decorate([
|
|
66
|
+
(0, graphql_1.Field)(),
|
|
67
|
+
tslib_1.__metadata("design:type", String)
|
|
68
|
+
], WorkflowWebhookDeliveryObject.prototype, "nodeId", void 0);
|
|
69
|
+
tslib_1.__decorate([
|
|
70
|
+
(0, graphql_1.Field)(() => Date, { nullable: true }),
|
|
71
|
+
tslib_1.__metadata("design:type", Object)
|
|
72
|
+
], WorkflowWebhookDeliveryObject.prototype, "sentAt", void 0);
|
|
73
|
+
tslib_1.__decorate([
|
|
74
|
+
(0, graphql_1.Field)(() => workflow_webhook_delivery_enums_1.WorkflowWebhookDeliveryStatusEnum),
|
|
75
|
+
tslib_1.__metadata("design:type", String)
|
|
76
|
+
], WorkflowWebhookDeliveryObject.prototype, "status", void 0);
|
|
77
|
+
tslib_1.__decorate([
|
|
78
|
+
(0, graphql_1.Field)(),
|
|
79
|
+
tslib_1.__metadata("design:type", String)
|
|
80
|
+
], WorkflowWebhookDeliveryObject.prototype, "targetId", void 0);
|
|
81
|
+
tslib_1.__decorate([
|
|
82
|
+
(0, graphql_1.Field)(),
|
|
83
|
+
tslib_1.__metadata("design:type", Date)
|
|
84
|
+
], WorkflowWebhookDeliveryObject.prototype, "updatedAt", void 0);
|
|
85
|
+
exports.WorkflowWebhookDeliveryObject = WorkflowWebhookDeliveryObject = tslib_1.__decorate([
|
|
86
|
+
(0, graphql_1.ObjectType)('BPMWorkflowWebhookDelivery')
|
|
87
|
+
], WorkflowWebhookDeliveryObject);
|
|
88
|
+
//# sourceMappingURL=workflow-webhook-delivery.object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-webhook-delivery.object.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-webhook/workflow-webhook-delivery.object.ts"],"names":[],"mappings":";;;;AAAA,6CAA6D;AAC7D,uFAAsF;AAEtF;;;;;;GAMG;AAEI,IAAM,6BAA6B,GAAnC,MAAM,6BAA6B;CAoDzC,CAAA;AApDY,sEAA6B;AAExC;IADC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,aAAG,CAAC;;mEACK;AAGtB;IADC,IAAA,eAAK,GAAE;sCACI,IAAI;gEAAC;AAGjB;IADC,IAAA,eAAK,GAAE;;kEACa;AAIrB;IADC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;oEACV;AAG9B;IADC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,aAAG,CAAC;;sEACQ;AAGzB;IADC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,YAAE,CAAC;;yDACJ;AAGZ;IADC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,YAAE,CAAC;;iEACI;AAGpB;IADC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;oEACV;AAG5B;IADC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;oEACV;AAG9B;IADC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;sEACR;AAGhC;IADC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,aAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yEACF;AAGnC;IADC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;kEACZ;AAG1B;IADC,IAAA,eAAK,GAAE;;6DACQ;AAGhB;IADC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6DACjB;AAGrB;IADC,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,mEAAiC,CAAC;;6DACJ;AAG3C;IADC,IAAA,eAAK,GAAE;;+DACU;AAGlB;IADC,IAAA,eAAK,GAAE;sCACI,IAAI;gEAAC;wCAnDN,6BAA6B;IADzC,IAAA,oBAAU,EAAC,4BAA4B,CAAC;GAC5B,6BAA6B,CAoDzC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { WorkflowWebhookDeliveryObject } from './workflow-webhook-delivery.object';
|
|
2
|
+
import { WorkflowWebhookDeliveryService } from './workflow-webhook-delivery.service';
|
|
3
|
+
export declare class WorkflowWebhookDeliveryResolver {
|
|
4
|
+
private readonly deliveryService;
|
|
5
|
+
constructor(deliveryService: WorkflowWebhookDeliveryService);
|
|
6
|
+
workflowWebhookDeliveries(instanceId: string): Promise<readonly WorkflowWebhookDeliveryObject[]>;
|
|
7
|
+
retryWorkflowWebhookDelivery(id: string, currentMemberId?: string | null): Promise<WorkflowWebhookDeliveryObject>;
|
|
8
|
+
private toObject;
|
|
9
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkflowWebhookDeliveryResolver = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const graphql_1 = require("@nestjs/graphql");
|
|
6
|
+
const bpm_auth_1 = require("../bpm-auth");
|
|
7
|
+
const workflow_webhook_delivery_object_1 = require("./workflow-webhook-delivery.object");
|
|
8
|
+
const workflow_webhook_delivery_service_1 = require("./workflow-webhook-delivery.service");
|
|
9
|
+
let WorkflowWebhookDeliveryResolver = class WorkflowWebhookDeliveryResolver {
|
|
10
|
+
constructor(deliveryService) {
|
|
11
|
+
this.deliveryService = deliveryService;
|
|
12
|
+
}
|
|
13
|
+
async workflowWebhookDeliveries(instanceId) {
|
|
14
|
+
const rows = await this.deliveryService.listInstanceDeliveries(instanceId);
|
|
15
|
+
return Promise.all(rows.map((row) => this.toObject(row)));
|
|
16
|
+
}
|
|
17
|
+
async retryWorkflowWebhookDelivery(id, currentMemberId) {
|
|
18
|
+
return this.toObject(await this.deliveryService.retryFailedDelivery(id, currentMemberId ?? null));
|
|
19
|
+
}
|
|
20
|
+
async toObject(row) {
|
|
21
|
+
const endpointLabel = await this.deliveryService.readEndpointLabel(row);
|
|
22
|
+
// Field by field, so nothing on the entity that is not meant for this
|
|
23
|
+
// view — the frozen event with its parameters — can ride along.
|
|
24
|
+
return Object.assign(new workflow_webhook_delivery_object_1.WorkflowWebhookDeliveryObject(), {
|
|
25
|
+
attemptCount: row.attemptCount,
|
|
26
|
+
createdAt: row.createdAt,
|
|
27
|
+
endpointKey: row.endpointKey,
|
|
28
|
+
endpointLabel,
|
|
29
|
+
endpointVersion: row.endpointVersion,
|
|
30
|
+
id: row.id,
|
|
31
|
+
instanceId: row.instanceId,
|
|
32
|
+
lastAttemptAt: row.lastAttemptAt,
|
|
33
|
+
lastErrorCode: row.lastErrorCode,
|
|
34
|
+
lastErrorDetail: row.lastErrorDetail,
|
|
35
|
+
lastResponseStatus: row.lastResponseStatus,
|
|
36
|
+
nextRetryAt: row.nextRetryAt,
|
|
37
|
+
nodeId: row.nodeId,
|
|
38
|
+
sentAt: row.sentAt,
|
|
39
|
+
status: row.status,
|
|
40
|
+
targetId: row.targetId,
|
|
41
|
+
updatedAt: row.updatedAt,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
exports.WorkflowWebhookDeliveryResolver = WorkflowWebhookDeliveryResolver;
|
|
46
|
+
tslib_1.__decorate([
|
|
47
|
+
(0, graphql_1.Query)(() => [workflow_webhook_delivery_object_1.WorkflowWebhookDeliveryObject]),
|
|
48
|
+
tslib_1.__param(0, (0, graphql_1.Args)('instanceId', { type: () => graphql_1.ID })),
|
|
49
|
+
tslib_1.__metadata("design:type", Function),
|
|
50
|
+
tslib_1.__metadata("design:paramtypes", [String]),
|
|
51
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
52
|
+
], WorkflowWebhookDeliveryResolver.prototype, "workflowWebhookDeliveries", null);
|
|
53
|
+
tslib_1.__decorate([
|
|
54
|
+
(0, graphql_1.Mutation)(() => workflow_webhook_delivery_object_1.WorkflowWebhookDeliveryObject),
|
|
55
|
+
tslib_1.__param(0, (0, graphql_1.Args)('id', { type: () => graphql_1.ID })),
|
|
56
|
+
tslib_1.__param(1, (0, bpm_auth_1.BPMCurrentMemberId)()),
|
|
57
|
+
tslib_1.__metadata("design:type", Function),
|
|
58
|
+
tslib_1.__metadata("design:paramtypes", [String, Object]),
|
|
59
|
+
tslib_1.__metadata("design:returntype", Promise)
|
|
60
|
+
], WorkflowWebhookDeliveryResolver.prototype, "retryWorkflowWebhookDelivery", null);
|
|
61
|
+
exports.WorkflowWebhookDeliveryResolver = WorkflowWebhookDeliveryResolver = tslib_1.__decorate([
|
|
62
|
+
(0, graphql_1.Resolver)(),
|
|
63
|
+
(0, bpm_auth_1.BPMAdminOnly)(),
|
|
64
|
+
tslib_1.__metadata("design:paramtypes", [workflow_webhook_delivery_service_1.WorkflowWebhookDeliveryService])
|
|
65
|
+
], WorkflowWebhookDeliveryResolver);
|
|
66
|
+
//# sourceMappingURL=workflow-webhook-delivery.resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-webhook-delivery.resolver.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-webhook/workflow-webhook-delivery.resolver.ts"],"names":[],"mappings":";;;;AAAA,6CAAsE;AACtE,0CAA+D;AAE/D,yFAAmF;AACnF,2FAAqF;AAI9E,IAAM,+BAA+B,GAArC,MAAM,+BAA+B;IAC1C,YACmB,eAA+C;QAA/C,oBAAe,GAAf,eAAe,CAAgC;IAC/D,CAAC;IAGE,AAAN,KAAK,CAAC,yBAAyB,CACW,UAAkB;QAE1D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC;QAE3E,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAGK,AAAN,KAAK,CAAC,4BAA4B,CACA,EAAU,EACpB,eAA+B;QAErD,OAAO,IAAI,CAAC,QAAQ,CAClB,MAAM,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAC5C,EAAE,EACF,eAAe,IAAI,IAAI,CACxB,CACF,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,QAAQ,CACpB,GAAkC;QAElC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAExE,sEAAsE;QACtE,gEAAgE;QAChE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,gEAA6B,EAAE,EAAE;YACxD,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,aAAa;YACb,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,aAAa,EAAE,GAAG,CAAC,aAAa;YAChC,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;YAC1C,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAtDY,0EAA+B;AAMpC;IADL,IAAA,eAAK,EAAC,GAAG,EAAE,CAAC,CAAC,gEAA6B,CAAC,CAAC;IAE1C,mBAAA,IAAA,cAAI,EAAC,YAAY,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,YAAE,EAAE,CAAC,CAAA;;;;gFAKxC;AAGK;IADL,IAAA,kBAAQ,EAAC,GAAG,EAAE,CAAC,gEAA6B,CAAC;IAE3C,mBAAA,IAAA,cAAI,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,YAAE,EAAE,CAAC,CAAA;IAC9B,mBAAA,IAAA,6BAAkB,GAAE,CAAA;;;;mFAQtB;0CAzBU,+BAA+B;IAF3C,IAAA,kBAAQ,GAAE;IACV,IAAA,uBAAY,GAAE;6CAGuB,kEAA8B;GAFvD,+BAA+B,CAsD3C"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { InjectionToken } from '@nestjs/common';
|
|
2
|
+
import { EntityManager, Repository } from 'typeorm';
|
|
3
|
+
import { ActivityLogEntity } from '../workflow-engine/activity-log.entity';
|
|
4
|
+
import { WorkflowWebhookDeliveryEntity } from './workflow-webhook-delivery.entity';
|
|
5
|
+
import { WorkflowWebhookEnqueueContext } from './workflow-webhook-enqueue';
|
|
6
|
+
import { BPMResolvedWorkflowWebhookOptions } from './workflow-webhook-options';
|
|
7
|
+
import { WorkflowWebhookService } from './workflow-webhook.service';
|
|
8
|
+
import { BPMWorkflowWebhookEndpointEntry, BPMWorkflowWebhookEvent } from './workflow-webhook.types';
|
|
9
|
+
export type WorkflowWebhookFetch = (input: string, init: RequestInit) => Promise<Response>;
|
|
10
|
+
/**
|
|
11
|
+
* The HTTP client deliveries go through. Defaults to the global `fetch`;
|
|
12
|
+
* bound mainly so tests can observe requests without a network.
|
|
13
|
+
*/
|
|
14
|
+
export declare const BPM_WORKFLOW_WEBHOOK_FETCH: InjectionToken<WorkflowWebhookFetch>;
|
|
15
|
+
/** What an administrator's test send came back with. */
|
|
16
|
+
export interface WorkflowWebhookTestOutcome {
|
|
17
|
+
readonly errorCode: string | null;
|
|
18
|
+
/** Error kind, network code or a truncated response body; never the URL. */
|
|
19
|
+
readonly errorDetail: string | null;
|
|
20
|
+
readonly ok: boolean;
|
|
21
|
+
readonly status: number | null;
|
|
22
|
+
}
|
|
23
|
+
export declare class WorkflowWebhookDeliveryService {
|
|
24
|
+
private readonly deliveryRepository;
|
|
25
|
+
private readonly activityLogRepository;
|
|
26
|
+
private readonly webhookService;
|
|
27
|
+
private readonly options;
|
|
28
|
+
private readonly logger;
|
|
29
|
+
private readonly fetchImpl;
|
|
30
|
+
constructor(deliveryRepository: Repository<WorkflowWebhookDeliveryEntity>, activityLogRepository: Repository<ActivityLogEntity>, webhookService: WorkflowWebhookService, options?: BPMResolvedWorkflowWebhookOptions, fetchImpl?: WorkflowWebhookFetch);
|
|
31
|
+
/** The clock every attempt reads; separate so tests can pin it. */
|
|
32
|
+
readCurrentTime(): Date;
|
|
33
|
+
/**
|
|
34
|
+
* Queues a NOTIFY node's webhooks inside the engine transaction `manager`.
|
|
35
|
+
* Sends nothing: delivery starts only once that transaction commits
|
|
36
|
+
* (ADR 18 §3.5). Rows that can already be judged undeliverable are written
|
|
37
|
+
* as `FAILED` together with their terminal activity log.
|
|
38
|
+
*/
|
|
39
|
+
enqueueNotifyWebhooks(manager: EntityManager, context: WorkflowWebhookEnqueueContext, targets: unknown): Promise<readonly string[]>;
|
|
40
|
+
/** Every delivery queued for an instance, oldest first (ADR 18 §3.10). */
|
|
41
|
+
listInstanceDeliveries(instanceId: string): Promise<readonly WorkflowWebhookDeliveryEntity[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Puts a `FAILED` delivery back in the queue with a fresh attempt budget
|
|
44
|
+
* and starts it at once. The delivery id does not change, so a receiver
|
|
45
|
+
* that already processed an earlier attempt still recognizes it.
|
|
46
|
+
*
|
|
47
|
+
* Only `FAILED` rows that were actually attempted qualify. A row in flight
|
|
48
|
+
* or already sent would be sent again; a row that failed while being queued
|
|
49
|
+
* (endpoint missing, lookup failed, parameter invalid) froze an event that
|
|
50
|
+
* never passed the parameter checks, and sending it would break the
|
|
51
|
+
* endpoint's contract. The state change and the audit entry commit together.
|
|
52
|
+
*/
|
|
53
|
+
retryFailedDelivery(id: string, actorMemberId: string | null): Promise<WorkflowWebhookDeliveryEntity>;
|
|
54
|
+
/**
|
|
55
|
+
* One scheduler pass: claim what is due, a few rows at a time, until the
|
|
56
|
+
* batch size is reached or nothing more is due.
|
|
57
|
+
*
|
|
58
|
+
* Claiming the whole batch up front and attempting it a few at a time left
|
|
59
|
+
* the rows at the back holding a claim while they waited; past the stale
|
|
60
|
+
* window another worker took them over. Claiming only what starts at once
|
|
61
|
+
* means a claimed row is always a row in flight.
|
|
62
|
+
*/
|
|
63
|
+
deliverDue(now?: Date): Promise<number>;
|
|
64
|
+
/**
|
|
65
|
+
* Attempts specific rows right after the transaction that queued them
|
|
66
|
+
* committed, in groups that start together. Rows another worker already
|
|
67
|
+
* claimed, or that are not due, are skipped by the claim itself.
|
|
68
|
+
*/
|
|
69
|
+
deliverByIds(ids: readonly string[], now?: Date): Promise<number>;
|
|
70
|
+
/**
|
|
71
|
+
* Starts every claimed row at once (never more than
|
|
72
|
+
* {@link MAX_CONCURRENT_ATTEMPTS}). Strictly one by one, a single receiver
|
|
73
|
+
* that runs into its timeout held every other delivery back by that long
|
|
74
|
+
* (seen on the wrapper host: a 10 s timeout delayed an unrelated endpoint by
|
|
75
|
+
* 10 s). Each row still re-stamps and writes back under its own claim.
|
|
76
|
+
*/
|
|
77
|
+
private attemptTogether;
|
|
78
|
+
private attemptSafely;
|
|
79
|
+
private claim;
|
|
80
|
+
private attempt;
|
|
81
|
+
private resolveOutcome;
|
|
82
|
+
/**
|
|
83
|
+
* Sends one event to an endpoint exactly as a delivery attempt would —
|
|
84
|
+
* same refusals, allowlist, timeout, redirect handling and signature —
|
|
85
|
+
* without a delivery row, for an administrator's test send (ADR 18 §3.13).
|
|
86
|
+
* The endpoint may be disabled: testing before enabling is the point.
|
|
87
|
+
*/
|
|
88
|
+
sendTestEvent(entry: BPMWorkflowWebhookEndpointEntry, event: BPMWorkflowWebhookEvent): Promise<WorkflowWebhookTestOutcome>;
|
|
89
|
+
private sendEvent;
|
|
90
|
+
/**
|
|
91
|
+
* A request BPM refuses to send at all. These never become retryable: the
|
|
92
|
+
* same endpoint would return the same request next time. None of the
|
|
93
|
+
* details quote the URL.
|
|
94
|
+
*/
|
|
95
|
+
private readRequestRefusal;
|
|
96
|
+
private post;
|
|
97
|
+
private record;
|
|
98
|
+
/**
|
|
99
|
+
* The endpoint's display name for the timeline, which every reader of the
|
|
100
|
+
* instance sees; `null` when the endpoint is gone and the key must stand in.
|
|
101
|
+
*/
|
|
102
|
+
readEndpointLabel(row: Pick<WorkflowWebhookDeliveryEntity, 'endpointKey' | 'endpointVersion'>, manager?: EntityManager): Promise<string | null>;
|
|
103
|
+
/** Takes the claim over from `from` to `to`; `false` if it moved on. */
|
|
104
|
+
private moveClaim;
|
|
105
|
+
/**
|
|
106
|
+
* `base * 2^(attempt - 1)` with ±20 % jitter so a receiver that came back up
|
|
107
|
+
* is not hit by every queued delivery in the same second, then capped: the
|
|
108
|
+
* cap is a promise to the operator, so jitter may not exceed it.
|
|
109
|
+
*/
|
|
110
|
+
readRetryDelay(attempt: number): number;
|
|
111
|
+
/**
|
|
112
|
+
* Visible to everyone who can read the instance, so it carries the outcome
|
|
113
|
+
* and nothing else: no URL, no response body, no parameters.
|
|
114
|
+
*/
|
|
115
|
+
private createTerminalActivity;
|
|
116
|
+
}
|