velocious 1.0.596 → 1.0.597
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/README.md +16 -0
- package/build/background-jobs/pooled-runner-broker-identity.js +22 -4
- package/build/background-jobs/store.js +383 -9
- package/build/background-jobs/types.js +1 -0
- package/build/cli/commands/db/tenants/migrations/pending.js +45 -0
- package/build/configuration-types.js +3 -0
- package/build/configuration.js +5 -2
- package/build/database/drivers/sqlite/base.js +3 -3
- package/build/database/tenants/migration-pending-inspector.js +77 -0
- package/build/environment-handlers/base.js +8 -0
- package/build/environment-handlers/node.js +14 -0
- package/build/mailer/backends/resend-smtp.js +121 -0
- package/build/mailer/base.js +52 -22
- package/build/mailer/delivery-operation-store.js +152 -0
- package/build/mailer/delivery-operation.js +205 -0
- package/build/mailer/delivery.js +9 -4
- package/build/mailer/index.js +5 -1
- package/build/mailer.js +6 -1
- package/build/src/background-jobs/pooled-runner-broker-identity.d.ts +10 -1
- package/build/src/background-jobs/pooled-runner-broker-identity.d.ts.map +1 -1
- package/build/src/background-jobs/pooled-runner-broker-identity.js +23 -5
- package/build/src/background-jobs/store.d.ts +154 -0
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +350 -10
- package/build/src/background-jobs/types.d.ts +5 -0
- package/build/src/background-jobs/types.d.ts.map +1 -1
- package/build/src/background-jobs/types.js +2 -1
- package/build/src/cli/commands/db/tenants/migrations/pending.d.ts +15 -0
- package/build/src/cli/commands/db/tenants/migrations/pending.d.ts.map +1 -0
- package/build/src/cli/commands/db/tenants/migrations/pending.js +40 -0
- package/build/src/configuration-types.d.ts +20 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +4 -1
- package/build/src/configuration.d.ts +2 -2
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +6 -3
- package/build/src/database/drivers/sqlite/base.js +4 -4
- package/build/src/database/tenants/migration-pending-inspector.d.ts +38 -0
- package/build/src/database/tenants/migration-pending-inspector.d.ts.map +1 -0
- package/build/src/database/tenants/migration-pending-inspector.js +70 -0
- package/build/src/environment-handlers/base.d.ts +10 -0
- package/build/src/environment-handlers/base.d.ts.map +1 -1
- package/build/src/environment-handlers/base.js +8 -1
- package/build/src/environment-handlers/node.d.ts +11 -0
- package/build/src/environment-handlers/node.d.ts.map +1 -1
- package/build/src/environment-handlers/node.js +14 -1
- package/build/src/mailer/backends/resend-smtp.d.ts +43 -0
- package/build/src/mailer/backends/resend-smtp.d.ts.map +1 -0
- package/build/src/mailer/backends/resend-smtp.js +106 -0
- package/build/src/mailer/base.d.ts +9 -2
- package/build/src/mailer/base.d.ts.map +1 -1
- package/build/src/mailer/base.js +41 -19
- package/build/src/mailer/delivery-operation-store.d.ts +52 -0
- package/build/src/mailer/delivery-operation-store.d.ts.map +1 -0
- package/build/src/mailer/delivery-operation-store.js +130 -0
- package/build/src/mailer/delivery-operation.d.ts +73 -0
- package/build/src/mailer/delivery-operation.d.ts.map +1 -0
- package/build/src/mailer/delivery-operation.js +185 -0
- package/build/src/mailer/delivery.d.ts +4 -2
- package/build/src/mailer/delivery.d.ts.map +1 -1
- package/build/src/mailer/delivery.js +9 -5
- package/build/src/mailer/index.d.ts +24 -1
- package/build/src/mailer/index.d.ts.map +1 -1
- package/build/src/mailer/index.js +6 -2
- package/build/src/mailer.d.ts +11 -13
- package/build/src/mailer.d.ts.map +1 -1
- package/build/src/mailer.js +7 -2
- package/build/src/sync/local-mutation-log.d.ts +5 -5
- package/build/src/sync/local-mutation-log.d.ts.map +1 -1
- package/build/src/sync/local-mutation-log.js +34 -10
- package/build/src/sync/stable-json.d.ts +1 -8
- package/build/src/sync/stable-json.d.ts.map +1 -1
- package/build/src/sync/stable-json.js +2 -27
- package/build/src/sync/sync-envelope-replay-service.d.ts +3 -2
- package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/sync-envelope-replay-service.js +12 -8
- package/build/src/utils/stable-json.d.ts +7 -0
- package/build/src/utils/stable-json.d.ts.map +1 -0
- package/build/src/utils/stable-json.js +25 -0
- package/build/sync/local-mutation-log.js +37 -6
- package/build/sync/stable-json.js +1 -28
- package/build/sync/sync-envelope-replay-service.js +11 -7
- package/build/tsconfig.tsbuildinfo +1 -1
- package/build/utils/stable-json.js +26 -0
- package/package.json +1 -1
- package/src/background-jobs/pooled-runner-broker-identity.js +22 -4
- package/src/background-jobs/store.js +383 -9
- package/src/background-jobs/types.js +1 -0
- package/src/cli/commands/db/tenants/migrations/pending.js +45 -0
- package/src/configuration-types.js +3 -0
- package/src/configuration.js +5 -2
- package/src/database/drivers/sqlite/base.js +3 -3
- package/src/database/tenants/migration-pending-inspector.js +77 -0
- package/src/environment-handlers/base.js +8 -0
- package/src/environment-handlers/node.js +14 -0
- package/src/mailer/backends/resend-smtp.js +121 -0
- package/src/mailer/base.js +52 -22
- package/src/mailer/delivery-operation-store.js +152 -0
- package/src/mailer/delivery-operation.js +205 -0
- package/src/mailer/delivery.js +9 -4
- package/src/mailer/index.js +5 -1
- package/src/mailer.js +6 -1
- package/src/sync/local-mutation-log.js +37 -6
- package/src/sync/stable-json.js +1 -28
- package/src/sync/sync-envelope-replay-service.js +11 -7
- package/src/utils/stable-json.js +26 -0
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import SmtpMailerBackend from "./smtp.js";
|
|
3
|
+
import VelociousError from "../../velocious-error.js";
|
|
4
|
+
import { deliveryOperationFromPayload } from "../delivery-operation.js";
|
|
5
|
+
const PROVIDER_KIND = "resend-smtp";
|
|
6
|
+
const RETENTION_MS = 24 * 60 * 60 * 1000;
|
|
7
|
+
const IDEMPOTENCY_HEADER = "Resend-Idempotency-Key";
|
|
8
|
+
/**
|
|
9
|
+
* Checks whether a value contains an SMTP header control character.
|
|
10
|
+
* @param {string} value - Header value.
|
|
11
|
+
* @returns {boolean} - Whether a control character is present.
|
|
12
|
+
*/
|
|
13
|
+
function containsHeaderValueControlCharacter(value) {
|
|
14
|
+
for (const character of value) {
|
|
15
|
+
const codePoint = character.charCodeAt(0);
|
|
16
|
+
if (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f))
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Keeps the provider-owned operation header out of caller payloads.
|
|
23
|
+
* @param {import("../index.js").MailerDeliveryPayload} payload - Mail payload.
|
|
24
|
+
* @returns {void}
|
|
25
|
+
*/
|
|
26
|
+
function rejectReservedHeaderOverride(payload) {
|
|
27
|
+
if (Object.keys(payload.headers || {}).some((name) => name.toLowerCase() === IDEMPOTENCY_HEADER.toLowerCase())) {
|
|
28
|
+
throw VelociousError.safe(`Reserved mail header ${IDEMPOTENCY_HEADER} is owned by ResendSmtpMailerBackend required delivery operations.`, {
|
|
29
|
+
code: "mail-delivery-idempotency-header-reserved"
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resend SMTP transport with Resend's documented 24-hour idempotency header.
|
|
35
|
+
*/
|
|
36
|
+
export default class ResendSmtpMailerBackend extends SmtpMailerBackend {
|
|
37
|
+
/**
|
|
38
|
+
* Resolves the SMTP sender before it becomes part of the immutable digest.
|
|
39
|
+
* @param {object} args - Preparation input.
|
|
40
|
+
* @param {import("../index.js").MailerDeliveryPayload} args.payload - Rendered payload.
|
|
41
|
+
* @returns {import("../index.js").MailerDeliveryPayload} - Provider-ready payload.
|
|
42
|
+
*/
|
|
43
|
+
prepareDeliveryOperationPayload({ payload }) {
|
|
44
|
+
const from = payload.from || this.defaultFrom;
|
|
45
|
+
if (!from) {
|
|
46
|
+
throw VelociousError.safe("Required Resend mail delivery needs a from address.", {
|
|
47
|
+
code: "mail-delivery-from-missing"
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
return { ...payload, from };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Advertises the provider-specific guarantee used by required operations.
|
|
54
|
+
* @returns {import("../index.js").MailerDeliveryIdempotencyCapability} - Capability.
|
|
55
|
+
*/
|
|
56
|
+
deliveryIdempotencyCapability() {
|
|
57
|
+
return { providerKind: PROVIDER_KIND, retentionMs: RETENTION_MS };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Validates Resend's documented length and SMTP header-value safety contract.
|
|
61
|
+
* @param {object} args - Validation input.
|
|
62
|
+
* @param {import("../index.js").MailerDeliveryOperationRequest | import("../index.js").MailerDeliveryOperation} args.deliveryOperation - Operation.
|
|
63
|
+
* @param {import("../index.js").MailerDeliveryPayload} args.payload - Rendered or persisted mail payload.
|
|
64
|
+
* @returns {void}
|
|
65
|
+
*/
|
|
66
|
+
validateDeliveryOperation({ deliveryOperation, payload }) {
|
|
67
|
+
if (typeof deliveryOperation.id !== "string" ||
|
|
68
|
+
deliveryOperation.id.length < 1 ||
|
|
69
|
+
deliveryOperation.id.length > 256 ||
|
|
70
|
+
containsHeaderValueControlCharacter(deliveryOperation.id)) {
|
|
71
|
+
throw VelociousError.safe("Resend idempotency keys must contain between 1 and 256 characters without control characters.", {
|
|
72
|
+
code: "mail-delivery-idempotency-key-invalid"
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
rejectReservedHeaderOverride(payload);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Injects the framework-owned Resend operation header before generic SMTP serialization.
|
|
79
|
+
* @param {object} args - Delivery args.
|
|
80
|
+
* @param {import("../index.js").MailerDeliveryPayload} args.payload - Mail payload.
|
|
81
|
+
* @param {import("../../configuration.js").default} [args.configuration] - Active configuration.
|
|
82
|
+
* @returns {Promise<void>} - Resolves when accepted and shut down.
|
|
83
|
+
*/
|
|
84
|
+
async deliver({ payload, configuration }) {
|
|
85
|
+
const headers = payload.headers || {};
|
|
86
|
+
if (payload.deliveryOperation) {
|
|
87
|
+
this.validateDeliveryOperation({ deliveryOperation: payload.deliveryOperation, payload });
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
rejectReservedHeaderOverride(payload);
|
|
91
|
+
}
|
|
92
|
+
const operation = deliveryOperationFromPayload(payload);
|
|
93
|
+
if (!operation) {
|
|
94
|
+
await super.deliver({ payload, configuration });
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
await super.deliver({
|
|
98
|
+
configuration,
|
|
99
|
+
payload: {
|
|
100
|
+
...payload,
|
|
101
|
+
headers: { ...headers, [IDEMPOTENCY_HEADER]: operation.id }
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzZW5kLXNtdHAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbWFpbGVyL2JhY2tlbmRzL3Jlc2VuZC1zbXRwLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGlCQUFpQixNQUFNLFdBQVcsQ0FBQTtBQUN6QyxPQUFPLGNBQWMsTUFBTSwwQkFBMEIsQ0FBQTtBQUNyRCxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQTtBQUVyRSxNQUFNLGFBQWEsR0FBRyxhQUFhLENBQUE7QUFDbkMsTUFBTSxZQUFZLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFBO0FBQ3hDLE1BQU0sa0JBQWtCLEdBQUcsd0JBQXdCLENBQUE7QUFFbkQ7Ozs7R0FJRztBQUNILFNBQVMsbUNBQW1DLENBQUMsS0FBSztJQUNoRCxLQUFLLE1BQU0sU0FBUyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzlCLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFFekMsSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUE7SUFDaEYsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLDRCQUE0QixDQUFDLE9BQU87SUFDM0MsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssa0JBQWtCLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQy9HLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyx3QkFBd0Isa0JBQWtCLG9FQUFvRSxFQUFFO1lBQ3hJLElBQUksRUFBRSwyQ0FBMkM7U0FDbEQsQ0FBQyxDQUFBO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sdUJBQXdCLFNBQVEsaUJBQWlCO0lBQ3BFOzs7OztPQUtHO0lBQ0gsK0JBQStCLENBQUMsRUFBQyxPQUFPLEVBQUM7UUFDdkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFBO1FBRTdDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxxREFBcUQsRUFBRTtnQkFDL0UsSUFBSSxFQUFFLDRCQUE0QjthQUNuQyxDQUFDLENBQUE7UUFDSixDQUFDO1FBRUQsT0FBTyxFQUFDLEdBQUcsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFBO0lBQzNCLENBQUM7SUFFRDs7O09BR0c7SUFDSCw2QkFBNkI7UUFDM0IsT0FBTyxFQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBQyxDQUFBO0lBQ2pFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCx5QkFBeUIsQ0FBQyxFQUFDLGlCQUFpQixFQUFFLE9BQU8sRUFBQztRQUNwRCxJQUNFLE9BQU8saUJBQWlCLENBQUMsRUFBRSxLQUFLLFFBQVE7WUFDeEMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQy9CLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxNQUFNLEdBQUcsR0FBRztZQUNqQyxtQ0FBbUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsRUFDekQsQ0FBQztZQUNELE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQywrRkFBK0YsRUFBRTtnQkFDekgsSUFBSSxFQUFFLHVDQUF1QzthQUM5QyxDQUFDLENBQUE7UUFDSixDQUFDO1FBRUQsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDdkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBQyxPQUFPLEVBQUUsYUFBYSxFQUFDO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFBO1FBRXJDLElBQUksT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDOUIsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEVBQUMsaUJBQWlCLEVBQUUsT0FBTyxDQUFDLGlCQUFpQixFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7UUFDekYsQ0FBQzthQUFNLENBQUM7WUFDTiw0QkFBNEIsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUN2QyxDQUFDO1FBQ0QsTUFBTSxTQUFTLEdBQUcsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFdkQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2YsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUMsT0FBTyxFQUFFLGFBQWEsRUFBQyxDQUFDLENBQUE7WUFDN0MsT0FBTTtRQUNSLENBQUM7UUFFRCxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDbEIsYUFBYTtZQUNiLE9BQU8sRUFBRTtnQkFDUCxHQUFHLE9BQU87Z0JBQ1YsT0FBTyxFQUFFLEVBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUM7YUFDMUQ7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IFNtdHBNYWlsZXJCYWNrZW5kIGZyb20gXCIuL3NtdHAuanNcIlxuaW1wb3J0IFZlbG9jaW91c0Vycm9yIGZyb20gXCIuLi8uLi92ZWxvY2lvdXMtZXJyb3IuanNcIlxuaW1wb3J0IHtkZWxpdmVyeU9wZXJhdGlvbkZyb21QYXlsb2FkfSBmcm9tIFwiLi4vZGVsaXZlcnktb3BlcmF0aW9uLmpzXCJcblxuY29uc3QgUFJPVklERVJfS0lORCA9IFwicmVzZW5kLXNtdHBcIlxuY29uc3QgUkVURU5USU9OX01TID0gMjQgKiA2MCAqIDYwICogMTAwMFxuY29uc3QgSURFTVBPVEVOQ1lfSEVBREVSID0gXCJSZXNlbmQtSWRlbXBvdGVuY3ktS2V5XCJcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIHZhbHVlIGNvbnRhaW5zIGFuIFNNVFAgaGVhZGVyIGNvbnRyb2wgY2hhcmFjdGVyLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIC0gSGVhZGVyIHZhbHVlLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBhIGNvbnRyb2wgY2hhcmFjdGVyIGlzIHByZXNlbnQuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5zSGVhZGVyVmFsdWVDb250cm9sQ2hhcmFjdGVyKHZhbHVlKSB7XG4gIGZvciAoY29uc3QgY2hhcmFjdGVyIG9mIHZhbHVlKSB7XG4gICAgY29uc3QgY29kZVBvaW50ID0gY2hhcmFjdGVyLmNoYXJDb2RlQXQoMClcblxuICAgIGlmIChjb2RlUG9pbnQgPD0gMHgxZiB8fCAoY29kZVBvaW50ID49IDB4N2YgJiYgY29kZVBvaW50IDw9IDB4OWYpKSByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogS2VlcHMgdGhlIHByb3ZpZGVyLW93bmVkIG9wZXJhdGlvbiBoZWFkZXIgb3V0IG9mIGNhbGxlciBwYXlsb2Fkcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkfSBwYXlsb2FkIC0gTWFpbCBwYXlsb2FkLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHJlamVjdFJlc2VydmVkSGVhZGVyT3ZlcnJpZGUocGF5bG9hZCkge1xuICBpZiAoT2JqZWN0LmtleXMocGF5bG9hZC5oZWFkZXJzIHx8IHt9KS5zb21lKChuYW1lKSA9PiBuYW1lLnRvTG93ZXJDYXNlKCkgPT09IElERU1QT1RFTkNZX0hFQURFUi50b0xvd2VyQ2FzZSgpKSkge1xuICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoYFJlc2VydmVkIG1haWwgaGVhZGVyICR7SURFTVBPVEVOQ1lfSEVBREVSfSBpcyBvd25lZCBieSBSZXNlbmRTbXRwTWFpbGVyQmFja2VuZCByZXF1aXJlZCBkZWxpdmVyeSBvcGVyYXRpb25zLmAsIHtcbiAgICAgIGNvZGU6IFwibWFpbC1kZWxpdmVyeS1pZGVtcG90ZW5jeS1oZWFkZXItcmVzZXJ2ZWRcIlxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBSZXNlbmQgU01UUCB0cmFuc3BvcnQgd2l0aCBSZXNlbmQncyBkb2N1bWVudGVkIDI0LWhvdXIgaWRlbXBvdGVuY3kgaGVhZGVyLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXNlbmRTbXRwTWFpbGVyQmFja2VuZCBleHRlbmRzIFNtdHBNYWlsZXJCYWNrZW5kIHtcbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBTTVRQIHNlbmRlciBiZWZvcmUgaXQgYmVjb21lcyBwYXJ0IG9mIHRoZSBpbW11dGFibGUgZGlnZXN0LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFByZXBhcmF0aW9uIGlucHV0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZH0gYXJncy5wYXlsb2FkIC0gUmVuZGVyZWQgcGF5bG9hZC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZH0gLSBQcm92aWRlci1yZWFkeSBwYXlsb2FkLlxuICAgKi9cbiAgcHJlcGFyZURlbGl2ZXJ5T3BlcmF0aW9uUGF5bG9hZCh7cGF5bG9hZH0pIHtcbiAgICBjb25zdCBmcm9tID0gcGF5bG9hZC5mcm9tIHx8IHRoaXMuZGVmYXVsdEZyb21cblxuICAgIGlmICghZnJvbSkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIlJlcXVpcmVkIFJlc2VuZCBtYWlsIGRlbGl2ZXJ5IG5lZWRzIGEgZnJvbSBhZGRyZXNzLlwiLCB7XG4gICAgICAgIGNvZGU6IFwibWFpbC1kZWxpdmVyeS1mcm9tLW1pc3NpbmdcIlxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gey4uLnBheWxvYWQsIGZyb219XG4gIH1cblxuICAvKipcbiAgICogQWR2ZXJ0aXNlcyB0aGUgcHJvdmlkZXItc3BlY2lmaWMgZ3VhcmFudGVlIHVzZWQgYnkgcmVxdWlyZWQgb3BlcmF0aW9ucy5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5SWRlbXBvdGVuY3lDYXBhYmlsaXR5fSAtIENhcGFiaWxpdHkuXG4gICAqL1xuICBkZWxpdmVyeUlkZW1wb3RlbmN5Q2FwYWJpbGl0eSgpIHtcbiAgICByZXR1cm4ge3Byb3ZpZGVyS2luZDogUFJPVklERVJfS0lORCwgcmV0ZW50aW9uTXM6IFJFVEVOVElPTl9NU31cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgUmVzZW5kJ3MgZG9jdW1lbnRlZCBsZW5ndGggYW5kIFNNVFAgaGVhZGVyLXZhbHVlIHNhZmV0eSBjb250cmFjdC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBWYWxpZGF0aW9uIGlucHV0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5T3BlcmF0aW9uUmVxdWVzdCB8IGltcG9ydChcIi4uL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5T3BlcmF0aW9ufSBhcmdzLmRlbGl2ZXJ5T3BlcmF0aW9uIC0gT3BlcmF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZH0gYXJncy5wYXlsb2FkIC0gUmVuZGVyZWQgb3IgcGVyc2lzdGVkIG1haWwgcGF5bG9hZC5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICB2YWxpZGF0ZURlbGl2ZXJ5T3BlcmF0aW9uKHtkZWxpdmVyeU9wZXJhdGlvbiwgcGF5bG9hZH0pIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGVsaXZlcnlPcGVyYXRpb24uaWQgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgIGRlbGl2ZXJ5T3BlcmF0aW9uLmlkLmxlbmd0aCA8IDEgfHxcbiAgICAgIGRlbGl2ZXJ5T3BlcmF0aW9uLmlkLmxlbmd0aCA+IDI1NiB8fFxuICAgICAgY29udGFpbnNIZWFkZXJWYWx1ZUNvbnRyb2xDaGFyYWN0ZXIoZGVsaXZlcnlPcGVyYXRpb24uaWQpXG4gICAgKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKFwiUmVzZW5kIGlkZW1wb3RlbmN5IGtleXMgbXVzdCBjb250YWluIGJldHdlZW4gMSBhbmQgMjU2IGNoYXJhY3RlcnMgd2l0aG91dCBjb250cm9sIGNoYXJhY3RlcnMuXCIsIHtcbiAgICAgICAgY29kZTogXCJtYWlsLWRlbGl2ZXJ5LWlkZW1wb3RlbmN5LWtleS1pbnZhbGlkXCJcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgcmVqZWN0UmVzZXJ2ZWRIZWFkZXJPdmVycmlkZShwYXlsb2FkKVxuICB9XG5cbiAgLyoqXG4gICAqIEluamVjdHMgdGhlIGZyYW1ld29yay1vd25lZCBSZXNlbmQgb3BlcmF0aW9uIGhlYWRlciBiZWZvcmUgZ2VuZXJpYyBTTVRQIHNlcmlhbGl6YXRpb24uXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gRGVsaXZlcnkgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWR9IGFyZ3MucGF5bG9hZCAtIE1haWwgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQWN0aXZlIGNvbmZpZ3VyYXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gYWNjZXB0ZWQgYW5kIHNodXQgZG93bi5cbiAgICovXG4gIGFzeW5jIGRlbGl2ZXIoe3BheWxvYWQsIGNvbmZpZ3VyYXRpb259KSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHBheWxvYWQuaGVhZGVycyB8fCB7fVxuXG4gICAgaWYgKHBheWxvYWQuZGVsaXZlcnlPcGVyYXRpb24pIHtcbiAgICAgIHRoaXMudmFsaWRhdGVEZWxpdmVyeU9wZXJhdGlvbih7ZGVsaXZlcnlPcGVyYXRpb246IHBheWxvYWQuZGVsaXZlcnlPcGVyYXRpb24sIHBheWxvYWR9KVxuICAgIH0gZWxzZSB7XG4gICAgICByZWplY3RSZXNlcnZlZEhlYWRlck92ZXJyaWRlKHBheWxvYWQpXG4gICAgfVxuICAgIGNvbnN0IG9wZXJhdGlvbiA9IGRlbGl2ZXJ5T3BlcmF0aW9uRnJvbVBheWxvYWQocGF5bG9hZClcblxuICAgIGlmICghb3BlcmF0aW9uKSB7XG4gICAgICBhd2FpdCBzdXBlci5kZWxpdmVyKHtwYXlsb2FkLCBjb25maWd1cmF0aW9ufSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGF3YWl0IHN1cGVyLmRlbGl2ZXIoe1xuICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgLi4ucGF5bG9hZCxcbiAgICAgICAgaGVhZGVyczogey4uLmhlYWRlcnMsIFtJREVNUE9URU5DWV9IRUFERVJdOiBvcGVyYXRpb24uaWR9XG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuIl19
|
|
@@ -89,9 +89,10 @@ export declare class VelociousMailerBase {
|
|
|
89
89
|
/**
|
|
90
90
|
* Runs enqueue payload.
|
|
91
91
|
* @param {import("./index.js").MailerDeliveryPayload} payload - Mail delivery payload.
|
|
92
|
+
* @param {import("./index.js").MailerDeliveryLaterOptions} [options] - Delivery execution options.
|
|
92
93
|
* @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
|
|
93
94
|
*/
|
|
94
|
-
_enqueuePayload(payload: import("./index.js").MailerDeliveryPayload): Promise<string | import("./index.js").MailerDeliveryPayload | null>;
|
|
95
|
+
_enqueuePayload(payload: import("./index.js").MailerDeliveryPayload, options?: import("./index.js").MailerDeliveryLaterOptions): Promise<string | import("./index.js").MailerDeliveryPayload | null>;
|
|
95
96
|
}
|
|
96
97
|
/**
|
|
97
98
|
* Runs the deliveries helper.
|
|
@@ -123,7 +124,13 @@ export declare function deliverPayload(payload: import("./index.js").MailerDeliv
|
|
|
123
124
|
/**
|
|
124
125
|
* Runs the enqueuePayload helper.
|
|
125
126
|
* @param {import("./index.js").MailerDeliveryPayload} payload - Mail delivery payload.
|
|
127
|
+
* @param {object} [options] - Enqueue options.
|
|
128
|
+
* @param {import("../configuration.js").default} [options.configuration] - Owning configuration.
|
|
129
|
+
* @param {import("./index.js").MailerDeliveryOperationRequest} [options.deliveryOperation] - Required provider-backed operation.
|
|
126
130
|
* @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
|
|
127
131
|
*/
|
|
128
|
-
export declare function enqueuePayload(payload: import("./index.js").MailerDeliveryPayload
|
|
132
|
+
export declare function enqueuePayload(payload: import("./index.js").MailerDeliveryPayload, { configuration: suppliedConfiguration, deliveryOperation }?: {
|
|
133
|
+
configuration?: import("../configuration.js").default;
|
|
134
|
+
deliveryOperation?: import("./index.js").MailerDeliveryOperationRequest;
|
|
135
|
+
}): Promise<string | import("./index.js").MailerDeliveryPayload | null>;
|
|
129
136
|
//# sourceMappingURL=base.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/mailer/base.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/mailer/base.js"],"names":[],"mappings":"AAQA,OAAO,cAAc,MAAM,eAAe,CAAA;AAmE1C;;GAEG;AACH,qBAAa,mBAAmB;IAOvB,WAAW;IACX,YAAY;;;;;;;;;IACZ,WAAW;IACX,qBAAqB;IAT5B;;;;OAIG;IACH,YAAY,EAAC,aAAa,EAAC,AAHxB,CAEF,EADE;QAAqD,aAAa,AAAlE,CACF,EADU,OAAO,qBAAqB,EAAE,OAAO,CAC/C;KAC+B,EAK/B;IAED;;;;OAIG;IACH,UAAU,CAAC,MAAM,EAHN,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAGtC,GAFJ,IAAI,CAIhB;IAED;;;;;;;;;;;;;OAaG;IACH,IAAI,CAAC,EAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,QAAQ,EAAC,EAXxF;QAA4C,EAAE,EAAtC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CACrC;QAAqB,OAAO,EAApB,MAAM,CACd;QAA6C,IAAI,AAAjD,CACA,EADQ,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CACrC;QAA6C,EAAE,AAA/C,CACA,EADQ,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CACrC;QAA6C,GAAG,AAAhD,CACA,EADQ,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CACrC;QAA6C,OAAO,AAApD,CACA,EADQ,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CACrC;QAAsC,OAAO,AAA7C,CACA,EADQ,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAC9B;QAAsB,UAAU,AAAhC,CACA,EADQ,MAAM,CACd;QAAsF,aAAa,AAAnG,CACA,EADQ,OAAO,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAC9E;KAEwF,GAF9E,cAAc,CAoB1B;IAED;;;OAGG;IACG,iBAAiB,IAFV,OAAO,CAAC,OAAO,qBAAqB,EAAE,OAAO,CAAC,CAI1D;IAED;;;OAGG;IACH,cAAc,IAFD,MAAM,CAQlB;IAED;;;;OAIG;IACH,iBAAiB,CAAC,IAAI,EAHX,MAGW,GAFT,OAAO,YAAY,EAAE,qBAAqB,CA6BtD;IAED;;;OAGG;IACG,aAAa,IAFN,OAAO,CAAC,OAAO,YAAY,EAAE,qBAAqB,CAAC,CAM/D;IAED;;;OAGG;IACG,WAAW,IAFJ,OAAO,CAAC,MAAM,CAAC,CA0B3B;IAED;;;;OAIG;IACG,eAAe,CAAC,OAAO,EAHlB,OAAO,YAAY,EAAE,qBAGH,GAFhB,OAAO,CAAC,OAAO,YAAY,EAAE,qBAAqB,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAI/F;IAED;;;;;OAKG;IACG,eAAe,CAAC,OAAO,EAJlB,OAAO,YAAY,EAAE,qBAIH,EAAE,OAAO,AAHnC,CACA,EADQ,OAAO,YAAY,EAAE,0BAGM,GAFzB,OAAO,CAAC,MAAM,GAAG,OAAO,YAAY,EAAE,qBAAqB,GAAG,IAAI,CAAC,CAM/E;CACF;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAFb,OAAO,YAAY,EAAE,qBAAqB,EAAE,CAIxD;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAFlB,IAAI,CAIhB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAH/B,CAAC,OAAO,EAAE,OAAO,YAAY,EAAE,qBAAqB,KAAK,OAAO,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAG/F,GAF7B,IAAI,CAIhB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAFrB,CAAC,CAAC,OAAO,EAAE,OAAO,YAAY,EAAE,qBAAqB,KAAK,OAAO,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAIpJ;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAHjC,OAAO,YAAY,EAAE,qBAGY,GAF/B,OAAO,CAAC,OAAO,YAAY,EAAE,qBAAqB,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CA8B/F;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,OAAO,EANjC,OAAO,YAAY,EAAE,qBAMY,EAAE,EAAC,aAAa,EAAE,qBAAqB,EAAE,iBAAiB,EAAC,AALpG,CAGA,EAFA;IAAwD,aAAa,AAArE,CACA,EADQ,OAAO,qBAAqB,EAAE,OAAO,CAC7C;IAAsE,iBAAiB,AAAvF,CACA,EADQ,OAAO,YAAY,EAAE,8BAA8B,CAC3D;CAEyG,GAF/F,OAAO,CAAC,MAAM,GAAG,OAAO,YAAY,EAAE,qBAAqB,GAAG,IAAI,CAAC,CA8B/E"}
|
package/build/src/mailer/base.js
CHANGED
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
import ejs from "ejs";
|
|
3
3
|
import { incorporate } from "incorporator";
|
|
4
4
|
import * as inflection from "inflection";
|
|
5
|
+
import BackgroundJobsClient from "../background-jobs/client.js";
|
|
5
6
|
import configurationResolver from "../configuration-resolver.js";
|
|
6
7
|
import restArgsError from "../utils/rest-args-error.js";
|
|
7
8
|
import MailerDelivery from "./delivery.js";
|
|
9
|
+
import MailerDeliveryOperationStore from "./delivery-operation-store.js";
|
|
10
|
+
import { deliveryOperationFromPayload, prepareRequiredDeliveryPayload, requireDeliveryIdempotencyCapability } from "./delivery-operation.js";
|
|
8
11
|
/**
|
|
9
12
|
* Deliveries store.
|
|
10
13
|
* @type {import("./index.js").MailerDeliveryPayload[]} */
|
|
@@ -59,14 +62,6 @@ function inferActionName(mailerClass, stack) {
|
|
|
59
62
|
}
|
|
60
63
|
return actionName;
|
|
61
64
|
}
|
|
62
|
-
/**
|
|
63
|
-
* Runs is testing environment.
|
|
64
|
-
* @returns {Promise<boolean>} - Whether the current environment is test.
|
|
65
|
-
*/
|
|
66
|
-
async function isTestingEnvironment() {
|
|
67
|
-
const configuration = await configurationResolver();
|
|
68
|
-
return configuration.getEnvironment() === "test";
|
|
69
|
-
}
|
|
70
65
|
/**
|
|
71
66
|
* Base mailer with view rendering and delivery helpers.
|
|
72
67
|
*/
|
|
@@ -213,10 +208,12 @@ export class VelociousMailerBase {
|
|
|
213
208
|
/**
|
|
214
209
|
* Runs enqueue payload.
|
|
215
210
|
* @param {import("./index.js").MailerDeliveryPayload} payload - Mail delivery payload.
|
|
211
|
+
* @param {import("./index.js").MailerDeliveryLaterOptions} [options] - Delivery execution options.
|
|
216
212
|
* @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
|
|
217
213
|
*/
|
|
218
|
-
async _enqueuePayload(payload) {
|
|
219
|
-
|
|
214
|
+
async _enqueuePayload(payload, options) {
|
|
215
|
+
const configuration = await this._getConfiguration();
|
|
216
|
+
return await enqueuePayload(payload, { ...options, configuration });
|
|
220
217
|
}
|
|
221
218
|
}
|
|
222
219
|
/**
|
|
@@ -254,12 +251,18 @@ export function getDeliveryHandler() {
|
|
|
254
251
|
* @returns {Promise<import("./index.js").MailerDeliveryPayload | ReturnType<typeof JSON.parse>>} - Handler result.
|
|
255
252
|
*/
|
|
256
253
|
export async function deliverPayload(payload) {
|
|
257
|
-
|
|
254
|
+
const configuration = await configurationResolver();
|
|
255
|
+
const backend = configuration.getMailerBackend();
|
|
256
|
+
const deliveryOperation = deliveryOperationFromPayload(payload);
|
|
257
|
+
if (deliveryOperation) {
|
|
258
|
+
const capability = requireDeliveryIdempotencyCapability({ backend, deliveryOperation, payload });
|
|
259
|
+
const operationStore = new MailerDeliveryOperationStore({ configuration });
|
|
260
|
+
await operationStore.beginAttempt({ capability, payload });
|
|
261
|
+
}
|
|
262
|
+
if (configuration.getEnvironment() === "test") {
|
|
258
263
|
deliveriesStore.push(payload);
|
|
259
264
|
return payload;
|
|
260
265
|
}
|
|
261
|
-
const configuration = await configurationResolver();
|
|
262
|
-
const backend = configuration.getMailerBackend();
|
|
263
266
|
if (backend?.deliver) {
|
|
264
267
|
return await backend.deliver({ payload, configuration });
|
|
265
268
|
}
|
|
@@ -272,14 +275,33 @@ export async function deliverPayload(payload) {
|
|
|
272
275
|
/**
|
|
273
276
|
* Runs the enqueuePayload helper.
|
|
274
277
|
* @param {import("./index.js").MailerDeliveryPayload} payload - Mail delivery payload.
|
|
278
|
+
* @param {object} [options] - Enqueue options.
|
|
279
|
+
* @param {import("../configuration.js").default} [options.configuration] - Owning configuration.
|
|
280
|
+
* @param {import("./index.js").MailerDeliveryOperationRequest} [options.deliveryOperation] - Required provider-backed operation.
|
|
275
281
|
* @returns {Promise<string | import("./index.js").MailerDeliveryPayload | null>} - Job id or payload in test mode.
|
|
276
282
|
*/
|
|
277
|
-
export async function enqueuePayload(payload) {
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
283
|
+
export async function enqueuePayload(payload, { configuration: suppliedConfiguration, deliveryOperation } = {}) {
|
|
284
|
+
const configuration = suppliedConfiguration || await configurationResolver();
|
|
285
|
+
let persistedPayload = payload;
|
|
286
|
+
if (deliveryOperation) {
|
|
287
|
+
const backend = configuration.getMailerBackend();
|
|
288
|
+
const operationPayload = typeof backend?.prepareDeliveryOperationPayload === "function"
|
|
289
|
+
? backend.prepareDeliveryOperationPayload({ payload })
|
|
290
|
+
: payload;
|
|
291
|
+
const capability = requireDeliveryIdempotencyCapability({ backend, deliveryOperation, payload: operationPayload });
|
|
292
|
+
persistedPayload = prepareRequiredDeliveryPayload({ capability, deliveryOperation, payload: operationPayload });
|
|
293
|
+
}
|
|
294
|
+
if (configuration.getEnvironment() === "test") {
|
|
295
|
+
deliveriesStore.push(persistedPayload);
|
|
296
|
+
return persistedPayload;
|
|
281
297
|
}
|
|
282
298
|
const { default: mailDeliveryJob } = await import("../jobs/mail-delivery.js");
|
|
283
|
-
|
|
299
|
+
const client = new BackgroundJobsClient({ configuration });
|
|
300
|
+
const jobOptions = mailDeliveryJob._withQueue(deliveryOperation ? { idempotencyKey: deliveryOperation.id } : undefined);
|
|
301
|
+
return await client.enqueue({
|
|
302
|
+
args: [persistedPayload],
|
|
303
|
+
jobName: mailDeliveryJob.jobName(),
|
|
304
|
+
options: jobOptions
|
|
305
|
+
});
|
|
284
306
|
}
|
|
285
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYWlsZXIvYmFzZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFBO0FBQ3JCLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDeEMsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxxQkFBcUIsTUFBTSw4QkFBOEIsQ0FBQTtBQUNoRSxPQUFPLGFBQWEsTUFBTSw2QkFBNkIsQ0FBQTtBQUN2RCxPQUFPLGNBQWMsTUFBTSxlQUFlLENBQUE7QUFFMUM7OzBEQUUwRDtBQUMxRCxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUE7QUFDMUI7O3NKQUVzSjtBQUN0SixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUE7QUFFMUI7Ozs7R0FJRztBQUNILFNBQVMsWUFBWSxDQUFDLFVBQVU7SUFDOUIsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtBQUNoRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsbUJBQW1CLENBQUMsU0FBUztJQUNwQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUVqRCxPQUFPLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO0FBQzlELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILHFDQUFxQztBQUNyQyxTQUFTLGVBQWUsQ0FBQyxXQUFXLEVBQUUsS0FBSztJQUN6QyxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFBO0lBQ3ZDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQTtJQUVyQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFL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T0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0FBQy9CLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQUMsT0FBTztJQUMxQyxJQUFJLE1BQU0sb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1FBQ2pDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDN0IsT0FBTyxPQUFPLENBQUE7SUFDaEIsQ0FBQztJQUVELE1BQU0sRUFBQyxPQUFPLEVBQUUsZUFBZSxFQUFDLEdBQUcsTUFBTSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtJQUUzRSxPQUFPLE1BQU0sZUFBZSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBlanMgZnJvbSBcImVqc1wiXG5pbXBvcnQge2luY29ycG9yYXRlfSBmcm9tIFwiaW5jb3Jwb3JhdG9yXCJcbmltcG9ydCAqIGFzIGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIlxuaW1wb3J0IGNvbmZpZ3VyYXRpb25SZXNvbHZlciBmcm9tIFwiLi4vY29uZmlndXJhdGlvbi1yZXNvbHZlci5qc1wiXG5pbXBvcnQgcmVzdEFyZ3NFcnJvciBmcm9tIFwiLi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcbmltcG9ydCBNYWlsZXJEZWxpdmVyeSBmcm9tIFwiLi9kZWxpdmVyeS5qc1wiXG5cbi8qKlxuICogRGVsaXZlcmllcyBzdG9yZS5cbiAqIEB0eXBlIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZFtdfSAqL1xuY29uc3QgZGVsaXZlcmllc1N0b3JlID0gW11cbi8qKlxuICogRGVsaXZlcnkgaGFuZGxlci5cbiAqIEB0eXBlIHsoKHBheWxvYWQ6IGltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkKSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiB8IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+KSB8IG51bGx9ICovXG5sZXQgZGVsaXZlcnlIYW5kbGVyID0gbnVsbFxuXG4vKipcbiAqIFJ1bnMgdmlldyBmaWxlIG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aW9uTmFtZSAtIE1haWxlciBhY3Rpb24gbmFtZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVmlldyBmaWxlIG5hbWUuXG4gKi9cbmZ1bmN0aW9uIHZpZXdGaWxlTmFtZShhY3Rpb25OYW1lKSB7XG4gIHJldHVybiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYWN0aW9uTmFtZSkpXG59XG5cbi8qKlxuICogUnVucyBtYWlsZXIgZGlyZWN0b3J5IG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIC0gTWFpbGVyIGNsYXNzIG5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIE1haWxlciBkaXJlY3RvcnkgbmFtZS5cbiAqL1xuZnVuY3Rpb24gbWFpbGVyRGlyZWN0b3J5TmFtZShjbGFzc05hbWUpIHtcbiAgY29uc3QgYmFzZU5hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgvTWFpbGVyJC8sIFwiXCIpXG5cbiAgcmV0dXJuIGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShiYXNlTmFtZSkpXG59XG5cbi8qKlxuICogUnVucyB0aGUgaW5mZXJBY3Rpb25OYW1lIGhlbHBlci5cbiAqIEBwYXJhbSB7dHlwZW9mIFZlbG9jaW91c01haWxlckJhc2V9IG1haWxlckNsYXNzIC0gTWFpbGVyIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IHN0YWNrIC0gRXJyb3Igc3RhY2suXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVsbH0gLSBJbmZlcnJlZCBhY3Rpb24gbmFtZS5cbiAqL1xuLy8gZmFsbG93LWlnbm9yZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZnVuY3Rpb24gaW5mZXJBY3Rpb25OYW1lKG1haWxlckNsYXNzLCBzdGFjaykge1xuICBjb25zdCBwcm90b3R5cGUgPSBtYWlsZXJDbGFzcy5wcm90b3R5cGVcbiAgbGV0IGFjdGlvbk5hbWUgPSBudWxsXG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIHN0YWNrLnNwbGl0KFwiXFxuXCIpKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBsaW5lLm1hdGNoKC9cXGJhdCAoPzphc3luYyApPyg/Om5ldyApP1teXFxzLl0rXFwuKFteXFxzLl0rKSAvKVxuXG4gICAgaWYgKCFtYXRjaCkgY29udGludWVcblxuICAgIGNvbnN0IGZyYW1lQWN0aW9uTmFtZSA9IG1hdGNoWzFdXG5cbiAgICBpZiAoZnJhbWVBY3Rpb25OYW1lID09PSBcIm1haWxcIikgY29udGludWVcbiAgICBpZiAoZnJhbWVBY3Rpb25OYW1lLnN0YXJ0c1dpdGgoXCJfXCIpKSBjb250aW51ZVxuICAgIGlmIChmcmFtZUFjdGlvbk5hbWUgPT09IFwiY29uc3RydWN0b3JcIikgY29udGludWVcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFZlbG9jaW91c01haWxlckJhc2UucHJvdG90eXBlLCBmcmFtZUFjdGlvbk5hbWUpKSBjb250aW51ZVxuICAgIGlmICh0eXBlb2YgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59ICovICgvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSAqLyAocHJvdG90eXBlKSlbZnJhbWVBY3Rpb25OYW1lXSAhPT0gXCJmdW5jdGlvblwiKSBjb250aW51ZVxuXG4gICAgYWN0aW9uTmFtZSA9IGZyYW1lQWN0aW9uTmFtZVxuICB9XG5cbiAgcmV0dXJuIGFjdGlvbk5hbWVcbn1cblxuLyoqXG4gKiBSdW5zIGlzIHRlc3RpbmcgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBXaGV0aGVyIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIHRlc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGlzVGVzdGluZ0Vudmlyb25tZW50KCkge1xuICBjb25zdCBjb25maWd1cmF0aW9uID0gYXdhaXQgY29uZmlndXJhdGlvblJlc29sdmVyKClcblxuICByZXR1cm4gY29uZmlndXJhdGlvbi5nZXRFbnZpcm9ubWVudCgpID09PSBcInRlc3RcIlxufVxuXG4vKipcbiAqIEJhc2UgbWFpbGVyIHdpdGggdmlldyByZW5kZXJpbmcgYW5kIGRlbGl2ZXJ5IGhlbHBlcnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBWZWxvY2lvdXNNYWlsZXJCYXNlIHtcbiAgLyoqXG4gICAqIFJ1bnMgY29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBDb25zdHJ1Y3RvciBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gW2FyZ3MuY29uZmlndXJhdGlvbl0gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2NvbmZpZ3VyYXRpb259ID0ge30pIHtcbiAgICB0aGlzLl9hY3Rpb25OYW1lID0gbnVsbFxuICAgIHRoaXMuX21haWxPcHRpb25zID0gbnVsbFxuICAgIHRoaXMuX3ZpZXdQYXJhbXMgPSB7fVxuICAgIHRoaXMuX2NvbmZpZ3VyYXRpb25Qcm9taXNlID0gY29uZmlndXJhdGlvbiA/IFByb21pc2UucmVzb2x2ZShjb25maWd1cmF0aW9uKSA6IGNvbmZpZ3VyYXRpb25SZXNvbHZlcigpXG4gIH1cblxuICAvKipcbiAgICogUnVucyBhc3NpZ24gdmlldy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IHBhcmFtcyAtIFZpZXcgcGFyYW1zLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBhc3NpZ25WaWV3KHBhcmFtcykge1xuICAgIHRoaXMuX3ZpZXdQYXJhbXMgPSBPYmplY3QuYXNzaWduKHRoaXMuX3ZpZXdQYXJhbXMsIHBhcmFtcyB8fCB7fSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG1haWwuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gTWFpbCBvcHRpb25zLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLnRvIC0gUmVjaXBpZW50LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdWJqZWN0IC0gU3ViamVjdCBsaW5lLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBbYXJncy5mcm9tXSAtIFNlbmRlci5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gW2FyZ3MuY2NdIC0gQ0MgcmVjaXBpZW50cy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gW2FyZ3MuYmNjXSAtIEJDQyByZWNpcGllbnRzLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBbYXJncy5yZXBseVRvXSAtIFJlcGx5LXRvIGFkZHJlc3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW2FyZ3MuaGVhZGVyc10gLSBDdXN0b20gaGVhZGVycy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFthcmdzLmFjdGlvbk5hbWVdIC0gTWFpbGVyIGFjdGlvbiBuYW1lLlxuICAgKiBAcGFyYW0ge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IFthcmdzLmFjdGlvblByb21pc2VdIC0gQWN0aW9uIGNvbXBsZXRpb24gcHJvbWlzZS5cbiAgICogQHJldHVybnMge01haWxlckRlbGl2ZXJ5fSAtIERlbGl2ZXJ5IHdyYXBwZXIuXG4gICAqL1xuICBtYWlsKHt0bywgc3ViamVjdCwgZnJvbSwgY2MsIGJjYywgcmVwbHlUbywgaGVhZGVycywgYWN0aW9uTmFtZSwgYWN0aW9uUHJvbWlzZSwgLi4ucmVzdEFyZ3N9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIGNvbnN0IHJlc29sdmVkQWN0aW9uTmFtZSA9IGFjdGlvbk5hbWUgfHwgaW5mZXJBY3Rpb25OYW1lKC8qKiBAdHlwZSB7dHlwZW9mIFZlbG9jaW91c01haWxlckJhc2V9ICovICh0aGlzLmNvbnN0cnVjdG9yKSwgbmV3IEVycm9yKCkuc3RhY2sgfHwgXCJcIilcblxuICAgIGlmICghcmVzb2x2ZWRBY3Rpb25OYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgYWN0aW9uTmFtZSBmb3IgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9Lm1haWwoKWApXG4gICAgfVxuXG4gICAgdGhpcy5fYWN0aW9uTmFtZSA9IHJlc29sdmVkQWN0aW9uTmFtZVxuICAgIHRoaXMuX21haWxPcHRpb25zID0ge3RvLCBzdWJqZWN0LCBmcm9tLCBjYywgYmNjLCByZXBseVRvLCBoZWFkZXJzfVxuICAgIGNvbnN0IHJlc29sdmVkQWN0aW9uUHJvbWlzZSA9IGFjdGlvblByb21pc2UgPT09IHVuZGVmaW5lZCA/IFByb21pc2UucmVzb2x2ZSgpIDogUHJvbWlzZS5yZXNvbHZlKGFjdGlvblByb21pc2UpXG5cbiAgICByZXR1cm4gbmV3IE1haWxlckRlbGl2ZXJ5KHtcbiAgICAgIG1haWxlcjogdGhpcyxcbiAgICAgIGFjdGlvblByb21pc2U6IHJlc29sdmVkQWN0aW9uUHJvbWlzZSxcbiAgICAgIGFjdGlvbk5hbWU6IHJlc29sdmVkQWN0aW9uTmFtZVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0Pn0gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKi9cbiAgYXN5bmMgX2dldENvbmZpZ3VyYXRpb24oKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NvbmZpZ3VyYXRpb25Qcm9taXNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgYWN0aW9uIG5hbWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gQWN0aW9uIG5hbWUuXG4gICAqL1xuICBfZ2V0QWN0aW9uTmFtZSgpIHtcbiAgICBpZiAoIXRoaXMuX2FjdGlvbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gbWFpbGVyIGFjdGlvbiBzZXQgb24gJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9YClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYWN0aW9uTmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYnVpbGQgcGF5bG9hZCBzeW5jLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gaHRtbCAtIFJlbmRlcmVkIEhUTUwuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZH0gLSBEZWxpdmVyeSBwYXlsb2FkLlxuICAgKi9cbiAgX2J1aWxkUGF5bG9hZFN5bmMoaHRtbCkge1xuICAgIGNvbnN0IG1haWxPcHRpb25zID0gdGhpcy5fbWFpbE9wdGlvbnNcblxuICAgIGlmICghbWFpbE9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBtYWlsKCkgb3B0aW9ucyBmb3IgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9IyR7dGhpcy5fZ2V0QWN0aW9uTmFtZSgpfS4gR290OiAke1N0cmluZyhtYWlsT3B0aW9ucyl9YClcbiAgICB9XG5cbiAgICBpZiAoIW1haWxPcHRpb25zLnRvKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgXCJ0b1wiIGZvciAke3RoaXMuY29uc3RydWN0b3IubmFtZX0jJHt0aGlzLl9nZXRBY3Rpb25OYW1lKCl9LiBHb3Q6ICR7U3RyaW5nKG1haWxPcHRpb25zLnRvKX1gKVxuICAgIH1cblxuICAgIGlmICghbWFpbE9wdGlvbnMuc3ViamVjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIFwic3ViamVjdFwiIGZvciAke3RoaXMuY29uc3RydWN0b3IubmFtZX0jJHt0aGlzLl9nZXRBY3Rpb25OYW1lKCl9LiBHb3Q6ICR7U3RyaW5nKG1haWxPcHRpb25zLnN1YmplY3QpfWApXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRvOiBtYWlsT3B0aW9ucy50byxcbiAgICAgIHN1YmplY3Q6IG1haWxPcHRpb25zLnN1YmplY3QsXG4gICAgICBmcm9tOiBtYWlsT3B0aW9ucy5mcm9tLFxuICAgICAgY2M6IG1haWxPcHRpb25zLmNjLFxuICAgICAgYmNjOiBtYWlsT3B0aW9ucy5iY2MsXG4gICAgICByZXBseVRvOiBtYWlsT3B0aW9ucy5yZXBseVRvLFxuICAgICAgaGVhZGVyczogbWFpbE9wdGlvbnMuaGVhZGVycyxcbiAgICAgIGh0bWwsXG4gICAgICBtYWlsZXI6IHRoaXMuY29uc3RydWN0b3IubmFtZSxcbiAgICAgIGFjdGlvbjogdGhpcy5fZ2V0QWN0aW9uTmFtZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYnVpbGQgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWQ+fSAtIERlbGl2ZXJ5IHBheWxvYWQuXG4gICAqL1xuICBhc3luYyBfYnVpbGRQYXlsb2FkKCkge1xuICAgIGNvbnN0IGh0bWwgPSBhd2FpdCB0aGlzLl9yZW5kZXJWaWV3KClcblxuICAgIHJldHVybiB0aGlzLl9idWlsZFBheWxvYWRTeW5jKGh0bWwpXG4gIH1cblxuICAvKipcbiAgICogUnVucyByZW5kZXIgdmlldy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gLSBSZW5kZXJlZCBIVE1MLlxuICAgKi9cbiAgYXN5bmMgX3JlbmRlclZpZXcoKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IGF3YWl0IHRoaXMuX2dldENvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IG1haWxlckRpciA9IG1haWxlckRpcmVjdG9yeU5hbWUodGhpcy5jb25zdHJ1Y3Rvci5uYW1lKVxuICAgIGNvbnN0IGFjdGlvbk5hbWUgPSB0aGlzLl9nZXRBY3Rpb25OYW1lKClcbiAgICBjb25zdCBmaWxlTmFtZSA9IHZpZXdGaWxlTmFtZShhY3Rpb25OYW1lKVxuICAgIGNvbnN0IHZpZXdQYXRoID0gYCR7Y29uZmlndXJhdGlvbi5nZXREaXJlY3RvcnkoKX0vc3JjL21haWxlcnMvJHttYWlsZXJEaXJ9LyR7ZmlsZU5hbWV9LmVqc2BcbiAgICBjb25zdCB0cmFuc2xhdGUgPSAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIG1zZ0lELCAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiB8IHVuZGVmaW5lZH0gKi8gYXJncykgPT4gY29uZmlndXJhdGlvbi5nZXRUcmFuc2xhdG9yKCkobXNnSUQsIGFyZ3MpXG4gICAgY29uc3Qgdmlld1BhcmFtcyA9IGluY29ycG9yYXRlKHttYWlsZXI6IHRoaXMsIF86IHRyYW5zbGF0ZX0sIHRoaXMuX3ZpZXdQYXJhbXMpXG5cbiAgICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZWpzLnJlbmRlckZpbGUodmlld1BhdGgsIHZpZXdQYXJhbXMsIHt9LCAoZXJyLCBzdHIpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IC8qKiBAdHlwZSB7e2NvZGU/OiBzdHJpbmd9fSAqLyAoZXJyKS5jb2RlXG5cbiAgICAgICAgICBpZiAoZXJyb3JDb2RlID09PSBcIkVOT0VOVFwiKSB7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBNaXNzaW5nIG1haWxlciB2aWV3IGZpbGU6ICR7dmlld1BhdGh9YCkpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlamVjdChlcnIpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc29sdmUoc3RyKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBkZWxpdmVyIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWR9IHBheWxvYWQgLSBNYWlsIGRlbGl2ZXJ5IHBheWxvYWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkIHwgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIEhhbmRsZXIgcmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgX2RlbGl2ZXJQYXlsb2FkKHBheWxvYWQpIHtcbiAgICByZXR1cm4gYXdhaXQgZGVsaXZlclBheWxvYWQocGF5bG9hZClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGVucXVldWUgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZH0gcGF5bG9hZCAtIE1haWwgZGVsaXZlcnkgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWQgfCBudWxsPn0gLSBKb2IgaWQgb3IgcGF5bG9hZCBpbiB0ZXN0IG1vZGUuXG4gICAqL1xuICBhc3luYyBfZW5xdWV1ZVBheWxvYWQocGF5bG9hZCkge1xuICAgIHJldHVybiBhd2FpdCBlbnF1ZXVlUGF5bG9hZChwYXlsb2FkKVxuICB9XG59XG5cbi8qKlxuICogUnVucyB0aGUgZGVsaXZlcmllcyBoZWxwZXIuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWRbXX0gLSBEZWxpdmVyZWQgcGF5bG9hZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWxpdmVyaWVzKCkge1xuICByZXR1cm4gZGVsaXZlcmllc1N0b3JlLnNsaWNlKClcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBjbGVhckRlbGl2ZXJpZXMgaGVscGVyLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJEZWxpdmVyaWVzKCkge1xuICBkZWxpdmVyaWVzU3RvcmUubGVuZ3RoID0gMFxufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHNldERlbGl2ZXJ5SGFuZGxlciBoZWxwZXIuXG4gKiBAcGFyYW0geyhwYXlsb2FkOiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZCkgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gaGFuZGxlciAtIERlbGl2ZXJ5IGhhbmRsZXIuXG4gKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREZWxpdmVyeUhhbmRsZXIoaGFuZGxlcikge1xuICBkZWxpdmVyeUhhbmRsZXIgPSBoYW5kbGVyXG59XG5cbi8qKlxuICogUnVucyB0aGUgZ2V0RGVsaXZlcnlIYW5kbGVyIGhlbHBlci5cbiAqIEByZXR1cm5zIHsoKHBheWxvYWQ6IGltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkKSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiB8IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+KSB8IG51bGx9IC0gSGFuZGxlciBvciBudWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVsaXZlcnlIYW5kbGVyKCkge1xuICByZXR1cm4gZGVsaXZlcnlIYW5kbGVyXG59XG5cbi8qKlxuICogUnVucyB0aGUgZGVsaXZlclBheWxvYWQgaGVscGVyLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZH0gcGF5bG9hZCAtIE1haWwgZGVsaXZlcnkgcGF5bG9hZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkIHwgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAtIEhhbmRsZXIgcmVzdWx0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVsaXZlclBheWxvYWQocGF5bG9hZCkge1xuICBpZiAoYXdhaXQgaXNUZXN0aW5nRW52aXJvbm1lbnQoKSkge1xuICAgIGRlbGl2ZXJpZXNTdG9yZS5wdXNoKHBheWxvYWQpXG4gICAgcmV0dXJuIHBheWxvYWRcbiAgfVxuXG4gIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSBhd2FpdCBjb25maWd1cmF0aW9uUmVzb2x2ZXIoKVxuICBjb25zdCBiYWNrZW5kID0gY29uZmlndXJhdGlvbi5nZXRNYWlsZXJCYWNrZW5kKClcblxuICBpZiAoYmFja2VuZD8uZGVsaXZlcikge1xuICAgIHJldHVybiBhd2FpdCBiYWNrZW5kLmRlbGl2ZXIoe3BheWxvYWQsIGNvbmZpZ3VyYXRpb259KVxuICB9XG5cbiAgY29uc3QgaGFuZGxlciA9IGRlbGl2ZXJ5SGFuZGxlclxuXG4gIGlmICghaGFuZGxlcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gbWFpbCBkZWxpdmVyeSBoYW5kbGVyIGNvbmZpZ3VyZWQgZm9yIFwiJHtwYXlsb2FkLnN1YmplY3R9XCIgdG8gXCIke3BheWxvYWQudG99XCJgKVxuICB9XG5cbiAgcmV0dXJuIGF3YWl0IGhhbmRsZXIocGF5bG9hZClcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBlbnF1ZXVlUGF5bG9hZCBoZWxwZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkfSBwYXlsb2FkIC0gTWFpbCBkZWxpdmVyeSBwYXlsb2FkLlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWQgfCBudWxsPn0gLSBKb2IgaWQgb3IgcGF5bG9hZCBpbiB0ZXN0IG1vZGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbnF1ZXVlUGF5bG9hZChwYXlsb2FkKSB7XG4gIGlmIChhd2FpdCBpc1Rlc3RpbmdFbnZpcm9ubWVudCgpKSB7XG4gICAgZGVsaXZlcmllc1N0b3JlLnB1c2gocGF5bG9hZClcbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgY29uc3Qge2RlZmF1bHQ6IG1haWxEZWxpdmVyeUpvYn0gPSBhd2FpdCBpbXBvcnQoXCIuLi9qb2JzL21haWwtZGVsaXZlcnkuanNcIilcblxuICByZXR1cm4gYXdhaXQgbWFpbERlbGl2ZXJ5Sm9iLnBlcmZvcm1MYXRlcihwYXlsb2FkKVxufVxuIl19
|
|
307
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYWlsZXIvYmFzZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFBO0FBQ3JCLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUE7QUFDeEMsT0FBTyxLQUFLLFVBQVUsTUFBTSxZQUFZLENBQUE7QUFDeEMsT0FBTyxvQkFBb0IsTUFBTSw4QkFBOEIsQ0FBQTtBQUMvRCxPQUFPLHFCQUFxQixNQUFNLDhCQUE4QixDQUFBO0FBQ2hFLE9BQU8sYUFBYSxNQUFNLDZCQUE2QixDQUFBO0FBQ3ZELE9BQU8sY0FBYyxNQUFNLGVBQWUsQ0FBQTtBQUMxQyxPQUFPLDRCQUE0QixNQUFNLCtCQUErQixDQUFBO0FBQ3hFLE9BQU8sRUFDTCw0QkFBNEIsRUFDNUIsOEJBQThCLEVBQzlCLG9DQUFvQyxFQUNyQyxNQUFNLHlCQUF5QixDQUFBO0FBRWhDOzswREFFMEQ7QUFDMUQsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFBO0FBQzFCOztzSkFFc0o7QUFDdEosSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFBO0FBRTFCOzs7O0dBSUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxVQUFVO0lBQzlCLE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7QUFDaEUsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLFNBQVM7SUFDcEMsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFFakQsT0FBTyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQTtBQUM5RCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxxQ0FBcUM7QUFDckMs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QUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLENBQUE7UUFFaEgsZ0JBQWdCLEdBQUcsOEJBQThCLENBQUMsRUFBQyxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFDLENBQUMsQ0FBQTtJQUMvRyxDQUFDO0lBRUQsSUFBSSxhQUFhLENBQUMsY0FBYyxFQUFFLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDOUMsZUFBZSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQ3RDLE9BQU8sZ0JBQWdCLENBQUE7SUFDekIsQ0FBQztJQUVELE1BQU0sRUFBQyxPQUFPLEVBQUUsZUFBZSxFQUFDLEdBQUcsTUFBTSxNQUFNLENBQUMsMEJBQTBCLENBQUMsQ0FBQTtJQUMzRSxNQUFNLE1BQU0sR0FBRyxJQUFJLG9CQUFvQixDQUFDLEVBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQTtJQUN4RCxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFDLGNBQWMsRUFBRSxpQkFBaUIsQ0FBQyxFQUFFLEVBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUE7SUFFckgsT0FBTyxNQUFNLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDMUIsSUFBSSxFQUFFLENBQUMsZ0JBQWdCLENBQUM7UUFDeEIsT0FBTyxFQUFFLGVBQWUsQ0FBQyxPQUFPLEVBQUU7UUFDbEMsT0FBTyxFQUFFLFVBQVU7S0FDcEIsQ0FBQyxDQUFBO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgZWpzIGZyb20gXCJlanNcIlxuaW1wb3J0IHtpbmNvcnBvcmF0ZX0gZnJvbSBcImluY29ycG9yYXRvclwiXG5pbXBvcnQgKiBhcyBpbmZsZWN0aW9uIGZyb20gXCJpbmZsZWN0aW9uXCJcbmltcG9ydCBCYWNrZ3JvdW5kSm9ic0NsaWVudCBmcm9tIFwiLi4vYmFja2dyb3VuZC1qb2JzL2NsaWVudC5qc1wiXG5pbXBvcnQgY29uZmlndXJhdGlvblJlc29sdmVyIGZyb20gXCIuLi9jb25maWd1cmF0aW9uLXJlc29sdmVyLmpzXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuLi91dGlscy9yZXN0LWFyZ3MtZXJyb3IuanNcIlxuaW1wb3J0IE1haWxlckRlbGl2ZXJ5IGZyb20gXCIuL2RlbGl2ZXJ5LmpzXCJcbmltcG9ydCBNYWlsZXJEZWxpdmVyeU9wZXJhdGlvblN0b3JlIGZyb20gXCIuL2RlbGl2ZXJ5LW9wZXJhdGlvbi1zdG9yZS5qc1wiXG5pbXBvcnQge1xuICBkZWxpdmVyeU9wZXJhdGlvbkZyb21QYXlsb2FkLFxuICBwcmVwYXJlUmVxdWlyZWREZWxpdmVyeVBheWxvYWQsXG4gIHJlcXVpcmVEZWxpdmVyeUlkZW1wb3RlbmN5Q2FwYWJpbGl0eVxufSBmcm9tIFwiLi9kZWxpdmVyeS1vcGVyYXRpb24uanNcIlxuXG4vKipcbiAqIERlbGl2ZXJpZXMgc3RvcmUuXG4gKiBAdHlwZSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWRbXX0gKi9cbmNvbnN0IGRlbGl2ZXJpZXNTdG9yZSA9IFtdXG4vKipcbiAqIERlbGl2ZXJ5IGhhbmRsZXIuXG4gKiBAdHlwZSB7KChwYXlsb2FkOiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZCkgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPikgfCBudWxsfSAqL1xubGV0IGRlbGl2ZXJ5SGFuZGxlciA9IG51bGxcblxuLyoqXG4gKiBSdW5zIHZpZXcgZmlsZSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGlvbk5hbWUgLSBNYWlsZXIgYWN0aW9uIG5hbWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFZpZXcgZmlsZSBuYW1lLlxuICovXG5mdW5jdGlvbiB2aWV3RmlsZU5hbWUoYWN0aW9uTmFtZSkge1xuICByZXR1cm4gaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGFjdGlvbk5hbWUpKVxufVxuXG4vKipcbiAqIFJ1bnMgbWFpbGVyIGRpcmVjdG9yeSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSAtIE1haWxlciBjbGFzcyBuYW1lLlxuICogQHJldHVybnMge3N0cmluZ30gLSBNYWlsZXIgZGlyZWN0b3J5IG5hbWUuXG4gKi9cbmZ1bmN0aW9uIG1haWxlckRpcmVjdG9yeU5hbWUoY2xhc3NOYW1lKSB7XG4gIGNvbnN0IGJhc2VOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoL01haWxlciQvLCBcIlwiKVxuXG4gIHJldHVybiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoYmFzZU5hbWUpKVxufVxuXG4vKipcbiAqIFJ1bnMgdGhlIGluZmVyQWN0aW9uTmFtZSBoZWxwZXIuXG4gKiBAcGFyYW0ge3R5cGVvZiBWZWxvY2lvdXNNYWlsZXJCYXNlfSBtYWlsZXJDbGFzcyAtIE1haWxlciBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdGFjayAtIEVycm9yIHN0YWNrLlxuICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IC0gSW5mZXJyZWQgYWN0aW9uIG5hbWUuXG4gKi9cbi8vIGZhbGxvdy1pZ25vcmUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmZ1bmN0aW9uIGluZmVyQWN0aW9uTmFtZShtYWlsZXJDbGFzcywgc3RhY2spIHtcbiAgY29uc3QgcHJvdG90eXBlID0gbWFpbGVyQ2xhc3MucHJvdG90eXBlXG4gIGxldCBhY3Rpb25OYW1lID0gbnVsbFxuXG4gIGZvciAoY29uc3QgbGluZSBvZiBzdGFjay5zcGxpdChcIlxcblwiKSkge1xuICAgIGNvbnN0IG1hdGNoID0gbGluZS5tYXRjaCgvXFxiYXQgKD86YXN5bmMgKT8oPzpuZXcgKT9bXlxccy5dK1xcLihbXlxccy5dKykgLylcblxuICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlXG5cbiAgICBjb25zdCBmcmFtZUFjdGlvbk5hbWUgPSBtYXRjaFsxXVxuXG4gICAgaWYgKGZyYW1lQWN0aW9uTmFtZSA9PT0gXCJtYWlsXCIpIGNvbnRpbnVlXG4gICAgaWYgKGZyYW1lQWN0aW9uTmFtZS5zdGFydHNXaXRoKFwiX1wiKSkgY29udGludWVcbiAgICBpZiAoZnJhbWVBY3Rpb25OYW1lID09PSBcImNvbnN0cnVjdG9yXCIpIGNvbnRpbnVlXG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChWZWxvY2lvdXNNYWlsZXJCYXNlLnByb3RvdHlwZSwgZnJhbWVBY3Rpb25OYW1lKSkgY29udGludWVcbiAgICBpZiAodHlwZW9mIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAoLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gKi8gKHByb3RvdHlwZSkpW2ZyYW1lQWN0aW9uTmFtZV0gIT09IFwiZnVuY3Rpb25cIikgY29udGludWVcblxuICAgIGFjdGlvbk5hbWUgPSBmcmFtZUFjdGlvbk5hbWVcbiAgfVxuXG4gIHJldHVybiBhY3Rpb25OYW1lXG59XG5cbi8qKlxuICogQmFzZSBtYWlsZXIgd2l0aCB2aWV3IHJlbmRlcmluZyBhbmQgZGVsaXZlcnkgaGVscGVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIFZlbG9jaW91c01haWxlckJhc2Uge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIENvbnN0cnVjdG9yIGFyZ3MuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBbYXJncy5jb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7Y29uZmlndXJhdGlvbn0gPSB7fSkge1xuICAgIHRoaXMuX2FjdGlvbk5hbWUgPSBudWxsXG4gICAgdGhpcy5fbWFpbE9wdGlvbnMgPSBudWxsXG4gICAgdGhpcy5fdmlld1BhcmFtcyA9IHt9XG4gICAgdGhpcy5fY29uZmlndXJhdGlvblByb21pc2UgPSBjb25maWd1cmF0aW9uID8gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZ3VyYXRpb24pIDogY29uZmlndXJhdGlvblJlc29sdmVyKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFzc2lnbiB2aWV3LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gcGFyYW1zIC0gVmlldyBwYXJhbXMuXG4gICAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAgICovXG4gIGFzc2lnblZpZXcocGFyYW1zKSB7XG4gICAgdGhpcy5fdmlld1BhcmFtcyA9IE9iamVjdC5hc3NpZ24odGhpcy5fdmlld1BhcmFtcywgcGFyYW1zIHx8IHt9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgbWFpbC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBNYWlsIG9wdGlvbnMuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MudG8gLSBSZWNpcGllbnQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnN1YmplY3QgLSBTdWJqZWN0IGxpbmUuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IFthcmdzLmZyb21dIC0gU2VuZGVyLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBbYXJncy5jY10gLSBDQyByZWNpcGllbnRzLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBbYXJncy5iY2NdIC0gQkNDIHJlY2lwaWVudHMuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IFthcmdzLnJlcGx5VG9dIC0gUmVwbHktdG8gYWRkcmVzcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBbYXJncy5oZWFkZXJzXSAtIEN1c3RvbSBoZWFkZXJzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3MuYWN0aW9uTmFtZV0gLSBNYWlsZXIgYWN0aW9uIG5hbWUuXG4gICAqIEBwYXJhbSB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gW2FyZ3MuYWN0aW9uUHJvbWlzZV0gLSBBY3Rpb24gY29tcGxldGlvbiBwcm9taXNlLlxuICAgKiBAcmV0dXJucyB7TWFpbGVyRGVsaXZlcnl9IC0gRGVsaXZlcnkgd3JhcHBlci5cbiAgICovXG4gIG1haWwoe3RvLCBzdWJqZWN0LCBmcm9tLCBjYywgYmNjLCByZXBseVRvLCBoZWFkZXJzLCBhY3Rpb25OYW1lLCBhY3Rpb25Qcm9taXNlLCAuLi5yZXN0QXJnc30pIHtcbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgY29uc3QgcmVzb2x2ZWRBY3Rpb25OYW1lID0gYWN0aW9uTmFtZSB8fCBpbmZlckFjdGlvbk5hbWUoLyoqIEB0eXBlIHt0eXBlb2YgVmVsb2Npb3VzTWFpbGVyQmFzZX0gKi8gKHRoaXMuY29uc3RydWN0b3IpLCBuZXcgRXJyb3IoKS5zdGFjayB8fCBcIlwiKVxuXG4gICAgaWYgKCFyZXNvbHZlZEFjdGlvbk5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBhY3Rpb25OYW1lIGZvciAke3RoaXMuY29uc3RydWN0b3IubmFtZX0ubWFpbCgpYClcbiAgICB9XG5cbiAgICB0aGlzLl9hY3Rpb25OYW1lID0gcmVzb2x2ZWRBY3Rpb25OYW1lXG4gICAgdGhpcy5fbWFpbE9wdGlvbnMgPSB7dG8sIHN1YmplY3QsIGZyb20sIGNjLCBiY2MsIHJlcGx5VG8sIGhlYWRlcnN9XG4gICAgY29uc3QgcmVzb2x2ZWRBY3Rpb25Qcm9taXNlID0gYWN0aW9uUHJvbWlzZSA9PT0gdW5kZWZpbmVkID8gUHJvbWlzZS5yZXNvbHZlKCkgOiBQcm9taXNlLnJlc29sdmUoYWN0aW9uUHJvbWlzZSlcblxuICAgIHJldHVybiBuZXcgTWFpbGVyRGVsaXZlcnkoe1xuICAgICAgbWFpbGVyOiB0aGlzLFxuICAgICAgYWN0aW9uUHJvbWlzZTogcmVzb2x2ZWRBY3Rpb25Qcm9taXNlLFxuICAgICAgYWN0aW9uTmFtZTogcmVzb2x2ZWRBY3Rpb25OYW1lXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQ+fSAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICBhc3luYyBfZ2V0Q29uZmlndXJhdGlvbigpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5fY29uZmlndXJhdGlvblByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBhY3Rpb24gbmFtZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBBY3Rpb24gbmFtZS5cbiAgICovXG4gIF9nZXRBY3Rpb25OYW1lKCkge1xuICAgIGlmICghdGhpcy5fYWN0aW9uTmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBtYWlsZXIgYWN0aW9uIHNldCBvbiAke3RoaXMuY29uc3RydWN0b3IubmFtZX1gKVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9hY3Rpb25OYW1lXG4gIH1cblxuICAvKipcbiAgICogUnVucyBidWlsZCBwYXlsb2FkIHN5bmMuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sIC0gUmVuZGVyZWQgSFRNTC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkfSAtIERlbGl2ZXJ5IHBheWxvYWQuXG4gICAqL1xuICBfYnVpbGRQYXlsb2FkU3luYyhodG1sKSB7XG4gICAgY29uc3QgbWFpbE9wdGlvbnMgPSB0aGlzLl9tYWlsT3B0aW9uc1xuXG4gICAgaWYgKCFtYWlsT3B0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG1haWwoKSBvcHRpb25zIGZvciAke3RoaXMuY29uc3RydWN0b3IubmFtZX0jJHt0aGlzLl9nZXRBY3Rpb25OYW1lKCl9LiBHb3Q6ICR7U3RyaW5nKG1haWxPcHRpb25zKX1gKVxuICAgIH1cblxuICAgIGlmICghbWFpbE9wdGlvbnMudG8pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBcInRvXCIgZm9yICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSMke3RoaXMuX2dldEFjdGlvbk5hbWUoKX0uIEdvdDogJHtTdHJpbmcobWFpbE9wdGlvbnMudG8pfWApXG4gICAgfVxuXG4gICAgaWYgKCFtYWlsT3B0aW9ucy5zdWJqZWN0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgXCJzdWJqZWN0XCIgZm9yICR7dGhpcy5jb25zdHJ1Y3Rvci5uYW1lfSMke3RoaXMuX2dldEFjdGlvbk5hbWUoKX0uIEdvdDogJHtTdHJpbmcobWFpbE9wdGlvbnMuc3ViamVjdCl9YClcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdG86IG1haWxPcHRpb25zLnRvLFxuICAgICAgc3ViamVjdDogbWFpbE9wdGlvbnMuc3ViamVjdCxcbiAgICAgIGZyb206IG1haWxPcHRpb25zLmZyb20sXG4gICAgICBjYzogbWFpbE9wdGlvbnMuY2MsXG4gICAgICBiY2M6IG1haWxPcHRpb25zLmJjYyxcbiAgICAgIHJlcGx5VG86IG1haWxPcHRpb25zLnJlcGx5VG8sXG4gICAgICBoZWFkZXJzOiBtYWlsT3B0aW9ucy5oZWFkZXJzLFxuICAgICAgaHRtbCxcbiAgICAgIG1haWxlcjogdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgICAgYWN0aW9uOiB0aGlzLl9nZXRBY3Rpb25OYW1lKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBidWlsZCBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZD59IC0gRGVsaXZlcnkgcGF5bG9hZC5cbiAgICovXG4gIGFzeW5jIF9idWlsZFBheWxvYWQoKSB7XG4gICAgY29uc3QgaHRtbCA9IGF3YWl0IHRoaXMuX3JlbmRlclZpZXcoKVxuXG4gICAgcmV0dXJuIHRoaXMuX2J1aWxkUGF5bG9hZFN5bmMoaHRtbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHJlbmRlciB2aWV3LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSAtIFJlbmRlcmVkIEhUTUwuXG4gICAqL1xuICBhc3luYyBfcmVuZGVyVmlldygpIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gYXdhaXQgdGhpcy5fZ2V0Q29uZmlndXJhdGlvbigpXG4gICAgY29uc3QgbWFpbGVyRGlyID0gbWFpbGVyRGlyZWN0b3J5TmFtZSh0aGlzLmNvbnN0cnVjdG9yLm5hbWUpXG4gICAgY29uc3QgYWN0aW9uTmFtZSA9IHRoaXMuX2dldEFjdGlvbk5hbWUoKVxuICAgIGNvbnN0IGZpbGVOYW1lID0gdmlld0ZpbGVOYW1lKGFjdGlvbk5hbWUpXG4gICAgY29uc3Qgdmlld1BhdGggPSBgJHtjb25maWd1cmF0aW9uLmdldERpcmVjdG9yeSgpfS9zcmMvbWFpbGVycy8ke21haWxlckRpcn0vJHtmaWxlTmFtZX0uZWpzYFxuICAgIGNvbnN0IHRyYW5zbGF0ZSA9ICgvKiogQHR5cGUge3N0cmluZ30gKi8gbXNnSUQsIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgdW5kZWZpbmVkfSAqLyBhcmdzKSA9PiBjb25maWd1cmF0aW9uLmdldFRyYW5zbGF0b3IoKShtc2dJRCwgYXJncylcbiAgICBjb25zdCB2aWV3UGFyYW1zID0gaW5jb3Jwb3JhdGUoe21haWxlcjogdGhpcywgXzogdHJhbnNsYXRlfSwgdGhpcy5fdmlld1BhcmFtcylcblxuICAgIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBlanMucmVuZGVyRmlsZSh2aWV3UGF0aCwgdmlld1BhcmFtcywge30sIChlcnIsIHN0cikgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gLyoqIEB0eXBlIHt7Y29kZT86IHN0cmluZ319ICovIChlcnIpLmNvZGVcblxuICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09IFwiRU5PRU5UXCIpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYE1pc3NpbmcgbWFpbGVyIHZpZXcgZmlsZTogJHt2aWV3UGF0aH1gKSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVqZWN0KGVycilcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzb2x2ZShzdHIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRlbGl2ZXIgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZH0gcGF5bG9hZCAtIE1haWwgZGVsaXZlcnkgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWQgfCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IC0gSGFuZGxlciByZXN1bHQuXG4gICAqL1xuICBhc3luYyBfZGVsaXZlclBheWxvYWQocGF5bG9hZCkge1xuICAgIHJldHVybiBhd2FpdCBkZWxpdmVyUGF5bG9hZChwYXlsb2FkKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZW5xdWV1ZSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkfSBwYXlsb2FkIC0gTWFpbCBkZWxpdmVyeSBwYXlsb2FkLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlMYXRlck9wdGlvbnN9IFtvcHRpb25zXSAtIERlbGl2ZXJ5IGV4ZWN1dGlvbiBvcHRpb25zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZCB8IG51bGw+fSAtIEpvYiBpZCBvciBwYXlsb2FkIGluIHRlc3QgbW9kZS5cbiAgICovXG4gIGFzeW5jIF9lbnF1ZXVlUGF5bG9hZChwYXlsb2FkLCBvcHRpb25zKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IGF3YWl0IHRoaXMuX2dldENvbmZpZ3VyYXRpb24oKVxuXG4gICAgcmV0dXJuIGF3YWl0IGVucXVldWVQYXlsb2FkKHBheWxvYWQsIHsuLi5vcHRpb25zLCBjb25maWd1cmF0aW9ufSlcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgdGhlIGRlbGl2ZXJpZXMgaGVscGVyLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkW119IC0gRGVsaXZlcmVkIHBheWxvYWRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVsaXZlcmllcygpIHtcbiAgcmV0dXJuIGRlbGl2ZXJpZXNTdG9yZS5zbGljZSgpXG59XG5cbi8qKlxuICogUnVucyB0aGUgY2xlYXJEZWxpdmVyaWVzIGhlbHBlci5cbiAqIEByZXR1cm5zIHt2b2lkfSAtIE5vIHJldHVybiB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRGVsaXZlcmllcygpIHtcbiAgZGVsaXZlcmllc1N0b3JlLmxlbmd0aCA9IDBcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBzZXREZWxpdmVyeUhhbmRsZXIgaGVscGVyLlxuICogQHBhcmFtIHsocGF5bG9hZDogaW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWQpID0+IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGhhbmRsZXIgLSBEZWxpdmVyeSBoYW5kbGVyLlxuICogQHJldHVybnMge3ZvaWR9IC0gTm8gcmV0dXJuIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVsaXZlcnlIYW5kbGVyKGhhbmRsZXIpIHtcbiAgZGVsaXZlcnlIYW5kbGVyID0gaGFuZGxlclxufVxuXG4vKipcbiAqIFJ1bnMgdGhlIGdldERlbGl2ZXJ5SGFuZGxlciBoZWxwZXIuXG4gKiBAcmV0dXJucyB7KChwYXlsb2FkOiBpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZCkgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4gfCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPikgfCBudWxsfSAtIEhhbmRsZXIgb3IgbnVsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlbGl2ZXJ5SGFuZGxlcigpIHtcbiAgcmV0dXJuIGRlbGl2ZXJ5SGFuZGxlclxufVxuXG4vKipcbiAqIFJ1bnMgdGhlIGRlbGl2ZXJQYXlsb2FkIGhlbHBlci5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9pbmRleC5qc1wiKS5NYWlsZXJEZWxpdmVyeVBheWxvYWR9IHBheWxvYWQgLSBNYWlsIGRlbGl2ZXJ5IHBheWxvYWQuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5UGF5bG9hZCB8IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gLSBIYW5kbGVyIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGl2ZXJQYXlsb2FkKHBheWxvYWQpIHtcbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IGF3YWl0IGNvbmZpZ3VyYXRpb25SZXNvbHZlcigpXG4gIGNvbnN0IGJhY2tlbmQgPSBjb25maWd1cmF0aW9uLmdldE1haWxlckJhY2tlbmQoKVxuICBjb25zdCBkZWxpdmVyeU9wZXJhdGlvbiA9IGRlbGl2ZXJ5T3BlcmF0aW9uRnJvbVBheWxvYWQocGF5bG9hZClcblxuICBpZiAoZGVsaXZlcnlPcGVyYXRpb24pIHtcbiAgICBjb25zdCBjYXBhYmlsaXR5ID0gcmVxdWlyZURlbGl2ZXJ5SWRlbXBvdGVuY3lDYXBhYmlsaXR5KHtiYWNrZW5kLCBkZWxpdmVyeU9wZXJhdGlvbiwgcGF5bG9hZH0pXG4gICAgY29uc3Qgb3BlcmF0aW9uU3RvcmUgPSBuZXcgTWFpbGVyRGVsaXZlcnlPcGVyYXRpb25TdG9yZSh7Y29uZmlndXJhdGlvbn0pXG5cbiAgICBhd2FpdCBvcGVyYXRpb25TdG9yZS5iZWdpbkF0dGVtcHQoe2NhcGFiaWxpdHksIHBheWxvYWR9KVxuICB9XG5cbiAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnQoKSA9PT0gXCJ0ZXN0XCIpIHtcbiAgICBkZWxpdmVyaWVzU3RvcmUucHVzaChwYXlsb2FkKVxuICAgIHJldHVybiBwYXlsb2FkXG4gIH1cblxuICBpZiAoYmFja2VuZD8uZGVsaXZlcikge1xuICAgIHJldHVybiBhd2FpdCBiYWNrZW5kLmRlbGl2ZXIoe3BheWxvYWQsIGNvbmZpZ3VyYXRpb259KVxuICB9XG5cbiAgY29uc3QgaGFuZGxlciA9IGRlbGl2ZXJ5SGFuZGxlclxuXG4gIGlmICghaGFuZGxlcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgTm8gbWFpbCBkZWxpdmVyeSBoYW5kbGVyIGNvbmZpZ3VyZWQgZm9yIFwiJHtwYXlsb2FkLnN1YmplY3R9XCIgdG8gXCIke3BheWxvYWQudG99XCJgKVxuICB9XG5cbiAgcmV0dXJuIGF3YWl0IGhhbmRsZXIocGF5bG9hZClcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBlbnF1ZXVlUGF5bG9hZCBoZWxwZXIuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkfSBwYXlsb2FkIC0gTWFpbCBkZWxpdmVyeSBwYXlsb2FkLlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIEVucXVldWUgb3B0aW9ucy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSBbb3B0aW9ucy5jb25maWd1cmF0aW9uXSAtIE93bmluZyBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5T3BlcmF0aW9uUmVxdWVzdH0gW29wdGlvbnMuZGVsaXZlcnlPcGVyYXRpb25dIC0gUmVxdWlyZWQgcHJvdmlkZXItYmFja2VkIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZyB8IGltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkIHwgbnVsbD59IC0gSm9iIGlkIG9yIHBheWxvYWQgaW4gdGVzdCBtb2RlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5xdWV1ZVBheWxvYWQocGF5bG9hZCwge2NvbmZpZ3VyYXRpb246IHN1cHBsaWVkQ29uZmlndXJhdGlvbiwgZGVsaXZlcnlPcGVyYXRpb259ID0ge30pIHtcbiAgY29uc3QgY29uZmlndXJhdGlvbiA9IHN1cHBsaWVkQ29uZmlndXJhdGlvbiB8fCBhd2FpdCBjb25maWd1cmF0aW9uUmVzb2x2ZXIoKVxuICBsZXQgcGVyc2lzdGVkUGF5bG9hZCA9IHBheWxvYWRcblxuICBpZiAoZGVsaXZlcnlPcGVyYXRpb24pIHtcbiAgICBjb25zdCBiYWNrZW5kID0gY29uZmlndXJhdGlvbi5nZXRNYWlsZXJCYWNrZW5kKClcbiAgICBjb25zdCBvcGVyYXRpb25QYXlsb2FkID0gdHlwZW9mIGJhY2tlbmQ/LnByZXBhcmVEZWxpdmVyeU9wZXJhdGlvblBheWxvYWQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBiYWNrZW5kLnByZXBhcmVEZWxpdmVyeU9wZXJhdGlvblBheWxvYWQoe3BheWxvYWR9KVxuICAgICAgOiBwYXlsb2FkXG4gICAgY29uc3QgY2FwYWJpbGl0eSA9IHJlcXVpcmVEZWxpdmVyeUlkZW1wb3RlbmN5Q2FwYWJpbGl0eSh7YmFja2VuZCwgZGVsaXZlcnlPcGVyYXRpb24sIHBheWxvYWQ6IG9wZXJhdGlvblBheWxvYWR9KVxuXG4gICAgcGVyc2lzdGVkUGF5bG9hZCA9IHByZXBhcmVSZXF1aXJlZERlbGl2ZXJ5UGF5bG9hZCh7Y2FwYWJpbGl0eSwgZGVsaXZlcnlPcGVyYXRpb24sIHBheWxvYWQ6IG9wZXJhdGlvblBheWxvYWR9KVxuICB9XG5cbiAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0RW52aXJvbm1lbnQoKSA9PT0gXCJ0ZXN0XCIpIHtcbiAgICBkZWxpdmVyaWVzU3RvcmUucHVzaChwZXJzaXN0ZWRQYXlsb2FkKVxuICAgIHJldHVybiBwZXJzaXN0ZWRQYXlsb2FkXG4gIH1cblxuICBjb25zdCB7ZGVmYXVsdDogbWFpbERlbGl2ZXJ5Sm9ifSA9IGF3YWl0IGltcG9ydChcIi4uL2pvYnMvbWFpbC1kZWxpdmVyeS5qc1wiKVxuICBjb25zdCBjbGllbnQgPSBuZXcgQmFja2dyb3VuZEpvYnNDbGllbnQoe2NvbmZpZ3VyYXRpb259KVxuICBjb25zdCBqb2JPcHRpb25zID0gbWFpbERlbGl2ZXJ5Sm9iLl93aXRoUXVldWUoZGVsaXZlcnlPcGVyYXRpb24gPyB7aWRlbXBvdGVuY3lLZXk6IGRlbGl2ZXJ5T3BlcmF0aW9uLmlkfSA6IHVuZGVmaW5lZClcblxuICByZXR1cm4gYXdhaXQgY2xpZW50LmVucXVldWUoe1xuICAgIGFyZ3M6IFtwZXJzaXN0ZWRQYXlsb2FkXSxcbiAgICBqb2JOYW1lOiBtYWlsRGVsaXZlcnlKb2Iuam9iTmFtZSgpLFxuICAgIG9wdGlvbnM6IGpvYk9wdGlvbnNcbiAgfSlcbn1cbiJdfQ==
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import BackgroundJobsStore from "../background-jobs/store.js";
|
|
2
|
+
/**
|
|
3
|
+
* Durable first-attempt and retention guard for required mail operations.
|
|
4
|
+
*/
|
|
5
|
+
export default class MailerDeliveryOperationStore {
|
|
6
|
+
backgroundJobsStore: BackgroundJobsStore;
|
|
7
|
+
clock: () => number;
|
|
8
|
+
configuration: import("../configuration.js").default;
|
|
9
|
+
/**
|
|
10
|
+
* Creates a durable mail-operation state guard.
|
|
11
|
+
* @param {object} args - Store input.
|
|
12
|
+
* @param {import("../configuration.js").default} args.configuration - Active configuration.
|
|
13
|
+
* @param {() => number} [args.clock] - Explicit clock dependency.
|
|
14
|
+
*/
|
|
15
|
+
constructor({ configuration, clock }: {
|
|
16
|
+
configuration: import("../configuration.js").default;
|
|
17
|
+
clock?: () => number;
|
|
18
|
+
});
|
|
19
|
+
/**
|
|
20
|
+
* Atomically starts the provider retention clock once and rejects expired attempts.
|
|
21
|
+
* @param {object} args - Attempt input.
|
|
22
|
+
* @param {import("./index.js").MailerDeliveryIdempotencyCapability} args.capability - Current backend capability.
|
|
23
|
+
* @param {import("./index.js").MailerDeliveryPayload} args.payload - Persisted payload.
|
|
24
|
+
* @returns {Promise<{expiresAtMs: number, firstAttemptStartedAtMs: number}>} - Attempt window.
|
|
25
|
+
*/
|
|
26
|
+
beginAttempt({ capability, payload }: {
|
|
27
|
+
capability: import("./index.js").MailerDeliveryIdempotencyCapability;
|
|
28
|
+
payload: import("./index.js").MailerDeliveryPayload;
|
|
29
|
+
}): Promise<{
|
|
30
|
+
expiresAtMs: number;
|
|
31
|
+
firstAttemptStartedAtMs: number;
|
|
32
|
+
}>;
|
|
33
|
+
/**
|
|
34
|
+
* Loads one operation by its fixed-size digest key.
|
|
35
|
+
* @param {import("../database/drivers/base.js").default} db - Database connection.
|
|
36
|
+
* @param {string} operationId - Operation id.
|
|
37
|
+
* @returns {Promise<Record<string, ReturnType<typeof JSON.parse>> | null>} - Row or null.
|
|
38
|
+
*/
|
|
39
|
+
_operationRow(db: import("../database/drivers/base.js").default, operationId: string): Promise<Record<string, ReturnType<typeof JSON.parse>> | null>;
|
|
40
|
+
/**
|
|
41
|
+
* Validates immutable durable fields without including mail content in failures.
|
|
42
|
+
* @param {object} args - Validation input.
|
|
43
|
+
* @param {import("./index.js").MailerDeliveryOperation} args.operation - Persisted payload operation.
|
|
44
|
+
* @param {Record<string, ReturnType<typeof JSON.parse>>} args.row - Durable operation row.
|
|
45
|
+
* @returns {void}
|
|
46
|
+
*/
|
|
47
|
+
_validateRow({ operation, row }: {
|
|
48
|
+
operation: import("./index.js").MailerDeliveryOperation;
|
|
49
|
+
row: Record<string, ReturnType<typeof JSON.parse>>;
|
|
50
|
+
}): void;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=delivery-operation-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-operation-store.d.ts","sourceRoot":"","sources":["../../../src/mailer/delivery-operation-store.js"],"names":[],"mappings":"AAEA,OAAO,mBAAmB,MAAM,6BAA6B,CAAA;AAQ7D;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,4BAA4B;IAQxC,mBAAmB;IACnB,KAAK,QAJK,MAAM;IAKhB,aAAa;IATpB;;;;;OAKG;IACH,YAAY,EAAC,aAAa,EAAE,KAAwB,EAAC,EAHlD;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO,CAC7C;QAA4B,KAAK,AAAjC,CACF,EADU,MAAM,MAAM,CACtB;KACoD,EAIpD;IAED;;;;;;OAMG;IACG,YAAY,CAAC,EAAC,UAAU,EAAE,OAAO,EAAC,EAJrC;QAAuE,UAAU,EAAzE,OAAO,YAAY,EAAE,mCAAmC,CAChE;QAAyD,OAAO,EAAxD,OAAO,YAAY,EAAE,qBAAqB,CAClD;KAEqC,GAF3B,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,uBAAuB,EAAE,MAAM,CAAA;KAAC,CAAC,CAsE3E;IAED;;;;;OAKG;IACG,aAAa,CAAC,EAAE,EAJX,OAAO,6BAA6B,EAAE,OAI3B,EAAE,WAAW,EAHxB,MAGwB,GAFtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAWzE;IAED;;;;;;OAMG;IACH,YAAY,CAAC,EAAC,SAAS,EAAE,GAAG,EAAC,EAJ1B;QAA2D,SAAS,EAA5D,OAAO,YAAY,EAAE,uBAAuB,CACpD;QAA4D,GAAG,EAAvD,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CACrD;KAE0B,GAFhB,IAAI,CAahB;CACF"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import BackgroundJobsStore from "../background-jobs/store.js";
|
|
3
|
+
import VelociousError from "../velocious-error.js";
|
|
4
|
+
import { MAIL_DELIVERY_OPERATIONS_TABLE, mailDeliveryOperationKey, validateAttemptPayload } from "./delivery-operation.js";
|
|
5
|
+
/**
|
|
6
|
+
* Durable first-attempt and retention guard for required mail operations.
|
|
7
|
+
*/
|
|
8
|
+
export default class MailerDeliveryOperationStore {
|
|
9
|
+
/**
|
|
10
|
+
* Creates a durable mail-operation state guard.
|
|
11
|
+
* @param {object} args - Store input.
|
|
12
|
+
* @param {import("../configuration.js").default} args.configuration - Active configuration.
|
|
13
|
+
* @param {() => number} [args.clock] - Explicit clock dependency.
|
|
14
|
+
*/
|
|
15
|
+
constructor({ configuration, clock = () => Date.now() }) {
|
|
16
|
+
this.backgroundJobsStore = new BackgroundJobsStore({ configuration });
|
|
17
|
+
this.clock = clock;
|
|
18
|
+
this.configuration = configuration;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Atomically starts the provider retention clock once and rejects expired attempts.
|
|
22
|
+
* @param {object} args - Attempt input.
|
|
23
|
+
* @param {import("./index.js").MailerDeliveryIdempotencyCapability} args.capability - Current backend capability.
|
|
24
|
+
* @param {import("./index.js").MailerDeliveryPayload} args.payload - Persisted payload.
|
|
25
|
+
* @returns {Promise<{expiresAtMs: number, firstAttemptStartedAtMs: number}>} - Attempt window.
|
|
26
|
+
*/
|
|
27
|
+
async beginAttempt({ capability, payload }) {
|
|
28
|
+
const operation = validateAttemptPayload({ capability, payload });
|
|
29
|
+
const nowMs = this.clock();
|
|
30
|
+
if (!Number.isSafeInteger(nowMs) || nowMs < 0)
|
|
31
|
+
throw new Error("Mailer delivery operation clock must return a non-negative safe integer");
|
|
32
|
+
const databaseIdentifier = this.backgroundJobsStore.getDatabaseIdentifier();
|
|
33
|
+
return await this.configuration.ensureConnections({
|
|
34
|
+
databaseIdentifiers: [databaseIdentifier],
|
|
35
|
+
name: "Mailer delivery operation attempt"
|
|
36
|
+
}, async (dbs) => {
|
|
37
|
+
const db = dbs[databaseIdentifier];
|
|
38
|
+
if (db.insideTransaction()) {
|
|
39
|
+
throw VelociousError.safe("Required mail delivery cannot start inside an existing database transaction.", {
|
|
40
|
+
code: "mail-delivery-idempotency-transaction-active"
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
await this.backgroundJobsStore.ensureSchema(db);
|
|
44
|
+
return await db.transaction(async () => {
|
|
45
|
+
const operationKey = mailDeliveryOperationKey(operation.id);
|
|
46
|
+
// A value-preserving structured update obtains the row's write lock on
|
|
47
|
+
// every driver before we inspect or initialize the one-shot timestamp.
|
|
48
|
+
await db.update({
|
|
49
|
+
tableName: MAIL_DELIVERY_OPERATIONS_TABLE,
|
|
50
|
+
data: { operation_key: operationKey },
|
|
51
|
+
conditions: { operation_key: operationKey }
|
|
52
|
+
});
|
|
53
|
+
let row = await this._operationRow(db, operation.id);
|
|
54
|
+
if (!row)
|
|
55
|
+
throw new Error("Required mail delivery operation is not durably registered");
|
|
56
|
+
this._validateRow({ operation, row });
|
|
57
|
+
let firstAttemptStartedAtMs = numberOrNull(row.first_attempt_started_at_ms);
|
|
58
|
+
if (firstAttemptStartedAtMs === null) {
|
|
59
|
+
await db.update({
|
|
60
|
+
tableName: MAIL_DELIVERY_OPERATIONS_TABLE,
|
|
61
|
+
data: { first_attempt_started_at_ms: nowMs },
|
|
62
|
+
conditions: { operation_key: operationKey }
|
|
63
|
+
});
|
|
64
|
+
row = await this._operationRow(db, operation.id);
|
|
65
|
+
firstAttemptStartedAtMs = row ? numberOrNull(row.first_attempt_started_at_ms) : null;
|
|
66
|
+
if (firstAttemptStartedAtMs === null)
|
|
67
|
+
throw new Error("Failed to durably start mail delivery provider retention");
|
|
68
|
+
}
|
|
69
|
+
const expiresAtMs = firstAttemptStartedAtMs + operation.providerRetentionMs;
|
|
70
|
+
if (nowMs >= expiresAtMs) {
|
|
71
|
+
throw VelociousError.safe("The required mail delivery idempotency window expired before another attempt.", {
|
|
72
|
+
code: "mail-delivery-idempotency-expired",
|
|
73
|
+
details: {
|
|
74
|
+
expiresAtMs,
|
|
75
|
+
firstAttemptStartedAtMs,
|
|
76
|
+
operationId: operation.id,
|
|
77
|
+
providerKind: operation.providerKind
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return { expiresAtMs, firstAttemptStartedAtMs };
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Loads one operation by its fixed-size digest key.
|
|
87
|
+
* @param {import("../database/drivers/base.js").default} db - Database connection.
|
|
88
|
+
* @param {string} operationId - Operation id.
|
|
89
|
+
* @returns {Promise<Record<string, ReturnType<typeof JSON.parse>> | null>} - Row or null.
|
|
90
|
+
*/
|
|
91
|
+
async _operationRow(db, operationId) {
|
|
92
|
+
const rows = await db
|
|
93
|
+
.newQuery()
|
|
94
|
+
.from(MAIL_DELIVERY_OPERATIONS_TABLE)
|
|
95
|
+
.where({ operation_key: mailDeliveryOperationKey(operationId) })
|
|
96
|
+
.limit(1)
|
|
97
|
+
.results();
|
|
98
|
+
return rows[0] ? /** @type {Record<string, ReturnType<typeof JSON.parse>>} */ (rows[0]) : null;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Validates immutable durable fields without including mail content in failures.
|
|
102
|
+
* @param {object} args - Validation input.
|
|
103
|
+
* @param {import("./index.js").MailerDeliveryOperation} args.operation - Persisted payload operation.
|
|
104
|
+
* @param {Record<string, ReturnType<typeof JSON.parse>>} args.row - Durable operation row.
|
|
105
|
+
* @returns {void}
|
|
106
|
+
*/
|
|
107
|
+
_validateRow({ operation, row }) {
|
|
108
|
+
const matches = String(row.operation_id) === operation.id
|
|
109
|
+
&& String(row.payload_digest) === operation.payloadDigest
|
|
110
|
+
&& String(row.provider_kind) === operation.providerKind
|
|
111
|
+
&& numberOrNull(row.provider_retention_ms) === operation.providerRetentionMs;
|
|
112
|
+
if (!matches) {
|
|
113
|
+
throw VelociousError.safe("The durable mail delivery operation does not match the persisted payload or provider.", {
|
|
114
|
+
code: "mail-delivery-idempotency-conflict"
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Normalizes a database integer.
|
|
121
|
+
* @param {ReturnType<typeof JSON.parse>} value - Database value.
|
|
122
|
+
* @returns {number | null} - Number or null.
|
|
123
|
+
*/
|
|
124
|
+
function numberOrNull(value) {
|
|
125
|
+
if (value === null || value === undefined || value === "")
|
|
126
|
+
return null;
|
|
127
|
+
const number = Number(value);
|
|
128
|
+
return Number.isNaN(number) ? null : number;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsaXZlcnktb3BlcmF0aW9uLXN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21haWxlci9kZWxpdmVyeS1vcGVyYXRpb24tc3RvcmUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sbUJBQW1CLE1BQU0sNkJBQTZCLENBQUE7QUFDN0QsT0FBTyxjQUFjLE1BQU0sdUJBQXVCLENBQUE7QUFDbEQsT0FBTyxFQUNMLDhCQUE4QixFQUM5Qix3QkFBd0IsRUFDeEIsc0JBQXNCLEVBQ3ZCLE1BQU0seUJBQXlCLENBQUE7QUFFaEM7O0dBRUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDRCQUE0QjtJQUMvQzs7Ozs7T0FLRztJQUNILFlBQVksRUFBQyxhQUFhLEVBQUUsS0FBSyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBQztRQUNuRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLENBQUE7UUFDbkUsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUE7UUFDbEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUE7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFDO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLHNCQUFzQixDQUFDLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUE7UUFDL0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBRTFCLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx5RUFBeUUsQ0FBQyxDQUFBO1FBRXpJLE1BQU0sa0JBQWtCLEdBQUcsSUFB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QUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxFQUFFO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFDdEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRTVCLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgQmFja2dyb3VuZEpvYnNTdG9yZSBmcm9tIFwiLi4vYmFja2dyb3VuZC1qb2JzL3N0b3JlLmpzXCJcbmltcG9ydCBWZWxvY2lvdXNFcnJvciBmcm9tIFwiLi4vdmVsb2Npb3VzLWVycm9yLmpzXCJcbmltcG9ydCB7XG4gIE1BSUxfREVMSVZFUllfT1BFUkFUSU9OU19UQUJMRSxcbiAgbWFpbERlbGl2ZXJ5T3BlcmF0aW9uS2V5LFxuICB2YWxpZGF0ZUF0dGVtcHRQYXlsb2FkXG59IGZyb20gXCIuL2RlbGl2ZXJ5LW9wZXJhdGlvbi5qc1wiXG5cbi8qKlxuICogRHVyYWJsZSBmaXJzdC1hdHRlbXB0IGFuZCByZXRlbnRpb24gZ3VhcmQgZm9yIHJlcXVpcmVkIG1haWwgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFpbGVyRGVsaXZlcnlPcGVyYXRpb25TdG9yZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZHVyYWJsZSBtYWlsLW9wZXJhdGlvbiBzdGF0ZSBndWFyZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBTdG9yZSBpbnB1dC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIEFjdGl2ZSBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0geygpID0+IG51bWJlcn0gW2FyZ3MuY2xvY2tdIC0gRXhwbGljaXQgY2xvY2sgZGVwZW5kZW5jeS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtjb25maWd1cmF0aW9uLCBjbG9jayA9ICgpID0+IERhdGUubm93KCl9KSB7XG4gICAgdGhpcy5iYWNrZ3JvdW5kSm9ic1N0b3JlID0gbmV3IEJhY2tncm91bmRKb2JzU3RvcmUoe2NvbmZpZ3VyYXRpb259KVxuICAgIHRoaXMuY2xvY2sgPSBjbG9ja1xuICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBBdG9taWNhbGx5IHN0YXJ0cyB0aGUgcHJvdmlkZXIgcmV0ZW50aW9uIGNsb2NrIG9uY2UgYW5kIHJlamVjdHMgZXhwaXJlZCBhdHRlbXB0cy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBBdHRlbXB0IGlucHV0LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlJZGVtcG90ZW5jeUNhcGFiaWxpdHl9IGFyZ3MuY2FwYWJpbGl0eSAtIEN1cnJlbnQgYmFja2VuZCBjYXBhYmlsaXR5LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vaW5kZXguanNcIikuTWFpbGVyRGVsaXZlcnlQYXlsb2FkfSBhcmdzLnBheWxvYWQgLSBQZXJzaXN0ZWQgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2V4cGlyZXNBdE1zOiBudW1iZXIsIGZpcnN0QXR0ZW1wdFN0YXJ0ZWRBdE1zOiBudW1iZXJ9Pn0gLSBBdHRlbXB0IHdpbmRvdy5cbiAgICovXG4gIGFzeW5jIGJlZ2luQXR0ZW1wdCh7Y2FwYWJpbGl0eSwgcGF5bG9hZH0pIHtcbiAgICBjb25zdCBvcGVyYXRpb24gPSB2YWxpZGF0ZUF0dGVtcHRQYXlsb2FkKHtjYXBhYmlsaXR5LCBwYXlsb2FkfSlcbiAgICBjb25zdCBub3dNcyA9IHRoaXMuY2xvY2soKVxuXG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihub3dNcykgfHwgbm93TXMgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJNYWlsZXIgZGVsaXZlcnkgb3BlcmF0aW9uIGNsb2NrIG11c3QgcmV0dXJuIGEgbm9uLW5lZ2F0aXZlIHNhZmUgaW50ZWdlclwiKVxuXG4gICAgY29uc3QgZGF0YWJhc2VJZGVudGlmaWVyID0gdGhpcy5iYWNrZ3JvdW5kSm9ic1N0b3JlLmdldERhdGFiYXNlSWRlbnRpZmllcigpXG5cbiAgICByZXR1cm4gYXdhaXQgdGhpcy5jb25maWd1cmF0aW9uLmVuc3VyZUNvbm5lY3Rpb25zKHtcbiAgICAgIGRhdGFiYXNlSWRlbnRpZmllcnM6IFtkYXRhYmFzZUlkZW50aWZpZXJdLFxuICAgICAgbmFtZTogXCJNYWlsZXIgZGVsaXZlcnkgb3BlcmF0aW9uIGF0dGVtcHRcIlxuICAgIH0sIGFzeW5jIChkYnMpID0+IHtcbiAgICAgIGNvbnN0IGRiID0gZGJzW2RhdGFiYXNlSWRlbnRpZmllcl1cblxuICAgICAgaWYgKGRiLmluc2lkZVRyYW5zYWN0aW9uKCkpIHtcbiAgICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIlJlcXVpcmVkIG1haWwgZGVsaXZlcnkgY2Fubm90IHN0YXJ0IGluc2lkZSBhbiBleGlzdGluZyBkYXRhYmFzZSB0cmFuc2FjdGlvbi5cIiwge1xuICAgICAgICAgIGNvZGU6IFwibWFpbC1kZWxpdmVyeS1pZGVtcG90ZW5jeS10cmFuc2FjdGlvbi1hY3RpdmVcIlxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLmJhY2tncm91bmRKb2JzU3RvcmUuZW5zdXJlU2NoZW1hKGRiKVxuXG4gICAgICByZXR1cm4gYXdhaXQgZGIudHJhbnNhY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBvcGVyYXRpb25LZXkgPSBtYWlsRGVsaXZlcnlPcGVyYXRpb25LZXkob3BlcmF0aW9uLmlkKVxuXG4gICAgICAgIC8vIEEgdmFsdWUtcHJlc2VydmluZyBzdHJ1Y3R1cmVkIHVwZGF0ZSBvYnRhaW5zIHRoZSByb3cncyB3cml0ZSBsb2NrIG9uXG4gICAgICAgIC8vIGV2ZXJ5IGRyaXZlciBiZWZvcmUgd2UgaW5zcGVjdCBvciBpbml0aWFsaXplIHRoZSBvbmUtc2hvdCB0aW1lc3RhbXAuXG4gICAgICAgIGF3YWl0IGRiLnVwZGF0ZSh7XG4gICAgICAgICAgdGFibGVOYW1lOiBNQUlMX0RFTElWRVJZX09QRVJBVElPTlNfVEFCTEUsXG4gICAgICAgICAgZGF0YToge29wZXJhdGlvbl9rZXk6IG9wZXJhdGlvbktleX0sXG4gICAgICAgICAgY29uZGl0aW9uczoge29wZXJhdGlvbl9rZXk6IG9wZXJhdGlvbktleX1cbiAgICAgICAgfSlcbiAgICAgICAgbGV0IHJvdyA9IGF3YWl0IHRoaXMuX29wZXJhdGlvblJvdyhkYiwgb3BlcmF0aW9uLmlkKVxuXG4gICAgICAgIGlmICghcm93KSB0aHJvdyBuZXcgRXJyb3IoXCJSZXF1aXJlZCBtYWlsIGRlbGl2ZXJ5IG9wZXJhdGlvbiBpcyBub3QgZHVyYWJseSByZWdpc3RlcmVkXCIpXG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlUm93KHtvcGVyYXRpb24sIHJvd30pXG5cbiAgICAgICAgbGV0IGZpcnN0QXR0ZW1wdFN0YXJ0ZWRBdE1zID0gbnVtYmVyT3JOdWxsKHJvdy5maXJzdF9hdHRlbXB0X3N0YXJ0ZWRfYXRfbXMpXG5cbiAgICAgICAgaWYgKGZpcnN0QXR0ZW1wdFN0YXJ0ZWRBdE1zID09PSBudWxsKSB7XG4gICAgICAgICAgYXdhaXQgZGIudXBkYXRlKHtcbiAgICAgICAgICAgIHRhYmxlTmFtZTogTUFJTF9ERUxJVkVSWV9PUEVSQVRJT05TX1RBQkxFLFxuICAgICAgICAgICAgZGF0YToge2ZpcnN0X2F0dGVtcHRfc3RhcnRlZF9hdF9tczogbm93TXN9LFxuICAgICAgICAgICAgY29uZGl0aW9uczoge29wZXJhdGlvbl9rZXk6IG9wZXJhdGlvbktleX1cbiAgICAgICAgICB9KVxuICAgICAgICAgIHJvdyA9IGF3YWl0IHRoaXMuX29wZXJhdGlvblJvdyhkYiwgb3BlcmF0aW9uLmlkKVxuICAgICAgICAgIGZpcnN0QXR0ZW1wdFN0YXJ0ZWRBdE1zID0gcm93ID8gbnVtYmVyT3JOdWxsKHJvdy5maXJzdF9hdHRlbXB0X3N0YXJ0ZWRfYXRfbXMpIDogbnVsbFxuXG4gICAgICAgICAgaWYgKGZpcnN0QXR0ZW1wdFN0YXJ0ZWRBdE1zID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZHVyYWJseSBzdGFydCBtYWlsIGRlbGl2ZXJ5IHByb3ZpZGVyIHJldGVudGlvblwiKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhwaXJlc0F0TXMgPSBmaXJzdEF0dGVtcHRTdGFydGVkQXRNcyArIG9wZXJhdGlvbi5wcm92aWRlclJldGVudGlvbk1zXG5cbiAgICAgICAgaWYgKG5vd01zID49IGV4cGlyZXNBdE1zKSB7XG4gICAgICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIlRoZSByZXF1aXJlZCBtYWlsIGRlbGl2ZXJ5IGlkZW1wb3RlbmN5IHdpbmRvdyBleHBpcmVkIGJlZm9yZSBhbm90aGVyIGF0dGVtcHQuXCIsIHtcbiAgICAgICAgICAgIGNvZGU6IFwibWFpbC1kZWxpdmVyeS1pZGVtcG90ZW5jeS1leHBpcmVkXCIsXG4gICAgICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgICAgIGV4cGlyZXNBdE1zLFxuICAgICAgICAgICAgICBmaXJzdEF0dGVtcHRTdGFydGVkQXRNcyxcbiAgICAgICAgICAgICAgb3BlcmF0aW9uSWQ6IG9wZXJhdGlvbi5pZCxcbiAgICAgICAgICAgICAgcHJvdmlkZXJLaW5kOiBvcGVyYXRpb24ucHJvdmlkZXJLaW5kXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7ZXhwaXJlc0F0TXMsIGZpcnN0QXR0ZW1wdFN0YXJ0ZWRBdE1zfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIG9uZSBvcGVyYXRpb24gYnkgaXRzIGZpeGVkLXNpemUgZGlnZXN0IGtleS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9kcml2ZXJzL2Jhc2UuanNcIikuZGVmYXVsdH0gZGIgLSBEYXRhYmFzZSBjb25uZWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0aW9uSWQgLSBPcGVyYXRpb24gaWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiB8IG51bGw+fSAtIFJvdyBvciBudWxsLlxuICAgKi9cbiAgYXN5bmMgX29wZXJhdGlvblJvdyhkYiwgb3BlcmF0aW9uSWQpIHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgZGJcbiAgICAgIC5uZXdRdWVyeSgpXG4gICAgICAuZnJvbShNQUlMX0RFTElWRVJZX09QRVJBVElPTlNfVEFCTEUpXG4gICAgICAud2hlcmUoe29wZXJhdGlvbl9rZXk6IG1haWxEZWxpdmVyeU9wZXJhdGlvbktleShvcGVyYXRpb25JZCl9KVxuICAgICAgLmxpbWl0KDEpXG4gICAgICAucmVzdWx0cygpXG5cbiAgICByZXR1cm4gcm93c1swXSA/IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAocm93c1swXSkgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGltbXV0YWJsZSBkdXJhYmxlIGZpZWxkcyB3aXRob3V0IGluY2x1ZGluZyBtYWlsIGNvbnRlbnQgaW4gZmFpbHVyZXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gVmFsaWRhdGlvbiBpbnB1dC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2luZGV4LmpzXCIpLk1haWxlckRlbGl2ZXJ5T3BlcmF0aW9ufSBhcmdzLm9wZXJhdGlvbiAtIFBlcnNpc3RlZCBwYXlsb2FkIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3Mucm93IC0gRHVyYWJsZSBvcGVyYXRpb24gcm93LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIF92YWxpZGF0ZVJvdyh7b3BlcmF0aW9uLCByb3d9KSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IFN0cmluZyhyb3cub3BlcmF0aW9uX2lkKSA9PT0gb3BlcmF0aW9uLmlkXG4gICAgICAmJiBTdHJpbmcocm93LnBheWxvYWRfZGlnZXN0KSA9PT0gb3BlcmF0aW9uLnBheWxvYWREaWdlc3RcbiAgICAgICYmIFN0cmluZyhyb3cucHJvdmlkZXJfa2luZCkgPT09IG9wZXJhdGlvbi5wcm92aWRlcktpbmRcbiAgICAgICYmIG51bWJlck9yTnVsbChyb3cucHJvdmlkZXJfcmV0ZW50aW9uX21zKSA9PT0gb3BlcmF0aW9uLnByb3ZpZGVyUmV0ZW50aW9uTXNcblxuICAgIGlmICghbWF0Y2hlcykge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIlRoZSBkdXJhYmxlIG1haWwgZGVsaXZlcnkgb3BlcmF0aW9uIGRvZXMgbm90IG1hdGNoIHRoZSBwZXJzaXN0ZWQgcGF5bG9hZCBvciBwcm92aWRlci5cIiwge1xuICAgICAgICBjb2RlOiBcIm1haWwtZGVsaXZlcnktaWRlbXBvdGVuY3ktY29uZmxpY3RcIlxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGEgZGF0YWJhc2UgaW50ZWdlci5cbiAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHZhbHVlIC0gRGF0YWJhc2UgdmFsdWUuXG4gKiBAcmV0dXJucyB7bnVtYmVyIHwgbnVsbH0gLSBOdW1iZXIgb3IgbnVsbC5cbiAqL1xuZnVuY3Rpb24gbnVtYmVyT3JOdWxsKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gbnVsbFxuICBjb25zdCBudW1iZXIgPSBOdW1iZXIodmFsdWUpXG5cbiAgcmV0dXJuIE51bWJlci5pc05hTihudW1iZXIpID8gbnVsbCA6IG51bWJlclxufVxuIl19
|