@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,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkflowWebhookEndpointAuditEntity = exports.WorkflowWebhookEndpointAuditActionEnum = exports.WorkflowWebhookEndpointEntity = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const typeorm_1 = require("typeorm");
|
|
6
|
+
/**
|
|
7
|
+
* A NOTIFY webhook endpoint maintained by a BPM administrator (ADR 18
|
|
8
|
+
* §3.13). Not a GraphQL type: the admin view masks every header value and
|
|
9
|
+
* the signing secret, and only says whether they are set.
|
|
10
|
+
*/
|
|
11
|
+
let WorkflowWebhookEndpointEntity = class WorkflowWebhookEndpointEntity {
|
|
12
|
+
};
|
|
13
|
+
exports.WorkflowWebhookEndpointEntity = WorkflowWebhookEndpointEntity;
|
|
14
|
+
tslib_1.__decorate([
|
|
15
|
+
(0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
|
|
16
|
+
tslib_1.__metadata("design:type", String)
|
|
17
|
+
], WorkflowWebhookEndpointEntity.prototype, "id", void 0);
|
|
18
|
+
tslib_1.__decorate([
|
|
19
|
+
(0, typeorm_1.Column)('text'),
|
|
20
|
+
tslib_1.__metadata("design:type", String)
|
|
21
|
+
], WorkflowWebhookEndpointEntity.prototype, "key", void 0);
|
|
22
|
+
tslib_1.__decorate([
|
|
23
|
+
(0, typeorm_1.Column)('integer'),
|
|
24
|
+
tslib_1.__metadata("design:type", Number)
|
|
25
|
+
], WorkflowWebhookEndpointEntity.prototype, "version", void 0);
|
|
26
|
+
tslib_1.__decorate([
|
|
27
|
+
(0, typeorm_1.Column)('text'),
|
|
28
|
+
tslib_1.__metadata("design:type", String)
|
|
29
|
+
], WorkflowWebhookEndpointEntity.prototype, "label", void 0);
|
|
30
|
+
tslib_1.__decorate([
|
|
31
|
+
(0, typeorm_1.Column)('text', { nullable: true }),
|
|
32
|
+
tslib_1.__metadata("design:type", Object)
|
|
33
|
+
], WorkflowWebhookEndpointEntity.prototype, "description", void 0);
|
|
34
|
+
tslib_1.__decorate([
|
|
35
|
+
(0, typeorm_1.Column)('jsonb', { default: () => "'[]'::jsonb" }),
|
|
36
|
+
tslib_1.__metadata("design:type", Array)
|
|
37
|
+
], WorkflowWebhookEndpointEntity.prototype, "parameters", void 0);
|
|
38
|
+
tslib_1.__decorate([
|
|
39
|
+
(0, typeorm_1.Column)('text'),
|
|
40
|
+
tslib_1.__metadata("design:type", String)
|
|
41
|
+
], WorkflowWebhookEndpointEntity.prototype, "url", void 0);
|
|
42
|
+
tslib_1.__decorate([
|
|
43
|
+
(0, typeorm_1.Column)('text', { default: 'POST' }),
|
|
44
|
+
tslib_1.__metadata("design:type", String)
|
|
45
|
+
], WorkflowWebhookEndpointEntity.prototype, "method", void 0);
|
|
46
|
+
tslib_1.__decorate([
|
|
47
|
+
(0, typeorm_1.Column)('text', { name: 'encrypted_headers', nullable: true }),
|
|
48
|
+
tslib_1.__metadata("design:type", Object)
|
|
49
|
+
], WorkflowWebhookEndpointEntity.prototype, "encryptedHeaders", void 0);
|
|
50
|
+
tslib_1.__decorate([
|
|
51
|
+
(0, typeorm_1.Column)('text', { name: 'encrypted_signing_secret', nullable: true }),
|
|
52
|
+
tslib_1.__metadata("design:type", Object)
|
|
53
|
+
], WorkflowWebhookEndpointEntity.prototype, "encryptedSigningSecret", void 0);
|
|
54
|
+
tslib_1.__decorate([
|
|
55
|
+
(0, typeorm_1.Column)('integer', { name: 'timeout_ms', nullable: true }),
|
|
56
|
+
tslib_1.__metadata("design:type", Object)
|
|
57
|
+
], WorkflowWebhookEndpointEntity.prototype, "timeoutMs", void 0);
|
|
58
|
+
tslib_1.__decorate([
|
|
59
|
+
(0, typeorm_1.Column)('boolean', { default: true, name: 'is_active' }),
|
|
60
|
+
tslib_1.__metadata("design:type", Boolean)
|
|
61
|
+
], WorkflowWebhookEndpointEntity.prototype, "isActive", void 0);
|
|
62
|
+
tslib_1.__decorate([
|
|
63
|
+
(0, typeorm_1.Column)('boolean', { default: false }),
|
|
64
|
+
tslib_1.__metadata("design:type", Boolean)
|
|
65
|
+
], WorkflowWebhookEndpointEntity.prototype, "deprecated", void 0);
|
|
66
|
+
tslib_1.__decorate([
|
|
67
|
+
(0, typeorm_1.Column)('timestamptz', { name: 'secret_rotated_at', nullable: true }),
|
|
68
|
+
tslib_1.__metadata("design:type", Object)
|
|
69
|
+
], WorkflowWebhookEndpointEntity.prototype, "secretRotatedAt", void 0);
|
|
70
|
+
tslib_1.__decorate([
|
|
71
|
+
(0, typeorm_1.Column)('text', { name: 'created_by_member_id', nullable: true }),
|
|
72
|
+
tslib_1.__metadata("design:type", Object)
|
|
73
|
+
], WorkflowWebhookEndpointEntity.prototype, "createdByMemberId", void 0);
|
|
74
|
+
tslib_1.__decorate([
|
|
75
|
+
(0, typeorm_1.Column)('text', { name: 'updated_by_member_id', nullable: true }),
|
|
76
|
+
tslib_1.__metadata("design:type", Object)
|
|
77
|
+
], WorkflowWebhookEndpointEntity.prototype, "updatedByMemberId", void 0);
|
|
78
|
+
tslib_1.__decorate([
|
|
79
|
+
(0, typeorm_1.CreateDateColumn)({ name: 'created_at', type: 'timestamptz' }),
|
|
80
|
+
tslib_1.__metadata("design:type", Date)
|
|
81
|
+
], WorkflowWebhookEndpointEntity.prototype, "createdAt", void 0);
|
|
82
|
+
tslib_1.__decorate([
|
|
83
|
+
(0, typeorm_1.UpdateDateColumn)({ name: 'updated_at', type: 'timestamptz' }),
|
|
84
|
+
tslib_1.__metadata("design:type", Date)
|
|
85
|
+
], WorkflowWebhookEndpointEntity.prototype, "updatedAt", void 0);
|
|
86
|
+
exports.WorkflowWebhookEndpointEntity = WorkflowWebhookEndpointEntity = tslib_1.__decorate([
|
|
87
|
+
(0, typeorm_1.Entity)('workflow_webhook_endpoints'),
|
|
88
|
+
(0, typeorm_1.Index)('IDX_workflow_webhook_endpoints_active', ['isActive']),
|
|
89
|
+
(0, typeorm_1.Unique)('UQ_workflow_webhook_endpoints_key_version', ['key', 'version'])
|
|
90
|
+
], WorkflowWebhookEndpointEntity);
|
|
91
|
+
var WorkflowWebhookEndpointAuditActionEnum;
|
|
92
|
+
(function (WorkflowWebhookEndpointAuditActionEnum) {
|
|
93
|
+
WorkflowWebhookEndpointAuditActionEnum["CREATED"] = "CREATED";
|
|
94
|
+
WorkflowWebhookEndpointAuditActionEnum["DISABLED"] = "DISABLED";
|
|
95
|
+
WorkflowWebhookEndpointAuditActionEnum["ENABLED"] = "ENABLED";
|
|
96
|
+
WorkflowWebhookEndpointAuditActionEnum["SECRET_ROTATED"] = "SECRET_ROTATED";
|
|
97
|
+
WorkflowWebhookEndpointAuditActionEnum["TEST_SENT"] = "TEST_SENT";
|
|
98
|
+
WorkflowWebhookEndpointAuditActionEnum["UPDATED"] = "UPDATED";
|
|
99
|
+
})(WorkflowWebhookEndpointAuditActionEnum || (exports.WorkflowWebhookEndpointAuditActionEnum = WorkflowWebhookEndpointAuditActionEnum = {}));
|
|
100
|
+
/** Who changed which fields of an endpoint, and when. Never a value. */
|
|
101
|
+
let WorkflowWebhookEndpointAuditEntity = class WorkflowWebhookEndpointAuditEntity {
|
|
102
|
+
};
|
|
103
|
+
exports.WorkflowWebhookEndpointAuditEntity = WorkflowWebhookEndpointAuditEntity;
|
|
104
|
+
tslib_1.__decorate([
|
|
105
|
+
(0, typeorm_1.PrimaryGeneratedColumn)('uuid'),
|
|
106
|
+
tslib_1.__metadata("design:type", String)
|
|
107
|
+
], WorkflowWebhookEndpointAuditEntity.prototype, "id", void 0);
|
|
108
|
+
tslib_1.__decorate([
|
|
109
|
+
(0, typeorm_1.Column)('uuid', { name: 'endpoint_id' }),
|
|
110
|
+
tslib_1.__metadata("design:type", String)
|
|
111
|
+
], WorkflowWebhookEndpointAuditEntity.prototype, "endpointId", void 0);
|
|
112
|
+
tslib_1.__decorate([
|
|
113
|
+
(0, typeorm_1.Column)('text'),
|
|
114
|
+
tslib_1.__metadata("design:type", String)
|
|
115
|
+
], WorkflowWebhookEndpointAuditEntity.prototype, "action", void 0);
|
|
116
|
+
tslib_1.__decorate([
|
|
117
|
+
(0, typeorm_1.Column)('jsonb', { default: () => "'[]'::jsonb", name: 'changed_fields' }),
|
|
118
|
+
tslib_1.__metadata("design:type", Array)
|
|
119
|
+
], WorkflowWebhookEndpointAuditEntity.prototype, "changedFields", void 0);
|
|
120
|
+
tslib_1.__decorate([
|
|
121
|
+
(0, typeorm_1.Column)('text', { name: 'actor_member_id', nullable: true }),
|
|
122
|
+
tslib_1.__metadata("design:type", Object)
|
|
123
|
+
], WorkflowWebhookEndpointAuditEntity.prototype, "actorMemberId", void 0);
|
|
124
|
+
tslib_1.__decorate([
|
|
125
|
+
(0, typeorm_1.CreateDateColumn)({ name: 'created_at', type: 'timestamptz' }),
|
|
126
|
+
tslib_1.__metadata("design:type", Date)
|
|
127
|
+
], WorkflowWebhookEndpointAuditEntity.prototype, "createdAt", void 0);
|
|
128
|
+
exports.WorkflowWebhookEndpointAuditEntity = WorkflowWebhookEndpointAuditEntity = tslib_1.__decorate([
|
|
129
|
+
(0, typeorm_1.Entity)('workflow_webhook_endpoint_audits'),
|
|
130
|
+
(0, typeorm_1.Index)('IDX_workflow_webhook_endpoint_audits_endpoint', [
|
|
131
|
+
'endpointId',
|
|
132
|
+
'createdAt',
|
|
133
|
+
])
|
|
134
|
+
], WorkflowWebhookEndpointAuditEntity);
|
|
135
|
+
//# sourceMappingURL=workflow-webhook-endpoint.entity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-webhook-endpoint.entity.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-webhook/workflow-webhook-endpoint.entity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { WorkflowWebhookDeliveryStatusEnum } from './workflow-webhook-delivery.enums';
|
|
2
|
+
import { WorkflowWebhookFrozenEvent } from './workflow-webhook-delivery.entity';
|
|
3
|
+
import { BPMWorkflowWebhookEndpointEntry } from './workflow-webhook.types';
|
|
4
|
+
export interface WorkflowWebhookEnqueueContext {
|
|
5
|
+
readonly instance: {
|
|
6
|
+
readonly formData: Readonly<Record<string, unknown>>;
|
|
7
|
+
readonly id: string;
|
|
8
|
+
readonly initiatorMemberId: string;
|
|
9
|
+
readonly templateId: string;
|
|
10
|
+
readonly templateVersionId: string;
|
|
11
|
+
readonly title: string;
|
|
12
|
+
};
|
|
13
|
+
readonly node: {
|
|
14
|
+
readonly id: string;
|
|
15
|
+
readonly label: string;
|
|
16
|
+
};
|
|
17
|
+
readonly occurredAt: Date;
|
|
18
|
+
readonly tokenId: string;
|
|
19
|
+
}
|
|
20
|
+
/** The columns a queued delivery is created with. */
|
|
21
|
+
export interface WorkflowWebhookDeliveryDraft {
|
|
22
|
+
readonly endpointKey: string;
|
|
23
|
+
readonly endpointVersion: number;
|
|
24
|
+
readonly event: WorkflowWebhookFrozenEvent;
|
|
25
|
+
readonly instanceId: string;
|
|
26
|
+
readonly lastErrorCode: string | null;
|
|
27
|
+
readonly lastErrorDetail: string | null;
|
|
28
|
+
readonly nodeId: string;
|
|
29
|
+
readonly status: WorkflowWebhookDeliveryStatusEnum;
|
|
30
|
+
readonly targetId: string;
|
|
31
|
+
readonly tokenId: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Turns a NOTIFY node's webhook targets into delivery rows (ADR 18 §3.5).
|
|
35
|
+
*
|
|
36
|
+
* Runs inside the engine transaction, so it must never throw for anything a
|
|
37
|
+
* template or the submitted form can cause: a problem becomes a row that is
|
|
38
|
+
* already `FAILED`, recorded and visible to an administrator, and the approval
|
|
39
|
+
* that reached the node carries on. Parameters are resolved here, once, so
|
|
40
|
+
* every retry sends exactly what the node saw.
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildWorkflowWebhookDeliveryDrafts({ context, resolveEndpoint, targets, }: {
|
|
43
|
+
readonly context: WorkflowWebhookEnqueueContext;
|
|
44
|
+
readonly resolveEndpoint: (key: string, version: number) => Promise<BPMWorkflowWebhookEndpointEntry | null>;
|
|
45
|
+
readonly targets: unknown;
|
|
46
|
+
}): Promise<readonly WorkflowWebhookDeliveryDraft[]>;
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildWorkflowWebhookDeliveryDrafts = buildWorkflowWebhookDeliveryDrafts;
|
|
4
|
+
const workflow_graph_1 = require("@rytass/bpm-core-shared/workflow-graph");
|
|
5
|
+
const workflow_webhook_delivery_enums_1 = require("./workflow-webhook-delivery.enums");
|
|
6
|
+
/**
|
|
7
|
+
* Turns a NOTIFY node's webhook targets into delivery rows (ADR 18 §3.5).
|
|
8
|
+
*
|
|
9
|
+
* Runs inside the engine transaction, so it must never throw for anything a
|
|
10
|
+
* template or the submitted form can cause: a problem becomes a row that is
|
|
11
|
+
* already `FAILED`, recorded and visible to an administrator, and the approval
|
|
12
|
+
* that reached the node carries on. Parameters are resolved here, once, so
|
|
13
|
+
* every retry sends exactly what the node saw.
|
|
14
|
+
*/
|
|
15
|
+
async function buildWorkflowWebhookDeliveryDrafts({ context, resolveEndpoint, targets, }) {
|
|
16
|
+
const issues = (0, workflow_graph_1.readNotifyWebhookStructureIssues)(targets);
|
|
17
|
+
// The snapshot passed publish, so this only guards against a definition
|
|
18
|
+
// written around the lint. A malformed list has nothing safe to deliver.
|
|
19
|
+
if (!Array.isArray(targets) ||
|
|
20
|
+
issues.some((issue) => issue.targetIndex === null)) {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
const malformed = new Set(issues.map((issue) => issue.targetIndex));
|
|
24
|
+
const wellFormed = targets.filter((_target, index) => !malformed.has(index));
|
|
25
|
+
return Promise.all(wellFormed.map(async (target) => {
|
|
26
|
+
// A host registry that throws must not roll back the approval that
|
|
27
|
+
// reached this node; the row records the failure instead.
|
|
28
|
+
const lookup = await resolveEndpoint(target.endpoint.key, target.endpoint.version).then((value) => ({ entry: value, lookupFailed: false }), () => ({ entry: null, lookupFailed: true }));
|
|
29
|
+
const entry = lookup.entry;
|
|
30
|
+
const parameters = entry
|
|
31
|
+
? resolveParameters(target.bindings, entry.endpoint.descriptor.parameters, context)
|
|
32
|
+
: { issue: null, values: {} };
|
|
33
|
+
const failure = lookup.lookupFailed
|
|
34
|
+
? {
|
|
35
|
+
code: workflow_webhook_delivery_enums_1.WORKFLOW_WEBHOOK_DELIVERY_ERROR_CODES.ENDPOINT_LOOKUP_FAILED,
|
|
36
|
+
detail: `${target.endpoint.key}@${target.endpoint.version} could not be looked up`,
|
|
37
|
+
}
|
|
38
|
+
: !entry
|
|
39
|
+
? {
|
|
40
|
+
code: workflow_webhook_delivery_enums_1.WORKFLOW_WEBHOOK_DELIVERY_ERROR_CODES.ENDPOINT_MISSING,
|
|
41
|
+
detail: `${target.endpoint.key}@${target.endpoint.version} is not registered`,
|
|
42
|
+
}
|
|
43
|
+
: entry.endpoint.descriptor.disabled
|
|
44
|
+
? {
|
|
45
|
+
code: workflow_webhook_delivery_enums_1.WORKFLOW_WEBHOOK_DELIVERY_ERROR_CODES.ENDPOINT_DISABLED,
|
|
46
|
+
detail: `${target.endpoint.key}@${target.endpoint.version} is disabled`,
|
|
47
|
+
}
|
|
48
|
+
: parameters.issue
|
|
49
|
+
? {
|
|
50
|
+
code: workflow_webhook_delivery_enums_1.WORKFLOW_WEBHOOK_DELIVERY_ERROR_CODES.PARAMETER_INVALID,
|
|
51
|
+
detail: parameters.issue,
|
|
52
|
+
}
|
|
53
|
+
: null;
|
|
54
|
+
return {
|
|
55
|
+
endpointKey: target.endpoint.key,
|
|
56
|
+
endpointVersion: target.endpoint.version,
|
|
57
|
+
event: {
|
|
58
|
+
endpoint: {
|
|
59
|
+
key: target.endpoint.key,
|
|
60
|
+
version: target.endpoint.version,
|
|
61
|
+
},
|
|
62
|
+
initiator: { memberId: context.instance.initiatorMemberId },
|
|
63
|
+
instance: {
|
|
64
|
+
id: context.instance.id,
|
|
65
|
+
templateId: context.instance.templateId,
|
|
66
|
+
templateVersionId: context.instance.templateVersionId,
|
|
67
|
+
title: context.instance.title,
|
|
68
|
+
},
|
|
69
|
+
node: { id: context.node.id, label: context.node.label },
|
|
70
|
+
occurredAt: context.occurredAt.toISOString(),
|
|
71
|
+
parameters: parameters.values,
|
|
72
|
+
},
|
|
73
|
+
instanceId: context.instance.id,
|
|
74
|
+
lastErrorCode: failure?.code ?? null,
|
|
75
|
+
lastErrorDetail: failure?.detail ?? null,
|
|
76
|
+
nodeId: context.node.id,
|
|
77
|
+
status: failure
|
|
78
|
+
? workflow_webhook_delivery_enums_1.WorkflowWebhookDeliveryStatusEnum.FAILED
|
|
79
|
+
: workflow_webhook_delivery_enums_1.WorkflowWebhookDeliveryStatusEnum.PENDING,
|
|
80
|
+
targetId: target.id,
|
|
81
|
+
tokenId: context.tokenId,
|
|
82
|
+
};
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
function resolveParameters(bindings, declared, context) {
|
|
86
|
+
const resolved = declared.flatMap((parameter) => {
|
|
87
|
+
const binding = bindings.find((candidate) => candidate.parameter === parameter.key);
|
|
88
|
+
return binding
|
|
89
|
+
? [{ parameter, value: readBindingValue(binding, context) }]
|
|
90
|
+
: [];
|
|
91
|
+
});
|
|
92
|
+
const issue = declared
|
|
93
|
+
.map((parameter) => {
|
|
94
|
+
const match = resolved.find((candidate) => candidate.parameter.key === parameter.key);
|
|
95
|
+
const value = match?.value ?? null;
|
|
96
|
+
if (parameter.required && value === null) {
|
|
97
|
+
return `parameter "${parameter.key}" is required but resolved to no value`;
|
|
98
|
+
}
|
|
99
|
+
return match &&
|
|
100
|
+
!(0, workflow_graph_1.isNotifyWebhookValueCompatibleWithParameter)(value, parameter.type)
|
|
101
|
+
? `parameter "${parameter.key}" expects ${parameter.type}`
|
|
102
|
+
: null;
|
|
103
|
+
})
|
|
104
|
+
.find((candidate) => candidate !== null) ?? null;
|
|
105
|
+
return {
|
|
106
|
+
issue,
|
|
107
|
+
values: Object.fromEntries(resolved.map(({ parameter, value }) => [parameter.key, value])),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function readBindingValue(binding, context) {
|
|
111
|
+
const from = binding.from;
|
|
112
|
+
if (from.kind === 'CONSTANT') {
|
|
113
|
+
return from.value;
|
|
114
|
+
}
|
|
115
|
+
if (from.kind === 'FIELD') {
|
|
116
|
+
return Object.prototype.hasOwnProperty.call(context.instance.formData, from.fieldKey)
|
|
117
|
+
? (context.instance.formData[from.fieldKey] ?? null)
|
|
118
|
+
: null;
|
|
119
|
+
}
|
|
120
|
+
return readContextValue(from.path, context);
|
|
121
|
+
}
|
|
122
|
+
function readContextValue(path, context) {
|
|
123
|
+
const values = {
|
|
124
|
+
'initiator.memberId': context.instance.initiatorMemberId,
|
|
125
|
+
'instance.id': context.instance.id,
|
|
126
|
+
'instance.templateId': context.instance.templateId,
|
|
127
|
+
'instance.templateVersionId': context.instance.templateVersionId,
|
|
128
|
+
'instance.title': context.instance.title,
|
|
129
|
+
'node.id': context.node.id,
|
|
130
|
+
'node.label': context.node.label,
|
|
131
|
+
};
|
|
132
|
+
return values[path];
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=workflow-webhook-enqueue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-webhook-enqueue.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-webhook/workflow-webhook-enqueue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { InjectionToken } from '@nestjs/common';
|
|
2
|
+
import { ParsedWorkflowWebhookUrlPattern } from './workflow-webhook-allowlist';
|
|
3
|
+
import { BPMWorkflowWebhookEndpointSourceKind } from './workflow-webhook.types';
|
|
4
|
+
/**
|
|
5
|
+
* Flattened webhook settings on `BPMRootModule`, alongside the notification
|
|
6
|
+
* ones (ADR 18 §3.13).
|
|
7
|
+
*/
|
|
8
|
+
export interface BPMRootWorkflowWebhookOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Where NOTIFY webhook endpoints may come from. Defaults to `['REGISTRY']`,
|
|
11
|
+
* so an existing host keeps exactly the endpoints its code registers.
|
|
12
|
+
*
|
|
13
|
+
* `DATABASE` additionally needs a non-empty
|
|
14
|
+
* {@link BPMRootWorkflowWebhookOptions.workflowWebhookAllowedUrlPatterns}
|
|
15
|
+
* and a {@link BPMRootWorkflowWebhookOptions.workflowWebhookSecretEncryptionKey};
|
|
16
|
+
* without them the source stays off rather than running unguarded.
|
|
17
|
+
*/
|
|
18
|
+
readonly workflowWebhookTargetSources?: readonly BPMWorkflowWebhookEndpointSourceKind[];
|
|
19
|
+
/**
|
|
20
|
+
* URLs webhook endpoints may call, as patterns (`https://*.example.com/hooks/*`).
|
|
21
|
+
*
|
|
22
|
+
* An invalid pattern fails the application at boot. An empty list is not
|
|
23
|
+
* "allow everything": it means the `DATABASE` source cannot be enabled.
|
|
24
|
+
*/
|
|
25
|
+
readonly workflowWebhookAllowedUrlPatterns?: readonly string[];
|
|
26
|
+
/**
|
|
27
|
+
* Also check `REGISTRY` endpoints against the allowlist. Off by default,
|
|
28
|
+
* because those URLs come from host code rather than from a form.
|
|
29
|
+
*/
|
|
30
|
+
readonly workflowWebhookEnforceAllowlistForRegistry?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Key used to encrypt header values and signing secrets of
|
|
33
|
+
* database-managed endpoints (P6). Expected to come from the host's secret
|
|
34
|
+
* store; 32 bytes, hex or base64.
|
|
35
|
+
*/
|
|
36
|
+
readonly workflowWebhookSecretEncryptionKey?: string;
|
|
37
|
+
/**
|
|
38
|
+
* Runs the background scan that retries and releases queued deliveries.
|
|
39
|
+
* Omitted: on whenever at least one endpoint is registered, because without
|
|
40
|
+
* it a failed delivery would never be retried. Always off under
|
|
41
|
+
* `NODE_ENV=test`.
|
|
42
|
+
*/
|
|
43
|
+
readonly workflowWebhookDeliverySchedulerEnabled?: boolean;
|
|
44
|
+
/** How often the scheduler scans for due deliveries. Default 15 000 ms. */
|
|
45
|
+
readonly workflowWebhookDeliveryScanIntervalMs?: number;
|
|
46
|
+
/** Deliveries claimed per scan. Default 25. */
|
|
47
|
+
readonly workflowWebhookDeliveryBatchSize?: number;
|
|
48
|
+
/** Attempts before a retryable failure becomes `FAILED`. Default 6. */
|
|
49
|
+
readonly workflowWebhookDeliveryMaxAttempts?: number;
|
|
50
|
+
/**
|
|
51
|
+
* First retry delay; each further attempt doubles it, with ±20 % jitter.
|
|
52
|
+
* Default 30 000 ms.
|
|
53
|
+
*/
|
|
54
|
+
readonly workflowWebhookDeliveryRetryBaseDelayMs?: number;
|
|
55
|
+
/** Ceiling for a single retry delay. Default 3 600 000 ms (1 hour). */
|
|
56
|
+
readonly workflowWebhookDeliveryMaxRetryDelayMs?: number;
|
|
57
|
+
/**
|
|
58
|
+
* Request timeout when the endpoint does not set one. Default 10 000 ms.
|
|
59
|
+
* An endpoint's own `timeoutMs` is capped at
|
|
60
|
+
* {@link WORKFLOW_WEBHOOK_MAX_TIMEOUT_MS}.
|
|
61
|
+
*/
|
|
62
|
+
readonly workflowWebhookDeliveryDefaultTimeoutMs?: number;
|
|
63
|
+
}
|
|
64
|
+
/** No single request may hold a delivery longer than this (ADR 18 §3.6). */
|
|
65
|
+
export declare const WORKFLOW_WEBHOOK_MAX_TIMEOUT_MS = 30000;
|
|
66
|
+
export interface BPMResolvedWorkflowWebhookDeliveryOptions {
|
|
67
|
+
readonly batchSize: number;
|
|
68
|
+
readonly defaultTimeoutMs: number;
|
|
69
|
+
readonly maxAttempts: number;
|
|
70
|
+
readonly maxRetryDelayMs: number;
|
|
71
|
+
readonly retryBaseDelayMs: number;
|
|
72
|
+
readonly scanIntervalMs: number;
|
|
73
|
+
/** `null` means "decide from the catalog at boot". */
|
|
74
|
+
readonly schedulerEnabled: boolean | null;
|
|
75
|
+
}
|
|
76
|
+
export interface BPMResolvedWorkflowWebhookOptions {
|
|
77
|
+
readonly allowedUrlPatterns: readonly ParsedWorkflowWebhookUrlPattern[];
|
|
78
|
+
readonly delivery: BPMResolvedWorkflowWebhookDeliveryOptions;
|
|
79
|
+
readonly enforceAllowlistForRegistry: boolean;
|
|
80
|
+
readonly secretEncryptionKey: string | null;
|
|
81
|
+
readonly targetSources: readonly BPMWorkflowWebhookEndpointSourceKind[];
|
|
82
|
+
}
|
|
83
|
+
export declare const BPM_WORKFLOW_WEBHOOK_OPTIONS: InjectionToken<BPMResolvedWorkflowWebhookOptions>;
|
|
84
|
+
export declare const DEFAULT_BPM_WORKFLOW_WEBHOOK_OPTIONS: BPMResolvedWorkflowWebhookOptions;
|
|
85
|
+
export declare function resolveBPMWorkflowWebhookOptions(options?: BPMRootWorkflowWebhookOptions): BPMResolvedWorkflowWebhookOptions;
|
|
86
|
+
export declare function readDisabledWorkflowWebhookSourceReason(options: BPMRootWorkflowWebhookOptions, resolved: BPMResolvedWorkflowWebhookOptions): string | null;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DEFAULT_BPM_WORKFLOW_WEBHOOK_OPTIONS = exports.BPM_WORKFLOW_WEBHOOK_OPTIONS = exports.WORKFLOW_WEBHOOK_MAX_TIMEOUT_MS = void 0;
|
|
4
|
+
exports.resolveBPMWorkflowWebhookOptions = resolveBPMWorkflowWebhookOptions;
|
|
5
|
+
exports.readDisabledWorkflowWebhookSourceReason = readDisabledWorkflowWebhookSourceReason;
|
|
6
|
+
const workflow_webhook_allowlist_1 = require("./workflow-webhook-allowlist");
|
|
7
|
+
const workflow_webhook_secret_cipher_1 = require("./workflow-webhook-secret-cipher");
|
|
8
|
+
/** No single request may hold a delivery longer than this (ADR 18 §3.6). */
|
|
9
|
+
exports.WORKFLOW_WEBHOOK_MAX_TIMEOUT_MS = 30_000;
|
|
10
|
+
exports.BPM_WORKFLOW_WEBHOOK_OPTIONS = Symbol('BPM_WORKFLOW_WEBHOOK_OPTIONS');
|
|
11
|
+
exports.DEFAULT_BPM_WORKFLOW_WEBHOOK_OPTIONS = {
|
|
12
|
+
allowedUrlPatterns: [],
|
|
13
|
+
delivery: {
|
|
14
|
+
batchSize: 25,
|
|
15
|
+
defaultTimeoutMs: 10_000,
|
|
16
|
+
maxAttempts: 6,
|
|
17
|
+
maxRetryDelayMs: 3_600_000,
|
|
18
|
+
retryBaseDelayMs: 30_000,
|
|
19
|
+
scanIntervalMs: 15_000,
|
|
20
|
+
schedulerEnabled: null,
|
|
21
|
+
},
|
|
22
|
+
enforceAllowlistForRegistry: false,
|
|
23
|
+
secretEncryptionKey: null,
|
|
24
|
+
targetSources: ['REGISTRY'],
|
|
25
|
+
};
|
|
26
|
+
function resolveBPMWorkflowWebhookOptions(options = {}) {
|
|
27
|
+
const { errors, patterns } = (0, workflow_webhook_allowlist_1.parseWorkflowWebhookUrlPatterns)(options.workflowWebhookAllowedUrlPatterns ?? []);
|
|
28
|
+
if (errors.length) {
|
|
29
|
+
throw new Error(errors.join('; '));
|
|
30
|
+
}
|
|
31
|
+
const requestedSources = options.workflowWebhookTargetSources ??
|
|
32
|
+
exports.DEFAULT_BPM_WORKFLOW_WEBHOOK_OPTIONS.targetSources;
|
|
33
|
+
const secretEncryptionKey = options.workflowWebhookSecretEncryptionKey?.trim() || null;
|
|
34
|
+
// A key that is set but unusable fails the boot, like an invalid pattern:
|
|
35
|
+
// encrypting with it would lock the values away for good.
|
|
36
|
+
if (secretEncryptionKey) {
|
|
37
|
+
(0, workflow_webhook_secret_cipher_1.parseWorkflowWebhookSecretKey)(secretEncryptionKey);
|
|
38
|
+
}
|
|
39
|
+
const defaults = exports.DEFAULT_BPM_WORKFLOW_WEBHOOK_OPTIONS.delivery;
|
|
40
|
+
return {
|
|
41
|
+
allowedUrlPatterns: patterns,
|
|
42
|
+
delivery: {
|
|
43
|
+
batchSize: readPositiveInteger(options.workflowWebhookDeliveryBatchSize, defaults.batchSize),
|
|
44
|
+
defaultTimeoutMs: Math.min(readPositiveInteger(options.workflowWebhookDeliveryDefaultTimeoutMs, defaults.defaultTimeoutMs), exports.WORKFLOW_WEBHOOK_MAX_TIMEOUT_MS),
|
|
45
|
+
maxAttempts: readPositiveInteger(options.workflowWebhookDeliveryMaxAttempts, defaults.maxAttempts),
|
|
46
|
+
maxRetryDelayMs: readPositiveInteger(options.workflowWebhookDeliveryMaxRetryDelayMs, defaults.maxRetryDelayMs),
|
|
47
|
+
retryBaseDelayMs: readPositiveInteger(options.workflowWebhookDeliveryRetryBaseDelayMs, defaults.retryBaseDelayMs),
|
|
48
|
+
scanIntervalMs: readPositiveInteger(options.workflowWebhookDeliveryScanIntervalMs, defaults.scanIntervalMs),
|
|
49
|
+
schedulerEnabled: typeof options.workflowWebhookDeliverySchedulerEnabled === 'boolean'
|
|
50
|
+
? options.workflowWebhookDeliverySchedulerEnabled
|
|
51
|
+
: null,
|
|
52
|
+
},
|
|
53
|
+
enforceAllowlistForRegistry: Boolean(options.workflowWebhookEnforceAllowlistForRegistry),
|
|
54
|
+
secretEncryptionKey,
|
|
55
|
+
targetSources: resolveTargetSources(requestedSources, patterns.length > 0, Boolean(secretEncryptionKey)),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* The database source is refused rather than silently downgraded when its
|
|
60
|
+
* guards are missing, but refusing to boot would strand a host that turned it
|
|
61
|
+
* on before wiring Vault. It is dropped from the resolved list instead, and
|
|
62
|
+
* `readDisabledWorkflowWebhookSourceReason` explains why for the log.
|
|
63
|
+
*/
|
|
64
|
+
function resolveTargetSources(requested, hasAllowlist, hasEncryptionKey) {
|
|
65
|
+
const unique = [...new Set(requested)];
|
|
66
|
+
return unique.filter((source) => source !== 'DATABASE' || (hasAllowlist && hasEncryptionKey));
|
|
67
|
+
}
|
|
68
|
+
function readDisabledWorkflowWebhookSourceReason(options, resolved) {
|
|
69
|
+
const requestedDatabase = (options.workflowWebhookTargetSources ?? []).includes('DATABASE');
|
|
70
|
+
if (!requestedDatabase || resolved.targetSources.includes('DATABASE')) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
const missing = [
|
|
74
|
+
...(resolved.allowedUrlPatterns.length
|
|
75
|
+
? []
|
|
76
|
+
: ['workflowWebhookAllowedUrlPatterns']),
|
|
77
|
+
...(resolved.secretEncryptionKey
|
|
78
|
+
? []
|
|
79
|
+
: ['workflowWebhookSecretEncryptionKey']),
|
|
80
|
+
];
|
|
81
|
+
return `DATABASE webhook endpoints are disabled: ${missing.join(' and ')} must be set`;
|
|
82
|
+
}
|
|
83
|
+
function readPositiveInteger(value, fallback) {
|
|
84
|
+
return typeof value === 'number' && Number.isInteger(value) && value > 0
|
|
85
|
+
? value
|
|
86
|
+
: fallback;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=workflow-webhook-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-webhook-options.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-webhook/workflow-webhook-options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { DynamicModule, InjectionToken } from '@nestjs/common';
|
|
2
|
+
import { ModuleMetadata } from '@nestjs/common/interfaces';
|
|
3
|
+
import { BPMResolvedWorkflowWebhookOptions, BPMRootWorkflowWebhookOptions } from './workflow-webhook-options';
|
|
4
|
+
/**
|
|
5
|
+
* Resolves the options and says why a requested `DATABASE` source was
|
|
6
|
+
* dropped. The reason needs the raw input as well as the resolved result, so
|
|
7
|
+
* this is the one place both exist; without it the source would vanish
|
|
8
|
+
* silently and publish would only report that no source is configured.
|
|
9
|
+
*/
|
|
10
|
+
export declare function resolveAndReportWorkflowWebhookOptions(options: BPMRootWorkflowWebhookOptions): BPMResolvedWorkflowWebhookOptions;
|
|
11
|
+
export interface WorkflowWebhookOptionsModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
|
|
12
|
+
readonly inject?: readonly InjectionToken[];
|
|
13
|
+
readonly useFactory: (...args: readonly unknown[]) => BPMRootWorkflowWebhookOptions | Promise<BPMRootWorkflowWebhookOptions>;
|
|
14
|
+
}
|
|
15
|
+
export declare class WorkflowWebhookOptionsModule {
|
|
16
|
+
static forRoot(options?: BPMRootWorkflowWebhookOptions): DynamicModule;
|
|
17
|
+
static forRootAsync(options: WorkflowWebhookOptionsModuleAsyncOptions): DynamicModule;
|
|
18
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var WorkflowWebhookOptionsModule_1;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.WorkflowWebhookOptionsModule = void 0;
|
|
5
|
+
exports.resolveAndReportWorkflowWebhookOptions = resolveAndReportWorkflowWebhookOptions;
|
|
6
|
+
const tslib_1 = require("tslib");
|
|
7
|
+
const common_1 = require("@nestjs/common");
|
|
8
|
+
const workflow_webhook_options_1 = require("./workflow-webhook-options");
|
|
9
|
+
const logger = new common_1.Logger('WorkflowWebhookOptions');
|
|
10
|
+
/**
|
|
11
|
+
* Resolves the options and says why a requested `DATABASE` source was
|
|
12
|
+
* dropped. The reason needs the raw input as well as the resolved result, so
|
|
13
|
+
* this is the one place both exist; without it the source would vanish
|
|
14
|
+
* silently and publish would only report that no source is configured.
|
|
15
|
+
*/
|
|
16
|
+
function resolveAndReportWorkflowWebhookOptions(options) {
|
|
17
|
+
const resolved = (0, workflow_webhook_options_1.resolveBPMWorkflowWebhookOptions)(options);
|
|
18
|
+
const reason = (0, workflow_webhook_options_1.readDisabledWorkflowWebhookSourceReason)(options, resolved);
|
|
19
|
+
if (reason) {
|
|
20
|
+
logger.warn(reason);
|
|
21
|
+
}
|
|
22
|
+
return resolved;
|
|
23
|
+
}
|
|
24
|
+
let WorkflowWebhookOptionsModule = WorkflowWebhookOptionsModule_1 = class WorkflowWebhookOptionsModule {
|
|
25
|
+
static forRoot(options = {}) {
|
|
26
|
+
return {
|
|
27
|
+
exports: [workflow_webhook_options_1.BPM_WORKFLOW_WEBHOOK_OPTIONS],
|
|
28
|
+
module: WorkflowWebhookOptionsModule_1,
|
|
29
|
+
providers: [
|
|
30
|
+
{
|
|
31
|
+
provide: workflow_webhook_options_1.BPM_WORKFLOW_WEBHOOK_OPTIONS,
|
|
32
|
+
useValue: resolveAndReportWorkflowWebhookOptions(options),
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
static forRootAsync(options) {
|
|
38
|
+
return {
|
|
39
|
+
exports: [workflow_webhook_options_1.BPM_WORKFLOW_WEBHOOK_OPTIONS],
|
|
40
|
+
imports: options.imports,
|
|
41
|
+
module: WorkflowWebhookOptionsModule_1,
|
|
42
|
+
providers: [
|
|
43
|
+
{
|
|
44
|
+
inject: [...(options.inject ?? [])],
|
|
45
|
+
provide: workflow_webhook_options_1.BPM_WORKFLOW_WEBHOOK_OPTIONS,
|
|
46
|
+
useFactory: async (...args) => resolveAndReportWorkflowWebhookOptions(await options.useFactory(...args)),
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
exports.WorkflowWebhookOptionsModule = WorkflowWebhookOptionsModule;
|
|
53
|
+
exports.WorkflowWebhookOptionsModule = WorkflowWebhookOptionsModule = WorkflowWebhookOptionsModule_1 = tslib_1.__decorate([
|
|
54
|
+
(0, common_1.Global)(),
|
|
55
|
+
(0, common_1.Module)({})
|
|
56
|
+
], WorkflowWebhookOptionsModule);
|
|
57
|
+
//# sourceMappingURL=workflow-webhook-options.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-webhook-options.module.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-webhook/workflow-webhook-options.module.ts"],"names":[],"mappings":";;;;AAwBA,wFAWC;;AAnCD,2CAMwB;AAExB,yEAMoC;AAEpC,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC,wBAAwB,CAAC,CAAC;AAEpD;;;;;GAKG;AACH,SAAgB,sCAAsC,CACpD,OAAsC;IAEtC,MAAM,QAAQ,GAAG,IAAA,2DAAgC,EAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,IAAA,kEAAuC,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAE1E,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAcM,IAAM,4BAA4B,oCAAlC,MAAM,4BAA4B;IACvC,MAAM,CAAC,OAAO,CAAC,UAAyC,EAAE;QACxD,OAAO;YACL,OAAO,EAAE,CAAC,uDAA4B,CAAC;YACvC,MAAM,EAAE,8BAA4B;YACpC,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,uDAA4B;oBACrC,QAAQ,EAAE,sCAAsC,CAAC,OAAO,CAAC;iBAC1D;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,YAAY,CACjB,OAAiD;QAEjD,OAAO;YACL,OAAO,EAAE,CAAC,uDAA4B,CAAC;YACvC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,MAAM,EAAE,8BAA4B;YACpC,SAAS,EAAE;gBACT;oBACE,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;oBACnC,OAAO,EAAE,uDAA4B;oBACrC,UAAU,EAAE,KAAK,EACf,GAAG,IAAwB,EACiB,EAAE,CAC9C,sCAAsC,CACpC,MAAM,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAClC;iBACJ;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAnCY,oEAA4B;uCAA5B,4BAA4B;IAFxC,IAAA,eAAM,GAAE;IACR,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,4BAA4B,CAmCxC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads `workflowWebhookSecretEncryptionKey`: 32 bytes as 64 hex characters or
|
|
3
|
+
* base64. Anything else throws at boot, because a key that silently decodes
|
|
4
|
+
* to the wrong length would encrypt everything with a key nobody can
|
|
5
|
+
* reproduce. The message never echoes the key.
|
|
6
|
+
*/
|
|
7
|
+
export declare function parseWorkflowWebhookSecretKey(value: string): Buffer;
|
|
8
|
+
/**
|
|
9
|
+
* AES-256-GCM for the header values and signing secrets of database-managed
|
|
10
|
+
* webhook endpoints (ADR 18 §3.13). The envelope is
|
|
11
|
+
* `v1:<base64(iv | tag | ciphertext)>`, so a future key or algorithm change
|
|
12
|
+
* can tell old values apart. Decryption fails loudly on a wrong key or a
|
|
13
|
+
* tampered value instead of returning garbage.
|
|
14
|
+
*/
|
|
15
|
+
export declare class WorkflowWebhookSecretCipher {
|
|
16
|
+
private readonly key;
|
|
17
|
+
constructor(key: string);
|
|
18
|
+
encrypt(plaintext: string): string;
|
|
19
|
+
decrypt(envelope: string): string;
|
|
20
|
+
}
|