autotel-aws 0.2.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 (141) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +540 -0
  3. package/dist/attributes.cjs +49 -0
  4. package/dist/attributes.cjs.map +1 -0
  5. package/dist/attributes.d.cts +117 -0
  6. package/dist/attributes.d.ts +117 -0
  7. package/dist/attributes.js +4 -0
  8. package/dist/attributes.js.map +1 -0
  9. package/dist/chunk-35F3UBOO.cjs +48 -0
  10. package/dist/chunk-35F3UBOO.cjs.map +1 -0
  11. package/dist/chunk-4TGVGEUN.cjs +84 -0
  12. package/dist/chunk-4TGVGEUN.cjs.map +1 -0
  13. package/dist/chunk-CIGXV6HA.js +192 -0
  14. package/dist/chunk-CIGXV6HA.js.map +1 -0
  15. package/dist/chunk-D5INYMRP.cjs +350 -0
  16. package/dist/chunk-D5INYMRP.cjs.map +1 -0
  17. package/dist/chunk-DF5PT3JK.js +387 -0
  18. package/dist/chunk-DF5PT3JK.js.map +1 -0
  19. package/dist/chunk-DGUM43GV.js +10 -0
  20. package/dist/chunk-DGUM43GV.js.map +1 -0
  21. package/dist/chunk-DHHLKZHI.cjs +23 -0
  22. package/dist/chunk-DHHLKZHI.cjs.map +1 -0
  23. package/dist/chunk-FKZOELBT.js +78 -0
  24. package/dist/chunk-FKZOELBT.js.map +1 -0
  25. package/dist/chunk-HMTKKKKP.cjs +390 -0
  26. package/dist/chunk-HMTKKKKP.cjs.map +1 -0
  27. package/dist/chunk-I4CKQ4RD.js +153 -0
  28. package/dist/chunk-I4CKQ4RD.js.map +1 -0
  29. package/dist/chunk-JEQ2X3Z6.cjs +12 -0
  30. package/dist/chunk-JEQ2X3Z6.cjs.map +1 -0
  31. package/dist/chunk-JMSFE6FJ.js +24 -0
  32. package/dist/chunk-JMSFE6FJ.js.map +1 -0
  33. package/dist/chunk-KUIOI74B.cjs +394 -0
  34. package/dist/chunk-KUIOI74B.cjs.map +1 -0
  35. package/dist/chunk-NQ65Y5AI.cjs +195 -0
  36. package/dist/chunk-NQ65Y5AI.cjs.map +1 -0
  37. package/dist/chunk-OB4XTAVK.cjs +345 -0
  38. package/dist/chunk-OB4XTAVK.cjs.map +1 -0
  39. package/dist/chunk-OHFR7WX5.js +341 -0
  40. package/dist/chunk-OHFR7WX5.js.map +1 -0
  41. package/dist/chunk-PZGYL7XZ.js +40 -0
  42. package/dist/chunk-PZGYL7XZ.js.map +1 -0
  43. package/dist/chunk-Q3DMMQ7K.cjs +164 -0
  44. package/dist/chunk-Q3DMMQ7K.cjs.map +1 -0
  45. package/dist/chunk-UZEJV2YD.cjs +139 -0
  46. package/dist/chunk-UZEJV2YD.cjs.map +1 -0
  47. package/dist/chunk-V4IQWFYN.js +341 -0
  48. package/dist/chunk-V4IQWFYN.js.map +1 -0
  49. package/dist/chunk-VZHQH75L.cjs +26 -0
  50. package/dist/chunk-VZHQH75L.cjs.map +1 -0
  51. package/dist/chunk-X6BY6PCK.js +386 -0
  52. package/dist/chunk-X6BY6PCK.js.map +1 -0
  53. package/dist/chunk-YG56NRIO.js +131 -0
  54. package/dist/chunk-YG56NRIO.js.map +1 -0
  55. package/dist/chunk-ZPDRKCAR.js +21 -0
  56. package/dist/chunk-ZPDRKCAR.js.map +1 -0
  57. package/dist/config-C7zV8Zm6.d.cts +125 -0
  58. package/dist/config-DxjTT8jd.d.ts +125 -0
  59. package/dist/dynamodb.cjs +14 -0
  60. package/dist/dynamodb.cjs.map +1 -0
  61. package/dist/dynamodb.d.cts +93 -0
  62. package/dist/dynamodb.d.ts +93 -0
  63. package/dist/dynamodb.js +5 -0
  64. package/dist/dynamodb.js.map +1 -0
  65. package/dist/eventbridge.cjs +279 -0
  66. package/dist/eventbridge.cjs.map +1 -0
  67. package/dist/eventbridge.d.cts +360 -0
  68. package/dist/eventbridge.d.ts +360 -0
  69. package/dist/eventbridge.js +273 -0
  70. package/dist/eventbridge.js.map +1 -0
  71. package/dist/index.cjs +251 -0
  72. package/dist/index.cjs.map +1 -0
  73. package/dist/index.d.cts +126 -0
  74. package/dist/index.d.ts +126 -0
  75. package/dist/index.js +48 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/kinesis.cjs +23 -0
  78. package/dist/kinesis.cjs.map +1 -0
  79. package/dist/kinesis.d.cts +360 -0
  80. package/dist/kinesis.d.ts +360 -0
  81. package/dist/kinesis.js +6 -0
  82. package/dist/kinesis.js.map +1 -0
  83. package/dist/lambda-auto.cjs +19 -0
  84. package/dist/lambda-auto.cjs.map +1 -0
  85. package/dist/lambda-auto.d.cts +2 -0
  86. package/dist/lambda-auto.d.ts +2 -0
  87. package/dist/lambda-auto.js +17 -0
  88. package/dist/lambda-auto.js.map +1 -0
  89. package/dist/lambda.cjs +42 -0
  90. package/dist/lambda.cjs.map +1 -0
  91. package/dist/lambda.d.cts +231 -0
  92. package/dist/lambda.d.ts +231 -0
  93. package/dist/lambda.js +5 -0
  94. package/dist/lambda.js.map +1 -0
  95. package/dist/s3.cjs +14 -0
  96. package/dist/s3.cjs.map +1 -0
  97. package/dist/s3.d.cts +77 -0
  98. package/dist/s3.d.ts +77 -0
  99. package/dist/s3.js +5 -0
  100. package/dist/s3.js.map +1 -0
  101. package/dist/sdk.cjs +31 -0
  102. package/dist/sdk.cjs.map +1 -0
  103. package/dist/sdk.d.cts +155 -0
  104. package/dist/sdk.d.ts +155 -0
  105. package/dist/sdk.js +6 -0
  106. package/dist/sdk.js.map +1 -0
  107. package/dist/sns.cjs +19 -0
  108. package/dist/sns.cjs.map +1 -0
  109. package/dist/sns.d.cts +256 -0
  110. package/dist/sns.d.ts +256 -0
  111. package/dist/sns.js +6 -0
  112. package/dist/sns.js.map +1 -0
  113. package/dist/sqs.cjs +23 -0
  114. package/dist/sqs.cjs.map +1 -0
  115. package/dist/sqs.d.cts +384 -0
  116. package/dist/sqs.d.ts +384 -0
  117. package/dist/sqs.js +6 -0
  118. package/dist/sqs.js.map +1 -0
  119. package/dist/step-functions.cjs +35 -0
  120. package/dist/step-functions.cjs.map +1 -0
  121. package/dist/step-functions.d.cts +423 -0
  122. package/dist/step-functions.d.ts +423 -0
  123. package/dist/step-functions.js +6 -0
  124. package/dist/step-functions.js.map +1 -0
  125. package/dist/testing.cjs +61 -0
  126. package/dist/testing.cjs.map +1 -0
  127. package/dist/testing.d.cts +39 -0
  128. package/dist/testing.d.ts +39 -0
  129. package/dist/testing.js +58 -0
  130. package/dist/testing.js.map +1 -0
  131. package/dist/types-3_ak5jhy.d.cts +76 -0
  132. package/dist/types-3_ak5jhy.d.ts +76 -0
  133. package/dist/types-UiBv_I_M.d.ts +16 -0
  134. package/dist/types-kTFVdSqO.d.cts +16 -0
  135. package/dist/xray.cjs +26 -0
  136. package/dist/xray.cjs.map +1 -0
  137. package/dist/xray.d.cts +23 -0
  138. package/dist/xray.d.ts +23 -0
  139. package/dist/xray.js +5 -0
  140. package/dist/xray.js.map +1 -0
  141. package/package.json +184 -0
@@ -0,0 +1,24 @@
1
+ import { buildDynamoDBAttributes } from './chunk-I4CKQ4RD.js';
2
+ import { trace } from 'autotel';
3
+
4
+ function traceDynamoDB(config) {
5
+ return function wrapper(fn) {
6
+ return trace(
7
+ `dynamodb.${config.operation}`,
8
+ (ctx) => async (...args) => {
9
+ ctx.setAttributes(
10
+ buildDynamoDBAttributes({
11
+ tableName: config.table,
12
+ operation: config.operation
13
+ })
14
+ );
15
+ const handler = fn(ctx);
16
+ return handler(...args);
17
+ }
18
+ );
19
+ };
20
+ }
21
+
22
+ export { traceDynamoDB };
23
+ //# sourceMappingURL=chunk-JMSFE6FJ.js.map
24
+ //# sourceMappingURL=chunk-JMSFE6FJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dynamodb/index.ts"],"names":[],"mappings":";;;AA6FO,SAAS,cAAc,MAAA,EAA6B;AACzD,EAAA,OAAO,SAAS,QACd,EAAA,EACsC;AAEtC,IAAA,OAAO,KAAA;AAAA,MACL,CAAA,SAAA,EAAY,OAAO,SAAS,CAAA,CAAA;AAAA,MAC5B,CAAC,GAAA,KACC,OAAA,GAAU,IAAA,KAAkC;AAE1C,QAAA,GAAA,CAAI,aAAA;AAAA,UACF,uBAAA,CAAwB;AAAA,YACtB,WAAW,MAAA,CAAO,KAAA;AAAA,YAClB,WAAW,MAAA,CAAO;AAAA,WACnB;AAAA,SACH;AAGA,QAAA,MAAM,OAAA,GAAU,GAAG,GAAG,CAAA;AACtB,QAAA,OAAO,OAAA,CAAQ,GAAG,IAAI,CAAA;AAAA,MACxB;AAAA,KACJ;AAAA,EACF,CAAA;AACF","file":"chunk-JMSFE6FJ.js","sourcesContent":["/**\n * DynamoDB-specific instrumentation\n *\n * Provides semantic helpers for tracing DynamoDB operations with proper OpenTelemetry\n * semantic conventions. Automatically sets `db.*` and `aws.dynamodb.*` attributes.\n *\n * @example Basic usage with factory pattern\n * ```typescript\n * import { traceDynamoDB } from 'autotel-aws/dynamodb';\n * import { DynamoDBClient, GetItemCommand } from '@aws-sdk/client-dynamodb';\n *\n * const dynamodb = new DynamoDBClient({});\n *\n * export const getUser = traceDynamoDB({\n * operation: 'GetItem',\n * table: 'users'\n * })(ctx => async (userId: string) => {\n * ctx.setAttribute('db.statement', 'GetItem WHERE id = :id');\n * return await dynamodb.send(new GetItemCommand({\n * TableName: 'users',\n * Key: { id: { S: userId } }\n * }));\n * });\n *\n * // Usage: await getUser('user-123');\n * ```\n *\n * @example Query with consumed capacity tracking\n * ```typescript\n * export const queryOrders = traceDynamoDB({\n * operation: 'Query',\n * table: 'orders'\n * })(ctx => async (customerId: string, limit: number) => {\n * const result = await dynamodb.send(new QueryCommand({\n * TableName: 'orders',\n * KeyConditionExpression: 'customerId = :cid',\n * ExpressionAttributeValues: { ':cid': { S: customerId } },\n * Limit: limit,\n * ReturnConsumedCapacity: 'TOTAL'\n * }));\n *\n * if (result.ConsumedCapacity?.CapacityUnits) {\n * ctx.setAttribute('aws.dynamodb.consumed_capacity', result.ConsumedCapacity.CapacityUnits);\n * }\n *\n * return result.Items;\n * });\n * ```\n */\n\nimport { trace, type TraceContext } from 'autotel';\nimport { buildDynamoDBAttributes } from '../attributes';\n\n/**\n * DynamoDB operation configuration\n */\nexport interface TraceDynamoDBConfig {\n /**\n * DynamoDB operation name (e.g., 'GetItem', 'PutItem', 'Query', 'Scan')\n * Used to generate the span name: `dynamodb.{operation}`\n */\n operation: string;\n\n /**\n * DynamoDB table name.\n * Sets `db.name` and `aws.dynamodb.table_names` attributes.\n */\n table: string;\n}\n\n/**\n * Trace DynamoDB operations with semantic attributes\n *\n * Creates a traced function that automatically sets DynamoDB semantic attributes\n * following OpenTelemetry database semantic conventions.\n *\n * @param config - DynamoDB operation configuration\n * @returns A higher-order function that wraps your DynamoDB operation with tracing\n *\n * @remarks\n * Semantic attributes set automatically:\n * - `db.system` - 'dynamodb'\n * - `db.operation` - The operation name (GetItem, PutItem, etc.)\n * - `db.name` - Table name\n * - `aws.dynamodb.table_names` - Array containing the table name\n *\n * Additional attributes you should set in your handler:\n * - `db.statement` - Query/operation description\n * - `aws.dynamodb.consumed_capacity` - Consumed capacity units\n * - `aws.dynamodb.index_name` - GSI/LSI name if applicable\n *\n * @see https://opentelemetry.io/docs/specs/semconv/database/dynamodb/\n */\nexport function traceDynamoDB(config: TraceDynamoDBConfig) {\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 `dynamodb.${config.operation}`,\n (ctx: TraceContext) =>\n async (...args: TArgs): Promise<TReturn> => {\n // Set DynamoDB semantic attributes\n ctx.setAttributes(\n buildDynamoDBAttributes({\n tableName: config.table,\n operation: config.operation,\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"]}
@@ -0,0 +1,394 @@
1
+ 'use strict';
2
+
3
+ var chunkUZEJV2YD_cjs = require('./chunk-UZEJV2YD.cjs');
4
+ var chunkQ3DMMQ7K_cjs = require('./chunk-Q3DMMQ7K.cjs');
5
+ var autotel = require('autotel');
6
+ var api = require('@opentelemetry/api');
7
+
8
+ function injectTraceContext(input) {
9
+ const carrier = {};
10
+ api.propagation.inject(api.context.active(), carrier);
11
+ if (!carrier.traceparent) {
12
+ return input;
13
+ }
14
+ return {
15
+ ...input,
16
+ _traceContext: {
17
+ traceparent: carrier.traceparent,
18
+ ...carrier.tracestate && { tracestate: carrier.tracestate },
19
+ ...carrier.baggage && { baggage: carrier.baggage }
20
+ }
21
+ };
22
+ }
23
+ function extractStepFunctionsContext(input) {
24
+ if (typeof input !== "object" || input === null || !("_traceContext" in input)) {
25
+ return void 0;
26
+ }
27
+ const traceContext = input._traceContext;
28
+ if (!traceContext?.traceparent) {
29
+ return void 0;
30
+ }
31
+ const carrier = {
32
+ traceparent: traceContext.traceparent,
33
+ ...traceContext.tracestate && { tracestate: traceContext.tracestate },
34
+ ...traceContext.baggage && { baggage: traceContext.baggage }
35
+ };
36
+ const extractedContext = api.propagation.extract(api.context.active(), carrier);
37
+ const span = extractedContext.getValue(Symbol.for("OpenTelemetry Context Key SPAN"));
38
+ if (span && typeof span === "object") {
39
+ if ("spanContext" in span && typeof span.spanContext === "function") {
40
+ return span.spanContext();
41
+ }
42
+ if ("traceId" in span && "spanId" in span) {
43
+ return span;
44
+ }
45
+ }
46
+ return void 0;
47
+ }
48
+ function stripTraceContext(input) {
49
+ const { _traceContext: _, ...rest } = input;
50
+ return rest;
51
+ }
52
+ function traceStepFunction(config) {
53
+ const operation = config.operation ?? "execute";
54
+ return function wrapper(fn) {
55
+ return autotel.trace(
56
+ `stepfunctions.${operation}`,
57
+ (ctx) => async (...args) => {
58
+ ctx.setAttributes(
59
+ chunkQ3DMMQ7K_cjs.buildStepFunctionsAttributes({
60
+ stateMachineArn: config.stateMachineArn
61
+ })
62
+ );
63
+ const handler = fn(ctx);
64
+ return handler(...args);
65
+ }
66
+ );
67
+ };
68
+ }
69
+ var StepFunctionsExecutor = class {
70
+ client;
71
+ config;
72
+ stateMachineName;
73
+ constructor(client, config) {
74
+ this.client = chunkUZEJV2YD_cjs.wrapSDKClient(client, config.service);
75
+ this.config = {
76
+ injectTraceContext: true,
77
+ ...config
78
+ };
79
+ this.stateMachineName = config.stateMachineArn.split(":").pop() || "unknown";
80
+ }
81
+ /**
82
+ * Start a new execution of the state machine
83
+ *
84
+ * @param execution - Execution input and optional name
85
+ * @returns Promise with execution ARN and start date
86
+ */
87
+ async startExecution(execution) {
88
+ return autotel.trace(`stepfunctions.StartExecution`, async (ctx) => {
89
+ ctx.setAttributes(
90
+ chunkQ3DMMQ7K_cjs.buildStepFunctionsAttributes({
91
+ stateMachineArn: this.config.stateMachineArn
92
+ })
93
+ );
94
+ ctx.setAttribute("aws.stepfunctions.state_machine_name", this.stateMachineName);
95
+ if (execution.name) {
96
+ ctx.setAttribute("aws.stepfunctions.execution_name", execution.name);
97
+ }
98
+ const inputData = this.config.injectTraceContext ? injectTraceContext(execution.input) : execution.input;
99
+ const input = {
100
+ stateMachineArn: this.config.stateMachineArn,
101
+ input: JSON.stringify(inputData),
102
+ name: execution.name,
103
+ traceHeader: execution.traceHeader
104
+ };
105
+ try {
106
+ const { StartExecutionCommand } = await import('@aws-sdk/client-sfn');
107
+ const result = await this.client.send(new StartExecutionCommand(input));
108
+ if (result.executionArn) {
109
+ ctx.setAttribute("aws.stepfunctions.execution_arn", result.executionArn);
110
+ }
111
+ ctx.setStatus({ code: api.SpanStatusCode.OK });
112
+ return {
113
+ executionArn: result.executionArn,
114
+ startDate: result.startDate
115
+ };
116
+ } catch (error) {
117
+ ctx.setStatus({
118
+ code: api.SpanStatusCode.ERROR,
119
+ message: error instanceof Error ? error.message : "StartExecution failed"
120
+ });
121
+ throw error;
122
+ }
123
+ });
124
+ }
125
+ /**
126
+ * Start a synchronous execution (Express workflows only)
127
+ *
128
+ * @param execution - Execution input and optional name
129
+ * @returns Promise with execution result including output
130
+ */
131
+ async startSyncExecution(execution) {
132
+ return autotel.trace(`stepfunctions.StartSyncExecution`, async (ctx) => {
133
+ ctx.setAttributes(
134
+ chunkQ3DMMQ7K_cjs.buildStepFunctionsAttributes({
135
+ stateMachineArn: this.config.stateMachineArn
136
+ })
137
+ );
138
+ ctx.setAttribute("aws.stepfunctions.state_machine_name", this.stateMachineName);
139
+ ctx.setAttribute("aws.stepfunctions.execution_type", "express");
140
+ if (execution.name) {
141
+ ctx.setAttribute("aws.stepfunctions.execution_name", execution.name);
142
+ }
143
+ const inputData = this.config.injectTraceContext ? injectTraceContext(execution.input) : execution.input;
144
+ const input = {
145
+ stateMachineArn: this.config.stateMachineArn,
146
+ input: JSON.stringify(inputData),
147
+ name: execution.name,
148
+ traceHeader: execution.traceHeader
149
+ };
150
+ try {
151
+ const { StartSyncExecutionCommand } = await import('@aws-sdk/client-sfn');
152
+ const result = await this.client.send(new StartSyncExecutionCommand(input));
153
+ if (result.executionArn) {
154
+ ctx.setAttribute("aws.stepfunctions.execution_arn", result.executionArn);
155
+ }
156
+ if (result.status) {
157
+ ctx.setAttribute("aws.stepfunctions.execution_status", result.status);
158
+ }
159
+ if (result.status === "FAILED" || result.status === "TIMED_OUT") {
160
+ ctx.setStatus({
161
+ code: api.SpanStatusCode.ERROR,
162
+ message: result.error || result.status
163
+ });
164
+ } else {
165
+ ctx.setStatus({ code: api.SpanStatusCode.OK });
166
+ }
167
+ return {
168
+ executionArn: result.executionArn,
169
+ status: result.status,
170
+ output: result.output,
171
+ error: result.error,
172
+ cause: result.cause,
173
+ billingDetails: result.billingDetails ? {
174
+ billedMemoryUsedInMB: result.billingDetails.billedMemoryUsedInMB,
175
+ billedDurationInMilliseconds: result.billingDetails.billedDurationInMilliseconds
176
+ } : void 0
177
+ };
178
+ } catch (error) {
179
+ ctx.setStatus({
180
+ code: api.SpanStatusCode.ERROR,
181
+ message: error instanceof Error ? error.message : "StartSyncExecution failed"
182
+ });
183
+ throw error;
184
+ }
185
+ });
186
+ }
187
+ /**
188
+ * Describe an execution
189
+ *
190
+ * @param executionArn - ARN of the execution to describe
191
+ * @returns Promise with execution details
192
+ */
193
+ async describeExecution(executionArn) {
194
+ return autotel.trace(`stepfunctions.DescribeExecution`, async (ctx) => {
195
+ ctx.setAttributes(
196
+ chunkQ3DMMQ7K_cjs.buildStepFunctionsAttributes({
197
+ stateMachineArn: this.config.stateMachineArn
198
+ })
199
+ );
200
+ ctx.setAttribute("aws.stepfunctions.execution_arn", executionArn);
201
+ try {
202
+ const { DescribeExecutionCommand } = await import('@aws-sdk/client-sfn');
203
+ const result = await this.client.send(
204
+ new DescribeExecutionCommand({ executionArn })
205
+ );
206
+ if (result.status) {
207
+ ctx.setAttribute("aws.stepfunctions.execution_status", result.status);
208
+ }
209
+ ctx.setStatus({ code: api.SpanStatusCode.OK });
210
+ return {
211
+ executionArn: result.executionArn,
212
+ stateMachineArn: result.stateMachineArn,
213
+ name: result.name,
214
+ status: result.status,
215
+ startDate: result.startDate,
216
+ stopDate: result.stopDate,
217
+ input: result.input,
218
+ output: result.output,
219
+ error: result.error,
220
+ cause: result.cause
221
+ };
222
+ } catch (error) {
223
+ ctx.setStatus({
224
+ code: api.SpanStatusCode.ERROR,
225
+ message: error instanceof Error ? error.message : "DescribeExecution failed"
226
+ });
227
+ throw error;
228
+ }
229
+ });
230
+ }
231
+ /**
232
+ * Stop an execution
233
+ *
234
+ * @param executionArn - ARN of the execution to stop
235
+ * @param options - Optional error and cause for the stop
236
+ * @returns Promise with stop date
237
+ */
238
+ async stopExecution(executionArn, options) {
239
+ return autotel.trace(`stepfunctions.StopExecution`, async (ctx) => {
240
+ ctx.setAttributes(
241
+ chunkQ3DMMQ7K_cjs.buildStepFunctionsAttributes({
242
+ stateMachineArn: this.config.stateMachineArn
243
+ })
244
+ );
245
+ ctx.setAttribute("aws.stepfunctions.execution_arn", executionArn);
246
+ try {
247
+ const { StopExecutionCommand } = await import('@aws-sdk/client-sfn');
248
+ const result = await this.client.send(
249
+ new StopExecutionCommand({
250
+ executionArn,
251
+ error: options?.error,
252
+ cause: options?.cause
253
+ })
254
+ );
255
+ ctx.setStatus({ code: api.SpanStatusCode.OK });
256
+ return { stopDate: result.stopDate };
257
+ } catch (error) {
258
+ ctx.setStatus({
259
+ code: api.SpanStatusCode.ERROR,
260
+ message: error instanceof Error ? error.message : "StopExecution failed"
261
+ });
262
+ throw error;
263
+ }
264
+ });
265
+ }
266
+ };
267
+ var StepFunctionsActivityWorker = class {
268
+ client;
269
+ config;
270
+ activityName;
271
+ constructor(client, config) {
272
+ this.client = chunkUZEJV2YD_cjs.wrapSDKClient(client, config.service);
273
+ this.config = {
274
+ extractTraceContext: true,
275
+ ...config
276
+ };
277
+ this.activityName = config.activityArn.split(":").pop() || "unknown";
278
+ }
279
+ /**
280
+ * Poll for an activity task and process it
281
+ *
282
+ * @param processor - Function to process the task input
283
+ * @returns Promise that resolves when the task is processed
284
+ */
285
+ async poll(processor) {
286
+ return autotel.trace(`stepfunctions.activity.poll`, async (ctx) => {
287
+ ctx.setAttribute("aws.stepfunctions.activity_arn", this.config.activityArn);
288
+ ctx.setAttribute("aws.stepfunctions.activity_name", this.activityName);
289
+ if (this.config.workerName) {
290
+ ctx.setAttribute("aws.stepfunctions.worker_name", this.config.workerName);
291
+ }
292
+ try {
293
+ const { GetActivityTaskCommand } = await import('@aws-sdk/client-sfn');
294
+ const task = await this.client.send(
295
+ new GetActivityTaskCommand({
296
+ activityArn: this.config.activityArn,
297
+ workerName: this.config.workerName
298
+ })
299
+ );
300
+ if (!task.taskToken || !task.input) {
301
+ ctx.setAttribute("aws.stepfunctions.activity_task_received", false);
302
+ ctx.setStatus({ code: api.SpanStatusCode.OK });
303
+ return;
304
+ }
305
+ ctx.setAttribute("aws.stepfunctions.activity_task_received", true);
306
+ const rawInput = JSON.parse(task.input);
307
+ if (this.config.extractTraceContext) {
308
+ const parentContext = extractStepFunctionsContext(rawInput);
309
+ if (parentContext) {
310
+ ctx.setAttribute("aws.stepfunctions.trace_context_extracted", true);
311
+ }
312
+ }
313
+ const cleanInput = stripTraceContext(rawInput);
314
+ const output = await processor(cleanInput, task.taskToken, ctx);
315
+ const { SendTaskSuccessCommand } = await import('@aws-sdk/client-sfn');
316
+ await this.client.send(
317
+ new SendTaskSuccessCommand({
318
+ taskToken: task.taskToken,
319
+ output: JSON.stringify(output)
320
+ })
321
+ );
322
+ ctx.setStatus({ code: api.SpanStatusCode.OK });
323
+ } catch (error) {
324
+ ctx.setStatus({
325
+ code: api.SpanStatusCode.ERROR,
326
+ message: error instanceof Error ? error.message : "Activity processing failed"
327
+ });
328
+ throw error;
329
+ }
330
+ });
331
+ }
332
+ /**
333
+ * Send a task heartbeat
334
+ *
335
+ * For long-running activities, send heartbeats to prevent timeout.
336
+ *
337
+ * @param taskToken - The task token from GetActivityTask
338
+ */
339
+ async sendHeartbeat(taskToken) {
340
+ return autotel.trace(`stepfunctions.SendTaskHeartbeat`, async (ctx) => {
341
+ ctx.setAttribute("aws.stepfunctions.activity_arn", this.config.activityArn);
342
+ try {
343
+ const { SendTaskHeartbeatCommand } = await import('@aws-sdk/client-sfn');
344
+ await this.client.send(new SendTaskHeartbeatCommand({ taskToken }));
345
+ ctx.setStatus({ code: api.SpanStatusCode.OK });
346
+ } catch (error) {
347
+ ctx.setStatus({
348
+ code: api.SpanStatusCode.ERROR,
349
+ message: error instanceof Error ? error.message : "SendTaskHeartbeat failed"
350
+ });
351
+ throw error;
352
+ }
353
+ });
354
+ }
355
+ /**
356
+ * Send task failure
357
+ *
358
+ * @param taskToken - The task token from GetActivityTask
359
+ * @param error - Error code
360
+ * @param cause - Error cause description
361
+ */
362
+ async sendFailure(taskToken, error, cause) {
363
+ return autotel.trace(`stepfunctions.SendTaskFailure`, async (ctx) => {
364
+ ctx.setAttribute("aws.stepfunctions.activity_arn", this.config.activityArn);
365
+ ctx.setAttribute("aws.stepfunctions.task_error", error);
366
+ try {
367
+ const { SendTaskFailureCommand } = await import('@aws-sdk/client-sfn');
368
+ await this.client.send(
369
+ new SendTaskFailureCommand({
370
+ taskToken,
371
+ error,
372
+ cause
373
+ })
374
+ );
375
+ ctx.setStatus({ code: api.SpanStatusCode.OK });
376
+ } catch (error_) {
377
+ ctx.setStatus({
378
+ code: api.SpanStatusCode.ERROR,
379
+ message: error_ instanceof Error ? error_.message : "SendTaskFailure failed"
380
+ });
381
+ throw error_;
382
+ }
383
+ });
384
+ }
385
+ };
386
+
387
+ exports.StepFunctionsActivityWorker = StepFunctionsActivityWorker;
388
+ exports.StepFunctionsExecutor = StepFunctionsExecutor;
389
+ exports.extractStepFunctionsContext = extractStepFunctionsContext;
390
+ exports.injectTraceContext = injectTraceContext;
391
+ exports.stripTraceContext = stripTraceContext;
392
+ exports.traceStepFunction = traceStepFunction;
393
+ //# sourceMappingURL=chunk-KUIOI74B.cjs.map
394
+ //# sourceMappingURL=chunk-KUIOI74B.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/step-functions/index.ts"],"names":["propagation","context","trace","buildStepFunctionsAttributes","wrapSDKClient","SpanStatusCode"],"mappings":"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","file":"chunk-KUIOI74B.cjs","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"]}