@composurecdk/sqs 0.7.0 → 0.8.1

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 (63) hide show
  1. package/dist/commonjs/defaults.d.ts.map +1 -0
  2. package/dist/commonjs/defaults.js +38 -0
  3. package/dist/commonjs/defaults.js.map +1 -0
  4. package/dist/commonjs/index.d.ts.map +1 -0
  5. package/dist/commonjs/index.js +10 -0
  6. package/dist/commonjs/index.js.map +1 -0
  7. package/dist/commonjs/package.json +3 -0
  8. package/dist/commonjs/queue-alarm-config.d.ts.map +1 -0
  9. package/dist/commonjs/queue-alarm-config.js +3 -0
  10. package/dist/commonjs/queue-alarm-config.js.map +1 -0
  11. package/dist/commonjs/queue-alarm-defaults.d.ts.map +1 -0
  12. package/dist/commonjs/queue-alarm-defaults.js +40 -0
  13. package/dist/commonjs/queue-alarm-defaults.js.map +1 -0
  14. package/dist/commonjs/queue-alarms.d.ts.map +1 -0
  15. package/dist/commonjs/queue-alarms.js +75 -0
  16. package/dist/commonjs/queue-alarms.js.map +1 -0
  17. package/dist/commonjs/queue-builder.d.ts.map +1 -0
  18. package/dist/commonjs/queue-builder.js +96 -0
  19. package/dist/commonjs/queue-builder.js.map +1 -0
  20. package/dist/esm/defaults.d.ts +8 -0
  21. package/dist/esm/defaults.d.ts.map +1 -0
  22. package/dist/esm/defaults.js.map +1 -0
  23. package/dist/esm/index.d.ts +5 -0
  24. package/dist/esm/index.d.ts.map +1 -0
  25. package/dist/esm/index.js.map +1 -0
  26. package/dist/esm/package.json +3 -0
  27. package/dist/esm/queue-alarm-config.d.ts +46 -0
  28. package/dist/esm/queue-alarm-config.d.ts.map +1 -0
  29. package/dist/esm/queue-alarm-config.js.map +1 -0
  30. package/dist/esm/queue-alarm-defaults.d.ts +18 -0
  31. package/dist/esm/queue-alarm-defaults.d.ts.map +1 -0
  32. package/dist/esm/queue-alarm-defaults.js.map +1 -0
  33. package/dist/esm/queue-alarms.d.ts +26 -0
  34. package/dist/esm/queue-alarms.d.ts.map +1 -0
  35. package/dist/esm/queue-alarms.js.map +1 -0
  36. package/dist/esm/queue-builder.d.ts +111 -0
  37. package/dist/esm/queue-builder.d.ts.map +1 -0
  38. package/dist/{queue-builder.js → esm/queue-builder.js} +36 -0
  39. package/dist/esm/queue-builder.js.map +1 -0
  40. package/package.json +36 -18
  41. package/dist/defaults.d.ts.map +0 -1
  42. package/dist/defaults.js.map +0 -1
  43. package/dist/index.d.ts.map +0 -1
  44. package/dist/index.js.map +0 -1
  45. package/dist/queue-alarm-config.d.ts.map +0 -1
  46. package/dist/queue-alarm-config.js.map +0 -1
  47. package/dist/queue-alarm-defaults.d.ts.map +0 -1
  48. package/dist/queue-alarm-defaults.js.map +0 -1
  49. package/dist/queue-alarms.d.ts.map +0 -1
  50. package/dist/queue-alarms.js.map +0 -1
  51. package/dist/queue-builder.d.ts.map +0 -1
  52. package/dist/queue-builder.js.map +0 -1
  53. /package/dist/{defaults.d.ts → commonjs/defaults.d.ts} +0 -0
  54. /package/dist/{index.d.ts → commonjs/index.d.ts} +0 -0
  55. /package/dist/{queue-alarm-config.d.ts → commonjs/queue-alarm-config.d.ts} +0 -0
  56. /package/dist/{queue-alarm-defaults.d.ts → commonjs/queue-alarm-defaults.d.ts} +0 -0
  57. /package/dist/{queue-alarms.d.ts → commonjs/queue-alarms.d.ts} +0 -0
  58. /package/dist/{queue-builder.d.ts → commonjs/queue-builder.d.ts} +0 -0
  59. /package/dist/{defaults.js → esm/defaults.js} +0 -0
  60. /package/dist/{index.js → esm/index.js} +0 -0
  61. /package/dist/{queue-alarm-config.js → esm/queue-alarm-config.js} +0 -0
  62. /package/dist/{queue-alarm-defaults.js → esm/queue-alarm-defaults.js} +0 -0
  63. /package/dist/{queue-alarms.js → esm/queue-alarms.js} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEvE;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,UAAU,CA4B9C,CAAC"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QUEUE_DEFAULTS = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const aws_sqs_1 = require("aws-cdk-lib/aws-sqs");
6
+ /**
7
+ * Secure, AWS-recommended defaults applied to every SQS queue built
8
+ * with {@link createQueueBuilder}. Each property can be individually
9
+ * overridden via the builder's fluent API.
10
+ */
11
+ exports.QUEUE_DEFAULTS = {
12
+ /**
13
+ * Reject any request that does not use TLS. Adds a resource policy
14
+ * `Deny` on `aws:SecureTransport: false`, the same control applied to
15
+ * SNS topics by {@link createTopicBuilder}.
16
+ * @see https://docs.aws.amazon.com/AmazonSQS/latest/SQSDeveloperGuide/sqs-security-best-practices.html
17
+ */
18
+ enforceSSL: true,
19
+ /**
20
+ * Encrypt messages at rest with the SQS-managed key (SSE-SQS). This
21
+ * is the safe baseline; bring-your-own KMS encryption is opt-in via
22
+ * `.encryptionMasterKey(...)` paired with `.encryption(QueueEncryption.KMS)`.
23
+ * CDK already defaults newly-created queues to SSE-SQS — making it
24
+ * explicit here keeps the default discoverable and stable across CDK
25
+ * versions.
26
+ * @see https://docs.aws.amazon.com/AmazonSQS/latest/SQSDeveloperGuide/sqs-data-protection.html
27
+ */
28
+ encryption: aws_sqs_1.QueueEncryption.SQS_MANAGED,
29
+ /**
30
+ * Enable long polling. Holds `ReceiveMessage` connections open for up
31
+ * to 20 seconds while waiting for messages, which cuts both the cost
32
+ * of empty receives and the perceived delivery latency of low-traffic
33
+ * queues. The 20s value is the SQS maximum.
34
+ * @see https://docs.aws.amazon.com/AmazonSQS/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html#sqs-long-polling
35
+ */
36
+ receiveMessageWaitTime: aws_cdk_lib_1.Duration.seconds(20),
37
+ };
38
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":";;;AAAA,6CAAuC;AACvC,iDAAuE;AAEvE;;;;GAIG;AACU,QAAA,cAAc,GAAwB;IACjD;;;;;OAKG;IACH,UAAU,EAAE,IAAI;IAEhB;;;;;;;;OAQG;IACH,UAAU,EAAE,yBAAe,CAAC,WAAW;IAEvC;;;;;;OAMG;IACH,sBAAsB,EAAE,sBAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;CAC7C,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QUEUE_ALARM_DEFAULTS = exports.QUEUE_DEFAULTS = exports.createQueueBuilder = void 0;
4
+ var queue_builder_js_1 = require("./queue-builder.js");
5
+ Object.defineProperty(exports, "createQueueBuilder", { enumerable: true, get: function () { return queue_builder_js_1.createQueueBuilder; } });
6
+ var defaults_js_1 = require("./defaults.js");
7
+ Object.defineProperty(exports, "QUEUE_DEFAULTS", { enumerable: true, get: function () { return defaults_js_1.QUEUE_DEFAULTS; } });
8
+ var queue_alarm_defaults_js_1 = require("./queue-alarm-defaults.js");
9
+ Object.defineProperty(exports, "QUEUE_ALARM_DEFAULTS", { enumerable: true, get: function () { return queue_alarm_defaults_js_1.QUEUE_ALARM_DEFAULTS; } });
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,uDAK4B;AAJ1B,sHAAA,kBAAkB,OAAA;AAKpB,6CAA+C;AAAtC,6GAAA,cAAc,OAAA;AAEvB,qEAAiE;AAAxD,+HAAA,oBAAoB,OAAA"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-alarm-config.d.ts","sourceRoot":"","sources":["../../src/queue-alarm-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;;;;;;OAaG;IACH,6BAA6B,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAEpD;;;;;;;;;;;OAWG;IACH,qCAAqC,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;CAC7D"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=queue-alarm-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-alarm-config.js","sourceRoot":"","sources":["../../src/queue-alarm-config.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-alarm-defaults.d.ts","sourceRoot":"","sources":["../../src/queue-alarm-defaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,UAAU,kBAAkB;IAC1B,OAAO,EAAE,IAAI,CAAC;IACd,6BAA6B,EAAE,mBAAmB,CAAC;IACnD,qCAAqC,EAAE,mBAAmB,CAAC;CAC5D;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAAE,kBA2BlC,CAAC"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QUEUE_ALARM_DEFAULTS = void 0;
4
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
5
+ /**
6
+ * AWS-recommended default alarm configuration for SQS queues.
7
+ *
8
+ * Tuned for primary (consumer-fed) queues. Dead-letter queues need
9
+ * different thresholds — any message on a DLQ is itself an alert,
10
+ * whereas a primary queue with messages is normal.
11
+ *
12
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#SQS
13
+ */
14
+ exports.QUEUE_ALARM_DEFAULTS = {
15
+ enabled: true,
16
+ /**
17
+ * 5 minutes. Conservative starting point for a "consumer falling
18
+ * behind" alarm. The right value depends on the workload's SLA and
19
+ * `retentionPeriod`; tune via `recommendedAlarms`.
20
+ */
21
+ approximateAgeOfOldestMessage: {
22
+ threshold: 300,
23
+ evaluationPeriods: 1,
24
+ datapointsToAlarm: 1,
25
+ treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING,
26
+ },
27
+ /**
28
+ * 90,000 — 75% of the SQS 120,000 in-flight message quota. Proactive
29
+ * guardrail; a breach means the queue is approaching the point where
30
+ * new messages will be rejected.
31
+ * @see https://docs.aws.amazon.com/AmazonSQS/latest/SQSDeveloperGuide/quotas-messages.html#quotas-in-flight
32
+ */
33
+ approximateNumberOfMessagesNotVisible: {
34
+ threshold: 90_000,
35
+ evaluationPeriods: 1,
36
+ datapointsToAlarm: 1,
37
+ treatMissingData: aws_cloudwatch_1.TreatMissingData.NOT_BREACHING,
38
+ },
39
+ };
40
+ //# sourceMappingURL=queue-alarm-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-alarm-defaults.js","sourceRoot":"","sources":["../../src/queue-alarm-defaults.ts"],"names":[],"mappings":";;;AAAA,+DAA8D;AAS9D;;;;;;;;GAQG;AACU,QAAA,oBAAoB,GAAuB;IACtD,OAAO,EAAE,IAAI;IAEb;;;;OAIG;IACH,6BAA6B,EAAE;QAC7B,SAAS,EAAE,GAAG;QACd,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,iCAAgB,CAAC,aAAa;KACjD;IAED;;;;;OAKG;IACH,qCAAqC,EAAE;QACrC,SAAS,EAAE,MAAM;QACjB,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,iCAAgB,CAAC,aAAa;KACjD;CACF,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-alarms.d.ts","sourceRoot":"","sources":["../../src/queue-alarms.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAsB,MAAM,4BAA4B,CAAC;AAC5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAoC,MAAM,0BAA0B,CAAC;AACpG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAMhE;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,eAAe,EAAE,CA+CnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,gBAAgB,GAAG,KAAK,GAAG,SAAS,EAC5C,YAAY,GAAE,sBAAsB,CAAC,MAAM,CAAC,EAAO,GAClD,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAUvB"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveQueueAlarmDefinitions = resolveQueueAlarmDefinitions;
4
+ exports.createQueueAlarms = createQueueAlarms;
5
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
6
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
7
+ const cloudwatch_1 = require("@composurecdk/cloudwatch");
8
+ const queue_alarm_defaults_js_1 = require("./queue-alarm-defaults.js");
9
+ const METRIC_PERIOD = aws_cdk_lib_1.Duration.minutes(1);
10
+ const METRIC_PERIOD_LABEL = `${String(METRIC_PERIOD.toMinutes())} minute`;
11
+ /**
12
+ * Resolves the recommended alarm configuration into fully-resolved
13
+ * {@link AlarmDefinition}s for an SQS queue.
14
+ */
15
+ function resolveQueueAlarmDefinitions(queue, config) {
16
+ if (config?.enabled === false)
17
+ return [];
18
+ const definitions = [];
19
+ if (config?.approximateAgeOfOldestMessage !== false) {
20
+ const cfg = (0, cloudwatch_1.resolveAlarmConfig)(config?.approximateAgeOfOldestMessage, queue_alarm_defaults_js_1.QUEUE_ALARM_DEFAULTS.approximateAgeOfOldestMessage);
21
+ definitions.push({
22
+ key: "approximateAgeOfOldestMessage",
23
+ alarmName: cfg.alarmName,
24
+ metric: queue.metricApproximateAgeOfOldestMessage({ period: METRIC_PERIOD }),
25
+ threshold: cfg.threshold,
26
+ comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD,
27
+ evaluationPeriods: cfg.evaluationPeriods,
28
+ datapointsToAlarm: cfg.datapointsToAlarm,
29
+ treatMissingData: cfg.treatMissingData,
30
+ description: `SQS queue's oldest message has been waiting longer than the threshold, ` +
31
+ `indicating consumers are falling behind. Threshold: > ${String(cfg.threshold)} seconds in ${METRIC_PERIOD_LABEL}.`,
32
+ });
33
+ }
34
+ if (config?.approximateNumberOfMessagesNotVisible !== false) {
35
+ const cfg = (0, cloudwatch_1.resolveAlarmConfig)(config?.approximateNumberOfMessagesNotVisible, queue_alarm_defaults_js_1.QUEUE_ALARM_DEFAULTS.approximateNumberOfMessagesNotVisible);
36
+ definitions.push({
37
+ key: "approximateNumberOfMessagesNotVisible",
38
+ alarmName: cfg.alarmName,
39
+ metric: queue.metricApproximateNumberOfMessagesNotVisible({ period: METRIC_PERIOD }),
40
+ threshold: cfg.threshold,
41
+ comparisonOperator: aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD,
42
+ evaluationPeriods: cfg.evaluationPeriods,
43
+ datapointsToAlarm: cfg.datapointsToAlarm,
44
+ treatMissingData: cfg.treatMissingData,
45
+ description: `SQS queue's in-flight messages are approaching the 120,000 per-queue quota; ` +
46
+ `further receives will be rejected once the quota is hit. ` +
47
+ `Threshold: > ${String(cfg.threshold)} in-flight in ${METRIC_PERIOD_LABEL}.`,
48
+ });
49
+ }
50
+ return definitions;
51
+ }
52
+ /**
53
+ * Creates AWS-recommended CloudWatch alarms for an SQS queue, merging
54
+ * recommended definitions with any custom alarm builders.
55
+ *
56
+ * @param scope - CDK construct scope for creating alarm constructs.
57
+ * @param id - Base identifier for alarm construct ids.
58
+ * @param queue - The SQS queue to create alarms for.
59
+ * @param config - User-provided alarm configuration, or `false` to disable all.
60
+ * @param customAlarms - Custom alarm builders added via `addAlarm()`.
61
+ * @returns A record mapping alarm keys to their created Alarm constructs.
62
+ *
63
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#SQS
64
+ */
65
+ function createQueueAlarms(scope, id, queue, config, customAlarms = []) {
66
+ if (config === false)
67
+ return {};
68
+ const enabled = config?.enabled ?? queue_alarm_defaults_js_1.QUEUE_ALARM_DEFAULTS.enabled;
69
+ if (!enabled)
70
+ return {};
71
+ const recommended = resolveQueueAlarmDefinitions(queue, config);
72
+ const custom = customAlarms.map((b) => b.resolve(queue));
73
+ return (0, cloudwatch_1.createAlarms)(scope, id, [...recommended, ...custom]);
74
+ }
75
+ //# sourceMappingURL=queue-alarms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-alarms.js","sourceRoot":"","sources":["../../src/queue-alarms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-builder.d.ts","sourceRoot":"","sources":["../../src/queue-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAehE;;;;GAIG;AACH,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,gBAAgB,GAAG,KAAK,CAAC;CAC9C;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,sDAAsD;IACtD,KAAK,EAAE,KAAK,CAAC;IAEb;;;;;;;;;;;OAWG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;AAE5E,cAAM,YAAa,YAAW,SAAS,CAAC,kBAAkB,CAAC;;IACzD,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAM;IAGvC,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,KAAK,EAAE,sBAAsB,CAAC,MAAM,CAAC,KAAK,sBAAsB,CAAC,MAAM,CAAC,GACnF,IAAI;IAKP,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAIxC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,kBAAkB;CAgBzD;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,IAAI,aAAa,CAElD"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createQueueBuilder = createQueueBuilder;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const aws_sqs_1 = require("aws-cdk-lib/aws-sqs");
6
+ const core_1 = require("@composurecdk/core");
7
+ const cloudformation_1 = require("@composurecdk/cloudformation");
8
+ const cloudwatch_1 = require("@composurecdk/cloudwatch");
9
+ const queue_alarms_js_1 = require("./queue-alarms.js");
10
+ const defaults_js_1 = require("./defaults.js");
11
+ /**
12
+ * AWS-recommended minimum for `maxReceiveCount` on an SQS redrive
13
+ * policy. A consumer needs a few retries before SQS gives up and
14
+ * forwards the message to the dead-letter queue; anything below this
15
+ * tends to surface as a flood of "poison" messages from transient
16
+ * errors that would have succeeded on retry.
17
+ *
18
+ * @see https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html
19
+ */
20
+ const RECOMMENDED_MIN_MAX_RECEIVE_COUNT = 5;
21
+ class QueueBuilder {
22
+ props = {};
23
+ #customAlarms = [];
24
+ addAlarm(key, configure) {
25
+ this.#customAlarms.push(configure(new cloudwatch_1.AlarmDefinitionBuilder(key)));
26
+ return this;
27
+ }
28
+ /** @internal — see ADR-0005. */
29
+ [core_1.COPY_STATE](target) {
30
+ target.#customAlarms.push(...this.#customAlarms);
31
+ }
32
+ build(scope, id) {
33
+ const { recommendedAlarms: alarmConfig, ...queueProps } = this.props;
34
+ const mergedProps = {
35
+ ...defaults_js_1.QUEUE_DEFAULTS,
36
+ ...queueProps,
37
+ };
38
+ warnIfLowMaxReceiveCount(scope, id, mergedProps);
39
+ const queue = new aws_sqs_1.Queue(scope, id, mergedProps);
40
+ const alarms = (0, queue_alarms_js_1.createQueueAlarms)(scope, id, queue, alarmConfig, this.#customAlarms);
41
+ return { queue, alarms };
42
+ }
43
+ }
44
+ /**
45
+ * Creates a new {@link IQueueBuilder} for configuring an AWS SQS queue.
46
+ *
47
+ * This is the entry point for defining an SQS queue component. The returned
48
+ * builder exposes every {@link QueueBuilderProps} property as a fluent setter/getter
49
+ * and implements {@link Lifecycle} for use with {@link compose}.
50
+ *
51
+ * @returns A fluent builder for an AWS SQS queue.
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * const orders = createQueueBuilder()
56
+ * .queueName("orders")
57
+ * .visibilityTimeout(Duration.seconds(60));
58
+ *
59
+ * // Use standalone:
60
+ * const result = orders.build(stack, "Orders");
61
+ *
62
+ * // Or compose into a system:
63
+ * const system = compose(
64
+ * { orders, alerts: createTopicBuilder() },
65
+ * { orders: [], alerts: [] },
66
+ * );
67
+ * ```
68
+ */
69
+ function createQueueBuilder() {
70
+ return (0, cloudformation_1.taggedBuilder)(QueueBuilder);
71
+ }
72
+ /**
73
+ * Annotates `scope` with a non-fatal warning when a redrive policy is
74
+ * configured with `maxReceiveCount` below the AWS-recommended floor
75
+ * of {@link RECOMMENDED_MIN_MAX_RECEIVE_COUNT}.
76
+ *
77
+ * The builder owns the redrive policy directly, so this is a true
78
+ * check rather than a contextual reminder — the actual configured
79
+ * value is compared. Short-circuits on unresolved tokens so stacks
80
+ * that thread `maxReceiveCount` through CFN parameters aren't spammed.
81
+ */
82
+ function warnIfLowMaxReceiveCount(scope, id, props) {
83
+ const dlq = props.deadLetterQueue;
84
+ if (!dlq)
85
+ return;
86
+ const maxReceiveCount = dlq.maxReceiveCount;
87
+ if (aws_cdk_lib_1.Token.isUnresolved(maxReceiveCount))
88
+ return;
89
+ if (maxReceiveCount >= RECOMMENDED_MIN_MAX_RECEIVE_COUNT)
90
+ return;
91
+ aws_cdk_lib_1.Annotations.of(scope).addWarningV2("@composurecdk/sqs:redrive-low-max-receive-count", `QueueBuilder "${id}": redrive policy maxReceiveCount is ${String(maxReceiveCount)}; ` +
92
+ `AWS recommends >= ${String(RECOMMENDED_MIN_MAX_RECEIVE_COUNT)} so the consumer ` +
93
+ `has room to retry before messages hit the dead-letter queue. ` +
94
+ `See https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html`);
95
+ }
96
+ //# sourceMappingURL=queue-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-builder.js","sourceRoot":"","sources":["../../src/queue-builder.ts"],"names":[],"mappings":";;AA0JA,gDAEC;AA5JD,6CAAiD;AAEjD,iDAA0E;AAE1E,6CAAgE;AAChE,iEAAkF;AAClF,yDAAkE;AAElE,uDAAsD;AACtD,+CAA+C;AAE/C;;;;;;;;GAQG;AACH,MAAM,iCAAiC,GAAG,CAAC,CAAC;AA0E5C,MAAM,YAAY;IAChB,KAAK,GAA+B,EAAE,CAAC;IAC9B,aAAa,GAAqC,EAAE,CAAC;IAE9D,QAAQ,CACN,GAAW,EACX,SAAoF;QAEpF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,mCAAsB,CAAS,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,CAAC,iBAAU,CAAC,CAAC,MAAoB;QAC/B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,KAAiB,EAAE,EAAU;QACjC,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAErE,MAAM,WAAW,GAAG;YAClB,GAAG,4BAAc;YACjB,GAAG,UAAU;SACO,CAAC;QAEvB,wBAAwB,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAEjD,MAAM,KAAK,GAAG,IAAI,eAAK,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,IAAA,mCAAiB,EAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAEpF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,SAAgB,kBAAkB;IAChC,OAAO,IAAA,8BAAa,EAAkC,YAAY,CAAC,CAAC;AACtE,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,wBAAwB,CAC/B,KAAiB,EACjB,EAAU,EACV,KAAiC;IAEjC,MAAM,GAAG,GAAG,KAAK,CAAC,eAAe,CAAC;IAClC,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,MAAM,eAAe,GAAG,GAAG,CAAC,eAAe,CAAC;IAC5C,IAAI,mBAAK,CAAC,YAAY,CAAC,eAAe,CAAC;QAAE,OAAO;IAChD,IAAI,eAAe,IAAI,iCAAiC;QAAE,OAAO;IACjE,yBAAW,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,YAAY,CAChC,iDAAiD,EACjD,iBAAiB,EAAE,wCAAwC,MAAM,CAAC,eAAe,CAAC,IAAI;QACpF,qBAAqB,MAAM,CAAC,iCAAiC,CAAC,mBAAmB;QACjF,+DAA+D;QAC/D,gEAAgE,CACnE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type QueueProps } from "aws-cdk-lib/aws-sqs";
2
+ /**
3
+ * Secure, AWS-recommended defaults applied to every SQS queue built
4
+ * with {@link createQueueBuilder}. Each property can be individually
5
+ * overridden via the builder's fluent API.
6
+ */
7
+ export declare const QUEUE_DEFAULTS: Partial<QueueProps>;
8
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEvE;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,UAAU,CA4B9C,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,eAAe,EAAmB,MAAM,qBAAqB,CAAC;AAEvE;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAwB;IACjD;;;;;OAKG;IACH,UAAU,EAAE,IAAI;IAEhB;;;;;;;;OAQG;IACH,UAAU,EAAE,eAAe,CAAC,WAAW;IAEvC;;;;;;OAMG;IACH,sBAAsB,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;CAC7C,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { createQueueBuilder, type IQueueBuilder, type QueueBuilderProps, type QueueBuilderResult, } from "./queue-builder.js";
2
+ export { QUEUE_DEFAULTS } from "./defaults.js";
3
+ export { type QueueAlarmConfig } from "./queue-alarm-config.js";
4
+ export { QUEUE_ALARM_DEFAULTS } from "./queue-alarm-defaults.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAInB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
@@ -0,0 +1,46 @@
1
+ import type { AlarmConfig } from "@composurecdk/cloudwatch";
2
+ /**
3
+ * Controls which recommended alarms are created for an SQS queue.
4
+ * All applicable alarms are enabled by default with AWS-recommended thresholds.
5
+ * Set individual alarms to `false` to disable them, or provide an
6
+ * {@link AlarmConfig} to tune thresholds.
7
+ *
8
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#SQS
9
+ */
10
+ export interface QueueAlarmConfig {
11
+ /**
12
+ * Master switch: set to `false` to disable all recommended alarms.
13
+ * Individual alarms can also be disabled via their own entry.
14
+ * @default true
15
+ */
16
+ enabled?: boolean;
17
+ /**
18
+ * Alarm when the oldest unprocessed message in the queue has been
19
+ * waiting longer than the configured threshold. Primary signal that
20
+ * consumers are falling behind.
21
+ *
22
+ * Metric: `AWS/SQS ApproximateAgeOfOldestMessage`, statistic Maximum,
23
+ * period 1 minute.
24
+ * Default threshold: > 300 seconds (5 minutes).
25
+ *
26
+ * The default is conservative and should be tuned to the queue's
27
+ * SLA and `retentionPeriod`.
28
+ *
29
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#SQS
30
+ */
31
+ approximateAgeOfOldestMessage?: AlarmConfig | false;
32
+ /**
33
+ * Alarm when the number of in-flight (received but not yet deleted)
34
+ * messages approaches the SQS quota of 120,000 per queue. A breach
35
+ * means new messages will start being rejected.
36
+ *
37
+ * Metric: `AWS/SQS ApproximateNumberOfMessagesNotVisible`, statistic
38
+ * Maximum, period 1 minute.
39
+ * Default threshold: > 90,000 (75% of the in-flight quota).
40
+ *
41
+ * @see https://docs.aws.amazon.com/AmazonSQS/latest/SQSDeveloperGuide/quotas-messages.html#quotas-in-flight
42
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#SQS
43
+ */
44
+ approximateNumberOfMessagesNotVisible?: AlarmConfig | false;
45
+ }
46
+ //# sourceMappingURL=queue-alarm-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-alarm-config.d.ts","sourceRoot":"","sources":["../../src/queue-alarm-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;;;;;;OAaG;IACH,6BAA6B,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAEpD;;;;;;;;;;;OAWG;IACH,qCAAqC,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;CAC7D"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-alarm-config.js","sourceRoot":"","sources":["../../src/queue-alarm-config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import type { AlarmConfigDefaults } from "@composurecdk/cloudwatch";
2
+ interface QueueAlarmDefaults {
3
+ enabled: true;
4
+ approximateAgeOfOldestMessage: AlarmConfigDefaults;
5
+ approximateNumberOfMessagesNotVisible: AlarmConfigDefaults;
6
+ }
7
+ /**
8
+ * AWS-recommended default alarm configuration for SQS queues.
9
+ *
10
+ * Tuned for primary (consumer-fed) queues. Dead-letter queues need
11
+ * different thresholds — any message on a DLQ is itself an alert,
12
+ * whereas a primary queue with messages is normal.
13
+ *
14
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#SQS
15
+ */
16
+ export declare const QUEUE_ALARM_DEFAULTS: QueueAlarmDefaults;
17
+ export {};
18
+ //# sourceMappingURL=queue-alarm-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-alarm-defaults.d.ts","sourceRoot":"","sources":["../../src/queue-alarm-defaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,UAAU,kBAAkB;IAC1B,OAAO,EAAE,IAAI,CAAC;IACd,6BAA6B,EAAE,mBAAmB,CAAC;IACnD,qCAAqC,EAAE,mBAAmB,CAAC;CAC5D;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAAE,kBA2BlC,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-alarm-defaults.js","sourceRoot":"","sources":["../../src/queue-alarm-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAS9D;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAuB;IACtD,OAAO,EAAE,IAAI;IAEb;;;;OAIG;IACH,6BAA6B,EAAE;QAC7B,SAAS,EAAE,GAAG;QACd,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;KACjD;IAED;;;;;OAKG;IACH,qCAAqC,EAAE;QACrC,SAAS,EAAE,MAAM;QACjB,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;KACjD;CACF,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { type Alarm } from "aws-cdk-lib/aws-cloudwatch";
2
+ import type { IQueue } from "aws-cdk-lib/aws-sqs";
3
+ import type { IConstruct } from "constructs";
4
+ import type { AlarmDefinition } from "@composurecdk/cloudwatch";
5
+ import { AlarmDefinitionBuilder } from "@composurecdk/cloudwatch";
6
+ import type { QueueAlarmConfig } from "./queue-alarm-config.js";
7
+ /**
8
+ * Resolves the recommended alarm configuration into fully-resolved
9
+ * {@link AlarmDefinition}s for an SQS queue.
10
+ */
11
+ export declare function resolveQueueAlarmDefinitions(queue: IQueue, config: QueueAlarmConfig | undefined): AlarmDefinition[];
12
+ /**
13
+ * Creates AWS-recommended CloudWatch alarms for an SQS queue, merging
14
+ * recommended definitions with any custom alarm builders.
15
+ *
16
+ * @param scope - CDK construct scope for creating alarm constructs.
17
+ * @param id - Base identifier for alarm construct ids.
18
+ * @param queue - The SQS queue to create alarms for.
19
+ * @param config - User-provided alarm configuration, or `false` to disable all.
20
+ * @param customAlarms - Custom alarm builders added via `addAlarm()`.
21
+ * @returns A record mapping alarm keys to their created Alarm constructs.
22
+ *
23
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#SQS
24
+ */
25
+ export declare function createQueueAlarms(scope: IConstruct, id: string, queue: IQueue, config: QueueAlarmConfig | false | undefined, customAlarms?: AlarmDefinitionBuilder<IQueue>[]): Record<string, Alarm>;
26
+ //# sourceMappingURL=queue-alarms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-alarms.d.ts","sourceRoot":"","sources":["../../src/queue-alarms.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAsB,MAAM,4BAA4B,CAAC;AAC5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAoC,MAAM,0BAA0B,CAAC;AACpG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAMhE;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,eAAe,EAAE,CA+CnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,gBAAgB,GAAG,KAAK,GAAG,SAAS,EAC5C,YAAY,GAAE,sBAAsB,CAAC,MAAM,CAAC,EAAO,GAClD,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAUvB"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-alarms.js","sourceRoot":"","sources":["../../src/queue-alarms.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAc,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAI5E,OAAO,EAA0B,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEpG,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAC1C,MAAM,mBAAmB,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC;AAE1E;;;GAGG;AACH,MAAM,UAAU,4BAA4B,CAC1C,KAAa,EACb,MAAoC;IAEpC,IAAI,MAAM,EAAE,OAAO,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAEzC,MAAM,WAAW,GAAsB,EAAE,CAAC;IAE1C,IAAI,MAAM,EAAE,6BAA6B,KAAK,KAAK,EAAE,CAAC;QACpD,MAAM,GAAG,GAAG,kBAAkB,CAC5B,MAAM,EAAE,6BAA6B,EACrC,oBAAoB,CAAC,6BAA6B,CACnD,CAAC;QACF,WAAW,CAAC,IAAI,CAAC;YACf,GAAG,EAAE,+BAA+B;YACpC,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE,KAAK,CAAC,mCAAmC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;YAC5E,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,kBAAkB,EAAE,kBAAkB,CAAC,sBAAsB;YAC7D,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,WAAW,EACT,yEAAyE;gBACzE,yDAAyD,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,mBAAmB,GAAG;SACtH,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAM,EAAE,qCAAqC,KAAK,KAAK,EAAE,CAAC;QAC5D,MAAM,GAAG,GAAG,kBAAkB,CAC5B,MAAM,EAAE,qCAAqC,EAC7C,oBAAoB,CAAC,qCAAqC,CAC3D,CAAC;QACF,WAAW,CAAC,IAAI,CAAC;YACf,GAAG,EAAE,uCAAuC;YAC5C,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,MAAM,EAAE,KAAK,CAAC,2CAA2C,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;YACpF,SAAS,EAAE,GAAG,CAAC,SAAS;YACxB,kBAAkB,EAAE,kBAAkB,CAAC,sBAAsB;YAC7D,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;YACxC,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,WAAW,EACT,8EAA8E;gBAC9E,2DAA2D;gBAC3D,gBAAgB,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,mBAAmB,GAAG;SAC/E,CAAC,CAAC;IACL,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAiB,EACjB,EAAU,EACV,KAAa,EACb,MAA4C,EAC5C,eAAiD,EAAE;IAEnD,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,oBAAoB,CAAC,OAAO,CAAC;IAChE,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,MAAM,WAAW,GAAG,4BAA4B,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IAEzD,OAAO,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,GAAG,WAAW,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,111 @@
1
+ import { type Alarm } from "aws-cdk-lib/aws-cloudwatch";
2
+ import { type IQueue, Queue, type QueueProps } from "aws-cdk-lib/aws-sqs";
3
+ import { type IConstruct } from "constructs";
4
+ import { COPY_STATE, type Lifecycle } from "@composurecdk/core";
5
+ import { type ITaggedBuilder } from "@composurecdk/cloudformation";
6
+ import { AlarmDefinitionBuilder } from "@composurecdk/cloudwatch";
7
+ import type { QueueAlarmConfig } from "./queue-alarm-config.js";
8
+ /**
9
+ * Configuration properties for the SQS queue builder.
10
+ *
11
+ * Extends the CDK {@link QueueProps} with additional builder-specific options.
12
+ */
13
+ export interface QueueBuilderProps extends QueueProps {
14
+ /**
15
+ * Configuration for AWS-recommended CloudWatch alarms.
16
+ *
17
+ * By default, the builder creates recommended alarms with sensible
18
+ * thresholds for every applicable metric. Individual alarms can be
19
+ * customized or disabled. Set to `false` to disable all alarms.
20
+ *
21
+ * No alarm actions are configured by default since notification
22
+ * methods are user-specific. Access alarms from the build result
23
+ * or use an `afterBuild` hook to apply actions.
24
+ *
25
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#SQS
26
+ */
27
+ recommendedAlarms?: QueueAlarmConfig | false;
28
+ }
29
+ /**
30
+ * The build output of an {@link IQueueBuilder}. Contains the CDK constructs
31
+ * created during {@link Lifecycle.build}, keyed by role.
32
+ */
33
+ export interface QueueBuilderResult {
34
+ /** The SQS queue construct created by the builder. */
35
+ queue: Queue;
36
+ /**
37
+ * CloudWatch alarms created for the queue, keyed by alarm name.
38
+ *
39
+ * Includes both AWS-recommended alarms and any custom alarms added
40
+ * via {@link IQueueBuilder.addAlarm}. Access individual alarms
41
+ * by key (e.g., `result.alarms.approximateAgeOfOldestMessage`).
42
+ *
43
+ * No alarm actions are configured — apply them via the result or an
44
+ * `afterBuild` hook.
45
+ *
46
+ * @see https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Best_Practice_Recommended_Alarms_AWS_Services.html#SQS
47
+ */
48
+ alarms: Record<string, Alarm>;
49
+ }
50
+ /**
51
+ * A fluent builder for configuring and creating an AWS SQS queue.
52
+ *
53
+ * Each configuration property from the CDK {@link QueueProps} is exposed
54
+ * as an overloaded method: call with a value to set it (returns the builder
55
+ * for chaining), or call with no arguments to read the current value.
56
+ *
57
+ * The builder implements {@link Lifecycle}, so it can be used directly as a
58
+ * component in a {@link compose | composed system}. When built, it creates
59
+ * an SQS queue with the configured properties and returns a
60
+ * {@link QueueBuilderResult}.
61
+ *
62
+ * The builder also creates AWS-recommended CloudWatch alarms by default.
63
+ * Alarms can be customized or disabled via the `recommendedAlarms` property.
64
+ * Custom alarms can be added via the {@link addAlarm} method.
65
+ *
66
+ * @see https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_sqs.Queue.html
67
+ *
68
+ * @example
69
+ * ```ts
70
+ * const orders = createQueueBuilder()
71
+ * .queueName("orders")
72
+ * .visibilityTimeout(Duration.seconds(60));
73
+ * ```
74
+ */
75
+ export type IQueueBuilder = ITaggedBuilder<QueueBuilderProps, QueueBuilder>;
76
+ declare class QueueBuilder implements Lifecycle<QueueBuilderResult> {
77
+ #private;
78
+ props: Partial<QueueBuilderProps>;
79
+ addAlarm(key: string, configure: (alarm: AlarmDefinitionBuilder<IQueue>) => AlarmDefinitionBuilder<IQueue>): this;
80
+ /** @internal — see ADR-0005. */
81
+ [COPY_STATE](target: QueueBuilder): void;
82
+ build(scope: IConstruct, id: string): QueueBuilderResult;
83
+ }
84
+ /**
85
+ * Creates a new {@link IQueueBuilder} for configuring an AWS SQS queue.
86
+ *
87
+ * This is the entry point for defining an SQS queue component. The returned
88
+ * builder exposes every {@link QueueBuilderProps} property as a fluent setter/getter
89
+ * and implements {@link Lifecycle} for use with {@link compose}.
90
+ *
91
+ * @returns A fluent builder for an AWS SQS queue.
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * const orders = createQueueBuilder()
96
+ * .queueName("orders")
97
+ * .visibilityTimeout(Duration.seconds(60));
98
+ *
99
+ * // Use standalone:
100
+ * const result = orders.build(stack, "Orders");
101
+ *
102
+ * // Or compose into a system:
103
+ * const system = compose(
104
+ * { orders, alerts: createTopicBuilder() },
105
+ * { orders: [], alerts: [] },
106
+ * );
107
+ * ```
108
+ */
109
+ export declare function createQueueBuilder(): IQueueBuilder;
110
+ export {};
111
+ //# sourceMappingURL=queue-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-builder.d.ts","sourceRoot":"","sources":["../../src/queue-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAehE;;;;GAIG;AACH,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,gBAAgB,GAAG,KAAK,CAAC;CAC9C;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,sDAAsD;IACtD,KAAK,EAAE,KAAK,CAAC;IAEb;;;;;;;;;;;OAWG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;AAE5E,cAAM,YAAa,YAAW,SAAS,CAAC,kBAAkB,CAAC;;IACzD,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAM;IAGvC,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,KAAK,EAAE,sBAAsB,CAAC,MAAM,CAAC,KAAK,sBAAsB,CAAC,MAAM,CAAC,GACnF,IAAI;IAKP,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAIxC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,kBAAkB;CAgBzD;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,IAAI,aAAa,CAElD"}
@@ -1,9 +1,20 @@
1
+ import { Annotations, Token } from "aws-cdk-lib";
1
2
  import { Queue } from "aws-cdk-lib/aws-sqs";
2
3
  import { COPY_STATE } from "@composurecdk/core";
3
4
  import { taggedBuilder } from "@composurecdk/cloudformation";
4
5
  import { AlarmDefinitionBuilder } from "@composurecdk/cloudwatch";
5
6
  import { createQueueAlarms } from "./queue-alarms.js";
6
7
  import { QUEUE_DEFAULTS } from "./defaults.js";
8
+ /**
9
+ * AWS-recommended minimum for `maxReceiveCount` on an SQS redrive
10
+ * policy. A consumer needs a few retries before SQS gives up and
11
+ * forwards the message to the dead-letter queue; anything below this
12
+ * tends to surface as a flood of "poison" messages from transient
13
+ * errors that would have succeeded on retry.
14
+ *
15
+ * @see https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html
16
+ */
17
+ const RECOMMENDED_MIN_MAX_RECEIVE_COUNT = 5;
7
18
  class QueueBuilder {
8
19
  props = {};
9
20
  #customAlarms = [];
@@ -21,6 +32,7 @@ class QueueBuilder {
21
32
  ...QUEUE_DEFAULTS,
22
33
  ...queueProps,
23
34
  };
35
+ warnIfLowMaxReceiveCount(scope, id, mergedProps);
24
36
  const queue = new Queue(scope, id, mergedProps);
25
37
  const alarms = createQueueAlarms(scope, id, queue, alarmConfig, this.#customAlarms);
26
38
  return { queue, alarms };
@@ -54,4 +66,28 @@ class QueueBuilder {
54
66
  export function createQueueBuilder() {
55
67
  return taggedBuilder(QueueBuilder);
56
68
  }
69
+ /**
70
+ * Annotates `scope` with a non-fatal warning when a redrive policy is
71
+ * configured with `maxReceiveCount` below the AWS-recommended floor
72
+ * of {@link RECOMMENDED_MIN_MAX_RECEIVE_COUNT}.
73
+ *
74
+ * The builder owns the redrive policy directly, so this is a true
75
+ * check rather than a contextual reminder — the actual configured
76
+ * value is compared. Short-circuits on unresolved tokens so stacks
77
+ * that thread `maxReceiveCount` through CFN parameters aren't spammed.
78
+ */
79
+ function warnIfLowMaxReceiveCount(scope, id, props) {
80
+ const dlq = props.deadLetterQueue;
81
+ if (!dlq)
82
+ return;
83
+ const maxReceiveCount = dlq.maxReceiveCount;
84
+ if (Token.isUnresolved(maxReceiveCount))
85
+ return;
86
+ if (maxReceiveCount >= RECOMMENDED_MIN_MAX_RECEIVE_COUNT)
87
+ return;
88
+ Annotations.of(scope).addWarningV2("@composurecdk/sqs:redrive-low-max-receive-count", `QueueBuilder "${id}": redrive policy maxReceiveCount is ${String(maxReceiveCount)}; ` +
89
+ `AWS recommends >= ${String(RECOMMENDED_MIN_MAX_RECEIVE_COUNT)} so the consumer ` +
90
+ `has room to retry before messages hit the dead-letter queue. ` +
91
+ `See https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html`);
92
+ }
57
93
  //# sourceMappingURL=queue-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-builder.js","sourceRoot":"","sources":["../../src/queue-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAe,KAAK,EAAmB,MAAM,qBAAqB,CAAC;AAE1E,OAAO,EAAE,UAAU,EAAkB,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAuB,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C;;;;;;;;GAQG;AACH,MAAM,iCAAiC,GAAG,CAAC,CAAC;AA0E5C,MAAM,YAAY;IAChB,KAAK,GAA+B,EAAE,CAAC;IAC9B,aAAa,GAAqC,EAAE,CAAC;IAE9D,QAAQ,CACN,GAAW,EACX,SAAoF;QAEpF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAS,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAoB;QAC/B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,KAAiB,EAAE,EAAU;QACjC,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAErE,MAAM,WAAW,GAAG;YAClB,GAAG,cAAc;YACjB,GAAG,UAAU;SACO,CAAC;QAEvB,wBAAwB,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAEjD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAEpF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,aAAa,CAAkC,YAAY,CAAC,CAAC;AACtE,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,wBAAwB,CAC/B,KAAiB,EACjB,EAAU,EACV,KAAiC;IAEjC,MAAM,GAAG,GAAG,KAAK,CAAC,eAAe,CAAC;IAClC,IAAI,CAAC,GAAG;QAAE,OAAO;IACjB,MAAM,eAAe,GAAG,GAAG,CAAC,eAAe,CAAC;IAC5C,IAAI,KAAK,CAAC,YAAY,CAAC,eAAe,CAAC;QAAE,OAAO;IAChD,IAAI,eAAe,IAAI,iCAAiC;QAAE,OAAO;IACjE,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,YAAY,CAChC,iDAAiD,EACjD,iBAAiB,EAAE,wCAAwC,MAAM,CAAC,eAAe,CAAC,IAAI;QACpF,qBAAqB,MAAM,CAAC,iCAAiC,CAAC,mBAAmB;QACjF,+DAA+D;QAC/D,gEAAgE,CACnE,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -1,29 +1,22 @@
1
1
  {
2
2
  "name": "@composurecdk/sqs",
3
- "version": "0.7.0",
3
+ "version": "0.8.1",
4
4
  "description": "Composable SQS queue builder with well-architected defaults",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/laazyj/composureCDK",
8
8
  "directory": "packages/sqs"
9
9
  },
10
- "main": "./dist/index.js",
11
- "types": "./dist/index.d.ts",
12
- "exports": {
13
- ".": {
14
- "import": "./dist/index.js",
15
- "types": "./dist/index.d.ts"
16
- }
17
- },
18
10
  "files": [
19
11
  "dist",
20
12
  "README.md",
21
13
  "LICENSE"
22
14
  ],
23
15
  "scripts": {
24
- "clean": "rm -rf dist",
25
- "build": "tsc -p tsconfig.build.json",
16
+ "clean": "rm -rf dist .tshy .tshy-build",
17
+ "build": "tshy",
26
18
  "typecheck": "tsc --noEmit",
19
+ "check:exports": "attw --pack . --profile node16 && publint",
27
20
  "test": "vitest run",
28
21
  "test:watch": "vitest"
29
22
  },
@@ -34,18 +27,43 @@
34
27
  "access": "public"
35
28
  },
36
29
  "type": "module",
30
+ "engines": {
31
+ "node": ">=20"
32
+ },
33
+ "tshy": {
34
+ "exports": {
35
+ "./package.json": "./package.json",
36
+ ".": "./src/index.ts"
37
+ }
38
+ },
37
39
  "peerDependencies": {
38
- "@composurecdk/cloudformation": "^0.7.0",
39
- "@composurecdk/cloudwatch": "^0.7.0",
40
- "@composurecdk/core": "^0.7.0",
40
+ "@composurecdk/cloudformation": "^0.8.0",
41
+ "@composurecdk/cloudwatch": "^0.8.0",
42
+ "@composurecdk/core": "^0.8.0",
41
43
  "aws-cdk-lib": "^2.0.0",
42
44
  "constructs": "^10.0.0"
43
45
  },
44
46
  "devDependencies": {
45
- "@types/node": "^25.6.2",
46
- "aws-cdk-lib": "^2.253.1",
47
+ "@types/node": "^25.9.1",
48
+ "aws-cdk-lib": "^2.257.0",
47
49
  "constructs": "^10.6.0",
48
50
  "typescript": "^6.0.3",
49
- "vitest": "^4.1.4"
50
- }
51
+ "vitest": "^4.1.7"
52
+ },
53
+ "exports": {
54
+ "./package.json": "./package.json",
55
+ ".": {
56
+ "import": {
57
+ "types": "./dist/esm/index.d.ts",
58
+ "default": "./dist/esm/index.js"
59
+ },
60
+ "require": {
61
+ "types": "./dist/commonjs/index.d.ts",
62
+ "default": "./dist/commonjs/index.js"
63
+ }
64
+ }
65
+ },
66
+ "main": "./dist/commonjs/index.js",
67
+ "types": "./dist/commonjs/index.d.ts",
68
+ "module": "./dist/esm/index.js"
51
69
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEvE;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,UAAU,CA4B9C,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,eAAe,EAAmB,MAAM,qBAAqB,CAAC;AAEvE;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAwB;IACjD;;;;;OAKG;IACH,UAAU,EAAE,IAAI;IAEhB;;;;;;;;OAQG;IACH,UAAU,EAAE,eAAe,CAAC,WAAW;IAEvC;;;;;;OAMG;IACH,sBAAsB,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;CAC7C,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,GACxB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAInB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue-alarm-config.d.ts","sourceRoot":"","sources":["../src/queue-alarm-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;;;;;;OAaG;IACH,6BAA6B,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;IAEpD;;;;;;;;;;;OAWG;IACH,qCAAqC,CAAC,EAAE,WAAW,GAAG,KAAK,CAAC;CAC7D"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue-alarm-config.js","sourceRoot":"","sources":["../src/queue-alarm-config.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue-alarm-defaults.d.ts","sourceRoot":"","sources":["../src/queue-alarm-defaults.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,UAAU,kBAAkB;IAC1B,OAAO,EAAE,IAAI,CAAC;IACd,6BAA6B,EAAE,mBAAmB,CAAC;IACnD,qCAAqC,EAAE,mBAAmB,CAAC;CAC5D;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,oBAAoB,EAAE,kBA2BlC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue-alarm-defaults.js","sourceRoot":"","sources":["../src/queue-alarm-defaults.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAS9D;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAuB;IACtD,OAAO,EAAE,IAAI;IAEb;;;;OAIG;IACH,6BAA6B,EAAE;QAC7B,SAAS,EAAE,GAAG;QACd,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;KACjD;IAED;;;;;OAKG;IACH,qCAAqC,EAAE;QACrC,SAAS,EAAE,MAAM;QACjB,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,CAAC;QACpB,gBAAgB,EAAE,gBAAgB,CAAC,aAAa;KACjD;CACF,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue-alarms.d.ts","sourceRoot":"","sources":["../src/queue-alarms.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,KAAK,EAAsB,MAAM,4BAA4B,CAAC;AAC5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAoC,MAAM,0BAA0B,CAAC;AACpG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAMhE;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,eAAe,EAAE,CA+CnB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,UAAU,EACjB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,gBAAgB,GAAG,KAAK,GAAG,SAAS,EAC5C,YAAY,GAAE,sBAAsB,CAAC,MAAM,CAAC,EAAO,GAClD,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAUvB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue-alarms.js","sourceRoot":"","sources":["../src/queue-alarms.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue-builder.d.ts","sourceRoot":"","sources":["../src/queue-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,KAAK,cAAc,EAAiB,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE;;;;GAIG;AACH,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,gBAAgB,GAAG,KAAK,CAAC;CAC9C;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,sDAAsD;IACtD,KAAK,EAAE,KAAK,CAAC;IAEb;;;;;;;;;;;OAWG;IACH,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,iBAAiB,EAAE,YAAY,CAAC,CAAC;AAE5E,cAAM,YAAa,YAAW,SAAS,CAAC,kBAAkB,CAAC;;IACzD,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAM;IAGvC,QAAQ,CACN,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,CAAC,KAAK,EAAE,sBAAsB,CAAC,MAAM,CAAC,KAAK,sBAAsB,CAAC,MAAM,CAAC,GACnF,IAAI;IAKP,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAIxC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,kBAAkB;CAczD;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,kBAAkB,IAAI,aAAa,CAElD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"queue-builder.js","sourceRoot":"","sources":["../src/queue-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,EAAmB,MAAM,qBAAqB,CAAC;AAE1E,OAAO,EAAE,UAAU,EAAkB,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAuB,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AA0E/C,MAAM,YAAY;IAChB,KAAK,GAA+B,EAAE,CAAC;IAC9B,aAAa,GAAqC,EAAE,CAAC;IAE9D,QAAQ,CACN,GAAW,EACX,SAAoF;QAEpF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,sBAAsB,CAAS,GAAG,CAAC,CAAC,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,CAAC,UAAU,CAAC,CAAC,MAAoB;QAC/B,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,KAAiB,EAAE,EAAU;QACjC,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAErE,MAAM,WAAW,GAAG;YAClB,GAAG,cAAc;YACjB,GAAG,UAAU;SACO,CAAC;QAEvB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAEhD,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QAEpF,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC3B,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,aAAa,CAAkC,YAAY,CAAC,CAAC;AACtE,CAAC"}
File without changes
File without changes
File without changes
File without changes
File without changes