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.
Files changed (106) hide show
  1. package/README.md +16 -0
  2. package/build/background-jobs/pooled-runner-broker-identity.js +22 -4
  3. package/build/background-jobs/store.js +383 -9
  4. package/build/background-jobs/types.js +1 -0
  5. package/build/cli/commands/db/tenants/migrations/pending.js +45 -0
  6. package/build/configuration-types.js +3 -0
  7. package/build/configuration.js +5 -2
  8. package/build/database/drivers/sqlite/base.js +3 -3
  9. package/build/database/tenants/migration-pending-inspector.js +77 -0
  10. package/build/environment-handlers/base.js +8 -0
  11. package/build/environment-handlers/node.js +14 -0
  12. package/build/mailer/backends/resend-smtp.js +121 -0
  13. package/build/mailer/base.js +52 -22
  14. package/build/mailer/delivery-operation-store.js +152 -0
  15. package/build/mailer/delivery-operation.js +205 -0
  16. package/build/mailer/delivery.js +9 -4
  17. package/build/mailer/index.js +5 -1
  18. package/build/mailer.js +6 -1
  19. package/build/src/background-jobs/pooled-runner-broker-identity.d.ts +10 -1
  20. package/build/src/background-jobs/pooled-runner-broker-identity.d.ts.map +1 -1
  21. package/build/src/background-jobs/pooled-runner-broker-identity.js +23 -5
  22. package/build/src/background-jobs/store.d.ts +154 -0
  23. package/build/src/background-jobs/store.d.ts.map +1 -1
  24. package/build/src/background-jobs/store.js +350 -10
  25. package/build/src/background-jobs/types.d.ts +5 -0
  26. package/build/src/background-jobs/types.d.ts.map +1 -1
  27. package/build/src/background-jobs/types.js +2 -1
  28. package/build/src/cli/commands/db/tenants/migrations/pending.d.ts +15 -0
  29. package/build/src/cli/commands/db/tenants/migrations/pending.d.ts.map +1 -0
  30. package/build/src/cli/commands/db/tenants/migrations/pending.js +40 -0
  31. package/build/src/configuration-types.d.ts +20 -0
  32. package/build/src/configuration-types.d.ts.map +1 -1
  33. package/build/src/configuration-types.js +4 -1
  34. package/build/src/configuration.d.ts +2 -2
  35. package/build/src/configuration.d.ts.map +1 -1
  36. package/build/src/configuration.js +6 -3
  37. package/build/src/database/drivers/sqlite/base.js +4 -4
  38. package/build/src/database/tenants/migration-pending-inspector.d.ts +38 -0
  39. package/build/src/database/tenants/migration-pending-inspector.d.ts.map +1 -0
  40. package/build/src/database/tenants/migration-pending-inspector.js +70 -0
  41. package/build/src/environment-handlers/base.d.ts +10 -0
  42. package/build/src/environment-handlers/base.d.ts.map +1 -1
  43. package/build/src/environment-handlers/base.js +8 -1
  44. package/build/src/environment-handlers/node.d.ts +11 -0
  45. package/build/src/environment-handlers/node.d.ts.map +1 -1
  46. package/build/src/environment-handlers/node.js +14 -1
  47. package/build/src/mailer/backends/resend-smtp.d.ts +43 -0
  48. package/build/src/mailer/backends/resend-smtp.d.ts.map +1 -0
  49. package/build/src/mailer/backends/resend-smtp.js +106 -0
  50. package/build/src/mailer/base.d.ts +9 -2
  51. package/build/src/mailer/base.d.ts.map +1 -1
  52. package/build/src/mailer/base.js +41 -19
  53. package/build/src/mailer/delivery-operation-store.d.ts +52 -0
  54. package/build/src/mailer/delivery-operation-store.d.ts.map +1 -0
  55. package/build/src/mailer/delivery-operation-store.js +130 -0
  56. package/build/src/mailer/delivery-operation.d.ts +73 -0
  57. package/build/src/mailer/delivery-operation.d.ts.map +1 -0
  58. package/build/src/mailer/delivery-operation.js +185 -0
  59. package/build/src/mailer/delivery.d.ts +4 -2
  60. package/build/src/mailer/delivery.d.ts.map +1 -1
  61. package/build/src/mailer/delivery.js +9 -5
  62. package/build/src/mailer/index.d.ts +24 -1
  63. package/build/src/mailer/index.d.ts.map +1 -1
  64. package/build/src/mailer/index.js +6 -2
  65. package/build/src/mailer.d.ts +11 -13
  66. package/build/src/mailer.d.ts.map +1 -1
  67. package/build/src/mailer.js +7 -2
  68. package/build/src/sync/local-mutation-log.d.ts +5 -5
  69. package/build/src/sync/local-mutation-log.d.ts.map +1 -1
  70. package/build/src/sync/local-mutation-log.js +34 -10
  71. package/build/src/sync/stable-json.d.ts +1 -8
  72. package/build/src/sync/stable-json.d.ts.map +1 -1
  73. package/build/src/sync/stable-json.js +2 -27
  74. package/build/src/sync/sync-envelope-replay-service.d.ts +3 -2
  75. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  76. package/build/src/sync/sync-envelope-replay-service.js +12 -8
  77. package/build/src/utils/stable-json.d.ts +7 -0
  78. package/build/src/utils/stable-json.d.ts.map +1 -0
  79. package/build/src/utils/stable-json.js +25 -0
  80. package/build/sync/local-mutation-log.js +37 -6
  81. package/build/sync/stable-json.js +1 -28
  82. package/build/sync/sync-envelope-replay-service.js +11 -7
  83. package/build/tsconfig.tsbuildinfo +1 -1
  84. package/build/utils/stable-json.js +26 -0
  85. package/package.json +1 -1
  86. package/src/background-jobs/pooled-runner-broker-identity.js +22 -4
  87. package/src/background-jobs/store.js +383 -9
  88. package/src/background-jobs/types.js +1 -0
  89. package/src/cli/commands/db/tenants/migrations/pending.js +45 -0
  90. package/src/configuration-types.js +3 -0
  91. package/src/configuration.js +5 -2
  92. package/src/database/drivers/sqlite/base.js +3 -3
  93. package/src/database/tenants/migration-pending-inspector.js +77 -0
  94. package/src/environment-handlers/base.js +8 -0
  95. package/src/environment-handlers/node.js +14 -0
  96. package/src/mailer/backends/resend-smtp.js +121 -0
  97. package/src/mailer/base.js +52 -22
  98. package/src/mailer/delivery-operation-store.js +152 -0
  99. package/src/mailer/delivery-operation.js +205 -0
  100. package/src/mailer/delivery.js +9 -4
  101. package/src/mailer/index.js +5 -1
  102. package/src/mailer.js +6 -1
  103. package/src/sync/local-mutation-log.js +37 -6
  104. package/src/sync/stable-json.js +1 -28
  105. package/src/sync/sync-envelope-replay-service.js +11 -7
  106. 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): Promise<string | import("./index.js").MailerDeliveryPayload | null>;
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":"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"}
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/mailer/base.js"],"names":[],"mappings":"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"}
@@ -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
- return await enqueuePayload(payload);
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
- if (await isTestingEnvironment()) {
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
- if (await isTestingEnvironment()) {
279
- deliveriesStore.push(payload);
280
- return payload;
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
- return await mailDeliveryJob.performLater(payload);
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