UNPKG

eve

Version:

Filesystem-first framework for durable backend AI agents that run anywhere.

1 lines 3.73 kB
import{remoteHost}from"./target.js";import{appendRemoteAuthMutationSummary}from"./remote-auth-result.js";import{classifyRemoteError,probeRemoteInfo}from"./remote-connection-probe.js";import{toErrorMessage}from"#shared/errors.js";function challengeFor(e){switch(e.state){case`auth-required`:case`authenticating`:case`auth-failed`:return e.challenge;case`checking`:case`ready`:return{kind:`eve-oidc`};case`unavailable`:return e.failure.code===`TRUSTED_SOURCES_ENVIRONMENT_MISMATCH`?{kind:`vercel-deployment-protection`}:{kind:`eve-oidc`}}}function createRemoteConnectionController(e){let t={state:`checking`},n,r,restoreActiveCredentials,i=0,a=!1,snapshot=()=>n===void 0?{target:e.target,connection:t}:{target:e.target,connection:t,deployment:n},update=n=>(t=n,a||e.onChange(snapshot()),n),beginOperation=e=>{r?.abort();let t=new AbortController;r=t;let n=e===void 0?t.signal:AbortSignal.any([t.signal,e]);return{generation:++i,signal:n}},isCurrent=e=>!a&&e===i,publishTarget=t=>{n=t.deployment,a||e.onChange(snapshot())},authorizeResolvedTarget=async(t,n)=>{let r=e.resolveDeployment;if(r!==void 0)try{let i=await r(t);return!isCurrent(n)||t.aborted||i.kind!==`resolved`?void 0:(publishTarget(i.target),e.credentials.authorize({target:i.target,resolveToken:async()=>await e.resolveOidcToken?.(i.target.deployment)??``}))}catch{}};return e.onChange(snapshot()),{current:snapshot,async check(){let r=beginOperation();restoreActiveCredentials?.(),restoreActiveCredentials=void 0,n=void 0,update({state:`checking`});let i=await authorizeResolvedTarget(r.signal,r.generation);if(!isCurrent(r.generation))return i?.(),t;restoreActiveCredentials=i;let a=await probeRemoteInfo({client:e.client,phase:`connection-check`});return isCurrent(r.generation)?update(a):t},async authenticate(n,r){let i=beginOperation(r),a=t,o=challengeFor(t);update({state:`authenticating`,challenge:o});let s;try{s=await n(i.signal)}catch(e){s={kind:`failed`,message:toErrorMessage(e),completedMutations:[]}}if(!isCurrent(i.generation))return{kind:`cancelled`,completedMutations:s.completedMutations};if(s.kind===`cancelled`)return update(a),{kind:`cancelled`,completedMutations:s.completedMutations};if(s.kind===`failed`)return update(a.state===`ready`?a:{state:`auth-failed`,challenge:o}),{kind:`failed`,message:s.message};if(i.signal.aborted)return update(a),{kind:`cancelled`,completedMutations:s.completedMutations};let c=restoreActiveCredentials,l;try{l=e.credentials.authorize({target:s.target,resolveToken:s.resolveToken})}catch(e){let t=appendRemoteAuthMutationSummary(toErrorMessage(e),s.completedMutations);return update({state:`auth-failed`,challenge:o}),{kind:`failed`,message:t}}let u=await probeRemoteInfo({client:e.client,phase:`authentication-verification`});if(!isCurrent(i.generation))return l(),{kind:`cancelled`,completedMutations:s.completedMutations};if(i.signal.aborted)return l(),update(a),{kind:`cancelled`,completedMutations:s.completedMutations};if(u.state===`ready`)return publishTarget(s.target),restoreActiveCredentials=()=>{l(),c?.()},update(u),{kind:`authenticated`};if(l(),u.state===`auth-required`){let t=appendRemoteAuthMutationSummary(`The selected Vercel project did not authorize ${remoteHost(e.target)}.`,s.completedMutations);return update({state:`auth-failed`,challenge:u.challenge}),{kind:`failed`,message:t}}let d={...u.failure,message:appendRemoteAuthMutationSummary(u.failure.message,s.completedMutations)};return update({state:`unavailable`,failure:d}),{kind:`unavailable`,failure:d}},reportFailure(e){return r?.abort(),i+=1,update(classifyRemoteError(e,`connection-check`))},dispose(){a=!0,i+=1,r?.abort(),r=void 0,restoreActiveCredentials?.(),restoreActiveCredentials=void 0}}}export{createRemoteConnectionController};