autotel-aws 0.13.13 → 0.13.14

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 (205) hide show
  1. package/dist/attributes.cjs +155 -46
  2. package/dist/attributes.cjs.map +1 -1
  3. package/dist/attributes.d.cts +64 -62
  4. package/dist/attributes.d.cts.map +1 -0
  5. package/dist/attributes.d.ts +64 -62
  6. package/dist/attributes.d.ts.map +1 -0
  7. package/dist/attributes.js +146 -3
  8. package/dist/attributes.js.map +1 -1
  9. package/dist/cloudwatch.cjs +324 -358
  10. package/dist/cloudwatch.cjs.map +1 -1
  11. package/dist/cloudwatch.d.cts +126 -153
  12. package/dist/cloudwatch.d.cts.map +1 -0
  13. package/dist/cloudwatch.d.ts +126 -153
  14. package/dist/cloudwatch.d.ts.map +1 -0
  15. package/dist/cloudwatch.js +323 -356
  16. package/dist/cloudwatch.js.map +1 -1
  17. package/dist/config-D8QZwF1e.d.ts +123 -0
  18. package/dist/config-D8QZwF1e.d.ts.map +1 -0
  19. package/dist/config-SPkMWWXY.d.cts +123 -0
  20. package/dist/config-SPkMWWXY.d.cts.map +1 -0
  21. package/dist/dynamodb.cjs +89 -11
  22. package/dist/dynamodb.cjs.map +1 -1
  23. package/dist/dynamodb.d.cts +15 -63
  24. package/dist/dynamodb.d.cts.map +1 -0
  25. package/dist/dynamodb.d.ts +15 -63
  26. package/dist/dynamodb.d.ts.map +1 -0
  27. package/dist/dynamodb.js +90 -4
  28. package/dist/dynamodb.js.map +1 -1
  29. package/dist/eventbridge.cjs +423 -261
  30. package/dist/eventbridge.cjs.map +1 -1
  31. package/dist/eventbridge.d.cts +113 -174
  32. package/dist/eventbridge.d.cts.map +1 -0
  33. package/dist/eventbridge.d.ts +113 -174
  34. package/dist/eventbridge.d.ts.map +1 -0
  35. package/dist/eventbridge.js +422 -259
  36. package/dist/eventbridge.js.map +1 -1
  37. package/dist/index.cjs +117 -241
  38. package/dist/index.cjs.map +1 -1
  39. package/dist/index.d.cts +42 -55
  40. package/dist/index.d.cts.map +1 -0
  41. package/dist/index.d.ts +42 -55
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +62 -41
  44. package/dist/index.js.map +1 -1
  45. package/dist/kinesis.cjs +485 -20
  46. package/dist/kinesis.cjs.map +1 -1
  47. package/dist/kinesis.d.cts +179 -226
  48. package/dist/kinesis.d.cts.map +1 -0
  49. package/dist/kinesis.d.ts +179 -226
  50. package/dist/kinesis.d.ts.map +1 -0
  51. package/dist/kinesis.js +484 -5
  52. package/dist/kinesis.js.map +1 -1
  53. package/dist/lambda-B0LQa5vS.d.ts +168 -0
  54. package/dist/lambda-B0LQa5vS.d.ts.map +1 -0
  55. package/dist/lambda-DR33vPpL.cjs +500 -0
  56. package/dist/lambda-DR33vPpL.cjs.map +1 -0
  57. package/dist/lambda-DYyKH-f-.js +453 -0
  58. package/dist/lambda-DYyKH-f-.js.map +1 -0
  59. package/dist/lambda-DnroO4Od.d.cts +168 -0
  60. package/dist/lambda-DnroO4Od.d.cts.map +1 -0
  61. package/dist/lambda-auto.cjs +33 -16
  62. package/dist/lambda-auto.cjs.map +1 -1
  63. package/dist/lambda-auto.d.cts +1 -2
  64. package/dist/lambda-auto.d.ts +1 -2
  65. package/dist/lambda-auto.js +35 -15
  66. package/dist/lambda-auto.js.map +1 -1
  67. package/dist/lambda.cjs +11 -42
  68. package/dist/lambda.d.cts +3 -231
  69. package/dist/lambda.d.ts +3 -231
  70. package/dist/lambda.js +3 -5
  71. package/dist/s3.cjs +70 -11
  72. package/dist/s3.cjs.map +1 -1
  73. package/dist/s3.d.cts +15 -51
  74. package/dist/s3.d.cts.map +1 -0
  75. package/dist/s3.d.ts +15 -51
  76. package/dist/s3.d.ts.map +1 -0
  77. package/dist/s3.js +71 -4
  78. package/dist/s3.js.map +1 -1
  79. package/dist/sdk-C-o7ngkk.js +198 -0
  80. package/dist/sdk-C-o7ngkk.js.map +1 -0
  81. package/dist/sdk-C9Nvlh7R.cjs +222 -0
  82. package/dist/sdk-C9Nvlh7R.cjs.map +1 -0
  83. package/dist/sdk-CXqc4o_q.d.ts +135 -0
  84. package/dist/sdk-CXqc4o_q.d.ts.map +1 -0
  85. package/dist/sdk-DkAItj4z.d.cts +135 -0
  86. package/dist/sdk-DkAItj4z.d.cts.map +1 -0
  87. package/dist/sdk-wrapper-BDrcyEQ_.cjs +161 -0
  88. package/dist/sdk-wrapper-BDrcyEQ_.cjs.map +1 -0
  89. package/dist/sdk-wrapper-BVr62EfA.js +120 -0
  90. package/dist/sdk-wrapper-BVr62EfA.js.map +1 -0
  91. package/dist/sdk.cjs +8 -31
  92. package/dist/sdk.d.cts +3 -156
  93. package/dist/sdk.d.ts +3 -156
  94. package/dist/sdk.js +3 -6
  95. package/dist/sns.cjs +305 -16
  96. package/dist/sns.cjs.map +1 -1
  97. package/dist/sns.d.cts +109 -155
  98. package/dist/sns.d.cts.map +1 -0
  99. package/dist/sns.d.ts +109 -155
  100. package/dist/sns.d.ts.map +1 -0
  101. package/dist/sns.js +305 -5
  102. package/dist/sns.js.map +1 -1
  103. package/dist/sqs.cjs +455 -20
  104. package/dist/sqs.cjs.map +1 -1
  105. package/dist/sqs.d.cts +191 -240
  106. package/dist/sqs.d.cts.map +1 -0
  107. package/dist/sqs.d.ts +191 -240
  108. package/dist/sqs.d.ts.map +1 -0
  109. package/dist/sqs.js +454 -5
  110. package/dist/sqs.js.map +1 -1
  111. package/dist/step-functions.cjs +557 -32
  112. package/dist/step-functions.cjs.map +1 -1
  113. package/dist/step-functions.d.cts +155 -210
  114. package/dist/step-functions.d.cts.map +1 -0
  115. package/dist/step-functions.d.ts +155 -210
  116. package/dist/step-functions.d.ts.map +1 -0
  117. package/dist/step-functions.js +553 -5
  118. package/dist/step-functions.js.map +1 -1
  119. package/dist/testing.cjs +60 -58
  120. package/dist/testing.cjs.map +1 -1
  121. package/dist/testing.d.cts +20 -23
  122. package/dist/testing.d.cts.map +1 -0
  123. package/dist/testing.d.ts +20 -23
  124. package/dist/testing.d.ts.map +1 -0
  125. package/dist/testing.js +59 -57
  126. package/dist/testing.js.map +1 -1
  127. package/dist/{types-B2Mi8Goj.d.cts → types-0uHbJsBN.d.ts} +5 -7
  128. package/dist/types-0uHbJsBN.d.ts.map +1 -0
  129. package/dist/types-DOUDks8I.d.cts +71 -0
  130. package/dist/types-DOUDks8I.d.cts.map +1 -0
  131. package/dist/types-DOUDks8I.d.ts +71 -0
  132. package/dist/types-DOUDks8I.d.ts.map +1 -0
  133. package/dist/{types-BqTI4s4V.d.ts → types-iyHj03Q1.d.cts} +5 -7
  134. package/dist/types-iyHj03Q1.d.cts.map +1 -0
  135. package/dist/xray-B46i6z6K.js +59 -0
  136. package/dist/xray-B46i6z6K.js.map +1 -0
  137. package/dist/xray-CG4jciQs.d.ts +19 -0
  138. package/dist/xray-CG4jciQs.d.ts.map +1 -0
  139. package/dist/xray-Cd2UiVRA.cjs +75 -0
  140. package/dist/xray-Cd2UiVRA.cjs.map +1 -0
  141. package/dist/xray-DDcKCKKo.d.cts +19 -0
  142. package/dist/xray-DDcKCKKo.d.cts.map +1 -0
  143. package/dist/xray.cjs +10 -23
  144. package/dist/xray.d.cts +3 -24
  145. package/dist/xray.d.ts +3 -24
  146. package/dist/xray.js +3 -5
  147. package/package.json +5 -5
  148. package/dist/chunk-35F3UBOO.cjs +0 -48
  149. package/dist/chunk-35F3UBOO.cjs.map +0 -1
  150. package/dist/chunk-4THGOYZL.js +0 -387
  151. package/dist/chunk-4THGOYZL.js.map +0 -1
  152. package/dist/chunk-CIGXV6HA.js +0 -192
  153. package/dist/chunk-CIGXV6HA.js.map +0 -1
  154. package/dist/chunk-DGUM43GV.js +0 -10
  155. package/dist/chunk-DGUM43GV.js.map +0 -1
  156. package/dist/chunk-DHHLKZHI.cjs +0 -23
  157. package/dist/chunk-DHHLKZHI.cjs.map +0 -1
  158. package/dist/chunk-HMTKKKKP.cjs +0 -390
  159. package/dist/chunk-HMTKKKKP.cjs.map +0 -1
  160. package/dist/chunk-I4CKQ4RD.js +0 -153
  161. package/dist/chunk-I4CKQ4RD.js.map +0 -1
  162. package/dist/chunk-JEQ2X3Z6.cjs +0 -12
  163. package/dist/chunk-JEQ2X3Z6.cjs.map +0 -1
  164. package/dist/chunk-JL33WEVE.js +0 -341
  165. package/dist/chunk-JL33WEVE.js.map +0 -1
  166. package/dist/chunk-JMSFE6FJ.js +0 -24
  167. package/dist/chunk-JMSFE6FJ.js.map +0 -1
  168. package/dist/chunk-JPDJPOIB.js +0 -78
  169. package/dist/chunk-JPDJPOIB.js.map +0 -1
  170. package/dist/chunk-KNRQYDAS.cjs +0 -394
  171. package/dist/chunk-KNRQYDAS.cjs.map +0 -1
  172. package/dist/chunk-NQ65Y5AI.cjs +0 -195
  173. package/dist/chunk-NQ65Y5AI.cjs.map +0 -1
  174. package/dist/chunk-OB4XTAVK.cjs +0 -345
  175. package/dist/chunk-OB4XTAVK.cjs.map +0 -1
  176. package/dist/chunk-OHFR7WX5.js +0 -341
  177. package/dist/chunk-OHFR7WX5.js.map +0 -1
  178. package/dist/chunk-PZGYL7XZ.js +0 -40
  179. package/dist/chunk-PZGYL7XZ.js.map +0 -1
  180. package/dist/chunk-Q3DMMQ7K.cjs +0 -164
  181. package/dist/chunk-Q3DMMQ7K.cjs.map +0 -1
  182. package/dist/chunk-SPC4VYOI.cjs +0 -350
  183. package/dist/chunk-SPC4VYOI.cjs.map +0 -1
  184. package/dist/chunk-UZEJV2YD.cjs +0 -139
  185. package/dist/chunk-UZEJV2YD.cjs.map +0 -1
  186. package/dist/chunk-VZHQH75L.cjs +0 -26
  187. package/dist/chunk-VZHQH75L.cjs.map +0 -1
  188. package/dist/chunk-X6BY6PCK.js +0 -386
  189. package/dist/chunk-X6BY6PCK.js.map +0 -1
  190. package/dist/chunk-XOF2H2PI.cjs +0 -84
  191. package/dist/chunk-XOF2H2PI.cjs.map +0 -1
  192. package/dist/chunk-YG56NRIO.js +0 -131
  193. package/dist/chunk-YG56NRIO.js.map +0 -1
  194. package/dist/chunk-ZPDRKCAR.js +0 -21
  195. package/dist/chunk-ZPDRKCAR.js.map +0 -1
  196. package/dist/config-DbZv4bpy.d.ts +0 -125
  197. package/dist/config-srkLBXZH.d.cts +0 -125
  198. package/dist/lambda.cjs.map +0 -1
  199. package/dist/lambda.js.map +0 -1
  200. package/dist/sdk.cjs.map +0 -1
  201. package/dist/sdk.js.map +0 -1
  202. package/dist/types-B9IaHmGa.d.cts +0 -73
  203. package/dist/types-B9IaHmGa.d.ts +0 -73
  204. package/dist/xray.cjs.map +0 -1
  205. package/dist/xray.js.map +0 -1
@@ -1,35 +1,560 @@
1
- 'use strict';
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_attributes = require('./attributes.cjs');
3
+ const require_sdk_wrapper = require('./sdk-wrapper-BDrcyEQ_.cjs');
4
+ let autotel = require("autotel");
5
+ let _opentelemetry_api = require("@opentelemetry/api");
2
6
 
3
- var chunkKNRQYDAS_cjs = require('./chunk-KNRQYDAS.cjs');
4
- require('./chunk-UZEJV2YD.cjs');
5
- require('./chunk-Q3DMMQ7K.cjs');
6
- require('./chunk-JEQ2X3Z6.cjs');
7
+ //#region src/step-functions/index.ts
8
+ /**
9
+ * Step Functions instrumentation
10
+ *
11
+ * Provides semantic helpers for tracing AWS Step Functions operations
12
+ * with context propagation for distributed tracing across state machines.
13
+ *
14
+ * @example Start workflow with trace context
15
+ * ```typescript
16
+ * import { StepFunctionsExecutor, injectTraceContext } from 'autotel-aws/step-functions';
17
+ * import { SFNClient } from '@aws-sdk/client-sfn';
18
+ *
19
+ * const sfn = new SFNClient({});
20
+ * const executor = new StepFunctionsExecutor(sfn, {
21
+ * stateMachineArn: 'arn:aws:states:us-east-1:123456789:stateMachine:OrderProcessor'
22
+ * });
23
+ *
24
+ * // Start execution with automatic trace context injection
25
+ * const result = await executor.startExecution({
26
+ * input: { orderId: '123', items: [...] },
27
+ * name: 'order-123-execution'
28
+ * });
29
+ * ```
30
+ *
31
+ * @example Extract context in Lambda invoked by Step Functions
32
+ * ```typescript
33
+ * import { extractStepFunctionsContext } from 'autotel-aws/step-functions';
34
+ * import { wrapHandler } from 'autotel-aws/lambda';
35
+ *
36
+ * export const handler = wrapHandler(async (event) => {
37
+ * // Extract trace context from Step Functions input
38
+ * const parentContext = extractStepFunctionsContext(event);
39
+ *
40
+ * // Process the order (without the trace context fields)
41
+ * const { orderId, items } = event;
42
+ * await processOrder(orderId, items);
43
+ *
44
+ * return { status: 'completed' };
45
+ * });
46
+ * ```
47
+ *
48
+ * @example Activity worker with context propagation
49
+ * ```typescript
50
+ * import { StepFunctionsActivityWorker } from 'autotel-aws/step-functions';
51
+ *
52
+ * const worker = new StepFunctionsActivityWorker(sfn, {
53
+ * activityArn: 'arn:aws:states:us-east-1:123456789:activity:ProcessPayment'
54
+ * });
55
+ *
56
+ * // Worker extracts trace context and creates child spans
57
+ * await worker.poll(async (input, taskToken, ctx) => {
58
+ * ctx.setAttribute('payment.amount', input.amount);
59
+ * const result = await processPayment(input);
60
+ * return result;
61
+ * });
62
+ * ```
63
+ */
64
+ /**
65
+ * Inject W3C Trace Context into Step Functions execution input
66
+ *
67
+ * Adds `_traceContext` field with traceparent, tracestate, and baggage.
68
+ * This enables distributed tracing across Step Functions executions
69
+ * and Lambda functions invoked by the state machine.
70
+ *
71
+ * @param input - The original execution input
72
+ * @returns Input with trace context injected
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * const input = { orderId: '123', items: [...] };
77
+ * const inputWithContext = injectTraceContext(input);
78
+ * // { orderId: '123', items: [...], _traceContext: { traceparent: '...' } }
79
+ *
80
+ * await sfn.send(new StartExecutionCommand({
81
+ * stateMachineArn: 'arn:...',
82
+ * input: JSON.stringify(inputWithContext)
83
+ * }));
84
+ * ```
85
+ */
86
+ function injectTraceContext(input) {
87
+ const carrier = {};
88
+ _opentelemetry_api.propagation.inject(_opentelemetry_api.context.active(), carrier);
89
+ if (!carrier.traceparent) return input;
90
+ return {
91
+ ...input,
92
+ _traceContext: {
93
+ traceparent: carrier.traceparent,
94
+ ...carrier.tracestate && { tracestate: carrier.tracestate },
95
+ ...carrier.baggage && { baggage: carrier.baggage }
96
+ }
97
+ };
98
+ }
99
+ /**
100
+ * Extract W3C Trace Context from Step Functions input
101
+ *
102
+ * Extracts the `_traceContext` field added by injectTraceContext.
103
+ * Returns the SpanContext if present, or undefined.
104
+ *
105
+ * @param input - Step Functions input (event in Lambda handler)
106
+ * @returns SpanContext if trace context was found, undefined otherwise
107
+ *
108
+ * @example
109
+ * ```typescript
110
+ * // In a Lambda invoked by Step Functions
111
+ * export const handler = async (event) => {
112
+ * const parentContext = extractStepFunctionsContext(event);
113
+ * // Use parentContext to link traces...
114
+ *
115
+ * // Access data without trace context
116
+ * const { orderId, items } = stripTraceContext(event);
117
+ * };
118
+ * ```
119
+ */
120
+ function extractStepFunctionsContext(input) {
121
+ if (typeof input !== "object" || input === null || !("_traceContext" in input)) return;
122
+ const traceContext = input._traceContext;
123
+ if (!traceContext?.traceparent) return;
124
+ const carrier = {
125
+ traceparent: traceContext.traceparent,
126
+ ...traceContext.tracestate && { tracestate: traceContext.tracestate },
127
+ ...traceContext.baggage && { baggage: traceContext.baggage }
128
+ };
129
+ const span = _opentelemetry_api.propagation.extract(_opentelemetry_api.context.active(), carrier).getValue(Symbol.for("OpenTelemetry Context Key SPAN"));
130
+ if (span && typeof span === "object") {
131
+ if ("spanContext" in span && typeof span.spanContext === "function") return span.spanContext();
132
+ if ("traceId" in span && "spanId" in span) return span;
133
+ }
134
+ }
135
+ /**
136
+ * Strip trace context fields from Step Functions input
137
+ *
138
+ * Returns the input without `_traceContext` field for cleaner processing.
139
+ *
140
+ * @param input - Step Functions input with optional trace context
141
+ * @returns Input without trace context fields
142
+ *
143
+ * @example
144
+ * ```typescript
145
+ * const event = { orderId: '123', _traceContext: { ... } };
146
+ * const cleanInput = stripTraceContext(event);
147
+ * // { orderId: '123' }
148
+ * ```
149
+ */
150
+ function stripTraceContext(input) {
151
+ const { _traceContext: _, ...rest } = input;
152
+ return rest;
153
+ }
154
+ /**
155
+ * Trace Step Functions operations
156
+ *
157
+ * Creates a traced function that automatically sets Step Functions attributes.
158
+ *
159
+ * @param config - Step Functions operation configuration
160
+ * @returns A higher-order function that wraps your Step Functions operation with tracing
161
+ *
162
+ * @remarks
163
+ * Semantic attributes set automatically:
164
+ * - `aws.stepfunctions.state_machine_arn` - State machine ARN
165
+ *
166
+ * Additional attributes you should set in your handler:
167
+ * - `aws.stepfunctions.execution_arn` - Execution ARN
168
+ * - `aws.stepfunctions.execution_name` - Execution name
169
+ *
170
+ * @example
171
+ * ```typescript
172
+ * export const startWorkflow = traceStepFunction({
173
+ * stateMachineArn: 'arn:aws:states:us-east-1:123456789:stateMachine:OrderProcessor',
174
+ * operation: 'StartExecution'
175
+ * })(ctx => async (input: object, executionName?: string) => {
176
+ * const result = await sfn.send(new StartExecutionCommand({
177
+ * stateMachineArn: 'arn:aws:states:...',
178
+ * input: JSON.stringify(injectTraceContext(input)),
179
+ * name: executionName
180
+ * }));
181
+ *
182
+ * ctx.setAttribute('aws.stepfunctions.execution_arn', result.executionArn ?? '');
183
+ * return result;
184
+ * });
185
+ * ```
186
+ */
187
+ function traceStepFunction(config) {
188
+ const operation = config.operation ?? "execute";
189
+ return function wrapper(fn) {
190
+ return (0, autotel.trace)(`stepfunctions.${operation}`, (ctx) => async (...args) => {
191
+ ctx.setAttributes(require_attributes.buildStepFunctionsAttributes({ stateMachineArn: config.stateMachineArn }));
192
+ return fn(ctx)(...args);
193
+ });
194
+ };
195
+ }
196
+ /**
197
+ * Step Functions Executor with automatic trace context injection
198
+ *
199
+ * Wraps an SFN client to automatically:
200
+ * - Create spans for all operations
201
+ * - Inject W3C Trace Context into execution input
202
+ * - Set proper semantic attributes
203
+ *
204
+ * @example Basic usage
205
+ * ```typescript
206
+ * import { StepFunctionsExecutor } from 'autotel-aws/step-functions';
207
+ * import { SFNClient } from '@aws-sdk/client-sfn';
208
+ *
209
+ * const sfn = new SFNClient({ region: 'us-east-1' });
210
+ * const executor = new StepFunctionsExecutor(sfn, {
211
+ * stateMachineArn: 'arn:aws:states:us-east-1:123456789:stateMachine:OrderProcessor'
212
+ * });
213
+ *
214
+ * // Start execution with automatic trace context
215
+ * const result = await executor.startExecution({
216
+ * input: { orderId: '123', items: ['item1', 'item2'] },
217
+ * name: 'order-123-execution'
218
+ * });
219
+ *
220
+ * console.log('Execution ARN:', result.executionArn);
221
+ * ```
222
+ *
223
+ * @example Express workflow (sync execution)
224
+ * ```typescript
225
+ * // Express workflows return synchronously
226
+ * const result = await executor.startSyncExecution({
227
+ * input: { orderId: '123' }
228
+ * });
229
+ *
230
+ * if (result.status === 'SUCCEEDED') {
231
+ * const output = JSON.parse(result.output || '{}');
232
+ * console.log('Workflow output:', output);
233
+ * }
234
+ * ```
235
+ */
236
+ var StepFunctionsExecutor = class {
237
+ client;
238
+ config;
239
+ stateMachineName;
240
+ constructor(client, config) {
241
+ this.client = require_sdk_wrapper.wrapSDKClient(client, config.service);
242
+ this.config = {
243
+ injectTraceContext: true,
244
+ ...config
245
+ };
246
+ this.stateMachineName = config.stateMachineArn.split(":").pop() || "unknown";
247
+ }
248
+ /**
249
+ * Start a new execution of the state machine
250
+ *
251
+ * @param execution - Execution input and optional name
252
+ * @returns Promise with execution ARN and start date
253
+ */
254
+ async startExecution(execution) {
255
+ return (0, autotel.trace)(`stepfunctions.StartExecution`, async (ctx) => {
256
+ ctx.setAttributes(require_attributes.buildStepFunctionsAttributes({ stateMachineArn: this.config.stateMachineArn }));
257
+ ctx.setAttribute("aws.stepfunctions.state_machine_name", this.stateMachineName);
258
+ if (execution.name) ctx.setAttribute("aws.stepfunctions.execution_name", execution.name);
259
+ const inputData = this.config.injectTraceContext ? injectTraceContext(execution.input) : execution.input;
260
+ const input = {
261
+ stateMachineArn: this.config.stateMachineArn,
262
+ input: JSON.stringify(inputData),
263
+ name: execution.name,
264
+ traceHeader: execution.traceHeader
265
+ };
266
+ try {
267
+ const { StartExecutionCommand } = await import("@aws-sdk/client-sfn");
268
+ const result = await this.client.send(new StartExecutionCommand(input));
269
+ if (result.executionArn) ctx.setAttribute("aws.stepfunctions.execution_arn", result.executionArn);
270
+ ctx.setStatus({ code: _opentelemetry_api.SpanStatusCode.OK });
271
+ return {
272
+ executionArn: result.executionArn,
273
+ startDate: result.startDate
274
+ };
275
+ } catch (error) {
276
+ ctx.setStatus({
277
+ code: _opentelemetry_api.SpanStatusCode.ERROR,
278
+ message: error instanceof Error ? error.message : "StartExecution failed"
279
+ });
280
+ throw error;
281
+ }
282
+ });
283
+ }
284
+ /**
285
+ * Start a synchronous execution (Express workflows only)
286
+ *
287
+ * @param execution - Execution input and optional name
288
+ * @returns Promise with execution result including output
289
+ */
290
+ async startSyncExecution(execution) {
291
+ return (0, autotel.trace)(`stepfunctions.StartSyncExecution`, async (ctx) => {
292
+ ctx.setAttributes(require_attributes.buildStepFunctionsAttributes({ stateMachineArn: this.config.stateMachineArn }));
293
+ ctx.setAttribute("aws.stepfunctions.state_machine_name", this.stateMachineName);
294
+ ctx.setAttribute("aws.stepfunctions.execution_type", "express");
295
+ if (execution.name) ctx.setAttribute("aws.stepfunctions.execution_name", execution.name);
296
+ const inputData = this.config.injectTraceContext ? injectTraceContext(execution.input) : execution.input;
297
+ const input = {
298
+ stateMachineArn: this.config.stateMachineArn,
299
+ input: JSON.stringify(inputData),
300
+ name: execution.name,
301
+ traceHeader: execution.traceHeader
302
+ };
303
+ try {
304
+ const { StartSyncExecutionCommand } = await import("@aws-sdk/client-sfn");
305
+ const result = await this.client.send(new StartSyncExecutionCommand(input));
306
+ if (result.executionArn) ctx.setAttribute("aws.stepfunctions.execution_arn", result.executionArn);
307
+ if (result.status) ctx.setAttribute("aws.stepfunctions.execution_status", result.status);
308
+ if (result.status === "FAILED" || result.status === "TIMED_OUT") ctx.setStatus({
309
+ code: _opentelemetry_api.SpanStatusCode.ERROR,
310
+ message: result.error || result.status
311
+ });
312
+ else ctx.setStatus({ code: _opentelemetry_api.SpanStatusCode.OK });
313
+ return {
314
+ executionArn: result.executionArn,
315
+ status: result.status,
316
+ output: result.output,
317
+ error: result.error,
318
+ cause: result.cause,
319
+ billingDetails: result.billingDetails ? {
320
+ billedMemoryUsedInMB: result.billingDetails.billedMemoryUsedInMB,
321
+ billedDurationInMilliseconds: result.billingDetails.billedDurationInMilliseconds
322
+ } : void 0
323
+ };
324
+ } catch (error) {
325
+ ctx.setStatus({
326
+ code: _opentelemetry_api.SpanStatusCode.ERROR,
327
+ message: error instanceof Error ? error.message : "StartSyncExecution failed"
328
+ });
329
+ throw error;
330
+ }
331
+ });
332
+ }
333
+ /**
334
+ * Describe an execution
335
+ *
336
+ * @param executionArn - ARN of the execution to describe
337
+ * @returns Promise with execution details
338
+ */
339
+ async describeExecution(executionArn) {
340
+ return (0, autotel.trace)(`stepfunctions.DescribeExecution`, async (ctx) => {
341
+ ctx.setAttributes(require_attributes.buildStepFunctionsAttributes({ stateMachineArn: this.config.stateMachineArn }));
342
+ ctx.setAttribute("aws.stepfunctions.execution_arn", executionArn);
343
+ try {
344
+ const { DescribeExecutionCommand } = await import("@aws-sdk/client-sfn");
345
+ const result = await this.client.send(new DescribeExecutionCommand({ executionArn }));
346
+ if (result.status) ctx.setAttribute("aws.stepfunctions.execution_status", result.status);
347
+ ctx.setStatus({ code: _opentelemetry_api.SpanStatusCode.OK });
348
+ return {
349
+ executionArn: result.executionArn,
350
+ stateMachineArn: result.stateMachineArn,
351
+ name: result.name,
352
+ status: result.status,
353
+ startDate: result.startDate,
354
+ stopDate: result.stopDate,
355
+ input: result.input,
356
+ output: result.output,
357
+ error: result.error,
358
+ cause: result.cause
359
+ };
360
+ } catch (error) {
361
+ ctx.setStatus({
362
+ code: _opentelemetry_api.SpanStatusCode.ERROR,
363
+ message: error instanceof Error ? error.message : "DescribeExecution failed"
364
+ });
365
+ throw error;
366
+ }
367
+ });
368
+ }
369
+ /**
370
+ * Stop an execution
371
+ *
372
+ * @param executionArn - ARN of the execution to stop
373
+ * @param options - Optional error and cause for the stop
374
+ * @returns Promise with stop date
375
+ */
376
+ async stopExecution(executionArn, options) {
377
+ return (0, autotel.trace)(`stepfunctions.StopExecution`, async (ctx) => {
378
+ ctx.setAttributes(require_attributes.buildStepFunctionsAttributes({ stateMachineArn: this.config.stateMachineArn }));
379
+ ctx.setAttribute("aws.stepfunctions.execution_arn", executionArn);
380
+ try {
381
+ const { StopExecutionCommand } = await import("@aws-sdk/client-sfn");
382
+ const result = await this.client.send(new StopExecutionCommand({
383
+ executionArn,
384
+ error: options?.error,
385
+ cause: options?.cause
386
+ }));
387
+ ctx.setStatus({ code: _opentelemetry_api.SpanStatusCode.OK });
388
+ return { stopDate: result.stopDate };
389
+ } catch (error) {
390
+ ctx.setStatus({
391
+ code: _opentelemetry_api.SpanStatusCode.ERROR,
392
+ message: error instanceof Error ? error.message : "StopExecution failed"
393
+ });
394
+ throw error;
395
+ }
396
+ });
397
+ }
398
+ };
399
+ /**
400
+ * Step Functions Activity Worker with trace context extraction
401
+ *
402
+ * Polls for activity tasks and processes them with automatic tracing.
403
+ * Extracts trace context from task input for distributed tracing.
404
+ *
405
+ * @example Basic activity worker
406
+ * ```typescript
407
+ * import { StepFunctionsActivityWorker } from 'autotel-aws/step-functions';
408
+ * import { SFNClient } from '@aws-sdk/client-sfn';
409
+ *
410
+ * const sfn = new SFNClient({ region: 'us-east-1' });
411
+ * const worker = new StepFunctionsActivityWorker(sfn, {
412
+ * activityArn: 'arn:aws:states:us-east-1:123456789:activity:ProcessPayment',
413
+ * workerName: 'payment-worker-1'
414
+ * });
415
+ *
416
+ * // Process tasks with automatic tracing
417
+ * await worker.poll(async (input, taskToken, ctx) => {
418
+ * ctx.setAttribute('payment.amount', input.amount);
419
+ * ctx.setAttribute('payment.currency', input.currency);
420
+ *
421
+ * const result = await processPayment(input);
422
+ *
423
+ * ctx.setAttribute('payment.status', result.status);
424
+ * return result;
425
+ * });
426
+ * ```
427
+ *
428
+ * @example Continuous polling with error handling
429
+ * ```typescript
430
+ * async function runWorker() {
431
+ * while (true) {
432
+ * try {
433
+ * await worker.poll(async (input, taskToken, ctx) => {
434
+ * return await processTask(input);
435
+ * });
436
+ * } catch (error) {
437
+ * console.error('Worker error:', error);
438
+ * // Brief pause before retrying
439
+ * await new Promise(resolve => setTimeout(resolve, 1000));
440
+ * }
441
+ * }
442
+ * }
443
+ * ```
444
+ */
445
+ var StepFunctionsActivityWorker = class {
446
+ client;
447
+ config;
448
+ activityName;
449
+ constructor(client, config) {
450
+ this.client = require_sdk_wrapper.wrapSDKClient(client, config.service);
451
+ this.config = {
452
+ extractTraceContext: true,
453
+ ...config
454
+ };
455
+ this.activityName = config.activityArn.split(":").pop() || "unknown";
456
+ }
457
+ /**
458
+ * Poll for an activity task and process it
459
+ *
460
+ * @param processor - Function to process the task input
461
+ * @returns Promise that resolves when the task is processed
462
+ */
463
+ async poll(processor) {
464
+ return (0, autotel.trace)(`stepfunctions.activity.poll`, async (ctx) => {
465
+ ctx.setAttribute("aws.stepfunctions.activity_arn", this.config.activityArn);
466
+ ctx.setAttribute("aws.stepfunctions.activity_name", this.activityName);
467
+ if (this.config.workerName) ctx.setAttribute("aws.stepfunctions.worker_name", this.config.workerName);
468
+ try {
469
+ const { GetActivityTaskCommand } = await import("@aws-sdk/client-sfn");
470
+ const task = await this.client.send(new GetActivityTaskCommand({
471
+ activityArn: this.config.activityArn,
472
+ workerName: this.config.workerName
473
+ }));
474
+ if (!task.taskToken || !task.input) {
475
+ ctx.setAttribute("aws.stepfunctions.activity_task_received", false);
476
+ ctx.setStatus({ code: _opentelemetry_api.SpanStatusCode.OK });
477
+ return;
478
+ }
479
+ ctx.setAttribute("aws.stepfunctions.activity_task_received", true);
480
+ const rawInput = JSON.parse(task.input);
481
+ if (this.config.extractTraceContext) {
482
+ if (extractStepFunctionsContext(rawInput)) ctx.setAttribute("aws.stepfunctions.trace_context_extracted", true);
483
+ }
484
+ const output = await processor(stripTraceContext(rawInput), task.taskToken, ctx);
485
+ const { SendTaskSuccessCommand } = await import("@aws-sdk/client-sfn");
486
+ await this.client.send(new SendTaskSuccessCommand({
487
+ taskToken: task.taskToken,
488
+ output: JSON.stringify(output)
489
+ }));
490
+ ctx.setStatus({ code: _opentelemetry_api.SpanStatusCode.OK });
491
+ } catch (error) {
492
+ ctx.setStatus({
493
+ code: _opentelemetry_api.SpanStatusCode.ERROR,
494
+ message: error instanceof Error ? error.message : "Activity processing failed"
495
+ });
496
+ throw error;
497
+ }
498
+ });
499
+ }
500
+ /**
501
+ * Send a task heartbeat
502
+ *
503
+ * For long-running activities, send heartbeats to prevent timeout.
504
+ *
505
+ * @param taskToken - The task token from GetActivityTask
506
+ */
507
+ async sendHeartbeat(taskToken) {
508
+ return (0, autotel.trace)(`stepfunctions.SendTaskHeartbeat`, async (ctx) => {
509
+ ctx.setAttribute("aws.stepfunctions.activity_arn", this.config.activityArn);
510
+ try {
511
+ const { SendTaskHeartbeatCommand } = await import("@aws-sdk/client-sfn");
512
+ await this.client.send(new SendTaskHeartbeatCommand({ taskToken }));
513
+ ctx.setStatus({ code: _opentelemetry_api.SpanStatusCode.OK });
514
+ } catch (error) {
515
+ ctx.setStatus({
516
+ code: _opentelemetry_api.SpanStatusCode.ERROR,
517
+ message: error instanceof Error ? error.message : "SendTaskHeartbeat failed"
518
+ });
519
+ throw error;
520
+ }
521
+ });
522
+ }
523
+ /**
524
+ * Send task failure
525
+ *
526
+ * @param taskToken - The task token from GetActivityTask
527
+ * @param error - Error code
528
+ * @param cause - Error cause description
529
+ */
530
+ async sendFailure(taskToken, error, cause) {
531
+ return (0, autotel.trace)(`stepfunctions.SendTaskFailure`, async (ctx) => {
532
+ ctx.setAttribute("aws.stepfunctions.activity_arn", this.config.activityArn);
533
+ ctx.setAttribute("aws.stepfunctions.task_error", error);
534
+ try {
535
+ const { SendTaskFailureCommand } = await import("@aws-sdk/client-sfn");
536
+ await this.client.send(new SendTaskFailureCommand({
537
+ taskToken,
538
+ error,
539
+ cause
540
+ }));
541
+ ctx.setStatus({ code: _opentelemetry_api.SpanStatusCode.OK });
542
+ } catch (error_) {
543
+ ctx.setStatus({
544
+ code: _opentelemetry_api.SpanStatusCode.ERROR,
545
+ message: error_ instanceof Error ? error_.message : "SendTaskFailure failed"
546
+ });
547
+ throw error_;
548
+ }
549
+ });
550
+ }
551
+ };
7
552
 
8
-
9
-
10
- Object.defineProperty(exports, "StepFunctionsActivityWorker", {
11
- enumerable: true,
12
- get: function () { return chunkKNRQYDAS_cjs.StepFunctionsActivityWorker; }
13
- });
14
- Object.defineProperty(exports, "StepFunctionsExecutor", {
15
- enumerable: true,
16
- get: function () { return chunkKNRQYDAS_cjs.StepFunctionsExecutor; }
17
- });
18
- Object.defineProperty(exports, "extractStepFunctionsContext", {
19
- enumerable: true,
20
- get: function () { return chunkKNRQYDAS_cjs.extractStepFunctionsContext; }
21
- });
22
- Object.defineProperty(exports, "injectTraceContext", {
23
- enumerable: true,
24
- get: function () { return chunkKNRQYDAS_cjs.injectTraceContext; }
25
- });
26
- Object.defineProperty(exports, "stripTraceContext", {
27
- enumerable: true,
28
- get: function () { return chunkKNRQYDAS_cjs.stripTraceContext; }
29
- });
30
- Object.defineProperty(exports, "traceStepFunction", {
31
- enumerable: true,
32
- get: function () { return chunkKNRQYDAS_cjs.traceStepFunction; }
33
- });
34
- //# sourceMappingURL=step-functions.cjs.map
553
+ //#endregion
554
+ exports.StepFunctionsActivityWorker = StepFunctionsActivityWorker;
555
+ exports.StepFunctionsExecutor = StepFunctionsExecutor;
556
+ exports.extractStepFunctionsContext = extractStepFunctionsContext;
557
+ exports.injectTraceContext = injectTraceContext;
558
+ exports.stripTraceContext = stripTraceContext;
559
+ exports.traceStepFunction = traceStepFunction;
35
560
  //# sourceMappingURL=step-functions.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"step-functions.cjs"}
1
+ {"version":3,"file":"step-functions.cjs","names":["context","propagation","buildStepFunctionsAttributes","wrapSDKClient","SpanStatusCode"],"sources":["../src/step-functions/index.ts"],"sourcesContent":["/**\n * Step Functions instrumentation\n *\n * Provides semantic helpers for tracing AWS Step Functions operations\n * with context propagation for distributed tracing across state machines.\n *\n * @example Start workflow with trace context\n * ```typescript\n * import { StepFunctionsExecutor, injectTraceContext } from 'autotel-aws/step-functions';\n * import { SFNClient } from '@aws-sdk/client-sfn';\n *\n * const sfn = new SFNClient({});\n * const executor = new StepFunctionsExecutor(sfn, {\n * stateMachineArn: 'arn:aws:states:us-east-1:123456789:stateMachine:OrderProcessor'\n * });\n *\n * // Start execution with automatic trace context injection\n * const result = await executor.startExecution({\n * input: { orderId: '123', items: [...] },\n * name: 'order-123-execution'\n * });\n * ```\n *\n * @example Extract context in Lambda invoked by Step Functions\n * ```typescript\n * import { extractStepFunctionsContext } from 'autotel-aws/step-functions';\n * import { wrapHandler } from 'autotel-aws/lambda';\n *\n * export const handler = wrapHandler(async (event) => {\n * // Extract trace context from Step Functions input\n * const parentContext = extractStepFunctionsContext(event);\n *\n * // Process the order (without the trace context fields)\n * const { orderId, items } = event;\n * await processOrder(orderId, items);\n *\n * return { status: 'completed' };\n * });\n * ```\n *\n * @example Activity worker with context propagation\n * ```typescript\n * import { StepFunctionsActivityWorker } from 'autotel-aws/step-functions';\n *\n * const worker = new StepFunctionsActivityWorker(sfn, {\n * activityArn: 'arn:aws:states:us-east-1:123456789:activity:ProcessPayment'\n * });\n *\n * // Worker extracts trace context and creates child spans\n * await worker.poll(async (input, taskToken, ctx) => {\n * ctx.setAttribute('payment.amount', input.amount);\n * const result = await processPayment(input);\n * return result;\n * });\n * ```\n */\n\nimport { trace, type TraceContext } from 'autotel';\nimport { context, propagation, SpanStatusCode } from '@opentelemetry/api';\nimport type { SpanContext } from '@opentelemetry/api';\nimport { buildStepFunctionsAttributes } from '../attributes';\nimport { wrapSDKClient } from '../common/sdk-wrapper';\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Step Functions operation configuration\n */\nexport interface TraceStepFunctionConfig {\n /**\n * State machine ARN\n * Sets `aws.stepfunctions.state_machine_arn` attribute.\n */\n stateMachineArn: string;\n\n /**\n * Operation type\n * Used to generate the span name: `stepfunctions.{operation}`\n * @default 'execute'\n */\n operation?:\n | 'StartExecution'\n | 'DescribeExecution'\n | 'StopExecution'\n | 'ListExecutions'\n | 'SendTaskSuccess'\n | 'SendTaskFailure'\n | 'execute'; // Legacy alias for StartExecution\n}\n\n/**\n * Configuration for StepFunctionsExecutor\n */\nexport interface StepFunctionsExecutorConfig {\n /**\n * State machine ARN\n */\n stateMachineArn: string;\n\n /**\n * Inject W3C Trace Context into execution input\n * @default true\n */\n injectTraceContext?: boolean;\n\n /**\n * Optional service name for tracing\n */\n service?: string;\n}\n\n/**\n * Execution input with optional trace context\n */\nexport interface ExecutionInput<T = Record<string, unknown>> {\n /**\n * The input data for the execution\n */\n input: T;\n\n /**\n * Optional execution name (must be unique within 90 days)\n */\n name?: string;\n\n /**\n * Optional trace ID for idempotency\n */\n traceHeader?: string;\n}\n\n/**\n * Configuration for StepFunctionsActivityWorker\n */\nexport interface StepFunctionsActivityWorkerConfig {\n /**\n * Activity ARN\n */\n activityArn: string;\n\n /**\n * Worker name for identification\n */\n workerName?: string;\n\n /**\n * Extract trace context from activity input\n * @default true\n */\n extractTraceContext?: boolean;\n\n /**\n * Optional service name for tracing\n */\n service?: string;\n}\n\n/**\n * Trace context fields injected into Step Functions input\n */\ninterface TraceContextFields {\n _traceContext?: {\n traceparent: string;\n tracestate?: string;\n baggage?: string;\n };\n}\n\n// ============================================================================\n// Context Propagation Helpers\n// ============================================================================\n\n/**\n * Inject W3C Trace Context into Step Functions execution input\n *\n * Adds `_traceContext` field with traceparent, tracestate, and baggage.\n * This enables distributed tracing across Step Functions executions\n * and Lambda functions invoked by the state machine.\n *\n * @param input - The original execution input\n * @returns Input with trace context injected\n *\n * @example\n * ```typescript\n * const input = { orderId: '123', items: [...] };\n * const inputWithContext = injectTraceContext(input);\n * // { orderId: '123', items: [...], _traceContext: { traceparent: '...' } }\n *\n * await sfn.send(new StartExecutionCommand({\n * stateMachineArn: 'arn:...',\n * input: JSON.stringify(inputWithContext)\n * }));\n * ```\n */\nexport function injectTraceContext<T extends Record<string, unknown>>(\n input: T,\n): T & TraceContextFields {\n const carrier: Record<string, string> = {};\n propagation.inject(context.active(), carrier);\n\n if (!carrier.traceparent) {\n return input;\n }\n\n return {\n ...input,\n _traceContext: {\n traceparent: carrier.traceparent,\n ...(carrier.tracestate && { tracestate: carrier.tracestate }),\n ...(carrier.baggage && { baggage: carrier.baggage }),\n },\n };\n}\n\n/**\n * Extract W3C Trace Context from Step Functions input\n *\n * Extracts the `_traceContext` field added by injectTraceContext.\n * Returns the SpanContext if present, or undefined.\n *\n * @param input - Step Functions input (event in Lambda handler)\n * @returns SpanContext if trace context was found, undefined otherwise\n *\n * @example\n * ```typescript\n * // In a Lambda invoked by Step Functions\n * export const handler = async (event) => {\n * const parentContext = extractStepFunctionsContext(event);\n * // Use parentContext to link traces...\n *\n * // Access data without trace context\n * const { orderId, items } = stripTraceContext(event);\n * };\n * ```\n */\nexport function extractStepFunctionsContext(\n input: unknown,\n): SpanContext | undefined {\n if (\n typeof input !== 'object' ||\n input === null ||\n !('_traceContext' in input)\n ) {\n return undefined;\n }\n\n const traceContext = (input as TraceContextFields)._traceContext;\n if (!traceContext?.traceparent) {\n return undefined;\n }\n\n // Use W3C Trace Context propagator to extract\n const carrier: Record<string, string> = {\n traceparent: traceContext.traceparent,\n ...(traceContext.tracestate && { tracestate: traceContext.tracestate }),\n ...(traceContext.baggage && { baggage: traceContext.baggage }),\n };\n\n const extractedContext = propagation.extract(context.active(), carrier);\n const span = extractedContext.getValue(Symbol.for('OpenTelemetry Context Key SPAN'));\n\n // Handle both Span and SpanContext\n if (span && typeof span === 'object') {\n if ('spanContext' in span && typeof span.spanContext === 'function') {\n return span.spanContext() as SpanContext;\n }\n // Might already be a SpanContext\n if ('traceId' in span && 'spanId' in span) {\n return span as SpanContext;\n }\n }\n\n return undefined;\n}\n\n/**\n * Strip trace context fields from Step Functions input\n *\n * Returns the input without `_traceContext` field for cleaner processing.\n *\n * @param input - Step Functions input with optional trace context\n * @returns Input without trace context fields\n *\n * @example\n * ```typescript\n * const event = { orderId: '123', _traceContext: { ... } };\n * const cleanInput = stripTraceContext(event);\n * // { orderId: '123' }\n * ```\n */\nexport function stripTraceContext<T extends Record<string, unknown>>(\n input: T,\n): Omit<T, '_traceContext'> {\n const { _traceContext: _, ...rest } = input as T & TraceContextFields;\n return rest as Omit<T, '_traceContext'>;\n}\n\n// ============================================================================\n// Trace Helper (Original API)\n// ============================================================================\n\n/**\n * Trace Step Functions operations\n *\n * Creates a traced function that automatically sets Step Functions attributes.\n *\n * @param config - Step Functions operation configuration\n * @returns A higher-order function that wraps your Step Functions operation with tracing\n *\n * @remarks\n * Semantic attributes set automatically:\n * - `aws.stepfunctions.state_machine_arn` - State machine ARN\n *\n * Additional attributes you should set in your handler:\n * - `aws.stepfunctions.execution_arn` - Execution ARN\n * - `aws.stepfunctions.execution_name` - Execution name\n *\n * @example\n * ```typescript\n * export const startWorkflow = traceStepFunction({\n * stateMachineArn: 'arn:aws:states:us-east-1:123456789:stateMachine:OrderProcessor',\n * operation: 'StartExecution'\n * })(ctx => async (input: object, executionName?: string) => {\n * const result = await sfn.send(new StartExecutionCommand({\n * stateMachineArn: 'arn:aws:states:...',\n * input: JSON.stringify(injectTraceContext(input)),\n * name: executionName\n * }));\n *\n * ctx.setAttribute('aws.stepfunctions.execution_arn', result.executionArn ?? '');\n * return result;\n * });\n * ```\n */\nexport function traceStepFunction(config: TraceStepFunctionConfig) {\n const operation = config.operation ?? 'execute';\n\n return function wrapper<TArgs extends unknown[], TReturn>(\n fn: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>,\n ): (...args: TArgs) => Promise<TReturn> {\n // Use autotel's trace() which properly handles the factory pattern\n return trace(\n `stepfunctions.${operation}`,\n (ctx: TraceContext) =>\n async (...args: TArgs): Promise<TReturn> => {\n // Set Step Functions attributes\n ctx.setAttributes(\n buildStepFunctionsAttributes({\n stateMachineArn: config.stateMachineArn,\n }),\n );\n\n // Get the user's handler and execute with forwarded arguments\n const handler = fn(ctx);\n return handler(...args);\n },\n );\n };\n}\n\n// ============================================================================\n// StepFunctionsExecutor Class\n// ============================================================================\n\n/**\n * Step Functions Executor with automatic trace context injection\n *\n * Wraps an SFN client to automatically:\n * - Create spans for all operations\n * - Inject W3C Trace Context into execution input\n * - Set proper semantic attributes\n *\n * @example Basic usage\n * ```typescript\n * import { StepFunctionsExecutor } from 'autotel-aws/step-functions';\n * import { SFNClient } from '@aws-sdk/client-sfn';\n *\n * const sfn = new SFNClient({ region: 'us-east-1' });\n * const executor = new StepFunctionsExecutor(sfn, {\n * stateMachineArn: 'arn:aws:states:us-east-1:123456789:stateMachine:OrderProcessor'\n * });\n *\n * // Start execution with automatic trace context\n * const result = await executor.startExecution({\n * input: { orderId: '123', items: ['item1', 'item2'] },\n * name: 'order-123-execution'\n * });\n *\n * console.log('Execution ARN:', result.executionArn);\n * ```\n *\n * @example Express workflow (sync execution)\n * ```typescript\n * // Express workflows return synchronously\n * const result = await executor.startSyncExecution({\n * input: { orderId: '123' }\n * });\n *\n * if (result.status === 'SUCCEEDED') {\n * const output = JSON.parse(result.output || '{}');\n * console.log('Workflow output:', output);\n * }\n * ```\n */\nexport class StepFunctionsExecutor<\n \n TClient extends { send: (command: any) => Promise<any> } = any,\n> {\n private client: TClient;\n private config: Required<Pick<StepFunctionsExecutorConfig, 'stateMachineArn'>> &\n StepFunctionsExecutorConfig;\n private stateMachineName: string;\n\n constructor(client: TClient, config: StepFunctionsExecutorConfig) {\n this.client = wrapSDKClient(client as any, config.service) as TClient;\n this.config = {\n injectTraceContext: true,\n ...config,\n };\n // Extract state machine name from ARN (last segment)\n this.stateMachineName = config.stateMachineArn.split(':').pop() || 'unknown';\n }\n\n /**\n * Start a new execution of the state machine\n *\n * @param execution - Execution input and optional name\n * @returns Promise with execution ARN and start date\n */\n async startExecution<T extends Record<string, unknown>>(\n execution: ExecutionInput<T>,\n ): Promise<{\n executionArn?: string;\n startDate?: Date;\n }> {\n return trace(`stepfunctions.StartExecution`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildStepFunctionsAttributes({\n stateMachineArn: this.config.stateMachineArn,\n }),\n );\n ctx.setAttribute('aws.stepfunctions.state_machine_name', this.stateMachineName);\n\n if (execution.name) {\n ctx.setAttribute('aws.stepfunctions.execution_name', execution.name);\n }\n\n // Optionally inject trace context\n const inputData = this.config.injectTraceContext\n ? injectTraceContext(execution.input)\n : execution.input;\n\n const input = {\n stateMachineArn: this.config.stateMachineArn,\n input: JSON.stringify(inputData),\n name: execution.name,\n traceHeader: execution.traceHeader,\n };\n\n try {\n const { StartExecutionCommand } = await import('@aws-sdk/client-sfn');\n const result = await this.client.send(new StartExecutionCommand(input));\n\n if (result.executionArn) {\n ctx.setAttribute('aws.stepfunctions.execution_arn', result.executionArn);\n }\n\n ctx.setStatus({ code: SpanStatusCode.OK });\n\n return {\n executionArn: result.executionArn,\n startDate: result.startDate,\n };\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'StartExecution failed',\n });\n throw error;\n }\n });\n }\n\n /**\n * Start a synchronous execution (Express workflows only)\n *\n * @param execution - Execution input and optional name\n * @returns Promise with execution result including output\n */\n async startSyncExecution<T extends Record<string, unknown>>(\n execution: ExecutionInput<T>,\n ): Promise<{\n executionArn?: string;\n status?: 'SUCCEEDED' | 'FAILED' | 'TIMED_OUT';\n output?: string;\n error?: string;\n cause?: string;\n billingDetails?: {\n billedMemoryUsedInMB?: number;\n billedDurationInMilliseconds?: number;\n };\n }> {\n return trace(`stepfunctions.StartSyncExecution`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildStepFunctionsAttributes({\n stateMachineArn: this.config.stateMachineArn,\n }),\n );\n ctx.setAttribute('aws.stepfunctions.state_machine_name', this.stateMachineName);\n ctx.setAttribute('aws.stepfunctions.execution_type', 'express');\n\n if (execution.name) {\n ctx.setAttribute('aws.stepfunctions.execution_name', execution.name);\n }\n\n // Optionally inject trace context\n const inputData = this.config.injectTraceContext\n ? injectTraceContext(execution.input)\n : execution.input;\n\n const input = {\n stateMachineArn: this.config.stateMachineArn,\n input: JSON.stringify(inputData),\n name: execution.name,\n traceHeader: execution.traceHeader,\n };\n\n try {\n const { StartSyncExecutionCommand } = await import('@aws-sdk/client-sfn');\n const result = await this.client.send(new StartSyncExecutionCommand(input));\n\n if (result.executionArn) {\n ctx.setAttribute('aws.stepfunctions.execution_arn', result.executionArn);\n }\n if (result.status) {\n ctx.setAttribute('aws.stepfunctions.execution_status', result.status);\n }\n\n if (result.status === 'FAILED' || result.status === 'TIMED_OUT') {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: result.error || result.status,\n });\n } else {\n ctx.setStatus({ code: SpanStatusCode.OK });\n }\n\n return {\n executionArn: result.executionArn,\n status: result.status as 'SUCCEEDED' | 'FAILED' | 'TIMED_OUT' | undefined,\n output: result.output,\n error: result.error,\n cause: result.cause,\n billingDetails: result.billingDetails\n ? {\n billedMemoryUsedInMB: result.billingDetails.billedMemoryUsedInMB,\n billedDurationInMilliseconds:\n result.billingDetails.billedDurationInMilliseconds,\n }\n : undefined,\n };\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'StartSyncExecution failed',\n });\n throw error;\n }\n });\n }\n\n /**\n * Describe an execution\n *\n * @param executionArn - ARN of the execution to describe\n * @returns Promise with execution details\n */\n async describeExecution(executionArn: string): Promise<{\n executionArn?: string;\n stateMachineArn?: string;\n name?: string;\n status?: string;\n startDate?: Date;\n stopDate?: Date;\n input?: string;\n output?: string;\n error?: string;\n cause?: string;\n }> {\n return trace(`stepfunctions.DescribeExecution`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildStepFunctionsAttributes({\n stateMachineArn: this.config.stateMachineArn,\n }),\n );\n ctx.setAttribute('aws.stepfunctions.execution_arn', executionArn);\n\n try {\n const { DescribeExecutionCommand } = await import('@aws-sdk/client-sfn');\n const result = await this.client.send(\n new DescribeExecutionCommand({ executionArn }),\n );\n\n if (result.status) {\n ctx.setAttribute('aws.stepfunctions.execution_status', result.status);\n }\n\n ctx.setStatus({ code: SpanStatusCode.OK });\n\n return {\n executionArn: result.executionArn,\n stateMachineArn: result.stateMachineArn,\n name: result.name,\n status: result.status,\n startDate: result.startDate,\n stopDate: result.stopDate,\n input: result.input,\n output: result.output,\n error: result.error,\n cause: result.cause,\n };\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'DescribeExecution failed',\n });\n throw error;\n }\n });\n }\n\n /**\n * Stop an execution\n *\n * @param executionArn - ARN of the execution to stop\n * @param options - Optional error and cause for the stop\n * @returns Promise with stop date\n */\n async stopExecution(\n executionArn: string,\n options?: { error?: string; cause?: string },\n ): Promise<{ stopDate?: Date }> {\n return trace(`stepfunctions.StopExecution`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildStepFunctionsAttributes({\n stateMachineArn: this.config.stateMachineArn,\n }),\n );\n ctx.setAttribute('aws.stepfunctions.execution_arn', executionArn);\n\n try {\n const { StopExecutionCommand } = await import('@aws-sdk/client-sfn');\n const result = await this.client.send(\n new StopExecutionCommand({\n executionArn,\n error: options?.error,\n cause: options?.cause,\n }),\n );\n\n ctx.setStatus({ code: SpanStatusCode.OK });\n\n return { stopDate: result.stopDate };\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'StopExecution failed',\n });\n throw error;\n }\n });\n }\n}\n\n// ============================================================================\n// StepFunctionsActivityWorker Class\n// ============================================================================\n\n/**\n * Step Functions Activity Worker with trace context extraction\n *\n * Polls for activity tasks and processes them with automatic tracing.\n * Extracts trace context from task input for distributed tracing.\n *\n * @example Basic activity worker\n * ```typescript\n * import { StepFunctionsActivityWorker } from 'autotel-aws/step-functions';\n * import { SFNClient } from '@aws-sdk/client-sfn';\n *\n * const sfn = new SFNClient({ region: 'us-east-1' });\n * const worker = new StepFunctionsActivityWorker(sfn, {\n * activityArn: 'arn:aws:states:us-east-1:123456789:activity:ProcessPayment',\n * workerName: 'payment-worker-1'\n * });\n *\n * // Process tasks with automatic tracing\n * await worker.poll(async (input, taskToken, ctx) => {\n * ctx.setAttribute('payment.amount', input.amount);\n * ctx.setAttribute('payment.currency', input.currency);\n *\n * const result = await processPayment(input);\n *\n * ctx.setAttribute('payment.status', result.status);\n * return result;\n * });\n * ```\n *\n * @example Continuous polling with error handling\n * ```typescript\n * async function runWorker() {\n * while (true) {\n * try {\n * await worker.poll(async (input, taskToken, ctx) => {\n * return await processTask(input);\n * });\n * } catch (error) {\n * console.error('Worker error:', error);\n * // Brief pause before retrying\n * await new Promise(resolve => setTimeout(resolve, 1000));\n * }\n * }\n * }\n * ```\n */\nexport class StepFunctionsActivityWorker<\n \n TClient extends { send: (command: any) => Promise<any> } = any,\n> {\n private client: TClient;\n private config: Required<Pick<StepFunctionsActivityWorkerConfig, 'activityArn'>> &\n StepFunctionsActivityWorkerConfig;\n private activityName: string;\n\n constructor(client: TClient, config: StepFunctionsActivityWorkerConfig) {\n this.client = wrapSDKClient(client as any, config.service) as TClient;\n this.config = {\n extractTraceContext: true,\n ...config,\n };\n // Extract activity name from ARN\n this.activityName = config.activityArn.split(':').pop() || 'unknown';\n }\n\n /**\n * Poll for an activity task and process it\n *\n * @param processor - Function to process the task input\n * @returns Promise that resolves when the task is processed\n */\n async poll<TInput extends Record<string, unknown>, TOutput>(\n processor: (\n input: TInput,\n taskToken: string,\n ctx: TraceContext,\n ) => Promise<TOutput>,\n ): Promise<void> {\n return trace(`stepfunctions.activity.poll`, async (ctx: TraceContext) => {\n ctx.setAttribute('aws.stepfunctions.activity_arn', this.config.activityArn);\n ctx.setAttribute('aws.stepfunctions.activity_name', this.activityName);\n\n if (this.config.workerName) {\n ctx.setAttribute('aws.stepfunctions.worker_name', this.config.workerName);\n }\n\n try {\n // Poll for task\n const { GetActivityTaskCommand } = await import('@aws-sdk/client-sfn');\n const task = await this.client.send(\n new GetActivityTaskCommand({\n activityArn: this.config.activityArn,\n workerName: this.config.workerName,\n }),\n );\n\n if (!task.taskToken || !task.input) {\n // No task available (timeout)\n ctx.setAttribute('aws.stepfunctions.activity_task_received', false);\n ctx.setStatus({ code: SpanStatusCode.OK });\n return;\n }\n\n ctx.setAttribute('aws.stepfunctions.activity_task_received', true);\n\n // Parse input\n const rawInput = JSON.parse(task.input) as TInput & TraceContextFields;\n\n // Extract trace context if enabled\n if (this.config.extractTraceContext) {\n const parentContext = extractStepFunctionsContext(rawInput);\n if (parentContext) {\n ctx.setAttribute('aws.stepfunctions.trace_context_extracted', true);\n }\n }\n\n // Strip trace context from input\n const cleanInput = stripTraceContext(rawInput) as TInput;\n\n // Process the task\n const output = await processor(cleanInput, task.taskToken, ctx);\n\n // Send success\n const { SendTaskSuccessCommand } = await import('@aws-sdk/client-sfn');\n await this.client.send(\n new SendTaskSuccessCommand({\n taskToken: task.taskToken,\n output: JSON.stringify(output),\n }),\n );\n\n ctx.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Activity processing failed',\n });\n\n // If we have a task token, send failure\n // Note: In a real implementation, you'd want to track the token\n // This is simplified for the example\n\n throw error;\n }\n });\n }\n\n /**\n * Send a task heartbeat\n *\n * For long-running activities, send heartbeats to prevent timeout.\n *\n * @param taskToken - The task token from GetActivityTask\n */\n async sendHeartbeat(taskToken: string): Promise<void> {\n return trace(`stepfunctions.SendTaskHeartbeat`, async (ctx: TraceContext) => {\n ctx.setAttribute('aws.stepfunctions.activity_arn', this.config.activityArn);\n\n try {\n const { SendTaskHeartbeatCommand } = await import('@aws-sdk/client-sfn');\n await this.client.send(new SendTaskHeartbeatCommand({ taskToken }));\n\n ctx.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'SendTaskHeartbeat failed',\n });\n throw error;\n }\n });\n }\n\n /**\n * Send task failure\n *\n * @param taskToken - The task token from GetActivityTask\n * @param error - Error code\n * @param cause - Error cause description\n */\n async sendFailure(\n taskToken: string,\n error: string,\n cause?: string,\n ): Promise<void> {\n return trace(`stepfunctions.SendTaskFailure`, async (ctx: TraceContext) => {\n ctx.setAttribute('aws.stepfunctions.activity_arn', this.config.activityArn);\n ctx.setAttribute('aws.stepfunctions.task_error', error);\n\n try {\n const { SendTaskFailureCommand } = await import('@aws-sdk/client-sfn');\n await this.client.send(\n new SendTaskFailureCommand({\n taskToken,\n error,\n cause,\n }),\n );\n\n ctx.setStatus({ code: SpanStatusCode.OK });\n } catch (error_) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error_ instanceof Error ? error_.message : 'SendTaskFailure failed',\n });\n throw error_;\n }\n });\n }\n}\n"],"mappings":"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"}