@relkit/cloud-aws 0.0.0

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 (155) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/dist/components/RelkitApplicationService/container.d.ts +4 -0
  4. package/dist/components/RelkitApplicationService/container.d.ts.map +1 -0
  5. package/dist/components/RelkitApplicationService/container.js +64 -0
  6. package/dist/components/RelkitApplicationService/container.js.map +1 -0
  7. package/dist/components/RelkitApplicationService/foundation.d.ts +11 -0
  8. package/dist/components/RelkitApplicationService/foundation.d.ts.map +1 -0
  9. package/dist/components/RelkitApplicationService/foundation.js +44 -0
  10. package/dist/components/RelkitApplicationService/foundation.js.map +1 -0
  11. package/dist/components/RelkitApplicationService/index.d.ts +22 -0
  12. package/dist/components/RelkitApplicationService/index.d.ts.map +1 -0
  13. package/dist/components/RelkitApplicationService/index.js +147 -0
  14. package/dist/components/RelkitApplicationService/index.js.map +1 -0
  15. package/dist/components/RelkitApplicationService/types.d.ts +30 -0
  16. package/dist/components/RelkitApplicationService/types.d.ts.map +1 -0
  17. package/dist/components/RelkitApplicationService/types.js +2 -0
  18. package/dist/components/RelkitApplicationService/types.js.map +1 -0
  19. package/dist/components/RelkitBuckets/index.d.ts +11 -0
  20. package/dist/components/RelkitBuckets/index.d.ts.map +1 -0
  21. package/dist/components/RelkitBuckets/index.js +48 -0
  22. package/dist/components/RelkitBuckets/index.js.map +1 -0
  23. package/dist/components/RelkitBuckets/types.d.ts +23 -0
  24. package/dist/components/RelkitBuckets/types.d.ts.map +1 -0
  25. package/dist/components/RelkitBuckets/types.js +2 -0
  26. package/dist/components/RelkitBuckets/types.js.map +1 -0
  27. package/dist/components/RelkitBuckets/validation.d.ts +10 -0
  28. package/dist/components/RelkitBuckets/validation.d.ts.map +1 -0
  29. package/dist/components/RelkitBuckets/validation.js +22 -0
  30. package/dist/components/RelkitBuckets/validation.js.map +1 -0
  31. package/dist/components/RelkitCaches/client.d.ts +20 -0
  32. package/dist/components/RelkitCaches/client.d.ts.map +1 -0
  33. package/dist/components/RelkitCaches/client.js +42 -0
  34. package/dist/components/RelkitCaches/client.js.map +1 -0
  35. package/dist/components/RelkitCaches/index.d.ts +12 -0
  36. package/dist/components/RelkitCaches/index.d.ts.map +1 -0
  37. package/dist/components/RelkitCaches/index.js +71 -0
  38. package/dist/components/RelkitCaches/index.js.map +1 -0
  39. package/dist/components/RelkitCaches/types.d.ts +31 -0
  40. package/dist/components/RelkitCaches/types.d.ts.map +1 -0
  41. package/dist/components/RelkitCaches/types.js +2 -0
  42. package/dist/components/RelkitCaches/types.js.map +1 -0
  43. package/dist/components/RelkitCaches/validation.d.ts +11 -0
  44. package/dist/components/RelkitCaches/validation.d.ts.map +1 -0
  45. package/dist/components/RelkitCaches/validation.js +34 -0
  46. package/dist/components/RelkitCaches/validation.js.map +1 -0
  47. package/dist/components/RelkitContainerRegistry/index.d.ts +19 -0
  48. package/dist/components/RelkitContainerRegistry/index.d.ts.map +1 -0
  49. package/dist/components/RelkitContainerRegistry/index.js +29 -0
  50. package/dist/components/RelkitContainerRegistry/index.js.map +1 -0
  51. package/dist/components/RelkitEventBus/index.d.ts +24 -0
  52. package/dist/components/RelkitEventBus/index.d.ts.map +1 -0
  53. package/dist/components/RelkitEventBus/index.js +71 -0
  54. package/dist/components/RelkitEventBus/index.js.map +1 -0
  55. package/dist/components/RelkitEventBus/names.d.ts +2 -0
  56. package/dist/components/RelkitEventBus/names.d.ts.map +1 -0
  57. package/dist/components/RelkitEventBus/names.js +9 -0
  58. package/dist/components/RelkitEventBus/names.js.map +1 -0
  59. package/dist/components/RelkitEventBus/policies.d.ts +7 -0
  60. package/dist/components/RelkitEventBus/policies.d.ts.map +1 -0
  61. package/dist/components/RelkitEventBus/policies.js +59 -0
  62. package/dist/components/RelkitEventBus/policies.js.map +1 -0
  63. package/dist/components/RelkitEventBus/resources.d.ts +5 -0
  64. package/dist/components/RelkitEventBus/resources.d.ts.map +1 -0
  65. package/dist/components/RelkitEventBus/resources.js +120 -0
  66. package/dist/components/RelkitEventBus/resources.js.map +1 -0
  67. package/dist/components/RelkitEventBus/types.d.ts +76 -0
  68. package/dist/components/RelkitEventBus/types.d.ts.map +1 -0
  69. package/dist/components/RelkitEventBus/types.js +2 -0
  70. package/dist/components/RelkitEventBus/types.js.map +1 -0
  71. package/dist/components/RelkitEventBus/validation.d.ts +30 -0
  72. package/dist/components/RelkitEventBus/validation.d.ts.map +1 -0
  73. package/dist/components/RelkitEventBus/validation.js +145 -0
  74. package/dist/components/RelkitEventBus/validation.js.map +1 -0
  75. package/dist/components/RelkitJobQueues/index.d.ts +21 -0
  76. package/dist/components/RelkitJobQueues/index.d.ts.map +1 -0
  77. package/dist/components/RelkitJobQueues/index.js +139 -0
  78. package/dist/components/RelkitJobQueues/index.js.map +1 -0
  79. package/dist/components/RelkitJobQueues/policies.d.ts +8 -0
  80. package/dist/components/RelkitJobQueues/policies.d.ts.map +1 -0
  81. package/dist/components/RelkitJobQueues/policies.js +73 -0
  82. package/dist/components/RelkitJobQueues/policies.js.map +1 -0
  83. package/dist/components/RelkitJobQueues/resources.d.ts +11 -0
  84. package/dist/components/RelkitJobQueues/resources.d.ts.map +1 -0
  85. package/dist/components/RelkitJobQueues/resources.js +64 -0
  86. package/dist/components/RelkitJobQueues/resources.js.map +1 -0
  87. package/dist/components/RelkitJobQueues/types.d.ts +77 -0
  88. package/dist/components/RelkitJobQueues/types.d.ts.map +1 -0
  89. package/dist/components/RelkitJobQueues/types.js +2 -0
  90. package/dist/components/RelkitJobQueues/types.js.map +1 -0
  91. package/dist/components/RelkitJobQueues/validation.d.ts +32 -0
  92. package/dist/components/RelkitJobQueues/validation.d.ts.map +1 -0
  93. package/dist/components/RelkitJobQueues/validation.js +142 -0
  94. package/dist/components/RelkitJobQueues/validation.js.map +1 -0
  95. package/dist/components/RelkitNetwork/index.d.ts +25 -0
  96. package/dist/components/RelkitNetwork/index.d.ts.map +1 -0
  97. package/dist/components/RelkitNetwork/index.js +70 -0
  98. package/dist/components/RelkitNetwork/index.js.map +1 -0
  99. package/dist/components/RelkitObservability/index.d.ts +15 -0
  100. package/dist/components/RelkitObservability/index.d.ts.map +1 -0
  101. package/dist/components/RelkitObservability/index.js +62 -0
  102. package/dist/components/RelkitObservability/index.js.map +1 -0
  103. package/dist/components/RelkitObservability/types.d.ts +25 -0
  104. package/dist/components/RelkitObservability/types.d.ts.map +1 -0
  105. package/dist/components/RelkitObservability/types.js +2 -0
  106. package/dist/components/RelkitObservability/types.js.map +1 -0
  107. package/dist/components/common.d.ts +34 -0
  108. package/dist/components/common.d.ts.map +1 -0
  109. package/dist/components/common.js +109 -0
  110. package/dist/components/common.js.map +1 -0
  111. package/dist/components/index.d.ts +9 -0
  112. package/dist/components/index.d.ts.map +1 -0
  113. package/dist/components/index.js +9 -0
  114. package/dist/components/index.js.map +1 -0
  115. package/dist/index.d.ts +3 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +3 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/runtime/buckets.d.ts +3 -0
  120. package/dist/runtime/buckets.d.ts.map +1 -0
  121. package/dist/runtime/buckets.js +2 -0
  122. package/dist/runtime/buckets.js.map +1 -0
  123. package/dist/runtime/cache.d.ts +3 -0
  124. package/dist/runtime/cache.d.ts.map +1 -0
  125. package/dist/runtime/cache.js +2 -0
  126. package/dist/runtime/cache.js.map +1 -0
  127. package/dist/runtime/config.d.ts +7 -0
  128. package/dist/runtime/config.d.ts.map +1 -0
  129. package/dist/runtime/config.js +10 -0
  130. package/dist/runtime/config.js.map +1 -0
  131. package/dist/runtime/events.d.ts +16 -0
  132. package/dist/runtime/events.d.ts.map +1 -0
  133. package/dist/runtime/events.js +69 -0
  134. package/dist/runtime/events.js.map +1 -0
  135. package/dist/runtime/factory.d.ts +3 -0
  136. package/dist/runtime/factory.d.ts.map +1 -0
  137. package/dist/runtime/factory.js +78 -0
  138. package/dist/runtime/factory.js.map +1 -0
  139. package/dist/runtime/http.d.ts +14 -0
  140. package/dist/runtime/http.d.ts.map +1 -0
  141. package/dist/runtime/http.js +98 -0
  142. package/dist/runtime/http.js.map +1 -0
  143. package/dist/runtime/index.d.ts +8 -0
  144. package/dist/runtime/index.d.ts.map +1 -0
  145. package/dist/runtime/index.js +8 -0
  146. package/dist/runtime/index.js.map +1 -0
  147. package/dist/runtime/jobs.d.ts +15 -0
  148. package/dist/runtime/jobs.d.ts.map +1 -0
  149. package/dist/runtime/jobs.js +133 -0
  150. package/dist/runtime/jobs.js.map +1 -0
  151. package/dist/runtime/observability.d.ts +13 -0
  152. package/dist/runtime/observability.d.ts.map +1 -0
  153. package/dist/runtime/observability.js +16 -0
  154. package/dist/runtime/observability.js.map +1 -0
  155. package/package.json +56 -0
@@ -0,0 +1,120 @@
1
+ import * as aws from "@pulumi/aws";
2
+ import * as pulumi from "@pulumi/pulumi";
3
+ import { childResourceName } from "./names.js";
4
+ import { eventTargetPolicyJson, redriveAllowPolicyJson } from "./policies.js";
5
+ import { eventPattern, } from "./validation.js";
6
+ export function createTriggerResources(componentName, busName, source, retryPolicy, trigger, tags, consumerRoleArn, parent) {
7
+ const queueName = childResourceName(componentName, trigger.id, "queue", 76);
8
+ const deadLetterQueue = new aws.sqs.Queue(`${queueName}-dlq`, {
9
+ name: `${queueName}-dlq`.slice(0, 80),
10
+ messageRetentionSeconds: trigger.deadLetterRetentionSeconds,
11
+ sqsManagedSseEnabled: true,
12
+ tags,
13
+ }, { parent });
14
+ const queue = new aws.sqs.Queue(queueName, {
15
+ name: queueName,
16
+ messageRetentionSeconds: trigger.messageRetentionSeconds,
17
+ receiveWaitTimeSeconds: trigger.workerWaitTimeSeconds,
18
+ visibilityTimeoutSeconds: trigger.visibilityTimeoutSeconds,
19
+ redrivePolicy: pulumi.jsonStringify({
20
+ deadLetterTargetArn: deadLetterQueue.arn,
21
+ maxReceiveCount: trigger.maxReceiveCount,
22
+ }),
23
+ sqsManagedSseEnabled: true,
24
+ tags,
25
+ }, { parent });
26
+ const redriveAllowPolicy = new aws.sqs.RedriveAllowPolicy(`${queueName}-redrive-allow`, {
27
+ queueUrl: deadLetterQueue.url,
28
+ redriveAllowPolicy: redriveAllowPolicyJson(queue.arn),
29
+ }, { parent, dependsOn: [queue] });
30
+ const rules = trigger.expansion.map((event) => new aws.cloudwatch.EventRule(childResourceName(componentName, `${trigger.id}-${event.pair}`, "rule", 64), {
31
+ name: childResourceName(componentName, `${trigger.id}-${event.pair}`, "rule", 64),
32
+ description: `RelKit event trigger ${trigger.id} routes ${event.pair}`,
33
+ eventBusName: busName,
34
+ eventPattern: eventPattern(source, event),
35
+ state: "ENABLED",
36
+ tags,
37
+ }, { parent }));
38
+ const targets = rules.map((rule, index) => new aws.cloudwatch.EventTarget(childResourceName(componentName, `${trigger.id}-${index}`, "target", 64), {
39
+ arn: queue.arn,
40
+ eventBusName: busName,
41
+ rule: rule.name,
42
+ targetId: childResourceName(trigger.id, `${index}`, "target", 64),
43
+ inputTransformer: {
44
+ inputPaths: { envelope: "$.detail" },
45
+ inputTemplate: '{"schemaVersion":1,"envelope":<envelope>}',
46
+ },
47
+ deadLetterConfig: { arn: deadLetterQueue.arn },
48
+ retryPolicy,
49
+ }, { parent, dependsOn: [rule, queue, deadLetterQueue] }));
50
+ const ruleArns = rules.map(({ arn }) => arn);
51
+ const queuePolicy = new aws.sqs.QueuePolicy(`${queueName}-event-policy`, {
52
+ queueUrl: queue.url,
53
+ policy: eventTargetPolicyJson(queue.arn, ruleArns),
54
+ }, { parent, dependsOn: targets });
55
+ const deadLetterQueuePolicy = new aws.sqs.QueuePolicy(`${queueName}-dlq-event-policy`, {
56
+ queueUrl: deadLetterQueue.url,
57
+ policy: eventTargetPolicyJson(deadLetterQueue.arn, ruleArns),
58
+ }, { parent, dependsOn: targets });
59
+ return {
60
+ id: trigger.id,
61
+ targetFunctionId: trigger.targetFunctionId,
62
+ queue,
63
+ deadLetterQueue,
64
+ queuePolicy,
65
+ deadLetterQueuePolicy,
66
+ redriveAllowPolicy,
67
+ rules,
68
+ targets,
69
+ maxReceiveCount: trigger.maxReceiveCount,
70
+ worker: workerConfiguration(trigger, queue, deadLetterQueue, busName, consumerRoleArn),
71
+ };
72
+ }
73
+ function workerConfiguration(trigger, queue, deadLetterQueue, busName, consumerRoleArn) {
74
+ const environment = pulumi
75
+ .all({
76
+ eventBusName: busName,
77
+ consumerRoleArn,
78
+ queueArn: queue.arn,
79
+ queueUrl: queue.url,
80
+ deadLetterQueueArn: deadLetterQueue.arn,
81
+ })
82
+ .apply(({ eventBusName, consumerRoleArn: role, queueArn, queueUrl, deadLetterQueueArn, }) => ({
83
+ RELKIT_EVENT_TRIGGER_ID: trigger.id,
84
+ RELKIT_EVENT_TARGET_FUNCTION_ID: trigger.targetFunctionId,
85
+ RELKIT_EVENT_BUS_NAME: String(eventBusName),
86
+ RELKIT_EVENT_CONSUMER_ROLE_ARN: String(role),
87
+ RELKIT_EVENT_QUEUE_ARN: String(queueArn),
88
+ RELKIT_EVENT_QUEUE_URL: String(queueUrl),
89
+ RELKIT_EVENT_DLQ_ARN: String(deadLetterQueueArn),
90
+ RELKIT_EVENT_BATCH_SIZE: String(trigger.workerBatchSize),
91
+ RELKIT_EVENT_CONCURRENCY: String(trigger.concurrency),
92
+ RELKIT_EVENT_WAIT_TIME_SECONDS: String(trigger.workerWaitTimeSeconds),
93
+ RELKIT_EVENT_VISIBILITY_TIMEOUT_SECONDS: String(trigger.visibilityTimeoutSeconds),
94
+ RELKIT_EVENT_DELIVERY_SEMANTICS: "at-least-once",
95
+ RELKIT_EVENT_ROUTING: "eventId+version",
96
+ RELKIT_EVENT_ENVELOPE_PATH: "$.envelope",
97
+ RELKIT_EVENT_TRACE_PATH: "$.envelope.traceId",
98
+ RELKIT_EVENT_CORRELATION_PATH: "$.envelope.correlationId",
99
+ RELKIT_EVENT_CAUSATION_PATH: "$.envelope.causationInvocationId",
100
+ }));
101
+ return {
102
+ eventTriggerId: trigger.id,
103
+ targetFunctionId: trigger.targetFunctionId,
104
+ queueArn: queue.arn,
105
+ queueUrl: queue.url,
106
+ deadLetterQueueArn: deadLetterQueue.arn,
107
+ expansion: trigger.expansion.map(({ pair }) => pair),
108
+ batchSize: trigger.workerBatchSize,
109
+ concurrency: trigger.concurrency,
110
+ waitTimeSeconds: trigger.workerWaitTimeSeconds,
111
+ visibilityTimeoutSeconds: trigger.visibilityTimeoutSeconds,
112
+ deliverySemantics: "at-least-once",
113
+ envelopePath: "$.envelope",
114
+ tracePath: "$.envelope.traceId",
115
+ correlationPath: "$.envelope.correlationId",
116
+ causationPath: "$.envelope.causationInvocationId",
117
+ environment,
118
+ };
119
+ }
120
+ //# sourceMappingURL=resources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resources.js","sourceRoot":"","sources":["../../../src/components/RelkitEventBus/resources.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type * as aws from "@pulumi/aws";
2
+ import type * as pulumi from "@pulumi/pulumi";
3
+ import type { RelkitComponentArgs } from "../common.js";
4
+ export type RelkitEventRetryJitter = "none" | "full" | "equal";
5
+ export interface RelkitEventRetryPolicy {
6
+ readonly maxAttempts: number;
7
+ readonly initialDelayMs: number;
8
+ readonly maxDelayMs: number;
9
+ readonly multiplier: number;
10
+ readonly jitter: RelkitEventRetryJitter;
11
+ }
12
+ export interface RelkitEventDefinition {
13
+ readonly id: string;
14
+ readonly version: number;
15
+ }
16
+ export interface RelkitEventTriggerDefinition {
17
+ readonly id: string;
18
+ readonly targetFunctionId: string;
19
+ readonly expansion: readonly string[];
20
+ readonly retry?: RelkitEventRetryPolicy;
21
+ readonly timeoutMs?: number;
22
+ readonly concurrency?: number;
23
+ readonly visibilityTimeoutSeconds?: number;
24
+ readonly messageRetentionSeconds?: number;
25
+ readonly deadLetterRetentionSeconds?: number;
26
+ readonly maxReceiveCount?: number;
27
+ readonly workerBatchSize?: number;
28
+ readonly workerWaitTimeSeconds?: number;
29
+ }
30
+ export interface RelkitEventBridgeRetryPolicy {
31
+ readonly maximumRetryAttempts?: number;
32
+ readonly maximumEventAgeInSeconds?: number;
33
+ }
34
+ export interface RelkitEventBusArgs extends RelkitComponentArgs {
35
+ readonly events: readonly RelkitEventDefinition[];
36
+ readonly eventTriggers?: readonly RelkitEventTriggerDefinition[];
37
+ /** Alias accepted for callers that already use the generic trigger term. */
38
+ readonly triggers?: readonly RelkitEventTriggerDefinition[];
39
+ readonly eventBusName?: pulumi.Input<string>;
40
+ readonly eventSource?: string;
41
+ readonly consumerRoleArn?: pulumi.Input<string>;
42
+ readonly workerRoleArn?: pulumi.Input<string>;
43
+ readonly eventBridgeRetryPolicy?: RelkitEventBridgeRetryPolicy;
44
+ }
45
+ export interface RelkitEventWorkerConfiguration {
46
+ readonly eventTriggerId: string;
47
+ readonly targetFunctionId: string;
48
+ readonly queueArn: pulumi.Output<string>;
49
+ readonly queueUrl: pulumi.Output<string>;
50
+ readonly deadLetterQueueArn: pulumi.Output<string>;
51
+ readonly expansion: readonly string[];
52
+ readonly batchSize: number;
53
+ readonly concurrency: number;
54
+ readonly waitTimeSeconds: number;
55
+ readonly visibilityTimeoutSeconds: number;
56
+ readonly deliverySemantics: "at-least-once";
57
+ readonly envelopePath: "$.envelope";
58
+ readonly tracePath: "$.envelope.traceId";
59
+ readonly correlationPath: "$.envelope.correlationId";
60
+ readonly causationPath: "$.envelope.causationInvocationId";
61
+ readonly environment: pulumi.Output<Record<string, string>>;
62
+ }
63
+ export interface RelkitEventTriggerResource {
64
+ readonly id: string;
65
+ readonly targetFunctionId: string;
66
+ readonly queue: aws.sqs.Queue;
67
+ readonly deadLetterQueue: aws.sqs.Queue;
68
+ readonly queuePolicy: aws.sqs.QueuePolicy;
69
+ readonly deadLetterQueuePolicy: aws.sqs.QueuePolicy;
70
+ readonly redriveAllowPolicy: aws.sqs.RedriveAllowPolicy;
71
+ readonly rules: readonly aws.cloudwatch.EventRule[];
72
+ readonly targets: readonly aws.cloudwatch.EventTarget[];
73
+ readonly maxReceiveCount: number;
74
+ readonly worker: RelkitEventWorkerConfiguration;
75
+ }
76
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/RelkitEventBus/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/components/RelkitEventBus/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import type { RelkitEventBusArgs, RelkitEventDefinition, RelkitEventRetryPolicy } from "./types.js";
2
+ export interface NormalizedEvent {
3
+ readonly id: string;
4
+ readonly version: number;
5
+ readonly pair: string;
6
+ }
7
+ export interface NormalizedEventTrigger {
8
+ readonly id: string;
9
+ readonly targetFunctionId: string;
10
+ readonly expansion: readonly NormalizedEvent[];
11
+ readonly retry: RelkitEventRetryPolicy;
12
+ readonly timeoutMs: number;
13
+ readonly concurrency: number;
14
+ readonly visibilityTimeoutSeconds: number;
15
+ readonly messageRetentionSeconds: number;
16
+ readonly deadLetterRetentionSeconds: number;
17
+ readonly maxReceiveCount: number;
18
+ readonly workerBatchSize: number;
19
+ readonly workerWaitTimeSeconds: number;
20
+ }
21
+ export interface NormalizedEventBridgeRetryPolicy {
22
+ readonly maximumRetryAttempts: number;
23
+ readonly maximumEventAgeInSeconds: number;
24
+ }
25
+ export declare function normalizeEvents(events: readonly RelkitEventDefinition[]): NormalizedEvent[];
26
+ export declare function normalizeTriggers(args: RelkitEventBusArgs, events: readonly NormalizedEvent[]): NormalizedEventTrigger[];
27
+ export declare function normalizeEventBridgeRetry(policy: RelkitEventBusArgs["eventBridgeRetryPolicy"]): NormalizedEventBridgeRetryPolicy;
28
+ export declare function normalizeSource(source: string | undefined): string;
29
+ export declare function eventPattern(source: string, event: NormalizedEvent): string;
30
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/components/RelkitEventBus/validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EAEvB,MAAM,YAAY,CAAC;AAkBpB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,SAAS,eAAe,EAAE,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,sBAAsB,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAC1C,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,qBAAqB,EAAE,MAAM,CAAC;CACxC;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,wBAAwB,EAAE,MAAM,CAAC;CAC3C;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,qBAAqB,EAAE,GAAG,eAAe,EAAE,CAW3F;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,kBAAkB,EACxB,MAAM,EAAE,SAAS,eAAe,EAAE,GACjC,sBAAsB,EAAE,CAiE1B;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,kBAAkB,CAAC,wBAAwB,CAAC,GACnD,gCAAgC,CAMlC;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAKlE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAM3E"}
@@ -0,0 +1,145 @@
1
+ import { canonicalJson, normalizeId } from "@relkit/contracts";
2
+ const DEFAULT_TIMEOUT_MS = 30_000;
3
+ const DEFAULT_VISIBILITY_SECONDS = 60;
4
+ const DEFAULT_RETENTION_SECONDS = 345_600;
5
+ const DEFAULT_DLQ_RETENTION_SECONDS = 1_209_600;
6
+ const DEFAULT_BATCH_SIZE = 10;
7
+ const DEFAULT_WAIT_SECONDS = 20;
8
+ const DEFAULT_EVENTBRIDGE_RETRIES = 3;
9
+ const DEFAULT_EVENTBRIDGE_AGE = 86_400;
10
+ const DEFAULT_TRIGGER_RETRY = {
11
+ maxAttempts: 3,
12
+ initialDelayMs: 100,
13
+ maxDelayMs: 30_000,
14
+ multiplier: 2,
15
+ jitter: "none",
16
+ };
17
+ export function normalizeEvents(events) {
18
+ const seen = new Set();
19
+ return events.map((event) => {
20
+ const id = normalizeId(event.id);
21
+ if (!Number.isSafeInteger(event.version) || event.version < 1)
22
+ throw new RangeError(`Event "${id}" version must be a positive integer.`);
23
+ const pair = `${id}@${event.version}`;
24
+ if (seen.has(pair))
25
+ throw new TypeError(`Duplicate AWS event version "${pair}".`);
26
+ seen.add(pair);
27
+ return { id, version: event.version, pair };
28
+ });
29
+ }
30
+ export function normalizeTriggers(args, events) {
31
+ if (args.eventTriggers !== undefined && args.triggers !== undefined)
32
+ throw new TypeError("Specify eventTriggers or triggers, not both.");
33
+ const definitions = args.eventTriggers ?? args.triggers ?? [];
34
+ const known = new Map(events.map((event) => [event.pair, event]));
35
+ const ids = new Set();
36
+ return definitions.map((trigger) => {
37
+ const id = normalizeId(trigger.id);
38
+ if (ids.has(id))
39
+ throw new TypeError(`Duplicate AWS event trigger "${id}".`);
40
+ ids.add(id);
41
+ const expansion = [...new Set(trigger.expansion.map(parsePair))]
42
+ .map((pair) => {
43
+ const event = known.get(pair);
44
+ if (event === undefined)
45
+ throw new TypeError(`AWS event trigger "${id}" references unknown event "${pair}".`);
46
+ return event;
47
+ })
48
+ .sort((left, right) => left.pair.localeCompare(right.pair));
49
+ if (expansion.length === 0)
50
+ throw new TypeError(`AWS event trigger "${id}" must route at least one event version.`);
51
+ const retry = trigger.retry ?? DEFAULT_TRIGGER_RETRY;
52
+ validateRetry(retry, id);
53
+ if (retry.maxAttempts > 1000)
54
+ throw new RangeError(`Event trigger "${id}" retry.maxAttempts cannot exceed 1000.`);
55
+ const timeoutMs = trigger.timeoutMs ?? DEFAULT_TIMEOUT_MS;
56
+ positive(timeoutMs, `Event trigger "${id}" timeoutMs`);
57
+ const requiredVisibility = Math.ceil(timeoutMs / 1000);
58
+ const visibility = trigger.visibilityTimeoutSeconds ?? Math.max(DEFAULT_VISIBILITY_SECONDS, requiredVisibility);
59
+ range(visibility, 0, 43_200, `Event trigger "${id}" visibilityTimeoutSeconds`);
60
+ if (visibility < requiredVisibility)
61
+ throw new RangeError(`Event trigger "${id}" visibilityTimeoutSeconds must cover timeoutMs.`);
62
+ const retention = trigger.messageRetentionSeconds ?? DEFAULT_RETENTION_SECONDS;
63
+ const dlqRetention = trigger.deadLetterRetentionSeconds ?? DEFAULT_DLQ_RETENTION_SECONDS;
64
+ range(retention, 60, 1_209_600, `Event trigger "${id}" messageRetentionSeconds`);
65
+ range(dlqRetention, 60, 1_209_600, `Event trigger "${id}" deadLetterRetentionSeconds`);
66
+ if (dlqRetention < retention)
67
+ throw new RangeError(`Event trigger "${id}" dead-letter retention must cover source retention.`);
68
+ const maxReceiveCount = trigger.maxReceiveCount ?? retry.maxAttempts;
69
+ range(maxReceiveCount, 1, 1000, `Event trigger "${id}" maxReceiveCount`);
70
+ if (maxReceiveCount !== retry.maxAttempts)
71
+ throw new RangeError(`Event trigger "${id}" maxReceiveCount must equal retry.maxAttempts.`);
72
+ const batchSize = trigger.workerBatchSize ?? DEFAULT_BATCH_SIZE;
73
+ range(batchSize, 1, 10, `Event trigger "${id}" workerBatchSize`);
74
+ const waitSeconds = trigger.workerWaitTimeSeconds ?? DEFAULT_WAIT_SECONDS;
75
+ range(waitSeconds, 0, 20, `Event trigger "${id}" workerWaitTimeSeconds`);
76
+ const concurrency = trigger.concurrency ?? 1;
77
+ positive(concurrency, `Event trigger "${id}" concurrency`);
78
+ return {
79
+ id,
80
+ targetFunctionId: normalizeId(trigger.targetFunctionId),
81
+ expansion,
82
+ retry,
83
+ timeoutMs,
84
+ concurrency,
85
+ visibilityTimeoutSeconds: visibility,
86
+ messageRetentionSeconds: retention,
87
+ deadLetterRetentionSeconds: dlqRetention,
88
+ maxReceiveCount,
89
+ workerBatchSize: batchSize,
90
+ workerWaitTimeSeconds: waitSeconds,
91
+ };
92
+ });
93
+ }
94
+ export function normalizeEventBridgeRetry(policy) {
95
+ const maximumRetryAttempts = policy?.maximumRetryAttempts ?? DEFAULT_EVENTBRIDGE_RETRIES;
96
+ const maximumEventAgeInSeconds = policy?.maximumEventAgeInSeconds ?? DEFAULT_EVENTBRIDGE_AGE;
97
+ range(maximumRetryAttempts, 0, 185, "eventBridgeRetryPolicy.maximumRetryAttempts");
98
+ range(maximumEventAgeInSeconds, 60, 86_400, "eventBridgeRetryPolicy.maximumEventAgeInSeconds");
99
+ return { maximumRetryAttempts, maximumEventAgeInSeconds };
100
+ }
101
+ export function normalizeSource(source) {
102
+ const value = source?.trim() ?? "relkit";
103
+ if (value === "" || value.length > 256)
104
+ throw new TypeError("eventSource must be 1-256 characters.");
105
+ return value;
106
+ }
107
+ export function eventPattern(source, event) {
108
+ return canonicalJson({
109
+ "detail-type": [event.id],
110
+ detail: { eventId: [event.id], version: [event.version] },
111
+ source: [source],
112
+ });
113
+ }
114
+ function parsePair(value) {
115
+ const at = value.lastIndexOf("@");
116
+ const versionText = value.slice(at + 1);
117
+ if (at < 1 || !/^[1-9]\d*$/.test(versionText))
118
+ throw new TypeError(`Event expansion "${value}" must use id@version.`);
119
+ const version = Number(versionText);
120
+ return `${normalizeId(value.slice(0, at))}@${version}`;
121
+ }
122
+ function validateRetry(policy, id) {
123
+ positive(policy.maxAttempts, `Event trigger "${id}" retry.maxAttempts`);
124
+ nonNegative(policy.initialDelayMs, `Event trigger "${id}" retry.initialDelayMs`);
125
+ nonNegative(policy.maxDelayMs, `Event trigger "${id}" retry.maxDelayMs`);
126
+ if (policy.maxDelayMs < policy.initialDelayMs)
127
+ throw new RangeError(`Event trigger "${id}" retry.maxDelayMs must cover initialDelayMs.`);
128
+ if (!Number.isFinite(policy.multiplier) || policy.multiplier < 1)
129
+ throw new RangeError(`Event trigger "${id}" retry.multiplier must be finite and at least 1.`);
130
+ if (policy.jitter !== "none" && policy.jitter !== "full" && policy.jitter !== "equal")
131
+ throw new TypeError(`Event trigger "${id}" retry.jitter is invalid.`);
132
+ }
133
+ function positive(value, name) {
134
+ if (!Number.isSafeInteger(value) || value < 1)
135
+ throw new RangeError(`${name} must be positive.`);
136
+ }
137
+ function nonNegative(value, name) {
138
+ if (!Number.isSafeInteger(value) || value < 0)
139
+ throw new RangeError(`${name} must be non-negative.`);
140
+ }
141
+ function range(value, min, max, name) {
142
+ if (!Number.isSafeInteger(value) || value < min || value > max)
143
+ throw new RangeError(`${name} must be an integer between ${min} and ${max}.`);
144
+ }
145
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/components/RelkitEventBus/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import * as aws from "@pulumi/aws";
2
+ import * as pulumi from "@pulumi/pulumi";
3
+ import type { RelkitJobQueueResource, RelkitJobQueuesArgs, RelkitScheduleResource, RelkitWorkerConsumptionConfiguration } from "./types.js";
4
+ export * from "./types.js";
5
+ export { toAwsScheduleExpression } from "./validation.js";
6
+ /** SQS job queues, redrive policies, worker settings, and EventBridge schedules. */
7
+ export declare class RelkitJobQueues extends pulumi.ComponentResource {
8
+ readonly queues: readonly RelkitJobQueueResource[];
9
+ readonly queueResources: readonly RelkitJobQueueResource[];
10
+ readonly schedules: readonly RelkitScheduleResource[];
11
+ readonly workerConfigurations: readonly RelkitWorkerConsumptionConfiguration[];
12
+ readonly workerRole: aws.iam.Role | undefined;
13
+ readonly workerRoleArn: pulumi.Output<string>;
14
+ readonly workerPolicy: aws.iam.RolePolicy | undefined;
15
+ readonly schedulerRole: aws.iam.Role | undefined;
16
+ readonly schedulerRoleArn: pulumi.Output<string> | undefined;
17
+ readonly schedulerPolicy: aws.iam.RolePolicy | undefined;
18
+ readonly tags: pulumi.Output<Record<string, string>>;
19
+ constructor(name: string, args: RelkitJobQueuesArgs, opts?: pulumi.ComponentResourceOptions);
20
+ }
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/RelkitJobQueues/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAgBzC,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,oCAAoC,EACrC,MAAM,YAAY,CAAC;AAEpB,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,oFAAoF;AACpF,qBAAa,eAAgB,SAAQ,MAAM,CAAC,iBAAiB;IAC3D,QAAQ,CAAC,MAAM,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACnD,QAAQ,CAAC,cAAc,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC3D,QAAQ,CAAC,SAAS,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACtD,QAAQ,CAAC,oBAAoB,EAAE,SAAS,oCAAoC,EAAE,CAAC;IAC/E,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;IACtD,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAC7D,QAAQ,CAAC,eAAe,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;IACzD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;gBAEzC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,GAAE,MAAM,CAAC,wBAA6B;CAyGhG"}
@@ -0,0 +1,139 @@
1
+ import * as aws from "@pulumi/aws";
2
+ import * as pulumi from "@pulumi/pulumi";
3
+ import { resourceName, tagsFor } from "../common.js";
4
+ import { childName, createQueueResources, createSchedulerRole, createWorkerRole, } from "./resources.js";
5
+ import { createSchedulerPolicy, createWorkerPolicy } from "./policies.js";
6
+ import { normalizeJobs, normalizeSchedules, normalizeSchedulerRetry, toAwsScheduleExpression, } from "./validation.js";
7
+ export * from "./types.js";
8
+ export { toAwsScheduleExpression } from "./validation.js";
9
+ /** SQS job queues, redrive policies, worker settings, and EventBridge schedules. */
10
+ export class RelkitJobQueues extends pulumi.ComponentResource {
11
+ queues;
12
+ queueResources;
13
+ schedules;
14
+ workerConfigurations;
15
+ workerRole;
16
+ workerRoleArn;
17
+ workerPolicy;
18
+ schedulerRole;
19
+ schedulerRoleArn;
20
+ schedulerPolicy;
21
+ tags;
22
+ constructor(name, args, opts = {}) {
23
+ const jobs = normalizeJobs(args);
24
+ const schedules = normalizeSchedules(args.schedules, jobs);
25
+ const schedulerRetry = normalizeSchedulerRetry(args.schedulerRetryPolicy);
26
+ const componentName = resourceName(name, "job-queues", args, 64);
27
+ super("relkit:cloud-aws:RelkitJobQueues", componentName, {}, opts);
28
+ this.tags = tagsFor(name, args);
29
+ if (args.workerRoleArn === undefined) {
30
+ const role = createWorkerRole(componentName, this.tags, this);
31
+ this.workerRole = role;
32
+ this.workerRoleArn = role.arn;
33
+ }
34
+ else {
35
+ this.workerRole = undefined;
36
+ this.workerRoleArn = pulumi.output(args.workerRoleArn);
37
+ }
38
+ if (schedules.length > 0) {
39
+ if (args.schedulerRoleArn === undefined) {
40
+ const role = createSchedulerRole(componentName, this.tags, this);
41
+ this.schedulerRole = role;
42
+ this.schedulerRoleArn = role.arn;
43
+ }
44
+ else {
45
+ this.schedulerRole = undefined;
46
+ this.schedulerRoleArn = pulumi.output(args.schedulerRoleArn);
47
+ }
48
+ }
49
+ else {
50
+ this.schedulerRole = undefined;
51
+ this.schedulerRoleArn = undefined;
52
+ }
53
+ const baseQueues = jobs.map((job) => createQueueResources(componentName, job, this.tags, this.workerRoleArn, this.schedulerRoleArn, this));
54
+ this.queues = baseQueues.map((queue, index) => ({
55
+ ...queue,
56
+ retry: jobs[index].retry,
57
+ worker: workerConfiguration(jobs[index], queue),
58
+ }));
59
+ this.queueResources = this.queues;
60
+ this.workerConfigurations = this.queues.map(({ worker }) => worker);
61
+ this.workerPolicy = this.workerRole
62
+ ? createWorkerPolicy(componentName, this.workerRole, this.queues.map(({ queue }) => queue.arn), this)
63
+ : undefined;
64
+ this.schedulerPolicy = this.schedulerRole
65
+ ? createSchedulerPolicy(componentName, this.schedulerRole, this.queues.map(({ queue }) => queue.arn), this.queues.map(({ deadLetterQueue }) => deadLetterQueue.arn), this)
66
+ : undefined;
67
+ this.schedules = schedules.map((schedule) => {
68
+ const queue = this.queues.find(({ id }) => id === schedule.jobId);
69
+ if (queue === undefined || this.schedulerRoleArn === undefined)
70
+ throw new Error("AWS schedule mapping failed.");
71
+ const expression = toAwsScheduleExpression(schedule.cron);
72
+ const dependencies = [queue.queuePolicy, queue.redriveAllowPolicy];
73
+ if (queue.deadLetterQueuePolicy !== undefined)
74
+ dependencies.push(queue.deadLetterQueuePolicy);
75
+ if (this.schedulerPolicy !== undefined)
76
+ dependencies.push(this.schedulerPolicy);
77
+ const resource = new aws.scheduler.Schedule(childName(componentName, schedule.id, "schedule"), {
78
+ name: childName(componentName, schedule.id, "schedule", 64),
79
+ description: `RelKit schedule for ${schedule.jobId}`,
80
+ flexibleTimeWindow: { mode: "OFF" },
81
+ scheduleExpression: expression,
82
+ scheduleExpressionTimezone: schedule.timezone,
83
+ target: {
84
+ arn: queue.queue.arn,
85
+ roleArn: this.schedulerRoleArn,
86
+ input: schedule.inputJson,
87
+ deadLetterConfig: { arn: queue.deadLetterQueue.arn },
88
+ retryPolicy: schedulerRetry,
89
+ },
90
+ }, { parent: this, dependsOn: dependencies });
91
+ return {
92
+ id: schedule.id,
93
+ jobId: schedule.jobId,
94
+ expression,
95
+ inputJson: schedule.inputJson,
96
+ overlap: schedule.overlap,
97
+ schedule: resource,
98
+ };
99
+ });
100
+ this.registerOutputs({
101
+ queueArns: this.queues.map(({ queue }) => queue.arn),
102
+ deadLetterQueueArns: this.queues.map(({ deadLetterQueue }) => deadLetterQueue.arn),
103
+ scheduleArns: this.schedules.map(({ schedule }) => schedule.arn),
104
+ });
105
+ }
106
+ }
107
+ function workerConfiguration(job, queue) {
108
+ const environment = pulumi
109
+ .all({
110
+ id: job.id,
111
+ queueArn: queue.queue.arn,
112
+ queueUrl: queue.queue.url,
113
+ deadLetterQueueArn: queue.deadLetterQueue.arn,
114
+ })
115
+ .apply(({ id, queueArn, queueUrl, deadLetterQueueArn }) => ({
116
+ RELKIT_JOB_ID: String(id),
117
+ RELKIT_JOB_QUEUE_ARN: String(queueArn),
118
+ RELKIT_JOB_QUEUE_URL: String(queueUrl),
119
+ RELKIT_JOB_DLQ_ARN: String(deadLetterQueueArn),
120
+ RELKIT_JOB_BATCH_SIZE: String(job.workerBatchSize),
121
+ RELKIT_JOB_CONCURRENCY: String(job.concurrency),
122
+ RELKIT_JOB_WAIT_TIME_SECONDS: String(job.workerWaitTimeSeconds),
123
+ RELKIT_JOB_VISIBILITY_TIMEOUT_SECONDS: String(job.visibilityTimeoutSeconds),
124
+ RELKIT_JOB_DELIVERY_SEMANTICS: "at-least-once",
125
+ }));
126
+ return {
127
+ jobId: job.id,
128
+ queueArn: queue.queue.arn,
129
+ queueUrl: queue.queue.url,
130
+ deadLetterQueueArn: queue.deadLetterQueue.arn,
131
+ batchSize: job.workerBatchSize,
132
+ concurrency: job.concurrency,
133
+ waitTimeSeconds: job.workerWaitTimeSeconds,
134
+ visibilityTimeoutSeconds: job.visibilityTimeoutSeconds,
135
+ deliverySemantics: "at-least-once",
136
+ environment,
137
+ };
138
+ }
139
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/RelkitJobQueues/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EACL,SAAS,EACT,oBAAoB,EACpB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,GAExB,MAAM,iBAAiB,CAAC;AAQzB,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,oFAAoF;AACpF,MAAM,OAAO,eAAgB,SAAQ,MAAM,CAAC,iBAAiB;IAClD,MAAM,CAAoC;IAC1C,cAAc,CAAoC;IAClD,SAAS,CAAoC;IAC7C,oBAAoB,CAAkD;IACtE,UAAU,CAA2B;IACrC,aAAa,CAAwB;IACrC,YAAY,CAAiC;IAC7C,aAAa,CAA2B;IACxC,gBAAgB,CAAoC;IACpD,eAAe,CAAiC;IAChD,IAAI,CAAwC;IAErD,YAAY,IAAY,EAAE,IAAyB,EAAE,OAAwC,EAAE;QAC7F,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC3D,MAAM,cAAc,GAAG,uBAAuB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC1E,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACjE,KAAK,CAAC,kCAAkC,EAAE,aAAa,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAEhC,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9D,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;YAC5B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;gBACxC,MAAM,IAAI,GAAG,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACjE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC1B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;gBAC/B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;YAC/B,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;QACpC,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAClC,oBAAoB,CAClB,aAAa,EACb,GAAG,EACH,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CACL,CACF,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAC9C,GAAG,KAAK;YACR,KAAK,EAAE,IAAI,CAAC,KAAK,CAAE,CAAC,KAAK;YACzB,MAAM,EAAE,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAE,EAAE,KAAK,CAAC;SACjD,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;QAClC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU;YACjC,CAAC,CAAC,kBAAkB,CAChB,aAAa,EACb,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EACzC,IAAI,CACL;YACH,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,aAAa;YACvC,CAAC,CAAC,qBAAqB,CACnB,aAAa,EACb,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EACzC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,EAC7D,IAAI,CACL;YACH,CAAC,CAAC,SAAS,CAAC;QACd,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClE,IAAI,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,gBAAgB,KAAK,SAAS;gBAC5D,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,uBAAuB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1D,MAAM,YAAY,GAAsB,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;YACtF,IAAI,KAAK,CAAC,qBAAqB,KAAK,SAAS;gBAAE,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAC9F,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS;gBAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAChF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,QAAQ,CACzC,SAAS,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,CAAC,EACjD;gBACE,IAAI,EAAE,SAAS,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC;gBAC3D,WAAW,EAAE,uBAAuB,QAAQ,CAAC,KAAK,EAAE;gBACpD,kBAAkB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;gBACnC,kBAAkB,EAAE,UAAU;gBAC9B,0BAA0B,EAAE,QAAQ,CAAC,QAAQ;gBAC7C,MAAM,EAAE;oBACN,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG;oBACpB,OAAO,EAAE,IAAI,CAAC,gBAAgB;oBAC9B,KAAK,EAAE,QAAQ,CAAC,SAAS;oBACzB,gBAAgB,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,eAAe,CAAC,GAAG,EAAE;oBACpD,WAAW,EAAE,cAAc;iBAC5B;aACF,EACD,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,CAC1C,CAAC;YACF,OAAO;gBACL,EAAE,EAAE,QAAQ,CAAC,EAAE;gBACf,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,UAAU;gBACV,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO;gBACzB,QAAQ,EAAE,QAAQ;aACnB,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,CAAC;YACnB,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC;YACpD,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC;YAClF,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;SACjE,CAAC,CAAC;IACL,CAAC;CACF;AAED,SAAS,mBAAmB,CAC1B,GAAuB,EACvB,KAAuD;IAEvD,MAAM,WAAW,GAAG,MAAM;SACvB,GAAG,CAAC;QACH,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG;QACzB,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG;QACzB,kBAAkB,EAAE,KAAK,CAAC,eAAe,CAAC,GAAG;KAC9C,CAAC;SACD,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EAA0B,EAAE,CAAC,CAAC;QAClF,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC;QACzB,oBAAoB,EAAE,MAAM,CAAC,QAAQ,CAAC;QACtC,oBAAoB,EAAE,MAAM,CAAC,QAAQ,CAAC;QACtC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,CAAC;QAC9C,qBAAqB,EAAE,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;QAClD,sBAAsB,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;QAC/C,4BAA4B,EAAE,MAAM,CAAC,GAAG,CAAC,qBAAqB,CAAC;QAC/D,qCAAqC,EAAE,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC;QAC3E,6BAA6B,EAAE,eAAe;KAC/C,CAAC,CAAC,CAAC;IACN,OAAO;QACL,KAAK,EAAE,GAAG,CAAC,EAAE;QACb,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG;QACzB,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG;QACzB,kBAAkB,EAAE,KAAK,CAAC,eAAe,CAAC,GAAG;QAC7C,SAAS,EAAE,GAAG,CAAC,eAAe;QAC9B,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,eAAe,EAAE,GAAG,CAAC,qBAAqB;QAC1C,wBAAwB,EAAE,GAAG,CAAC,wBAAwB;QACtD,iBAAiB,EAAE,eAAe;QAClC,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import * as aws from "@pulumi/aws";
2
+ import * as pulumi from "@pulumi/pulumi";
3
+ export declare function createWorkerPolicy(name: string, role: aws.iam.Role, queueArns: readonly pulumi.Input<string>[], parent: pulumi.Resource): aws.iam.RolePolicy;
4
+ export declare function createSchedulerPolicy(name: string, role: aws.iam.Role, queueArns: readonly pulumi.Input<string>[], deadLetterQueueArns: readonly pulumi.Input<string>[], parent: pulumi.Resource): aws.iam.RolePolicy;
5
+ export declare function queuePolicyJson(queueArn: pulumi.Input<string>, workerRoleArn: pulumi.Input<string>, schedulerRoleArn: pulumi.Input<string> | undefined): pulumi.Output<string>;
6
+ export declare function sendPolicyJson(queueArn: pulumi.Input<string>, schedulerRoleArn: pulumi.Input<string>): pulumi.Output<string>;
7
+ export declare function trustPolicy(service: string): pulumi.Output<string>;
8
+ //# sourceMappingURL=policies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policies.d.ts","sourceRoot":"","sources":["../../../src/components/RelkitJobQueues/policies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAIzC,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAClB,SAAS,EAAE,SAAS,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAC1C,MAAM,EAAE,MAAM,CAAC,QAAQ,GACtB,GAAG,CAAC,GAAG,CAAC,UAAU,CAepB;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,IAAI,EAClB,SAAS,EAAE,SAAS,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAC1C,mBAAmB,EAAE,SAAS,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EACpD,MAAM,EAAE,MAAM,CAAC,QAAQ,GACtB,GAAG,CAAC,GAAG,CAAC,UAAU,CAepB;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAC9B,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EACnC,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,SAAS,GACjD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CA4BvB;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAC9B,gBAAgB,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GACrC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAiBvB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAOlE"}