@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.
- package/CHANGELOG.md +56 -0
- package/package.json +14 -7
- 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 +150 -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,464 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkflowWebhookEndpointAdminService = exports.WORKFLOW_WEBHOOK_TEST_MAX_PER_WINDOW = exports.WORKFLOW_WEBHOOK_TEST_WINDOW_MS = exports.WORKFLOW_WEBHOOK_TEST_MIN_INTERVAL_MS = void 0;
|
|
4
|
+
exports.readWorkflowWebhookHeaderNames = readWorkflowWebhookHeaderNames;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const common_1 = require("@nestjs/common");
|
|
7
|
+
const typeorm_1 = require("@nestjs/typeorm");
|
|
8
|
+
const workflow_graph_1 = require("@rytass/bpm-core-shared/workflow-graph");
|
|
9
|
+
const node_crypto_1 = require("node:crypto");
|
|
10
|
+
const typeorm_2 = require("typeorm");
|
|
11
|
+
const workflow_webhook_allowlist_1 = require("./workflow-webhook-allowlist");
|
|
12
|
+
const workflow_webhook_database_source_1 = require("./workflow-webhook-database-source");
|
|
13
|
+
const workflow_webhook_delivery_service_1 = require("./workflow-webhook-delivery.service");
|
|
14
|
+
const workflow_webhook_endpoint_entity_1 = require("./workflow-webhook-endpoint.entity");
|
|
15
|
+
const workflow_webhook_options_1 = require("./workflow-webhook-options");
|
|
16
|
+
const workflow_webhook_secret_cipher_1 = require("./workflow-webhook-secret-cipher");
|
|
17
|
+
const workflow_webhook_errors_1 = require("./workflow-webhook.errors");
|
|
18
|
+
const workflow_webhook_service_1 = require("./workflow-webhook.service");
|
|
19
|
+
const PARAMETER_TYPES = [
|
|
20
|
+
'boolean',
|
|
21
|
+
'json',
|
|
22
|
+
'number',
|
|
23
|
+
'string',
|
|
24
|
+
'stringArray',
|
|
25
|
+
];
|
|
26
|
+
const METHODS = ['PATCH', 'POST', 'PUT'];
|
|
27
|
+
const KEY_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,99}$/u;
|
|
28
|
+
const HEADER_NAME_PATTERN = /^[!#$%&'*+.^_`|~0-9A-Za-z-]{1,100}$/u;
|
|
29
|
+
const MAX_HEADERS = 20;
|
|
30
|
+
const MAX_SECRET_LENGTH = 1024;
|
|
31
|
+
const MAX_HEADER_VALUE_LENGTH = 4096;
|
|
32
|
+
/** Headers BPM sets itself or that describe the connection, not the call. */
|
|
33
|
+
const RESERVED_HEADERS = new Set([
|
|
34
|
+
'connection',
|
|
35
|
+
'content-length',
|
|
36
|
+
'expect',
|
|
37
|
+
'host',
|
|
38
|
+
'keep-alive',
|
|
39
|
+
'proxy-connection',
|
|
40
|
+
'te',
|
|
41
|
+
'trailer',
|
|
42
|
+
'transfer-encoding',
|
|
43
|
+
'upgrade',
|
|
44
|
+
]);
|
|
45
|
+
/**
|
|
46
|
+
* What `fetch` accepts in a header value: tab, visible ASCII and Latin-1.
|
|
47
|
+
* Anything else would only fail every delivery as a retryable network error.
|
|
48
|
+
*/
|
|
49
|
+
const HEADER_VALUE_PATTERN = /^[\t\x20-\x7e\x80-\xff]*$/u;
|
|
50
|
+
/** One test send per endpoint every 10 s, at most 5 per 10 minutes. */
|
|
51
|
+
exports.WORKFLOW_WEBHOOK_TEST_MIN_INTERVAL_MS = 10_000;
|
|
52
|
+
exports.WORKFLOW_WEBHOOK_TEST_WINDOW_MS = 600_000;
|
|
53
|
+
exports.WORKFLOW_WEBHOOK_TEST_MAX_PER_WINDOW = 5;
|
|
54
|
+
/**
|
|
55
|
+
* Administrator management of database webhook endpoints (ADR 18 §3.13).
|
|
56
|
+
*
|
|
57
|
+
* Header values and the signing secret go in encrypted and never come back
|
|
58
|
+
* out: not in a response, an error message or a log. Every change writes an
|
|
59
|
+
* audit row naming the fields that changed, never their values.
|
|
60
|
+
*/
|
|
61
|
+
let WorkflowWebhookEndpointAdminService = class WorkflowWebhookEndpointAdminService {
|
|
62
|
+
constructor(endpointRepository, auditRepository, webhookService, deliveryService, databaseSource, options = workflow_webhook_options_1.DEFAULT_BPM_WORKFLOW_WEBHOOK_OPTIONS) {
|
|
63
|
+
this.endpointRepository = endpointRepository;
|
|
64
|
+
this.auditRepository = auditRepository;
|
|
65
|
+
this.webhookService = webhookService;
|
|
66
|
+
this.deliveryService = deliveryService;
|
|
67
|
+
this.databaseSource = databaseSource;
|
|
68
|
+
this.options = options;
|
|
69
|
+
// Per process: several API replicas each allow their own budget, which is
|
|
70
|
+
// acceptable for a manual test button and documented as such.
|
|
71
|
+
this.testSends = new Map();
|
|
72
|
+
}
|
|
73
|
+
isEnabled() {
|
|
74
|
+
return this.webhookService.hasDatabaseSource();
|
|
75
|
+
}
|
|
76
|
+
async list() {
|
|
77
|
+
return this.endpointRepository.find({
|
|
78
|
+
order: { key: 'ASC', version: 'DESC' },
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async listAudits(endpointId) {
|
|
82
|
+
return this.auditRepository.find({
|
|
83
|
+
order: { createdAt: 'DESC' },
|
|
84
|
+
take: 100,
|
|
85
|
+
where: { endpointId },
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
async create(data, actorMemberId) {
|
|
89
|
+
const cipher = this.readCipher();
|
|
90
|
+
const key = data.key.trim();
|
|
91
|
+
assertEndpoint(KEY_PATTERN.test(key), 'key must be 1–100 letters, digits, ".", "_", ":" or "-"');
|
|
92
|
+
assertEndpoint(Number.isInteger(data.version) &&
|
|
93
|
+
data.version >= 1 &&
|
|
94
|
+
data.version <= workflow_graph_1.NOTIFY_WEBHOOK_ENDPOINT_VERSION_MAX, `version must be an integer between 1 and ${workflow_graph_1.NOTIFY_WEBHOOK_ENDPOINT_VERSION_MAX}`);
|
|
95
|
+
if (this.webhookService
|
|
96
|
+
.listRegistryEndpoints()
|
|
97
|
+
.some((endpoint) => endpoint.descriptor.key === key)) {
|
|
98
|
+
throw new workflow_webhook_errors_1.BPMWorkflowWebhookException(workflow_webhook_errors_1.BPM_WORKFLOW_WEBHOOK_ERROR_CODES.ENDPOINT_KEY_CONFLICT, `"${key}" is already registered by the host application`);
|
|
99
|
+
}
|
|
100
|
+
const existing = await this.endpointRepository.find({ where: { key } });
|
|
101
|
+
const latestVersion = existing.reduce((latest, row) => Math.max(latest, row.version), 0);
|
|
102
|
+
assertEndpoint(data.version > latestVersion, latestVersion
|
|
103
|
+
? `"${key}" already has version ${latestVersion}; a new contract needs a higher version`
|
|
104
|
+
: 'version is invalid');
|
|
105
|
+
const url = this.readUrl(data.url);
|
|
106
|
+
const saved = await this.endpointRepository
|
|
107
|
+
.save(this.endpointRepository.create({
|
|
108
|
+
createdByMemberId: actorMemberId,
|
|
109
|
+
deprecated: Boolean(data.deprecated),
|
|
110
|
+
description: readOptionalText(data.description, 'description', 2000),
|
|
111
|
+
encryptedHeaders: this.encryptHeaders(cipher, data.headers ?? []),
|
|
112
|
+
encryptedSigningSecret: this.encryptSecret(cipher, data.signingSecret),
|
|
113
|
+
isActive: true,
|
|
114
|
+
key,
|
|
115
|
+
label: readRequiredText(data.label, 'label', 200),
|
|
116
|
+
method: readMethod(data.method),
|
|
117
|
+
parameters: readParameters(data.parameters),
|
|
118
|
+
secretRotatedAt: null,
|
|
119
|
+
timeoutMs: readTimeout(data.timeoutMs),
|
|
120
|
+
updatedByMemberId: actorMemberId,
|
|
121
|
+
url,
|
|
122
|
+
version: data.version,
|
|
123
|
+
}))
|
|
124
|
+
.catch((error) => {
|
|
125
|
+
// Two administrators creating the same version at once: the unique
|
|
126
|
+
// constraint decides, and the loser gets a sentence, not a 500.
|
|
127
|
+
if (readDatabaseErrorCode(error) === '23505') {
|
|
128
|
+
throw new workflow_webhook_errors_1.BPMWorkflowWebhookException(workflow_webhook_errors_1.BPM_WORKFLOW_WEBHOOK_ERROR_CODES.ENDPOINT_INVALID, `"${key}" version ${data.version} already exists`);
|
|
129
|
+
}
|
|
130
|
+
throw error;
|
|
131
|
+
});
|
|
132
|
+
await this.audit(saved.id, workflow_webhook_endpoint_entity_1.WorkflowWebhookEndpointAuditActionEnum.CREATED, [
|
|
133
|
+
'key',
|
|
134
|
+
'version',
|
|
135
|
+
'label',
|
|
136
|
+
'url',
|
|
137
|
+
'method',
|
|
138
|
+
'parameters',
|
|
139
|
+
...(data.description ? ['description'] : []),
|
|
140
|
+
...(data.headers?.length ? ['headers'] : []),
|
|
141
|
+
...(data.signingSecret ? ['signingSecret'] : []),
|
|
142
|
+
...(data.timeoutMs ? ['timeoutMs'] : []),
|
|
143
|
+
...(data.deprecated ? ['deprecated'] : []),
|
|
144
|
+
], actorMemberId);
|
|
145
|
+
return saved;
|
|
146
|
+
}
|
|
147
|
+
async update(id, data, actorMemberId) {
|
|
148
|
+
const cipher = this.readCipher();
|
|
149
|
+
const row = await this.readRow(id);
|
|
150
|
+
if (data.parameters &&
|
|
151
|
+
stableParameters(readParameters(data.parameters)) !==
|
|
152
|
+
stableParameters(row.parameters)) {
|
|
153
|
+
throw new workflow_webhook_errors_1.BPMWorkflowWebhookException(workflow_webhook_errors_1.BPM_WORKFLOW_WEBHOOK_ERROR_CODES.ENDPOINT_CONTRACT_CHANGED, `the parameters of ${row.key}@${row.version} cannot change; create version ${row.version + 1} instead`);
|
|
154
|
+
}
|
|
155
|
+
const parameters = data.parameters ? readParameters(data.parameters) : null;
|
|
156
|
+
const url = isGiven(data.url) ? this.readUrl(data.url) : null;
|
|
157
|
+
// Pointing stored credentials at another host would let whoever controls
|
|
158
|
+
// that host read header values the admin view never returns, so a new
|
|
159
|
+
// origin needs the headers re-entered in the same request.
|
|
160
|
+
assertEndpoint(!url || readOrigin(url) === readOrigin(row.url) || Boolean(data.headers), 'changing the URL to another host requires entering the headers again');
|
|
161
|
+
const next = {
|
|
162
|
+
// Same contract, so only labels and descriptions can differ here.
|
|
163
|
+
...(parameters &&
|
|
164
|
+
describeParameters(parameters) !== describeParameters(row.parameters)
|
|
165
|
+
? { parameters }
|
|
166
|
+
: {}),
|
|
167
|
+
...(isGiven(data.label)
|
|
168
|
+
? { label: readRequiredText(data.label, 'label', 200) }
|
|
169
|
+
: {}),
|
|
170
|
+
...(data.description !== undefined
|
|
171
|
+
? {
|
|
172
|
+
description: readOptionalText(data.description, 'description', 2000),
|
|
173
|
+
}
|
|
174
|
+
: {}),
|
|
175
|
+
...(url ? { url } : {}),
|
|
176
|
+
...(isGiven(data.method) ? { method: readMethod(data.method) } : {}),
|
|
177
|
+
...(data.timeoutMs !== undefined
|
|
178
|
+
? { timeoutMs: readTimeout(data.timeoutMs) }
|
|
179
|
+
: {}),
|
|
180
|
+
...(typeof data.deprecated === 'boolean'
|
|
181
|
+
? { deprecated: data.deprecated }
|
|
182
|
+
: {}),
|
|
183
|
+
};
|
|
184
|
+
const changes = Object.fromEntries(Object.entries(next).filter(([field, value]) => field === 'parameters' || row[field] !== value));
|
|
185
|
+
const changedFields = [
|
|
186
|
+
...Object.keys(changes),
|
|
187
|
+
// Values are write-only, so giving headers at all counts as a change.
|
|
188
|
+
...(data.headers ? ['headers'] : []),
|
|
189
|
+
];
|
|
190
|
+
if (!changedFields.length) {
|
|
191
|
+
return row;
|
|
192
|
+
}
|
|
193
|
+
// Only the changed columns are written, so a concurrent secret rotation
|
|
194
|
+
// or header replacement is not reverted by this row's stale copy.
|
|
195
|
+
await this.endpointRepository.update({ id: row.id }, {
|
|
196
|
+
...changes,
|
|
197
|
+
...(data.headers
|
|
198
|
+
? { encryptedHeaders: this.encryptHeaders(cipher, data.headers) }
|
|
199
|
+
: {}),
|
|
200
|
+
updatedByMemberId: actorMemberId,
|
|
201
|
+
});
|
|
202
|
+
await this.audit(row.id, workflow_webhook_endpoint_entity_1.WorkflowWebhookEndpointAuditActionEnum.UPDATED, changedFields, actorMemberId);
|
|
203
|
+
return this.readRow(row.id);
|
|
204
|
+
}
|
|
205
|
+
async setActive(id, active, actorMemberId) {
|
|
206
|
+
this.readCipher();
|
|
207
|
+
const row = await this.readRow(id);
|
|
208
|
+
if (row.isActive === active) {
|
|
209
|
+
return row;
|
|
210
|
+
}
|
|
211
|
+
// Re-enabling puts a URL back into use, so it must still pass today's
|
|
212
|
+
// allowlist.
|
|
213
|
+
if (active) {
|
|
214
|
+
this.readUrl(row.url);
|
|
215
|
+
}
|
|
216
|
+
await this.endpointRepository.update({ id: row.id }, { isActive: active, updatedByMemberId: actorMemberId });
|
|
217
|
+
await this.audit(row.id, active
|
|
218
|
+
? workflow_webhook_endpoint_entity_1.WorkflowWebhookEndpointAuditActionEnum.ENABLED
|
|
219
|
+
: workflow_webhook_endpoint_entity_1.WorkflowWebhookEndpointAuditActionEnum.DISABLED, ['isActive'], actorMemberId);
|
|
220
|
+
return this.readRow(row.id);
|
|
221
|
+
}
|
|
222
|
+
/** `null` removes the secret, so BPM stops signing requests. */
|
|
223
|
+
async rotateSecret(id, signingSecret, actorMemberId) {
|
|
224
|
+
const cipher = this.readCipher();
|
|
225
|
+
const row = await this.readRow(id);
|
|
226
|
+
await this.endpointRepository.update({ id: row.id }, {
|
|
227
|
+
encryptedSigningSecret: this.encryptSecret(cipher, signingSecret),
|
|
228
|
+
secretRotatedAt: new Date(),
|
|
229
|
+
updatedByMemberId: actorMemberId,
|
|
230
|
+
});
|
|
231
|
+
await this.audit(row.id, workflow_webhook_endpoint_entity_1.WorkflowWebhookEndpointAuditActionEnum.SECRET_ROTATED, ['signingSecret'], actorMemberId);
|
|
232
|
+
return this.readRow(row.id);
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Sends a sample event — placeholder ids and a sample value for every
|
|
236
|
+
* declared parameter, never a real case — through the normal delivery
|
|
237
|
+
* path, and reports what the receiver answered.
|
|
238
|
+
*/
|
|
239
|
+
async testSend(id, actorMemberId, now = Date.now()) {
|
|
240
|
+
this.readCipher();
|
|
241
|
+
const row = await this.readRow(id);
|
|
242
|
+
this.acquireTestSend(row.id, now);
|
|
243
|
+
const outcome = await this.deliveryService.sendTestEvent({ endpoint: this.databaseSource.toEndpoint(row), source: 'DATABASE' }, readSampleEvent(row, new Date(now)));
|
|
244
|
+
await this.audit(row.id, workflow_webhook_endpoint_entity_1.WorkflowWebhookEndpointAuditActionEnum.TEST_SENT, [], actorMemberId);
|
|
245
|
+
return outcome;
|
|
246
|
+
}
|
|
247
|
+
acquireTestSend(endpointId, now) {
|
|
248
|
+
const recent = (this.testSends.get(endpointId) ?? []).filter((sentAt) => now - sentAt < exports.WORKFLOW_WEBHOOK_TEST_WINDOW_MS);
|
|
249
|
+
const last = recent[recent.length - 1];
|
|
250
|
+
if ((last !== undefined &&
|
|
251
|
+
now - last < exports.WORKFLOW_WEBHOOK_TEST_MIN_INTERVAL_MS) ||
|
|
252
|
+
recent.length >= exports.WORKFLOW_WEBHOOK_TEST_MAX_PER_WINDOW) {
|
|
253
|
+
throw new workflow_webhook_errors_1.BPMWorkflowWebhookException(workflow_webhook_errors_1.BPM_WORKFLOW_WEBHOOK_ERROR_CODES.TEST_RATE_LIMITED, `wait before testing this endpoint again (at most one test every ${exports.WORKFLOW_WEBHOOK_TEST_MIN_INTERVAL_MS / 1000} s and ${exports.WORKFLOW_WEBHOOK_TEST_MAX_PER_WINDOW} per ${exports.WORKFLOW_WEBHOOK_TEST_WINDOW_MS / 60_000} minutes)`);
|
|
254
|
+
}
|
|
255
|
+
this.testSends.set(endpointId, [...recent, now]);
|
|
256
|
+
}
|
|
257
|
+
readCipher() {
|
|
258
|
+
if (!this.isEnabled() || !this.options.secretEncryptionKey) {
|
|
259
|
+
throw new workflow_webhook_errors_1.BPMWorkflowWebhookException(workflow_webhook_errors_1.BPM_WORKFLOW_WEBHOOK_ERROR_CODES.DATABASE_SOURCE_DISABLED, 'database webhook endpoints are not enabled on this server');
|
|
260
|
+
}
|
|
261
|
+
return new workflow_webhook_secret_cipher_1.WorkflowWebhookSecretCipher(this.options.secretEncryptionKey);
|
|
262
|
+
}
|
|
263
|
+
async readRow(id) {
|
|
264
|
+
const row = await this.endpointRepository.findOne({ where: { id } });
|
|
265
|
+
if (!row) {
|
|
266
|
+
throw new common_1.NotFoundException(`Webhook endpoint ${id} was not found`);
|
|
267
|
+
}
|
|
268
|
+
return row;
|
|
269
|
+
}
|
|
270
|
+
readUrl(value) {
|
|
271
|
+
const url = value.trim();
|
|
272
|
+
const parsed = (() => {
|
|
273
|
+
try {
|
|
274
|
+
return new URL(url);
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
})();
|
|
280
|
+
assertEndpoint(parsed !== null &&
|
|
281
|
+
(parsed.protocol === 'https:' || parsed.protocol === 'http:'), 'url must be an absolute http(s) URL');
|
|
282
|
+
assertEndpoint(!parsed?.username && !parsed?.password, 'url must not carry credentials; use a header instead');
|
|
283
|
+
if (!(0, workflow_webhook_allowlist_1.isWorkflowWebhookUrlAllowed)(url, this.options.allowedUrlPatterns)) {
|
|
284
|
+
throw new workflow_webhook_errors_1.BPMWorkflowWebhookException(workflow_webhook_errors_1.BPM_WORKFLOW_WEBHOOK_ERROR_CODES.URL_NOT_ALLOWED, 'url is not allowed by workflowWebhookAllowedUrlPatterns');
|
|
285
|
+
}
|
|
286
|
+
return url;
|
|
287
|
+
}
|
|
288
|
+
encryptHeaders(cipher, headers) {
|
|
289
|
+
assertEndpoint(headers.length <= MAX_HEADERS, `at most ${MAX_HEADERS} headers`);
|
|
290
|
+
const entries = headers.map((header) => {
|
|
291
|
+
const name = header.name.trim();
|
|
292
|
+
assertEndpoint(HEADER_NAME_PATTERN.test(name), 'a header name is invalid');
|
|
293
|
+
// Messages name the header, never its value.
|
|
294
|
+
assertEndpoint(!name.toLowerCase().startsWith('x-bpm-') &&
|
|
295
|
+
!RESERVED_HEADERS.has(name.toLowerCase()), `header "${name}" is set by BPM and cannot be configured`);
|
|
296
|
+
assertEndpoint(typeof header.value === 'string' &&
|
|
297
|
+
header.value.length <= MAX_HEADER_VALUE_LENGTH &&
|
|
298
|
+
HEADER_VALUE_PATTERN.test(header.value), `header "${name}" has an invalid value`);
|
|
299
|
+
return [name, header.value];
|
|
300
|
+
});
|
|
301
|
+
const names = entries.map(([name]) => name.toLowerCase());
|
|
302
|
+
assertEndpoint(new Set(names).size === names.length, 'header names must be unique');
|
|
303
|
+
return entries.length
|
|
304
|
+
? cipher.encrypt(JSON.stringify(Object.fromEntries(entries)))
|
|
305
|
+
: null;
|
|
306
|
+
}
|
|
307
|
+
encryptSecret(cipher, secret) {
|
|
308
|
+
if (!secret) {
|
|
309
|
+
return null;
|
|
310
|
+
}
|
|
311
|
+
assertEndpoint(secret.length <= MAX_SECRET_LENGTH, `signingSecret must be at most ${MAX_SECRET_LENGTH} characters`);
|
|
312
|
+
return cipher.encrypt(secret);
|
|
313
|
+
}
|
|
314
|
+
async audit(endpointId, action, changedFields, actorMemberId) {
|
|
315
|
+
await this.auditRepository.save(this.auditRepository.create({
|
|
316
|
+
action,
|
|
317
|
+
actorMemberId,
|
|
318
|
+
changedFields: [...new Set(changedFields)].sort(),
|
|
319
|
+
endpointId,
|
|
320
|
+
}));
|
|
321
|
+
}
|
|
322
|
+
};
|
|
323
|
+
exports.WorkflowWebhookEndpointAdminService = WorkflowWebhookEndpointAdminService;
|
|
324
|
+
exports.WorkflowWebhookEndpointAdminService = WorkflowWebhookEndpointAdminService = tslib_1.__decorate([
|
|
325
|
+
(0, common_1.Injectable)(),
|
|
326
|
+
tslib_1.__param(0, (0, typeorm_1.InjectRepository)(workflow_webhook_endpoint_entity_1.WorkflowWebhookEndpointEntity)),
|
|
327
|
+
tslib_1.__param(1, (0, typeorm_1.InjectRepository)(workflow_webhook_endpoint_entity_1.WorkflowWebhookEndpointAuditEntity)),
|
|
328
|
+
tslib_1.__param(5, (0, common_1.Optional)()),
|
|
329
|
+
tslib_1.__param(5, (0, common_1.Inject)(workflow_webhook_options_1.BPM_WORKFLOW_WEBHOOK_OPTIONS)),
|
|
330
|
+
tslib_1.__metadata("design:paramtypes", [typeorm_2.Repository,
|
|
331
|
+
typeorm_2.Repository,
|
|
332
|
+
workflow_webhook_service_1.WorkflowWebhookService,
|
|
333
|
+
workflow_webhook_delivery_service_1.WorkflowWebhookDeliveryService,
|
|
334
|
+
workflow_webhook_database_source_1.DatabaseWorkflowWebhookEndpointSource, Object])
|
|
335
|
+
], WorkflowWebhookEndpointAdminService);
|
|
336
|
+
/**
|
|
337
|
+
* The header names of a stored endpoint, for the admin view. Decrypting the
|
|
338
|
+
* envelope is the only way to know them; the values are dropped at once.
|
|
339
|
+
*/
|
|
340
|
+
function readWorkflowWebhookHeaderNames(row, secretEncryptionKey) {
|
|
341
|
+
if (!row.encryptedHeaders || !secretEncryptionKey) {
|
|
342
|
+
return [];
|
|
343
|
+
}
|
|
344
|
+
try {
|
|
345
|
+
const parsed = JSON.parse(new workflow_webhook_secret_cipher_1.WorkflowWebhookSecretCipher(secretEncryptionKey).decrypt(row.encryptedHeaders));
|
|
346
|
+
return typeof parsed === 'object' && parsed !== null
|
|
347
|
+
? Object.keys(parsed).sort()
|
|
348
|
+
: [];
|
|
349
|
+
}
|
|
350
|
+
catch {
|
|
351
|
+
return [];
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
function assertEndpoint(condition, detail) {
|
|
355
|
+
if (!condition) {
|
|
356
|
+
throw new workflow_webhook_errors_1.BPMWorkflowWebhookException(workflow_webhook_errors_1.BPM_WORKFLOW_WEBHOOK_ERROR_CODES.ENDPOINT_INVALID, detail);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
function isGiven(value) {
|
|
360
|
+
return value !== undefined && value !== null;
|
|
361
|
+
}
|
|
362
|
+
function readRequiredText(value, field, max) {
|
|
363
|
+
const text = value.trim();
|
|
364
|
+
assertEndpoint(text.length > 0 && text.length <= max, `${field} must be 1–${max} characters`);
|
|
365
|
+
return text;
|
|
366
|
+
}
|
|
367
|
+
function readOptionalText(value, field, max) {
|
|
368
|
+
const text = value?.trim() ?? '';
|
|
369
|
+
assertEndpoint(text.length <= max, `${field} must be at most ${max} characters`);
|
|
370
|
+
return text || null;
|
|
371
|
+
}
|
|
372
|
+
function readMethod(value) {
|
|
373
|
+
const method = (value ?? 'POST').trim().toUpperCase();
|
|
374
|
+
assertEndpoint(METHODS.some((candidate) => candidate === method), 'method must be POST, PUT or PATCH');
|
|
375
|
+
return method;
|
|
376
|
+
}
|
|
377
|
+
function readTimeout(value) {
|
|
378
|
+
if (value === null || value === undefined) {
|
|
379
|
+
return null;
|
|
380
|
+
}
|
|
381
|
+
assertEndpoint(Number.isInteger(value) &&
|
|
382
|
+
value > 0 &&
|
|
383
|
+
value <= workflow_webhook_options_1.WORKFLOW_WEBHOOK_MAX_TIMEOUT_MS, `timeoutMs must be an integer between 1 and ${workflow_webhook_options_1.WORKFLOW_WEBHOOK_MAX_TIMEOUT_MS}`);
|
|
384
|
+
return value;
|
|
385
|
+
}
|
|
386
|
+
function readParameters(parameters) {
|
|
387
|
+
const stored = parameters.map((parameter) => {
|
|
388
|
+
const key = parameter.key.trim();
|
|
389
|
+
assertEndpoint(KEY_PATTERN.test(key), 'a parameter key must be 1–100 letters, digits, ".", "_", ":" or "-"');
|
|
390
|
+
assertEndpoint(PARAMETER_TYPES.includes(parameter.type), `parameter "${key}" has an unsupported type`);
|
|
391
|
+
return {
|
|
392
|
+
description: readOptionalText(parameter.description, `parameter "${key}" description`, 500),
|
|
393
|
+
key,
|
|
394
|
+
label: readRequiredText(parameter.label, `parameter "${key}" label`, 200),
|
|
395
|
+
required: Boolean(parameter.required),
|
|
396
|
+
type: parameter.type,
|
|
397
|
+
};
|
|
398
|
+
});
|
|
399
|
+
const keys = stored.map((parameter) => parameter.key);
|
|
400
|
+
assertEndpoint(new Set(keys).size === keys.length, 'parameter keys must be unique');
|
|
401
|
+
return stored;
|
|
402
|
+
}
|
|
403
|
+
/** Order-independent: jsonb does not keep an object's key order. */
|
|
404
|
+
function describeParameters(parameters) {
|
|
405
|
+
return JSON.stringify([...parameters]
|
|
406
|
+
.sort((left, right) => left.key.localeCompare(right.key))
|
|
407
|
+
.map((parameter) => [
|
|
408
|
+
parameter.key,
|
|
409
|
+
parameter.type,
|
|
410
|
+
parameter.required,
|
|
411
|
+
parameter.label,
|
|
412
|
+
parameter.description ?? null,
|
|
413
|
+
]));
|
|
414
|
+
}
|
|
415
|
+
function readOrigin(url) {
|
|
416
|
+
try {
|
|
417
|
+
return new URL(url).origin;
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
return url;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
function readDatabaseErrorCode(error) {
|
|
424
|
+
const code = typeof error === 'object' && error !== null
|
|
425
|
+
? (error.code ??
|
|
426
|
+
error
|
|
427
|
+
.driverError?.code)
|
|
428
|
+
: null;
|
|
429
|
+
return typeof code === 'string' ? code : null;
|
|
430
|
+
}
|
|
431
|
+
function stableParameters(parameters) {
|
|
432
|
+
return JSON.stringify([...parameters]
|
|
433
|
+
.sort((left, right) => left.key.localeCompare(right.key))
|
|
434
|
+
.map((parameter) => [parameter.key, parameter.type, parameter.required]));
|
|
435
|
+
}
|
|
436
|
+
function readSampleEvent(row, occurredAt) {
|
|
437
|
+
const samples = {
|
|
438
|
+
boolean: true,
|
|
439
|
+
json: { sample: true },
|
|
440
|
+
number: 1,
|
|
441
|
+
string: 'sample',
|
|
442
|
+
stringArray: ['sample'],
|
|
443
|
+
};
|
|
444
|
+
return {
|
|
445
|
+
attempt: 1,
|
|
446
|
+
deliveryId: `test-${(0, node_crypto_1.randomUUID)()}`,
|
|
447
|
+
endpoint: { key: row.key, version: row.version },
|
|
448
|
+
eventType: 'workflow.notify',
|
|
449
|
+
initiator: { memberId: 'test-member' },
|
|
450
|
+
instance: {
|
|
451
|
+
id: 'test-instance',
|
|
452
|
+
templateId: 'test-template',
|
|
453
|
+
templateVersionId: 'test-template-version',
|
|
454
|
+
title: 'BPM Webhook 測試送出',
|
|
455
|
+
},
|
|
456
|
+
node: { id: 'test-node', label: '測試送出' },
|
|
457
|
+
occurredAt: occurredAt.toISOString(),
|
|
458
|
+
parameters: Object.fromEntries(row.parameters.map((parameter) => [
|
|
459
|
+
parameter.key,
|
|
460
|
+
samples[parameter.type],
|
|
461
|
+
])),
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
//# sourceMappingURL=workflow-webhook-endpoint-admin.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-webhook-endpoint-admin.service.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-webhook/workflow-webhook-endpoint-admin.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { NotifyWebhookParameterType } from '@rytass/bpm-core-shared/workflow';
|
|
2
|
+
/** A parameter as stored on a database endpoint; same shape as the registry's. */
|
|
3
|
+
export interface WorkflowWebhookStoredParameter {
|
|
4
|
+
readonly description: string | null;
|
|
5
|
+
readonly key: string;
|
|
6
|
+
readonly label: string;
|
|
7
|
+
readonly required: boolean;
|
|
8
|
+
readonly type: NotifyWebhookParameterType;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* A NOTIFY webhook endpoint maintained by a BPM administrator (ADR 18
|
|
12
|
+
* §3.13). Not a GraphQL type: the admin view masks every header value and
|
|
13
|
+
* the signing secret, and only says whether they are set.
|
|
14
|
+
*/
|
|
15
|
+
export declare class WorkflowWebhookEndpointEntity {
|
|
16
|
+
id: string;
|
|
17
|
+
key: string;
|
|
18
|
+
version: number;
|
|
19
|
+
label: string;
|
|
20
|
+
description: string | null;
|
|
21
|
+
parameters: readonly WorkflowWebhookStoredParameter[];
|
|
22
|
+
url: string;
|
|
23
|
+
method: string;
|
|
24
|
+
/** Envelope of a JSON `{ name: value }` object; `null` for no headers. */
|
|
25
|
+
encryptedHeaders: string | null;
|
|
26
|
+
encryptedSigningSecret: string | null;
|
|
27
|
+
timeoutMs: number | null;
|
|
28
|
+
isActive: boolean;
|
|
29
|
+
deprecated: boolean;
|
|
30
|
+
secretRotatedAt: Date | null;
|
|
31
|
+
createdByMemberId: string | null;
|
|
32
|
+
updatedByMemberId: string | null;
|
|
33
|
+
createdAt: Date;
|
|
34
|
+
updatedAt: Date;
|
|
35
|
+
}
|
|
36
|
+
export declare enum WorkflowWebhookEndpointAuditActionEnum {
|
|
37
|
+
CREATED = "CREATED",
|
|
38
|
+
DISABLED = "DISABLED",
|
|
39
|
+
ENABLED = "ENABLED",
|
|
40
|
+
SECRET_ROTATED = "SECRET_ROTATED",
|
|
41
|
+
TEST_SENT = "TEST_SENT",
|
|
42
|
+
UPDATED = "UPDATED"
|
|
43
|
+
}
|
|
44
|
+
/** Who changed which fields of an endpoint, and when. Never a value. */
|
|
45
|
+
export declare class WorkflowWebhookEndpointAuditEntity {
|
|
46
|
+
id: string;
|
|
47
|
+
endpointId: string;
|
|
48
|
+
action: WorkflowWebhookEndpointAuditActionEnum;
|
|
49
|
+
changedFields: readonly string[];
|
|
50
|
+
actorMemberId: string | null;
|
|
51
|
+
createdAt: Date;
|
|
52
|
+
}
|