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,360 @@
1
+ import { TraceContext } from 'autotel';
2
+ import { SpanContext } from '@opentelemetry/api';
3
+
4
+ /**
5
+ * EventBridge instrumentation
6
+ *
7
+ * Provides helpers for tracing Amazon EventBridge operations with
8
+ * automatic W3C Trace Context propagation for distributed tracing.
9
+ *
10
+ * @example Publish events with trace context
11
+ * ```typescript
12
+ * import { EventBridgePublisher } from 'autotel-aws/eventbridge';
13
+ * import { EventBridgeClient } from '@aws-sdk/client-eventbridge';
14
+ *
15
+ * const client = new EventBridgeClient({ region: 'us-east-1' });
16
+ * const publisher = new EventBridgePublisher(client, {
17
+ * eventBusName: 'my-event-bus',
18
+ * source: 'com.myapp.orders'
19
+ * });
20
+ *
21
+ * // Publish with automatic trace context injection
22
+ * await publisher.putEvent({
23
+ * detailType: 'OrderCreated',
24
+ * detail: { orderId: '123', customerId: 'abc' }
25
+ * });
26
+ * ```
27
+ *
28
+ * @example Extract context in Lambda triggered by EventBridge
29
+ * ```typescript
30
+ * import { extractEventBridgeContext } from 'autotel-aws/eventbridge';
31
+ * import { wrapHandler } from 'autotel-aws/lambda';
32
+ *
33
+ * export const handler = wrapHandler(async (event) => {
34
+ * // Extract trace context from EventBridge event detail
35
+ * const parentContext = extractEventBridgeContext(event);
36
+ *
37
+ * // Process the event
38
+ * const { orderId, customerId } = event.detail;
39
+ * await processOrder(orderId, customerId);
40
+ *
41
+ * return { statusCode: 200 };
42
+ * });
43
+ * ```
44
+ *
45
+ * @example Trace EventBridge operations with helper
46
+ * ```typescript
47
+ * import { traceEventBridge } from 'autotel-aws/eventbridge';
48
+ *
49
+ * export const publishOrderEvent = traceEventBridge({
50
+ * eventBus: 'orders-bus',
51
+ * source: 'order-service',
52
+ * detailType: 'OrderCreated'
53
+ * })(ctx => async (order: Order) => {
54
+ * ctx.setAttribute('order.id', order.id);
55
+ * await eventBridge.send(new PutEventsCommand({
56
+ * Entries: [{
57
+ * EventBusName: 'orders-bus',
58
+ * Source: 'order-service',
59
+ * DetailType: 'OrderCreated',
60
+ * Detail: JSON.stringify(injectEventBridgeContext(order))
61
+ * }]
62
+ * }));
63
+ * });
64
+ * ```
65
+ */
66
+
67
+ /**
68
+ * EventBridge operation configuration for traceEventBridge helper
69
+ */
70
+ interface TraceEventBridgeConfig {
71
+ /**
72
+ * Event bus name or ARN
73
+ */
74
+ eventBus: string;
75
+ /**
76
+ * Event source (e.g., 'com.myapp.orders')
77
+ */
78
+ source: string;
79
+ /**
80
+ * Event detail type (e.g., 'OrderCreated')
81
+ */
82
+ detailType: string;
83
+ }
84
+ /**
85
+ * Configuration for EventBridgePublisher
86
+ */
87
+ interface EventBridgePublisherConfig {
88
+ /**
89
+ * Event bus name or ARN
90
+ * @default 'default' (the account's default event bus)
91
+ */
92
+ eventBusName?: string;
93
+ /**
94
+ * Event source (e.g., 'com.myapp.orders')
95
+ */
96
+ source: string;
97
+ /**
98
+ * Inject W3C Trace Context into event detail
99
+ * @default true
100
+ */
101
+ injectTraceContext?: boolean;
102
+ /**
103
+ * Optional service name for tracing
104
+ */
105
+ service?: string;
106
+ }
107
+ /**
108
+ * Event to publish via EventBridgePublisher
109
+ */
110
+ interface EventBridgeEvent<T = Record<string, unknown>> {
111
+ /**
112
+ * Event detail type (e.g., 'OrderCreated', 'UserSignedUp')
113
+ */
114
+ detailType: string;
115
+ /**
116
+ * Event detail (the actual payload)
117
+ */
118
+ detail: T;
119
+ /**
120
+ * Optional resources ARNs associated with the event
121
+ */
122
+ resources?: string[];
123
+ /**
124
+ * Optional time for the event (defaults to current time)
125
+ */
126
+ time?: Date;
127
+ /**
128
+ * Optional trace header (for X-Ray integration)
129
+ */
130
+ traceHeader?: string;
131
+ }
132
+ /**
133
+ * Trace context fields injected into EventBridge detail
134
+ */
135
+ interface TraceContextFields {
136
+ _traceContext?: {
137
+ traceparent: string;
138
+ tracestate?: string;
139
+ baggage?: string;
140
+ };
141
+ }
142
+ /**
143
+ * EventBridge event structure (Lambda event format)
144
+ */
145
+ interface EventBridgeLambdaEvent {
146
+ version?: string;
147
+ id?: string;
148
+ 'detail-type'?: string;
149
+ source?: string;
150
+ account?: string;
151
+ time?: string;
152
+ region?: string;
153
+ resources?: string[];
154
+ detail?: Record<string, unknown> & TraceContextFields;
155
+ }
156
+ /**
157
+ * Inject W3C Trace Context into EventBridge event detail
158
+ *
159
+ * Adds `_traceContext` field with traceparent, tracestate, and baggage.
160
+ * This enables distributed tracing from the publisher to all event consumers.
161
+ *
162
+ * @param detail - The event detail object
163
+ * @returns Detail with trace context injected
164
+ *
165
+ * @example
166
+ * ```typescript
167
+ * const detail = { orderId: '123', status: 'created' };
168
+ * const detailWithContext = injectEventBridgeContext(detail);
169
+ * // { orderId: '123', status: 'created', _traceContext: { traceparent: '...' } }
170
+ *
171
+ * await eventBridge.send(new PutEventsCommand({
172
+ * Entries: [{
173
+ * EventBusName: 'my-bus',
174
+ * Source: 'my-app',
175
+ * DetailType: 'OrderCreated',
176
+ * Detail: JSON.stringify(detailWithContext)
177
+ * }]
178
+ * }));
179
+ * ```
180
+ */
181
+ declare function injectEventBridgeContext<T extends Record<string, unknown>>(detail: T): T & TraceContextFields;
182
+ /**
183
+ * Extract W3C Trace Context from EventBridge Lambda event
184
+ *
185
+ * Extracts the `_traceContext` field from the event detail.
186
+ * Works with the Lambda event format from EventBridge rules.
187
+ *
188
+ * @param event - EventBridge Lambda event
189
+ * @returns SpanContext if trace context was found, undefined otherwise
190
+ *
191
+ * @example
192
+ * ```typescript
193
+ * // In a Lambda triggered by EventBridge
194
+ * export const handler = async (event: EventBridgeLambdaEvent) => {
195
+ * const parentContext = extractEventBridgeContext(event);
196
+ * // Use parentContext to link traces...
197
+ *
198
+ * // Access detail without trace context
199
+ * const cleanDetail = stripEventBridgeContext(event.detail);
200
+ * };
201
+ * ```
202
+ */
203
+ declare function extractEventBridgeContext(event: EventBridgeLambdaEvent): SpanContext | undefined;
204
+ /**
205
+ * Strip trace context fields from EventBridge event detail
206
+ *
207
+ * Returns the detail without `_traceContext` field for cleaner processing.
208
+ *
209
+ * @param detail - EventBridge event detail with optional trace context
210
+ * @returns Detail without trace context fields
211
+ *
212
+ * @example
213
+ * ```typescript
214
+ * const detail = { orderId: '123', _traceContext: { ... } };
215
+ * const cleanDetail = stripEventBridgeContext(detail);
216
+ * // { orderId: '123' }
217
+ * ```
218
+ */
219
+ declare function stripEventBridgeContext<T extends Record<string, unknown>>(detail: T): Omit<T, '_traceContext'>;
220
+ /**
221
+ * Trace EventBridge operations with semantic attributes
222
+ *
223
+ * Creates a traced function that automatically sets EventBridge attributes.
224
+ *
225
+ * @param config - EventBridge operation configuration
226
+ * @returns A higher-order function that wraps your EventBridge operation with tracing
227
+ *
228
+ * @remarks
229
+ * Semantic attributes set automatically:
230
+ * - `aws.eventbridge.event_bus` - Event bus name
231
+ * - `aws.eventbridge.source` - Event source
232
+ * - `aws.eventbridge.detail_type` - Event detail type
233
+ *
234
+ * @example
235
+ * ```typescript
236
+ * export const publishOrderEvent = traceEventBridge({
237
+ * eventBus: 'orders-bus',
238
+ * source: 'order-service',
239
+ * detailType: 'OrderCreated'
240
+ * })(ctx => async (order: Order) => {
241
+ * ctx.setAttribute('order.id', order.id);
242
+ *
243
+ * const detail = injectEventBridgeContext(order);
244
+ * await eventBridge.send(new PutEventsCommand({
245
+ * Entries: [{
246
+ * EventBusName: 'orders-bus',
247
+ * Source: 'order-service',
248
+ * DetailType: 'OrderCreated',
249
+ * Detail: JSON.stringify(detail)
250
+ * }]
251
+ * }));
252
+ * });
253
+ * ```
254
+ */
255
+ declare function traceEventBridge(config: TraceEventBridgeConfig): <TArgs extends unknown[], TReturn>(fn: (ctx: TraceContext) => (...args: TArgs) => Promise<TReturn>) => (...args: TArgs) => Promise<TReturn>;
256
+ /**
257
+ * EventBridge Publisher with automatic trace context injection
258
+ *
259
+ * Wraps an EventBridge client to automatically:
260
+ * - Create spans for PutEvents operations
261
+ * - Inject W3C Trace Context into event detail
262
+ * - Set proper semantic attributes
263
+ *
264
+ * @example Basic usage
265
+ * ```typescript
266
+ * import { EventBridgePublisher } from 'autotel-aws/eventbridge';
267
+ * import { EventBridgeClient } from '@aws-sdk/client-eventbridge';
268
+ *
269
+ * const client = new EventBridgeClient({ region: 'us-east-1' });
270
+ * const publisher = new EventBridgePublisher(client, {
271
+ * eventBusName: 'my-event-bus',
272
+ * source: 'com.myapp.orders'
273
+ * });
274
+ *
275
+ * // Publish single event
276
+ * const result = await publisher.putEvent({
277
+ * detailType: 'OrderCreated',
278
+ * detail: { orderId: '123', customerId: 'abc' }
279
+ * });
280
+ * console.log('Event ID:', result.eventId);
281
+ * ```
282
+ *
283
+ * @example Batch publish multiple events
284
+ * ```typescript
285
+ * const results = await publisher.putEvents([
286
+ * { detailType: 'OrderCreated', detail: { orderId: '1' } },
287
+ * { detailType: 'OrderCreated', detail: { orderId: '2' } },
288
+ * { detailType: 'OrderCreated', detail: { orderId: '3' } }
289
+ * ]);
290
+ *
291
+ * console.log(`Published ${results.successful.length} events`);
292
+ * console.log(`Failed ${results.failed.length} events`);
293
+ * ```
294
+ *
295
+ * @example Multiple sources
296
+ * ```typescript
297
+ * // Create publishers for different event sources
298
+ * const ordersPublisher = new EventBridgePublisher(client, {
299
+ * source: 'com.myapp.orders'
300
+ * });
301
+ *
302
+ * const usersPublisher = new EventBridgePublisher(client, {
303
+ * source: 'com.myapp.users'
304
+ * });
305
+ *
306
+ * await ordersPublisher.putEvent({ detailType: 'OrderCreated', detail: {...} });
307
+ * await usersPublisher.putEvent({ detailType: 'UserSignedUp', detail: {...} });
308
+ * ```
309
+ */
310
+ declare class EventBridgePublisher<TClient extends {
311
+ send: (command: any) => Promise<any>;
312
+ } = any> {
313
+ private client;
314
+ private config;
315
+ constructor(client: TClient, config: EventBridgePublisherConfig);
316
+ /**
317
+ * Publish a single event to EventBridge
318
+ *
319
+ * @param event - Event to publish
320
+ * @returns Promise with event ID (if successful)
321
+ */
322
+ putEvent<T extends Record<string, unknown>>(event: EventBridgeEvent<T>): Promise<{
323
+ eventId?: string;
324
+ failedEntryCount?: number;
325
+ }>;
326
+ /**
327
+ * Publish multiple events in a batch
328
+ *
329
+ * @param events - Array of events to publish (max 10 per API call)
330
+ * @returns Promise with successful and failed event results
331
+ */
332
+ putEvents<T extends Record<string, unknown>>(events: EventBridgeEvent<T>[]): Promise<{
333
+ successful: Array<{
334
+ eventId?: string;
335
+ detailType: string;
336
+ }>;
337
+ failed: Array<{
338
+ errorCode?: string;
339
+ errorMessage?: string;
340
+ detailType: string;
341
+ }>;
342
+ failedEntryCount: number;
343
+ }>;
344
+ /**
345
+ * Publish event with override source
346
+ *
347
+ * Use when you need to publish to a different source than the default.
348
+ *
349
+ * @param event - Event with source override
350
+ * @returns Promise with event ID
351
+ */
352
+ putEventWithSource<T extends Record<string, unknown>>(event: EventBridgeEvent<T> & {
353
+ source: string;
354
+ }): Promise<{
355
+ eventId?: string;
356
+ failedEntryCount?: number;
357
+ }>;
358
+ }
359
+
360
+ export { type EventBridgeEvent, type EventBridgeLambdaEvent, EventBridgePublisher, type EventBridgePublisherConfig, type TraceEventBridgeConfig, extractEventBridgeContext, injectEventBridgeContext, stripEventBridgeContext, traceEventBridge };