autotel-cloudflare 4.0.4 → 4.0.6

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.
package/LICENSE CHANGED
@@ -1,21 +1,191 @@
1
- MIT License
2
-
3
- Copyright (c) Jag Reehal 2025
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction, and
10
+ distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by the
13
+ copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all other
16
+ entities that control, are controlled by, or are under common control with
17
+ that entity. For the purposes of this definition, "control" means (i) the
18
+ power, direct or indirect, to cause the direction or management of such
19
+ entity, whether by contract or otherwise, or (ii) ownership of fifty
20
+ percent (50%) or more of the outstanding shares, or (iii) beneficial
21
+ ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity exercising
24
+ permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation source,
28
+ and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical transformation
31
+ or translation of a Source form, including but not limited to compiled
32
+ object code, generated documentation, and conversions to other media types.
33
+
34
+ "Work" shall mean the work of authorship, whether in Source or Object form,
35
+ made available under the License, as indicated by a copyright notice that
36
+ is included in or attached to the work (an example is provided in the
37
+ Appendix below).
38
+
39
+ "Derivative Works" shall mean any work, whether in Source or Object form,
40
+ that is based on (or derived from) the Work and for which the editorial
41
+ revisions, annotations, elaborations, or other modifications represent, as
42
+ a whole, an original work of authorship. For the purposes of this License,
43
+ Derivative Works shall not include works that remain separable from, or
44
+ merely link (or bind by name) to the interfaces of, the Work and Derivative
45
+ Works thereof.
46
+
47
+ "Contribution" shall mean any work of authorship, including the original
48
+ version of the Work and any modifications or additions to that Work or
49
+ Derivative Works thereof, that is intentionally submitted to Licensor for
50
+ inclusion in the Work by the copyright owner or by an individual or Legal
51
+ Entity authorized to submit on behalf of the copyright owner. For the
52
+ purposes of this definition, "submitted" means any form of electronic,
53
+ verbal, or written communication sent to the Licensor or its
54
+ representatives, including but not limited to communication on electronic
55
+ mailing lists, source code control systems, and issue tracking systems that
56
+ are managed by, or on behalf of, the Licensor for the purpose of discussing
57
+ and improving the Work, but excluding communication that is conspicuously
58
+ marked or otherwise designated in writing by the copyright owner as "Not a
59
+ Contribution."
60
+
61
+ "Contributor" shall mean Licensor and any individual or Legal Entity on
62
+ behalf of whom a Contribution has been received by Licensor and
63
+ subsequently incorporated within the Work.
64
+
65
+ 2. Grant of Copyright License. Subject to the terms and conditions of this
66
+ License, each Contributor hereby grants to You a perpetual, worldwide,
67
+ non-exclusive, no-charge, royalty-free, irrevocable copyright license to
68
+ reproduce, prepare Derivative Works of, publicly display, publicly perform,
69
+ sublicense, and distribute the Work and such Derivative Works in Source or
70
+ Object form.
71
+
72
+ 3. Grant of Patent License. Subject to the terms and conditions of this
73
+ License, each Contributor hereby grants to You a perpetual, worldwide,
74
+ non-exclusive, no-charge, royalty-free, irrevocable (except as stated in
75
+ this section) patent license to make, have made, use, offer to sell, sell,
76
+ import, and otherwise transfer the Work, where such license applies only to
77
+ those patent claims licensable by such Contributor that are necessarily
78
+ infringed by their Contribution(s) alone or by combination of their
79
+ Contribution(s) with the Work to which such Contribution(s) was submitted.
80
+ If You institute patent litigation against any entity (including a
81
+ cross-claim or counterclaim in a lawsuit) alleging that the Work or a
82
+ Contribution incorporated within the Work constitutes direct or
83
+ contributory patent infringement, then any patent licenses granted to You
84
+ under this License for that Work shall terminate as of the date such
85
+ litigation is filed.
86
+
87
+ 4. Redistribution. You may reproduce and distribute copies of the Work or
88
+ Derivative Works thereof in any medium, with or without modifications, and
89
+ in Source or Object form, provided that You meet the following conditions:
90
+
91
+ (a) You must give any other recipients of the Work or Derivative Works
92
+ a copy of this License; and
93
+
94
+ (b) You must cause any modified files to carry prominent notices
95
+ stating that You changed the files; and
96
+
97
+ (c) You must retain, in the Source form of any Derivative Works that
98
+ You distribute, all copyright, patent, trademark, and attribution notices
99
+ from the Source form of the Work, excluding those notices that do not
100
+ pertain to any part of the Derivative Works; and
101
+
102
+ (d) If the Work includes a "NOTICE" text file as part of its
103
+ distribution, then any Derivative Works that You distribute must include a
104
+ readable copy of the attribution notices contained within such NOTICE file,
105
+ excluding those notices that do not pertain to any part of the Derivative
106
+ Works, in at least one of the following places: within a NOTICE text file
107
+ distributed as part of the Derivative Works; within the Source form or
108
+ documentation, if provided along with the Derivative Works; or, within a
109
+ display generated by the Derivative Works, if and wherever such third-party
110
+ notices normally appear. The contents of the NOTICE file are for
111
+ informational purposes only and do not modify the License. You may add Your
112
+ own attribution notices within Derivative Works that You distribute,
113
+ alongside or as an addendum to the NOTICE text from the Work, provided that
114
+ such additional attribution notices cannot be construed as modifying the
115
+ License.
116
+
117
+ You may add Your own copyright statement to Your modifications and may
118
+ provide additional or different license terms and conditions for use,
119
+ reproduction, or distribution of Your modifications, or for any such
120
+ Derivative Works as a whole, provided Your use, reproduction, and
121
+ distribution of the Work otherwise complies with the conditions stated in
122
+ this License.
123
+
124
+ 5. Submission of Contributions. Unless You explicitly state otherwise, any
125
+ Contribution intentionally submitted for inclusion in the Work by You to
126
+ the Licensor shall be under the terms and conditions of this License,
127
+ without any additional terms or conditions. Notwithstanding the above,
128
+ nothing herein shall supersede or modify the terms of any separate license
129
+ agreement you may have executed with Licensor regarding such Contributions.
130
+
131
+ 6. Trademarks. This License does not grant permission to use the trade
132
+ names, trademarks, service marks, or product names of the Licensor, except
133
+ as required for reasonable and customary use in describing the origin of
134
+ the Work and reproducing the content of the NOTICE file.
135
+
136
+ 7. Disclaimer of Warranty. Unless required by applicable law or agreed to
137
+ in writing, Licensor provides the Work (and each Contributor provides its
138
+ Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
139
+ KIND, either express or implied, including, without limitation, any
140
+ warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or
141
+ FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for
142
+ determining the appropriateness of using or redistributing the Work and
143
+ assume any risks associated with Your exercise of permissions under this
144
+ License.
145
+
146
+ 8. Limitation of Liability. In no event and under no legal theory, whether
147
+ in tort (including negligence), contract, or otherwise, unless required by
148
+ applicable law (such as deliberate and grossly negligent acts) or agreed to
149
+ in writing, shall any Contributor be liable to You for damages, including
150
+ any direct, indirect, special, incidental, or consequential damages of any
151
+ character arising as a result of this License or out of the use or
152
+ inability to use the Work (including but not limited to damages for loss of
153
+ goodwill, work stoppage, computer failure or malfunction, or any and all
154
+ other commercial damages or losses), even if such Contributor has been
155
+ advised of the possibility of such damages.
156
+
157
+ 9. Accepting Warranty or Additional Liability. While redistributing the
158
+ Work or Derivative Works thereof, You may choose to offer, and charge a fee
159
+ for, acceptance of support, warranty, indemnity, or other liability
160
+ obligations and/or rights consistent with this License. However, in
161
+ accepting such obligations, You may act only on Your own behalf and on Your
162
+ sole responsibility, not on behalf of any other Contributor, and only if
163
+ You agree to indemnify, defend, and hold each Contributor harmless for any
164
+ liability incurred by, or claims asserted against, such Contributor by
165
+ reason of your accepting any such warranty or additional liability.
166
+
167
+ END OF TERMS AND CONDITIONS
168
+
169
+ APPENDIX: How to apply the Apache License to your work.
170
+
171
+ To apply the Apache License to your work, attach the following boilerplate
172
+ notice, with the fields enclosed by brackets "[]" replaced with your own
173
+ identifying information. (Don't include the brackets!) The text should be
174
+ enclosed in the appropriate comment syntax for the file format. We also
175
+ recommend that a file or class name and description of purpose be included
176
+ on the same "printed page" as the copyright notice for easier
177
+ identification within third-party archives.
178
+
179
+ Copyright [yyyy] [name of copyright owner]
180
+
181
+ Licensed under the Apache License, Version 2.0 (the "License");
182
+ you may not use this file except in compliance with the License.
183
+ You may obtain a copy of the License at
184
+
185
+ http://www.apache.org/licenses/LICENSE-2.0
186
+
187
+ Unless required by applicable law or agreed to in writing, software
188
+ distributed under the License is distributed on an "AS IS" BASIS,
189
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
190
+ See the License for the specific language governing permissions and
191
+ limitations under the License.
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  [![npm version](https://badge.fury.io/js/autotel-cloudflare.svg)](https://www.npmjs.com/package/autotel-cloudflare)
6
6
  [![Bundle Size](https://img.shields.io/bundlephobia/minzip/autotel-cloudflare)](https://bundlephobia.com/package/autotel-cloudflare)
7
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+ [![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
8
8
 
9
9
  ## Features
10
10
 
@@ -571,7 +571,7 @@ See [apps/cloudflare-example](../../apps/cloudflare-example) for a complete work
571
571
 
572
572
  ## License
573
573
 
574
- MIT © [Jag Reehal](https://github.com/jagreehal)
574
+ Apache-2.0 © [Jag Reehal](https://github.com/jagreehal)
575
575
 
576
576
  ## Links
577
577
 
package/dist/actors.js CHANGED
@@ -821,10 +821,11 @@ function instrumentActor(actorClass, config) {
821
821
  ...defaultOptions,
822
822
  ...actorOptions
823
823
  };
824
- const context$1 = setConfig(initialiser(env, {
824
+ const trigger = {
825
825
  id: state.id.toString(),
826
826
  name: state.id.name
827
- }));
827
+ };
828
+ const context$1 = setConfig(initialiser(env, trigger));
828
829
  return instrumentActorInstance(context.with(context$1, () => {
829
830
  return new target(state, env);
830
831
  }), state, env, actorClass, options);
@@ -1 +1 @@
1
- {"version":3,"file":"actors.js","names":["getTracer","getTracer","getTracer","getTracer","api_context","context","api_context"],"sources":["../src/actors/storage.ts","../src/actors/alarms.ts","../src/actors/sockets.ts","../src/actors/instrument-actor.ts","../src/actors/traced-handler.ts"],"sourcesContent":["/**\n * Actor storage instrumentation\n *\n * Traces operations on actor.storage including SQL queries\n */\n\nimport { trace, SpanStatusCode, SpanKind } from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\nimport type { ActorLike } from './types';\n\n/**\n * Get the tracer instance\n */\nfunction getTracer(): WorkerTracer {\n return trace.getTracer('autotel-cloudflare-actors') as WorkerTracer;\n}\n\n/**\n * Instrument Actor storage for tracing\n *\n * Captures:\n * - SQL query operations\n * - Key-value operations (if available)\n */\nexport function instrumentActorStorage(\n storage: unknown,\n actorInstance: ActorLike,\n actorClass: object,\n): unknown {\n if (!storage || typeof storage !== 'object') {\n return storage;\n }\n\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const actorName = actorInstance.name || actorClassName;\n\n const storageHandler: ProxyHandler<object> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Instrument SQL query method if it exists\n // The Actors Storage class has an exec method for SQL\n if (prop === 'exec' && typeof value === 'function') {\n return function instrumentedExec(\n this: unknown,\n query: string,\n ...params: unknown[]\n ): unknown {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: storage.exec`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'db.system': 'sqlite',\n 'db.operation': 'exec',\n 'db.statement': query,\n 'db.statement.params_count': params.length,\n },\n },\n (span) => {\n try {\n const result = value.call(target, query, ...params);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument query method (alternative name for exec)\n if (prop === 'query' && typeof value === 'function') {\n return function instrumentedQuery(\n this: unknown,\n query: string,\n ...params: unknown[]\n ): unknown {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: storage.query`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'db.system': 'sqlite',\n 'db.operation': 'query',\n 'db.statement': query,\n 'db.statement.params_count': params.length,\n },\n },\n (span) => {\n try {\n const result = value.call(target, query, ...params);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument get method\n if (prop === 'get' && typeof value === 'function') {\n return async function instrumentedGet(this: unknown, key: string): Promise<unknown> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: storage.get`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'db.system': 'durable_object_storage',\n 'db.operation': 'get',\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await value.call(target, key);\n span.setAttributes({\n 'db.result.found': result !== null && result !== undefined,\n });\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument put method\n if (prop === 'put' && typeof value === 'function') {\n return async function instrumentedPut(\n this: unknown,\n key: string,\n val: unknown,\n ): Promise<void> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: storage.put`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'db.system': 'durable_object_storage',\n 'db.operation': 'put',\n 'db.key': key,\n 'db.value_type': typeof val,\n },\n },\n async (span) => {\n try {\n await value.call(target, key, val);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument delete method\n if (prop === 'delete' && typeof value === 'function') {\n return async function instrumentedDelete(this: unknown, key: string): Promise<boolean> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: storage.delete`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'db.system': 'durable_object_storage',\n 'db.operation': 'delete',\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await value.call(target, key);\n span.setAttributes({\n 'db.result.deleted': result,\n });\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(storage, storageHandler);\n}\n","/**\n * Actor alarms instrumentation\n *\n * Traces operations on actor.alarms\n */\n\nimport { trace, SpanStatusCode, SpanKind } from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\nimport type { ActorLike } from './types';\n\n/**\n * Get the tracer instance\n */\nfunction getTracer(): WorkerTracer {\n return trace.getTracer('autotel-cloudflare-actors') as WorkerTracer;\n}\n\n/**\n * Instrument Actor alarms for tracing\n *\n * Captures:\n * - set: Schedule a single alarm\n * - setMultiple: Schedule multiple alarms\n * - cancel: Cancel an alarm\n * - cancelAll: Cancel all alarms\n */\nexport function instrumentActorAlarms(\n alarms: unknown,\n actorInstance: ActorLike,\n actorClass: object,\n): unknown {\n if (!alarms || typeof alarms !== 'object') {\n return alarms;\n }\n\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const actorName = actorInstance.name || actorClassName;\n\n const alarmsHandler: ProxyHandler<object> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Instrument set method\n if (prop === 'set' && typeof value === 'function') {\n return async function instrumentedSet(\n this: unknown,\n ...args: unknown[]\n ): Promise<unknown> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: alarms.set`;\n\n // Try to extract timing info from args\n const alarmAttributes: Record<string, string | number | boolean> = {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'alarm.operation': 'set',\n };\n\n // First arg might be timestamp, delay, or options\n if (args.length > 0) {\n const firstArg = args[0];\n if (typeof firstArg === 'number') {\n alarmAttributes['alarm.delay_ms'] = firstArg;\n } else if (firstArg instanceof Date) {\n alarmAttributes['alarm.scheduled_time'] = firstArg.toISOString();\n } else if (typeof firstArg === 'string') {\n // Might be a cron expression\n alarmAttributes['alarm.cron'] = firstArg;\n }\n }\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: alarmAttributes,\n },\n async (span) => {\n try {\n const result = await value.apply(target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument setMultiple method\n if (prop === 'setMultiple' && typeof value === 'function') {\n return async function instrumentedSetMultiple(\n this: unknown,\n alarmDefs: unknown[],\n ): Promise<unknown> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: alarms.setMultiple`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'alarm.operation': 'setMultiple',\n 'alarm.count': Array.isArray(alarmDefs) ? alarmDefs.length : 0,\n },\n },\n async (span) => {\n try {\n const result = await value.call(target, alarmDefs);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument cancel method\n if (prop === 'cancel' && typeof value === 'function') {\n return async function instrumentedCancel(\n this: unknown,\n alarmId: string,\n ): Promise<unknown> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: alarms.cancel`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'alarm.operation': 'cancel',\n 'alarm.id': alarmId,\n },\n },\n async (span) => {\n try {\n const result = await value.call(target, alarmId);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument cancelAll method\n if (prop === 'cancelAll' && typeof value === 'function') {\n return async function instrumentedCancelAll(this: unknown): Promise<unknown> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: alarms.cancelAll`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'alarm.operation': 'cancelAll',\n },\n },\n async (span) => {\n try {\n const result = await value.call(target);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(alarms, alarmsHandler);\n}\n","/**\n * Actor sockets instrumentation\n *\n * Traces operations on actor.sockets\n */\n\nimport { trace, SpanStatusCode, SpanKind } from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\nimport type { ActorLike } from './types';\n\n/**\n * Get the tracer instance\n */\nfunction getTracer(): WorkerTracer {\n return trace.getTracer('autotel-cloudflare-actors') as WorkerTracer;\n}\n\n/**\n * Instrument Actor sockets for tracing\n *\n * Captures:\n * - acceptWebSocket: Accept an incoming WebSocket connection\n * - broadcast: Send message to all connected sockets\n * - send: Send message to a specific socket\n */\nexport function instrumentActorSockets(\n sockets: unknown,\n actorInstance: ActorLike,\n actorClass: object,\n): unknown {\n if (!sockets || typeof sockets !== 'object') {\n return sockets;\n }\n\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const actorName = actorInstance.name || actorClassName;\n\n const socketsHandler: ProxyHandler<object> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Instrument acceptWebSocket method\n if (prop === 'acceptWebSocket' && typeof value === 'function') {\n return function instrumentedAcceptWebSocket(\n this: unknown,\n request: Request,\n ): unknown {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: sockets.acceptWebSocket`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'websocket.operation': 'accept',\n 'url.full': request.url,\n },\n },\n (span) => {\n try {\n const result = value.call(target, request);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument broadcast method\n if (prop === 'broadcast' && typeof value === 'function') {\n return function instrumentedBroadcast(this: unknown, message: unknown): void {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: sockets.broadcast`;\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.PRODUCER,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'websocket.operation': 'broadcast',\n 'websocket.message.type': typeof message,\n 'websocket.message.size':\n typeof message === 'string'\n ? message.length\n : message instanceof ArrayBuffer\n ? message.byteLength\n : 0,\n },\n },\n (span) => {\n try {\n value.call(target, message);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument send method\n if (prop === 'send' && typeof value === 'function') {\n return function instrumentedSend(this: unknown, ws: WebSocket, message: unknown): void {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: sockets.send`;\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.PRODUCER,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'websocket.operation': 'send',\n 'websocket.message.type': typeof message,\n 'websocket.message.size':\n typeof message === 'string'\n ? message.length\n : message instanceof ArrayBuffer\n ? message.byteLength\n : 0,\n },\n },\n (span) => {\n try {\n value.call(target, ws, message);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument getConnections method (if exists)\n if (prop === 'getConnections' && typeof value === 'function') {\n return function instrumentedGetConnections(this: unknown): unknown {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: sockets.getConnections`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'websocket.operation': 'getConnections',\n },\n },\n (span) => {\n try {\n const result = value.call(target);\n // Try to capture connection count if result is array-like\n if (Array.isArray(result)) {\n span.setAttribute('websocket.connections.count', result.length);\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(sockets, socketsHandler);\n}\n","/**\n * Actor class instrumentation for @cloudflare/actors\n *\n * Wraps Actor lifecycle methods with OpenTelemetry tracing:\n * - onInit: Traced as 'actor.lifecycle': 'init'\n * - onRequest: Traced with full HTTP semantics\n * - onAlarm: Traced as 'actor.lifecycle': 'alarm'\n * - onPersist: Traced as 'actor.lifecycle': 'persist'\n * - WebSocket methods: Traced with socket semantics\n */\n\nimport {\n trace,\n context as api_context,\n propagation,\n SpanStatusCode,\n SpanKind,\n} from '@opentelemetry/api';\nimport type { ConfigurationOption } from 'autotel-edge';\nimport { createInitialiser, setConfig, WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\nimport type {\n ActorConfig,\n ActorConstructor,\n ActorLike,\n ActorLifecycle,\n ActorInstrumentationOptions,\n} from './types';\nimport { instrumentActorStorage } from './storage';\nimport { instrumentActorAlarms } from './alarms';\nimport { instrumentActorSockets } from './sockets';\n\n/**\n * Track cold starts per Actor class\n */\nconst coldStarts = new WeakMap<object, boolean>();\n\nfunction isColdStart(actorClass: object): boolean {\n if (!coldStarts.has(actorClass)) {\n coldStarts.set(actorClass, true);\n return true;\n }\n return false;\n}\n\n/**\n * Get the tracer instance\n */\nfunction getTracer(): WorkerTracer {\n return trace.getTracer('autotel-cloudflare-actors') as WorkerTracer;\n}\n\n/**\n * Default span name formatter\n */\nfunction defaultSpanNameFormatter(\n actorName: string,\n actorClass: string,\n lifecycle: ActorLifecycle,\n): string {\n const displayName = actorName || actorClass;\n return `Actor ${displayName}: ${lifecycle}`;\n}\n\n/**\n * Create base Actor span attributes\n */\nfunction createActorAttributes(\n actorInstance: ActorLike,\n actorClass: object,\n lifecycle: ActorLifecycle,\n): Record<string, string | boolean | number> {\n return {\n 'actor.name': actorInstance.name || 'unknown',\n 'actor.class': (actorClass as { name?: string }).name || 'Actor',\n 'actor.lifecycle': lifecycle,\n 'actor.coldstart': isColdStart(actorClass),\n ...(actorInstance.identifier && { 'actor.identifier': actorInstance.identifier }),\n };\n}\n\n/**\n * Instrument the onInit lifecycle method\n */\nfunction instrumentOnInit(\n originalMethod: () => Promise<void>,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): () => Promise<void> {\n return async function instrumentedOnInit(): Promise<void> {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'init')\n : defaultSpanNameFormatter(actorInstance.name || '', actorClassName, 'init');\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.INTERNAL,\n attributes: createActorAttributes(actorInstance, actorClass, 'init'),\n },\n async (span) => {\n try {\n await originalMethod.call(actorInstance);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n/**\n * Instrument the onRequest lifecycle method\n */\nfunction instrumentOnRequest(\n originalMethod: (request: Request) => Promise<Response>,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (request: Request) => Promise<Response> {\n return async function instrumentedOnRequest(request: Request): Promise<Response> {\n const tracer = getTracer();\n\n // Extract parent context from request headers\n const parentContext = propagation.extract(api_context.active(), request.headers);\n\n const url = new URL(request.url);\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'request')\n : `Actor ${actorInstance.name || actorClassName}: ${request.method} ${url.pathname}`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'request'),\n 'http.request.method': request.method,\n 'url.full': request.url,\n 'url.path': url.pathname,\n 'url.query': url.search,\n },\n },\n parentContext,\n async (span) => {\n try {\n const response = await originalMethod.call(actorInstance, request);\n\n span.setAttributes({\n 'http.response.status_code': response.status,\n });\n\n if (response.ok) {\n span.setStatus({ code: SpanStatusCode.OK });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n return response;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n/**\n * Instrument the onAlarm lifecycle method\n */\nfunction instrumentOnAlarm(\n originalMethod: (alarmInfo?: unknown) => Promise<void>,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (alarmInfo?: unknown) => Promise<void> {\n return async function instrumentedOnAlarm(alarmInfo?: unknown): Promise<void> {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'alarm')\n : defaultSpanNameFormatter(actorInstance.name || '', actorClassName, 'alarm');\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'alarm'),\n 'faas.trigger': 'timer',\n },\n },\n async (span) => {\n try {\n await originalMethod.call(actorInstance, alarmInfo);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n/**\n * Instrument the onPersist lifecycle method\n */\nfunction instrumentOnPersist(\n originalMethod: (key: string, value: unknown) => void,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (key: string, value: unknown) => void {\n if (!options.capturePersistEvents) {\n return originalMethod;\n }\n\n return function instrumentedOnPersist(key: string, value: unknown): void {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'persist')\n : `Actor ${actorInstance.name || actorClassName}: persist ${key}`;\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'persist'),\n 'actor.persist.key': key,\n 'actor.persist.value_type': typeof value,\n },\n },\n (span) => {\n try {\n originalMethod.call(actorInstance, key, value);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n/**\n * Instrument WebSocket lifecycle methods\n */\nfunction instrumentWebSocketConnect(\n originalMethod: (ws: WebSocket, request: Request) => void,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (ws: WebSocket, request: Request) => void {\n return function instrumentedWebSocketConnect(ws: WebSocket, request: Request): void {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'websocket.connect')\n : defaultSpanNameFormatter(actorInstance.name || '', actorClassName, 'websocket.connect');\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'websocket.connect'),\n 'url.full': request.url,\n },\n },\n (span) => {\n try {\n originalMethod.call(actorInstance, ws, request);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\nfunction instrumentWebSocketMessage(\n originalMethod: (ws: WebSocket, message: unknown) => void,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (ws: WebSocket, message: unknown) => void {\n return function instrumentedWebSocketMessage(ws: WebSocket, message: unknown): void {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'websocket.message')\n : defaultSpanNameFormatter(actorInstance.name || '', actorClassName, 'websocket.message');\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'websocket.message'),\n 'websocket.message.type': typeof message,\n 'websocket.message.size':\n typeof message === 'string'\n ? message.length\n : message instanceof ArrayBuffer\n ? message.byteLength\n : 0,\n },\n },\n (span) => {\n try {\n originalMethod.call(actorInstance, ws, message);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\nfunction instrumentWebSocketDisconnect(\n originalMethod: (ws: WebSocket) => void,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (ws: WebSocket) => void {\n return function instrumentedWebSocketDisconnect(ws: WebSocket): void {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'websocket.disconnect')\n : defaultSpanNameFormatter(actorInstance.name || '', actorClassName, 'websocket.disconnect');\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: createActorAttributes(actorInstance, actorClass, 'websocket.disconnect'),\n },\n (span) => {\n try {\n originalMethod.call(actorInstance, ws);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n/**\n * Instrument an Actor instance by wrapping all lifecycle methods\n */\nfunction instrumentActorInstance(\n actorInstance: ActorLike,\n _state: DurableObjectState,\n _env: unknown,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): ActorLike {\n const instanceHandler: ProxyHandler<ActorLike> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Lifecycle methods that need instrumentation\n if (prop === 'onInit' && typeof value === 'function') {\n return instrumentOnInit(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onRequest' && typeof value === 'function') {\n return instrumentOnRequest(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onAlarm' && typeof value === 'function') {\n return instrumentOnAlarm(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onPersist' && typeof value === 'function') {\n return instrumentOnPersist(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onWebSocketConnect' && typeof value === 'function') {\n return instrumentWebSocketConnect(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onWebSocketMessage' && typeof value === 'function') {\n return instrumentWebSocketMessage(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onWebSocketDisconnect' && typeof value === 'function') {\n return instrumentWebSocketDisconnect(value.bind(target), target, actorClass, options);\n }\n\n // Instrument sub-components if enabled\n if (prop === 'storage' && value && options.instrumentStorage !== false) {\n return instrumentActorStorage(value, target, actorClass);\n }\n\n if (prop === 'alarms' && value && options.instrumentAlarms !== false) {\n return instrumentActorAlarms(value, target, actorClass);\n }\n\n if (prop === 'sockets' && value && options.instrumentSockets !== false) {\n return instrumentActorSockets(value, target, actorClass);\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(actorInstance, instanceHandler);\n}\n\n/**\n * Instrument an Actor class for comprehensive OpenTelemetry tracing\n *\n * This wraps the Actor class to automatically trace all lifecycle methods:\n * - onInit: Actor initialization\n * - onRequest: HTTP request handling\n * - onAlarm: Alarm triggers\n * - onPersist: Property persistence events\n * - WebSocket methods: Connection, message, disconnect\n *\n * It also optionally instruments:\n * - actor.storage: SQL queries and storage operations\n * - actor.alarms: Alarm scheduling operations\n * - actor.sockets: WebSocket operations\n *\n * @example\n * ```typescript\n * import { Actor } from '@cloudflare/actors'\n * import { instrumentActor } from 'autotel-cloudflare/actors'\n *\n * class Counter extends Actor<Env> {\n * protected onInit() {\n * console.log('Counter initialized')\n * }\n *\n * protected onRequest(request: Request) {\n * return new Response('count: 42')\n * }\n * }\n *\n * // Wrap the class\n * export const InstrumentedCounter = instrumentActor(Counter, (env: Env) => ({\n * service: { name: 'counter-actor' },\n * exporter: { url: env.OTLP_ENDPOINT },\n * actors: {\n * instrumentStorage: true,\n * capturePersistEvents: true\n * }\n * }))\n * ```\n *\n * @param actorClass - The Actor class to instrument\n * @param config - Configuration (static object or function)\n * @returns Instrumented Actor class\n */\nexport function instrumentActor<C extends ActorConstructor>(\n actorClass: C,\n config: ActorConfig | ((env: unknown, trigger?: unknown) => ActorConfig),\n): C {\n const initialiser = createInitialiser(config as ConfigurationOption);\n\n // Default options\n const defaultOptions: ActorInstrumentationOptions = {\n instrumentStorage: true,\n instrumentAlarms: true,\n instrumentSockets: true,\n capturePersistEvents: true,\n };\n\n const classHandler: ProxyHandler<C> = {\n construct(target, [state, env]: [DurableObjectState, unknown]) {\n // Get config (either static or from function)\n const resolvedConfig =\n typeof config === 'function'\n ? config(env, { id: state.id.toString(), name: state.id.name })\n : config;\n\n // Merge options with defaults\n // Handle the case where config might not have actors property\n const actorOptions =\n resolvedConfig && typeof resolvedConfig === 'object' && 'actors' in resolvedConfig\n ? (resolvedConfig as { actors?: ActorInstrumentationOptions }).actors\n : undefined;\n const options: ActorInstrumentationOptions = {\n ...defaultOptions,\n ...actorOptions,\n };\n\n // Initialize telemetry config\n const trigger = {\n id: state.id.toString(),\n name: state.id.name,\n };\n const telemetryConfig = initialiser(env, trigger);\n const context = setConfig(telemetryConfig);\n\n // Create the Actor instance within the config context\n const actorInstance = api_context.with(context, () => {\n return new target(state, env);\n }) as ActorLike;\n\n // Instrument the instance\n return instrumentActorInstance(actorInstance, state, env, actorClass, options);\n },\n };\n\n return wrap(actorClass, classHandler);\n}\n","/**\n * Traced handler wrapper for @cloudflare/actors\n *\n * Wraps the Actors handler() to provide:\n * - Root span for the entire request lifecycle\n * - Actor name extraction and correlation\n * - Request routing tracing\n */\n\nimport {\n trace,\n context as api_context,\n propagation,\n SpanStatusCode,\n SpanKind,\n} from '@opentelemetry/api';\nimport type { ConfigurationOption } from 'autotel-edge';\nimport { createInitialiser, setConfig, WorkerTracer } from 'autotel-edge';\nimport type { ActorConfig, ActorConstructor, ActorLike } from './types';\n\n/**\n * Get the tracer instance\n */\nfunction getTracer(): WorkerTracer {\n return trace.getTracer('autotel-cloudflare-actors') as WorkerTracer;\n}\n\n/**\n * Worker handler type matching @cloudflare/actors output\n */\ninterface WorkerHandler<E = unknown> {\n fetch(request: Request, env: E, ctx: ExecutionContext): Promise<Response>;\n}\n\n/**\n * Create a traced handler that combines Actor instrumentation with request tracing\n *\n * This is an all-in-one wrapper that:\n * 1. Initializes telemetry for the Worker\n * 2. Creates a root span for each incoming request\n * 3. Extracts the Actor name using `nameFromRequest`\n * 4. Instruments the Actor class with lifecycle tracing\n * 5. Routes the request to the instrumented Actor\n *\n * @example\n * ```typescript\n * import { Actor } from '@cloudflare/actors'\n * import { tracedHandler } from 'autotel-cloudflare/actors'\n *\n * class MyActor extends Actor<Env> {\n * protected onRequest(request: Request) {\n * return new Response('Hello!')\n * }\n * }\n *\n * // Export the Actor class and use tracedHandler\n * export { MyActor }\n * export default tracedHandler(MyActor, (env) => ({\n * service: { name: 'my-actor-service' },\n * exporter: { url: env.OTLP_ENDPOINT }\n * }))\n * ```\n *\n * @param actorClass - The Actor class to handle requests\n * @param config - Configuration (static object or function)\n * @returns A Worker handler with full tracing\n */\nexport function tracedHandler<E, A extends ActorLike>(\n actorClass: ActorConstructor<A> & {\n nameFromRequest?(request: Request): Promise<string | undefined>;\n configuration?(request: Request): { locationHint?: DurableObjectLocationHint };\n },\n config: ActorConfig | ((env: E, trigger?: unknown) => ActorConfig),\n): WorkerHandler<E> {\n const initialiser = createInitialiser(config as ConfigurationOption);\n\n // Note: The Actor class instrumentation happens at the DO level, not here.\n // This handler wraps the Worker entrypoint that routes to the DO.\n\n return {\n async fetch(request: Request, env: E, _ctx: ExecutionContext): Promise<Response> {\n // Initialize telemetry for this request\n const telemetryConfig = initialiser(env, { type: 'http' });\n const configContext = setConfig(telemetryConfig);\n\n // Extract parent context from request headers\n const parentContext = propagation.extract(configContext, request.headers);\n\n const tracer = getTracer();\n const url = new URL(request.url);\n const actorClassName = actorClass.name || 'Actor';\n\n // Get actor name from request (using the Actor's static method if available)\n let actorName: string | undefined;\n try {\n if (actorClass.nameFromRequest) {\n actorName = await actorClass.nameFromRequest(request);\n }\n } catch {\n actorName = undefined;\n }\n\n const spanName = `${actorClassName} handler: ${request.method} ${url.pathname}`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n 'http.request.method': request.method,\n 'url.full': request.url,\n 'url.path': url.pathname,\n 'url.query': url.search,\n 'actor.class': actorClassName,\n ...(actorName && { 'actor.name': actorName }),\n 'faas.trigger': 'http',\n },\n },\n parentContext,\n async (span) => {\n try {\n // Get Actor stub using the same pattern as @cloudflare/actors handler()\n const envObj = env as Record<string, DurableObjectNamespace>;\n\n // Find the binding name for this Actor class\n const bindingName = Object.keys(envObj).find((key) => {\n const binding = (env as Record<string, unknown>).__DURABLE_OBJECT_BINDINGS as\n | Record<string, { class_name?: string }>\n | undefined;\n return key === actorClassName || binding?.[key]?.class_name === actorClassName;\n });\n\n if (!bindingName) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: `No Durable Object binding found for ${actorClassName}`,\n });\n return Response.json(\n {\n error: 'Configuration Error',\n message: `No Durable Object binding found for actor class ${actorClassName}`,\n },\n { status: 500, headers: { 'Content-Type': 'application/json' } },\n );\n }\n\n const namespace = envObj[bindingName];\n const idString = actorName || 'default';\n\n // Get location hint if available\n const locationHint = actorClass.configuration?.(request)?.locationHint;\n\n // Get the Durable Object stub\n const stub = namespace.getByName(idString, { locationHint });\n\n // Set the name on the stub (as @cloudflare/actors does)\n if ('setName' in stub && typeof stub.setName === 'function') {\n (stub as unknown as { setName(id: string): void }).setName(idString);\n }\n\n // Inject trace context into the request for propagation to the DO\n const headers = new Headers(request.headers);\n propagation.inject(api_context.active(), headers);\n\n // Create a new request with the injected headers\n const tracedRequest = new Request(request.url, {\n method: request.method,\n headers,\n body: request.body,\n redirect: request.redirect,\n });\n\n // Forward the request to the Durable Object\n const response = await stub.fetch(tracedRequest);\n\n span.setAttributes({\n 'http.response.status_code': response.status,\n 'actor.name': idString,\n });\n\n if (response.ok) {\n span.setStatus({ code: SpanStatusCode.OK });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n return response;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n\n return Response.json(\n {\n error: 'Internal Server Error',\n message: error instanceof Error ? error.message : 'Unknown error',\n },\n { status: 500, headers: { 'Content-Type': 'application/json' } },\n );\n } finally {\n span.end();\n }\n },\n );\n },\n };\n}\n\n/**\n * Alternative: Create a handler wrapper that uses the existing @cloudflare/actors handler\n *\n * This is useful if you want to use the original handler() but add tracing around it.\n *\n * @example\n * ```typescript\n * import { Actor, handler } from '@cloudflare/actors'\n * import { wrapHandler } from 'autotel-cloudflare/actors'\n *\n * class MyActor extends Actor<Env> {}\n *\n * export { MyActor }\n * export default wrapHandler(handler(MyActor), (env) => ({\n * service: { name: 'my-service' }\n * }))\n * ```\n */\nexport function wrapHandler<E>(\n originalHandler: WorkerHandler<E>,\n config: ActorConfig | ((env: E, trigger?: unknown) => ActorConfig),\n): WorkerHandler<E> {\n const initialiser = createInitialiser(config as ConfigurationOption);\n\n return {\n async fetch(request: Request, env: E, ctx: ExecutionContext): Promise<Response> {\n // Initialize telemetry for this request\n const telemetryConfig = initialiser(env, { type: 'http' });\n const configContext = setConfig(telemetryConfig);\n\n // Extract parent context from request headers\n const parentContext = propagation.extract(configContext, request.headers);\n\n const tracer = getTracer();\n const url = new URL(request.url);\n\n return tracer.startActiveSpan(\n `Worker: ${request.method} ${url.pathname}`,\n {\n kind: SpanKind.SERVER,\n attributes: {\n 'http.request.method': request.method,\n 'url.full': request.url,\n 'url.path': url.pathname,\n 'url.query': url.search,\n 'faas.trigger': 'http',\n },\n },\n parentContext,\n async (span) => {\n try {\n // Inject trace context into request\n const headers = new Headers(request.headers);\n propagation.inject(api_context.active(), headers);\n\n const tracedRequest = new Request(request.url, {\n method: request.method,\n headers,\n body: request.body,\n redirect: request.redirect,\n });\n\n const response = await originalHandler.fetch(tracedRequest, env, ctx);\n\n span.setAttributes({\n 'http.response.status_code': response.status,\n });\n\n if (response.ok) {\n span.setStatus({ code: SpanStatusCode.OK });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n return response;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"actors.js","names":["getTracer","getTracer","getTracer","getTracer","api_context","context","api_context"],"sources":["../src/actors/storage.ts","../src/actors/alarms.ts","../src/actors/sockets.ts","../src/actors/instrument-actor.ts","../src/actors/traced-handler.ts"],"sourcesContent":["/**\n * Actor storage instrumentation\n *\n * Traces operations on actor.storage including SQL queries\n */\n\nimport { trace, SpanStatusCode, SpanKind } from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\nimport type { ActorLike } from './types';\n\n/**\n * Get the tracer instance\n */\nfunction getTracer(): WorkerTracer {\n return trace.getTracer('autotel-cloudflare-actors') as WorkerTracer;\n}\n\n/**\n * Instrument Actor storage for tracing\n *\n * Captures:\n * - SQL query operations\n * - Key-value operations (if available)\n */\nexport function instrumentActorStorage(\n storage: unknown,\n actorInstance: ActorLike,\n actorClass: object,\n): unknown {\n if (!storage || typeof storage !== 'object') {\n return storage;\n }\n\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const actorName = actorInstance.name || actorClassName;\n\n const storageHandler: ProxyHandler<object> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Instrument SQL query method if it exists\n // The Actors Storage class has an exec method for SQL\n if (prop === 'exec' && typeof value === 'function') {\n return function instrumentedExec(\n this: unknown,\n query: string,\n ...params: unknown[]\n ): unknown {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: storage.exec`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'db.system': 'sqlite',\n 'db.operation': 'exec',\n 'db.statement': query,\n 'db.statement.params_count': params.length,\n },\n },\n (span) => {\n try {\n const result = value.call(target, query, ...params);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument query method (alternative name for exec)\n if (prop === 'query' && typeof value === 'function') {\n return function instrumentedQuery(\n this: unknown,\n query: string,\n ...params: unknown[]\n ): unknown {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: storage.query`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'db.system': 'sqlite',\n 'db.operation': 'query',\n 'db.statement': query,\n 'db.statement.params_count': params.length,\n },\n },\n (span) => {\n try {\n const result = value.call(target, query, ...params);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument get method\n if (prop === 'get' && typeof value === 'function') {\n return async function instrumentedGet(this: unknown, key: string): Promise<unknown> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: storage.get`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'db.system': 'durable_object_storage',\n 'db.operation': 'get',\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await value.call(target, key);\n span.setAttributes({\n 'db.result.found': result !== null && result !== undefined,\n });\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument put method\n if (prop === 'put' && typeof value === 'function') {\n return async function instrumentedPut(\n this: unknown,\n key: string,\n val: unknown,\n ): Promise<void> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: storage.put`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'db.system': 'durable_object_storage',\n 'db.operation': 'put',\n 'db.key': key,\n 'db.value_type': typeof val,\n },\n },\n async (span) => {\n try {\n await value.call(target, key, val);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument delete method\n if (prop === 'delete' && typeof value === 'function') {\n return async function instrumentedDelete(this: unknown, key: string): Promise<boolean> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: storage.delete`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'db.system': 'durable_object_storage',\n 'db.operation': 'delete',\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await value.call(target, key);\n span.setAttributes({\n 'db.result.deleted': result,\n });\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(storage, storageHandler);\n}\n","/**\n * Actor alarms instrumentation\n *\n * Traces operations on actor.alarms\n */\n\nimport { trace, SpanStatusCode, SpanKind } from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\nimport type { ActorLike } from './types';\n\n/**\n * Get the tracer instance\n */\nfunction getTracer(): WorkerTracer {\n return trace.getTracer('autotel-cloudflare-actors') as WorkerTracer;\n}\n\n/**\n * Instrument Actor alarms for tracing\n *\n * Captures:\n * - set: Schedule a single alarm\n * - setMultiple: Schedule multiple alarms\n * - cancel: Cancel an alarm\n * - cancelAll: Cancel all alarms\n */\nexport function instrumentActorAlarms(\n alarms: unknown,\n actorInstance: ActorLike,\n actorClass: object,\n): unknown {\n if (!alarms || typeof alarms !== 'object') {\n return alarms;\n }\n\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const actorName = actorInstance.name || actorClassName;\n\n const alarmsHandler: ProxyHandler<object> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Instrument set method\n if (prop === 'set' && typeof value === 'function') {\n return async function instrumentedSet(\n this: unknown,\n ...args: unknown[]\n ): Promise<unknown> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: alarms.set`;\n\n // Try to extract timing info from args\n const alarmAttributes: Record<string, string | number | boolean> = {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'alarm.operation': 'set',\n };\n\n // First arg might be timestamp, delay, or options\n if (args.length > 0) {\n const firstArg = args[0];\n if (typeof firstArg === 'number') {\n alarmAttributes['alarm.delay_ms'] = firstArg;\n } else if (firstArg instanceof Date) {\n alarmAttributes['alarm.scheduled_time'] = firstArg.toISOString();\n } else if (typeof firstArg === 'string') {\n // Might be a cron expression\n alarmAttributes['alarm.cron'] = firstArg;\n }\n }\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: alarmAttributes,\n },\n async (span) => {\n try {\n const result = await value.apply(target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument setMultiple method\n if (prop === 'setMultiple' && typeof value === 'function') {\n return async function instrumentedSetMultiple(\n this: unknown,\n alarmDefs: unknown[],\n ): Promise<unknown> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: alarms.setMultiple`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'alarm.operation': 'setMultiple',\n 'alarm.count': Array.isArray(alarmDefs) ? alarmDefs.length : 0,\n },\n },\n async (span) => {\n try {\n const result = await value.call(target, alarmDefs);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument cancel method\n if (prop === 'cancel' && typeof value === 'function') {\n return async function instrumentedCancel(\n this: unknown,\n alarmId: string,\n ): Promise<unknown> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: alarms.cancel`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'alarm.operation': 'cancel',\n 'alarm.id': alarmId,\n },\n },\n async (span) => {\n try {\n const result = await value.call(target, alarmId);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument cancelAll method\n if (prop === 'cancelAll' && typeof value === 'function') {\n return async function instrumentedCancelAll(this: unknown): Promise<unknown> {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: alarms.cancelAll`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'alarm.operation': 'cancelAll',\n },\n },\n async (span) => {\n try {\n const result = await value.call(target);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(alarms, alarmsHandler);\n}\n","/**\n * Actor sockets instrumentation\n *\n * Traces operations on actor.sockets\n */\n\nimport { trace, SpanStatusCode, SpanKind } from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\nimport type { ActorLike } from './types';\n\n/**\n * Get the tracer instance\n */\nfunction getTracer(): WorkerTracer {\n return trace.getTracer('autotel-cloudflare-actors') as WorkerTracer;\n}\n\n/**\n * Instrument Actor sockets for tracing\n *\n * Captures:\n * - acceptWebSocket: Accept an incoming WebSocket connection\n * - broadcast: Send message to all connected sockets\n * - send: Send message to a specific socket\n */\nexport function instrumentActorSockets(\n sockets: unknown,\n actorInstance: ActorLike,\n actorClass: object,\n): unknown {\n if (!sockets || typeof sockets !== 'object') {\n return sockets;\n }\n\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const actorName = actorInstance.name || actorClassName;\n\n const socketsHandler: ProxyHandler<object> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Instrument acceptWebSocket method\n if (prop === 'acceptWebSocket' && typeof value === 'function') {\n return function instrumentedAcceptWebSocket(\n this: unknown,\n request: Request,\n ): unknown {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: sockets.acceptWebSocket`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'websocket.operation': 'accept',\n 'url.full': request.url,\n },\n },\n (span) => {\n try {\n const result = value.call(target, request);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument broadcast method\n if (prop === 'broadcast' && typeof value === 'function') {\n return function instrumentedBroadcast(this: unknown, message: unknown): void {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: sockets.broadcast`;\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.PRODUCER,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'websocket.operation': 'broadcast',\n 'websocket.message.type': typeof message,\n 'websocket.message.size':\n typeof message === 'string'\n ? message.length\n : message instanceof ArrayBuffer\n ? message.byteLength\n : 0,\n },\n },\n (span) => {\n try {\n value.call(target, message);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument send method\n if (prop === 'send' && typeof value === 'function') {\n return function instrumentedSend(this: unknown, ws: WebSocket, message: unknown): void {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: sockets.send`;\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.PRODUCER,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'websocket.operation': 'send',\n 'websocket.message.type': typeof message,\n 'websocket.message.size':\n typeof message === 'string'\n ? message.length\n : message instanceof ArrayBuffer\n ? message.byteLength\n : 0,\n },\n },\n (span) => {\n try {\n value.call(target, ws, message);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Instrument getConnections method (if exists)\n if (prop === 'getConnections' && typeof value === 'function') {\n return function instrumentedGetConnections(this: unknown): unknown {\n const tracer = getTracer();\n const spanName = `Actor ${actorName}: sockets.getConnections`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'actor.name': actorName,\n 'actor.class': actorClassName,\n 'websocket.operation': 'getConnections',\n },\n },\n (span) => {\n try {\n const result = value.call(target);\n // Try to capture connection count if result is array-like\n if (Array.isArray(result)) {\n span.setAttribute('websocket.connections.count', result.length);\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(sockets, socketsHandler);\n}\n","/**\n * Actor class instrumentation for @cloudflare/actors\n *\n * Wraps Actor lifecycle methods with OpenTelemetry tracing:\n * - onInit: Traced as 'actor.lifecycle': 'init'\n * - onRequest: Traced with full HTTP semantics\n * - onAlarm: Traced as 'actor.lifecycle': 'alarm'\n * - onPersist: Traced as 'actor.lifecycle': 'persist'\n * - WebSocket methods: Traced with socket semantics\n */\n\nimport {\n trace,\n context as api_context,\n propagation,\n SpanStatusCode,\n SpanKind,\n} from '@opentelemetry/api';\nimport type { ConfigurationOption } from 'autotel-edge';\nimport { createInitialiser, setConfig, WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\nimport type {\n ActorConfig,\n ActorConstructor,\n ActorLike,\n ActorLifecycle,\n ActorInstrumentationOptions,\n} from './types';\nimport { instrumentActorStorage } from './storage';\nimport { instrumentActorAlarms } from './alarms';\nimport { instrumentActorSockets } from './sockets';\n\n/**\n * Track cold starts per Actor class\n */\nconst coldStarts = new WeakMap<object, boolean>();\n\nfunction isColdStart(actorClass: object): boolean {\n if (!coldStarts.has(actorClass)) {\n coldStarts.set(actorClass, true);\n return true;\n }\n return false;\n}\n\n/**\n * Get the tracer instance\n */\nfunction getTracer(): WorkerTracer {\n return trace.getTracer('autotel-cloudflare-actors') as WorkerTracer;\n}\n\n/**\n * Default span name formatter\n */\nfunction defaultSpanNameFormatter(\n actorName: string,\n actorClass: string,\n lifecycle: ActorLifecycle,\n): string {\n const displayName = actorName || actorClass;\n return `Actor ${displayName}: ${lifecycle}`;\n}\n\n/**\n * Create base Actor span attributes\n */\nfunction createActorAttributes(\n actorInstance: ActorLike,\n actorClass: object,\n lifecycle: ActorLifecycle,\n): Record<string, string | boolean | number> {\n return {\n 'actor.name': actorInstance.name || 'unknown',\n 'actor.class': (actorClass as { name?: string }).name || 'Actor',\n 'actor.lifecycle': lifecycle,\n 'actor.coldstart': isColdStart(actorClass),\n ...(actorInstance.identifier && { 'actor.identifier': actorInstance.identifier }),\n };\n}\n\n/**\n * Instrument the onInit lifecycle method\n */\nfunction instrumentOnInit(\n originalMethod: () => Promise<void>,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): () => Promise<void> {\n return async function instrumentedOnInit(): Promise<void> {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'init')\n : defaultSpanNameFormatter(actorInstance.name || '', actorClassName, 'init');\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.INTERNAL,\n attributes: createActorAttributes(actorInstance, actorClass, 'init'),\n },\n async (span) => {\n try {\n await originalMethod.call(actorInstance);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n/**\n * Instrument the onRequest lifecycle method\n */\nfunction instrumentOnRequest(\n originalMethod: (request: Request) => Promise<Response>,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (request: Request) => Promise<Response> {\n return async function instrumentedOnRequest(request: Request): Promise<Response> {\n const tracer = getTracer();\n\n // Extract parent context from request headers\n const parentContext = propagation.extract(api_context.active(), request.headers);\n\n const url = new URL(request.url);\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'request')\n : `Actor ${actorInstance.name || actorClassName}: ${request.method} ${url.pathname}`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'request'),\n 'http.request.method': request.method,\n 'url.full': request.url,\n 'url.path': url.pathname,\n 'url.query': url.search,\n },\n },\n parentContext,\n async (span) => {\n try {\n const response = await originalMethod.call(actorInstance, request);\n\n span.setAttributes({\n 'http.response.status_code': response.status,\n });\n\n if (response.ok) {\n span.setStatus({ code: SpanStatusCode.OK });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n return response;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n/**\n * Instrument the onAlarm lifecycle method\n */\nfunction instrumentOnAlarm(\n originalMethod: (alarmInfo?: unknown) => Promise<void>,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (alarmInfo?: unknown) => Promise<void> {\n return async function instrumentedOnAlarm(alarmInfo?: unknown): Promise<void> {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'alarm')\n : defaultSpanNameFormatter(actorInstance.name || '', actorClassName, 'alarm');\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'alarm'),\n 'faas.trigger': 'timer',\n },\n },\n async (span) => {\n try {\n await originalMethod.call(actorInstance, alarmInfo);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n/**\n * Instrument the onPersist lifecycle method\n */\nfunction instrumentOnPersist(\n originalMethod: (key: string, value: unknown) => void,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (key: string, value: unknown) => void {\n if (!options.capturePersistEvents) {\n return originalMethod;\n }\n\n return function instrumentedOnPersist(key: string, value: unknown): void {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'persist')\n : `Actor ${actorInstance.name || actorClassName}: persist ${key}`;\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'persist'),\n 'actor.persist.key': key,\n 'actor.persist.value_type': typeof value,\n },\n },\n (span) => {\n try {\n originalMethod.call(actorInstance, key, value);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n/**\n * Instrument WebSocket lifecycle methods\n */\nfunction instrumentWebSocketConnect(\n originalMethod: (ws: WebSocket, request: Request) => void,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (ws: WebSocket, request: Request) => void {\n return function instrumentedWebSocketConnect(ws: WebSocket, request: Request): void {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'websocket.connect')\n : defaultSpanNameFormatter(actorInstance.name || '', actorClassName, 'websocket.connect');\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'websocket.connect'),\n 'url.full': request.url,\n },\n },\n (span) => {\n try {\n originalMethod.call(actorInstance, ws, request);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\nfunction instrumentWebSocketMessage(\n originalMethod: (ws: WebSocket, message: unknown) => void,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (ws: WebSocket, message: unknown) => void {\n return function instrumentedWebSocketMessage(ws: WebSocket, message: unknown): void {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'websocket.message')\n : defaultSpanNameFormatter(actorInstance.name || '', actorClassName, 'websocket.message');\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n ...createActorAttributes(actorInstance, actorClass, 'websocket.message'),\n 'websocket.message.type': typeof message,\n 'websocket.message.size':\n typeof message === 'string'\n ? message.length\n : message instanceof ArrayBuffer\n ? message.byteLength\n : 0,\n },\n },\n (span) => {\n try {\n originalMethod.call(actorInstance, ws, message);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\nfunction instrumentWebSocketDisconnect(\n originalMethod: (ws: WebSocket) => void,\n actorInstance: ActorLike,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): (ws: WebSocket) => void {\n return function instrumentedWebSocketDisconnect(ws: WebSocket): void {\n const tracer = getTracer();\n const actorClassName = (actorClass as { name?: string }).name || 'Actor';\n const spanName = options.spanNameFormatter\n ? options.spanNameFormatter(actorInstance.name || '', 'websocket.disconnect')\n : defaultSpanNameFormatter(actorInstance.name || '', actorClassName, 'websocket.disconnect');\n\n tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: createActorAttributes(actorInstance, actorClass, 'websocket.disconnect'),\n },\n (span) => {\n try {\n originalMethod.call(actorInstance, ws);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n/**\n * Instrument an Actor instance by wrapping all lifecycle methods\n */\nfunction instrumentActorInstance(\n actorInstance: ActorLike,\n _state: DurableObjectState,\n _env: unknown,\n actorClass: object,\n options: ActorInstrumentationOptions,\n): ActorLike {\n const instanceHandler: ProxyHandler<ActorLike> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Lifecycle methods that need instrumentation\n if (prop === 'onInit' && typeof value === 'function') {\n return instrumentOnInit(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onRequest' && typeof value === 'function') {\n return instrumentOnRequest(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onAlarm' && typeof value === 'function') {\n return instrumentOnAlarm(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onPersist' && typeof value === 'function') {\n return instrumentOnPersist(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onWebSocketConnect' && typeof value === 'function') {\n return instrumentWebSocketConnect(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onWebSocketMessage' && typeof value === 'function') {\n return instrumentWebSocketMessage(value.bind(target), target, actorClass, options);\n }\n\n if (prop === 'onWebSocketDisconnect' && typeof value === 'function') {\n return instrumentWebSocketDisconnect(value.bind(target), target, actorClass, options);\n }\n\n // Instrument sub-components if enabled\n if (prop === 'storage' && value && options.instrumentStorage !== false) {\n return instrumentActorStorage(value, target, actorClass);\n }\n\n if (prop === 'alarms' && value && options.instrumentAlarms !== false) {\n return instrumentActorAlarms(value, target, actorClass);\n }\n\n if (prop === 'sockets' && value && options.instrumentSockets !== false) {\n return instrumentActorSockets(value, target, actorClass);\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(actorInstance, instanceHandler);\n}\n\n/**\n * Instrument an Actor class for comprehensive OpenTelemetry tracing\n *\n * This wraps the Actor class to automatically trace all lifecycle methods:\n * - onInit: Actor initialization\n * - onRequest: HTTP request handling\n * - onAlarm: Alarm triggers\n * - onPersist: Property persistence events\n * - WebSocket methods: Connection, message, disconnect\n *\n * It also optionally instruments:\n * - actor.storage: SQL queries and storage operations\n * - actor.alarms: Alarm scheduling operations\n * - actor.sockets: WebSocket operations\n *\n * @example\n * ```typescript\n * import { Actor } from '@cloudflare/actors'\n * import { instrumentActor } from 'autotel-cloudflare/actors'\n *\n * class Counter extends Actor<Env> {\n * protected onInit() {\n * console.log('Counter initialized')\n * }\n *\n * protected onRequest(request: Request) {\n * return new Response('count: 42')\n * }\n * }\n *\n * // Wrap the class\n * export const InstrumentedCounter = instrumentActor(Counter, (env: Env) => ({\n * service: { name: 'counter-actor' },\n * exporter: { url: env.OTLP_ENDPOINT },\n * actors: {\n * instrumentStorage: true,\n * capturePersistEvents: true\n * }\n * }))\n * ```\n *\n * @param actorClass - The Actor class to instrument\n * @param config - Configuration (static object or function)\n * @returns Instrumented Actor class\n */\nexport function instrumentActor<C extends ActorConstructor>(\n actorClass: C,\n config: ActorConfig | ((env: unknown, trigger?: unknown) => ActorConfig),\n): C {\n const initialiser = createInitialiser(config as ConfigurationOption);\n\n // Default options\n const defaultOptions: ActorInstrumentationOptions = {\n instrumentStorage: true,\n instrumentAlarms: true,\n instrumentSockets: true,\n capturePersistEvents: true,\n };\n\n const classHandler: ProxyHandler<C> = {\n construct(target, [state, env]: [DurableObjectState, unknown]) {\n // Get config (either static or from function)\n const resolvedConfig =\n typeof config === 'function'\n ? config(env, { id: state.id.toString(), name: state.id.name })\n : config;\n\n // Merge options with defaults\n // Handle the case where config might not have actors property\n const actorOptions =\n resolvedConfig && typeof resolvedConfig === 'object' && 'actors' in resolvedConfig\n ? (resolvedConfig as { actors?: ActorInstrumentationOptions }).actors\n : undefined;\n const options: ActorInstrumentationOptions = {\n ...defaultOptions,\n ...actorOptions,\n };\n\n // Initialize telemetry config\n const trigger = {\n id: state.id.toString(),\n name: state.id.name,\n };\n const telemetryConfig = initialiser(env, trigger);\n const context = setConfig(telemetryConfig);\n\n // Create the Actor instance within the config context\n const actorInstance = api_context.with(context, () => {\n return new target(state, env);\n }) as ActorLike;\n\n // Instrument the instance\n return instrumentActorInstance(actorInstance, state, env, actorClass, options);\n },\n };\n\n return wrap(actorClass, classHandler);\n}\n","/**\n * Traced handler wrapper for @cloudflare/actors\n *\n * Wraps the Actors handler() to provide:\n * - Root span for the entire request lifecycle\n * - Actor name extraction and correlation\n * - Request routing tracing\n */\n\nimport {\n trace,\n context as api_context,\n propagation,\n SpanStatusCode,\n SpanKind,\n} from '@opentelemetry/api';\nimport type { ConfigurationOption } from 'autotel-edge';\nimport { createInitialiser, setConfig, WorkerTracer } from 'autotel-edge';\nimport type { ActorConfig, ActorConstructor, ActorLike } from './types';\n\n/**\n * Get the tracer instance\n */\nfunction getTracer(): WorkerTracer {\n return trace.getTracer('autotel-cloudflare-actors') as WorkerTracer;\n}\n\n/**\n * Worker handler type matching @cloudflare/actors output\n */\ninterface WorkerHandler<E = unknown> {\n fetch(request: Request, env: E, ctx: ExecutionContext): Promise<Response>;\n}\n\n/**\n * Create a traced handler that combines Actor instrumentation with request tracing\n *\n * This is an all-in-one wrapper that:\n * 1. Initializes telemetry for the Worker\n * 2. Creates a root span for each incoming request\n * 3. Extracts the Actor name using `nameFromRequest`\n * 4. Instruments the Actor class with lifecycle tracing\n * 5. Routes the request to the instrumented Actor\n *\n * @example\n * ```typescript\n * import { Actor } from '@cloudflare/actors'\n * import { tracedHandler } from 'autotel-cloudflare/actors'\n *\n * class MyActor extends Actor<Env> {\n * protected onRequest(request: Request) {\n * return new Response('Hello!')\n * }\n * }\n *\n * // Export the Actor class and use tracedHandler\n * export { MyActor }\n * export default tracedHandler(MyActor, (env) => ({\n * service: { name: 'my-actor-service' },\n * exporter: { url: env.OTLP_ENDPOINT }\n * }))\n * ```\n *\n * @param actorClass - The Actor class to handle requests\n * @param config - Configuration (static object or function)\n * @returns A Worker handler with full tracing\n */\nexport function tracedHandler<E, A extends ActorLike>(\n actorClass: ActorConstructor<A> & {\n nameFromRequest?(request: Request): Promise<string | undefined>;\n configuration?(request: Request): { locationHint?: DurableObjectLocationHint };\n },\n config: ActorConfig | ((env: E, trigger?: unknown) => ActorConfig),\n): WorkerHandler<E> {\n const initialiser = createInitialiser(config as ConfigurationOption);\n\n // Note: The Actor class instrumentation happens at the DO level, not here.\n // This handler wraps the Worker entrypoint that routes to the DO.\n\n return {\n async fetch(request: Request, env: E, _ctx: ExecutionContext): Promise<Response> {\n // Initialize telemetry for this request\n const telemetryConfig = initialiser(env, { type: 'http' });\n const configContext = setConfig(telemetryConfig);\n\n // Extract parent context from request headers\n const parentContext = propagation.extract(configContext, request.headers);\n\n const tracer = getTracer();\n const url = new URL(request.url);\n const actorClassName = actorClass.name || 'Actor';\n\n // Get actor name from request (using the Actor's static method if available)\n let actorName: string | undefined;\n try {\n if (actorClass.nameFromRequest) {\n actorName = await actorClass.nameFromRequest(request);\n }\n } catch {\n actorName = undefined;\n }\n\n const spanName = `${actorClassName} handler: ${request.method} ${url.pathname}`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n 'http.request.method': request.method,\n 'url.full': request.url,\n 'url.path': url.pathname,\n 'url.query': url.search,\n 'actor.class': actorClassName,\n ...(actorName && { 'actor.name': actorName }),\n 'faas.trigger': 'http',\n },\n },\n parentContext,\n async (span) => {\n try {\n // Get Actor stub using the same pattern as @cloudflare/actors handler()\n const envObj = env as Record<string, DurableObjectNamespace>;\n\n // Find the binding name for this Actor class\n const bindingName = Object.keys(envObj).find((key) => {\n const binding = (env as Record<string, unknown>).__DURABLE_OBJECT_BINDINGS as\n | Record<string, { class_name?: string }>\n | undefined;\n return key === actorClassName || binding?.[key]?.class_name === actorClassName;\n });\n\n if (!bindingName) {\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: `No Durable Object binding found for ${actorClassName}`,\n });\n return Response.json(\n {\n error: 'Configuration Error',\n message: `No Durable Object binding found for actor class ${actorClassName}`,\n },\n { status: 500, headers: { 'Content-Type': 'application/json' } },\n );\n }\n\n const namespace = envObj[bindingName];\n const idString = actorName || 'default';\n\n // Get location hint if available\n const locationHint = actorClass.configuration?.(request)?.locationHint;\n\n // Get the Durable Object stub\n const stub = namespace.getByName(idString, { locationHint });\n\n // Set the name on the stub (as @cloudflare/actors does)\n if ('setName' in stub && typeof stub.setName === 'function') {\n (stub as unknown as { setName(id: string): void }).setName(idString);\n }\n\n // Inject trace context into the request for propagation to the DO\n const headers = new Headers(request.headers);\n propagation.inject(api_context.active(), headers);\n\n // Create a new request with the injected headers\n const tracedRequest = new Request(request.url, {\n method: request.method,\n headers,\n body: request.body,\n redirect: request.redirect,\n });\n\n // Forward the request to the Durable Object\n const response = await stub.fetch(tracedRequest);\n\n span.setAttributes({\n 'http.response.status_code': response.status,\n 'actor.name': idString,\n });\n\n if (response.ok) {\n span.setStatus({ code: SpanStatusCode.OK });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n return response;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n\n return Response.json(\n {\n error: 'Internal Server Error',\n message: error instanceof Error ? error.message : 'Unknown error',\n },\n { status: 500, headers: { 'Content-Type': 'application/json' } },\n );\n } finally {\n span.end();\n }\n },\n );\n },\n };\n}\n\n/**\n * Alternative: Create a handler wrapper that uses the existing @cloudflare/actors handler\n *\n * This is useful if you want to use the original handler() but add tracing around it.\n *\n * @example\n * ```typescript\n * import { Actor, handler } from '@cloudflare/actors'\n * import { wrapHandler } from 'autotel-cloudflare/actors'\n *\n * class MyActor extends Actor<Env> {}\n *\n * export { MyActor }\n * export default wrapHandler(handler(MyActor), (env) => ({\n * service: { name: 'my-service' }\n * }))\n * ```\n */\nexport function wrapHandler<E>(\n originalHandler: WorkerHandler<E>,\n config: ActorConfig | ((env: E, trigger?: unknown) => ActorConfig),\n): WorkerHandler<E> {\n const initialiser = createInitialiser(config as ConfigurationOption);\n\n return {\n async fetch(request: Request, env: E, ctx: ExecutionContext): Promise<Response> {\n // Initialize telemetry for this request\n const telemetryConfig = initialiser(env, { type: 'http' });\n const configContext = setConfig(telemetryConfig);\n\n // Extract parent context from request headers\n const parentContext = propagation.extract(configContext, request.headers);\n\n const tracer = getTracer();\n const url = new URL(request.url);\n\n return tracer.startActiveSpan(\n `Worker: ${request.method} ${url.pathname}`,\n {\n kind: SpanKind.SERVER,\n attributes: {\n 'http.request.method': request.method,\n 'url.full': request.url,\n 'url.path': url.pathname,\n 'url.query': url.search,\n 'faas.trigger': 'http',\n },\n },\n parentContext,\n async (span) => {\n try {\n // Inject trace context into request\n const headers = new Headers(request.headers);\n propagation.inject(api_context.active(), headers);\n\n const tracedRequest = new Request(request.url, {\n method: request.method,\n headers,\n body: request.body,\n redirect: request.redirect,\n });\n\n const response = await originalHandler.fetch(tracedRequest, env, ctx);\n\n span.setAttributes({\n 'http.response.status_code': response.status,\n });\n\n if (response.ok) {\n span.setStatus({ code: SpanStatusCode.OK });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n return response;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n };\n}\n"],"mappings":"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"}
@@ -670,7 +670,8 @@ function instrumentD1(d1, databaseName) {
670
670
  return wrap(Reflect.apply(fnTarget, target, args), { get(target, prop) {
671
671
  const value = Reflect.get(target, prop);
672
672
  if (prop === "first" || prop === "run" || prop === "all" || prop === "raw") return new Proxy(value, { apply: (fnTarget, _thisArg, args) => {
673
- const statement = sanitizeStatement(query, getActiveConfig()?.dataSafety?.captureDbStatement ?? "full");
673
+ const captureMode = getActiveConfig()?.dataSafety?.captureDbStatement ?? "full";
674
+ const statement = sanitizeStatement(query, captureMode);
674
675
  const attributes = {
675
676
  "db.system": "cloudflare-d1",
676
677
  "db.operation": prop,
@@ -972,4 +973,4 @@ function instrumentBrowserRendering(browser, bindingName) {
972
973
 
973
974
  //#endregion
974
975
  export { instrumentKV as a, instrumentImages as c, instrumentHyperdrive as d, instrumentVectorize as f, instrumentD1 as i, instrumentAnalyticsEngine as l, instrumentRateLimiter as n, instrumentR2 as o, instrumentAI as p, instrumentBindings as r, instrumentServiceBinding as s, instrumentBrowserRendering as t, instrumentQueueProducer as u };
975
- //# sourceMappingURL=bindings-C10RI6Il.js.map
976
+ //# sourceMappingURL=bindings-BG6hzGSN.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bindings-C10RI6Il.js","names":[],"sources":["../src/bindings/ai.ts","../src/bindings/vectorize.ts","../src/bindings/hyperdrive.ts","../src/bindings/queue-producer.ts","../src/bindings/analytics-engine.ts","../src/bindings/images.ts","../src/bindings/bindings.ts","../src/bindings/rate-limiter.ts","../src/bindings/browser-rendering.ts"],"sourcesContent":["/**\n * Workers AI binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\n/**\n * Instrument Workers AI binding\n */\nexport function instrumentAI<T extends Ai>(ai: T, bindingName?: string): T {\n const name = bindingName || 'ai';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'run' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [model] = args as [string, unknown, unknown];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `AI ${name}: run ${model}`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n // Canonical GenAI provider attribute (replaces deprecated\n // `gen_ai.system`).\n 'gen_ai.provider.name': 'cloudflare-workers-ai',\n 'gen_ai.operation.name': 'run',\n 'gen_ai.request.model': model,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n if (result?.usage?.prompt_tokens !== undefined) {\n setAttr(span, 'gen_ai.usage.input_tokens', Number(result.usage.prompt_tokens));\n }\n if (result?.usage?.completion_tokens !== undefined) {\n setAttr(span, 'gen_ai.usage.output_tokens', Number(result.usage.completion_tokens));\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(ai, handler);\n}\n","/**\n * Vectorize binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\nconst TRACED_METHODS = ['query', 'insert', 'upsert', 'deleteByIds', 'getByIds', 'describe'] as const;\n\n/**\n * Instrument Vectorize index binding\n */\nexport function instrumentVectorize<T extends VectorizeIndex>(vectorize: T, indexName?: string): T {\n const name = indexName || 'vectorize';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (typeof prop === 'string' && TRACED_METHODS.includes(prop as any) && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const operation = prop as string;\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const attributes: Record<string, string | number> = {\n 'db.system': 'cloudflare-vectorize',\n 'db.operation': operation,\n 'db.collection.name': name,\n };\n\n // Per-operation attributes\n if (operation === 'query') {\n const queryInput = args[0] as { topK?: number } | undefined;\n if (queryInput?.topK !== undefined) {\n attributes['db.vectorize.top_k'] = queryInput.topK;\n }\n }\n\n if ((operation === 'insert' || operation === 'upsert') && Array.isArray(args[0])) {\n attributes['db.vectorize.vectors_count'] = args[0].length;\n }\n\n return tracer.startActiveSpan(\n `Vectorize ${name}: ${operation}`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n\n if (operation === 'query' && result?.matches) {\n setAttr(span, 'db.vectorize.matches_count', result.matches.length);\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(vectorize, handler);\n}\n","/**\n * Hyperdrive binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\n/**\n * Instrument Hyperdrive binding\n */\nexport function instrumentHyperdrive<T extends Hyperdrive>(hyperdrive: T, bindingName?: string): T {\n const name = bindingName || 'hyperdrive';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'connect' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const attributes: Record<string, string | number> = {\n 'db.system': 'cloudflare-hyperdrive',\n 'db.operation': 'connect',\n };\n\n // Extract connection info safely (never record password)\n try {\n setAttr({ setAttribute: (k: string, v: any) => { if (v !== undefined && v !== null) attributes[k] = v; } }, 'server.address', target.host);\n setAttr({ setAttribute: (k: string, v: any) => { if (v !== undefined && v !== null) attributes[k] = v; } }, 'server.port', target.port);\n setAttr({ setAttribute: (k: string, v: any) => { if (v !== undefined && v !== null) attributes[k] = v; } }, 'db.user', target.user);\n } catch {\n // Properties may not be accessible in all environments\n }\n\n return tracer.startActiveSpan(\n `Hyperdrive ${name}: connect`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(hyperdrive, handler);\n}\n","/**\n * Queue producer binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\n/**\n * Instrument Queue producer binding\n */\nexport function instrumentQueueProducer<T extends Queue>(queue: T, queueName?: string): T {\n const name = queueName || 'queue';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'send' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Queue ${name}: send`,\n {\n kind: SpanKind.PRODUCER,\n attributes: {\n 'messaging.system': 'cloudflare-queues',\n 'messaging.operation.type': 'publish',\n 'messaging.operation': 'send',\n 'messaging.destination.name': name,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'messaging.message.id', (result as any)?.messageId);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n if (prop === 'sendBatch' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [messages] = args as [{ body: unknown }[]];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Queue ${name}: sendBatch`,\n {\n kind: SpanKind.PRODUCER,\n attributes: {\n 'messaging.system': 'cloudflare-queues',\n 'messaging.operation.type': 'publish',\n 'messaging.operation': 'sendBatch',\n 'messaging.destination.name': name,\n 'messaging.batch.message_count': Array.isArray(messages) ? messages.length : 0,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(queue, handler);\n}\n","/**\n * Analytics Engine binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap } from './common';\n\n/**\n * Instrument Analytics Engine binding\n */\nexport function instrumentAnalyticsEngine<T extends AnalyticsEngineDataset>(ae: T, datasetName?: string): T {\n const name = datasetName || 'analytics-engine';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'writeDataPoint' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [dataPoint] = args as [AnalyticsEngineDataPoint | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const attributes: Record<string, string | number> = {\n 'analytics.system': 'cloudflare-analytics-engine',\n 'analytics.operation': 'writeDataPoint',\n };\n\n if (dataPoint) {\n if (dataPoint.indexes) {\n attributes['analytics.indexes_count'] = Array.isArray(dataPoint.indexes) ? dataPoint.indexes.length : 1;\n }\n if (dataPoint.doubles) {\n attributes['analytics.doubles_count'] = dataPoint.doubles.length;\n }\n if (dataPoint.blobs) {\n attributes['analytics.blobs_count'] = dataPoint.blobs.length;\n }\n }\n\n return tracer.startActiveSpan(\n `AnalyticsEngine ${name}: writeDataPoint`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n (span) => {\n try {\n // writeDataPoint is synchronous/void\n Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(ae, handler);\n}\n","/**\n * Images binding instrumentation\n *\n * The Images binding uses a fluent chain: input() -> transform() -> draw() -> output()\n * We only create a span at the terminal output() call to avoid intermediate noise.\n * info() is a standalone operation and gets its own span.\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\nconst pipelineMetaSymbol = Symbol('images-pipeline-meta');\n\ninterface PipelineMeta {\n operationCount: number;\n}\n\ninterface ImagesLike {\n info(blob: ReadableStream | ArrayBuffer | Blob): Promise<{ width: number; height: number; format: string }>;\n input(blob: ReadableStream | ArrayBuffer | Blob): ImageTransformerLike;\n}\n\ninterface ImageTransformerLike {\n transform(options: unknown): ImageTransformerLike;\n draw(image: unknown, options?: unknown): ImageTransformerLike;\n output(options?: unknown): Promise<ImageOutputLike>;\n}\n\ninterface ImageOutputLike {\n response(): Response;\n blob(): Promise<Blob>;\n arrayBuffer(): Promise<ArrayBuffer>;\n}\n\nfunction proxyTransformer(transformer: ImageTransformerLike, meta: PipelineMeta, bindingName: string): ImageTransformerLike {\n const handler: ProxyHandler<ImageTransformerLike> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if ((prop === 'transform' || prop === 'draw') && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n meta.operationCount++;\n const result = Reflect.apply(fnTarget, target, args);\n // If the result is the transformer itself (fluent chain), return our proxy\n if (result === target || (result && typeof result === 'object' && 'output' in result)) {\n return proxyTransformer(result as ImageTransformerLike, meta, bindingName);\n }\n return result;\n },\n });\n }\n\n if (prop === 'output' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n const [formatOrOptions] = args;\n\n const attributes: Record<string, string | number> = {\n 'images.system': 'cloudflare-images',\n 'images.pipeline.operation_count': meta.operationCount,\n };\n\n // Capture output format\n if (typeof formatOrOptions === 'string') {\n attributes['images.output.format'] = formatOrOptions;\n } else if (formatOrOptions && typeof formatOrOptions === 'object') {\n const fmt = (formatOrOptions as any).format;\n if (fmt) attributes['images.output.format'] = fmt;\n }\n\n return tracer.startActiveSpan(\n `Images ${bindingName}: output`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n const proxy = new Proxy(transformer, handler);\n Object.defineProperty(proxy, pipelineMetaSymbol, {\n value: meta,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n return proxy;\n}\n\n/**\n * Instrument Images binding\n */\nexport function instrumentImages<T extends ImagesLike>(images: T, bindingName?: string): T {\n const name = bindingName || 'images';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'info' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Images ${name}: info`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'images.system': 'cloudflare-images',\n 'images.operation': 'info',\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'images.width', result?.width);\n setAttr(span, 'images.height', result?.height);\n setAttr(span, 'images.format', result?.format);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n if (prop === 'input' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const transformer = Reflect.apply(fnTarget, target, args) as ImageTransformerLike;\n const meta: PipelineMeta = { operationCount: 0 };\n return proxyTransformer(transformer, meta, name);\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(images, handler);\n}\n","/**\n * Auto-instrumentation for Cloudflare Workers bindings\n * \n * Note: This file uses Cloudflare Workers types (KVNamespace, R2Bucket, D1Database, Fetcher, etc.)\n * which are globally available via @cloudflare/workers-types when listed in tsconfig.json.\n * These types are devDependencies only - they're not runtime dependencies.\n * At runtime, Cloudflare Workers runtime provides the actual implementations.\n * \n * This module provides automatic tracing for Cloudflare bindings:\n * - KV (key-value operations)\n * - R2 (object storage operations)\n * - D1 (database operations)\n * - Service Bindings\n * - Events Engine\n * - Workers AI\n * - Vectorize\n * - Hyperdrive\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport { WorkerTracer, getActiveConfig } from 'autotel-edge';\nimport { wrap, isWrapped } from './common';\nimport { instrumentAI } from './ai';\nimport { instrumentVectorize } from './vectorize';\nimport { instrumentHyperdrive } from './hyperdrive';\nimport { instrumentQueueProducer } from './queue-producer';\nimport { instrumentAnalyticsEngine } from './analytics-engine';\nimport { instrumentImages } from './images';\n\ntype DbStatementCapture = 'off' | 'obfuscated' | 'full';\n\n/**\n * Sanitize a SQL statement based on the capture mode.\n * - 'full': returns the statement as-is\n * - 'obfuscated': replaces string literals and numbers with '?'\n * - 'off': returns undefined (attribute not set)\n */\nfunction sanitizeStatement(query: string, mode: DbStatementCapture): string | undefined {\n if (mode === 'off') return undefined;\n if (mode === 'obfuscated') return query.replaceAll(/'[^']*'/g, \"'?'\").replaceAll(/\\b\\d+\\b/g, '?');\n return query;\n}\n\n/**\n * Instrument KV namespace\n */\nexport function instrumentKV<K extends KVNamespace>(kv: K, namespaceName?: string): K {\n const name = namespaceName || 'kv';\n \n const kvHandler: ProxyHandler<K> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'get' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key, options] = args as [string, KVNamespaceGetOptions<unknown> | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: get`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'get',\n 'db.namespace': name,\n 'db.key': key,\n 'db.cache_hit': options?.cacheTtl !== undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.type', result === null ? 'null' : typeof result);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'put' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string, unknown, KVNamespacePutOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: put`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'put',\n 'db.namespace': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'delete' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: delete`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'delete',\n 'db.namespace': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'list' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [options] = args as [KVNamespaceListOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: list`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'list',\n 'db.namespace': name,\n 'db.prefix': options?.prefix || undefined,\n 'db.limit': options?.limit || undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.keys_count', result.keys.length);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(kv, kvHandler);\n}\n\n/**\n * Instrument R2 bucket\n */\nexport function instrumentR2<R extends R2Bucket>(r2: R, bucketName?: string): R {\n const name = bucketName || 'r2';\n \n const r2Handler: ProxyHandler<R> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'get' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string, R2GetOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: get`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'get',\n 'db.bucket': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n if (result) {\n span.setAttribute('db.result.size', result.size);\n span.setAttribute('db.result.etag', result.etag);\n span.setAttribute('db.result.content_type', result.httpMetadata?.contentType);\n } else {\n span.setAttribute('db.result.exists', false);\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'put' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string, ReadableStream | ArrayBuffer | ArrayBufferView | string | null | Blob, R2PutOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: put`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'put',\n 'db.bucket': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.etag', result.etag);\n span.setAttribute('db.result.uploaded', result.uploaded);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'delete' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const keys = args as string[];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: delete`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'delete',\n 'db.bucket': name,\n 'db.keys_count': keys.length,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'list' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [options] = args as [R2ListOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: list`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'list',\n 'db.bucket': name,\n 'db.prefix': options?.prefix || undefined,\n 'db.limit': options?.limit || undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.objects_count', result.objects.length);\n span.setAttribute('db.result.truncated', result.truncated);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(r2, r2Handler);\n}\n\n/**\n * Instrument D1 database\n */\nexport function instrumentD1<D extends D1Database>(d1: D, databaseName?: string): D {\n const name = databaseName || 'd1';\n \n const d1Handler: ProxyHandler<D> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'prepare' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [query] = args as [string];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const prepared = Reflect.apply(fnTarget, target, args);\n \n // Instrument the prepared statement\n const preparedHandler: ProxyHandler<typeof prepared> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'first' || prop === 'run' || prop === 'all' || prop === 'raw') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const activeConfig = getActiveConfig();\n const captureMode: DbStatementCapture = activeConfig?.dataSafety?.captureDbStatement ?? 'full';\n const statement = sanitizeStatement(query, captureMode);\n const attributes: Record<string, any> = {\n 'db.system': 'cloudflare-d1',\n 'db.operation': prop,\n 'db.name': name,\n };\n if (statement !== undefined) {\n attributes['db.statement'] = statement;\n }\n return tracer.startActiveSpan(\n `D1 ${name}: ${prop}`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n if (prop === 'all' && Array.isArray(result)) {\n span.setAttribute('db.result.rows_count', result.length);\n } else if (prop === 'first' && result) {\n span.setAttribute('db.result.exists', true);\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(prepared, preparedHandler);\n },\n });\n }\n \n if (prop === 'exec' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [query] = args as [string];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n const activeConfig = getActiveConfig();\n const captureMode: DbStatementCapture = activeConfig?.dataSafety?.captureDbStatement ?? 'full';\n const statement = sanitizeStatement(query, captureMode);\n const attributes: Record<string, any> = {\n 'db.system': 'cloudflare-d1',\n 'db.operation': 'exec',\n 'db.name': name,\n };\n if (statement !== undefined) {\n attributes['db.statement'] = statement;\n }\n\n return tracer.startActiveSpan(\n `D1 ${name}: exec`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.count', result.count);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(d1, d1Handler);\n}\n\n/**\n * Instrument service binding (Fetcher)\n *\n * Unlike other bindings, Fetcher objects are native Cloudflare C++ bindings\n * whose methods throw \"Illegal invocation\" when called through a Proxy with\n * a different `this` reference. We work around this by calling `target.fetch()`\n * directly on the original binding instead of using `Reflect.apply` on a\n * detached function reference.\n */\nexport function instrumentServiceBinding<F extends Fetcher>(fetcher: F, serviceName?: string): F {\n const name = serviceName || 'service';\n\n const fetcherHandler: ProxyHandler<F> = {\n get(target, prop) {\n if (prop === 'fetch' && typeof target.fetch === 'function') {\n // Return a plain function wrapper instead of proxying the native method.\n // This avoids detaching the native method from its binding, which would\n // cause \"Illegal invocation\" on Cloudflare's native Fetcher objects.\n const tracedFetch = (...args: any[]) => {\n const [input, init] = args as [RequestInfo | URL, RequestInit | undefined];\n const request = new Request(input, init);\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Service ${name}: ${request.method}`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'rpc.system': 'cloudflare-service-binding',\n 'rpc.service': name,\n 'http.request.method': request.method,\n 'url.full': request.url,\n },\n },\n async (span) => {\n try {\n // Call fetch directly on the original target to preserve\n // the native `this` binding that Cloudflare requires\n const response = await target.fetch(input, init as RequestInit);\n span.setAttribute('http.response.status_code', response.status);\n span.setStatus({ code: SpanStatusCode.OK });\n return response;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n return tracedFetch;\n }\n\n // For non-fetch properties, access the original target directly\n // to avoid Proxy-related issues with native bindings\n const value = Reflect.get(target, prop);\n if (typeof value === 'function') {\n // Bind native methods to the original target to prevent\n // \"Illegal invocation\" errors\n return value.bind(target);\n }\n return value;\n },\n };\n\n return wrap(fetcher, fetcherHandler);\n}\n\n/**\n * Detection helpers\n */\nconst hasMethod = (obj: any, m: string): boolean =>\n typeof obj?.[m] === 'function';\n\nconst hasExactMethods = (obj: any, methods: string[]): boolean =>\n methods.every(m => hasMethod(obj, m));\n\n/**\n * Auto-instrument all Cloudflare bindings in the environment\n *\n * Detection order (most specific first):\n * 1. R2 — get, put, delete, list, head\n * 2. KV — get, put, delete, list (not head)\n * 3. D1 — prepare, exec\n * 4. Vectorize — query, insert, upsert, describe\n * 5. AI — run + (gateway or models discriminator)\n * 6. Hyperdrive — connect + connectionString + host\n * 7. Queue Producer — send, sendBatch (not get)\n * 8. Analytics Engine — writeDataPoint\n * 9. Images — info, input\n * 10. Service Binding — fetch (broadest, must be last)\n *\n * Not auto-detected (manual only):\n * - Rate Limiter — limit() alone too generic\n * - Browser Rendering — indistinguishable from Service Binding\n */\nconst envCache = new WeakMap<object, Record<string, any>>();\n\nexport function instrumentBindings(env: Record<string, any>): Record<string, any> {\n const cached = envCache.get(env);\n if (cached) return cached;\n\n const instrumented: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(env)) {\n if (!value || typeof value !== 'object') {\n instrumented[key] = value;\n continue;\n }\n\n // Skip already-instrumented bindings\n if (isWrapped(value)) {\n instrumented[key] = value;\n continue;\n }\n\n // 1. R2 — most specific (has head)\n if (hasExactMethods(value, ['get', 'put', 'delete', 'list', 'head'])) {\n instrumented[key] = instrumentR2(value as R2Bucket, key);\n continue;\n }\n\n // 2. KV — like R2 but without head\n if (hasExactMethods(value, ['get', 'put', 'delete', 'list']) && !('head' in value)) {\n instrumented[key] = instrumentKV(value as KVNamespace, key);\n continue;\n }\n\n // 3. D1\n if (hasExactMethods(value, ['prepare', 'exec'])) {\n instrumented[key] = instrumentD1(value as D1Database, key);\n continue;\n }\n\n // 4. Vectorize\n if (hasExactMethods(value, ['query', 'insert', 'upsert', 'describe'])) {\n instrumented[key] = instrumentVectorize(value as VectorizeIndex, key);\n continue;\n }\n\n // 5. AI — has run() + discriminator properties\n if (hasMethod(value, 'run') && ('gateway' in value || 'models' in value)) {\n instrumented[key] = instrumentAI(value as Ai, key);\n continue;\n }\n\n // 6. Hyperdrive — connect + connection properties\n if (hasMethod(value, 'connect') && 'connectionString' in value && 'host' in value) {\n instrumented[key] = instrumentHyperdrive(value as Hyperdrive, key);\n continue;\n }\n\n // 7. Queue Producer — send + sendBatch (not get, to avoid KV collision)\n if (hasExactMethods(value, ['send', 'sendBatch']) && !('get' in value)) {\n instrumented[key] = instrumentQueueProducer(value as Queue, key);\n continue;\n }\n\n // 8. Analytics Engine\n if (hasMethod(value, 'writeDataPoint')) {\n instrumented[key] = instrumentAnalyticsEngine(value as AnalyticsEngineDataset, key);\n continue;\n }\n\n // 9. Images\n if (hasExactMethods(value, ['info', 'input'])) {\n instrumented[key] = instrumentImages(value as any, key);\n continue;\n }\n\n // 10. Service Binding (broadest — must be last)\n if (hasMethod(value, 'fetch')) {\n instrumented[key] = instrumentServiceBinding(value as Fetcher, key);\n continue;\n }\n\n // Unknown binding type — pass through\n instrumented[key] = value;\n }\n\n envCache.set(env, instrumented);\n return instrumented;\n}\n\n","/**\n * Rate Limiter binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\ninterface RateLimiterLike {\n limit(options: { key: string }): Promise<{ success: boolean }>;\n}\n\n/**\n * Instrument Rate Limiter binding (manual only — not auto-detected)\n */\nexport function instrumentRateLimiter<T extends RateLimiterLike>(limiter: T, bindingName?: string): T {\n const name = bindingName || 'rate-limiter';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'limit' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [options] = args as [{ key: string }];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `RateLimiter ${name}: limit`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'rate_limiter.system': 'cloudflare-rate-limiter',\n 'rate_limiter.key': options?.key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'rate_limiter.success', result?.success);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(limiter, handler);\n}\n","/**\n * Browser Rendering binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\ninterface BrowserRenderingLike {\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;\n}\n\n/**\n * Instrument Browser Rendering binding (manual only — not auto-detected)\n */\nexport function instrumentBrowserRendering<T extends BrowserRenderingLike>(browser: T, bindingName?: string): T {\n const name = bindingName || 'browser';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'fetch' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [input] = args as [RequestInfo | URL, RequestInit | undefined];\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `BrowserRendering ${name}: fetch`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'browser.system': 'cloudflare-browser-rendering',\n 'url.full': url,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'http.response.status_code', result?.status);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(browser, handler);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"bindings-BG6hzGSN.js","names":[],"sources":["../src/bindings/ai.ts","../src/bindings/vectorize.ts","../src/bindings/hyperdrive.ts","../src/bindings/queue-producer.ts","../src/bindings/analytics-engine.ts","../src/bindings/images.ts","../src/bindings/bindings.ts","../src/bindings/rate-limiter.ts","../src/bindings/browser-rendering.ts"],"sourcesContent":["/**\n * Workers AI binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\n/**\n * Instrument Workers AI binding\n */\nexport function instrumentAI<T extends Ai>(ai: T, bindingName?: string): T {\n const name = bindingName || 'ai';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'run' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [model] = args as [string, unknown, unknown];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `AI ${name}: run ${model}`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n // Canonical GenAI provider attribute (replaces deprecated\n // `gen_ai.system`).\n 'gen_ai.provider.name': 'cloudflare-workers-ai',\n 'gen_ai.operation.name': 'run',\n 'gen_ai.request.model': model,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n if (result?.usage?.prompt_tokens !== undefined) {\n setAttr(span, 'gen_ai.usage.input_tokens', Number(result.usage.prompt_tokens));\n }\n if (result?.usage?.completion_tokens !== undefined) {\n setAttr(span, 'gen_ai.usage.output_tokens', Number(result.usage.completion_tokens));\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(ai, handler);\n}\n","/**\n * Vectorize binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\nconst TRACED_METHODS = ['query', 'insert', 'upsert', 'deleteByIds', 'getByIds', 'describe'] as const;\n\n/**\n * Instrument Vectorize index binding\n */\nexport function instrumentVectorize<T extends VectorizeIndex>(vectorize: T, indexName?: string): T {\n const name = indexName || 'vectorize';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (typeof prop === 'string' && TRACED_METHODS.includes(prop as any) && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const operation = prop as string;\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const attributes: Record<string, string | number> = {\n 'db.system': 'cloudflare-vectorize',\n 'db.operation': operation,\n 'db.collection.name': name,\n };\n\n // Per-operation attributes\n if (operation === 'query') {\n const queryInput = args[0] as { topK?: number } | undefined;\n if (queryInput?.topK !== undefined) {\n attributes['db.vectorize.top_k'] = queryInput.topK;\n }\n }\n\n if ((operation === 'insert' || operation === 'upsert') && Array.isArray(args[0])) {\n attributes['db.vectorize.vectors_count'] = args[0].length;\n }\n\n return tracer.startActiveSpan(\n `Vectorize ${name}: ${operation}`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n\n if (operation === 'query' && result?.matches) {\n setAttr(span, 'db.vectorize.matches_count', result.matches.length);\n }\n\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(vectorize, handler);\n}\n","/**\n * Hyperdrive binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\n/**\n * Instrument Hyperdrive binding\n */\nexport function instrumentHyperdrive<T extends Hyperdrive>(hyperdrive: T, bindingName?: string): T {\n const name = bindingName || 'hyperdrive';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'connect' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const attributes: Record<string, string | number> = {\n 'db.system': 'cloudflare-hyperdrive',\n 'db.operation': 'connect',\n };\n\n // Extract connection info safely (never record password)\n try {\n setAttr({ setAttribute: (k: string, v: any) => { if (v !== undefined && v !== null) attributes[k] = v; } }, 'server.address', target.host);\n setAttr({ setAttribute: (k: string, v: any) => { if (v !== undefined && v !== null) attributes[k] = v; } }, 'server.port', target.port);\n setAttr({ setAttribute: (k: string, v: any) => { if (v !== undefined && v !== null) attributes[k] = v; } }, 'db.user', target.user);\n } catch {\n // Properties may not be accessible in all environments\n }\n\n return tracer.startActiveSpan(\n `Hyperdrive ${name}: connect`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(hyperdrive, handler);\n}\n","/**\n * Queue producer binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\n/**\n * Instrument Queue producer binding\n */\nexport function instrumentQueueProducer<T extends Queue>(queue: T, queueName?: string): T {\n const name = queueName || 'queue';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'send' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Queue ${name}: send`,\n {\n kind: SpanKind.PRODUCER,\n attributes: {\n 'messaging.system': 'cloudflare-queues',\n 'messaging.operation.type': 'publish',\n 'messaging.operation': 'send',\n 'messaging.destination.name': name,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'messaging.message.id', (result as any)?.messageId);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n if (prop === 'sendBatch' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [messages] = args as [{ body: unknown }[]];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Queue ${name}: sendBatch`,\n {\n kind: SpanKind.PRODUCER,\n attributes: {\n 'messaging.system': 'cloudflare-queues',\n 'messaging.operation.type': 'publish',\n 'messaging.operation': 'sendBatch',\n 'messaging.destination.name': name,\n 'messaging.batch.message_count': Array.isArray(messages) ? messages.length : 0,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(queue, handler);\n}\n","/**\n * Analytics Engine binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap } from './common';\n\n/**\n * Instrument Analytics Engine binding\n */\nexport function instrumentAnalyticsEngine<T extends AnalyticsEngineDataset>(ae: T, datasetName?: string): T {\n const name = datasetName || 'analytics-engine';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'writeDataPoint' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [dataPoint] = args as [AnalyticsEngineDataPoint | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const attributes: Record<string, string | number> = {\n 'analytics.system': 'cloudflare-analytics-engine',\n 'analytics.operation': 'writeDataPoint',\n };\n\n if (dataPoint) {\n if (dataPoint.indexes) {\n attributes['analytics.indexes_count'] = Array.isArray(dataPoint.indexes) ? dataPoint.indexes.length : 1;\n }\n if (dataPoint.doubles) {\n attributes['analytics.doubles_count'] = dataPoint.doubles.length;\n }\n if (dataPoint.blobs) {\n attributes['analytics.blobs_count'] = dataPoint.blobs.length;\n }\n }\n\n return tracer.startActiveSpan(\n `AnalyticsEngine ${name}: writeDataPoint`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n (span) => {\n try {\n // writeDataPoint is synchronous/void\n Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(ae, handler);\n}\n","/**\n * Images binding instrumentation\n *\n * The Images binding uses a fluent chain: input() -> transform() -> draw() -> output()\n * We only create a span at the terminal output() call to avoid intermediate noise.\n * info() is a standalone operation and gets its own span.\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\nconst pipelineMetaSymbol = Symbol('images-pipeline-meta');\n\ninterface PipelineMeta {\n operationCount: number;\n}\n\ninterface ImagesLike {\n info(blob: ReadableStream | ArrayBuffer | Blob): Promise<{ width: number; height: number; format: string }>;\n input(blob: ReadableStream | ArrayBuffer | Blob): ImageTransformerLike;\n}\n\ninterface ImageTransformerLike {\n transform(options: unknown): ImageTransformerLike;\n draw(image: unknown, options?: unknown): ImageTransformerLike;\n output(options?: unknown): Promise<ImageOutputLike>;\n}\n\ninterface ImageOutputLike {\n response(): Response;\n blob(): Promise<Blob>;\n arrayBuffer(): Promise<ArrayBuffer>;\n}\n\nfunction proxyTransformer(transformer: ImageTransformerLike, meta: PipelineMeta, bindingName: string): ImageTransformerLike {\n const handler: ProxyHandler<ImageTransformerLike> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if ((prop === 'transform' || prop === 'draw') && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n meta.operationCount++;\n const result = Reflect.apply(fnTarget, target, args);\n // If the result is the transformer itself (fluent chain), return our proxy\n if (result === target || (result && typeof result === 'object' && 'output' in result)) {\n return proxyTransformer(result as ImageTransformerLike, meta, bindingName);\n }\n return result;\n },\n });\n }\n\n if (prop === 'output' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n const [formatOrOptions] = args;\n\n const attributes: Record<string, string | number> = {\n 'images.system': 'cloudflare-images',\n 'images.pipeline.operation_count': meta.operationCount,\n };\n\n // Capture output format\n if (typeof formatOrOptions === 'string') {\n attributes['images.output.format'] = formatOrOptions;\n } else if (formatOrOptions && typeof formatOrOptions === 'object') {\n const fmt = (formatOrOptions as any).format;\n if (fmt) attributes['images.output.format'] = fmt;\n }\n\n return tracer.startActiveSpan(\n `Images ${bindingName}: output`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n const proxy = new Proxy(transformer, handler);\n Object.defineProperty(proxy, pipelineMetaSymbol, {\n value: meta,\n writable: false,\n enumerable: false,\n configurable: false,\n });\n return proxy;\n}\n\n/**\n * Instrument Images binding\n */\nexport function instrumentImages<T extends ImagesLike>(images: T, bindingName?: string): T {\n const name = bindingName || 'images';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'info' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Images ${name}: info`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'images.system': 'cloudflare-images',\n 'images.operation': 'info',\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'images.width', result?.width);\n setAttr(span, 'images.height', result?.height);\n setAttr(span, 'images.format', result?.format);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n if (prop === 'input' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const transformer = Reflect.apply(fnTarget, target, args) as ImageTransformerLike;\n const meta: PipelineMeta = { operationCount: 0 };\n return proxyTransformer(transformer, meta, name);\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(images, handler);\n}\n","/**\n * Auto-instrumentation for Cloudflare Workers bindings\n * \n * Note: This file uses Cloudflare Workers types (KVNamespace, R2Bucket, D1Database, Fetcher, etc.)\n * which are globally available via @cloudflare/workers-types when listed in tsconfig.json.\n * These types are devDependencies only - they're not runtime dependencies.\n * At runtime, Cloudflare Workers runtime provides the actual implementations.\n * \n * This module provides automatic tracing for Cloudflare bindings:\n * - KV (key-value operations)\n * - R2 (object storage operations)\n * - D1 (database operations)\n * - Service Bindings\n * - Events Engine\n * - Workers AI\n * - Vectorize\n * - Hyperdrive\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport { WorkerTracer, getActiveConfig } from 'autotel-edge';\nimport { wrap, isWrapped } from './common';\nimport { instrumentAI } from './ai';\nimport { instrumentVectorize } from './vectorize';\nimport { instrumentHyperdrive } from './hyperdrive';\nimport { instrumentQueueProducer } from './queue-producer';\nimport { instrumentAnalyticsEngine } from './analytics-engine';\nimport { instrumentImages } from './images';\n\ntype DbStatementCapture = 'off' | 'obfuscated' | 'full';\n\n/**\n * Sanitize a SQL statement based on the capture mode.\n * - 'full': returns the statement as-is\n * - 'obfuscated': replaces string literals and numbers with '?'\n * - 'off': returns undefined (attribute not set)\n */\nfunction sanitizeStatement(query: string, mode: DbStatementCapture): string | undefined {\n if (mode === 'off') return undefined;\n if (mode === 'obfuscated') return query.replaceAll(/'[^']*'/g, \"'?'\").replaceAll(/\\b\\d+\\b/g, '?');\n return query;\n}\n\n/**\n * Instrument KV namespace\n */\nexport function instrumentKV<K extends KVNamespace>(kv: K, namespaceName?: string): K {\n const name = namespaceName || 'kv';\n \n const kvHandler: ProxyHandler<K> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'get' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key, options] = args as [string, KVNamespaceGetOptions<unknown> | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: get`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'get',\n 'db.namespace': name,\n 'db.key': key,\n 'db.cache_hit': options?.cacheTtl !== undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.type', result === null ? 'null' : typeof result);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'put' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string, unknown, KVNamespacePutOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: put`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'put',\n 'db.namespace': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'delete' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: delete`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'delete',\n 'db.namespace': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'list' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [options] = args as [KVNamespaceListOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `KV ${name}: list`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-kv',\n 'db.operation': 'list',\n 'db.namespace': name,\n 'db.prefix': options?.prefix || undefined,\n 'db.limit': options?.limit || undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.keys_count', result.keys.length);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(kv, kvHandler);\n}\n\n/**\n * Instrument R2 bucket\n */\nexport function instrumentR2<R extends R2Bucket>(r2: R, bucketName?: string): R {\n const name = bucketName || 'r2';\n \n const r2Handler: ProxyHandler<R> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'get' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string, R2GetOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: get`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'get',\n 'db.bucket': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n if (result) {\n span.setAttribute('db.result.size', result.size);\n span.setAttribute('db.result.etag', result.etag);\n span.setAttribute('db.result.content_type', result.httpMetadata?.contentType);\n } else {\n span.setAttribute('db.result.exists', false);\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'put' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [key] = args as [string, ReadableStream | ArrayBuffer | ArrayBufferView | string | null | Blob, R2PutOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: put`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'put',\n 'db.bucket': name,\n 'db.key': key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.etag', result.etag);\n span.setAttribute('db.result.uploaded', result.uploaded);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'delete' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const keys = args as string[];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: delete`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'delete',\n 'db.bucket': name,\n 'db.keys_count': keys.length,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n if (prop === 'list' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [options] = args as [R2ListOptions | undefined];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `R2 ${name}: list`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'db.system': 'cloudflare-r2',\n 'db.operation': 'list',\n 'db.bucket': name,\n 'db.prefix': options?.prefix || undefined,\n 'db.limit': options?.limit || undefined,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.objects_count', result.objects.length);\n span.setAttribute('db.result.truncated', result.truncated);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(r2, r2Handler);\n}\n\n/**\n * Instrument D1 database\n */\nexport function instrumentD1<D extends D1Database>(d1: D, databaseName?: string): D {\n const name = databaseName || 'd1';\n \n const d1Handler: ProxyHandler<D> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'prepare' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [query] = args as [string];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const prepared = Reflect.apply(fnTarget, target, args);\n \n // Instrument the prepared statement\n const preparedHandler: ProxyHandler<typeof prepared> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n \n if (prop === 'first' || prop === 'run' || prop === 'all' || prop === 'raw') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const activeConfig = getActiveConfig();\n const captureMode: DbStatementCapture = activeConfig?.dataSafety?.captureDbStatement ?? 'full';\n const statement = sanitizeStatement(query, captureMode);\n const attributes: Record<string, any> = {\n 'db.system': 'cloudflare-d1',\n 'db.operation': prop,\n 'db.name': name,\n };\n if (statement !== undefined) {\n attributes['db.statement'] = statement;\n }\n return tracer.startActiveSpan(\n `D1 ${name}: ${prop}`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n if (prop === 'all' && Array.isArray(result)) {\n span.setAttribute('db.result.rows_count', result.length);\n } else if (prop === 'first' && result) {\n span.setAttribute('db.result.exists', true);\n }\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(prepared, preparedHandler);\n },\n });\n }\n \n if (prop === 'exec' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [query] = args as [string];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n const activeConfig = getActiveConfig();\n const captureMode: DbStatementCapture = activeConfig?.dataSafety?.captureDbStatement ?? 'full';\n const statement = sanitizeStatement(query, captureMode);\n const attributes: Record<string, any> = {\n 'db.system': 'cloudflare-d1',\n 'db.operation': 'exec',\n 'db.name': name,\n };\n if (statement !== undefined) {\n attributes['db.statement'] = statement;\n }\n\n return tracer.startActiveSpan(\n `D1 ${name}: exec`,\n {\n kind: SpanKind.CLIENT,\n attributes,\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n span.setAttribute('db.result.count', result.count);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n \n return value;\n },\n };\n \n return wrap(d1, d1Handler);\n}\n\n/**\n * Instrument service binding (Fetcher)\n *\n * Unlike other bindings, Fetcher objects are native Cloudflare C++ bindings\n * whose methods throw \"Illegal invocation\" when called through a Proxy with\n * a different `this` reference. We work around this by calling `target.fetch()`\n * directly on the original binding instead of using `Reflect.apply` on a\n * detached function reference.\n */\nexport function instrumentServiceBinding<F extends Fetcher>(fetcher: F, serviceName?: string): F {\n const name = serviceName || 'service';\n\n const fetcherHandler: ProxyHandler<F> = {\n get(target, prop) {\n if (prop === 'fetch' && typeof target.fetch === 'function') {\n // Return a plain function wrapper instead of proxying the native method.\n // This avoids detaching the native method from its binding, which would\n // cause \"Illegal invocation\" on Cloudflare's native Fetcher objects.\n const tracedFetch = (...args: any[]) => {\n const [input, init] = args as [RequestInfo | URL, RequestInit | undefined];\n const request = new Request(input, init);\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Service ${name}: ${request.method}`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'rpc.system': 'cloudflare-service-binding',\n 'rpc.service': name,\n 'http.request.method': request.method,\n 'url.full': request.url,\n },\n },\n async (span) => {\n try {\n // Call fetch directly on the original target to preserve\n // the native `this` binding that Cloudflare requires\n const response = await target.fetch(input, init as RequestInit);\n span.setAttribute('http.response.status_code', response.status);\n span.setStatus({ code: SpanStatusCode.OK });\n return response;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n return tracedFetch;\n }\n\n // For non-fetch properties, access the original target directly\n // to avoid Proxy-related issues with native bindings\n const value = Reflect.get(target, prop);\n if (typeof value === 'function') {\n // Bind native methods to the original target to prevent\n // \"Illegal invocation\" errors\n return value.bind(target);\n }\n return value;\n },\n };\n\n return wrap(fetcher, fetcherHandler);\n}\n\n/**\n * Detection helpers\n */\nconst hasMethod = (obj: any, m: string): boolean =>\n typeof obj?.[m] === 'function';\n\nconst hasExactMethods = (obj: any, methods: string[]): boolean =>\n methods.every(m => hasMethod(obj, m));\n\n/**\n * Auto-instrument all Cloudflare bindings in the environment\n *\n * Detection order (most specific first):\n * 1. R2 — get, put, delete, list, head\n * 2. KV — get, put, delete, list (not head)\n * 3. D1 — prepare, exec\n * 4. Vectorize — query, insert, upsert, describe\n * 5. AI — run + (gateway or models discriminator)\n * 6. Hyperdrive — connect + connectionString + host\n * 7. Queue Producer — send, sendBatch (not get)\n * 8. Analytics Engine — writeDataPoint\n * 9. Images — info, input\n * 10. Service Binding — fetch (broadest, must be last)\n *\n * Not auto-detected (manual only):\n * - Rate Limiter — limit() alone too generic\n * - Browser Rendering — indistinguishable from Service Binding\n */\nconst envCache = new WeakMap<object, Record<string, any>>();\n\nexport function instrumentBindings(env: Record<string, any>): Record<string, any> {\n const cached = envCache.get(env);\n if (cached) return cached;\n\n const instrumented: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(env)) {\n if (!value || typeof value !== 'object') {\n instrumented[key] = value;\n continue;\n }\n\n // Skip already-instrumented bindings\n if (isWrapped(value)) {\n instrumented[key] = value;\n continue;\n }\n\n // 1. R2 — most specific (has head)\n if (hasExactMethods(value, ['get', 'put', 'delete', 'list', 'head'])) {\n instrumented[key] = instrumentR2(value as R2Bucket, key);\n continue;\n }\n\n // 2. KV — like R2 but without head\n if (hasExactMethods(value, ['get', 'put', 'delete', 'list']) && !('head' in value)) {\n instrumented[key] = instrumentKV(value as KVNamespace, key);\n continue;\n }\n\n // 3. D1\n if (hasExactMethods(value, ['prepare', 'exec'])) {\n instrumented[key] = instrumentD1(value as D1Database, key);\n continue;\n }\n\n // 4. Vectorize\n if (hasExactMethods(value, ['query', 'insert', 'upsert', 'describe'])) {\n instrumented[key] = instrumentVectorize(value as VectorizeIndex, key);\n continue;\n }\n\n // 5. AI — has run() + discriminator properties\n if (hasMethod(value, 'run') && ('gateway' in value || 'models' in value)) {\n instrumented[key] = instrumentAI(value as Ai, key);\n continue;\n }\n\n // 6. Hyperdrive — connect + connection properties\n if (hasMethod(value, 'connect') && 'connectionString' in value && 'host' in value) {\n instrumented[key] = instrumentHyperdrive(value as Hyperdrive, key);\n continue;\n }\n\n // 7. Queue Producer — send + sendBatch (not get, to avoid KV collision)\n if (hasExactMethods(value, ['send', 'sendBatch']) && !('get' in value)) {\n instrumented[key] = instrumentQueueProducer(value as Queue, key);\n continue;\n }\n\n // 8. Analytics Engine\n if (hasMethod(value, 'writeDataPoint')) {\n instrumented[key] = instrumentAnalyticsEngine(value as AnalyticsEngineDataset, key);\n continue;\n }\n\n // 9. Images\n if (hasExactMethods(value, ['info', 'input'])) {\n instrumented[key] = instrumentImages(value as any, key);\n continue;\n }\n\n // 10. Service Binding (broadest — must be last)\n if (hasMethod(value, 'fetch')) {\n instrumented[key] = instrumentServiceBinding(value as Fetcher, key);\n continue;\n }\n\n // Unknown binding type — pass through\n instrumented[key] = value;\n }\n\n envCache.set(env, instrumented);\n return instrumented;\n}\n\n","/**\n * Rate Limiter binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\ninterface RateLimiterLike {\n limit(options: { key: string }): Promise<{ success: boolean }>;\n}\n\n/**\n * Instrument Rate Limiter binding (manual only — not auto-detected)\n */\nexport function instrumentRateLimiter<T extends RateLimiterLike>(limiter: T, bindingName?: string): T {\n const name = bindingName || 'rate-limiter';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'limit' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [options] = args as [{ key: string }];\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `RateLimiter ${name}: limit`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'rate_limiter.system': 'cloudflare-rate-limiter',\n 'rate_limiter.key': options?.key,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'rate_limiter.success', result?.success);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(limiter, handler);\n}\n","/**\n * Browser Rendering binding instrumentation\n */\n\nimport {\n trace,\n SpanKind,\n SpanStatusCode,\n} from '@opentelemetry/api';\nimport type { WorkerTracer } from 'autotel-edge';\nimport { wrap, setAttr } from './common';\n\ninterface BrowserRenderingLike {\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;\n}\n\n/**\n * Instrument Browser Rendering binding (manual only — not auto-detected)\n */\nexport function instrumentBrowserRendering<T extends BrowserRenderingLike>(browser: T, bindingName?: string): T {\n const name = bindingName || 'browser';\n\n const handler: ProxyHandler<T> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'fetch' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, _thisArg, args) => {\n const [input] = args as [RequestInfo | URL, RequestInit | undefined];\n const url = typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `BrowserRendering ${name}: fetch`,\n {\n kind: SpanKind.CLIENT,\n attributes: {\n 'browser.system': 'cloudflare-browser-rendering',\n 'url.full': url,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, target, args);\n setAttr(span, 'http.response.status_code', result?.status);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n return value;\n },\n };\n\n return wrap(browser, handler);\n}\n"],"mappings":"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"}
package/dist/bindings.js CHANGED
@@ -1,3 +1,3 @@
1
- import { a as instrumentKV, c as instrumentImages, d as instrumentHyperdrive, f as instrumentVectorize, i as instrumentD1, l as instrumentAnalyticsEngine, n as instrumentRateLimiter, o as instrumentR2, p as instrumentAI, r as instrumentBindings, s as instrumentServiceBinding, t as instrumentBrowserRendering, u as instrumentQueueProducer } from "./bindings-C10RI6Il.js";
1
+ import { a as instrumentKV, c as instrumentImages, d as instrumentHyperdrive, f as instrumentVectorize, i as instrumentD1, l as instrumentAnalyticsEngine, n as instrumentRateLimiter, o as instrumentR2, p as instrumentAI, r as instrumentBindings, s as instrumentServiceBinding, t as instrumentBrowserRendering, u as instrumentQueueProducer } from "./bindings-BG6hzGSN.js";
2
2
 
3
3
  export { instrumentAI, instrumentAnalyticsEngine, instrumentBindings, instrumentBrowserRendering, instrumentD1, instrumentHyperdrive, instrumentImages, instrumentKV, instrumentQueueProducer, instrumentR2, instrumentRateLimiter, instrumentServiceBinding, instrumentVectorize };
@@ -150,10 +150,11 @@ function instrumentDOInstance(doInstance, state, _env, doClass) {
150
150
  function instrumentDO(doClass, config) {
151
151
  const initialiser = createInitialiser(config);
152
152
  return wrap(doClass, { construct(target, [state, env]) {
153
- const context$2 = setConfig(initialiser(env, {
153
+ const trigger = {
154
154
  id: state.id.toString(),
155
155
  name: state.id.name
156
- }));
156
+ };
157
+ const context$2 = setConfig(initialiser(env, trigger));
157
158
  return instrumentDOInstance(context.with(context$2, () => {
158
159
  return new target(state, env);
159
160
  }), state, env, doClass);
@@ -363,7 +364,8 @@ function instrumentWorkflowInstance(workflowInstance, workflowName, workflowClas
363
364
  function instrumentWorkflow(workflowClass, workflowName, config) {
364
365
  const initialiser = createInitialiser(config);
365
366
  return wrap(workflowClass, { construct(target, args) {
366
- const context$1 = setConfig(initialiser(args[args.length - 1] || {}, {
367
+ const env = args[args.length - 1] || {};
368
+ const context$1 = setConfig(initialiser(env, {
367
369
  type: "workflow",
368
370
  name: workflowName
369
371
  }));
@@ -375,4 +377,4 @@ function instrumentWorkflow(workflowClass, workflowName, config) {
375
377
 
376
378
  //#endregion
377
379
  export { instrumentDO as n, instrumentWorkflow as t };
378
- //# sourceMappingURL=handlers-CMg9l_T-.js.map
380
+ //# sourceMappingURL=handlers-BAe65zoJ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handlers-CMg9l_T-.js","names":["coldStarts","isColdStart","api_context","context","context","api_context"],"sources":["../src/handlers/durable-objects.ts","../src/handlers/workflows.ts"],"sourcesContent":["/**\n * Durable Objects instrumentation for Cloudflare Workers\n * \n * Note: This file uses Cloudflare Workers types (DurableObjectId, DurableObjectState, etc.)\n * which are globally available via @cloudflare/workers-types when listed in tsconfig.json.\n * These types are devDependencies only - they're not runtime dependencies.\n * At runtime, Cloudflare Workers runtime provides the actual implementations.\n */\n\nimport {\n trace,\n context as api_context,\n propagation,\n SpanStatusCode,\n SpanKind,\n} from '@opentelemetry/api';\nimport type { ConfigurationOption } from 'autotel-edge';\nimport { createInitialiser, setConfig, WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\n\n// Durable Object types\ntype DOFetchFn = (request: Request) => Response | Promise<Response>;\ntype DOAlarmFn = () => void | Promise<void>;\n\n/**\n * Track cold starts per DO class\n */\nconst coldStarts = new WeakMap<any, boolean>();\n\nfunction isColdStart(doClass: any): boolean {\n if (!coldStarts.has(doClass)) {\n coldStarts.set(doClass, true);\n return true;\n }\n return false;\n}\n\n/**\n * Instrument a Durable Object fetch method\n */\nfunction instrumentDOFetch(\n fetchFn: DOFetchFn,\n id: DurableObjectId,\n doClass: any,\n): DOFetchFn {\n return async function instrumentedFetch(\n this: any,\n request: Request,\n ): Promise<Response> {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n // Extract parent context from request headers\n const parentContext = propagation.extract(\n api_context.active(),\n request.headers,\n );\n\n const url = new URL(request.url);\n const spanName = `DO ${id.name || id.toString()}: ${request.method} ${url.pathname}`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n 'http.request.method': request.method,\n 'url.full': request.url,\n 'do.id': id.toString(),\n 'do.id.name': id.name || '',\n 'faas.trigger': 'http',\n 'faas.coldstart': isColdStart(doClass),\n },\n },\n parentContext,\n async (span) => {\n try {\n const response = await fetchFn.call(this, request);\n\n span.setAttributes({\n 'http.response.status_code': response.status,\n });\n\n if (response.ok) {\n span.setStatus({ code: SpanStatusCode.OK });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n return response;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n/**\n * Instrument a Durable Object alarm method\n */\nfunction instrumentDOAlarm(\n alarmFn: DOAlarmFn,\n id: DurableObjectId,\n doClass: any,\n): DOAlarmFn {\n return async function instrumentedAlarm(this: any): Promise<void> {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const spanName = `DO ${id.name || id.toString()}: alarm`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'do.id': id.toString(),\n 'do.id.name': id.name || '',\n 'faas.trigger': 'timer',\n 'faas.coldstart': isColdStart(doClass),\n },\n },\n async (span) => {\n try {\n await alarmFn.call(this);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n/**\n * Instrument a Durable Object instance\n */\nfunction instrumentDOInstance(\n doInstance: any,\n state: DurableObjectState,\n _env: any,\n doClass: any,\n): any {\n const instanceHandler: ProxyHandler<any> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'fetch' && typeof value === 'function') {\n return instrumentDOFetch(value.bind(target), state.id, doClass);\n }\n\n if (prop === 'alarm' && typeof value === 'function') {\n return instrumentDOAlarm(value.bind(target), state.id, doClass);\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(doInstance, instanceHandler);\n}\n\n/**\n * Instrument a Durable Object class\n *\n * This wraps the DO class to automatically trace all fetch and alarm calls,\n * as well as initialize the telemetry configuration.\n *\n * **Usage:**\n * ```typescript\n * import { DurableObject } from 'cloudflare:workers'\n * import { instrumentDO } from 'autotel-edge'\n *\n * export class Counter extends DurableObject<Env> {\n * async fetch(request: Request) {\n * // Your DO logic here\n * return new Response('OK')\n * }\n * }\n *\n * // Wrap the class before exporting\n * export const CounterDO = instrumentDO(Counter, (env: Env) => ({\n * exporter: {\n * url: env.OTLP_ENDPOINT,\n * headers: { 'x-api-key': env.API_KEY }\n * },\n * service: {\n * name: 'my-durable-object',\n * version: '1.0.0'\n * }\n * }))\n * ```\n *\n * **What you get:**\n * - 🎯 Automatic spans for fetch() calls with HTTP attributes\n * - ⏰ Automatic spans for alarm() calls\n * - 🥶 Cold start tracking\n * - 🔗 Context propagation from incoming requests\n * - ⚡ Automatic span lifecycle management\n *\n * @param doClass - The Durable Object class to instrument\n * @param config - Configuration or configuration function\n * @returns Instrumented Durable Object class\n */\nexport function instrumentDO<C extends new (state: DurableObjectState, env: any) => any>(\n doClass: C,\n config: ConfigurationOption,\n): C {\n const initialiser = createInitialiser(config);\n\n const classHandler: ProxyHandler<C> = {\n construct(target, [state, env]: [DurableObjectState, any]) {\n // Initialize config for this DO instance\n const trigger = {\n id: state.id.toString(),\n name: state.id.name,\n };\n const doConfig = initialiser(env, trigger);\n const context = setConfig(doConfig);\n\n // Create the DO instance within the config context\n const doInstance = api_context.with(context, () => {\n return new target(state, env);\n });\n\n // Instrument the instance\n return instrumentDOInstance(doInstance, state, env, doClass);\n },\n };\n\n return wrap(doClass, classHandler);\n}\n","/**\n * Cloudflare Workflows instrumentation for autotel-edge\n *\n * Instruments WorkflowEntrypoint classes to automatically trace workflow execution,\n * step operations, retries, and sleeps.\n *\n * Based on Cloudflare Workflows API:\n * https://developers.cloudflare.com/workflows/\n */\n\nimport {\n trace,\n context as api_context,\n SpanStatusCode,\n SpanKind,\n} from '@opentelemetry/api';\nimport type { WorkflowEvent, WorkflowStep } from 'cloudflare:workers';\nimport type { ConfigurationOption, WorkflowTrigger } from 'autotel-edge';\nimport { createInitialiser, setConfig, WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\n\ntype WorkflowRunFn = (\n event: Readonly<WorkflowEvent<unknown>>,\n step: WorkflowStep,\n) => Promise<unknown> | void;\n\n/**\n * Track cold starts per Workflow class\n */\nconst coldStarts = new WeakMap<object, boolean>();\n\nfunction isColdStart(workflowClass: object): boolean {\n if (!coldStarts.has(workflowClass)) {\n coldStarts.set(workflowClass, true);\n return true;\n }\n return false;\n}\n\n/**\n * Proxy the step object to instrument step.do(), step.sleep(), and step.sleepUntil() calls\n */\nfunction instrumentWorkflowStep(\n step: WorkflowStep,\n workflowName: string,\n): WorkflowStep {\n const stepHandler: ProxyHandler<WorkflowStep> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Instrument step.do() to create spans for each workflow step\n if (prop === 'do' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, thisArg, args) => {\n const [stepName] = args as [string, ...unknown[]];\n\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Workflow ${workflowName}: ${stepName}`,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'workflow.step.name': stepName,\n 'workflow.name': workflowName,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, thisArg, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n // Instrument step.sleep() to track workflow delays\n if (prop === 'sleep' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, thisArg, args) => {\n const [sleepName, duration] = args as [string, string | number];\n\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Workflow ${workflowName}: sleep ${sleepName}`,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'workflow.sleep.name': sleepName,\n 'workflow.sleep.duration': String(duration),\n 'workflow.name': workflowName,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, thisArg, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n if (prop === 'sleepUntil' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, thisArg, args) => {\n const [sleepName, timestamp] = args as [string, Date | number];\n\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n const wakeAt =\n timestamp instanceof Date\n ? timestamp.toISOString()\n : new Date(timestamp).toISOString();\n\n return tracer.startActiveSpan(\n `Workflow ${workflowName}: sleepUntil ${sleepName}`,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'workflow.sleep.name': sleepName,\n 'workflow.sleep.until': wakeAt,\n 'workflow.name': workflowName,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, thisArg, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n // Pass through other step methods\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(step, stepHandler);\n}\n\n/**\n * Instrument a Workflow run method\n */\nfunction instrumentWorkflowRun(\n runFn: WorkflowRunFn,\n workflowName: string,\n workflowClass: object,\n): WorkflowRunFn {\n return async function instrumentedRun(\n this: unknown,\n event: Readonly<WorkflowEvent<unknown>>,\n step: WorkflowStep,\n ): Promise<unknown> {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n // Instrument the step object to track individual operations\n const instrumentedStep = instrumentWorkflowStep(step, workflowName);\n\n const spanName = `Workflow ${workflowName}: run`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'workflow.name': workflowName,\n 'workflow.instance_id': event.instanceId,\n 'faas.trigger': 'workflow',\n 'faas.coldstart': isColdStart(workflowClass),\n },\n },\n async (span) => {\n try {\n const result = await runFn.call(this, event, instrumentedStep);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n/**\n * Instrument a Workflow instance\n */\nfunction instrumentWorkflowInstance(\n workflowInstance: Record<string, unknown>,\n workflowName: string,\n workflowClass: object,\n): Record<string, unknown> {\n const instanceHandler: ProxyHandler<Record<string, unknown>> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'run' && typeof value === 'function') {\n return instrumentWorkflowRun(\n value.bind(target) as WorkflowRunFn,\n workflowName,\n workflowClass,\n );\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(workflowInstance, instanceHandler);\n}\n\n/**\n * Instrument a Cloudflare Workflow class\n *\n * This wraps the WorkflowEntrypoint class to automatically trace workflow execution,\n * step operations, retries, and sleeps.\n *\n * **Usage:**\n * ```typescript\n * import { WorkflowEntrypoint } from 'cloudflare:workers'\n * import { instrumentWorkflow } from 'autotel-cloudflare/handlers'\n *\n * class MyWorkflow extends WorkflowEntrypoint {\n * async run(event, step) {\n * await step.do('submit payment', async () => {\n * return await submitToPaymentProcessor(event.payload.payment)\n * })\n *\n * await step.sleep('wait for feedback', '2 days')\n *\n * await step.do('send feedback email', sendFeedbackEmail)\n * }\n * }\n *\n * export const CheckoutWorkflow = instrumentWorkflow(\n * MyWorkflow,\n * 'checkout-workflow',\n * (env: Env) => ({\n * exporter: {\n * url: env.OTLP_ENDPOINT,\n * headers: { 'x-api-key': env.API_KEY }\n * },\n * service: {\n * name: 'checkout-workflow',\n * version: '1.0.0'\n * }\n * })\n * )\n * ```\n *\n * @param workflowClass - The WorkflowEntrypoint class to instrument\n * @param workflowName - The name of the workflow (used in span names)\n * @param config - Configuration or configuration function\n * @returns Instrumented Workflow class\n */\nexport function instrumentWorkflow<\n C extends new (...args: any[]) => any,\n>(\n workflowClass: C,\n workflowName: string,\n config: ConfigurationOption,\n): C {\n const initialiser = createInitialiser(config);\n\n const classHandler: ProxyHandler<C> = {\n construct(target, args: any[]) {\n // Extract env from constructor args (typically last arg)\n const env = args[args.length - 1] || {};\n\n const trigger: WorkflowTrigger = { type: 'workflow', name: workflowName };\n const workflowConfig = initialiser(env, trigger);\n const context = setConfig(workflowConfig);\n\n // Create the workflow instance within the config context\n const workflowInstance = api_context.with(context, () => {\n return new target(...args);\n });\n\n // Instrument the instance\n return instrumentWorkflowInstance(\n workflowInstance,\n workflowName,\n workflowClass,\n );\n },\n };\n\n return wrap(workflowClass, classHandler);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"handlers-BAe65zoJ.js","names":["coldStarts","isColdStart","api_context","context","context","api_context"],"sources":["../src/handlers/durable-objects.ts","../src/handlers/workflows.ts"],"sourcesContent":["/**\n * Durable Objects instrumentation for Cloudflare Workers\n * \n * Note: This file uses Cloudflare Workers types (DurableObjectId, DurableObjectState, etc.)\n * which are globally available via @cloudflare/workers-types when listed in tsconfig.json.\n * These types are devDependencies only - they're not runtime dependencies.\n * At runtime, Cloudflare Workers runtime provides the actual implementations.\n */\n\nimport {\n trace,\n context as api_context,\n propagation,\n SpanStatusCode,\n SpanKind,\n} from '@opentelemetry/api';\nimport type { ConfigurationOption } from 'autotel-edge';\nimport { createInitialiser, setConfig, WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\n\n// Durable Object types\ntype DOFetchFn = (request: Request) => Response | Promise<Response>;\ntype DOAlarmFn = () => void | Promise<void>;\n\n/**\n * Track cold starts per DO class\n */\nconst coldStarts = new WeakMap<any, boolean>();\n\nfunction isColdStart(doClass: any): boolean {\n if (!coldStarts.has(doClass)) {\n coldStarts.set(doClass, true);\n return true;\n }\n return false;\n}\n\n/**\n * Instrument a Durable Object fetch method\n */\nfunction instrumentDOFetch(\n fetchFn: DOFetchFn,\n id: DurableObjectId,\n doClass: any,\n): DOFetchFn {\n return async function instrumentedFetch(\n this: any,\n request: Request,\n ): Promise<Response> {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n // Extract parent context from request headers\n const parentContext = propagation.extract(\n api_context.active(),\n request.headers,\n );\n\n const url = new URL(request.url);\n const spanName = `DO ${id.name || id.toString()}: ${request.method} ${url.pathname}`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.SERVER,\n attributes: {\n 'http.request.method': request.method,\n 'url.full': request.url,\n 'do.id': id.toString(),\n 'do.id.name': id.name || '',\n 'faas.trigger': 'http',\n 'faas.coldstart': isColdStart(doClass),\n },\n },\n parentContext,\n async (span) => {\n try {\n const response = await fetchFn.call(this, request);\n\n span.setAttributes({\n 'http.response.status_code': response.status,\n });\n\n if (response.ok) {\n span.setStatus({ code: SpanStatusCode.OK });\n } else {\n span.setStatus({ code: SpanStatusCode.ERROR });\n }\n\n return response;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n/**\n * Instrument a Durable Object alarm method\n */\nfunction instrumentDOAlarm(\n alarmFn: DOAlarmFn,\n id: DurableObjectId,\n doClass: any,\n): DOAlarmFn {\n return async function instrumentedAlarm(this: any): Promise<void> {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n const spanName = `DO ${id.name || id.toString()}: alarm`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'do.id': id.toString(),\n 'do.id.name': id.name || '',\n 'faas.trigger': 'timer',\n 'faas.coldstart': isColdStart(doClass),\n },\n },\n async (span) => {\n try {\n await alarmFn.call(this);\n span.setStatus({ code: SpanStatusCode.OK });\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n/**\n * Instrument a Durable Object instance\n */\nfunction instrumentDOInstance(\n doInstance: any,\n state: DurableObjectState,\n _env: any,\n doClass: any,\n): any {\n const instanceHandler: ProxyHandler<any> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'fetch' && typeof value === 'function') {\n return instrumentDOFetch(value.bind(target), state.id, doClass);\n }\n\n if (prop === 'alarm' && typeof value === 'function') {\n return instrumentDOAlarm(value.bind(target), state.id, doClass);\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(doInstance, instanceHandler);\n}\n\n/**\n * Instrument a Durable Object class\n *\n * This wraps the DO class to automatically trace all fetch and alarm calls,\n * as well as initialize the telemetry configuration.\n *\n * **Usage:**\n * ```typescript\n * import { DurableObject } from 'cloudflare:workers'\n * import { instrumentDO } from 'autotel-edge'\n *\n * export class Counter extends DurableObject<Env> {\n * async fetch(request: Request) {\n * // Your DO logic here\n * return new Response('OK')\n * }\n * }\n *\n * // Wrap the class before exporting\n * export const CounterDO = instrumentDO(Counter, (env: Env) => ({\n * exporter: {\n * url: env.OTLP_ENDPOINT,\n * headers: { 'x-api-key': env.API_KEY }\n * },\n * service: {\n * name: 'my-durable-object',\n * version: '1.0.0'\n * }\n * }))\n * ```\n *\n * **What you get:**\n * - 🎯 Automatic spans for fetch() calls with HTTP attributes\n * - ⏰ Automatic spans for alarm() calls\n * - 🥶 Cold start tracking\n * - 🔗 Context propagation from incoming requests\n * - ⚡ Automatic span lifecycle management\n *\n * @param doClass - The Durable Object class to instrument\n * @param config - Configuration or configuration function\n * @returns Instrumented Durable Object class\n */\nexport function instrumentDO<C extends new (state: DurableObjectState, env: any) => any>(\n doClass: C,\n config: ConfigurationOption,\n): C {\n const initialiser = createInitialiser(config);\n\n const classHandler: ProxyHandler<C> = {\n construct(target, [state, env]: [DurableObjectState, any]) {\n // Initialize config for this DO instance\n const trigger = {\n id: state.id.toString(),\n name: state.id.name,\n };\n const doConfig = initialiser(env, trigger);\n const context = setConfig(doConfig);\n\n // Create the DO instance within the config context\n const doInstance = api_context.with(context, () => {\n return new target(state, env);\n });\n\n // Instrument the instance\n return instrumentDOInstance(doInstance, state, env, doClass);\n },\n };\n\n return wrap(doClass, classHandler);\n}\n","/**\n * Cloudflare Workflows instrumentation for autotel-edge\n *\n * Instruments WorkflowEntrypoint classes to automatically trace workflow execution,\n * step operations, retries, and sleeps.\n *\n * Based on Cloudflare Workflows API:\n * https://developers.cloudflare.com/workflows/\n */\n\nimport {\n trace,\n context as api_context,\n SpanStatusCode,\n SpanKind,\n} from '@opentelemetry/api';\nimport type { WorkflowEvent, WorkflowStep } from 'cloudflare:workers';\nimport type { ConfigurationOption, WorkflowTrigger } from 'autotel-edge';\nimport { createInitialiser, setConfig, WorkerTracer } from 'autotel-edge';\nimport { wrap } from '../bindings/common';\n\ntype WorkflowRunFn = (\n event: Readonly<WorkflowEvent<unknown>>,\n step: WorkflowStep,\n) => Promise<unknown> | void;\n\n/**\n * Track cold starts per Workflow class\n */\nconst coldStarts = new WeakMap<object, boolean>();\n\nfunction isColdStart(workflowClass: object): boolean {\n if (!coldStarts.has(workflowClass)) {\n coldStarts.set(workflowClass, true);\n return true;\n }\n return false;\n}\n\n/**\n * Proxy the step object to instrument step.do(), step.sleep(), and step.sleepUntil() calls\n */\nfunction instrumentWorkflowStep(\n step: WorkflowStep,\n workflowName: string,\n): WorkflowStep {\n const stepHandler: ProxyHandler<WorkflowStep> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n // Instrument step.do() to create spans for each workflow step\n if (prop === 'do' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, thisArg, args) => {\n const [stepName] = args as [string, ...unknown[]];\n\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Workflow ${workflowName}: ${stepName}`,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'workflow.step.name': stepName,\n 'workflow.name': workflowName,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, thisArg, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n // Instrument step.sleep() to track workflow delays\n if (prop === 'sleep' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, thisArg, args) => {\n const [sleepName, duration] = args as [string, string | number];\n\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n return tracer.startActiveSpan(\n `Workflow ${workflowName}: sleep ${sleepName}`,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'workflow.sleep.name': sleepName,\n 'workflow.sleep.duration': String(duration),\n 'workflow.name': workflowName,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, thisArg, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n if (prop === 'sleepUntil' && typeof value === 'function') {\n return new Proxy(value, {\n apply: (fnTarget, thisArg, args) => {\n const [sleepName, timestamp] = args as [string, Date | number];\n\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n const wakeAt =\n timestamp instanceof Date\n ? timestamp.toISOString()\n : new Date(timestamp).toISOString();\n\n return tracer.startActiveSpan(\n `Workflow ${workflowName}: sleepUntil ${sleepName}`,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'workflow.sleep.name': sleepName,\n 'workflow.sleep.until': wakeAt,\n 'workflow.name': workflowName,\n },\n },\n async (span) => {\n try {\n const result = await Reflect.apply(fnTarget, thisArg, args);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message:\n error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n },\n });\n }\n\n // Pass through other step methods\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(step, stepHandler);\n}\n\n/**\n * Instrument a Workflow run method\n */\nfunction instrumentWorkflowRun(\n runFn: WorkflowRunFn,\n workflowName: string,\n workflowClass: object,\n): WorkflowRunFn {\n return async function instrumentedRun(\n this: unknown,\n event: Readonly<WorkflowEvent<unknown>>,\n step: WorkflowStep,\n ): Promise<unknown> {\n const tracer = trace.getTracer('autotel-edge') as WorkerTracer;\n\n // Instrument the step object to track individual operations\n const instrumentedStep = instrumentWorkflowStep(step, workflowName);\n\n const spanName = `Workflow ${workflowName}: run`;\n\n return tracer.startActiveSpan(\n spanName,\n {\n kind: SpanKind.INTERNAL,\n attributes: {\n 'workflow.name': workflowName,\n 'workflow.instance_id': event.instanceId,\n 'faas.trigger': 'workflow',\n 'faas.coldstart': isColdStart(workflowClass),\n },\n },\n async (span) => {\n try {\n const result = await runFn.call(this, event, instrumentedStep);\n span.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n span.recordException(error as Error);\n span.setStatus({\n code: SpanStatusCode.ERROR,\n message: error instanceof Error ? error.message : String(error),\n });\n throw error;\n } finally {\n span.end();\n }\n },\n );\n };\n}\n\n/**\n * Instrument a Workflow instance\n */\nfunction instrumentWorkflowInstance(\n workflowInstance: Record<string, unknown>,\n workflowName: string,\n workflowClass: object,\n): Record<string, unknown> {\n const instanceHandler: ProxyHandler<Record<string, unknown>> = {\n get(target, prop) {\n const value = Reflect.get(target, prop);\n\n if (prop === 'run' && typeof value === 'function') {\n return instrumentWorkflowRun(\n value.bind(target) as WorkflowRunFn,\n workflowName,\n workflowClass,\n );\n }\n\n // Bind other methods to the target\n if (typeof value === 'function') {\n return value.bind(target);\n }\n\n return value;\n },\n };\n\n return wrap(workflowInstance, instanceHandler);\n}\n\n/**\n * Instrument a Cloudflare Workflow class\n *\n * This wraps the WorkflowEntrypoint class to automatically trace workflow execution,\n * step operations, retries, and sleeps.\n *\n * **Usage:**\n * ```typescript\n * import { WorkflowEntrypoint } from 'cloudflare:workers'\n * import { instrumentWorkflow } from 'autotel-cloudflare/handlers'\n *\n * class MyWorkflow extends WorkflowEntrypoint {\n * async run(event, step) {\n * await step.do('submit payment', async () => {\n * return await submitToPaymentProcessor(event.payload.payment)\n * })\n *\n * await step.sleep('wait for feedback', '2 days')\n *\n * await step.do('send feedback email', sendFeedbackEmail)\n * }\n * }\n *\n * export const CheckoutWorkflow = instrumentWorkflow(\n * MyWorkflow,\n * 'checkout-workflow',\n * (env: Env) => ({\n * exporter: {\n * url: env.OTLP_ENDPOINT,\n * headers: { 'x-api-key': env.API_KEY }\n * },\n * service: {\n * name: 'checkout-workflow',\n * version: '1.0.0'\n * }\n * })\n * )\n * ```\n *\n * @param workflowClass - The WorkflowEntrypoint class to instrument\n * @param workflowName - The name of the workflow (used in span names)\n * @param config - Configuration or configuration function\n * @returns Instrumented Workflow class\n */\nexport function instrumentWorkflow<\n C extends new (...args: any[]) => any,\n>(\n workflowClass: C,\n workflowName: string,\n config: ConfigurationOption,\n): C {\n const initialiser = createInitialiser(config);\n\n const classHandler: ProxyHandler<C> = {\n construct(target, args: any[]) {\n // Extract env from constructor args (typically last arg)\n const env = args[args.length - 1] || {};\n\n const trigger: WorkflowTrigger = { type: 'workflow', name: workflowName };\n const workflowConfig = initialiser(env, trigger);\n const context = setConfig(workflowConfig);\n\n // Create the workflow instance within the config context\n const workflowInstance = api_context.with(context, () => {\n return new target(...args);\n });\n\n // Instrument the instance\n return instrumentWorkflowInstance(\n workflowInstance,\n workflowName,\n workflowClass,\n );\n },\n };\n\n return wrap(workflowClass, classHandler);\n}\n"],"mappings":"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"}
package/dist/handlers.js CHANGED
@@ -1,3 +1,3 @@
1
- import { n as instrumentDO, t as instrumentWorkflow } from "./handlers-CMg9l_T-.js";
1
+ import { n as instrumentDO, t as instrumentWorkflow } from "./handlers-BAe65zoJ.js";
2
2
 
3
3
  export { instrumentDO, instrumentWorkflow };
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { a as getWorkflowLogger, i as getRequestLogger, n as getActorLogger, r as getQueueLogger, t as createWorkersLogger } from "./execution-logger-BxmgP8jF.js";
2
2
  import { n as isNativeTracingAvailable, t as getNativeTracerFromCtx } from "./native-tracing-D0EyAtsF.js";
3
3
  import { a as wrap, i as unwrap, n as proxyExecutionContext } from "./common-DiWH6nmG.js";
4
- import { a as instrumentKV, c as instrumentImages, d as instrumentHyperdrive, f as instrumentVectorize, i as instrumentD1, l as instrumentAnalyticsEngine, n as instrumentRateLimiter, o as instrumentR2, p as instrumentAI, r as instrumentBindings, s as instrumentServiceBinding, t as instrumentBrowserRendering, u as instrumentQueueProducer } from "./bindings-C10RI6Il.js";
5
- import { n as instrumentDO, t as instrumentWorkflow } from "./handlers-CMg9l_T-.js";
4
+ import { a as instrumentKV, c as instrumentImages, d as instrumentHyperdrive, f as instrumentVectorize, i as instrumentD1, l as instrumentAnalyticsEngine, n as instrumentRateLimiter, o as instrumentR2, p as instrumentAI, r as instrumentBindings, s as instrumentServiceBinding, t as instrumentBrowserRendering, u as instrumentQueueProducer } from "./bindings-BG6hzGSN.js";
5
+ import { n as instrumentDO, t as instrumentWorkflow } from "./handlers-BAe65zoJ.js";
6
6
  import { WorkerTracer, WorkerTracerProvider, createInitialiser, ensureGlobalContextManager, getActiveConfig, getServiceForPath, setConfig, shouldInstrumentPath, withNativeTracer } from "autotel-edge";
7
7
  import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
8
8
  import { resourceFromAttributes } from "@opentelemetry/resources";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "autotel-cloudflare",
3
- "version": "4.0.4",
3
+ "version": "4.0.6",
4
4
  "description": "The #1 OpenTelemetry package for Cloudflare Workers - complete bindings coverage, native CF OTel integration, advanced sampling",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -73,15 +73,15 @@
73
73
  "workers-ai"
74
74
  ],
75
75
  "author": "Jag Reehal <jag@jagreehal.com> (https://jagreehal.com)",
76
- "license": "MIT",
76
+ "license": "Apache-2.0",
77
77
  "dependencies": {
78
78
  "@opentelemetry/api": "^1.9.1",
79
79
  "@opentelemetry/resources": "^2.7.1"
80
80
  },
81
81
  "peerDependencies": {
82
- "@cloudflare/workers-types": "^4.20260607.1",
83
- "autotel-edge": "3.17.1",
84
- "autotel-genai": "0.3.4"
82
+ "@cloudflare/workers-types": "^5.20260707.1",
83
+ "autotel-edge": "3.17.2",
84
+ "autotel-genai": "0.3.6"
85
85
  },
86
86
  "peerDependenciesMeta": {
87
87
  "autotel-edge": {
@@ -92,16 +92,16 @@
92
92
  }
93
93
  },
94
94
  "devDependencies": {
95
- "@cloudflare/workers-types": "^4.20260607.1",
95
+ "@cloudflare/workers-types": "^5.20260707.1",
96
96
  "@opentelemetry/context-async-hooks": "^2.7.1",
97
- "@types/node": "^25.9.2",
97
+ "@types/node": "^26.1.0",
98
98
  "rimraf": "^6.1.3",
99
- "tsdown": "^0.22.2",
99
+ "tsdown": "^0.22.3",
100
100
  "typescript": "^6.0.3",
101
- "vitest": "^4.1.8",
101
+ "vitest": "^4.1.10",
102
102
  "vitest-mock-extended": "^4.0.0",
103
- "autotel-edge": "3.17.1",
104
- "autotel-genai": "0.3.4"
103
+ "autotel-edge": "3.17.2",
104
+ "autotel-genai": "0.3.6"
105
105
  },
106
106
  "repository": {
107
107
  "type": "git",