eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
1 lines • 2.8 kB
JavaScript
import{parseCreatedSlackConnector}from"./slack-connect.js";import{CONNECT_LOOKUP_TIMEOUT_MS,fetchSlackConnectorDetails}from"./slack-connect-lifecycle.js";import{performance}from"node:perf_hooks";import{setTimeout}from"node:timers/promises";const CREATED_CONNECTOR_PROGRESS=/\bConnector created:\s*(scl_[A-Za-z0-9]+)\b/,realDelay=(e,t)=>setTimeout(e,void 0,{signal:t}),monotonicNow=()=>performance.now();async function pollCreatedSlackConnector(e,t,n,r,i,a){let o=e.delay??realDelay,s=e.now??monotonicNow,c=s()+CONNECT_LOOKUP_TIMEOUT_MS;for(;;){a.throwIfAborted();let l=c-s();if(l<=0)return;let u=await fetchSlackConnectorDetails({deps:e,projectRoot:t,connectorId:n,orgId:r,onOutput:i,timeoutMs:Math.min(1e4,l),signal:a});if(a.throwIfAborted(),u.state===`found`)return u.details.ref;let d=c-s();if(d<=0)return;await o(Math.min(3e3,d),a)}}async function createSlackConnector(e){let t=new AbortController,n=new AbortController,r=new AbortController,i=e.signal?AbortSignal.any([e.signal,t.signal]):t.signal,a=e.signal?AbortSignal.any([e.signal,n.signal]):n.signal,o=e.signal?AbortSignal.any([e.signal,r.signal]):r.signal,s=!1,reportCreated=t=>{s||(s=!0,e.onCreated(t))},c,l,u=new Promise((e,t)=>{c=e,l=t}),d,f,startWorkspaceLookup=t=>{f===void 0&&(f=e.waitForWorkspace(t,o).catch(t=>{if(!(r.signal.aborted&&e.signal?.aborted!==!0))throw t}),f.then(e=>{e!==void 0&&c({ref:t,workspace:e})},l))},createOutput=t=>{e.onOutput(t);let r=t.text.match(CREATED_CONNECTOR_PROGRESS)?.[1];r!==void 0&&d===void 0&&(d=pollCreatedSlackConnector(e.deps,e.projectRoot,r,e.orgId,e.onOutput,a).catch(t=>{if(!(n.signal.aborted&&e.signal?.aborted!==!0))throw t}),d.then(e=>{e!==void 0&&(reportCreated(e),startWorkspaceLookup(e))},l))},p=e.phase(`Waiting for Slack setup to finish...`,()=>e.deps.runVercelCaptureStdout([`connect`,`create`,`slack`,`--triggers`,`--name`,e.slug,`-F`,`json`],{cwd:e.projectRoot,nonInteractive:!0,onOutput:createOutput,timeoutMs:6e5,signal:i})),m;try{m=await Promise.race([p.then(e=>({via:`cli`,result:e})),u.then(e=>({via:`workspace`,...e}))])}catch(e){throw n.abort(),r.abort(),await Promise.allSettled([d,f].filter(e=>e!==void 0)),e}if(m.via===`workspace`)return t.abort(),await p,e.signal?.throwIfAborted(),{state:`created`,via:`workspace`,ref:m.ref,workspace:m.workspace};if(!m.result.ok)return d!==void 0&&await d,r.abort(),f!==void 0&&await f,e.signal?.throwIfAborted(),{state:`failed`};let h=parseCreatedSlackConnector(m.result.stdout);if(h!==void 0)return reportCreated(h),n.abort(),r.abort(),d!==void 0&&await d,f!==void 0&&await f,e.signal?.throwIfAborted(),{state:`created`,via:`cli`,ref:h};let g=d===void 0?void 0:await d;return r.abort(),f!==void 0&&await f,e.signal?.throwIfAborted(),g===void 0?{state:`unresolved`}:{state:`created`,via:`cli`,ref:g}}export{createSlackConnector};