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,341 @@
1
+ import { wrapSDKClient } from './chunk-YG56NRIO.js';
2
+ import { buildSQSAttributes } from './chunk-I4CKQ4RD.js';
3
+ import { trace } from 'autotel';
4
+ import { propagation, context, SpanStatusCode } from '@opentelemetry/api';
5
+
6
+ function traceSQS(config) {
7
+ return function wrapper(fn) {
8
+ return trace(
9
+ `sqs.${config.operation}`,
10
+ (ctx) => async (...args) => {
11
+ ctx.setAttributes(
12
+ buildSQSAttributes({
13
+ queueName: config.queueName,
14
+ queueUrl: config.queueUrl,
15
+ operation: config.operation
16
+ })
17
+ );
18
+ const handler = fn(ctx);
19
+ return handler(...args);
20
+ }
21
+ );
22
+ };
23
+ }
24
+ var SQSProducer = class {
25
+ client;
26
+ config;
27
+ queueName;
28
+ constructor(client, config) {
29
+ this.client = wrapSDKClient(client, config.service);
30
+ this.config = {
31
+ injectTraceContext: true,
32
+ ...config
33
+ };
34
+ this.queueName = config.queueUrl.split("/").pop() || "unknown";
35
+ }
36
+ /**
37
+ * Inject trace context into message attributes
38
+ */
39
+ injectContext(attributes) {
40
+ if (!this.config.injectTraceContext) {
41
+ return attributes || {};
42
+ }
43
+ const carrier = {};
44
+ propagation.inject(context.active(), carrier);
45
+ const result = { ...attributes };
46
+ if (carrier.traceparent) {
47
+ result.traceparent = { StringValue: carrier.traceparent, DataType: "String" };
48
+ }
49
+ if (carrier.tracestate) {
50
+ result.tracestate = { StringValue: carrier.tracestate, DataType: "String" };
51
+ }
52
+ if (carrier.baggage) {
53
+ result.baggage = { StringValue: carrier.baggage, DataType: "String" };
54
+ }
55
+ return result;
56
+ }
57
+ /**
58
+ * Send a single message to the queue
59
+ *
60
+ * @param message - Message to send
61
+ * @returns Promise with message ID and other metadata
62
+ */
63
+ async send(message) {
64
+ return trace(`sqs.send`, async (ctx) => {
65
+ ctx.setAttributes(
66
+ buildSQSAttributes({
67
+ queueName: this.queueName,
68
+ queueUrl: this.config.queueUrl,
69
+ operation: "send"
70
+ })
71
+ );
72
+ const input = {
73
+ QueueUrl: this.config.queueUrl,
74
+ MessageBody: message.body,
75
+ MessageAttributes: this.injectContext(message.attributes),
76
+ ...message.messageGroupId && { MessageGroupId: message.messageGroupId },
77
+ ...message.messageDeduplicationId && {
78
+ MessageDeduplicationId: message.messageDeduplicationId
79
+ },
80
+ ...message.delaySeconds !== void 0 && { DelaySeconds: message.delaySeconds }
81
+ };
82
+ try {
83
+ const { SendMessageCommand } = await import('@aws-sdk/client-sqs');
84
+ const result = await this.client.send(new SendMessageCommand(input));
85
+ if (result.MessageId) {
86
+ ctx.setAttribute("messaging.message.id", result.MessageId);
87
+ }
88
+ ctx.setStatus({ code: SpanStatusCode.OK });
89
+ return {
90
+ messageId: result.MessageId,
91
+ sequenceNumber: result.SequenceNumber,
92
+ md5OfMessageBody: result.MD5OfMessageBody
93
+ };
94
+ } catch (error) {
95
+ ctx.setStatus({
96
+ code: SpanStatusCode.ERROR,
97
+ message: error instanceof Error ? error.message : "Send failed"
98
+ });
99
+ throw error;
100
+ }
101
+ });
102
+ }
103
+ /**
104
+ * Send multiple messages in a batch
105
+ *
106
+ * @param messages - Array of messages to send (max 10)
107
+ * @returns Promise with successful and failed message results
108
+ */
109
+ async sendBatch(messages) {
110
+ return trace(`sqs.sendBatch`, async (ctx) => {
111
+ ctx.setAttributes(
112
+ buildSQSAttributes({
113
+ queueName: this.queueName,
114
+ queueUrl: this.config.queueUrl,
115
+ operation: "send"
116
+ })
117
+ );
118
+ ctx.setAttribute("messaging.batch.message_count", messages.length);
119
+ const entries = messages.map((message, index) => ({
120
+ Id: String(index),
121
+ MessageBody: message.body,
122
+ MessageAttributes: this.injectContext(message.attributes),
123
+ ...message.messageGroupId && { MessageGroupId: message.messageGroupId },
124
+ ...message.messageDeduplicationId && {
125
+ MessageDeduplicationId: message.messageDeduplicationId
126
+ },
127
+ ...message.delaySeconds !== void 0 && { DelaySeconds: message.delaySeconds }
128
+ }));
129
+ try {
130
+ const { SendMessageBatchCommand } = await import('@aws-sdk/client-sqs');
131
+ const result = await this.client.send(
132
+ new SendMessageBatchCommand({
133
+ QueueUrl: this.config.queueUrl,
134
+ Entries: entries
135
+ })
136
+ );
137
+ const successful = result.Successful?.map((s) => ({
138
+ id: s.Id,
139
+ messageId: s.MessageId,
140
+ sequenceNumber: s.SequenceNumber
141
+ })) || [];
142
+ const failed = result.Failed?.map((f) => ({
143
+ id: f.Id,
144
+ code: f.Code,
145
+ message: f.Message
146
+ })) || [];
147
+ ctx.setAttribute("messaging.sqs.successful_count", successful.length);
148
+ ctx.setAttribute("messaging.sqs.failed_count", failed.length);
149
+ if (failed.length > 0) {
150
+ ctx.setStatus({
151
+ code: SpanStatusCode.ERROR,
152
+ message: `${failed.length} messages failed`
153
+ });
154
+ } else {
155
+ ctx.setStatus({ code: SpanStatusCode.OK });
156
+ }
157
+ return { successful, failed };
158
+ } catch (error) {
159
+ ctx.setStatus({
160
+ code: SpanStatusCode.ERROR,
161
+ message: error instanceof Error ? error.message : "Batch send failed"
162
+ });
163
+ throw error;
164
+ }
165
+ });
166
+ }
167
+ };
168
+ var SQSConsumer = class {
169
+ client;
170
+ config;
171
+ queueName;
172
+ constructor(client, config) {
173
+ this.client = wrapSDKClient(client, config.service);
174
+ this.config = {
175
+ extractTraceContext: true,
176
+ maxMessages: 10,
177
+ visibilityTimeout: 30,
178
+ waitTimeSeconds: 20,
179
+ ...config
180
+ };
181
+ this.queueName = config.queueUrl.split("/").pop() || "unknown";
182
+ }
183
+ /**
184
+ * Extract trace context from message attributes
185
+ */
186
+ extractContext(messageAttributes) {
187
+ if (!this.config.extractTraceContext || !messageAttributes) {
188
+ return void 0;
189
+ }
190
+ const carrier = {};
191
+ if (messageAttributes.traceparent?.StringValue) {
192
+ carrier.traceparent = messageAttributes.traceparent.StringValue;
193
+ }
194
+ if (messageAttributes.tracestate?.StringValue) {
195
+ carrier.tracestate = messageAttributes.tracestate.StringValue;
196
+ }
197
+ if (messageAttributes.baggage?.StringValue) {
198
+ carrier.baggage = messageAttributes.baggage.StringValue;
199
+ }
200
+ return Object.keys(carrier).length > 0 ? carrier : void 0;
201
+ }
202
+ /**
203
+ * Parse AWS SDK message into our format
204
+ */
205
+ parseMessage(message) {
206
+ const attributes = {};
207
+ if (message.MessageAttributes) {
208
+ for (const [key, value] of Object.entries(message.MessageAttributes)) {
209
+ attributes[key] = value.StringValue || "";
210
+ }
211
+ }
212
+ return {
213
+ messageId: message.MessageId || "",
214
+ receiptHandle: message.ReceiptHandle || "",
215
+ body: message.Body || "",
216
+ attributes,
217
+ systemAttributes: message.Attributes || {},
218
+ raw: message
219
+ };
220
+ }
221
+ /**
222
+ * Receive messages from the queue
223
+ *
224
+ * @returns Array of received messages
225
+ */
226
+ async receive() {
227
+ return trace(`sqs.receive`, async (ctx) => {
228
+ ctx.setAttributes(
229
+ buildSQSAttributes({
230
+ queueName: this.queueName,
231
+ queueUrl: this.config.queueUrl,
232
+ operation: "receive"
233
+ })
234
+ );
235
+ try {
236
+ const { ReceiveMessageCommand } = await import('@aws-sdk/client-sqs');
237
+ const result = await this.client.send(
238
+ new ReceiveMessageCommand({
239
+ QueueUrl: this.config.queueUrl,
240
+ MaxNumberOfMessages: this.config.maxMessages,
241
+ VisibilityTimeout: this.config.visibilityTimeout,
242
+ WaitTimeSeconds: this.config.waitTimeSeconds,
243
+ MessageAttributeNames: ["All"],
244
+ AttributeNames: ["All"]
245
+ })
246
+ );
247
+ const messages = (result.Messages || []).map((m) => this.parseMessage(m));
248
+ ctx.setAttribute("messaging.batch.message_count", messages.length);
249
+ ctx.setStatus({ code: SpanStatusCode.OK });
250
+ return messages;
251
+ } catch (error) {
252
+ ctx.setStatus({
253
+ code: SpanStatusCode.ERROR,
254
+ message: error instanceof Error ? error.message : "Receive failed"
255
+ });
256
+ throw error;
257
+ }
258
+ });
259
+ }
260
+ /**
261
+ * Delete a message from the queue
262
+ *
263
+ * @param receiptHandle - Receipt handle of the message to delete
264
+ */
265
+ async delete(receiptHandle) {
266
+ const { DeleteMessageCommand } = await import('@aws-sdk/client-sqs');
267
+ await this.client.send(
268
+ new DeleteMessageCommand({
269
+ QueueUrl: this.config.queueUrl,
270
+ ReceiptHandle: receiptHandle
271
+ })
272
+ );
273
+ }
274
+ /**
275
+ * Process messages with automatic trace context extraction
276
+ *
277
+ * Receives messages, processes each with the provided handler,
278
+ * and deletes successfully processed messages.
279
+ *
280
+ * @param processor - Function to process each message
281
+ * @returns Number of messages processed
282
+ */
283
+ async processMessages(processor) {
284
+ const messages = await this.receive();
285
+ let processed = 0;
286
+ for (const message of messages) {
287
+ const carrier = this.extractContext(message.raw.MessageAttributes);
288
+ const processMessage = async () => {
289
+ return trace(`sqs.process`, async (ctx) => {
290
+ ctx.setAttributes(
291
+ buildSQSAttributes({
292
+ queueName: this.queueName,
293
+ queueUrl: this.config.queueUrl,
294
+ operation: "receive"
295
+ })
296
+ );
297
+ ctx.setAttribute("messaging.message.id", message.messageId);
298
+ try {
299
+ await processor(message, ctx);
300
+ await this.delete(message.receiptHandle);
301
+ processed++;
302
+ ctx.setStatus({ code: SpanStatusCode.OK });
303
+ } catch (error) {
304
+ ctx.setStatus({
305
+ code: SpanStatusCode.ERROR,
306
+ message: error instanceof Error ? error.message : "Processing failed"
307
+ });
308
+ throw error;
309
+ }
310
+ });
311
+ };
312
+ if (carrier) {
313
+ const extractedContext = propagation.extract(context.active(), carrier);
314
+ await context.with(extractedContext, processMessage);
315
+ } else {
316
+ await processMessage();
317
+ }
318
+ }
319
+ return processed;
320
+ }
321
+ /**
322
+ * Start continuous polling loop
323
+ *
324
+ * @param processor - Function to process each message
325
+ * @param options - Polling options including abort signal
326
+ */
327
+ async poll(processor, options) {
328
+ while (!options?.signal?.aborted) {
329
+ try {
330
+ await this.processMessages(processor);
331
+ } catch (error) {
332
+ console.error("[SQSConsumer] Error processing messages:", error);
333
+ await new Promise((resolve) => setTimeout(resolve, 1e3));
334
+ }
335
+ }
336
+ }
337
+ };
338
+
339
+ export { SQSConsumer, SQSProducer, traceSQS };
340
+ //# sourceMappingURL=chunk-OHFR7WX5.js.map
341
+ //# sourceMappingURL=chunk-OHFR7WX5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/sqs/index.ts"],"names":[],"mappings":";;;;;AAsGO,SAAS,SAAS,MAAA,EAAwB;AAC/C,EAAA,OAAO,SAAS,QACd,EAAA,EACsC;AAEtC,IAAA,OAAO,KAAA;AAAA,MACL,CAAA,IAAA,EAAO,OAAO,SAAS,CAAA,CAAA;AAAA,MACvB,CAAC,GAAA,KACC,OAAA,GAAU,IAAA,KAAkC;AAE1C,QAAA,GAAA,CAAI,aAAA;AAAA,UACF,kBAAA,CAAmB;AAAA,YACjB,WAAW,MAAA,CAAO,SAAA;AAAA,YAClB,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,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;AAsGO,IAAM,cAAN,MAGL;AAAA,EACQ,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EAER,WAAA,CAAY,QAAiB,MAAA,EAA2B;AAEtD,IAAA,IAAA,CAAK,MAAA,GAAS,aAAA,CAAc,MAAA,EAAe,MAAA,CAAO,OAAO,CAAA;AACzD,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,kBAAA,EAAoB,IAAA;AAAA,MACpB,GAAG;AAAA,KACL;AAEA,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,QAAA,CAAS,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,SAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKQ,cACN,UAAA,EAC2D;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,kBAAA,EAAoB;AACnC,MAAA,OAAO,cAAc,EAAC;AAAA,IACxB;AAEA,IAAA,MAAM,UAAkC,EAAC;AACzC,IAAA,WAAA,CAAY,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAO,EAAG,OAAO,CAAA;AAE5C,IAAA,MAAM,MAAA,GAAS,EAAE,GAAG,UAAA,EAAW;AAE/B,IAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,MAAA,MAAA,CAAO,cAAc,EAAE,WAAA,EAAa,OAAA,CAAQ,WAAA,EAAa,UAAU,QAAA,EAAS;AAAA,IAC9E;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,MAAA,CAAO,aAAa,EAAE,WAAA,EAAa,OAAA,CAAQ,UAAA,EAAY,UAAU,QAAA,EAAS;AAAA,IAC5E;AACA,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,MAAA,CAAO,UAAU,EAAE,WAAA,EAAa,OAAA,CAAQ,OAAA,EAAS,UAAU,QAAA,EAAS;AAAA,IACtE;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK,OAAA,EAIR;AACD,IAAA,OAAO,KAAA,CAAM,CAAA,QAAA,CAAA,EAAY,OAAO,GAAA,KAAsB;AACpD,MAAA,GAAA,CAAI,aAAA;AAAA,QACF,kBAAA,CAAmB;AAAA,UACjB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,UACtB,SAAA,EAAW;AAAA,SACZ;AAAA,OACH;AAGA,MAAA,MAAM,KAAA,GAAQ;AAAA,QACZ,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,QACtB,aAAa,OAAA,CAAQ,IAAA;AAAA,QACrB,iBAAA,EAAmB,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,UAAU,CAAA;AAAA,QACxD,GAAI,OAAA,CAAQ,cAAA,IAAkB,EAAE,cAAA,EAAgB,QAAQ,cAAA,EAAe;AAAA,QACvE,GAAI,QAAQ,sBAAA,IAA0B;AAAA,UACpC,wBAAwB,OAAA,CAAQ;AAAA,SAClC;AAAA,QACA,GAAI,OAAA,CAAQ,YAAA,KAAiB,UAAa,EAAE,YAAA,EAAc,QAAQ,YAAA;AAAa,OACjF;AAGA,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,kBAAA,EAAmB,GAAI,MAAM,OAAO,qBAAqB,CAAA;AACjE,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,KAAK,IAAI,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAEnE,QAAA,IAAI,OAAO,SAAA,EAAW;AACpB,UAAA,GAAA,CAAI,YAAA,CAAa,sBAAA,EAAwB,MAAA,CAAO,SAAS,CAAA;AAAA,QAC3D;AAEA,QAAA,GAAA,CAAI,SAAA,CAAU,EAAE,IAAA,EAAM,cAAA,CAAe,IAAI,CAAA;AAEzC,QAAA,OAAO;AAAA,UACL,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,gBAAgB,MAAA,CAAO,cAAA;AAAA,UACvB,kBAAkB,MAAA,CAAO;AAAA,SAC3B;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,SAAA,CAAU;AAAA,UACZ,MAAM,cAAA,CAAe,KAAA;AAAA,UACrB,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,SACnD,CAAA;AACD,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,UAAU,QAAA,EAGb;AACD,IAAA,OAAO,KAAA,CAAM,CAAA,aAAA,CAAA,EAAiB,OAAO,GAAA,KAAsB;AACzD,MAAA,GAAA,CAAI,aAAA;AAAA,QACF,kBAAA,CAAmB;AAAA,UACjB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,UACtB,SAAA,EAAW;AAAA,SACZ;AAAA,OACH;AACA,MAAA,GAAA,CAAI,YAAA,CAAa,+BAAA,EAAiC,QAAA,CAAS,MAAM,CAAA;AAGjE,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,CAAC,SAAS,KAAA,MAAW;AAAA,QAChD,EAAA,EAAI,OAAO,KAAK,CAAA;AAAA,QAChB,aAAa,OAAA,CAAQ,IAAA;AAAA,QACrB,iBAAA,EAAmB,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,UAAU,CAAA;AAAA,QACxD,GAAI,OAAA,CAAQ,cAAA,IAAkB,EAAE,cAAA,EAAgB,QAAQ,cAAA,EAAe;AAAA,QACvE,GAAI,QAAQ,sBAAA,IAA0B;AAAA,UACpC,wBAAwB,OAAA,CAAQ;AAAA,SAClC;AAAA,QACA,GAAI,OAAA,CAAQ,YAAA,KAAiB,UAAa,EAAE,YAAA,EAAc,QAAQ,YAAA;AAAa,OACjF,CAAE,CAAA;AAEF,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,uBAAA,EAAwB,GAAI,MAAM,OAAO,qBAAqB,CAAA;AACtE,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UAC/B,IAAI,uBAAA,CAAwB;AAAA,YAC1B,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,YACtB,OAAA,EAAS;AAAA,WACV;AAAA,SACH;AAEA,QAAA,MAAM,UAAA,GACJ,MAAA,CAAO,UAAA,EAAY,GAAA,CAAI,CAAC,CAAA,MAAqE;AAAA,UAC3F,IAAI,CAAA,CAAE,EAAA;AAAA,UACN,WAAW,CAAA,CAAE,SAAA;AAAA,UACb,gBAAgB,CAAA,CAAE;AAAA,SACpB,CAAE,KAAK,EAAC;AAEV,QAAA,MAAM,MAAA,GACJ,MAAA,CAAO,MAAA,EAAQ,GAAA,CAAI,CAAC,CAAA,MAAyD;AAAA,UAC3E,IAAI,CAAA,CAAE,EAAA;AAAA,UACN,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,SAAS,CAAA,CAAE;AAAA,SACb,CAAE,KAAK,EAAC;AAEV,QAAA,GAAA,CAAI,YAAA,CAAa,gCAAA,EAAkC,UAAA,CAAW,MAAM,CAAA;AACpE,QAAA,GAAA,CAAI,YAAA,CAAa,4BAAA,EAA8B,MAAA,CAAO,MAAM,CAAA;AAE5D,QAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,UAAA,GAAA,CAAI,SAAA,CAAU;AAAA,YACZ,MAAM,cAAA,CAAe,KAAA;AAAA,YACrB,OAAA,EAAS,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,gBAAA;AAAA,WAC1B,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,SAAA,CAAU,EAAE,IAAA,EAAM,cAAA,CAAe,IAAI,CAAA;AAAA,QAC3C;AAEA,QAAA,OAAO,EAAE,YAAY,MAAA,EAAO;AAAA,MAC9B,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,SAAA,CAAU;AAAA,UACZ,MAAM,cAAA,CAAe,KAAA;AAAA,UACrB,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,SACnD,CAAA;AACD,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACF;AAiIO,IAAM,cAAN,MAGL;AAAA,EACQ,MAAA;AAAA,EACA,MAAA;AAAA,EAIA,SAAA;AAAA,EAER,WAAA,CAAY,QAAiB,MAAA,EAA2B;AACtD,IAAA,IAAA,CAAK,MAAA,GAAS,aAAA,CAAc,MAAA,EAAe,MAAA,CAAO,OAAO,CAAA;AACzD,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,mBAAA,EAAqB,IAAA;AAAA,MACrB,WAAA,EAAa,EAAA;AAAA,MACb,iBAAA,EAAmB,EAAA;AAAA,MACnB,eAAA,EAAiB,EAAA;AAAA,MACjB,GAAG;AAAA,KACL;AACA,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,QAAA,CAAS,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,SAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,iBAAA,EAA4D;AACjF,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,mBAAA,IAAuB,CAAC,iBAAA,EAAmB;AAC1D,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,UAAkC,EAAC;AAEzC,IAAA,IAAI,iBAAA,CAAkB,aAAa,WAAA,EAAa;AAC9C,MAAA,OAAA,CAAQ,WAAA,GAAc,kBAAkB,WAAA,CAAY,WAAA;AAAA,IACtD;AACA,IAAA,IAAI,iBAAA,CAAkB,YAAY,WAAA,EAAa;AAC7C,MAAA,OAAA,CAAQ,UAAA,GAAa,kBAAkB,UAAA,CAAW,WAAA;AAAA,IACpD;AACA,IAAA,IAAI,iBAAA,CAAkB,SAAS,WAAA,EAAa;AAC1C,MAAA,OAAA,CAAQ,OAAA,GAAU,kBAAkB,OAAA,CAAQ,WAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,OAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,IAAI,OAAA,GAAU,MAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAa,OAAA,EAAkC;AACrD,IAAA,MAAM,aAAqC,EAAC;AAC5C,IAAA,IAAI,QAAQ,iBAAA,EAAmB;AAC7B,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,iBAAiB,CAAA,EAAG;AAEpE,QAAA,UAAA,CAAW,GAAG,CAAA,GAAK,KAAA,CAAc,WAAA,IAAe,EAAA;AAAA,MAClD;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,QAAQ,SAAA,IAAa,EAAA;AAAA,MAChC,aAAA,EAAe,QAAQ,aAAA,IAAiB,EAAA;AAAA,MACxC,IAAA,EAAM,QAAQ,IAAA,IAAQ,EAAA;AAAA,MACtB,UAAA;AAAA,MACA,gBAAA,EAAkB,OAAA,CAAQ,UAAA,IAAc,EAAC;AAAA,MACzC,GAAA,EAAK;AAAA,KACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAA,GAAyC;AAC7C,IAAA,OAAO,KAAA,CAAM,CAAA,WAAA,CAAA,EAAe,OAAO,GAAA,KAAsB;AACvD,MAAA,GAAA,CAAI,aAAA;AAAA,QACF,kBAAA,CAAmB;AAAA,UACjB,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,UACtB,SAAA,EAAW;AAAA,SACZ;AAAA,OACH;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,qBAAA,EAAsB,GAAI,MAAM,OAAO,qBAAqB,CAAA;AACpE,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,UAC/B,IAAI,qBAAA,CAAsB;AAAA,YACxB,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,YACtB,mBAAA,EAAqB,KAAK,MAAA,CAAO,WAAA;AAAA,YACjC,iBAAA,EAAmB,KAAK,MAAA,CAAO,iBAAA;AAAA,YAC/B,eAAA,EAAiB,KAAK,MAAA,CAAO,eAAA;AAAA,YAC7B,qBAAA,EAAuB,CAAC,KAAK,CAAA;AAAA,YAC7B,cAAA,EAAgB,CAAC,KAAK;AAAA,WACvB;AAAA,SACH;AAGA,QAAA,MAAM,QAAA,GAAA,CAAY,MAAA,CAAO,QAAA,IAAY,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,KAAW,IAAA,CAAK,YAAA,CAAa,CAAC,CAAC,CAAA;AAC7E,QAAA,GAAA,CAAI,YAAA,CAAa,+BAAA,EAAiC,QAAA,CAAS,MAAM,CAAA;AACjE,QAAA,GAAA,CAAI,SAAA,CAAU,EAAE,IAAA,EAAM,cAAA,CAAe,IAAI,CAAA;AAEzC,QAAA,OAAO,QAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,GAAA,CAAI,SAAA,CAAU;AAAA,UACZ,MAAM,cAAA,CAAe,KAAA;AAAA,UACrB,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,SACnD,CAAA;AACD,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAO,aAAA,EAAsC;AACjD,IAAA,MAAM,EAAE,oBAAA,EAAqB,GAAI,MAAM,OAAO,qBAAqB,CAAA;AACnE,IAAA,MAAM,KAAK,MAAA,CAAO,IAAA;AAAA,MAChB,IAAI,oBAAA,CAAqB;AAAA,QACvB,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,QACtB,aAAA,EAAe;AAAA,OAChB;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,gBAAgB,SAAA,EAA8C;AAClE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,EAAQ;AACpC,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAE9B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAGjE,MAAA,MAAM,iBAAiB,YAAY;AACjC,QAAA,OAAO,KAAA,CAAM,CAAA,WAAA,CAAA,EAAe,OAAO,GAAA,KAAsB;AACvD,UAAA,GAAA,CAAI,aAAA;AAAA,YACF,kBAAA,CAAmB;AAAA,cACjB,WAAW,IAAA,CAAK,SAAA;AAAA,cAChB,QAAA,EAAU,KAAK,MAAA,CAAO,QAAA;AAAA,cACtB,SAAA,EAAW;AAAA,aACZ;AAAA,WACH;AACA,UAAA,GAAA,CAAI,YAAA,CAAa,sBAAA,EAAwB,OAAA,CAAQ,SAAS,CAAA;AAE1D,UAAA,IAAI;AACF,YAAA,MAAM,SAAA,CAAU,SAAS,GAAG,CAAA;AAC5B,YAAA,MAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA;AACvC,YAAA,SAAA,EAAA;AACA,YAAA,GAAA,CAAI,SAAA,CAAU,EAAE,IAAA,EAAM,cAAA,CAAe,IAAI,CAAA;AAAA,UAC3C,SAAS,KAAA,EAAO;AACd,YAAA,GAAA,CAAI,SAAA,CAAU;AAAA,cACZ,MAAM,cAAA,CAAe,KAAA;AAAA,cACrB,OAAA,EAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,aACnD,CAAA;AACD,YAAA,MAAM,KAAA;AAAA,UACR;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAA;AAGA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,mBAAmB,WAAA,CAAY,OAAA,CAAQ,OAAA,CAAQ,MAAA,IAAU,OAAO,CAAA;AACtE,QAAA,MAAM,OAAA,CAAQ,IAAA,CAAK,gBAAA,EAAkB,cAAc,CAAA;AAAA,MACrD,CAAA,MAAO;AACL,QAAA,MAAM,cAAA,EAAe;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,IAAA,CACJ,SAAA,EACA,OAAA,EACe;AACf,IAAA,OAAO,CAAC,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAS;AAChC,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,gBAAgB,SAAS,CAAA;AAAA,MACtC,SAAS,KAAA,EAAO;AAEd,QAAA,OAAA,CAAQ,KAAA,CAAM,4CAA4C,KAAK,CAAA;AAE/D,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,GAAI,CAAC,CAAA;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AACF","file":"chunk-OHFR7WX5.js","sourcesContent":["/**\n * SQS-specific instrumentation\n *\n * Provides semantic helpers for tracing SQS operations with proper OpenTelemetry\n * messaging semantic conventions. Automatically sets `messaging.*` and `aws.sqs.*` attributes.\n *\n * @example Send message\n * ```typescript\n * import { traceSQS } from 'autotel-aws/sqs';\n * import { SQSClient, SendMessageCommand } from '@aws-sdk/client-sqs';\n *\n * const sqs = new SQSClient({});\n *\n * export const sendMessage = traceSQS({\n * operation: 'send',\n * queueName: 'my-queue',\n * queueUrl: 'https://sqs.us-east-1.amazonaws.com/123456789/my-queue'\n * })(ctx => async (body: string, attributes?: Record<string, string>) => {\n * const result = await sqs.send(new SendMessageCommand({\n * QueueUrl: 'https://sqs.us-east-1.amazonaws.com/123456789/my-queue',\n * MessageBody: body,\n * MessageAttributes: attributes\n * }));\n *\n * if (result.MessageId) {\n * ctx.setAttribute('messaging.message.id', result.MessageId);\n * }\n *\n * return result;\n * });\n *\n * // Usage: await sendMessage('Hello!', { correlationId: { StringValue: '123', DataType: 'String' } });\n * ```\n *\n * @example Receive and process messages\n * ```typescript\n * export const receiveMessages = traceSQS({\n * operation: 'receive',\n * queueName: 'my-queue'\n * })(ctx => async (maxMessages: number) => {\n * const result = await sqs.send(new ReceiveMessageCommand({\n * QueueUrl: 'https://sqs.../my-queue',\n * MaxNumberOfMessages: maxMessages\n * }));\n *\n * ctx.setAttribute('messaging.batch.message_count', result.Messages?.length ?? 0);\n * return result.Messages;\n * });\n * ```\n */\n\nimport { trace, type TraceContext } from 'autotel';\nimport { context, propagation, SpanStatusCode } from '@opentelemetry/api';\nimport { buildSQSAttributes } from '../attributes';\nimport { wrapSDKClient } from '../common/sdk-wrapper';\n\n/**\n * SQS operation configuration\n */\nexport interface TraceSQSConfig {\n /**\n * SQS operation type\n * - 'send' - SendMessage, SendMessageBatch\n * - 'receive' - ReceiveMessage\n */\n operation: 'send' | 'receive';\n\n /**\n * Queue name (last segment of queue URL)\n * Sets `messaging.destination.name` attribute.\n */\n queueName: string;\n\n /**\n * Full queue URL\n * Sets `aws.sqs.queue_url` attribute.\n */\n queueUrl?: string;\n}\n\n/**\n * Trace SQS operations with semantic attributes\n *\n * Creates a traced function that automatically sets SQS messaging semantic attributes\n * following OpenTelemetry conventions.\n *\n * @param config - SQS operation configuration\n * @returns A higher-order function that wraps your SQS operation with tracing\n *\n * @remarks\n * Semantic attributes set automatically:\n * - `messaging.system` - 'aws_sqs'\n * - `messaging.destination.name` - Queue name\n * - `messaging.operation` - 'send' or 'receive'\n * - `aws.sqs.queue_url` - Full queue URL (if provided)\n *\n * Additional attributes you should set in your handler:\n * - `messaging.message.id` - Message ID from response\n * - `messaging.batch.message_count` - Number of messages in batch\n *\n * @see https://opentelemetry.io/docs/specs/semconv/messaging/aws-sqs/\n */\nexport function traceSQS(config: TraceSQSConfig) {\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 `sqs.${config.operation}`,\n (ctx: TraceContext) =>\n async (...args: TArgs): Promise<TReturn> => {\n // Set SQS semantic attributes\n ctx.setAttributes(\n buildSQSAttributes({\n queueName: config.queueName,\n queueUrl: config.queueUrl,\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\n// ============================================================================\n// SQS Producer - Sends messages with automatic trace context injection\n// ============================================================================\n\n/**\n * Configuration for SQS Producer\n */\nexport interface SQSProducerConfig {\n /**\n * Full SQS queue URL\n */\n queueUrl: string;\n\n /**\n * Inject W3C Trace Context into message attributes\n * Enables distributed tracing across producer/consumer\n * @default true\n */\n injectTraceContext?: boolean;\n\n /**\n * Optional service name for tracing\n */\n service?: string;\n}\n\n/**\n * Message to send via SQS Producer\n */\nexport interface SQSMessage {\n /**\n * Message body (string)\n */\n body: string;\n\n /**\n * Optional message attributes\n */\n attributes?: Record<string, { StringValue: string; DataType: string }>;\n\n /**\n * Optional message group ID (for FIFO queues)\n */\n messageGroupId?: string;\n\n /**\n * Optional deduplication ID (for FIFO queues)\n */\n messageDeduplicationId?: string;\n\n /**\n * Optional delay in seconds (0-900)\n */\n delaySeconds?: number;\n}\n\n/**\n * SQS Producer with automatic trace context injection\n *\n * Wraps an SQS client to automatically:\n * - Create spans for send operations\n * - Inject W3C Trace Context into message attributes\n * - Set proper semantic attributes\n *\n * @example Basic usage\n * ```typescript\n * import { SQSProducer } from 'autotel-aws/sqs';\n * import { SQSClient } from '@aws-sdk/client-sqs';\n *\n * const sqs = new SQSClient({ region: 'us-east-1' });\n * const producer = new SQSProducer(sqs, {\n * queueUrl: 'https://sqs.us-east-1.amazonaws.com/123456789/my-queue'\n * });\n *\n * // Send with automatic trace context\n * const result = await producer.send({ body: 'Hello!' });\n * console.log('Message ID:', result.messageId);\n * ```\n *\n * @example With custom attributes\n * ```typescript\n * await producer.send({\n * body: JSON.stringify({ orderId: '12345' }),\n * attributes: {\n * 'correlationId': { StringValue: 'abc-123', DataType: 'String' },\n * 'eventType': { StringValue: 'ORDER_CREATED', DataType: 'String' }\n * }\n * });\n * ```\n *\n * @example Batch send\n * ```typescript\n * const results = await producer.sendBatch([\n * { body: 'Message 1' },\n * { body: 'Message 2' },\n * { body: 'Message 3' }\n * ]);\n * console.log(`Sent ${results.successful.length} messages`);\n * ```\n */\nexport class SQSProducer<\n \n TClient extends { send: (command: any) => Promise<any> } = any,\n> {\n private client: TClient;\n private config: Required<Pick<SQSProducerConfig, 'queueUrl'>> & SQSProducerConfig;\n private queueName: string;\n\n constructor(client: TClient, config: SQSProducerConfig) {\n // Wrap the client for basic tracing if not already wrapped\n this.client = wrapSDKClient(client as any, config.service) as TClient;\n this.config = {\n injectTraceContext: true,\n ...config,\n };\n // Extract queue name from URL\n this.queueName = config.queueUrl.split('/').pop() || 'unknown';\n }\n\n /**\n * Inject trace context into message attributes\n */\n private injectContext(\n attributes?: Record<string, { StringValue: string; DataType: string }>,\n ): Record<string, { StringValue: string; DataType: string }> {\n if (!this.config.injectTraceContext) {\n return attributes || {};\n }\n\n const carrier: Record<string, string> = {};\n propagation.inject(context.active(), carrier);\n\n const result = { ...attributes };\n\n if (carrier.traceparent) {\n result.traceparent = { StringValue: carrier.traceparent, DataType: 'String' };\n }\n if (carrier.tracestate) {\n result.tracestate = { StringValue: carrier.tracestate, DataType: 'String' };\n }\n if (carrier.baggage) {\n result.baggage = { StringValue: carrier.baggage, DataType: 'String' };\n }\n\n return result;\n }\n\n /**\n * Send a single message to the queue\n *\n * @param message - Message to send\n * @returns Promise with message ID and other metadata\n */\n async send(message: SQSMessage): Promise<{\n messageId?: string;\n sequenceNumber?: string;\n md5OfMessageBody?: string;\n }> {\n return trace(`sqs.send`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildSQSAttributes({\n queueName: this.queueName,\n queueUrl: this.config.queueUrl,\n operation: 'send',\n }),\n );\n\n // Build command input\n const input = {\n QueueUrl: this.config.queueUrl,\n MessageBody: message.body,\n MessageAttributes: this.injectContext(message.attributes),\n ...(message.messageGroupId && { MessageGroupId: message.messageGroupId }),\n ...(message.messageDeduplicationId && {\n MessageDeduplicationId: message.messageDeduplicationId,\n }),\n ...(message.delaySeconds !== undefined && { DelaySeconds: message.delaySeconds }),\n };\n\n // Dynamically import the command to avoid requiring @aws-sdk/client-sqs at load time\n try {\n const { SendMessageCommand } = await import('@aws-sdk/client-sqs');\n const result = await this.client.send(new SendMessageCommand(input));\n\n if (result.MessageId) {\n ctx.setAttribute('messaging.message.id', result.MessageId);\n }\n\n ctx.setStatus({ code: SpanStatusCode.OK });\n\n return {\n messageId: result.MessageId,\n sequenceNumber: result.SequenceNumber,\n md5OfMessageBody: result.MD5OfMessageBody,\n };\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Send failed',\n });\n throw error;\n }\n });\n }\n\n /**\n * Send multiple messages in a batch\n *\n * @param messages - Array of messages to send (max 10)\n * @returns Promise with successful and failed message results\n */\n async sendBatch(messages: SQSMessage[]): Promise<{\n successful: Array<{ id: string; messageId?: string; sequenceNumber?: string }>;\n failed: Array<{ id: string; code?: string; message?: string }>;\n }> {\n return trace(`sqs.sendBatch`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildSQSAttributes({\n queueName: this.queueName,\n queueUrl: this.config.queueUrl,\n operation: 'send',\n }),\n );\n ctx.setAttribute('messaging.batch.message_count', messages.length);\n\n // Build batch entries\n const entries = messages.map((message, index) => ({\n Id: String(index),\n MessageBody: message.body,\n MessageAttributes: this.injectContext(message.attributes),\n ...(message.messageGroupId && { MessageGroupId: message.messageGroupId }),\n ...(message.messageDeduplicationId && {\n MessageDeduplicationId: message.messageDeduplicationId,\n }),\n ...(message.delaySeconds !== undefined && { DelaySeconds: message.delaySeconds }),\n }));\n\n try {\n const { SendMessageBatchCommand } = await import('@aws-sdk/client-sqs');\n const result = await this.client.send(\n new SendMessageBatchCommand({\n QueueUrl: this.config.queueUrl,\n Entries: entries,\n }),\n );\n\n const successful =\n result.Successful?.map((s: { Id?: string; MessageId?: string; SequenceNumber?: string }) => ({\n id: s.Id!,\n messageId: s.MessageId,\n sequenceNumber: s.SequenceNumber,\n })) || [];\n\n const failed =\n result.Failed?.map((f: { Id?: string; Code?: string; Message?: string }) => ({\n id: f.Id!,\n code: f.Code,\n message: f.Message,\n })) || [];\n\n ctx.setAttribute('messaging.sqs.successful_count', successful.length);\n ctx.setAttribute('messaging.sqs.failed_count', failed.length);\n\n if (failed.length > 0) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: `${failed.length} messages failed`,\n });\n } else {\n ctx.setStatus({ code: SpanStatusCode.OK });\n }\n\n return { successful, failed };\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Batch send failed',\n });\n throw error;\n }\n });\n }\n}\n\n// ============================================================================\n// SQS Consumer - Receives and processes messages with trace context extraction\n// ============================================================================\n\n/**\n * Configuration for SQS Consumer\n */\nexport interface SQSConsumerConfig {\n /**\n * Full SQS queue URL\n */\n queueUrl: string;\n\n /**\n * Extract W3C Trace Context from message attributes\n * Creates child spans linked to the producer\n * @default true\n */\n extractTraceContext?: boolean;\n\n /**\n * Maximum number of messages to receive per poll\n * @default 10\n */\n maxMessages?: number;\n\n /**\n * Visibility timeout in seconds\n * @default 30\n */\n visibilityTimeout?: number;\n\n /**\n * Wait time for long polling in seconds (0-20)\n * @default 20\n */\n waitTimeSeconds?: number;\n\n /**\n * Optional service name for tracing\n */\n service?: string;\n}\n\n/**\n * Received SQS message with parsed attributes\n */\nexport interface ReceivedSQSMessage {\n /**\n * Message ID\n */\n messageId: string;\n\n /**\n * Receipt handle for deletion\n */\n receiptHandle: string;\n\n /**\n * Message body (string)\n */\n body: string;\n\n /**\n * Parsed message attributes\n */\n attributes: Record<string, string>;\n\n /**\n * System attributes (ApproximateReceiveCount, etc.)\n */\n systemAttributes: Record<string, string>;\n\n /**\n * Original AWS SDK message object\n */\n \n raw: any;\n}\n\n/**\n * Message processor function type\n */\nexport type MessageProcessor = (\n message: ReceivedSQSMessage,\n ctx: TraceContext,\n) => Promise<void>;\n\n/**\n * SQS Consumer with automatic trace context extraction\n *\n * Wraps an SQS client to automatically:\n * - Create spans for receive/process operations\n * - Extract W3C Trace Context from message attributes\n * - Link consumer spans to producer spans\n * - Delete messages after successful processing\n *\n * @example Basic usage\n * ```typescript\n * import { SQSConsumer } from 'autotel-aws/sqs';\n * import { SQSClient } from '@aws-sdk/client-sqs';\n *\n * const sqs = new SQSClient({ region: 'us-east-1' });\n * const consumer = new SQSConsumer(sqs, {\n * queueUrl: 'https://sqs.us-east-1.amazonaws.com/123456789/my-queue'\n * });\n *\n * // Process messages with automatic tracing\n * await consumer.processMessages(async (message, ctx) => {\n * ctx.setAttribute('order.id', JSON.parse(message.body).orderId);\n * await handleOrder(message.body);\n * });\n * ```\n *\n * @example With polling loop\n * ```typescript\n * // Start continuous polling\n * const controller = new AbortController();\n *\n * consumer.poll(async (message, ctx) => {\n * await processMessage(message);\n * }, { signal: controller.signal });\n *\n * // Stop polling gracefully\n * controller.abort();\n * ```\n */\nexport class SQSConsumer<\n \n TClient extends { send: (command: any) => Promise<any> } = any,\n> {\n private client: TClient;\n private config: Required<\n Pick<SQSConsumerConfig, 'queueUrl' | 'maxMessages' | 'visibilityTimeout' | 'waitTimeSeconds'>\n > &\n SQSConsumerConfig;\n private queueName: string;\n\n constructor(client: TClient, config: SQSConsumerConfig) {\n this.client = wrapSDKClient(client as any, config.service) as TClient;\n this.config = {\n extractTraceContext: true,\n maxMessages: 10,\n visibilityTimeout: 30,\n waitTimeSeconds: 20,\n ...config,\n };\n this.queueName = config.queueUrl.split('/').pop() || 'unknown';\n }\n\n /**\n * Extract trace context from message attributes\n */\n \n private extractContext(messageAttributes: any): Record<string, string> | undefined {\n if (!this.config.extractTraceContext || !messageAttributes) {\n return undefined;\n }\n\n const carrier: Record<string, string> = {};\n\n if (messageAttributes.traceparent?.StringValue) {\n carrier.traceparent = messageAttributes.traceparent.StringValue;\n }\n if (messageAttributes.tracestate?.StringValue) {\n carrier.tracestate = messageAttributes.tracestate.StringValue;\n }\n if (messageAttributes.baggage?.StringValue) {\n carrier.baggage = messageAttributes.baggage.StringValue;\n }\n\n return Object.keys(carrier).length > 0 ? carrier : undefined;\n }\n\n /**\n * Parse AWS SDK message into our format\n */\n \n private parseMessage(message: any): ReceivedSQSMessage {\n const attributes: Record<string, string> = {};\n if (message.MessageAttributes) {\n for (const [key, value] of Object.entries(message.MessageAttributes)) {\n \n attributes[key] = (value as any).StringValue || '';\n }\n }\n\n return {\n messageId: message.MessageId || '',\n receiptHandle: message.ReceiptHandle || '',\n body: message.Body || '',\n attributes,\n systemAttributes: message.Attributes || {},\n raw: message,\n };\n }\n\n /**\n * Receive messages from the queue\n *\n * @returns Array of received messages\n */\n async receive(): Promise<ReceivedSQSMessage[]> {\n return trace(`sqs.receive`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildSQSAttributes({\n queueName: this.queueName,\n queueUrl: this.config.queueUrl,\n operation: 'receive',\n }),\n );\n\n try {\n const { ReceiveMessageCommand } = await import('@aws-sdk/client-sqs');\n const result = await this.client.send(\n new ReceiveMessageCommand({\n QueueUrl: this.config.queueUrl,\n MaxNumberOfMessages: this.config.maxMessages,\n VisibilityTimeout: this.config.visibilityTimeout,\n WaitTimeSeconds: this.config.waitTimeSeconds,\n MessageAttributeNames: ['All'],\n AttributeNames: ['All'],\n }),\n );\n\n \n const messages = (result.Messages || []).map((m: any) => this.parseMessage(m));\n ctx.setAttribute('messaging.batch.message_count', messages.length);\n ctx.setStatus({ code: SpanStatusCode.OK });\n\n return messages;\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Receive failed',\n });\n throw error;\n }\n });\n }\n\n /**\n * Delete a message from the queue\n *\n * @param receiptHandle - Receipt handle of the message to delete\n */\n async delete(receiptHandle: string): Promise<void> {\n const { DeleteMessageCommand } = await import('@aws-sdk/client-sqs');\n await this.client.send(\n new DeleteMessageCommand({\n QueueUrl: this.config.queueUrl,\n ReceiptHandle: receiptHandle,\n }),\n );\n }\n\n /**\n * Process messages with automatic trace context extraction\n *\n * Receives messages, processes each with the provided handler,\n * and deletes successfully processed messages.\n *\n * @param processor - Function to process each message\n * @returns Number of messages processed\n */\n async processMessages(processor: MessageProcessor): Promise<number> {\n const messages = await this.receive();\n let processed = 0;\n\n for (const message of messages) {\n // Extract trace context from message attributes\n const carrier = this.extractContext(message.raw.MessageAttributes);\n\n // Create processing span, optionally linked to producer\n const processMessage = async () => {\n return trace(`sqs.process`, async (ctx: TraceContext) => {\n ctx.setAttributes(\n buildSQSAttributes({\n queueName: this.queueName,\n queueUrl: this.config.queueUrl,\n operation: 'receive',\n }),\n );\n ctx.setAttribute('messaging.message.id', message.messageId);\n\n try {\n await processor(message, ctx);\n await this.delete(message.receiptHandle);\n processed++;\n ctx.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n ctx.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : 'Processing failed',\n });\n throw error;\n }\n });\n };\n\n // Run with extracted context if available\n if (carrier) {\n const extractedContext = propagation.extract(context.active(), carrier);\n await context.with(extractedContext, processMessage);\n } else {\n await processMessage();\n }\n }\n\n return processed;\n }\n\n /**\n * Start continuous polling loop\n *\n * @param processor - Function to process each message\n * @param options - Polling options including abort signal\n */\n async poll(\n processor: MessageProcessor,\n options?: { signal?: AbortSignal },\n ): Promise<void> {\n while (!options?.signal?.aborted) {\n try {\n await this.processMessages(processor);\n } catch (error) {\n // Log error but continue polling\n console.error('[SQSConsumer] Error processing messages:', error);\n // Small delay before retrying on error\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n }\n }\n}\n"]}
@@ -0,0 +1,40 @@
1
+ import { AWS_ATTRS } from './chunk-I4CKQ4RD.js';
2
+ import { trace } from '@opentelemetry/api';
3
+ export { AWSXRayPropagator } from '@opentelemetry/propagator-aws-xray';
4
+
5
+ var xrayConfig = {};
6
+ function configureXRay(config) {
7
+ xrayConfig = { ...xrayConfig, ...config };
8
+ }
9
+ var annotationMap = /* @__PURE__ */ new WeakMap();
10
+ function setXRayAnnotation(key, value) {
11
+ const span = trace.getActiveSpan();
12
+ if (!span) return;
13
+ span.setAttribute(key, value);
14
+ let annotations = annotationMap.get(span);
15
+ if (!annotations) {
16
+ annotations = /* @__PURE__ */ new Set();
17
+ annotationMap.set(span, annotations);
18
+ }
19
+ if (!annotations.has(key)) {
20
+ annotations.add(key);
21
+ span.setAttribute(AWS_ATTRS.XRAY_ANNOTATIONS, [...annotations].join(","));
22
+ }
23
+ }
24
+ function setXRayMetadata(key, value) {
25
+ const span = trace.getActiveSpan();
26
+ if (!span) return;
27
+ if (typeof value === "object") {
28
+ try {
29
+ span.setAttribute(key, JSON.stringify(value));
30
+ } catch {
31
+ span.setAttribute(key, "<serialization-failed>");
32
+ }
33
+ } else {
34
+ span.setAttribute(key, value);
35
+ }
36
+ }
37
+
38
+ export { configureXRay, setXRayAnnotation, setXRayMetadata };
39
+ //# sourceMappingURL=chunk-PZGYL7XZ.js.map
40
+ //# sourceMappingURL=chunk-PZGYL7XZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/xray/annotations.ts"],"names":[],"mappings":";;;;AAQA,IAAI,aAAyB,EAAC;AAKvB,SAAS,cAAc,MAAA,EAA0B;AACtD,EAAA,UAAA,GAAa,EAAE,GAAG,UAAA,EAAY,GAAG,MAAA,EAAO;AAC1C;AASA,IAAM,aAAA,uBAAoB,OAAA,EAA6B;AAEhD,SAAS,iBAAA,CAAkB,KAAa,KAAA,EAAwC;AACrF,EAAA,MAAM,IAAA,GAAO,MAAM,aAAA,EAAc;AACjC,EAAA,IAAI,CAAC,IAAA,EAAM;AAGX,EAAA,IAAA,CAAK,YAAA,CAAa,KAAK,KAAK,CAAA;AAG5B,EAAA,IAAI,WAAA,GAAc,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AACxC,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,WAAA,uBAAkB,GAAA,EAAY;AAC9B,IAAA,aAAA,CAAc,GAAA,CAAI,MAAM,WAAW,CAAA;AAAA,EACrC;AAEA,EAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,IAAA,WAAA,CAAY,IAAI,GAAG,CAAA;AAEnB,IAAA,IAAA,CAAK,YAAA,CAAa,UAAU,gBAAA,EAAkB,CAAC,GAAG,WAAW,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,EAC1E;AACF;AAQO,SAAS,eAAA,CAAgB,KAAa,KAAA,EAAiD;AAC5F,EAAA,MAAM,IAAA,GAAO,MAAM,aAAA,EAAc;AACjC,EAAA,IAAI,CAAC,IAAA,EAAM;AAEX,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,IAC9C,CAAA,CAAA,MAAQ;AACN,MAAA,IAAA,CAAK,YAAA,CAAa,KAAK,wBAAwB,CAAA;AAAA,IACjD;AAAA,EACF,CAAA,MAAO;AACL,IAAA,IAAA,CAAK,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,EAC9B;AACF","file":"chunk-PZGYL7XZ.js","sourcesContent":["/**\n * X-Ray annotation and metadata helpers\n */\n\nimport { trace } from '@opentelemetry/api';\nimport { AWS_ATTRS } from '../attributes';\nimport type { XRayConfig } from '../config';\n\nlet xrayConfig: XRayConfig = {};\n\n/**\n * Configure X-Ray compatibility features\n */\nexport function configureXRay(config: XRayConfig): void {\n xrayConfig = { ...xrayConfig, ...config };\n}\n\n/**\n * Set X-Ray annotation (indexed in X-Ray console)\n *\n * Annotations are indexed and can be used for filtering in X-Ray.\n * They are stored as span attributes with a special annotation list.\n */\n// Track annotations per span (since we can't read attributes back from spans)\nconst annotationMap = new WeakMap<object, Set<string>>();\n\nexport function setXRayAnnotation(key: string, value: string | number | boolean): void {\n const span = trace.getActiveSpan();\n if (!span) return;\n\n // Set the attribute\n span.setAttribute(key, value);\n\n // Track annotation keys for this span\n let annotations = annotationMap.get(span);\n if (!annotations) {\n annotations = new Set<string>();\n annotationMap.set(span, annotations);\n }\n \n if (!annotations.has(key)) {\n annotations.add(key);\n // Store annotation list as comma-separated string (X-Ray format)\n span.setAttribute(AWS_ATTRS.XRAY_ANNOTATIONS, [...annotations].join(','));\n }\n}\n\n/**\n * Set X-Ray metadata (not indexed)\n *\n * Metadata is not indexed but can be viewed in X-Ray console.\n * It's stored as regular span attributes.\n */\nexport function setXRayMetadata(key: string, value: string | number | boolean | object): void {\n const span = trace.getActiveSpan();\n if (!span) return;\n\n if (typeof value === 'object') {\n try {\n span.setAttribute(key, JSON.stringify(value));\n } catch {\n span.setAttribute(key, '<serialization-failed>');\n }\n } else {\n span.setAttribute(key, value);\n }\n}\n"]}
@@ -0,0 +1,164 @@
1
+ 'use strict';
2
+
3
+ // src/attributes.ts
4
+ var AWS_ATTRS = {
5
+ // Lambda
6
+ LAMBDA_FUNCTION_NAME: "faas.name",
7
+ LAMBDA_FUNCTION_VERSION: "faas.version",
8
+ LAMBDA_INVOCATION_ID: "faas.invocation_id",
9
+ LAMBDA_COLD_START: "faas.coldstart",
10
+ LAMBDA_TRIGGER: "faas.trigger",
11
+ // AWS SDK
12
+ AWS_SERVICE: "rpc.service",
13
+ AWS_OPERATION: "rpc.method",
14
+ AWS_REQUEST_ID: "aws.request_id",
15
+ AWS_EXTENDED_REQUEST_ID: "aws.extended_request_id",
16
+ AWS_CF_ID: "aws.cf_id",
17
+ // DynamoDB
18
+ DDB_TABLE_NAMES: "aws.dynamodb.table_names",
19
+ DDB_CONSUMED_CAPACITY: "aws.dynamodb.consumed_capacity",
20
+ // S3
21
+ S3_BUCKET: "aws.s3.bucket",
22
+ S3_KEY: "aws.s3.key",
23
+ S3_COPY_SOURCE: "aws.s3.copy_source",
24
+ // SQS
25
+ SQS_QUEUE_NAME: "messaging.destination.name",
26
+ SQS_QUEUE_URL: "aws.sqs.queue_url",
27
+ SQS_MESSAGE_ID: "messaging.message.id",
28
+ // SNS
29
+ SNS_TOPIC_ARN: "messaging.destination.name",
30
+ SNS_MESSAGE_ID: "messaging.message.id",
31
+ // Kinesis
32
+ KINESIS_STREAM_NAME: "messaging.destination.name",
33
+ KINESIS_SHARD_ID: "aws.kinesis.shard_id",
34
+ // Step Functions
35
+ SFN_STATE_MACHINE_ARN: "aws.stepfunctions.state_machine_arn",
36
+ SFN_EXECUTION_ARN: "aws.stepfunctions.execution_arn",
37
+ SFN_ACTIVITY_ARN: "aws.stepfunctions.activity_arn",
38
+ // EventBridge
39
+ EVENTBRIDGE_EVENT_BUS: "aws.eventbridge.event_bus",
40
+ EVENTBRIDGE_SOURCE: "aws.eventbridge.source",
41
+ EVENTBRIDGE_DETAIL_TYPE: "aws.eventbridge.detail_type",
42
+ // X-Ray
43
+ XRAY_ANNOTATIONS: "aws.xray.annotations"
44
+ };
45
+ function buildLambdaAttributes(context) {
46
+ return {
47
+ [AWS_ATTRS.LAMBDA_FUNCTION_NAME]: context.functionName,
48
+ [AWS_ATTRS.LAMBDA_FUNCTION_VERSION]: context.functionVersion,
49
+ [AWS_ATTRS.LAMBDA_INVOCATION_ID]: context.awsRequestId,
50
+ "cloud.provider": "aws",
51
+ "cloud.region": process.env.AWS_REGION || "",
52
+ ...context.coldStart !== void 0 && {
53
+ [AWS_ATTRS.LAMBDA_COLD_START]: context.coldStart
54
+ },
55
+ ...context.trigger && {
56
+ [AWS_ATTRS.LAMBDA_TRIGGER]: context.trigger
57
+ }
58
+ };
59
+ }
60
+ function buildSDKAttributes(metadata) {
61
+ return {
62
+ "rpc.system": "aws-api",
63
+ [AWS_ATTRS.AWS_SERVICE]: metadata.service,
64
+ [AWS_ATTRS.AWS_OPERATION]: metadata.operation,
65
+ ...metadata.requestId && {
66
+ [AWS_ATTRS.AWS_REQUEST_ID]: metadata.requestId
67
+ },
68
+ ...metadata.httpStatusCode && {
69
+ "http.status_code": metadata.httpStatusCode
70
+ },
71
+ ...metadata.extendedRequestId && {
72
+ [AWS_ATTRS.AWS_EXTENDED_REQUEST_ID]: metadata.extendedRequestId
73
+ },
74
+ ...metadata.cfId && {
75
+ [AWS_ATTRS.AWS_CF_ID]: metadata.cfId
76
+ }
77
+ };
78
+ }
79
+ function buildDynamoDBAttributes(operation) {
80
+ return {
81
+ "db.system": "dynamodb",
82
+ "db.operation": operation.operation,
83
+ "db.name": operation.tableName,
84
+ [AWS_ATTRS.DDB_TABLE_NAMES]: [operation.tableName],
85
+ ...operation.consumedCapacity !== void 0 && {
86
+ [AWS_ATTRS.DDB_CONSUMED_CAPACITY]: operation.consumedCapacity
87
+ }
88
+ };
89
+ }
90
+ function buildS3Attributes(operation) {
91
+ return {
92
+ [AWS_ATTRS.S3_BUCKET]: operation.bucket,
93
+ ...operation.key && {
94
+ [AWS_ATTRS.S3_KEY]: operation.key
95
+ },
96
+ ...operation.copySource && {
97
+ [AWS_ATTRS.S3_COPY_SOURCE]: operation.copySource
98
+ }
99
+ };
100
+ }
101
+ function buildSQSAttributes(operation) {
102
+ return {
103
+ "messaging.system": "aws_sqs",
104
+ [AWS_ATTRS.SQS_QUEUE_NAME]: operation.queueName,
105
+ "messaging.operation": operation.operation,
106
+ ...operation.queueUrl && {
107
+ [AWS_ATTRS.SQS_QUEUE_URL]: operation.queueUrl
108
+ },
109
+ ...operation.messageId && {
110
+ [AWS_ATTRS.SQS_MESSAGE_ID]: operation.messageId
111
+ }
112
+ };
113
+ }
114
+ function buildSNSAttributes(operation) {
115
+ return {
116
+ "messaging.system": "aws_sns",
117
+ [AWS_ATTRS.SNS_TOPIC_ARN]: operation.topicArn,
118
+ "messaging.operation": "publish",
119
+ ...operation.messageId && {
120
+ [AWS_ATTRS.SNS_MESSAGE_ID]: operation.messageId
121
+ }
122
+ };
123
+ }
124
+ function buildKinesisAttributes(operation) {
125
+ return {
126
+ "messaging.system": "aws_kinesis",
127
+ [AWS_ATTRS.KINESIS_STREAM_NAME]: operation.streamName,
128
+ "messaging.operation": operation.operation,
129
+ ...operation.shardId && {
130
+ [AWS_ATTRS.KINESIS_SHARD_ID]: operation.shardId
131
+ }
132
+ };
133
+ }
134
+ function buildStepFunctionsAttributes(operation) {
135
+ return {
136
+ [AWS_ATTRS.SFN_STATE_MACHINE_ARN]: operation.stateMachineArn,
137
+ ...operation.executionArn && {
138
+ [AWS_ATTRS.SFN_EXECUTION_ARN]: operation.executionArn
139
+ },
140
+ ...operation.activityArn && {
141
+ [AWS_ATTRS.SFN_ACTIVITY_ARN]: operation.activityArn
142
+ }
143
+ };
144
+ }
145
+ function buildEventBridgeAttributes(operation) {
146
+ return {
147
+ [AWS_ATTRS.EVENTBRIDGE_EVENT_BUS]: operation.eventBus,
148
+ [AWS_ATTRS.EVENTBRIDGE_SOURCE]: operation.source,
149
+ [AWS_ATTRS.EVENTBRIDGE_DETAIL_TYPE]: operation.detailType
150
+ };
151
+ }
152
+
153
+ exports.AWS_ATTRS = AWS_ATTRS;
154
+ exports.buildDynamoDBAttributes = buildDynamoDBAttributes;
155
+ exports.buildEventBridgeAttributes = buildEventBridgeAttributes;
156
+ exports.buildKinesisAttributes = buildKinesisAttributes;
157
+ exports.buildLambdaAttributes = buildLambdaAttributes;
158
+ exports.buildS3Attributes = buildS3Attributes;
159
+ exports.buildSDKAttributes = buildSDKAttributes;
160
+ exports.buildSNSAttributes = buildSNSAttributes;
161
+ exports.buildSQSAttributes = buildSQSAttributes;
162
+ exports.buildStepFunctionsAttributes = buildStepFunctionsAttributes;
163
+ //# sourceMappingURL=chunk-Q3DMMQ7K.cjs.map
164
+ //# sourceMappingURL=chunk-Q3DMMQ7K.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/attributes.ts"],"names":[],"mappings":";;;AAQO,IAAM,SAAA,GAAY;AAAA;AAAA,EAEvB,oBAAA,EAAsB,WAAA;AAAA,EACtB,uBAAA,EAAyB,cAAA;AAAA,EACzB,oBAAA,EAAsB,oBAAA;AAAA,EACtB,iBAAA,EAAmB,gBAAA;AAAA,EACnB,cAAA,EAAgB,cAAA;AAAA;AAAA,EAGhB,WAAA,EAAa,aAAA;AAAA,EACb,aAAA,EAAe,YAAA;AAAA,EACf,cAAA,EAAgB,gBAAA;AAAA,EAChB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,SAAA,EAAW,WAAA;AAAA;AAAA,EAGX,eAAA,EAAiB,0BAAA;AAAA,EACjB,qBAAA,EAAuB,gCAAA;AAAA;AAAA,EAGvB,SAAA,EAAW,eAAA;AAAA,EACX,MAAA,EAAQ,YAAA;AAAA,EACR,cAAA,EAAgB,oBAAA;AAAA;AAAA,EAGhB,cAAA,EAAgB,4BAAA;AAAA,EAChB,aAAA,EAAe,mBAAA;AAAA,EACf,cAAA,EAAgB,sBAAA;AAAA;AAAA,EAGhB,aAAA,EAAe,4BAAA;AAAA,EACf,cAAA,EAAgB,sBAAA;AAAA;AAAA,EAGhB,mBAAA,EAAqB,4BAAA;AAAA,EACrB,gBAAA,EAAkB,sBAAA;AAAA;AAAA,EAGlB,qBAAA,EAAuB,qCAAA;AAAA,EACvB,iBAAA,EAAmB,iCAAA;AAAA,EACnB,gBAAA,EAAkB,gCAAA;AAAA;AAAA,EAGlB,qBAAA,EAAuB,2BAAA;AAAA,EACvB,kBAAA,EAAoB,wBAAA;AAAA,EACpB,uBAAA,EAAyB,6BAAA;AAAA;AAAA,EAGzB,gBAAA,EAAkB;AACpB;AAKO,SAAS,sBAAsB,OAAA,EAMD;AACnC,EAAA,OAAO;AAAA,IACL,CAAC,SAAA,CAAU,oBAAoB,GAAG,OAAA,CAAQ,YAAA;AAAA,IAC1C,CAAC,SAAA,CAAU,uBAAuB,GAAG,OAAA,CAAQ,eAAA;AAAA,IAC7C,CAAC,SAAA,CAAU,oBAAoB,GAAG,OAAA,CAAQ,YAAA;AAAA,IAC1C,gBAAA,EAAkB,KAAA;AAAA,IAClB,cAAA,EAAgB,OAAA,CAAQ,GAAA,CAAI,UAAA,IAAc,EAAA;AAAA,IAC1C,GAAI,OAAA,CAAQ,SAAA,KAAc,MAAA,IAAa;AAAA,MACrC,CAAC,SAAA,CAAU,iBAAiB,GAAG,OAAA,CAAQ;AAAA,KACzC;AAAA,IACA,GAAI,QAAQ,OAAA,IAAW;AAAA,MACrB,CAAC,SAAA,CAAU,cAAc,GAAG,OAAA,CAAQ;AAAA;AACtC,GACF;AACF;AAKO,SAAS,mBAAmB,QAAA,EAOC;AAClC,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,SAAA;AAAA,IACd,CAAC,SAAA,CAAU,WAAW,GAAG,QAAA,CAAS,OAAA;AAAA,IAClC,CAAC,SAAA,CAAU,aAAa,GAAG,QAAA,CAAS,SAAA;AAAA,IACpC,GAAI,SAAS,SAAA,IAAa;AAAA,MACxB,CAAC,SAAA,CAAU,cAAc,GAAG,QAAA,CAAS;AAAA,KACvC;AAAA,IACA,GAAI,SAAS,cAAA,IAAkB;AAAA,MAC7B,oBAAoB,QAAA,CAAS;AAAA,KAC/B;AAAA,IACA,GAAI,SAAS,iBAAA,IAAqB;AAAA,MAChC,CAAC,SAAA,CAAU,uBAAuB,GAAG,QAAA,CAAS;AAAA,KAChD;AAAA,IACA,GAAI,SAAS,IAAA,IAAQ;AAAA,MACnB,CAAC,SAAA,CAAU,SAAS,GAAG,QAAA,CAAS;AAAA;AAClC,GACF;AACF;AAKO,SAAS,wBAAwB,SAAA,EAIO;AAC7C,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,UAAA;AAAA,IACb,gBAAgB,SAAA,CAAU,SAAA;AAAA,IAC1B,WAAW,SAAA,CAAU,SAAA;AAAA,IACrB,CAAC,SAAA,CAAU,eAAe,GAAG,CAAC,UAAU,SAAS,CAAA;AAAA,IACjD,GAAI,SAAA,CAAU,gBAAA,KAAqB,MAAA,IAAa;AAAA,MAC9C,CAAC,SAAA,CAAU,qBAAqB,GAAG,SAAA,CAAU;AAAA;AAC/C,GACF;AACF;AAKO,SAAS,kBAAkB,SAAA,EAIP;AACzB,EAAA,OAAO;AAAA,IACL,CAAC,SAAA,CAAU,SAAS,GAAG,SAAA,CAAU,MAAA;AAAA,IACjC,GAAI,UAAU,GAAA,IAAO;AAAA,MACnB,CAAC,SAAA,CAAU,MAAM,GAAG,SAAA,CAAU;AAAA,KAChC;AAAA,IACA,GAAI,UAAU,UAAA,IAAc;AAAA,MAC1B,CAAC,SAAA,CAAU,cAAc,GAAG,SAAA,CAAU;AAAA;AACxC,GACF;AACF;AAKO,SAAS,mBAAmB,SAAA,EAKR;AACzB,EAAA,OAAO;AAAA,IACL,kBAAA,EAAoB,SAAA;AAAA,IACpB,CAAC,SAAA,CAAU,cAAc,GAAG,SAAA,CAAU,SAAA;AAAA,IACtC,uBAAuB,SAAA,CAAU,SAAA;AAAA,IACjC,GAAI,UAAU,QAAA,IAAY;AAAA,MACxB,CAAC,SAAA,CAAU,aAAa,GAAG,SAAA,CAAU;AAAA,KACvC;AAAA,IACA,GAAI,UAAU,SAAA,IAAa;AAAA,MACzB,CAAC,SAAA,CAAU,cAAc,GAAG,SAAA,CAAU;AAAA;AACxC,GACF;AACF;AAKO,SAAS,mBAAmB,SAAA,EAGR;AACzB,EAAA,OAAO;AAAA,IACL,kBAAA,EAAoB,SAAA;AAAA,IACpB,CAAC,SAAA,CAAU,aAAa,GAAG,SAAA,CAAU,QAAA;AAAA,IACrC,qBAAA,EAAuB,SAAA;AAAA,IACvB,GAAI,UAAU,SAAA,IAAa;AAAA,MACzB,CAAC,SAAA,CAAU,cAAc,GAAG,SAAA,CAAU;AAAA;AACxC,GACF;AACF;AAKO,SAAS,uBAAuB,SAAA,EAIZ;AACzB,EAAA,OAAO;AAAA,IACL,kBAAA,EAAoB,aAAA;AAAA,IACpB,CAAC,SAAA,CAAU,mBAAmB,GAAG,SAAA,CAAU,UAAA;AAAA,IAC3C,uBAAuB,SAAA,CAAU,SAAA;AAAA,IACjC,GAAI,UAAU,OAAA,IAAW;AAAA,MACvB,CAAC,SAAA,CAAU,gBAAgB,GAAG,SAAA,CAAU;AAAA;AAC1C,GACF;AACF;AAKO,SAAS,6BAA6B,SAAA,EAIlB;AACzB,EAAA,OAAO;AAAA,IACL,CAAC,SAAA,CAAU,qBAAqB,GAAG,SAAA,CAAU,eAAA;AAAA,IAC7C,GAAI,UAAU,YAAA,IAAgB;AAAA,MAC5B,CAAC,SAAA,CAAU,iBAAiB,GAAG,SAAA,CAAU;AAAA,KAC3C;AAAA,IACA,GAAI,UAAU,WAAA,IAAe;AAAA,MAC3B,CAAC,SAAA,CAAU,gBAAgB,GAAG,SAAA,CAAU;AAAA;AAC1C,GACF;AACF;AAKO,SAAS,2BAA2B,SAAA,EAIhB;AACzB,EAAA,OAAO;AAAA,IACL,CAAC,SAAA,CAAU,qBAAqB,GAAG,SAAA,CAAU,QAAA;AAAA,IAC7C,CAAC,SAAA,CAAU,kBAAkB,GAAG,SAAA,CAAU,MAAA;AAAA,IAC1C,CAAC,SAAA,CAAU,uBAAuB,GAAG,SAAA,CAAU;AAAA,GACjD;AACF","file":"chunk-Q3DMMQ7K.cjs","sourcesContent":["/**\n * AWS semantic attribute helpers\n * Following OpenTelemetry AWS semantic conventions\n */\n\n/**\n * AWS semantic attribute keys\n */\nexport const AWS_ATTRS = {\n // Lambda\n LAMBDA_FUNCTION_NAME: 'faas.name',\n LAMBDA_FUNCTION_VERSION: 'faas.version',\n LAMBDA_INVOCATION_ID: 'faas.invocation_id',\n LAMBDA_COLD_START: 'faas.coldstart',\n LAMBDA_TRIGGER: 'faas.trigger',\n\n // AWS SDK\n AWS_SERVICE: 'rpc.service',\n AWS_OPERATION: 'rpc.method',\n AWS_REQUEST_ID: 'aws.request_id',\n AWS_EXTENDED_REQUEST_ID: 'aws.extended_request_id',\n AWS_CF_ID: 'aws.cf_id',\n\n // DynamoDB\n DDB_TABLE_NAMES: 'aws.dynamodb.table_names',\n DDB_CONSUMED_CAPACITY: 'aws.dynamodb.consumed_capacity',\n\n // S3\n S3_BUCKET: 'aws.s3.bucket',\n S3_KEY: 'aws.s3.key',\n S3_COPY_SOURCE: 'aws.s3.copy_source',\n\n // SQS\n SQS_QUEUE_NAME: 'messaging.destination.name',\n SQS_QUEUE_URL: 'aws.sqs.queue_url',\n SQS_MESSAGE_ID: 'messaging.message.id',\n\n // SNS\n SNS_TOPIC_ARN: 'messaging.destination.name',\n SNS_MESSAGE_ID: 'messaging.message.id',\n\n // Kinesis\n KINESIS_STREAM_NAME: 'messaging.destination.name',\n KINESIS_SHARD_ID: 'aws.kinesis.shard_id',\n\n // Step Functions\n SFN_STATE_MACHINE_ARN: 'aws.stepfunctions.state_machine_arn',\n SFN_EXECUTION_ARN: 'aws.stepfunctions.execution_arn',\n SFN_ACTIVITY_ARN: 'aws.stepfunctions.activity_arn',\n\n // EventBridge\n EVENTBRIDGE_EVENT_BUS: 'aws.eventbridge.event_bus',\n EVENTBRIDGE_SOURCE: 'aws.eventbridge.source',\n EVENTBRIDGE_DETAIL_TYPE: 'aws.eventbridge.detail_type',\n\n // X-Ray\n XRAY_ANNOTATIONS: 'aws.xray.annotations',\n} as const;\n\n/**\n * Build Lambda span attributes\n */\nexport function buildLambdaAttributes(context: {\n awsRequestId: string;\n functionName: string;\n functionVersion: string;\n coldStart?: boolean;\n trigger?: string;\n}): Record<string, string | boolean> {\n return {\n [AWS_ATTRS.LAMBDA_FUNCTION_NAME]: context.functionName,\n [AWS_ATTRS.LAMBDA_FUNCTION_VERSION]: context.functionVersion,\n [AWS_ATTRS.LAMBDA_INVOCATION_ID]: context.awsRequestId,\n 'cloud.provider': 'aws',\n 'cloud.region': process.env.AWS_REGION || '',\n ...(context.coldStart !== undefined && {\n [AWS_ATTRS.LAMBDA_COLD_START]: context.coldStart,\n }),\n ...(context.trigger && {\n [AWS_ATTRS.LAMBDA_TRIGGER]: context.trigger,\n }),\n };\n}\n\n/**\n * Build AWS SDK span attributes\n */\nexport function buildSDKAttributes(metadata: {\n service: string;\n operation: string;\n requestId?: string;\n httpStatusCode?: number;\n extendedRequestId?: string;\n cfId?: string;\n}): Record<string, string | number> {\n return {\n 'rpc.system': 'aws-api',\n [AWS_ATTRS.AWS_SERVICE]: metadata.service,\n [AWS_ATTRS.AWS_OPERATION]: metadata.operation,\n ...(metadata.requestId && {\n [AWS_ATTRS.AWS_REQUEST_ID]: metadata.requestId,\n }),\n ...(metadata.httpStatusCode && {\n 'http.status_code': metadata.httpStatusCode,\n }),\n ...(metadata.extendedRequestId && {\n [AWS_ATTRS.AWS_EXTENDED_REQUEST_ID]: metadata.extendedRequestId,\n }),\n ...(metadata.cfId && {\n [AWS_ATTRS.AWS_CF_ID]: metadata.cfId,\n }),\n };\n}\n\n/**\n * Build DynamoDB span attributes\n */\nexport function buildDynamoDBAttributes(operation: {\n tableName: string;\n operation: string;\n consumedCapacity?: number;\n}): Record<string, string | number | string[]> {\n return {\n 'db.system': 'dynamodb',\n 'db.operation': operation.operation,\n 'db.name': operation.tableName,\n [AWS_ATTRS.DDB_TABLE_NAMES]: [operation.tableName],\n ...(operation.consumedCapacity !== undefined && {\n [AWS_ATTRS.DDB_CONSUMED_CAPACITY]: operation.consumedCapacity,\n }),\n };\n}\n\n/**\n * Build S3 span attributes\n */\nexport function buildS3Attributes(operation: {\n bucket: string;\n key?: string;\n copySource?: string;\n}): Record<string, string> {\n return {\n [AWS_ATTRS.S3_BUCKET]: operation.bucket,\n ...(operation.key && {\n [AWS_ATTRS.S3_KEY]: operation.key,\n }),\n ...(operation.copySource && {\n [AWS_ATTRS.S3_COPY_SOURCE]: operation.copySource,\n }),\n };\n}\n\n/**\n * Build SQS span attributes\n */\nexport function buildSQSAttributes(operation: {\n queueName: string;\n queueUrl?: string;\n messageId?: string;\n operation: 'send' | 'receive';\n}): Record<string, string> {\n return {\n 'messaging.system': 'aws_sqs',\n [AWS_ATTRS.SQS_QUEUE_NAME]: operation.queueName,\n 'messaging.operation': operation.operation,\n ...(operation.queueUrl && {\n [AWS_ATTRS.SQS_QUEUE_URL]: operation.queueUrl,\n }),\n ...(operation.messageId && {\n [AWS_ATTRS.SQS_MESSAGE_ID]: operation.messageId,\n }),\n };\n}\n\n/**\n * Build SNS span attributes\n */\nexport function buildSNSAttributes(operation: {\n topicArn: string;\n messageId?: string;\n}): Record<string, string> {\n return {\n 'messaging.system': 'aws_sns',\n [AWS_ATTRS.SNS_TOPIC_ARN]: operation.topicArn,\n 'messaging.operation': 'publish',\n ...(operation.messageId && {\n [AWS_ATTRS.SNS_MESSAGE_ID]: operation.messageId,\n }),\n };\n}\n\n/**\n * Build Kinesis span attributes\n */\nexport function buildKinesisAttributes(operation: {\n streamName: string;\n shardId?: string;\n operation: 'put' | 'get';\n}): Record<string, string> {\n return {\n 'messaging.system': 'aws_kinesis',\n [AWS_ATTRS.KINESIS_STREAM_NAME]: operation.streamName,\n 'messaging.operation': operation.operation,\n ...(operation.shardId && {\n [AWS_ATTRS.KINESIS_SHARD_ID]: operation.shardId,\n }),\n };\n}\n\n/**\n * Build Step Functions span attributes\n */\nexport function buildStepFunctionsAttributes(operation: {\n stateMachineArn: string;\n executionArn?: string;\n activityArn?: string;\n}): Record<string, string> {\n return {\n [AWS_ATTRS.SFN_STATE_MACHINE_ARN]: operation.stateMachineArn,\n ...(operation.executionArn && {\n [AWS_ATTRS.SFN_EXECUTION_ARN]: operation.executionArn,\n }),\n ...(operation.activityArn && {\n [AWS_ATTRS.SFN_ACTIVITY_ARN]: operation.activityArn,\n }),\n };\n}\n\n/**\n * Build EventBridge span attributes\n */\nexport function buildEventBridgeAttributes(operation: {\n eventBus: string;\n source: string;\n detailType: string;\n}): Record<string, string> {\n return {\n [AWS_ATTRS.EVENTBRIDGE_EVENT_BUS]: operation.eventBus,\n [AWS_ATTRS.EVENTBRIDGE_SOURCE]: operation.source,\n [AWS_ATTRS.EVENTBRIDGE_DETAIL_TYPE]: operation.detailType,\n };\n}\n"]}