@rytass/bpm-core-nestjs-module 0.13.3 → 0.13.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/package.json +14 -7
  3. package/src/index.d.ts +1 -0
  4. package/src/index.js +1 -0
  5. package/src/index.js.map +1 -1
  6. package/src/lib/attachment/attachment-storage.provider.d.ts +11 -0
  7. package/src/lib/attachment/attachment-storage.provider.js +15 -1
  8. package/src/lib/attachment/attachment-storage.provider.js.map +1 -1
  9. package/src/lib/bpm/bpm-root-options.d.ts +134 -0
  10. package/src/lib/bpm/bpm-root-options.js +61 -0
  11. package/src/lib/bpm/bpm-root-options.js.map +1 -0
  12. package/src/lib/bpm/bpm-root.module.d.ts +101 -137
  13. package/src/lib/bpm/bpm-root.module.js +83 -118
  14. package/src/lib/bpm/bpm-root.module.js.map +1 -1
  15. package/src/lib/bpm/index.d.ts +1 -0
  16. package/src/lib/bpm/index.js +1 -0
  17. package/src/lib/bpm/index.js.map +1 -1
  18. package/src/lib/calendar/business-calendar.provider.d.ts +8 -4
  19. package/src/lib/calendar/business-calendar.provider.js +15 -6
  20. package/src/lib/calendar/business-calendar.provider.js.map +1 -1
  21. package/src/lib/common/outbox.d.ts +26 -0
  22. package/src/lib/common/outbox.js +64 -0
  23. package/src/lib/common/outbox.js.map +1 -0
  24. package/src/lib/delegation/delegation.service.js +7 -7
  25. package/src/lib/delegation/delegation.service.js.map +1 -1
  26. package/src/lib/form-data-source/form-data-source.module.js +2 -4
  27. package/src/lib/form-data-source/form-data-source.module.js.map +1 -1
  28. package/src/lib/form-data-source/form-data-source.provider.d.ts +14 -0
  29. package/src/lib/form-data-source/form-data-source.provider.js +23 -0
  30. package/src/lib/form-data-source/form-data-source.provider.js.map +1 -0
  31. package/src/lib/form-data-source/index.d.ts +1 -0
  32. package/src/lib/form-data-source/index.js +1 -0
  33. package/src/lib/form-data-source/index.js.map +1 -1
  34. package/src/lib/identity/default-member-resolver.d.ts +39 -0
  35. package/src/lib/identity/default-member-resolver.js +81 -0
  36. package/src/lib/identity/default-member-resolver.js.map +1 -0
  37. package/src/lib/identity/identity.module.d.ts +12 -2
  38. package/src/lib/identity/identity.module.js +2 -1
  39. package/src/lib/identity/identity.module.js.map +1 -1
  40. package/src/lib/identity/index.d.ts +1 -0
  41. package/src/lib/identity/index.js +1 -0
  42. package/src/lib/identity/index.js.map +1 -1
  43. package/src/lib/migrations/0000000023000-workflow-webhook-deliveries.d.ts +17 -0
  44. package/src/lib/migrations/0000000023000-workflow-webhook-deliveries.js +61 -0
  45. package/src/lib/migrations/0000000023000-workflow-webhook-deliveries.js.map +1 -0
  46. package/src/lib/migrations/0000000024000-workflow-webhook-endpoints.d.ts +16 -0
  47. package/src/lib/migrations/0000000024000-workflow-webhook-endpoints.js +71 -0
  48. package/src/lib/migrations/0000000024000-workflow-webhook-endpoints.js.map +1 -0
  49. package/src/lib/migrations/index.d.ts +2 -0
  50. package/src/lib/migrations/index.js +6 -0
  51. package/src/lib/migrations/index.js.map +1 -1
  52. package/src/lib/notification/notification-delivery.service.js +4 -57
  53. package/src/lib/notification/notification-delivery.service.js.map +1 -1
  54. package/src/lib/notification/notification.service.js +4 -3
  55. package/src/lib/notification/notification.service.js.map +1 -1
  56. package/src/lib/template/template.service.d.ts +9 -0
  57. package/src/lib/template/template.service.js +31 -0
  58. package/src/lib/template/template.service.js.map +1 -1
  59. package/src/lib/template/workflow-definition.validator.js +54 -1
  60. package/src/lib/template/workflow-definition.validator.js.map +1 -1
  61. package/src/lib/workflow-engine/workflow-engine.enums.d.ts +3 -1
  62. package/src/lib/workflow-engine/workflow-engine.enums.js +2 -0
  63. package/src/lib/workflow-engine/workflow-engine.enums.js.map +1 -1
  64. package/src/lib/workflow-engine/workflow-engine.module.js +3 -0
  65. package/src/lib/workflow-engine/workflow-engine.module.js.map +1 -1
  66. package/src/lib/workflow-engine/workflow-engine.service.d.ts +5 -2
  67. package/src/lib/workflow-engine/workflow-engine.service.js +150 -26
  68. package/src/lib/workflow-engine/workflow-engine.service.js.map +1 -1
  69. package/src/lib/workflow-webhook/index.d.ts +24 -0
  70. package/src/lib/workflow-webhook/index.js +28 -0
  71. package/src/lib/workflow-webhook/index.js.map +1 -0
  72. package/src/lib/workflow-webhook/workflow-webhook-allowlist.d.ts +38 -0
  73. package/src/lib/workflow-webhook/workflow-webhook-allowlist.js +296 -0
  74. package/src/lib/workflow-webhook/workflow-webhook-allowlist.js.map +1 -0
  75. package/src/lib/workflow-webhook/workflow-webhook-database-source.d.ts +33 -0
  76. package/src/lib/workflow-webhook/workflow-webhook-database-source.js +129 -0
  77. package/src/lib/workflow-webhook/workflow-webhook-database-source.js.map +1 -0
  78. package/src/lib/workflow-webhook/workflow-webhook-delivery-scheduler.service.d.ts +25 -0
  79. package/src/lib/workflow-webhook/workflow-webhook-delivery-scheduler.service.js +92 -0
  80. package/src/lib/workflow-webhook/workflow-webhook-delivery-scheduler.service.js.map +1 -0
  81. package/src/lib/workflow-webhook/workflow-webhook-delivery.entity.d.ts +53 -0
  82. package/src/lib/workflow-webhook/workflow-webhook-delivery.entity.js +97 -0
  83. package/src/lib/workflow-webhook/workflow-webhook-delivery.entity.js.map +1 -0
  84. package/src/lib/workflow-webhook/workflow-webhook-delivery.enums.d.ts +28 -0
  85. package/src/lib/workflow-webhook/workflow-webhook-delivery.enums.js +36 -0
  86. package/src/lib/workflow-webhook/workflow-webhook-delivery.enums.js.map +1 -0
  87. package/src/lib/workflow-webhook/workflow-webhook-delivery.object.d.ts +28 -0
  88. package/src/lib/workflow-webhook/workflow-webhook-delivery.object.js +88 -0
  89. package/src/lib/workflow-webhook/workflow-webhook-delivery.object.js.map +1 -0
  90. package/src/lib/workflow-webhook/workflow-webhook-delivery.resolver.d.ts +9 -0
  91. package/src/lib/workflow-webhook/workflow-webhook-delivery.resolver.js +66 -0
  92. package/src/lib/workflow-webhook/workflow-webhook-delivery.resolver.js.map +1 -0
  93. package/src/lib/workflow-webhook/workflow-webhook-delivery.service.d.ts +116 -0
  94. package/src/lib/workflow-webhook/workflow-webhook-delivery.service.js +705 -0
  95. package/src/lib/workflow-webhook/workflow-webhook-delivery.service.js.map +1 -0
  96. package/src/lib/workflow-webhook/workflow-webhook-delivery.subscriber.d.ts +23 -0
  97. package/src/lib/workflow-webhook/workflow-webhook-delivery.subscriber.js +85 -0
  98. package/src/lib/workflow-webhook/workflow-webhook-delivery.subscriber.js.map +1 -0
  99. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.dto.d.ts +85 -0
  100. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.dto.js +345 -0
  101. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.dto.js.map +1 -0
  102. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.resolver.d.ts +23 -0
  103. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.resolver.js +159 -0
  104. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.resolver.js.map +1 -0
  105. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.service.d.ts +93 -0
  106. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.service.js +464 -0
  107. package/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.service.js.map +1 -0
  108. package/src/lib/workflow-webhook/workflow-webhook-endpoint.entity.d.ts +52 -0
  109. package/src/lib/workflow-webhook/workflow-webhook-endpoint.entity.js +135 -0
  110. package/src/lib/workflow-webhook/workflow-webhook-endpoint.entity.js.map +1 -0
  111. package/src/lib/workflow-webhook/workflow-webhook-enqueue.d.ts +46 -0
  112. package/src/lib/workflow-webhook/workflow-webhook-enqueue.js +134 -0
  113. package/src/lib/workflow-webhook/workflow-webhook-enqueue.js.map +1 -0
  114. package/src/lib/workflow-webhook/workflow-webhook-options.d.ts +86 -0
  115. package/src/lib/workflow-webhook/workflow-webhook-options.js +88 -0
  116. package/src/lib/workflow-webhook/workflow-webhook-options.js.map +1 -0
  117. package/src/lib/workflow-webhook/workflow-webhook-options.module.d.ts +18 -0
  118. package/src/lib/workflow-webhook/workflow-webhook-options.module.js +57 -0
  119. package/src/lib/workflow-webhook/workflow-webhook-options.module.js.map +1 -0
  120. package/src/lib/workflow-webhook/workflow-webhook-secret-cipher.d.ts +20 -0
  121. package/src/lib/workflow-webhook/workflow-webhook-secret-cipher.js +66 -0
  122. package/src/lib/workflow-webhook/workflow-webhook-secret-cipher.js.map +1 -0
  123. package/src/lib/workflow-webhook/workflow-webhook.errors.d.ts +35 -0
  124. package/src/lib/workflow-webhook/workflow-webhook.errors.js +41 -0
  125. package/src/lib/workflow-webhook/workflow-webhook.errors.js.map +1 -0
  126. package/src/lib/workflow-webhook/workflow-webhook.module.d.ts +9 -0
  127. package/src/lib/workflow-webhook/workflow-webhook.module.js +62 -0
  128. package/src/lib/workflow-webhook/workflow-webhook.module.js.map +1 -0
  129. package/src/lib/workflow-webhook/workflow-webhook.provider.d.ts +12 -0
  130. package/src/lib/workflow-webhook/workflow-webhook.provider.js +21 -0
  131. package/src/lib/workflow-webhook/workflow-webhook.provider.js.map +1 -0
  132. package/src/lib/workflow-webhook/workflow-webhook.queries.d.ts +38 -0
  133. package/src/lib/workflow-webhook/workflow-webhook.queries.js +142 -0
  134. package/src/lib/workflow-webhook/workflow-webhook.queries.js.map +1 -0
  135. package/src/lib/workflow-webhook/workflow-webhook.service.d.ts +50 -0
  136. package/src/lib/workflow-webhook/workflow-webhook.service.js +221 -0
  137. package/src/lib/workflow-webhook/workflow-webhook.service.js.map +1 -0
  138. package/src/lib/workflow-webhook/workflow-webhook.types.d.ts +127 -0
  139. package/src/lib/workflow-webhook/workflow-webhook.types.js +33 -0
  140. package/src/lib/workflow-webhook/workflow-webhook.types.js.map +1 -0
  141. package/src/lib/workflow-webhook/workflow-webhook.validator.d.ts +20 -0
  142. package/src/lib/workflow-webhook/workflow-webhook.validator.js +97 -0
  143. 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
+ }