import { instrumentWorkersAiClient, isObjectLike } from '@sentry/core'; import { isD1Database, isQueue, isR2Bucket, isRateLimit, isAiBinding, isDurableObjectNamespace, isJSRPC } from '../../utils/isBinding.js'; import { instrumentD1 } from './instrumentD1.js'; import { appendRpcMeta } from '../../utils/rpcMeta.js'; import { createRpcPropagationResolver } from '../../utils/rpcPropagation.js'; import { instrumentDurableObjectNamespace, STUB_NON_RPC_METHODS } from '../instrumentDurableObjectNamespace.js'; import { instrumentFetcher } from './instrumentFetcher.js'; import { instrumentQueueProducer } from './instrumentQueueProducer.js'; import { instrumentR2Bucket } from './instrumentR2.js'; import { instrumentRateLimit } from './instrumentRateLimit.js'; function isProxyable(item) { return isObjectLike(item) || typeof item === "function"; } const instrumentedBindings = /* @__PURE__ */ new WeakMap(); function instrumentEnv(env, options) { if (!env || typeof env !== "object") { return env; } const shouldPropagateRpcTrace = createRpcPropagationResolver(options); return new Proxy(env, { get(target, prop, receiver) { const item = Reflect.get(target, prop, receiver); if (!isProxyable(item)) { return item; } const cached = instrumentedBindings.get(item); if (cached) { return cached; } if (isD1Database(item)) { const instrumented = instrumentD1(item); instrumentedBindings.set(item, instrumented); return instrumented; } if (isQueue(item)) { const bindingName = typeof prop === "string" ? prop : String(prop); const instrumented = instrumentQueueProducer(item, bindingName); instrumentedBindings.set(item, instrumented); return instrumented; } if (isR2Bucket(item)) { const bindingName = typeof prop === "string" ? prop : String(prop); const instrumented = instrumentR2Bucket(item, bindingName); instrumentedBindings.set(item, instrumented); return instrumented; } if (isRateLimit(item)) { const bindingName = typeof prop === "string" ? prop : String(prop); const instrumented = instrumentRateLimit(item, bindingName); instrumentedBindings.set(item, instrumented); return instrumented; } if (isAiBinding(item)) { const instrumented = instrumentWorkersAiClient(item); instrumentedBindings.set(item, instrumented); return instrumented; } const propagateRpcTrace = shouldPropagateRpcTrace(String(prop)); if (isDurableObjectNamespace(item)) { const instrumented = instrumentDurableObjectNamespace(item, propagateRpcTrace); instrumentedBindings.set(item, instrumented); return instrumented; } if (isJSRPC(item)) { const instrumented = new Proxy(item, { get(target2, p) { const value = Reflect.get(target2, p); if (p === "fetch" && typeof value === "function") { return instrumentFetcher((...args) => Reflect.apply(value, target2, args)); } if (propagateRpcTrace && typeof value === "function" && typeof p === "string" && !STUB_NON_RPC_METHODS.has(p)) { return (...args) => Reflect.apply(value, target2, appendRpcMeta(args)); } return value; } }); instrumentedBindings.set(item, instrumented); return instrumented; } return item; } }); } export { instrumentEnv }; //# sourceMappingURL=instrumentEnv.js.map