@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,24 @@
|
|
|
1
|
+
export * from './workflow-webhook-allowlist';
|
|
2
|
+
export * from './workflow-webhook-database-source';
|
|
3
|
+
export * from './workflow-webhook-delivery-scheduler.service';
|
|
4
|
+
export * from './workflow-webhook-delivery.entity';
|
|
5
|
+
export * from './workflow-webhook-delivery.enums';
|
|
6
|
+
export * from './workflow-webhook-delivery.object';
|
|
7
|
+
export * from './workflow-webhook-delivery.resolver';
|
|
8
|
+
export * from './workflow-webhook-delivery.service';
|
|
9
|
+
export * from './workflow-webhook-delivery.subscriber';
|
|
10
|
+
export * from './workflow-webhook-endpoint-admin.dto';
|
|
11
|
+
export * from './workflow-webhook-endpoint-admin.resolver';
|
|
12
|
+
export * from './workflow-webhook-endpoint-admin.service';
|
|
13
|
+
export * from './workflow-webhook-endpoint.entity';
|
|
14
|
+
export * from './workflow-webhook-enqueue';
|
|
15
|
+
export * from './workflow-webhook-options';
|
|
16
|
+
export * from './workflow-webhook-options.module';
|
|
17
|
+
export * from './workflow-webhook-secret-cipher';
|
|
18
|
+
export * from './workflow-webhook.errors';
|
|
19
|
+
export * from './workflow-webhook.module';
|
|
20
|
+
export * from './workflow-webhook.provider';
|
|
21
|
+
export * from './workflow-webhook.queries';
|
|
22
|
+
export * from './workflow-webhook.service';
|
|
23
|
+
export * from './workflow-webhook.types';
|
|
24
|
+
export * from './workflow-webhook.validator';
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
tslib_1.__exportStar(require("./workflow-webhook-allowlist"), exports);
|
|
5
|
+
tslib_1.__exportStar(require("./workflow-webhook-database-source"), exports);
|
|
6
|
+
tslib_1.__exportStar(require("./workflow-webhook-delivery-scheduler.service"), exports);
|
|
7
|
+
tslib_1.__exportStar(require("./workflow-webhook-delivery.entity"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./workflow-webhook-delivery.enums"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./workflow-webhook-delivery.object"), exports);
|
|
10
|
+
tslib_1.__exportStar(require("./workflow-webhook-delivery.resolver"), exports);
|
|
11
|
+
tslib_1.__exportStar(require("./workflow-webhook-delivery.service"), exports);
|
|
12
|
+
tslib_1.__exportStar(require("./workflow-webhook-delivery.subscriber"), exports);
|
|
13
|
+
tslib_1.__exportStar(require("./workflow-webhook-endpoint-admin.dto"), exports);
|
|
14
|
+
tslib_1.__exportStar(require("./workflow-webhook-endpoint-admin.resolver"), exports);
|
|
15
|
+
tslib_1.__exportStar(require("./workflow-webhook-endpoint-admin.service"), exports);
|
|
16
|
+
tslib_1.__exportStar(require("./workflow-webhook-endpoint.entity"), exports);
|
|
17
|
+
tslib_1.__exportStar(require("./workflow-webhook-enqueue"), exports);
|
|
18
|
+
tslib_1.__exportStar(require("./workflow-webhook-options"), exports);
|
|
19
|
+
tslib_1.__exportStar(require("./workflow-webhook-options.module"), exports);
|
|
20
|
+
tslib_1.__exportStar(require("./workflow-webhook-secret-cipher"), exports);
|
|
21
|
+
tslib_1.__exportStar(require("./workflow-webhook.errors"), exports);
|
|
22
|
+
tslib_1.__exportStar(require("./workflow-webhook.module"), exports);
|
|
23
|
+
tslib_1.__exportStar(require("./workflow-webhook.provider"), exports);
|
|
24
|
+
tslib_1.__exportStar(require("./workflow-webhook.queries"), exports);
|
|
25
|
+
tslib_1.__exportStar(require("./workflow-webhook.service"), exports);
|
|
26
|
+
tslib_1.__exportStar(require("./workflow-webhook.types"), exports);
|
|
27
|
+
tslib_1.__exportStar(require("./workflow-webhook.validator"), exports);
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-webhook/index.ts"],"names":[],"mappings":";;;AAAA,uEAA6C;AAC7C,6EAAmD;AACnD,wFAA8D;AAC9D,6EAAmD;AACnD,4EAAkD;AAClD,6EAAmD;AACnD,+EAAqD;AACrD,8EAAoD;AACpD,iFAAuD;AACvD,gFAAsD;AACtD,qFAA2D;AAC3D,oFAA0D;AAC1D,6EAAmD;AACnD,qEAA2C;AAC3C,qEAA2C;AAC3C,4EAAkD;AAClD,2EAAiD;AACjD,oEAA0C;AAC1C,oEAA0C;AAC1C,sEAA4C;AAC5C,qEAA2C;AAC3C,qEAA2C;AAC3C,mEAAyC;AACzC,uEAA6C"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL allowlist for webhook endpoints (ADR 18 §3.13).
|
|
3
|
+
*
|
|
4
|
+
* Pure functions: parsing happens once at boot so a malformed pattern fails
|
|
5
|
+
* the application rather than silently allowing or denying everything, and
|
|
6
|
+
* matching is called again on every delivery attempt so tightening the list
|
|
7
|
+
* takes effect on deliveries that are already queued.
|
|
8
|
+
*/
|
|
9
|
+
export type WorkflowWebhookUrlScheme = 'http' | 'https';
|
|
10
|
+
export interface ParsedWorkflowWebhookUrlPattern {
|
|
11
|
+
/** Matches the URL's effective port (the scheme default when implicit). */
|
|
12
|
+
readonly port: string;
|
|
13
|
+
readonly scheme: WorkflowWebhookUrlScheme;
|
|
14
|
+
/** The pattern as written, for diagnostics. */
|
|
15
|
+
readonly source: string;
|
|
16
|
+
/**
|
|
17
|
+
* `true` when the host part carries no wildcard. Only an exact host may opt
|
|
18
|
+
* into a loopback or private address.
|
|
19
|
+
*/
|
|
20
|
+
readonly hasLiteralHost: boolean;
|
|
21
|
+
readonly hostMatcher: RegExp;
|
|
22
|
+
readonly pathMatcher: RegExp;
|
|
23
|
+
readonly hostname: string;
|
|
24
|
+
}
|
|
25
|
+
export interface WorkflowWebhookUrlPatternParseResult {
|
|
26
|
+
readonly errors: readonly string[];
|
|
27
|
+
readonly patterns: readonly ParsedWorkflowWebhookUrlPattern[];
|
|
28
|
+
}
|
|
29
|
+
export declare function parseWorkflowWebhookUrlPatterns(patterns: readonly string[]): WorkflowWebhookUrlPatternParseResult;
|
|
30
|
+
export declare function parseWorkflowWebhookUrlPattern(pattern: string): ParsedWorkflowWebhookUrlPattern;
|
|
31
|
+
/**
|
|
32
|
+
* Whether `url` may be called. An empty pattern list denies everything: the
|
|
33
|
+
* caller decides whether an unconfigured allowlist means "deny" (the database
|
|
34
|
+
* source) or "not enforced" (the registry source), and conflating the two here
|
|
35
|
+
* would turn a missing configuration into an open door.
|
|
36
|
+
*/
|
|
37
|
+
export declare function isWorkflowWebhookUrlAllowed(url: string, patterns: readonly ParsedWorkflowWebhookUrlPattern[]): boolean;
|
|
38
|
+
export declare function isInternalHostname(hostname: string): boolean;
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* URL allowlist for webhook endpoints (ADR 18 §3.13).
|
|
4
|
+
*
|
|
5
|
+
* Pure functions: parsing happens once at boot so a malformed pattern fails
|
|
6
|
+
* the application rather than silently allowing or denying everything, and
|
|
7
|
+
* matching is called again on every delivery attempt so tightening the list
|
|
8
|
+
* takes effect on deliveries that are already queued.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.parseWorkflowWebhookUrlPatterns = parseWorkflowWebhookUrlPatterns;
|
|
12
|
+
exports.parseWorkflowWebhookUrlPattern = parseWorkflowWebhookUrlPattern;
|
|
13
|
+
exports.isWorkflowWebhookUrlAllowed = isWorkflowWebhookUrlAllowed;
|
|
14
|
+
exports.isInternalHostname = isInternalHostname;
|
|
15
|
+
const DEFAULT_PORTS = {
|
|
16
|
+
http: '80',
|
|
17
|
+
https: '443',
|
|
18
|
+
};
|
|
19
|
+
const LOOPBACK_HOSTNAMES = [
|
|
20
|
+
'localhost',
|
|
21
|
+
'127.0.0.1',
|
|
22
|
+
'0.0.0.0',
|
|
23
|
+
'[::1]',
|
|
24
|
+
'[::]',
|
|
25
|
+
];
|
|
26
|
+
function parseWorkflowWebhookUrlPatterns(patterns) {
|
|
27
|
+
const results = patterns.map((pattern, index) => {
|
|
28
|
+
try {
|
|
29
|
+
return { pattern: parseWorkflowWebhookUrlPattern(pattern) };
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
return {
|
|
33
|
+
error: `workflowWebhookAllowedUrlPatterns[${index}] ${error instanceof Error ? error.message : 'is invalid'}`,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
return {
|
|
38
|
+
errors: results.flatMap((result) => (result.error ? [result.error] : [])),
|
|
39
|
+
patterns: results.flatMap((result) => result.pattern ? [result.pattern] : []),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function parseWorkflowWebhookUrlPattern(pattern) {
|
|
43
|
+
const trimmed = pattern.trim();
|
|
44
|
+
if (!trimmed) {
|
|
45
|
+
throw new Error('is empty');
|
|
46
|
+
}
|
|
47
|
+
// A bare "*" means any public https host and any path. Internal addresses
|
|
48
|
+
// stay unreachable through it, like every other wildcard host.
|
|
49
|
+
const normalized = trimmed === '*' ? 'https://**/*' : trimmed;
|
|
50
|
+
const schemeMatch = /^([A-Za-z][A-Za-z0-9+.-]*):\/\//u.exec(normalized);
|
|
51
|
+
const scheme = schemeMatch ? schemeMatch[1].toLowerCase() : 'https';
|
|
52
|
+
if (scheme !== 'http' && scheme !== 'https') {
|
|
53
|
+
throw new Error(`"${pattern}" must use http:// or https://`);
|
|
54
|
+
}
|
|
55
|
+
const remainder = schemeMatch
|
|
56
|
+
? normalized.slice(schemeMatch[0].length)
|
|
57
|
+
: normalized;
|
|
58
|
+
const slashIndex = remainder.indexOf('/');
|
|
59
|
+
const authority = slashIndex === -1 ? remainder : remainder.slice(0, slashIndex);
|
|
60
|
+
const path = slashIndex === -1 ? '/*' : remainder.slice(slashIndex);
|
|
61
|
+
if (!authority) {
|
|
62
|
+
throw new Error(`"${pattern}" is missing a host`);
|
|
63
|
+
}
|
|
64
|
+
if (authority.includes('@')) {
|
|
65
|
+
throw new Error(`"${pattern}" must not carry credentials`);
|
|
66
|
+
}
|
|
67
|
+
const portMatch = /:([0-9*]+)$/u.exec(authority);
|
|
68
|
+
const hostname = (portMatch ? authority.slice(0, -portMatch[0].length) : authority).toLowerCase();
|
|
69
|
+
const port = portMatch ? portMatch[1] : DEFAULT_PORTS[scheme];
|
|
70
|
+
if (!hostname) {
|
|
71
|
+
throw new Error(`"${pattern}" is missing a host`);
|
|
72
|
+
}
|
|
73
|
+
if (!/^[A-Za-z0-9*.\-[\]:]+$/u.test(hostname)) {
|
|
74
|
+
throw new Error(`"${pattern}" has an invalid host`);
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
hasLiteralHost: !hostname.includes('*'),
|
|
78
|
+
hostMatcher: buildHostMatcher(hostname, pattern),
|
|
79
|
+
hostname,
|
|
80
|
+
pathMatcher: buildPathMatcher(path),
|
|
81
|
+
port,
|
|
82
|
+
scheme,
|
|
83
|
+
source: pattern,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Whether `url` may be called. An empty pattern list denies everything: the
|
|
88
|
+
* caller decides whether an unconfigured allowlist means "deny" (the database
|
|
89
|
+
* source) or "not enforced" (the registry source), and conflating the two here
|
|
90
|
+
* would turn a missing configuration into an open door.
|
|
91
|
+
*/
|
|
92
|
+
function isWorkflowWebhookUrlAllowed(url, patterns) {
|
|
93
|
+
const parsed = parseUrl(url);
|
|
94
|
+
if (!parsed) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
return patterns.some((pattern) => matchesPattern(parsed, pattern));
|
|
98
|
+
}
|
|
99
|
+
function parseUrl(url) {
|
|
100
|
+
const candidate = (() => {
|
|
101
|
+
try {
|
|
102
|
+
return new URL(url);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
})();
|
|
108
|
+
if (!candidate) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
const scheme = candidate.protocol.replace(':', '').toLowerCase();
|
|
112
|
+
if (scheme !== 'http' && scheme !== 'https') {
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
// Credentials in the URL are never legitimate here and would let an
|
|
116
|
+
// otherwise-allowed host smuggle a different authority past a reader.
|
|
117
|
+
if (candidate.username || candidate.password) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
hostname: candidate.hostname.toLowerCase(),
|
|
122
|
+
path: `${candidate.pathname}${candidate.search}`,
|
|
123
|
+
port: candidate.port || DEFAULT_PORTS[scheme],
|
|
124
|
+
scheme,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function matchesPattern(url, pattern) {
|
|
128
|
+
if (url.scheme !== pattern.scheme) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
if (pattern.port !== '*' && url.port !== pattern.port) {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
if (!pattern.hostMatcher.test(url.hostname)) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
// A wildcard host must never reach the loopback interface, a private range
|
|
138
|
+
// or a bare IP: those are the addresses an SSRF is after, and a pattern that
|
|
139
|
+
// names them explicitly is the only way to opt in.
|
|
140
|
+
if (!pattern.hasLiteralHost && isInternalHostname(url.hostname)) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
return pattern.pathMatcher.test(url.path);
|
|
144
|
+
}
|
|
145
|
+
function isInternalHostname(hostname) {
|
|
146
|
+
const normalized = hostname.toLowerCase();
|
|
147
|
+
if (LOOPBACK_HOSTNAMES.includes(normalized)) {
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
if (normalized.endsWith('.localhost')) {
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
if (normalized.includes(':')) {
|
|
154
|
+
const groups = expandIpv6(normalized.replace(/[[\]]/gu, ''));
|
|
155
|
+
// Not a parseable IPv6 literal: refuse to call it public.
|
|
156
|
+
if (!groups) {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
const embedded = readEmbeddedIpv4(groups);
|
|
160
|
+
// ::ffff:127.0.0.1, ::127.0.0.1 and 64:ff9b::127.0.0.1 all reach an IPv4
|
|
161
|
+
// address, so judge the address they carry rather than the wrapper.
|
|
162
|
+
if (embedded) {
|
|
163
|
+
return isInternalHostname(embedded);
|
|
164
|
+
}
|
|
165
|
+
const [first] = groups;
|
|
166
|
+
return (groups.every((group) => group === 0) ||
|
|
167
|
+
(groups.slice(0, 7).every((group) => group === 0) && groups[7] === 1) ||
|
|
168
|
+
// Unique-local fc00::/7, link-local fe80::/10, deprecated site-local
|
|
169
|
+
// fec0::/10 and multicast ff00::/8.
|
|
170
|
+
(first & 0xfe00) === 0xfc00 ||
|
|
171
|
+
(first & 0xffc0) === 0xfe80 ||
|
|
172
|
+
(first & 0xffc0) === 0xfec0 ||
|
|
173
|
+
(first & 0xff00) === 0xff00);
|
|
174
|
+
}
|
|
175
|
+
const octets = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/u.exec(normalized);
|
|
176
|
+
if (!octets) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
const [first, second] = octets.slice(1).map((value) => Number(value));
|
|
180
|
+
const third = Number(octets[3]);
|
|
181
|
+
return (first === 0 ||
|
|
182
|
+
first === 10 ||
|
|
183
|
+
first === 127 ||
|
|
184
|
+
(first === 100 && second >= 64 && second <= 127) ||
|
|
185
|
+
(first === 169 && second === 254) ||
|
|
186
|
+
(first === 172 && second >= 16 && second <= 31) ||
|
|
187
|
+
(first === 192 && second === 0 && third === 0) ||
|
|
188
|
+
// TEST-NET-1/2/3 (192.0.2/24, 198.51.100/24, 203.0.113/24).
|
|
189
|
+
(first === 192 && second === 0 && third === 2) ||
|
|
190
|
+
(first === 198 && second === 51 && third === 100) ||
|
|
191
|
+
(first === 203 && second === 0 && third === 113) ||
|
|
192
|
+
(first === 192 && second === 168) ||
|
|
193
|
+
(first === 198 && (second === 18 || second === 19)) ||
|
|
194
|
+
// Multicast (224/4), reserved (240/4) and broadcast are never a webhook.
|
|
195
|
+
first >= 224);
|
|
196
|
+
}
|
|
197
|
+
/** Eight 16-bit groups, or `null` when the literal is not valid IPv6. */
|
|
198
|
+
function expandIpv6(literal) {
|
|
199
|
+
const dottedTail = /^(.*:)(\d{1,3}(?:\.\d{1,3}){3})$/u.exec(literal);
|
|
200
|
+
const tailGroups = dottedTail ? ipv4ToIpv6Groups(dottedTail[2]) : null;
|
|
201
|
+
if (dottedTail && !tailGroups) {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
const hexLiteral = dottedTail && tailGroups ? `${dottedTail[1]}${tailGroups}` : literal;
|
|
205
|
+
if ((hexLiteral.match(/::/gu) ?? []).length > 1) {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
const [head, tail] = hexLiteral.includes('::')
|
|
209
|
+
? hexLiteral.split('::')
|
|
210
|
+
: [hexLiteral, null];
|
|
211
|
+
const headGroups = head ? head.split(':') : [];
|
|
212
|
+
const trailingGroups = tail ? tail.split(':') : [];
|
|
213
|
+
const missing = 8 - headGroups.length - trailingGroups.length;
|
|
214
|
+
if ((tail === null && missing !== 0) || missing < 0) {
|
|
215
|
+
return null;
|
|
216
|
+
}
|
|
217
|
+
const groups = [
|
|
218
|
+
...headGroups,
|
|
219
|
+
...Array.from({ length: tail === null ? 0 : missing }, () => '0'),
|
|
220
|
+
...trailingGroups,
|
|
221
|
+
];
|
|
222
|
+
return groups.every((group) => /^[0-9a-f]{1,4}$/u.test(group))
|
|
223
|
+
? groups.map((group) => Number.parseInt(group, 16))
|
|
224
|
+
: null;
|
|
225
|
+
}
|
|
226
|
+
function ipv4ToIpv6Groups(ipv4) {
|
|
227
|
+
const octets = ipv4.split('.').map((octet) => Number(octet));
|
|
228
|
+
if (octets.some((octet) => octet > 255)) {
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
return [
|
|
232
|
+
((octets[0] << 8) | octets[1]).toString(16),
|
|
233
|
+
((octets[2] << 8) | octets[3]).toString(16),
|
|
234
|
+
].join(':');
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* The IPv4 address an IPv6 literal carries in its low 32 bits, for the
|
|
238
|
+
* prefixes that route to it: IPv4-mapped ::ffff:0:0/96, SIIT
|
|
239
|
+
* ::ffff:0:0:0/96, IPv4-compatible ::/96 and NAT64 64:ff9b::/96.
|
|
240
|
+
*/
|
|
241
|
+
function readEmbeddedIpv4(groups) {
|
|
242
|
+
const prefix = groups.slice(0, 6);
|
|
243
|
+
const zeroes = (count) => prefix.slice(0, count).every((group) => group === 0);
|
|
244
|
+
const carriesIpv4 = (zeroes(5) && prefix[5] === 0xffff) ||
|
|
245
|
+
(zeroes(4) && prefix[4] === 0xffff && prefix[5] === 0) ||
|
|
246
|
+
// ::/96 minus :: and ::1, which are judged as IPv6 themselves.
|
|
247
|
+
(zeroes(6) && (groups[6] !== 0 || groups[7] > 1)) ||
|
|
248
|
+
(prefix[0] === 0x64 &&
|
|
249
|
+
prefix[1] === 0xff9b &&
|
|
250
|
+
prefix.slice(2).every((group) => group === 0));
|
|
251
|
+
if (!carriesIpv4) {
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
return [
|
|
255
|
+
groups[6] >> 8,
|
|
256
|
+
groups[6] & 0xff,
|
|
257
|
+
groups[7] >> 8,
|
|
258
|
+
groups[7] & 0xff,
|
|
259
|
+
].join('.');
|
|
260
|
+
}
|
|
261
|
+
function buildHostMatcher(hostname, pattern) {
|
|
262
|
+
const labels = hostname.split('.');
|
|
263
|
+
// "**" on its own is the any-host wildcard, which the bare "*" pattern
|
|
264
|
+
// normalizes to; every other use is a subdomain prefix.
|
|
265
|
+
if (labels.length === 1 && labels[0] === '**') {
|
|
266
|
+
return /^[a-z0-9.-]+$/u;
|
|
267
|
+
}
|
|
268
|
+
const parts = labels.map((label, index) => {
|
|
269
|
+
if (label === '**') {
|
|
270
|
+
if (index !== 0) {
|
|
271
|
+
throw new Error(`"${pattern}" may only use ** as the first host label`);
|
|
272
|
+
}
|
|
273
|
+
// Zero or more labels, so **.example.com also matches example.com.
|
|
274
|
+
return '(?:[a-z0-9-]+\\.)*';
|
|
275
|
+
}
|
|
276
|
+
if (label === '*') {
|
|
277
|
+
return `[a-z0-9-]+${index === labels.length - 1 ? '' : '\\.'}`;
|
|
278
|
+
}
|
|
279
|
+
if (label.includes('*')) {
|
|
280
|
+
throw new Error(`"${pattern}" may only use * as a whole host label, not part of one`);
|
|
281
|
+
}
|
|
282
|
+
return `${escapeRegExp(label)}${index === labels.length - 1 ? '' : '\\.'}`;
|
|
283
|
+
});
|
|
284
|
+
return new RegExp(`^${parts.join('')}$`, 'u');
|
|
285
|
+
}
|
|
286
|
+
function buildPathMatcher(path) {
|
|
287
|
+
const escaped = path
|
|
288
|
+
.split('*')
|
|
289
|
+
.map((segment) => escapeRegExp(segment))
|
|
290
|
+
.join('.*');
|
|
291
|
+
return new RegExp(`^${escaped}$`, 'u');
|
|
292
|
+
}
|
|
293
|
+
function escapeRegExp(value) {
|
|
294
|
+
return value.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=workflow-webhook-allowlist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-webhook-allowlist.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-webhook/workflow-webhook-allowlist.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { OnApplicationBootstrap } from '@nestjs/common';
|
|
2
|
+
import { EntityManager, Repository } from 'typeorm';
|
|
3
|
+
import { WorkflowWebhookEndpointEntity } from './workflow-webhook-endpoint.entity';
|
|
4
|
+
import { BPMResolvedWorkflowWebhookOptions } from './workflow-webhook-options';
|
|
5
|
+
import { BPMWorkflowWebhookEndpoint, BPMWorkflowWebhookEndpointSource } from './workflow-webhook.types';
|
|
6
|
+
/**
|
|
7
|
+
* Endpoints maintained by a BPM administrator (ADR 18 §3.13), read straight
|
|
8
|
+
* from `workflow_webhook_endpoints` on every lookup so a change applies to
|
|
9
|
+
* the next attempt without a restart or a cache to invalidate.
|
|
10
|
+
*
|
|
11
|
+
* A disabled row is still returned, flagged `disabled` (and `deprecated`, so
|
|
12
|
+
* the designer stops offering it): a delivery must be able to tell "switched
|
|
13
|
+
* off" from "never existed".
|
|
14
|
+
*/
|
|
15
|
+
export declare class DatabaseWorkflowWebhookEndpointSource implements BPMWorkflowWebhookEndpointSource, OnApplicationBootstrap {
|
|
16
|
+
private readonly endpointRepository;
|
|
17
|
+
readonly kind: "DATABASE";
|
|
18
|
+
private readonly logger;
|
|
19
|
+
private readonly cipher;
|
|
20
|
+
constructor(endpointRepository: Repository<WorkflowWebhookEndpointEntity>, options?: BPMResolvedWorkflowWebhookOptions);
|
|
21
|
+
/**
|
|
22
|
+
* A wrong key still boots (any 32 bytes parse), and would otherwise only
|
|
23
|
+
* show up as every database delivery failing to build its request. One
|
|
24
|
+
* stored value is decrypted at boot so the mistake is logged at once; the
|
|
25
|
+
* log names the problem, never a value.
|
|
26
|
+
*/
|
|
27
|
+
onApplicationBootstrap(): Promise<void>;
|
|
28
|
+
get(key: string, version: number, manager?: EntityManager): Promise<BPMWorkflowWebhookEndpoint | null>;
|
|
29
|
+
list(): Promise<readonly BPMWorkflowWebhookEndpoint[]>;
|
|
30
|
+
toEndpoint(row: WorkflowWebhookEndpointEntity): BPMWorkflowWebhookEndpoint;
|
|
31
|
+
private readHeaders;
|
|
32
|
+
private decrypt;
|
|
33
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var DatabaseWorkflowWebhookEndpointSource_1;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.DatabaseWorkflowWebhookEndpointSource = void 0;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const common_1 = require("@nestjs/common");
|
|
7
|
+
const typeorm_1 = require("@nestjs/typeorm");
|
|
8
|
+
const typeorm_2 = require("typeorm");
|
|
9
|
+
const workflow_webhook_endpoint_entity_1 = require("./workflow-webhook-endpoint.entity");
|
|
10
|
+
const workflow_webhook_options_1 = require("./workflow-webhook-options");
|
|
11
|
+
const workflow_webhook_secret_cipher_1 = require("./workflow-webhook-secret-cipher");
|
|
12
|
+
/**
|
|
13
|
+
* Endpoints maintained by a BPM administrator (ADR 18 §3.13), read straight
|
|
14
|
+
* from `workflow_webhook_endpoints` on every lookup so a change applies to
|
|
15
|
+
* the next attempt without a restart or a cache to invalidate.
|
|
16
|
+
*
|
|
17
|
+
* A disabled row is still returned, flagged `disabled` (and `deprecated`, so
|
|
18
|
+
* the designer stops offering it): a delivery must be able to tell "switched
|
|
19
|
+
* off" from "never existed".
|
|
20
|
+
*/
|
|
21
|
+
let DatabaseWorkflowWebhookEndpointSource = DatabaseWorkflowWebhookEndpointSource_1 = class DatabaseWorkflowWebhookEndpointSource {
|
|
22
|
+
constructor(endpointRepository, options = workflow_webhook_options_1.DEFAULT_BPM_WORKFLOW_WEBHOOK_OPTIONS) {
|
|
23
|
+
this.endpointRepository = endpointRepository;
|
|
24
|
+
this.kind = 'DATABASE';
|
|
25
|
+
this.logger = new common_1.Logger(DatabaseWorkflowWebhookEndpointSource_1.name);
|
|
26
|
+
this.cipher = options.secretEncryptionKey
|
|
27
|
+
? new workflow_webhook_secret_cipher_1.WorkflowWebhookSecretCipher(options.secretEncryptionKey)
|
|
28
|
+
: null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A wrong key still boots (any 32 bytes parse), and would otherwise only
|
|
32
|
+
* show up as every database delivery failing to build its request. One
|
|
33
|
+
* stored value is decrypted at boot so the mistake is logged at once; the
|
|
34
|
+
* log names the problem, never a value.
|
|
35
|
+
*/
|
|
36
|
+
async onApplicationBootstrap() {
|
|
37
|
+
if (!this.cipher) {
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const sample = await this.endpointRepository
|
|
41
|
+
.createQueryBuilder('endpoint')
|
|
42
|
+
.where('endpoint.encryptedHeaders IS NOT NULL OR endpoint.encryptedSigningSecret IS NOT NULL')
|
|
43
|
+
.getOne()
|
|
44
|
+
.catch(() => null);
|
|
45
|
+
const envelope = sample?.encryptedSigningSecret ?? sample?.encryptedHeaders ?? null;
|
|
46
|
+
if (!envelope) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
this.cipher.decrypt(envelope);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
this.logger.error('workflowWebhookSecretEncryptionKey cannot decrypt the stored webhook endpoint secrets; database endpoint deliveries will fail until the original key is restored');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async get(key, version, manager) {
|
|
57
|
+
const repository = manager?.getRepository(workflow_webhook_endpoint_entity_1.WorkflowWebhookEndpointEntity) ??
|
|
58
|
+
this.endpointRepository;
|
|
59
|
+
const row = await repository.findOne({ where: { key, version } });
|
|
60
|
+
return row ? this.toEndpoint(row) : null;
|
|
61
|
+
}
|
|
62
|
+
async list() {
|
|
63
|
+
const rows = await this.endpointRepository.find({
|
|
64
|
+
order: { key: 'ASC', version: 'ASC' },
|
|
65
|
+
});
|
|
66
|
+
return rows.map((row) => this.toEndpoint(row));
|
|
67
|
+
}
|
|
68
|
+
toEndpoint(row) {
|
|
69
|
+
return {
|
|
70
|
+
// Decrypted per attempt, so a rotated secret or edited header applies
|
|
71
|
+
// to deliveries that are already queued.
|
|
72
|
+
buildRequest: async () => ({
|
|
73
|
+
headers: this.readHeaders(row.encryptedHeaders),
|
|
74
|
+
method: readMethod(row.method),
|
|
75
|
+
...(row.encryptedSigningSecret
|
|
76
|
+
? { signingSecret: this.decrypt(row.encryptedSigningSecret) }
|
|
77
|
+
: {}),
|
|
78
|
+
...(row.timeoutMs ? { timeoutMs: row.timeoutMs } : {}),
|
|
79
|
+
url: row.url,
|
|
80
|
+
}),
|
|
81
|
+
descriptor: {
|
|
82
|
+
deprecated: row.deprecated || !row.isActive,
|
|
83
|
+
...(row.description ? { description: row.description } : {}),
|
|
84
|
+
disabled: !row.isActive,
|
|
85
|
+
key: row.key,
|
|
86
|
+
label: row.label,
|
|
87
|
+
parameters: row.parameters.map((parameter) => ({
|
|
88
|
+
...(parameter.description
|
|
89
|
+
? { description: parameter.description }
|
|
90
|
+
: {}),
|
|
91
|
+
key: parameter.key,
|
|
92
|
+
label: parameter.label,
|
|
93
|
+
required: parameter.required,
|
|
94
|
+
type: parameter.type,
|
|
95
|
+
})),
|
|
96
|
+
version: row.version,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
readHeaders(envelope) {
|
|
101
|
+
if (!envelope) {
|
|
102
|
+
return {};
|
|
103
|
+
}
|
|
104
|
+
const parsed = JSON.parse(this.decrypt(envelope));
|
|
105
|
+
return typeof parsed === 'object' && parsed !== null
|
|
106
|
+
? Object.fromEntries(Object.entries(parsed).filter((entry) => typeof entry[1] === 'string'))
|
|
107
|
+
: {};
|
|
108
|
+
}
|
|
109
|
+
decrypt(envelope) {
|
|
110
|
+
if (!this.cipher) {
|
|
111
|
+
// Unreachable through BPM's own wiring: without a key the options
|
|
112
|
+
// resolution drops this source, so its rows are not looked up at all.
|
|
113
|
+
throw new Error('Webhook secret encryption key is not configured');
|
|
114
|
+
}
|
|
115
|
+
return this.cipher.decrypt(envelope);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
exports.DatabaseWorkflowWebhookEndpointSource = DatabaseWorkflowWebhookEndpointSource;
|
|
119
|
+
exports.DatabaseWorkflowWebhookEndpointSource = DatabaseWorkflowWebhookEndpointSource = DatabaseWorkflowWebhookEndpointSource_1 = tslib_1.__decorate([
|
|
120
|
+
(0, common_1.Injectable)(),
|
|
121
|
+
tslib_1.__param(0, (0, typeorm_1.InjectRepository)(workflow_webhook_endpoint_entity_1.WorkflowWebhookEndpointEntity)),
|
|
122
|
+
tslib_1.__param(1, (0, common_1.Optional)()),
|
|
123
|
+
tslib_1.__param(1, (0, common_1.Inject)(workflow_webhook_options_1.BPM_WORKFLOW_WEBHOOK_OPTIONS)),
|
|
124
|
+
tslib_1.__metadata("design:paramtypes", [typeorm_2.Repository, Object])
|
|
125
|
+
], DatabaseWorkflowWebhookEndpointSource);
|
|
126
|
+
function readMethod(value) {
|
|
127
|
+
return value === 'PUT' || value === 'PATCH' ? value : 'POST';
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=workflow-webhook-database-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-webhook-database-source.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-webhook/workflow-webhook-database-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { OnApplicationBootstrap, OnApplicationShutdown } from '@nestjs/common';
|
|
2
|
+
import { WorkflowWebhookDeliveryService } from './workflow-webhook-delivery.service';
|
|
3
|
+
import { WorkflowWebhookService } from './workflow-webhook.service';
|
|
4
|
+
/**
|
|
5
|
+
* The fallback that retries failed attempts, releases rows the immediate kick
|
|
6
|
+
* missed, and reclaims rows a crashed worker left in progress. `SKIP LOCKED`
|
|
7
|
+
* in the claim lets several API instances run it at once.
|
|
8
|
+
*/
|
|
9
|
+
export declare class WorkflowWebhookDeliverySchedulerService implements OnApplicationBootstrap, OnApplicationShutdown {
|
|
10
|
+
private readonly deliveryService;
|
|
11
|
+
private readonly webhookService;
|
|
12
|
+
private readonly logger;
|
|
13
|
+
private timer;
|
|
14
|
+
private scanning;
|
|
15
|
+
constructor(deliveryService: WorkflowWebhookDeliveryService, webhookService: WorkflowWebhookService);
|
|
16
|
+
onApplicationBootstrap(): Promise<void>;
|
|
17
|
+
onApplicationShutdown(): void;
|
|
18
|
+
/**
|
|
19
|
+
* Unset means "on when there is anything to deliver to": a host with no
|
|
20
|
+
* endpoints gets no idle timer, and one with endpoints never silently loses
|
|
21
|
+
* its retries.
|
|
22
|
+
*/
|
|
23
|
+
isEnabled(): Promise<boolean>;
|
|
24
|
+
scan(): Promise<void>;
|
|
25
|
+
}
|