@uploadista/observability 0.0.18-beta.17 → 0.0.18-beta.2

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/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- let e=require(`effect`),t=require(`@opentelemetry/exporter-metrics-otlp-http`),n=require(`@opentelemetry/exporter-trace-otlp-http`),r=require(`@effect/opentelemetry`),i=require(`@opentelemetry/api`),a=require(`@opentelemetry/sdk-trace-base`);const o=e=>{if(!e||typeof e!=`object`)return`unknown_error`;let t=`code`in e?e.code:void 0,n=`name`in e?e.name:void 0,r=e instanceof Error?e.message.toLowerCase():``;return t===`NetworkError`||t===`ECONNRESET`||t===`ENOTFOUND`||t===`ETIMEDOUT`||r.indexOf(`network`)>=0||r.indexOf(`timeout`)>=0?`network_error`:t===`InvalidAccessKeyId`||t===`SignatureDoesNotMatch`||t===`TokenRefreshRequired`||t===`AuthenticationFailed`||n===`AuthenticationError`||r.indexOf(`authentication`)>=0||r.indexOf(`unauthorized`)>=0?`authentication_error`:t===`AccessDenied`||t===`AccountProblem`||t===`Forbidden`||n===`AuthorizationError`||r.indexOf(`forbidden`)>=0||r.indexOf(`permission`)>=0?`authorization_error`:t===`SlowDown`||t===`RequestTimeTooSkewed`||t===`TooManyRequests`||n===`ThrottlingError`||r.indexOf(`throttl`)>=0||r.indexOf(`rate limit`)>=0?`throttling_error`:t===`InternalError`||t===`ServiceUnavailable`||t===`InternalServerError`||n===`ServerError`||r.indexOf(`server error`)>=0||r.indexOf(`service unavailable`)>=0?`server_error`:t===`InvalidRequest`||t===`MalformedXML`||t===`RequestEntityTooLarge`||t===`BadRequest`||n===`ClientError`||r.indexOf(`bad request`)>=0||r.indexOf(`invalid`)>=0?`client_error`:`unknown_error`},s=(e,t)=>e=>{if(t){let n=t(e);if(n!==null)return n}return o(e)},c=(t,n,r,i,a={},s=o)=>e.Effect.gen(function*(){let o=s(i);yield*n.uploadErrorsTotal.pipe(e.Metric.tagged(`operation`,r),e.Metric.tagged(`error_category`,o))(e.Effect.succeed(1));let c={storage_type:t,operation:r,error_category:o,error_type:typeof i,error_message:i instanceof Error?i.message:String(i),error_code:i&&typeof i==`object`&&`code`in i?i.code:void 0,error_name:i&&typeof i==`object`&&`name`in i?i.name:void 0,...a};yield*e.Effect.logError(`${t.toUpperCase()} ${r} failed`).pipe(e.Effect.annotateLogs(c))}),l=(e,t,n)=>{let r=s(e,n);return(n,i,a={})=>c(e,t,n,i,a,r)};function u(){let e=typeof process<`u`?process.env.OTEL_EXPORTER_OTLP_HEADERS:void 0;if(!e)return;let t={},n=e.split(`,`);for(let e of n){let[n,...r]=e.split(`=`);n&&r.length>0&&(t[n.trim()]=r.join(`=`).trim())}return Object.keys(t).length>0?t:void 0}function d(e,t){if(t)return t;if(typeof process<`u`){let t=e===`traces`?process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:process.env.OTEL_EXPORTER_OTLP_METRICS_ENDPOINT;if(t)return t;if(process.env.OTEL_EXPORTER_OTLP_ENDPOINT)return process.env.OTEL_EXPORTER_OTLP_ENDPOINT}return`http://localhost:4318`}function ee(e={}){let t=d(`traces`,e.endpoint),r=e.headers??u(),i=e.timeoutMillis??3e4;return new n.OTLPTraceExporter({url:`${t}/v1/traces`,headers:r,timeoutMillis:i})}function te(e={}){let n=d(`metrics`,e.endpoint),r=e.headers??u(),i=e.timeoutMillis??3e4;return new t.OTLPMetricExporter({url:`${n}/v1/metrics`,headers:r,timeoutMillis:i})}function f(){if(typeof process<`u`){let e=process.env.UPLOADISTA_OBSERVABILITY_ENABLED;if(e!==void 0)return e.toLowerCase()!==`false`&&e!==`0`}return!0}function p(e=`uploadista`){return typeof process<`u`&&process.env.OTEL_SERVICE_NAME?process.env.OTEL_SERVICE_NAME:e}function ne(){if(typeof process>`u`)return{};let e=process.env.OTEL_RESOURCE_ATTRIBUTES;if(!e)return{};let t={},n=e.split(`,`);for(let e of n){let[n,...r]=e.split(`=`);n&&r.length>0&&(t[n.trim()]=r.join(`=`).trim())}return t}var m=class extends e.Context.Tag(`Observability`)(){},h=class extends e.Context.Tag(`StorageObservability`)(){},g=class extends e.Context.Tag(`UploadObservability`)(){},_=class extends e.Context.Tag(`FlowObservability`)(){};const re=(t,n=!0)=>e.Layer.succeed(m,{serviceName:t,enabled:n}),ie=(t,n,r=!0)=>e.Layer.succeed(h,{serviceName:`uploadista-${t}-store`,storageType:t,metrics:n,enabled:r}),v=(t=!0)=>e.Layer.succeed(g,{serviceName:`uploadista-upload-server`,enabled:t,metrics:{uploadCreated:e.Effect.void,uploadCompleted:e.Effect.void,uploadFailed:e.Effect.void,chunkUploaded:e.Effect.void}}),y=(t=!0)=>e.Layer.succeed(_,{serviceName:`uploadista-flow-engine`,enabled:t,metrics:{flowStarted:e.Effect.void,flowCompleted:e.Effect.void,flowFailed:e.Effect.void,nodeExecuted:e.Effect.void}}),ae=re(`uploadista-disabled`,!1),oe=e=>ie(e,{},!1),se=v(!1),ce=y(!1),le=e.Effect.gen(function*(){let t=yield*e.Effect.serviceOption(m);return e.Option.match(t,{onNone:()=>!1,onSome:e=>e.enabled})}),ue=t=>e.Effect.gen(function*(){if(yield*le){let n=yield*t;return e.Option.some(n)}return e.Option.none()}),b=(t,n)=>e.Effect.log(t).pipe(e.Effect.annotateLogs(n)),x=(e,t,n)=>b(`Upload progress`,{storage_type:e,upload_id:t,uploaded_bytes:n.uploadedBytes,total_bytes:n.totalBytes,progress_percentage:Math.round(n.uploadedBytes/n.totalBytes*100),...n.partNumber&&{part_number:n.partNumber},...n.speed&&{upload_speed_bps:n.speed}}),S=(e,t,n,r)=>b(`${e.toUpperCase()} ${t}`,{storage_type:e,operation:t,upload_id:n,...r}),C=(e,t,n)=>{let r=n.throughputBps?n.throughputBps/(1024*1024):0;return b(`${e.toUpperCase()} upload completed`,{storage_type:e,upload_id:t,file_size_bytes:n.fileSize,file_size_mb:Math.round(n.fileSize/(1024*1024)*100)/100,total_duration_ms:n.totalDurationMs,total_duration_seconds:Math.round(n.totalDurationMs/1e3*100)/100,throughput_bps:n.throughputBps,throughput_mbps:Math.round(r*100)/100,...n.partsCount&&{parts_count:n.partsCount},...n.averagePartSize&&{average_part_size_bytes:n.averagePartSize,average_part_size_mb:Math.round(n.averagePartSize/(1024*1024)*100)/100},...n.retryCount&&{retry_count:n.retryCount}})},w=t=>({uploadRequestsTotal:e.Metric.counter(`${t}_upload_requests_total`,{description:`Total number of upload requests for ${t}`}),uploadPartsTotal:e.Metric.counter(`${t}_upload_parts_total`,{description:`Total number of individual parts uploaded for ${t}`}),uploadSuccessTotal:e.Metric.counter(`${t}_upload_success_total`,{description:`Total number of successful uploads for ${t}`}),uploadErrorsTotal:e.Metric.counter(`${t}_upload_errors_total`,{description:`Total number of upload errors for ${t}`}),apiCallsTotal:e.Metric.counter(`${t}_api_calls_total`,{description:`Total number of API calls for ${t}`})}),de=t=>({uploadDurationHistogram:e.Metric.histogram(`${t}_upload_duration_seconds`,e.MetricBoundaries.exponential({start:.01,factor:2,count:20}),`Duration of upload operations in seconds for ${t}`),partUploadDurationHistogram:e.Metric.histogram(`${t}_part_upload_duration_seconds`,e.MetricBoundaries.exponential({start:.001,factor:2,count:15}),`Duration of individual part uploads in seconds for ${t}`),fileSizeHistogram:e.Metric.histogram(`${t}_file_size_bytes`,e.MetricBoundaries.exponential({start:1024,factor:2,count:25}),`Size of uploaded files in bytes for ${t}`),partSizeHistogram:e.Metric.histogram(`${t}_part_size_bytes`,e.MetricBoundaries.linear({start:5242880,width:1048576,count:20}),`Size of upload parts in bytes for ${t}`)}),T=t=>({activeUploadsGauge:e.Metric.gauge(`${t}_active_uploads`,{description:`Number of currently active uploads for ${t}`}),uploadThroughputGauge:e.Metric.gauge(`${t}_upload_throughput_bytes_per_second`,{description:`Current upload throughput in bytes per second for ${t}`})}),fe=t=>({uploadLatencySummary:e.Metric.summary({name:`${t}_upload_latency_seconds`,maxAge:`10 minutes`,maxSize:1e3,error:.01,quantiles:[.5,.9,.95,.99],description:`Upload latency percentiles for ${t}`})}),E=e=>({...w(e),...de(e),...T(e),...fe(e)}),pe=t=>{let n=E(t),r={serviceName:`test-${t}-store`,storageType:t,metrics:n,enabled:!0};return e.Layer.succeed(h,r)},me=()=>{let t={serviceName:`test-upload-server`,enabled:!0,metrics:{uploadCreated:e.Effect.void,uploadCompleted:e.Effect.void,uploadFailed:e.Effect.void,chunkUploaded:e.Effect.void}};return e.Layer.succeed(g,t)},D=()=>{let t={serviceName:`test-flow-engine`,enabled:!0,metrics:{flowStarted:e.Effect.void,flowCompleted:e.Effect.void,flowFailed:e.Effect.void,nodeExecuted:e.Effect.void}};return e.Layer.succeed(_,t)},he=t=>e.Effect.gen(function*(){let n=yield*t;return yield*e.Metric.snapshot,n}),ge=t=>e.Effect.gen(function*(){yield*e.Metric.snapshot;let n=yield*t;return yield*e.Metric.snapshot,n}),O=(e=`test-storage`)=>({storageObservability:pe(e),uploadObservability:me(),flowObservability:D()}),_e=(t,n=`test-storage`)=>{let r=O(n);return t.pipe(e.Effect.provide(r.storageObservability),e.Effect.provide(r.uploadObservability),e.Effect.provide(r.flowObservability))},k=e.Context.GenericTag(`TracingService`),A=t=>{let n=t?.serviceName??`uploadista-storage`;return e.Layer.succeed(k,{serviceName:n})},j=e=>A({serviceName:`uploadista-${e}-store`}),M=(t,n,r)=>i=>i.pipe(e.Effect.withSpan(`${n}-${t}`,{attributes:{"storage.type":n,operation:t,...r}})),ve=r.WebSdk.layer(()=>({resource:{serviceName:`uploadista-storage`},spanProcessor:new a.BatchSpanProcessor(new a.ConsoleSpanExporter)})),ye=r.NodeSdk.layer(()=>({resource:{serviceName:`uploadista-storage`},spanProcessor:new a.BatchSpanProcessor(new a.ConsoleSpanExporter)})),be=r.WebSdk.layer(()=>({resource:{serviceName:`uploadista-storage-workers`},spanProcessor:new a.BatchSpanProcessor(new a.ConsoleSpanExporter)}));function N(e={}){return new a.BatchSpanProcessor(ee(),{maxQueueSize:e.maxQueueSize??512,maxExportBatchSize:e.maxExportBatchSize??512,scheduledDelayMillis:e.scheduledDelayMillis??5e3,exportTimeoutMillis:e.exportTimeoutMillis??3e4})}function P(e={}){let t=e.serviceName??p(`uploadista`),n=ne(),r=e.resourceAttributes??{};return{serviceName:t,...n,...r}}const xe=r.NodeSdk.layer(()=>f()?{resource:P(),spanProcessor:N()}:{resource:P()});function Se(e={}){return r.NodeSdk.layer(()=>f()?{resource:P(e),spanProcessor:N(e)}:{resource:P(e)})}const Ce=r.WebSdk.layer(()=>f()?{resource:P(),spanProcessor:N()}:{resource:P()});function we(e={}){return r.WebSdk.layer(()=>f()?{resource:P(e),spanProcessor:N(e)}:{resource:P(e)})}const Te=r.WebSdk.layer(()=>{let e={serviceName:p(`uploadista-workers`)};return f()?{resource:P(e),spanProcessor:N(e)}:{resource:P(e)}});function Ee(e={}){return r.WebSdk.layer(()=>{let t={serviceName:p(`uploadista-workers`),...e};return f()?{resource:P(t),spanProcessor:N(t)}:{resource:P(t)}})}function De(){let e=i.trace.getActiveSpan();if(!e)return;let t=e.spanContext();return{traceId:t.traceId,spanId:t.spanId,traceFlags:t.traceFlags}}const Oe=e.Effect.gen(function*(){let t=yield*e.Effect.currentSpan.pipe(e.Effect.option);return e.Option.match(t,{onNone:()=>void 0,onSome:e=>({traceId:e.traceId,spanId:e.spanId,traceFlags:e.sampled?1:0})})});function ke(t){return e.Tracer.externalSpan({traceId:t.traceId,spanId:t.spanId,sampled:t.traceFlags===1})}function Ae(t){return n=>{let r=e.Tracer.externalSpan({traceId:t.traceId,spanId:t.spanId,sampled:t.traceFlags===1});return n.pipe(e.Effect.provideService(e.Tracer.ParentSpan,r))}}function je(){let e=i.trace.getActiveSpan();return e?e.spanContext().traceId!==`00000000000000000000000000000000`:!1}const F=(t,n,r)=>r.pipe(e.Effect.tap(()=>t.uploadRequestsTotal.pipe(e.Metric.tagged(`upload_id`,n))(e.Effect.succeed(1))),e.Effect.tapError(()=>t.uploadErrorsTotal.pipe(e.Metric.tagged(`upload_id`,n))(e.Effect.succeed(1))),e.Effect.tap(()=>t.uploadSuccessTotal.pipe(e.Metric.tagged(`upload_id`,n))(e.Effect.succeed(1)))),I=(t,n,r)=>r.pipe(e.Effect.tap(()=>t.apiCallsTotal.pipe(e.Metric.tagged(`operation`,n))(e.Effect.succeed(1)))),L=(t,n)=>e.Effect.gen(function*(){let r=yield*e.Effect.sync(()=>Date.now()),i=yield*n,a=((yield*e.Effect.sync(()=>Date.now()))-r)/1e3;return yield*t(e.Effect.succeed(a)),i}),R=(t,n,r)=>r.pipe(e.Effect.tap(()=>t.fileSizeHistogram(e.Effect.succeed(n)))),Me=(t,n,r)=>r.pipe(e.Effect.tap(()=>t.partSizeHistogram(e.Effect.succeed(n)))),z=(t,n)=>n.pipe(e.Effect.tap(()=>t.activeUploadsGauge(e.Effect.succeed(1))),e.Effect.ensuring(t.activeUploadsGauge(e.Effect.succeed(-1)))),B=(t,n,r)=>e.Effect.gen(function*(){let i=yield*e.Effect.sync(()=>Date.now()),a=yield*r,o=((yield*e.Effect.sync(()=>Date.now()))-i)/1e3,s=o>0?n/o:0;return yield*t.uploadThroughputGauge(e.Effect.succeed(s)),a}),V=(e,t,n,r,i)=>{let a=r.pipe(n=>I(e,t,n),t=>F(e,n,t),t=>L(e.uploadDurationHistogram,t),t=>z(e,t));return i!==void 0&&(a=a.pipe(t=>R(e,i,t),t=>B(e,i,t))),a},H=()=>({flowStartedTotal:e.Metric.counter(`flow_started_total`,{description:`Total number of flows started`}),flowCompletedTotal:e.Metric.counter(`flow_completed_total`,{description:`Total number of flows completed successfully`}),flowFailedTotal:e.Metric.counter(`flow_failed_total`,{description:`Total number of flows that failed`}),flowPausedTotal:e.Metric.counter(`flow_paused_total`,{description:`Total number of flows that were paused`}),flowResumedTotal:e.Metric.counter(`flow_resumed_total`,{description:`Total number of flows that were resumed`}),nodeExecutedTotal:e.Metric.counter(`node_executed_total`,{description:`Total number of nodes executed`}),nodeSuccessTotal:e.Metric.counter(`node_success_total`,{description:`Total number of nodes executed successfully`}),nodeFailedTotal:e.Metric.counter(`node_failed_total`,{description:`Total number of nodes that failed`}),nodeSkippedTotal:e.Metric.counter(`node_skipped_total`,{description:`Total number of nodes skipped (conditional)`}),flowDurationHistogram:e.Metric.histogram(`flow_duration_seconds`,e.MetricBoundaries.exponential({start:.1,factor:2,count:20}),`Duration of complete flow execution in seconds`),nodeDurationHistogram:e.Metric.histogram(`node_duration_seconds`,e.MetricBoundaries.exponential({start:.01,factor:2,count:18}),`Duration of individual node execution in seconds`),flowNodeCountHistogram:e.Metric.histogram(`flow_node_count`,e.MetricBoundaries.linear({start:1,width:5,count:20}),`Number of nodes in a flow`),parallelNodesHistogram:e.Metric.histogram(`parallel_nodes_count`,e.MetricBoundaries.linear({start:1,width:2,count:15}),`Number of nodes executed in parallel`),activeFlowsGauge:e.Metric.gauge(`active_flows`,{description:`Number of currently active flows`}),activeNodesGauge:e.Metric.gauge(`active_nodes`,{description:`Number of currently executing nodes`}),pausedFlowsGauge:e.Metric.gauge(`paused_flows`,{description:`Number of currently paused flows`}),flowLatencySummary:e.Metric.summary({name:`flow_latency_seconds`,maxAge:`10 minutes`,maxSize:1e3,error:.01,quantiles:[.5,.9,.95,.99],description:`Flow execution latency percentiles`}),nodeLatencySummary:e.Metric.summary({name:`node_latency_seconds`,maxAge:`10 minutes`,maxSize:1e3,error:.01,quantiles:[.5,.9,.95,.99],description:`Node execution latency percentiles`}),circuitBreakerOpenTotal:e.Metric.counter(`circuit_breaker_open_total`,{description:`Total number of times circuit breakers transitioned to open state`}),circuitBreakerCloseTotal:e.Metric.counter(`circuit_breaker_close_total`,{description:`Total number of times circuit breakers transitioned to closed state`}),circuitBreakerRejectedTotal:e.Metric.counter(`circuit_breaker_rejected_total`,{description:`Total number of requests rejected because circuit breaker is open`}),circuitBreakerHalfOpenTotal:e.Metric.counter(`circuit_breaker_half_open_total`,{description:`Total number of times circuit breakers transitioned to half-open state`}),circuitBreakerStateGauge:e.Metric.gauge(`circuit_breaker_state`,{description:`Current circuit breaker state (0=closed, 1=open, 2=half-open)`}),circuitBreakerFailuresGauge:e.Metric.gauge(`circuit_breaker_failures`,{description:`Number of failures currently in the circuit breaker sliding window`})}),Ne=H(),U=e=>{if(!e||typeof e!=`object`)return`unknown_flow_error`;let t=`code`in e?e.code:void 0;if(!t)return`unknown_flow_error`;switch(t){case`FLOW_VALIDATION_ERROR`:case`FLOW_INVALID_INPUT`:case`FLOW_INVALID_OUTPUT`:return`flow_validation_error`;case`FLOW_NODE_NOT_FOUND`:case`FLOW_EDGE_INVALID`:return`node_not_found_error`;case`FLOW_NODE_EXECUTION_FAILED`:case`FLOW_NODE_ERROR`:return`node_execution_error`;case`FLOW_TIMEOUT`:return`flow_timeout_error`;case`FLOW_CANCELLED`:case`ABORTED`:return`flow_cancelled_error`;default:return`unknown_flow_error`}},Pe=t=>{let n=H(),r=U(t);return e.Effect.gen(function*(){yield*e.Metric.increment(n.flowFailedTotal),yield*e.Effect.logError(`Flow execution failed`).pipe(e.Effect.annotateLogs({"error.category":r,"error.message":String(t)}))})},Fe=(t,n,r)=>{let i=H(),a=U(r);return e.Effect.gen(function*(){yield*e.Metric.increment(i.nodeFailedTotal),yield*e.Effect.logError(`Node execution failed`).pipe(e.Effect.annotateLogs({"node.id":t,"node.type":n,"error.category":a,"error.message":String(r)}))})},W=(t=`uploadista-flow-engine`)=>{let n=H();return e.Layer.succeed(_,{serviceName:t,enabled:!0,metrics:{flowStarted:e.Metric.increment(n.flowStartedTotal),flowCompleted:e.Metric.increment(n.flowCompletedTotal),flowFailed:e.Metric.increment(n.flowFailedTotal),nodeExecuted:e.Metric.increment(n.nodeExecutedTotal)}})},Ie=W(),Le=y(!1),Re=e.Effect.gen(function*(){return(yield*_).metrics}),ze=t=>{let n=H();return e.Effect.gen(function*(){let r=Date.now(),i=yield*t,a=(Date.now()-r)/1e3;return yield*e.Metric.update(n.flowDurationHistogram,a),yield*e.Metric.update(n.flowLatencySummary,a),i}).pipe(e.Effect.withSpan(`flow-execution`))},Be=(t,n,r,i)=>{let a=H(),o=i??n;return e.Effect.gen(function*(){let t=Date.now(),n=yield*r,i=(Date.now()-t)/1e3;return yield*e.Metric.update(a.nodeDurationHistogram,i),yield*e.Metric.update(a.nodeLatencySummary,i),n}).pipe(e.Effect.withSpan(`node-${o}`,{attributes:{"node.id":t,"node.type":n,"node.type_id":i??n}}))},Ve=t=>{let n=H();return e.Effect.gen(function*(){return yield*e.Metric.increment(n.activeFlowsGauge),yield*e.Effect.acquireUseRelease(e.Effect.void,()=>t,()=>e.Metric.set(n.activeFlowsGauge,-1))})},He=t=>{let n=H();return e.Effect.gen(function*(){return yield*e.Metric.increment(n.activeNodesGauge),yield*e.Effect.acquireUseRelease(e.Effect.void,()=>t,()=>e.Metric.set(n.activeNodesGauge,-1))})},G=()=>{let t={serviceName:`test-flow-engine`,enabled:!0,metrics:{flowStarted:e.Effect.void,flowCompleted:e.Effect.void,flowFailed:e.Effect.void,nodeExecuted:e.Effect.void}};return e.Layer.succeed(_,t)},Ue=t=>t.pipe(e.Effect.provide(G())),We=(t,n)=>r=>r.pipe(e.Effect.withSpan(`flow-${t}`,{attributes:{"flow.operation":t,...n}})),Ge=t=>e.Effect.annotateCurrentSpan({"flow.id":t.flowId??`unknown`,"flow.name":t.flowName??`unknown`,"flow.job_id":t.jobId??`unknown`,"flow.node_count":t.nodeCount?.toString()??`0`,"flow.storage_id":t.storageId??`unknown`}),Ke=t=>e.Effect.annotateCurrentSpan({"node.id":t.nodeId,"node.type":t.nodeType,"node.name":t.nodeName??`unknown`,"node.flow_id":t.flowId??`unknown`,"node.job_id":t.jobId??`unknown`}),qe=t=>e.Effect.annotateCurrentSpan({"execution.order":t.executionOrder?.join(`,`)??``,"execution.current_index":t.currentIndex?.toString()??`0`,"execution.total_nodes":t.totalNodes?.toString()??`0`,"execution.parallel_count":t.parallelCount?.toString()??`0`}),Je=(t,n,r)=>i=>i.pipe(e.Effect.withSpan(`${t}-${n}`,{attributes:{"operation.domain":t,"operation.name":n,...r}})),Ye=t=>e.Effect.annotateCurrentSpan({"operation.domain":t.domain,"operation.name":t.operation,"operation.input_size":t.inputSize?.toString()??`unknown`,"operation.output_size":t.outputSize?.toString()??`unknown`}),Xe=(t,n,r)=>i=>i.pipe(e.Effect.withSpan(`circuit-breaker-${t}`,{attributes:{"circuit_breaker.node_type":t,"circuit_breaker.state":n,...r}})),Ze=t=>e.Effect.annotateCurrentSpan({"circuit_breaker.node_type":t.nodeType,"circuit_breaker.state":t.state,"circuit_breaker.failure_count":t.failureCount?.toString()??`0`,"circuit_breaker.failure_threshold":t.failureThreshold?.toString()??`5`,"circuit_breaker.reset_timeout":t.resetTimeout?.toString()??`30000`,"circuit_breaker.decision":t.decision??`unknown`}),Qe=t=>e.Effect.annotateCurrentSpan({"circuit_breaker.event":`state_change`,"circuit_breaker.node_type":t.nodeType,"circuit_breaker.previous_state":t.previousState,"circuit_breaker.new_state":t.newState,"circuit_breaker.failure_count":t.failureCount?.toString()??`0`,"circuit_breaker.timestamp":t.timestamp?.toString()??Date.now().toString()});var $e=class extends e.Context.Tag(`MetricsService`)(){};const et=e.Layer.succeed($e,{recordUpload:(t,n)=>e.Effect.void}),K=`azure`,q=E(K),tt=j(K),nt=e=>{if(!e||typeof e!=`object`)return null;let t=`code`in e?e.code:`statusCode`in e?e.statusCode:void 0;if(!t)return null;switch(t){case`BlobNotFound`:case`ContainerNotFound`:case`InvalidBlobOrBlock`:return`client_error`;case`ContainerAlreadyExists`:case`BlobAlreadyExists`:return`client_error`;case`InvalidBlockId`:case`InvalidBlockList`:case`InvalidBlobType`:return`client_error`;case`RequestBodyTooLarge`:case`InvalidHeaderValue`:return`client_error`;case`AuthenticationFailed`:case`InvalidAuthenticationInfo`:return`authentication_error`;case`AccountIsDisabled`:return`authorization_error`;case`InsufficientAccountPermissions`:return`authorization_error`;case`OperationTimedOut`:case`ServerBusy`:case`InternalError`:return`server_error`;default:if(typeof t==`number`){if(t>=500)return`server_error`;if(t===429)return`throttling_error`;if(t===403)return`authorization_error`;if(t===401)return`authentication_error`;if(t>=400)return`client_error`}return null}},rt=l(K,q,nt),it=e.Layer.mergeAll(tt),at=(e,t)=>F(q,e,t),ot=(e,t)=>I(q,e,t),st=L,ct=(e,t,n,r)=>V(q,e,t,n,r),lt=(e,t)=>n=>M(e,K,t)(n),ut=S.bind(null,K),dt=x.bind(null,K),ft=C.bind(null,K),pt=b,{uploadRequestsTotal:mt,uploadPartsTotal:ht,uploadSuccessTotal:gt,uploadErrorsTotal:_t,apiCallsTotal:vt,uploadDurationHistogram:yt,partUploadDurationHistogram:bt,fileSizeHistogram:xt,partSizeHistogram:St,activeUploadsGauge:Ct,uploadThroughputGauge:wt,uploadLatencySummary:Tt}=q,J=`filesystem`,Y=E(J),Et=j(J),Dt=e=>{if(!e||typeof e!=`object`)return null;let t=`code`in e?e.code:void 0;if(!t)return null;switch(t){case`ENOENT`:case`ENOTDIR`:return`client_error`;case`EEXIST`:return`client_error`;case`EISDIR`:return`client_error`;case`EINVAL`:case`ENAMETOOLONG`:return`client_error`;case`EACCES`:case`EPERM`:return`authorization_error`;case`ENOSPC`:case`EDQUOT`:return`server_error`;case`EIO`:case`EROFS`:case`EMFILE`:case`ENFILE`:return`server_error`;case`EBUSY`:return`throttling_error`;default:return null}},Ot=l(J,Y,Dt),kt=e.Layer.mergeAll(Et),At=(e,t)=>F(Y,e,t),jt=(e,t)=>I(Y,e,t),Mt=L,Nt=(e,t,n,r)=>V(Y,e,t,n,r),Pt=(e,t)=>n=>M(e,J,t)(n),Ft=S.bind(null,J),It=x.bind(null,J),Lt=C.bind(null,J),Rt=b,{uploadRequestsTotal:zt,uploadPartsTotal:Bt,uploadSuccessTotal:Vt,uploadErrorsTotal:Ht,apiCallsTotal:Ut,uploadDurationHistogram:Wt,partUploadDurationHistogram:Gt,fileSizeHistogram:Kt,partSizeHistogram:qt,activeUploadsGauge:Jt,uploadThroughputGauge:Yt,uploadLatencySummary:Xt}=Y,Zt=`gcs`,X=E(`gcs`),Qt=j(`gcs`),$t=e=>{if(!e||typeof e!=`object`)return null;let t=`code`in e?e.code:`status`in e?e.status:void 0;if(!t)return null;switch(t){case`NoSuchBucket`:case`NoSuchKey`:case`NoSuchUpload`:return`client_error`;case`BucketAlreadyOwnedByYou`:case`BucketNotEmpty`:return`client_error`;case`InvalidBucketName`:case`InvalidArgument`:case`InvalidPart`:case`InvalidPartOrder`:return`client_error`;case`EntityTooSmall`:case`EntityTooLarge`:return`client_error`;case`MalformedPolicy`:return`client_error`;case`Unauthorized`:case`AuthenticationRequired`:return`authentication_error`;case`Forbidden`:case`AccessDenied`:return`authorization_error`;case`TooManyRequests`:case`RateLimitExceeded`:return`throttling_error`;case`InternalError`:case`ServiceUnavailable`:case`BackendError`:return`server_error`;default:if(typeof t==`number`){if(t>=500)return`server_error`;if(t===429)return`throttling_error`;if(t===403)return`authorization_error`;if(t===401)return`authentication_error`;if(t>=400)return`client_error`}return null}},en=l(`gcs`,X,$t),tn=e.Layer.mergeAll(Qt),nn=(e,t)=>F(X,e,t),rn=(e,t)=>I(X,e,t),an=L,on=(e,t,n,r)=>V(X,e,t,n,r),sn=(e,t)=>n=>M(e,`gcs`,t)(n),cn=S.bind(null,`gcs`),ln=x.bind(null,`gcs`),un=C.bind(null,`gcs`),dn=b,{uploadRequestsTotal:fn,uploadPartsTotal:pn,uploadSuccessTotal:mn,uploadErrorsTotal:hn,apiCallsTotal:gn,uploadDurationHistogram:_n,partUploadDurationHistogram:vn,fileSizeHistogram:yn,partSizeHistogram:bn,activeUploadsGauge:xn,uploadThroughputGauge:Sn,uploadLatencySummary:Cn}=X,wn=`s3`,Z=E(`s3`),Tn=j(`s3`),En=e=>{if(!e||typeof e!=`object`)return null;let t=`code`in e?e.code:void 0;if(!t)return null;switch(t){case`NoSuchKey`:case`NoSuchBucket`:case`NoSuchUpload`:return`client_error`;case`BucketAlreadyExists`:case`BucketNotEmpty`:return`client_error`;case`InvalidBucketName`:case`InvalidPart`:case`InvalidPartOrder`:return`client_error`;case`EntityTooSmall`:case`EntityTooLarge`:return`client_error`;case`ExpiredToken`:case`TokenRefreshRequired`:return`authentication_error`;case`RequestTimeTooSkewed`:case`SlowDown`:return`throttling_error`;default:return null}},Dn=l(`s3`,Z,En),On=e.Layer.mergeAll(Tn),kn=(e,t)=>F(Z,e,t),An=(e,t)=>I(Z,e,t),jn=L,Mn=(e,t,n,r)=>V(Z,e,t,n,r),Nn=(e,t)=>n=>M(e,`s3`,t)(n),Pn=S.bind(null,`s3`),Fn=x.bind(null,`s3`),In=C.bind(null,`s3`),Ln=b,{uploadRequestsTotal:Rn,uploadPartsTotal:zn,uploadSuccessTotal:Bn,uploadErrorsTotal:Vn,apiCallsTotal:Hn,uploadDurationHistogram:Un,partUploadDurationHistogram:Wn,fileSizeHistogram:Gn,partSizeHistogram:Kn,activeUploadsGauge:qn,uploadThroughputGauge:Jn,uploadLatencySummary:Yn}=Z,Q=e=>{if(!e||typeof e!=`object`)return`unknown_error`;let t=`code`in e?e.code:void 0,n=`name`in e?e.name:void 0,r=e instanceof Error?e.message.toLowerCase():``;return t===`ABORTED`||n===`AbortError`||r.includes(`abort`)?`abort_error`:t===`FILE_TOO_LARGE`||t===`LIMIT_FILE_SIZE`||t===`RequestEntityTooLarge`||r.includes(`too large`)||r.includes(`size limit`)||r.includes(`max size`)?`size_limit_error`:t===`INVALID_FILE`||t===`INVALID_METADATA`||t===`VALIDATION_ERROR`||r.includes(`validation`)||r.includes(`invalid`)?`validation_error`:t===`NetworkError`||t===`ECONNRESET`||t===`ENOTFOUND`||t===`ETIMEDOUT`||r.includes(`network`)||r.includes(`timeout`)?`network_error`:t===`UNAUTHORIZED`||t===`AuthenticationFailed`||n===`AuthenticationError`||r.includes(`authentication`)||r.includes(`unauthorized`)?`authentication_error`:t===`FORBIDDEN`||t===`AccessDenied`||n===`AuthorizationError`||r.includes(`forbidden`)||r.includes(`permission`)?`authorization_error`:t===`FILE_WRITE_ERROR`||t===`STORAGE_ERROR`||r.includes(`storage`)||r.includes(`write error`)?`storage_error`:`unknown_error`},Xn=(t,n,r,i={})=>e.Effect.gen(function*(){let a=Q(r);yield*t.uploadFailedTotal.pipe(e.Metric.tagged(`operation`,n),e.Metric.tagged(`error_category`,a))(e.Effect.succeed(1));let o={operation:n,error_category:a,error_type:typeof r,error_message:r instanceof Error?r.message:String(r),error_code:r&&typeof r==`object`&&`code`in r?String(r.code):void 0,error_name:r&&typeof r==`object`&&`name`in r?String(r.name):void 0,...i};yield*e.Effect.logError(`Upload ${n} failed`).pipe(e.Effect.annotateLogs(o))}),Zn=e=>t=>{if(e){let n=e(t);if(n!==null)return n}return Q(t)},$=()=>({uploadCreatedTotal:e.Metric.counter(`upload_created_total`,{description:`Total number of uploads created`}),uploadCompletedTotal:e.Metric.counter(`upload_completed_total`,{description:`Total number of uploads completed successfully`}),uploadFailedTotal:e.Metric.counter(`upload_failed_total`,{description:`Total number of uploads that failed`}),chunkUploadedTotal:e.Metric.counter(`chunk_uploaded_total`,{description:`Total number of chunks uploaded`}),uploadFromUrlTotal:e.Metric.counter(`upload_from_url_total`,{description:`Total number of URL-based uploads`}),uploadFromUrlSuccessTotal:e.Metric.counter(`upload_from_url_success_total`,{description:`Total number of successful URL-based uploads`}),uploadFromUrlFailedTotal:e.Metric.counter(`upload_from_url_failed_total`,{description:`Total number of failed URL-based uploads`}),uploadDurationHistogram:e.Metric.histogram(`upload_duration_seconds`,e.MetricBoundaries.exponential({start:.01,factor:2,count:20}),`Duration of complete upload operations in seconds`),chunkUploadDurationHistogram:e.Metric.histogram(`chunk_upload_duration_seconds`,e.MetricBoundaries.exponential({start:.001,factor:2,count:15}),`Duration of individual chunk uploads in seconds`),uploadFileSizeHistogram:e.Metric.histogram(`upload_file_size_bytes`,e.MetricBoundaries.exponential({start:1024,factor:2,count:25}),`Size of uploaded files in bytes`),chunkSizeHistogram:e.Metric.histogram(`chunk_size_bytes`,e.MetricBoundaries.linear({start:262144,width:262144,count:20}),`Size of uploaded chunks in bytes`),activeUploadsGauge:e.Metric.gauge(`active_uploads`,{description:`Number of currently active uploads`}),uploadThroughputGauge:e.Metric.gauge(`upload_throughput_bytes_per_second`,{description:`Current upload throughput in bytes per second`}),uploadLatencySummary:e.Metric.summary({name:`upload_latency_seconds`,maxAge:`10 minutes`,maxSize:1e3,error:.01,quantiles:[.5,.9,.95,.99],description:`Upload operation latency percentiles`}),chunkLatencySummary:e.Metric.summary({name:`chunk_latency_seconds`,maxAge:`10 minutes`,maxSize:1e3,error:.01,quantiles:[.5,.9,.95,.99],description:`Chunk upload latency percentiles`})}),Qn=$(),$n=(t=`uploadista-upload-server`)=>{let n=$();return e.Layer.succeed(g,{serviceName:t,enabled:!0,metrics:{uploadCreated:e.Effect.succeed(n.uploadCreatedTotal).pipe(e.Effect.flatMap(t=>e.Metric.increment(t))),uploadCompleted:e.Effect.succeed(n.uploadCompletedTotal).pipe(e.Effect.flatMap(t=>e.Metric.increment(t))),uploadFailed:e.Effect.succeed(n.uploadFailedTotal).pipe(e.Effect.flatMap(t=>e.Metric.increment(t))),chunkUploaded:e.Effect.succeed(n.chunkUploadedTotal).pipe(e.Effect.flatMap(t=>e.Metric.increment(t)))}})},er=$n(),tr=v(!1),nr=e.Effect.gen(function*(){return(yield*g).metrics}),rr=t=>{let n=$();return e.Effect.gen(function*(){let r=Date.now(),i=yield*t,a=(Date.now()-r)/1e3;return yield*e.Metric.update(n.uploadDurationHistogram,a),i}).pipe(e.Effect.withSpan(`upload-operation`))},ir=t=>{let n=$();return e.Effect.gen(function*(){let r=Date.now(),i=yield*t,a=(Date.now()-r)/1e3;return yield*e.Metric.update(n.chunkUploadDurationHistogram,a),i}).pipe(e.Effect.withSpan(`chunk-upload`))},ar=e.Layer.succeed(g,{serviceName:`uploadista-upload-server-test`,enabled:!0,metrics:{uploadCreated:()=>Promise.resolve(),uploadCompleted:()=>Promise.resolve(),uploadFailed:()=>Promise.resolve(),chunkUploaded:()=>Promise.resolve()}}),or=()=>$(),sr=()=>{let e=or(),t=[`uploadCreatedTotal`,`uploadCompletedTotal`,`uploadFailedTotal`,`chunkUploadedTotal`,`uploadFromUrlTotal`,`uploadFromUrlSuccessTotal`,`uploadFromUrlFailedTotal`,`uploadDurationHistogram`,`chunkUploadDurationHistogram`,`uploadFileSizeHistogram`,`chunkSizeHistogram`,`activeUploadsGauge`,`uploadThroughputGauge`,`uploadLatencySummary`,`chunkLatencySummary`].filter(t=>!(t in e));if(t.length>0)throw Error(`Missing required metrics: ${t.join(`, `)}`);return!0},cr=(t,n)=>r=>r.pipe(e.Effect.withSpan(`upload-${t}`,{attributes:{"upload.operation":t,...n}})),lr=t=>e.Effect.annotateCurrentSpan({"upload.id":t.uploadId??`unknown`,"upload.file_name":t.fileName??`unknown`,"upload.file_size":t.fileSize?.toString()??`0`,"upload.storage_id":t.storageId??`unknown`,"upload.mime_type":t.mimeType??`unknown`}),ur=t=>e.Effect.annotateCurrentSpan({"chunk.upload_id":t.uploadId,"chunk.size":t.chunkSize.toString(),"chunk.offset":t.offset.toString(),"chunk.total_size":t.totalSize?.toString()??`0`,"chunk.progress":t.totalSize&&t.totalSize>0?(t.offset/t.totalSize*100).toFixed(2):`0`});exports.AzureObservabilityLayer=it,exports.AzureTracingLayer=tt,exports.FilesystemObservabilityLayer=kt,exports.FilesystemTracingLayer=Et,exports.FlowObservability=_,exports.FlowObservabilityDisabled=ce,exports.FlowObservabilityLive=Ie,exports.GCSObservabilityLayer=tn,exports.GCSTracingLayer=Qt,exports.MetricsService=$e,exports.NoOpMetricsServiceLive=et,exports.NodeSdkLive=ye,exports.Observability=m,exports.ObservabilityDisabled=ae,exports.OtlpNodeSdkLive=xe,exports.OtlpWebSdkLive=Ce,exports.OtlpWorkersSdkLive=Te,exports.S3ObservabilityLayer=On,exports.S3TracingLayer=Tn,exports.StorageObservability=h,exports.StorageObservabilityDisabled=oe,exports.TracingService=k,exports.UploadObservability=g,exports.UploadObservabilityDisabled=se,exports.UploadObservabilityLive=er,exports.UploadObservabilityTest=ar,exports.WebSdkLive=ve,exports.WorkersSdkLive=be,exports.annotateCircuitBreakerStateChange=Qe,exports.azureActiveUploadsGauge=Ct,exports.azureApiCallsTotal=vt,exports.azureFileSizeHistogram=xt,exports.azureMetrics=q,exports.azurePartSizeHistogram=St,exports.azurePartUploadDurationHistogram=bt,exports.azureUploadDurationHistogram=yt,exports.azureUploadErrorsTotal=_t,exports.azureUploadLatencySummary=Tt,exports.azureUploadPartsTotal=ht,exports.azureUploadRequestsTotal=mt,exports.azureUploadSuccessTotal=gt,exports.azureUploadThroughputGauge=wt,exports.captureMetrics=he,exports.captureTraceContext=De,exports.captureTraceContextEffect=Oe,exports.classifyFlowError=U,exports.classifyStorageError=o,exports.classifyUploadError=Q,exports.createExternalSpan=ke,exports.createFlowMetrics=H,exports.createOtlpMetricExporter=te,exports.createOtlpNodeSdkLayer=Se,exports.createOtlpTraceExporter=ee,exports.createOtlpWebSdkLayer=we,exports.createOtlpWorkersSdkLayer=Ee,exports.createStorageErrorClassifier=s,exports.createStorageErrorTracker=l,exports.createStorageMetrics=E,exports.createStorageTracingLayer=j,exports.createTestFixture=O,exports.createTracingLayer=A,exports.createUploadErrorClassifier=Zn,exports.createUploadGauges=T,exports.createUploadHistograms=de,exports.createUploadMetrics=w,exports.createUploadServerMetrics=$,exports.createUploadSummaries=fe,exports.filesystemActiveUploadsGauge=Jt,exports.filesystemApiCallsTotal=Ut,exports.filesystemFileSizeHistogram=Kt,exports.filesystemMetrics=Y,exports.filesystemPartSizeHistogram=qt,exports.filesystemPartUploadDurationHistogram=Gt,exports.filesystemUploadDurationHistogram=Wt,exports.filesystemUploadErrorsTotal=Ht,exports.filesystemUploadLatencySummary=Xt,exports.filesystemUploadPartsTotal=Bt,exports.filesystemUploadRequestsTotal=zt,exports.filesystemUploadSuccessTotal=Vt,exports.filesystemUploadThroughputGauge=Yt,exports.flowMetrics=Ne,exports.gcsActiveUploadsGauge=xn,exports.gcsApiCallsTotal=gn,exports.gcsFileSizeHistogram=yn,exports.gcsMetrics=X,exports.gcsPartSizeHistogram=bn,exports.gcsPartUploadDurationHistogram=vn,exports.gcsUploadDurationHistogram=_n,exports.gcsUploadErrorsTotal=hn,exports.gcsUploadLatencySummary=Cn,exports.gcsUploadPartsTotal=pn,exports.gcsUploadRequestsTotal=fn,exports.gcsUploadSuccessTotal=mn,exports.gcsUploadThroughputGauge=Sn,exports.getFlowMetrics=Re,exports.getOtlpEndpoint=d,exports.getServiceName=p,exports.getTestMetrics=or,exports.getUploadMetrics=nr,exports.hasActiveTraceContext=je,exports.isObservabilityEnabled=le,exports.isOtlpExportEnabled=f,exports.logAzureContext=pt,exports.logAzureOperation=ut,exports.logAzureUploadCompletion=ft,exports.logAzureUploadProgress=dt,exports.logFilesystemContext=Rt,exports.logFilesystemOperation=Ft,exports.logFilesystemUploadCompletion=Lt,exports.logFilesystemUploadProgress=It,exports.logGCSContext=dn,exports.logGCSOperation=cn,exports.logGCSUploadCompletion=un,exports.logGCSUploadProgress=ln,exports.logS3Context=Ln,exports.logS3Operation=Pn,exports.logS3UploadCompletion=In,exports.logS3UploadProgress=Fn,exports.logStorageOperation=S,exports.logUploadCompletion=C,exports.logUploadProgress=x,exports.logWithContext=b,exports.makeFlowObservabilityLayer=y,exports.makeFlowObservabilityLive=W,exports.makeObservabilityLayer=re,exports.makeStorageObservabilityLayer=ie,exports.makeTestFlowObservability=D,exports.makeTestFlowObservabilityUtil=G,exports.makeTestStorageObservability=pe,exports.makeTestUploadObservability=me,exports.makeUploadObservabilityLayer=v,exports.makeUploadObservabilityLive=$n,exports.parseOtlpHeaders=u,exports.parseResourceAttributes=ne,exports.runWithTestFlowObservability=Ue,exports.runWithTestObservability=_e,exports.s3ActiveUploadsGauge=qn,exports.s3ApiCallsTotal=Hn,exports.s3FileSizeHistogram=Gn,exports.s3Metrics=Z,exports.s3PartSizeHistogram=Kn,exports.s3PartUploadDurationHistogram=Wn,exports.s3UploadDurationHistogram=Un,exports.s3UploadErrorsTotal=Vn,exports.s3UploadLatencySummary=Yn,exports.s3UploadPartsTotal=zn,exports.s3UploadRequestsTotal=Rn,exports.s3UploadSuccessTotal=Bn,exports.s3UploadThroughputGauge=Jn,exports.trackActiveFlow=Ve,exports.trackActiveNode=He,exports.trackAzureError=rt,exports.trackFileSize=R,exports.trackFilesystemError=Ot,exports.trackFlowError=Pe,exports.trackGCSError=en,exports.trackNodeError=Fe,exports.trackPartSize=Me,exports.trackS3Error=Dn,exports.trackStorageError=c,exports.trackUploadError=Xn,exports.uploadServerMetrics=Qn,exports.validateMetricsExist=sr,exports.whenObservabilityEnabled=ue,exports.withActiveUploadTracking=z,exports.withApiMetrics=I,exports.withAzureApiMetrics=ot,exports.withAzureOperationMetrics=ct,exports.withAzureSpan=lt,exports.withAzureTimingMetrics=st,exports.withAzureUploadMetrics=at,exports.withChunkContext=ur,exports.withChunkDuration=ir,exports.withCircuitBreakerContext=Ze,exports.withCircuitBreakerSpan=Xe,exports.withExecutionContext=qe,exports.withFilesystemApiMetrics=jt,exports.withFilesystemOperationMetrics=Nt,exports.withFilesystemSpan=Pt,exports.withFilesystemTimingMetrics=Mt,exports.withFilesystemUploadMetrics=At,exports.withFlowContext=Ge,exports.withFlowDuration=ze,exports.withFlowSpan=We,exports.withGCSApiMetrics=rn,exports.withGCSOperationMetrics=on,exports.withGCSSpan=sn,exports.withGCSTimingMetrics=an,exports.withGCSUploadMetrics=nn,exports.withMetricTracking=ge,exports.withNodeContext=Ke,exports.withNodeDuration=Be,exports.withOperationContext=Ye,exports.withOperationSpan=Je,exports.withParentContext=Ae,exports.withS3ApiMetrics=An,exports.withS3OperationMetrics=Mn,exports.withS3Span=Nn,exports.withS3TimingMetrics=jn,exports.withS3UploadMetrics=kn,exports.withStorageOperationMetrics=V,exports.withStorageSpan=M,exports.withThroughputTracking=B,exports.withTimingMetrics=L,exports.withUploadContext=lr,exports.withUploadDuration=rr,exports.withUploadMetrics=F,exports.withUploadSpan=cr;
1
+ let e=require(`effect`),t=require(`@effect/opentelemetry`),n=require(`@opentelemetry/sdk-trace-base`);const r=e=>{if(!e||typeof e!=`object`)return`unknown_error`;let t=`code`in e?e.code:void 0,n=`name`in e?e.name:void 0,r=e instanceof Error?e.message.toLowerCase():``;return t===`NetworkError`||t===`ECONNRESET`||t===`ENOTFOUND`||t===`ETIMEDOUT`||r.indexOf(`network`)>=0||r.indexOf(`timeout`)>=0?`network_error`:t===`InvalidAccessKeyId`||t===`SignatureDoesNotMatch`||t===`TokenRefreshRequired`||t===`AuthenticationFailed`||n===`AuthenticationError`||r.indexOf(`authentication`)>=0||r.indexOf(`unauthorized`)>=0?`authentication_error`:t===`AccessDenied`||t===`AccountProblem`||t===`Forbidden`||n===`AuthorizationError`||r.indexOf(`forbidden`)>=0||r.indexOf(`permission`)>=0?`authorization_error`:t===`SlowDown`||t===`RequestTimeTooSkewed`||t===`TooManyRequests`||n===`ThrottlingError`||r.indexOf(`throttl`)>=0||r.indexOf(`rate limit`)>=0?`throttling_error`:t===`InternalError`||t===`ServiceUnavailable`||t===`InternalServerError`||n===`ServerError`||r.indexOf(`server error`)>=0||r.indexOf(`service unavailable`)>=0?`server_error`:t===`InvalidRequest`||t===`MalformedXML`||t===`RequestEntityTooLarge`||t===`BadRequest`||n===`ClientError`||r.indexOf(`bad request`)>=0||r.indexOf(`invalid`)>=0?`client_error`:`unknown_error`},i=(e,t)=>e=>{if(t){let n=t(e);if(n!==null)return n}return r(e)},a=(t,n,i,a,o={},s=r)=>e.Effect.gen(function*(){let r=s(a);yield*n.uploadErrorsTotal.pipe(e.Metric.tagged(`operation`,i),e.Metric.tagged(`error_category`,r))(e.Effect.succeed(1));let c={storage_type:t,operation:i,error_category:r,error_type:typeof a,error_message:a instanceof Error?a.message:String(a),error_code:a&&typeof a==`object`&&`code`in a?a.code:void 0,error_name:a&&typeof a==`object`&&`name`in a?a.name:void 0,...o};yield*e.Effect.logError(`${t.toUpperCase()} ${i} failed`).pipe(e.Effect.annotateLogs(c))}),o=(e,t,n)=>{let r=i(e,n);return(n,i,o={})=>a(e,t,n,i,o,r)};var s=class extends e.Context.Tag(`Observability`)(){},c=class extends e.Context.Tag(`StorageObservability`)(){},l=class extends e.Context.Tag(`UploadObservability`)(){},u=class extends e.Context.Tag(`FlowObservability`)(){};const d=(t,n=!0)=>e.Layer.succeed(s,{serviceName:t,enabled:n}),f=(t,n,r=!0)=>e.Layer.succeed(c,{serviceName:`uploadista-${t}-store`,storageType:t,metrics:n,enabled:r}),p=(t=!0)=>e.Layer.succeed(l,{serviceName:`uploadista-upload-server`,enabled:t,metrics:{uploadCreated:e.Effect.void,uploadCompleted:e.Effect.void,uploadFailed:e.Effect.void,chunkUploaded:e.Effect.void}}),m=(t=!0)=>e.Layer.succeed(u,{serviceName:`uploadista-flow-engine`,enabled:t,metrics:{flowStarted:e.Effect.void,flowCompleted:e.Effect.void,flowFailed:e.Effect.void,nodeExecuted:e.Effect.void}}),ee=d(`uploadista-disabled`,!1),te=e=>f(e,{},!1),ne=p(!1),re=m(!1),h=e.Effect.gen(function*(){let t=yield*e.Effect.serviceOption(s);return e.Option.match(t,{onNone:()=>!1,onSome:e=>e.enabled})}),ie=t=>e.Effect.gen(function*(){if(yield*h){let n=yield*t;return e.Option.some(n)}return e.Option.none()}),g=(t,n)=>e.Effect.log(t).pipe(e.Effect.annotateLogs(n)),_=(e,t,n)=>g(`Upload progress`,{storage_type:e,upload_id:t,uploaded_bytes:n.uploadedBytes,total_bytes:n.totalBytes,progress_percentage:Math.round(n.uploadedBytes/n.totalBytes*100),...n.partNumber&&{part_number:n.partNumber},...n.speed&&{upload_speed_bps:n.speed}}),v=(e,t,n,r)=>g(`${e.toUpperCase()} ${t}`,{storage_type:e,operation:t,upload_id:n,...r}),y=(e,t,n)=>{let r=n.throughputBps?n.throughputBps/(1024*1024):0;return g(`${e.toUpperCase()} upload completed`,{storage_type:e,upload_id:t,file_size_bytes:n.fileSize,file_size_mb:Math.round(n.fileSize/(1024*1024)*100)/100,total_duration_ms:n.totalDurationMs,total_duration_seconds:Math.round(n.totalDurationMs/1e3*100)/100,throughput_bps:n.throughputBps,throughput_mbps:Math.round(r*100)/100,...n.partsCount&&{parts_count:n.partsCount},...n.averagePartSize&&{average_part_size_bytes:n.averagePartSize,average_part_size_mb:Math.round(n.averagePartSize/(1024*1024)*100)/100},...n.retryCount&&{retry_count:n.retryCount}})},ae=t=>({uploadRequestsTotal:e.Metric.counter(`${t}_upload_requests_total`,{description:`Total number of upload requests for ${t}`}),uploadPartsTotal:e.Metric.counter(`${t}_upload_parts_total`,{description:`Total number of individual parts uploaded for ${t}`}),uploadSuccessTotal:e.Metric.counter(`${t}_upload_success_total`,{description:`Total number of successful uploads for ${t}`}),uploadErrorsTotal:e.Metric.counter(`${t}_upload_errors_total`,{description:`Total number of upload errors for ${t}`}),apiCallsTotal:e.Metric.counter(`${t}_api_calls_total`,{description:`Total number of API calls for ${t}`})}),oe=t=>({uploadDurationHistogram:e.Metric.histogram(`${t}_upload_duration_seconds`,e.MetricBoundaries.exponential({start:.01,factor:2,count:20}),`Duration of upload operations in seconds for ${t}`),partUploadDurationHistogram:e.Metric.histogram(`${t}_part_upload_duration_seconds`,e.MetricBoundaries.exponential({start:.001,factor:2,count:15}),`Duration of individual part uploads in seconds for ${t}`),fileSizeHistogram:e.Metric.histogram(`${t}_file_size_bytes`,e.MetricBoundaries.exponential({start:1024,factor:2,count:25}),`Size of uploaded files in bytes for ${t}`),partSizeHistogram:e.Metric.histogram(`${t}_part_size_bytes`,e.MetricBoundaries.linear({start:5242880,width:1048576,count:20}),`Size of upload parts in bytes for ${t}`)}),se=t=>({activeUploadsGauge:e.Metric.gauge(`${t}_active_uploads`,{description:`Number of currently active uploads for ${t}`}),uploadThroughputGauge:e.Metric.gauge(`${t}_upload_throughput_bytes_per_second`,{description:`Current upload throughput in bytes per second for ${t}`})}),b=t=>({uploadLatencySummary:e.Metric.summary({name:`${t}_upload_latency_seconds`,maxAge:`10 minutes`,maxSize:1e3,error:.01,quantiles:[.5,.9,.95,.99],description:`Upload latency percentiles for ${t}`})}),x=e=>({...ae(e),...oe(e),...se(e),...b(e)}),S=t=>{let n=x(t),r={serviceName:`test-${t}-store`,storageType:t,metrics:n,enabled:!0};return e.Layer.succeed(c,r)},C=()=>{let t={serviceName:`test-upload-server`,enabled:!0,metrics:{uploadCreated:e.Effect.void,uploadCompleted:e.Effect.void,uploadFailed:e.Effect.void,chunkUploaded:e.Effect.void}};return e.Layer.succeed(l,t)},w=()=>{let t={serviceName:`test-flow-engine`,enabled:!0,metrics:{flowStarted:e.Effect.void,flowCompleted:e.Effect.void,flowFailed:e.Effect.void,nodeExecuted:e.Effect.void}};return e.Layer.succeed(u,t)},ce=t=>e.Effect.gen(function*(){let n=yield*t;return yield*e.Metric.snapshot,n}),le=t=>e.Effect.gen(function*(){yield*e.Metric.snapshot;let n=yield*t;return yield*e.Metric.snapshot,n}),T=(e=`test-storage`)=>({storageObservability:S(e),uploadObservability:C(),flowObservability:w()}),ue=(t,n=`test-storage`)=>{let r=T(n);return t.pipe(e.Effect.provide(r.storageObservability),e.Effect.provide(r.uploadObservability),e.Effect.provide(r.flowObservability))},E=e.Context.GenericTag(`TracingService`),D=t=>{let n=t?.serviceName??`uploadista-storage`;return e.Layer.succeed(E,{serviceName:n})},O=e=>D({serviceName:`uploadista-${e}-store`}),k=(t,n,r)=>i=>i.pipe(e.Effect.withSpan(`${n}-${t}`,{attributes:{"storage.type":n,operation:t,...r}})),de=t.WebSdk.layer(()=>({resource:{serviceName:`uploadista-storage`},spanProcessor:new n.BatchSpanProcessor(new n.ConsoleSpanExporter)})),fe=t.NodeSdk.layer(()=>({resource:{serviceName:`uploadista-storage`},spanProcessor:new n.BatchSpanProcessor(new n.ConsoleSpanExporter)})),pe=t.WebSdk.layer(()=>({resource:{serviceName:`uploadista-storage-workers`},spanProcessor:new n.BatchSpanProcessor(new n.ConsoleSpanExporter)})),A=(t,n,r)=>r.pipe(e.Effect.tap(()=>t.uploadRequestsTotal.pipe(e.Metric.tagged(`upload_id`,n))(e.Effect.succeed(1))),e.Effect.tapError(()=>t.uploadErrorsTotal.pipe(e.Metric.tagged(`upload_id`,n))(e.Effect.succeed(1))),e.Effect.tap(()=>t.uploadSuccessTotal.pipe(e.Metric.tagged(`upload_id`,n))(e.Effect.succeed(1)))),j=(t,n,r)=>r.pipe(e.Effect.tap(()=>t.apiCallsTotal.pipe(e.Metric.tagged(`operation`,n))(e.Effect.succeed(1)))),M=(t,n)=>e.Effect.gen(function*(){let r=yield*e.Effect.sync(()=>Date.now()),i=yield*n,a=((yield*e.Effect.sync(()=>Date.now()))-r)/1e3;return yield*t(e.Effect.succeed(a)),i}),N=(t,n,r)=>r.pipe(e.Effect.tap(()=>t.fileSizeHistogram(e.Effect.succeed(n)))),me=(t,n,r)=>r.pipe(e.Effect.tap(()=>t.partSizeHistogram(e.Effect.succeed(n)))),P=(t,n)=>n.pipe(e.Effect.tap(()=>t.activeUploadsGauge(e.Effect.succeed(1))),e.Effect.ensuring(t.activeUploadsGauge(e.Effect.succeed(-1)))),F=(t,n,r)=>e.Effect.gen(function*(){let i=yield*e.Effect.sync(()=>Date.now()),a=yield*r,o=((yield*e.Effect.sync(()=>Date.now()))-i)/1e3,s=o>0?n/o:0;return yield*t.uploadThroughputGauge(e.Effect.succeed(s)),a}),I=(e,t,n,r,i)=>{let a=r.pipe(n=>j(e,t,n),t=>A(e,n,t),t=>M(e.uploadDurationHistogram,t),t=>P(e,t));return i!==void 0&&(a=a.pipe(t=>N(e,i,t),t=>F(e,i,t))),a},L=()=>({flowStartedTotal:e.Metric.counter(`flow_started_total`,{description:`Total number of flows started`}),flowCompletedTotal:e.Metric.counter(`flow_completed_total`,{description:`Total number of flows completed successfully`}),flowFailedTotal:e.Metric.counter(`flow_failed_total`,{description:`Total number of flows that failed`}),flowPausedTotal:e.Metric.counter(`flow_paused_total`,{description:`Total number of flows that were paused`}),flowResumedTotal:e.Metric.counter(`flow_resumed_total`,{description:`Total number of flows that were resumed`}),nodeExecutedTotal:e.Metric.counter(`node_executed_total`,{description:`Total number of nodes executed`}),nodeSuccessTotal:e.Metric.counter(`node_success_total`,{description:`Total number of nodes executed successfully`}),nodeFailedTotal:e.Metric.counter(`node_failed_total`,{description:`Total number of nodes that failed`}),nodeSkippedTotal:e.Metric.counter(`node_skipped_total`,{description:`Total number of nodes skipped (conditional)`}),flowDurationHistogram:e.Metric.histogram(`flow_duration_seconds`,e.MetricBoundaries.exponential({start:.1,factor:2,count:20}),`Duration of complete flow execution in seconds`),nodeDurationHistogram:e.Metric.histogram(`node_duration_seconds`,e.MetricBoundaries.exponential({start:.01,factor:2,count:18}),`Duration of individual node execution in seconds`),flowNodeCountHistogram:e.Metric.histogram(`flow_node_count`,e.MetricBoundaries.linear({start:1,width:5,count:20}),`Number of nodes in a flow`),parallelNodesHistogram:e.Metric.histogram(`parallel_nodes_count`,e.MetricBoundaries.linear({start:1,width:2,count:15}),`Number of nodes executed in parallel`),activeFlowsGauge:e.Metric.gauge(`active_flows`,{description:`Number of currently active flows`}),activeNodesGauge:e.Metric.gauge(`active_nodes`,{description:`Number of currently executing nodes`}),pausedFlowsGauge:e.Metric.gauge(`paused_flows`,{description:`Number of currently paused flows`}),flowLatencySummary:e.Metric.summary({name:`flow_latency_seconds`,maxAge:`10 minutes`,maxSize:1e3,error:.01,quantiles:[.5,.9,.95,.99],description:`Flow execution latency percentiles`}),nodeLatencySummary:e.Metric.summary({name:`node_latency_seconds`,maxAge:`10 minutes`,maxSize:1e3,error:.01,quantiles:[.5,.9,.95,.99],description:`Node execution latency percentiles`})}),he=L(),R=e=>{if(!e||typeof e!=`object`)return`unknown_flow_error`;let t=`code`in e?e.code:void 0;if(!t)return`unknown_flow_error`;switch(t){case`FLOW_VALIDATION_ERROR`:case`FLOW_INVALID_INPUT`:case`FLOW_INVALID_OUTPUT`:return`flow_validation_error`;case`FLOW_NODE_NOT_FOUND`:case`FLOW_EDGE_INVALID`:return`node_not_found_error`;case`FLOW_NODE_EXECUTION_FAILED`:case`FLOW_NODE_ERROR`:return`node_execution_error`;case`FLOW_TIMEOUT`:return`flow_timeout_error`;case`FLOW_CANCELLED`:case`ABORTED`:return`flow_cancelled_error`;default:return`unknown_flow_error`}},ge=t=>{let n=L(),r=R(t);return e.Effect.gen(function*(){yield*e.Metric.increment(n.flowFailedTotal),yield*e.Effect.logError(`Flow execution failed`).pipe(e.Effect.annotateLogs({"error.category":r,"error.message":String(t)}))})},_e=(t,n,r)=>{let i=L(),a=R(r);return e.Effect.gen(function*(){yield*e.Metric.increment(i.nodeFailedTotal),yield*e.Effect.logError(`Node execution failed`).pipe(e.Effect.annotateLogs({"node.id":t,"node.type":n,"error.category":a,"error.message":String(r)}))})},z=(t=`uploadista-flow-engine`)=>{let n=L();return e.Layer.succeed(u,{serviceName:t,enabled:!0,metrics:{flowStarted:e.Metric.increment(n.flowStartedTotal),flowCompleted:e.Metric.increment(n.flowCompletedTotal),flowFailed:e.Metric.increment(n.flowFailedTotal),nodeExecuted:e.Metric.increment(n.nodeExecutedTotal)}})},ve=z(),ye=m(!1),be=e.Effect.gen(function*(){return(yield*u).metrics}),xe=t=>{let n=L();return e.Effect.gen(function*(){let r=Date.now(),i=yield*t,a=(Date.now()-r)/1e3;return yield*e.Metric.update(n.flowDurationHistogram,a),yield*e.Metric.update(n.flowLatencySummary,a),i}).pipe(e.Effect.withSpan(`flow-execution`))},Se=(t,n,r)=>{let i=L();return e.Effect.gen(function*(){let t=Date.now(),n=yield*r,a=(Date.now()-t)/1e3;return yield*e.Metric.update(i.nodeDurationHistogram,a),yield*e.Metric.update(i.nodeLatencySummary,a),n}).pipe(e.Effect.withSpan(`node-${n}`,{attributes:{"node.id":t,"node.type":n}}))},Ce=t=>{let n=L();return e.Effect.gen(function*(){return yield*e.Metric.increment(n.activeFlowsGauge),yield*e.Effect.acquireUseRelease(e.Effect.void,()=>t,()=>e.Metric.set(n.activeFlowsGauge,-1))})},we=t=>{let n=L();return e.Effect.gen(function*(){return yield*e.Metric.increment(n.activeNodesGauge),yield*e.Effect.acquireUseRelease(e.Effect.void,()=>t,()=>e.Metric.set(n.activeNodesGauge,-1))})},B=()=>{let t={serviceName:`test-flow-engine`,enabled:!0,metrics:{flowStarted:e.Effect.void,flowCompleted:e.Effect.void,flowFailed:e.Effect.void,nodeExecuted:e.Effect.void}};return e.Layer.succeed(u,t)},Te=t=>t.pipe(e.Effect.provide(B())),Ee=(t,n)=>r=>r.pipe(e.Effect.withSpan(`flow-${t}`,{attributes:{"flow.operation":t,...n}})),De=t=>e.Effect.annotateCurrentSpan({"flow.id":t.flowId??`unknown`,"flow.name":t.flowName??`unknown`,"flow.job_id":t.jobId??`unknown`,"flow.node_count":t.nodeCount?.toString()??`0`,"flow.storage_id":t.storageId??`unknown`}),Oe=t=>e.Effect.annotateCurrentSpan({"node.id":t.nodeId,"node.type":t.nodeType,"node.name":t.nodeName??`unknown`,"node.flow_id":t.flowId??`unknown`,"node.job_id":t.jobId??`unknown`}),ke=t=>e.Effect.annotateCurrentSpan({"execution.order":t.executionOrder?.join(`,`)??``,"execution.current_index":t.currentIndex?.toString()??`0`,"execution.total_nodes":t.totalNodes?.toString()??`0`,"execution.parallel_count":t.parallelCount?.toString()??`0`});var V=class extends e.Context.Tag(`MetricsService`)(){};const Ae=e.Layer.succeed(V,{recordUpload:(t,n)=>e.Effect.void}),H=`azure`,U=x(H),W=O(H),je=e=>{if(!e||typeof e!=`object`)return null;let t=`code`in e?e.code:`statusCode`in e?e.statusCode:void 0;if(!t)return null;switch(t){case`BlobNotFound`:case`ContainerNotFound`:case`InvalidBlobOrBlock`:return`client_error`;case`ContainerAlreadyExists`:case`BlobAlreadyExists`:return`client_error`;case`InvalidBlockId`:case`InvalidBlockList`:case`InvalidBlobType`:return`client_error`;case`RequestBodyTooLarge`:case`InvalidHeaderValue`:return`client_error`;case`AuthenticationFailed`:case`InvalidAuthenticationInfo`:return`authentication_error`;case`AccountIsDisabled`:return`authorization_error`;case`InsufficientAccountPermissions`:return`authorization_error`;case`OperationTimedOut`:case`ServerBusy`:case`InternalError`:return`server_error`;default:if(typeof t==`number`){if(t>=500)return`server_error`;if(t===429)return`throttling_error`;if(t===403)return`authorization_error`;if(t===401)return`authentication_error`;if(t>=400)return`client_error`}return null}},Me=o(H,U,je),Ne=e.Layer.mergeAll(W),Pe=(e,t)=>A(U,e,t),Fe=(e,t)=>j(U,e,t),Ie=M,Le=(e,t,n,r)=>I(U,e,t,n,r),Re=(e,t)=>n=>k(e,H,t)(n),ze=v.bind(null,H),Be=_.bind(null,H),Ve=y.bind(null,H),He=g,{uploadRequestsTotal:Ue,uploadPartsTotal:We,uploadSuccessTotal:Ge,uploadErrorsTotal:Ke,apiCallsTotal:qe,uploadDurationHistogram:Je,partUploadDurationHistogram:Ye,fileSizeHistogram:Xe,partSizeHistogram:Ze,activeUploadsGauge:Qe,uploadThroughputGauge:$e,uploadLatencySummary:et}=U,G=`filesystem`,K=x(G),q=O(G),tt=e=>{if(!e||typeof e!=`object`)return null;let t=`code`in e?e.code:void 0;if(!t)return null;switch(t){case`ENOENT`:case`ENOTDIR`:return`client_error`;case`EEXIST`:return`client_error`;case`EISDIR`:return`client_error`;case`EINVAL`:case`ENAMETOOLONG`:return`client_error`;case`EACCES`:case`EPERM`:return`authorization_error`;case`ENOSPC`:case`EDQUOT`:return`server_error`;case`EIO`:case`EROFS`:case`EMFILE`:case`ENFILE`:return`server_error`;case`EBUSY`:return`throttling_error`;default:return null}},nt=o(G,K,tt),rt=e.Layer.mergeAll(q),it=(e,t)=>A(K,e,t),at=(e,t)=>j(K,e,t),ot=M,st=(e,t,n,r)=>I(K,e,t,n,r),ct=(e,t)=>n=>k(e,G,t)(n),lt=v.bind(null,G),ut=_.bind(null,G),dt=y.bind(null,G),ft=g,{uploadRequestsTotal:pt,uploadPartsTotal:mt,uploadSuccessTotal:ht,uploadErrorsTotal:gt,apiCallsTotal:_t,uploadDurationHistogram:vt,partUploadDurationHistogram:yt,fileSizeHistogram:bt,partSizeHistogram:xt,activeUploadsGauge:St,uploadThroughputGauge:Ct,uploadLatencySummary:wt}=K,Tt=`gcs`,J=x(`gcs`),Y=O(`gcs`),Et=e=>{if(!e||typeof e!=`object`)return null;let t=`code`in e?e.code:`status`in e?e.status:void 0;if(!t)return null;switch(t){case`NoSuchBucket`:case`NoSuchKey`:case`NoSuchUpload`:return`client_error`;case`BucketAlreadyOwnedByYou`:case`BucketNotEmpty`:return`client_error`;case`InvalidBucketName`:case`InvalidArgument`:case`InvalidPart`:case`InvalidPartOrder`:return`client_error`;case`EntityTooSmall`:case`EntityTooLarge`:return`client_error`;case`MalformedPolicy`:return`client_error`;case`Unauthorized`:case`AuthenticationRequired`:return`authentication_error`;case`Forbidden`:case`AccessDenied`:return`authorization_error`;case`TooManyRequests`:case`RateLimitExceeded`:return`throttling_error`;case`InternalError`:case`ServiceUnavailable`:case`BackendError`:return`server_error`;default:if(typeof t==`number`){if(t>=500)return`server_error`;if(t===429)return`throttling_error`;if(t===403)return`authorization_error`;if(t===401)return`authentication_error`;if(t>=400)return`client_error`}return null}},Dt=o(`gcs`,J,Et),Ot=e.Layer.mergeAll(Y),kt=(e,t)=>A(J,e,t),At=(e,t)=>j(J,e,t),jt=M,Mt=(e,t,n,r)=>I(J,e,t,n,r),Nt=(e,t)=>n=>k(e,`gcs`,t)(n),Pt=v.bind(null,`gcs`),Ft=_.bind(null,`gcs`),It=y.bind(null,`gcs`),Lt=g,{uploadRequestsTotal:Rt,uploadPartsTotal:zt,uploadSuccessTotal:Bt,uploadErrorsTotal:Vt,apiCallsTotal:Ht,uploadDurationHistogram:Ut,partUploadDurationHistogram:Wt,fileSizeHistogram:Gt,partSizeHistogram:Kt,activeUploadsGauge:qt,uploadThroughputGauge:Jt,uploadLatencySummary:Yt}=J,Xt=`s3`,X=x(`s3`),Z=O(`s3`),Zt=e=>{if(!e||typeof e!=`object`)return null;let t=`code`in e?e.code:void 0;if(!t)return null;switch(t){case`NoSuchKey`:case`NoSuchBucket`:case`NoSuchUpload`:return`client_error`;case`BucketAlreadyExists`:case`BucketNotEmpty`:return`client_error`;case`InvalidBucketName`:case`InvalidPart`:case`InvalidPartOrder`:return`client_error`;case`EntityTooSmall`:case`EntityTooLarge`:return`client_error`;case`ExpiredToken`:case`TokenRefreshRequired`:return`authentication_error`;case`RequestTimeTooSkewed`:case`SlowDown`:return`throttling_error`;default:return null}},Qt=o(`s3`,X,Zt),$t=e.Layer.mergeAll(Z),en=(e,t)=>A(X,e,t),tn=(e,t)=>j(X,e,t),nn=M,rn=(e,t,n,r)=>I(X,e,t,n,r),an=(e,t)=>n=>k(e,`s3`,t)(n),on=v.bind(null,`s3`),sn=_.bind(null,`s3`),cn=y.bind(null,`s3`),ln=g,{uploadRequestsTotal:un,uploadPartsTotal:dn,uploadSuccessTotal:fn,uploadErrorsTotal:pn,apiCallsTotal:mn,uploadDurationHistogram:hn,partUploadDurationHistogram:gn,fileSizeHistogram:_n,partSizeHistogram:vn,activeUploadsGauge:yn,uploadThroughputGauge:bn,uploadLatencySummary:xn}=X,Q=e=>{if(!e||typeof e!=`object`)return`unknown_error`;let t=`code`in e?e.code:void 0,n=`name`in e?e.name:void 0,r=e instanceof Error?e.message.toLowerCase():``;return t===`ABORTED`||n===`AbortError`||r.includes(`abort`)?`abort_error`:t===`FILE_TOO_LARGE`||t===`LIMIT_FILE_SIZE`||t===`RequestEntityTooLarge`||r.includes(`too large`)||r.includes(`size limit`)||r.includes(`max size`)?`size_limit_error`:t===`INVALID_FILE`||t===`INVALID_METADATA`||t===`VALIDATION_ERROR`||r.includes(`validation`)||r.includes(`invalid`)?`validation_error`:t===`NetworkError`||t===`ECONNRESET`||t===`ENOTFOUND`||t===`ETIMEDOUT`||r.includes(`network`)||r.includes(`timeout`)?`network_error`:t===`UNAUTHORIZED`||t===`AuthenticationFailed`||n===`AuthenticationError`||r.includes(`authentication`)||r.includes(`unauthorized`)?`authentication_error`:t===`FORBIDDEN`||t===`AccessDenied`||n===`AuthorizationError`||r.includes(`forbidden`)||r.includes(`permission`)?`authorization_error`:t===`FILE_WRITE_ERROR`||t===`STORAGE_ERROR`||r.includes(`storage`)||r.includes(`write error`)?`storage_error`:`unknown_error`},Sn=(t,n,r,i={})=>e.Effect.gen(function*(){let a=Q(r);yield*t.uploadFailedTotal.pipe(e.Metric.tagged(`operation`,n),e.Metric.tagged(`error_category`,a))(e.Effect.succeed(1));let o={operation:n,error_category:a,error_type:typeof r,error_message:r instanceof Error?r.message:String(r),error_code:r&&typeof r==`object`&&`code`in r?String(r.code):void 0,error_name:r&&typeof r==`object`&&`name`in r?String(r.name):void 0,...i};yield*e.Effect.logError(`Upload ${n} failed`).pipe(e.Effect.annotateLogs(o))}),Cn=e=>t=>{if(e){let n=e(t);if(n!==null)return n}return Q(t)},$=()=>({uploadCreatedTotal:e.Metric.counter(`upload_created_total`,{description:`Total number of uploads created`}),uploadCompletedTotal:e.Metric.counter(`upload_completed_total`,{description:`Total number of uploads completed successfully`}),uploadFailedTotal:e.Metric.counter(`upload_failed_total`,{description:`Total number of uploads that failed`}),chunkUploadedTotal:e.Metric.counter(`chunk_uploaded_total`,{description:`Total number of chunks uploaded`}),uploadFromUrlTotal:e.Metric.counter(`upload_from_url_total`,{description:`Total number of URL-based uploads`}),uploadFromUrlSuccessTotal:e.Metric.counter(`upload_from_url_success_total`,{description:`Total number of successful URL-based uploads`}),uploadFromUrlFailedTotal:e.Metric.counter(`upload_from_url_failed_total`,{description:`Total number of failed URL-based uploads`}),uploadDurationHistogram:e.Metric.histogram(`upload_duration_seconds`,e.MetricBoundaries.exponential({start:.01,factor:2,count:20}),`Duration of complete upload operations in seconds`),chunkUploadDurationHistogram:e.Metric.histogram(`chunk_upload_duration_seconds`,e.MetricBoundaries.exponential({start:.001,factor:2,count:15}),`Duration of individual chunk uploads in seconds`),uploadFileSizeHistogram:e.Metric.histogram(`upload_file_size_bytes`,e.MetricBoundaries.exponential({start:1024,factor:2,count:25}),`Size of uploaded files in bytes`),chunkSizeHistogram:e.Metric.histogram(`chunk_size_bytes`,e.MetricBoundaries.linear({start:262144,width:262144,count:20}),`Size of uploaded chunks in bytes`),activeUploadsGauge:e.Metric.gauge(`active_uploads`,{description:`Number of currently active uploads`}),uploadThroughputGauge:e.Metric.gauge(`upload_throughput_bytes_per_second`,{description:`Current upload throughput in bytes per second`}),uploadLatencySummary:e.Metric.summary({name:`upload_latency_seconds`,maxAge:`10 minutes`,maxSize:1e3,error:.01,quantiles:[.5,.9,.95,.99],description:`Upload operation latency percentiles`}),chunkLatencySummary:e.Metric.summary({name:`chunk_latency_seconds`,maxAge:`10 minutes`,maxSize:1e3,error:.01,quantiles:[.5,.9,.95,.99],description:`Chunk upload latency percentiles`})}),wn=$(),Tn=(t=`uploadista-upload-server`)=>{let n=$();return e.Layer.succeed(l,{serviceName:t,enabled:!0,metrics:{uploadCreated:e.Effect.succeed(n.uploadCreatedTotal).pipe(e.Effect.flatMap(t=>e.Metric.increment(t))),uploadCompleted:e.Effect.succeed(n.uploadCompletedTotal).pipe(e.Effect.flatMap(t=>e.Metric.increment(t))),uploadFailed:e.Effect.succeed(n.uploadFailedTotal).pipe(e.Effect.flatMap(t=>e.Metric.increment(t))),chunkUploaded:e.Effect.succeed(n.chunkUploadedTotal).pipe(e.Effect.flatMap(t=>e.Metric.increment(t)))}})},En=Tn(),Dn=p(!1),On=e.Effect.gen(function*(){return(yield*l).metrics}),kn=t=>{let n=$();return e.Effect.gen(function*(){let r=Date.now(),i=yield*t,a=(Date.now()-r)/1e3;return yield*e.Metric.update(n.uploadDurationHistogram,a),i}).pipe(e.Effect.withSpan(`upload-operation`))},An=t=>{let n=$();return e.Effect.gen(function*(){let r=Date.now(),i=yield*t,a=(Date.now()-r)/1e3;return yield*e.Metric.update(n.chunkUploadDurationHistogram,a),i}).pipe(e.Effect.withSpan(`chunk-upload`))},jn=e.Layer.succeed(l,{serviceName:`uploadista-upload-server-test`,enabled:!0,metrics:{uploadCreated:()=>Promise.resolve(),uploadCompleted:()=>Promise.resolve(),uploadFailed:()=>Promise.resolve(),chunkUploaded:()=>Promise.resolve()}}),Mn=()=>$(),Nn=()=>{let e=Mn(),t=[`uploadCreatedTotal`,`uploadCompletedTotal`,`uploadFailedTotal`,`chunkUploadedTotal`,`uploadFromUrlTotal`,`uploadFromUrlSuccessTotal`,`uploadFromUrlFailedTotal`,`uploadDurationHistogram`,`chunkUploadDurationHistogram`,`uploadFileSizeHistogram`,`chunkSizeHistogram`,`activeUploadsGauge`,`uploadThroughputGauge`,`uploadLatencySummary`,`chunkLatencySummary`].filter(t=>!(t in e));if(t.length>0)throw Error(`Missing required metrics: ${t.join(`, `)}`);return!0},Pn=(t,n)=>r=>r.pipe(e.Effect.withSpan(`upload-${t}`,{attributes:{"upload.operation":t,...n}})),Fn=t=>e.Effect.annotateCurrentSpan({"upload.id":t.uploadId??`unknown`,"upload.file_name":t.fileName??`unknown`,"upload.file_size":t.fileSize?.toString()??`0`,"upload.storage_id":t.storageId??`unknown`,"upload.mime_type":t.mimeType??`unknown`}),In=t=>e.Effect.annotateCurrentSpan({"chunk.upload_id":t.uploadId,"chunk.size":t.chunkSize.toString(),"chunk.offset":t.offset.toString(),"chunk.total_size":t.totalSize?.toString()??`0`,"chunk.progress":t.totalSize&&t.totalSize>0?(t.offset/t.totalSize*100).toFixed(2):`0`});exports.AzureObservabilityLayer=Ne,exports.AzureTracingLayer=W,exports.FilesystemObservabilityLayer=rt,exports.FilesystemTracingLayer=q,exports.FlowObservability=u,exports.FlowObservabilityDisabled=re,exports.FlowObservabilityLive=ve,exports.GCSObservabilityLayer=Ot,exports.GCSTracingLayer=Y,exports.MetricsService=V,exports.NoOpMetricsServiceLive=Ae,exports.NodeSdkLive=fe,exports.Observability=s,exports.ObservabilityDisabled=ee,exports.S3ObservabilityLayer=$t,exports.S3TracingLayer=Z,exports.StorageObservability=c,exports.StorageObservabilityDisabled=te,exports.TracingService=E,exports.UploadObservability=l,exports.UploadObservabilityDisabled=ne,exports.UploadObservabilityLive=En,exports.UploadObservabilityTest=jn,exports.WebSdkLive=de,exports.WorkersSdkLive=pe,exports.azureActiveUploadsGauge=Qe,exports.azureApiCallsTotal=qe,exports.azureFileSizeHistogram=Xe,exports.azureMetrics=U,exports.azurePartSizeHistogram=Ze,exports.azurePartUploadDurationHistogram=Ye,exports.azureUploadDurationHistogram=Je,exports.azureUploadErrorsTotal=Ke,exports.azureUploadLatencySummary=et,exports.azureUploadPartsTotal=We,exports.azureUploadRequestsTotal=Ue,exports.azureUploadSuccessTotal=Ge,exports.azureUploadThroughputGauge=$e,exports.captureMetrics=ce,exports.classifyFlowError=R,exports.classifyStorageError=r,exports.classifyUploadError=Q,exports.createFlowMetrics=L,exports.createStorageErrorClassifier=i,exports.createStorageErrorTracker=o,exports.createStorageMetrics=x,exports.createStorageTracingLayer=O,exports.createTestFixture=T,exports.createTracingLayer=D,exports.createUploadErrorClassifier=Cn,exports.createUploadGauges=se,exports.createUploadHistograms=oe,exports.createUploadMetrics=ae,exports.createUploadServerMetrics=$,exports.createUploadSummaries=b,exports.filesystemActiveUploadsGauge=St,exports.filesystemApiCallsTotal=_t,exports.filesystemFileSizeHistogram=bt,exports.filesystemMetrics=K,exports.filesystemPartSizeHistogram=xt,exports.filesystemPartUploadDurationHistogram=yt,exports.filesystemUploadDurationHistogram=vt,exports.filesystemUploadErrorsTotal=gt,exports.filesystemUploadLatencySummary=wt,exports.filesystemUploadPartsTotal=mt,exports.filesystemUploadRequestsTotal=pt,exports.filesystemUploadSuccessTotal=ht,exports.filesystemUploadThroughputGauge=Ct,exports.flowMetrics=he,exports.gcsActiveUploadsGauge=qt,exports.gcsApiCallsTotal=Ht,exports.gcsFileSizeHistogram=Gt,exports.gcsMetrics=J,exports.gcsPartSizeHistogram=Kt,exports.gcsPartUploadDurationHistogram=Wt,exports.gcsUploadDurationHistogram=Ut,exports.gcsUploadErrorsTotal=Vt,exports.gcsUploadLatencySummary=Yt,exports.gcsUploadPartsTotal=zt,exports.gcsUploadRequestsTotal=Rt,exports.gcsUploadSuccessTotal=Bt,exports.gcsUploadThroughputGauge=Jt,exports.getFlowMetrics=be,exports.getTestMetrics=Mn,exports.getUploadMetrics=On,exports.isObservabilityEnabled=h,exports.logAzureContext=He,exports.logAzureOperation=ze,exports.logAzureUploadCompletion=Ve,exports.logAzureUploadProgress=Be,exports.logFilesystemContext=ft,exports.logFilesystemOperation=lt,exports.logFilesystemUploadCompletion=dt,exports.logFilesystemUploadProgress=ut,exports.logGCSContext=Lt,exports.logGCSOperation=Pt,exports.logGCSUploadCompletion=It,exports.logGCSUploadProgress=Ft,exports.logS3Context=ln,exports.logS3Operation=on,exports.logS3UploadCompletion=cn,exports.logS3UploadProgress=sn,exports.logStorageOperation=v,exports.logUploadCompletion=y,exports.logUploadProgress=_,exports.logWithContext=g,exports.makeFlowObservabilityLayer=m,exports.makeFlowObservabilityLive=z,exports.makeObservabilityLayer=d,exports.makeStorageObservabilityLayer=f,exports.makeTestFlowObservability=w,exports.makeTestFlowObservabilityUtil=B,exports.makeTestStorageObservability=S,exports.makeTestUploadObservability=C,exports.makeUploadObservabilityLayer=p,exports.makeUploadObservabilityLive=Tn,exports.runWithTestFlowObservability=Te,exports.runWithTestObservability=ue,exports.s3ActiveUploadsGauge=yn,exports.s3ApiCallsTotal=mn,exports.s3FileSizeHistogram=_n,exports.s3Metrics=X,exports.s3PartSizeHistogram=vn,exports.s3PartUploadDurationHistogram=gn,exports.s3UploadDurationHistogram=hn,exports.s3UploadErrorsTotal=pn,exports.s3UploadLatencySummary=xn,exports.s3UploadPartsTotal=dn,exports.s3UploadRequestsTotal=un,exports.s3UploadSuccessTotal=fn,exports.s3UploadThroughputGauge=bn,exports.trackActiveFlow=Ce,exports.trackActiveNode=we,exports.trackAzureError=Me,exports.trackFileSize=N,exports.trackFilesystemError=nt,exports.trackFlowError=ge,exports.trackGCSError=Dt,exports.trackNodeError=_e,exports.trackPartSize=me,exports.trackS3Error=Qt,exports.trackStorageError=a,exports.trackUploadError=Sn,exports.uploadServerMetrics=wn,exports.validateMetricsExist=Nn,exports.whenObservabilityEnabled=ie,exports.withActiveUploadTracking=P,exports.withApiMetrics=j,exports.withAzureApiMetrics=Fe,exports.withAzureOperationMetrics=Le,exports.withAzureSpan=Re,exports.withAzureTimingMetrics=Ie,exports.withAzureUploadMetrics=Pe,exports.withChunkContext=In,exports.withChunkDuration=An,exports.withExecutionContext=ke,exports.withFilesystemApiMetrics=at,exports.withFilesystemOperationMetrics=st,exports.withFilesystemSpan=ct,exports.withFilesystemTimingMetrics=ot,exports.withFilesystemUploadMetrics=it,exports.withFlowContext=De,exports.withFlowDuration=xe,exports.withFlowSpan=Ee,exports.withGCSApiMetrics=At,exports.withGCSOperationMetrics=Mt,exports.withGCSSpan=Nt,exports.withGCSTimingMetrics=jt,exports.withGCSUploadMetrics=kt,exports.withMetricTracking=le,exports.withNodeContext=Oe,exports.withNodeDuration=Se,exports.withS3ApiMetrics=tn,exports.withS3OperationMetrics=rn,exports.withS3Span=an,exports.withS3TimingMetrics=nn,exports.withS3UploadMetrics=en,exports.withStorageOperationMetrics=I,exports.withStorageSpan=k,exports.withThroughputTracking=F,exports.withTimingMetrics=M,exports.withUploadContext=Fn,exports.withUploadDuration=kn,exports.withUploadMetrics=A,exports.withUploadSpan=Pn;