ripplo 0.7.20 → 0.7.22
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/chunk-MOJRP3IN.js +206 -0
- package/dist/chunk-R7CQWEBF.js +167 -0
- package/dist/daemon-A5IWWSRC.js +72 -0
- package/dist/daemon-APJHNVIG.js +2 -0
- package/dist/index.js +158 -155
- package/package.json +3 -3
- package/dist/chunk-DAULBZMT.js +0 -167
- package/dist/chunk-XZTICXYD.js +0 -206
- package/dist/daemon-5FTGPJ3L.js +0 -62
- package/dist/daemon-XZ5HWQJA.js +0 -2
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{A as re,C as de,F as C,H as ce,I as ue,K as pe,L as fe,N as h,O as Re,b as G,ba as w,ca as T,da as ve,e as Q,ea as q,fa as Pe,h as y,ha as _,i as A,ia as xe,ja as he,l as H,la as be,na as Ee,pa as Ie,q as X,qa as Ce,ra as Te,sa as We,t as I,ta as Le,ua as De,v as Z,va as Ae,w as ee,wa as He,ya as Fe,za as qe}from"./chunk-MOJRP3IN.js";import{H as te,N as ie,P as ae,Q as se,R as F,Z as le,ba as me,c as J,ca as ye,da as ge,ea as ke,fa as we,g as K,ga as Se,h as V,k as Y,n as ne,p as oe}from"./chunk-R7CQWEBF.js";import{b as _e}from"./chunk-BJVAPI4P.js";import{c as B,d as E,e as l,f as D,g as z}from"./chunk-EVYYSTR7.js";import"./chunk-IHSHBPJY.js";import"./chunk-7UWDMECF.js";import sn from"path";import{createClient as ln}from"graphql-sse";import dn,{AbortError as cn}from"p-retry";import{graphql as N}from"gql.tada";import{graphql as Pr}from"gql.tada";import{print as xr}from"graphql";async function $e({config:e,cwd:n,headed:r,pool:t,runId:o,signal:i,testSlug:a,workClass:s,workflowSlug:d}){let{fingerprint:c,result:u}=await y(n);if(u.isErr())return await C(e,o,`lockfile:${u.error.kind}`),{kind:"dispatch-error",reason:{detail:`lockfile:${u.error.kind}`,type:"generic"}};let f=vr(u.value,{testSlug:a,workflowSlug:d});if(f==null)return await C(e,o,`no-test:${d}/${a}`),{kind:"dispatch-error",reason:{detail:`no-test:${d}/${a}`,type:"generic"}};let m=await w({headed:r,workClass:s,task:()=>t.execute({headed:r,lockfileFingerprint:c,runId:o,testRef:f},i)});return!m.serverNotified&&m.outcome.kind==="error"&&await C(e,o,m.outcome.detail),m.outcome}function vr(e,{testSlug:n,workflowSlug:r}){let o=e.workflows.find(i=>Y(i.name)===r)?.tests.find(i=>i.slug===n);return o==null?void 0:ne(o)}var hr=6e4,br=Pr(`
|
|
3
|
+
subscription RunRequestedWatch($devSessionId: String!) {
|
|
4
|
+
runRequested(devSessionId: $devSessionId) {
|
|
5
|
+
runId
|
|
6
|
+
testSlug
|
|
7
|
+
workflowId
|
|
8
|
+
workflowSlug
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
`);async function Oe(e){let n=Math.min(1e3*2**e,hr)+Cr();await new Promise(r=>setTimeout(r,n))}function je({claim:e,cwd:n,devSessionId:r,onSubscriptionDead:t,pool:o,sseClient:i,sseHealth:a}){let s=new Set;return i.subscribe({query:xr(br),variables:{devSessionId:r}},{complete:()=>{},error:d=>{let c=d instanceof Error?d.message:String(d);l.warn("runRequested SSE failed: %s; re-registering session",c),t(c)},next:d=>{Er({claim:e,cwd:n,event:d.data?.runRequested,inFlightRunIds:s,pool:o})}},{connected:()=>{a.onConnected()},connecting:d=>{a.onConnecting(d),d&&l.debug("runRequested SSE reconnecting")}})}function Er({claim:e,cwd:n,event:r,inFlightRunIds:t,pool:o}){if(r==null)return;if(t.has(r.runId)){l.warn({runId:r.runId,workflowSlug:r.workflowSlug},"duplicate runRequested event; skipping dispatch");return}t.add(r.runId),process.stdout.write(`ripplo: run ${r.workflowSlug}
|
|
12
|
+
`),G(n);let i=I(n).match(s=>s,s=>{l.error({failure:s,runId:r.runId},"failed to load env for run dispatch; skipping")});if(i==null){t.delete(r.runId);return}let a=Ir(e(r.runId),r);a.started(),$e({config:i,cwd:n,headed:a.headed,pool:o,runId:r.runId,signal:a.signal,testSlug:r.testSlug,workClass:a.workClass,workflowSlug:r.workflowSlug}).then(s=>{a.finished(s)}).catch(s=>{l.error({err:s,runId:r.runId,workflowSlug:r.workflowSlug},"run execution failed; daemon continuing"),a.finished({detail:s instanceof Error?s.message:String(s),kind:"error"})}).finally(()=>{t.delete(r.runId)})}function Ir(e,n){return e==null?(l.debug({runId:n.runId,workflowSlug:n.workflowSlug},"dispatching unclaimed run (externally triggered or replayed)"),{headed:!1,signal:new AbortController().signal,workClass:"p0-ui",finished:()=>{},started:()=>{}}):{headed:e.headed,signal:xe(e.token),workClass:"p1-cli",finished:r=>{e.finished(n.runId,r)},started:()=>{e.started(n.runId)}}}function Cr(){return Math.floor(Math.random()*2700)+300}import{graphql as Tr}from"gql.tada";import{print as Wr}from"graphql";var Lr=Tr(`
|
|
13
|
+
subscription TeleportRequestedWatch($devSessionId: String!) {
|
|
14
|
+
teleportRequested(devSessionId: $devSessionId) {
|
|
15
|
+
runId
|
|
16
|
+
stepIndex
|
|
17
|
+
testSlug
|
|
18
|
+
workflowSlug
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
`);function Ne({cwd:e,devSessionId:n,onSubscriptionDead:r,sseClient:t}){let o=new Set,i=t.subscribe({query:Wr(Lr),variables:{devSessionId:n}},{complete:()=>{},error:a=>{let s=a instanceof Error?a.message:String(a);l.warn("teleportRequested SSE failed: %s; re-registering session",s),r(s)},next:a=>{Dr({cwd:e,event:a.data?.teleportRequested,running:o})}});return()=>{o.forEach(a=>{a.abort()}),o.clear(),i()}}function Dr({cwd:e,event:n,running:r}){if(n==null)return;let t=`${n.workflowSlug}/${n.testSlug}`,o=new AbortController;r.add(o),process.stdout.write(`ripplo: teleport ${t} step ${String(n.stepIndex+1)}
|
|
22
|
+
`),Fe({cwd:e,ref:t,signal:o.signal,step:n.stepIndex+1}).then(i=>{i.kind!=="done"&&l.warn({kind:i.kind,ref:t},"teleport could not open")}).catch(i=>{l.error({err:i,ref:t},"teleport failed; daemon continuing")}).finally(()=>{r.delete(o)})}function Me(){let e=!0,n,r=null,t=()=>{r!=null&&(clearTimeout(r),r=null)};return{markUnhealthy:o=>{e=!1,n=o,t()},onConnected:()=>{t(),r=setTimeout(()=>{e=!0,n=void 0,r=null},1e4)},onConnecting:()=>{t()},snapshot:()=>({detail:n,ok:e})}}import Ar from"fs";import Ge from"net";import{err as Qe,ok as Hr}from"neverthrow";async function Je({cwd:e,onConnection:n}){z(e);let r=Re(e),t=await Ue({onConnection:n,socketPath:r});return t.isOk()||t.error.kind!=="stale-candidate"?t.map(Be(r)).mapErr(ze(r)):await Fr(r)?Qe({kind:"already-running",socketPath:r}):(Ke(r),(await Ue({onConnection:n,socketPath:r})).map(Be(r)).mapErr(ze(r)))}function Fr(e){return new Promise(n=>{let r=Ge.connect(e);r.once("connect",()=>{r.destroy(),n(!0)}),r.once("error",()=>{n(!1)})})}async function Ue(e){let n=await qr(e);return n.kind==="listening"?Hr(n.server):Qe(n.error)}function qr({onConnection:e,socketPath:n}){return new Promise(r=>{let t=Ge.createServer(e);t.once("error",o=>{r({error:o.code==="EADDRINUSE"?{kind:"stale-candidate"}:{kind:"listen-failed",message:o.message},kind:"failed"})}),t.listen(n,()=>{r({kind:"listening",server:t})})})}function Be(e){return n=>({socketPath:e,close:()=>{n.close(),Ke(e)}})}function Ke(e){Ar.rmSync(e,{force:!0})}function ze(e){return n=>n.kind==="stale-candidate"?{kind:"already-running",socketPath:e}:{kind:"bind-failed",message:n.message}}function $(e){return{priority:e,next:()=>null,onResult:()=>{}}}function Ve({config:e,executor:n,explore:r,exploreConcurrency:t,pool:o}){return _r({appUrl:e.appUrl,cwd:e.cwd,explore:r&&n==="local",exploreConcurrency:t,executeTrail:async(i,a)=>(await o).exploreTrail(i,a)})}function _r({appUrl:e,cwd:n,executeTrail:r,explore:t,exploreConcurrency:o}){let i={notify:()=>{}},a=t?$r({appUrl:e,cwd:n,executeTrail:r,notifyWork:()=>{i.notify()}}):pe(),s=qe({exploreConcurrency:o,exploreEnabled:t,now:Date.now,probe:Or,setTimer:jr,sources:[$("p0"),$("p1"),a],execute:({job:c,priority:u,signal:f})=>w({headed:!1,workClass:Nr(u),task:()=>c.run(f)})});q(()=>{s.notifyQueueChange()}),i.notify=()=>{s.notifyQueueChange()};let d=t?ue({onChange:c=>{s.setExplorerHolder(c)}}):null;return{status:()=>({explorer:Mr({explore:t,holder:s.explorerHolder()}),exploring:s.explorationActive(),progress:a.status()}),stop:()=>{d?.stop(),s.stop(),q(null),a.stop()}}}function $r({appUrl:e,cwd:n,executeTrail:r,notifyWork:t}){return fe({cwd:n,executeTrail:r,notifyWork:t,loadLockfile:async()=>{let{fingerprint:o,result:i}=await y(n);return i.match(a=>({fingerprint:o,lockfile:a}),()=>null)},probeApp:async()=>await re(e)==null})}function Or(){let e=ve();return{headedActive:e.headedActive,interactiveActive:e.active,interactiveQueued:e.queued,poolSize:e.poolSize}}function jr(e,n){let r=setTimeout(e,n);return()=>{clearTimeout(r)}}function Nr(e){switch(e){case"p0":return"p0-ui";case"p1":return"p1-cli";case"p2":return"p2-cover";case"p3":return"p3-explore"}}function Mr({explore:e,holder:n}){return e?n?"holder":"standby":"off"}async function Ye({cwd:e,finding:n}){let r={at:new Date().toISOString(),kind:"resolution",signature:n.signature};await F(h(e),[r]).match(()=>{},t=>{l.warn("explore findings log append failed: %s",t.kind)})}async function Xe({cwd:e,finding:n,outcome:r}){let t=r.kind==="clean"?[...r.rows,{at:new Date().toISOString(),kind:"resolution",signature:n.signature}]:r.rows;t.length!==0&&await F(h(e),t).match(()=>{},o=>{l.warn("explore findings log append failed: %s",o.kind)})}function Ze({config:e,cwd:n,pool:r}){let t={cwd:n,executeTrail:(o,i)=>w({headed:!1,workClass:"p1-cli",task:async()=>(await r).exploreTrail(o,i)}),loadLockfile:async()=>{let o=await y(n);return o.result.match(i=>({fingerprint:o.fingerprint,lockfile:i}),()=>null)},pushResolved:o=>ce(e,o,"resolved").catch(i=>{l.warn({error:i},"explore finding status push failed")})};return(o,i)=>Ur(t,{findingId:o,signal:i})}async function Ur(e,n){let r=await Br(e.cwd,n.findingId);if("reply"in r)return r.reply;let t=await e.loadLockfile();if(t==null)return{kind:"error",reason:"lockfile-unavailable"};let o=zr(t,r.finding);if("reply"in o)return o.reply;let i=await e.executeTrail(o.assign,n.signal),a=await Qr({cwd:e.cwd,finding:r.finding,outcome:i});return(a.kind==="resolved"||a.kind==="unreachable")&&await e.pushResolved(r.finding.signature),a}async function Br(e,n){return se(h(e)).match(r=>{let o=[...ae(r).findings.entries()].find(([a])=>ie(a)===n);if(o==null)return{reply:{kind:"finding-not-found"}};let[,i]=o;return i.resolvedAt!=null?{reply:{kind:"finding-not-found"}}:{finding:i.latest}},()=>({reply:{kind:"unreplayable",reason:"ledger-unreadable"}}))}function zr(e,n){let r=le(e.lockfile,{sweep:!1}).find(o=>o.name===n.baseState);if(r==null)return{reply:{kind:"unreplayable",reason:"base-state-missing"}};let t=Gr(e.lockfile,n);return t==null?{reply:{kind:"unreplayable",reason:"action-missing"}}:{assign:{baseStateTest:r.test,lensId:n.lensId,lockfileFingerprint:e.fingerprint,lockfileHash:V(e.lockfile),maxLength:t.length,shrinkBudget:0,stepRuns:t}}}function Gr(e,n){let t=oe(e).map(a=>`${a.test}#${String(a.index)}`),i=n.trail.map((a,s)=>{let d=t.indexOf(a),c=n.trailParams[s];return d===-1||c==null?null:{idx:d,params:c}}).flatMap(a=>a==null?[]:[a]);return i.length===n.trail.length?i:null}async function Qr({cwd:e,finding:n,outcome:r}){return r.kind==="aborted"?{kind:"aborted"}:r.kind==="error"?Jr({cwd:e,finding:n,reason:r.reason}):(await Xe({cwd:e,finding:n,outcome:r}),r.kind==="clean"?{kind:"resolved"}:r.kind==="flaky"?{kind:"flaky"}:Kr(n,r))}async function Jr({cwd:e,finding:n,reason:r}){return r==="empty-trail"?(await Ye({cwd:e,finding:n}),{kind:"unreachable"}):{kind:"error",reason:r??"trail-error"}}function Kr(e,n){let r=n.rows.find(o=>o.kind==="finding"),t=r?.kind==="finding"?r.runId:void 0;return r!=null&&r.signature===e.signature?{kind:"still-failing",runId:t}:{kind:"diverged",runId:t}}import{fork as Vr}from"child_process";import er from"os";import{CancellationTokenSource as rr,ResponseError as nr}from"vscode-jsonrpc/node";function or(e,n){return()=>{let r=Vr(e,["run-worker"],{cwd:n,stdio:["ignore","inherit","inherit","ipc"]});return{connection:He(r),kill:()=>{r.kill("SIGKILL")},onExit:t=>{r.once("exit",t)}}}}function tr(e){let n={closed:!1,lockfileProvider:e.lockfileProvider,nextId:0,size:e.initialSize,spawn:e.spawn,waiters:[],workers:[]};return{close:async()=>{n.closed=!0,await Promise.all([...n.workers].map(r=>O(r,n)))},execute:(r,t)=>Xr(r,t,n),exploreTrail:(r,t)=>rn(r,t,n),routeSpan:(r,t)=>{let o=n.workers.find(i=>i.runId===r);o?.worker.connection.sendNotification(De,{runId:r,span:t})},setSize:r=>{on(r,n)}}}var Yr=1e4,ir=-32800;async function Xr(e,n,r){let t=await ar(r);if(t.runId=e.runId,!t.alive)return W(t,r),{outcome:{detail:"worker-exit",kind:"error"},serverNotified:!1};let o=new rr,i=()=>{o.cancel()};n.aborted&&o.cancel(),n.addEventListener("abort",i,{once:!0});try{let a=await t.worker.connection.sendRequest(Te,e,o.token),s=Ee.safeParse(a);return s.success?s.data:{outcome:{detail:"bad-outcome-frame",kind:"error"},serverNotified:!1}}catch(a){return en(a,t)}finally{n.removeEventListener("abort",i),o.dispose(),W(t,r)}}async function ar(e){let n=e.workers.find(r=>r.alive&&r.runId===void 0);if(n!=null)return n.runId="pending",n;if(e.workers.length<e.size){let r=Zr(e);return r.runId="pending",await r.ready,r}return new Promise(r=>{e.waiters.push(t=>{t.runId="pending",r(t)})})}function Zr(e){let n=e.spawn(),r={resolve:()=>{}},t={alive:!0,id:e.nextId,ready:new Promise(o=>{r.resolve=o,n.connection.onNotification(Ce,o)}),runId:void 0,worker:n};return e.nextId+=1,n.connection.onRequest(We,async o=>{let i=be.safeParse(o);return i.success?e.lockfileProvider(i.data.fingerprint):{unavailable:"bad-lockfile-request"}}),n.onExit(()=>{t.alive=!1,e.workers=e.workers.filter(o=>o!==t),n.connection.dispose(),r.resolve()}),e.workers.push(t),t}function W(e,n){if(e.runId=void 0,!e.alive||n.closed)return;if(n.workers.length>n.size){O(e,n);return}let r=n.waiters.shift();r?.(e)}async function O(e,n){if(n.workers=n.workers.filter(o=>o!==e),!e.alive)return;let r=new Promise(o=>{e.worker.onExit(o)});await e.worker.connection.sendNotification(Ae).catch(()=>{});let t=setTimeout(()=>{e.worker.kill()},Yr);await r,clearTimeout(t)}function en(e,n){return e instanceof nr&&e.code===ir?{outcome:{detail:"aborted",kind:"error"},serverNotified:!1}:n.alive?{outcome:{detail:e instanceof Error?e.message:String(e),kind:"error"},serverNotified:!1}:{outcome:{detail:"worker-exit",kind:"error"},serverNotified:!1}}async function rn(e,n,r){let t=await ar(r);if(t.runId="explore",!t.alive)return W(t,r),{kind:"error",rows:[],trail:[]};let o=new rr,i=()=>{o.cancel()};n.aborted&&o.cancel(),n.addEventListener("abort",i,{once:!0});try{let a=await t.worker.connection.sendRequest(Le,e,o.token),s=Ie.safeParse(a);return s.success?s.data:{kind:"error",rows:[],trail:[]}}catch(a){return nn(a)}finally{n.removeEventListener("abort",i),o.dispose(),W(t,r)}}function nn(e){return e instanceof nr&&e.code===ir?{kind:"aborted",rows:[],trail:[]}:{kind:"error",reason:`transport:${e instanceof Error?e.message.slice(0,120):"unknown"}`,rows:[],trail:[]}}function on(e,n){n.size=e,e>er.availableParallelism()&&l.warn({cores:er.availableParallelism(),size:e},"worker pool size exceeds available cores");let r=n.workers.filter(o=>o.alive&&o.runId===void 0),t=n.workers.length-e;r.slice(0,Math.max(0,t)).forEach(o=>{O(o,n)})}import L from"fs";import{graphql as sr}from"gql.tada";import{print as lr}from"graphql";var tn=sr(`
|
|
23
|
+
subscription HooksPausedWatch($projectId: String!) {
|
|
24
|
+
hooksPausedRequested(projectId: $projectId) {
|
|
25
|
+
paused
|
|
26
|
+
projectId
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
`),an=sr(`
|
|
30
|
+
subscription WatchLocalConcurrencyChanged {
|
|
31
|
+
myMaxLocalConcurrentRunsChanged
|
|
32
|
+
}
|
|
33
|
+
`);function dr({pool:e,sseClient:n}){return n.subscribe({query:lr(an)},{complete:()=>{},error:r=>{l.error(r,"localConcurrency subscription error")},next:r=>{let t=r.data?.myMaxLocalConcurrentRunsChanged;t!=null&&(T(t),e.setSize(t))}})}function cr({cwd:e,projectId:n,sseClient:r}){return r.subscribe({query:lr(tn),variables:{projectId:n}},{complete:()=>{},error:t=>{l.error(t,"hooksPaused subscription error")},next:t=>{let o=t.data?.hooksPausedRequested?.paused;o!=null&&j({cwd:e,paused:o})}})}function j({cwd:e,paused:n}){let r=de(e);if(n&&!L.existsSync(r)){L.writeFileSync(r,"");return}!n&&L.existsSync(r)&&L.unlinkSync(r)}var un=6e4,ur=500,pn=15e3,pr=6e4,fn=3,mn=N(`
|
|
34
|
+
mutation HeartbeatDevSessionWatch($id: String!) {
|
|
35
|
+
heartbeatDevSession(id: $id) {
|
|
36
|
+
__typename
|
|
37
|
+
... on DevSession {
|
|
38
|
+
id
|
|
39
|
+
}
|
|
40
|
+
... on DevSessionEndedError {
|
|
41
|
+
message
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
`),yn=N(`
|
|
46
|
+
query WatchLocalConcurrency {
|
|
47
|
+
currentUser {
|
|
48
|
+
id
|
|
49
|
+
maxLocalConcurrentRuns
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
`),gn=N(`
|
|
53
|
+
mutation EndDevSessionWatch($projectId: String!, $cwd: String!) {
|
|
54
|
+
endDevSession(projectId: $projectId, cwd: $cwd) {
|
|
55
|
+
__typename
|
|
56
|
+
... on DevSession {
|
|
57
|
+
id
|
|
58
|
+
}
|
|
59
|
+
... on NoActiveDevSessionError {
|
|
60
|
+
message
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
`);async function wt(e){let{executor:n,explore:r,exploreConcurrency:t}=e;Hn();let o=Wn(process.cwd()),i=o.cwd,a=bn(i),s=Tn(),d=Ve({config:o,executor:n,explore:r,exploreConcurrency:t,pool:s.pool}),c={handler:()=>{}},u=In(),f=Me(),m=he({config:o,cwd:i,executor:n,explorationStatus:d.status,ready:u.promise,replayFinding:Ze({config:o,cwd:i,pool:s.pool}),onShutdownRequest:()=>{c.handler()},sseHealth:()=>f.snapshot()}),S=await Cn({cwd:i,ipc:m,releasePid:a}),R=await A(i);R.isErr()&&(process.stderr.write(`ripplo: ${H(R.error)}
|
|
65
|
+
`),process.exit(1));let b=R.value,p=await fr(()=>_({config:o,cwd:i,lockfile:b}),{config:o,label:"initial sync"}),g=await qn(o);j({cwd:i,paused:p.hooksPaused});let k=Pe(i);k!=null&&l.info("watching branch %s in %s",k,i);let v=ln({headers:{Authorization:`Bearer ${o.token}`},retry:Oe,retryAttempts:1/0,url:`${o.ripploServerUrl}/graphql`}),P=hn({cwd:i,initialConcurrency:g});s.provide(P);let mr=await Sn({cwd:i,pool:P}),M=Pn({claim:m.claim,config:o,cwd:i,initialId:p.devSessionId,pool:P,sseClient:v,sseHealth:f}),yr=cr({cwd:i,projectId:o.projectId,sseClient:v}),gr=dr({pool:P,sseClient:v}),kr=vn({config:o,session:M}),wr=An(),U=await kn({config:o,devSessionId:p.devSessionId,executor:n});u.resolve(),Rn({devSessionId:p.devSessionId,executor:n,tunnel:U});let Sr=async()=>{kr(),wr(),d.stop(),S.close(),M.stop(),yr(),gr(),await P.close(),await wn(U),await mr.stop().catch(()=>{}),await Promise.race([E({config:o,document:gn,variables:{cwd:o.cwd,projectId:o.projectId}}).catch(()=>{}),new Promise(Rr=>setTimeout(Rr,3e3))]),a()},x=()=>{Sr().finally(()=>process.exit(0))};c.handler=x,process.on("SIGINT",x),process.on("SIGTERM",x),process.on("SIGHUP",x),process.on("SIGBREAK",x),await new Promise(()=>{})}async function kn({config:e,devSessionId:n,executor:r}){if(r==="cloud")return _e({config:e,devSessionId:n})}async function wn(e){e!=null&&await e.stop()}function Sn({cwd:e,pool:n}){return te({localDir:sn.join(e,".ripplo",".local"),writePortFile:!0,onRrwebBatch:()=>{},onSpan:r=>{let t=r.attributes["ripplo.run"];t!=null&&n.routeSpan(t,r)}})}function Rn({devSessionId:e,executor:n,tunnel:r}){process.stdout.write(`${ke({devSessionId:e,executor:n,tunnelHostname:r?.hostname,version:Q()})}
|
|
66
|
+
`)}function vn({config:e,session:n}){let r=async()=>{try{let o=await E({config:e,document:mn,variables:{id:n.getId()}});o.heartbeatDevSession?.__typename==="DevSessionEndedError"&&(l.warn("dev session ended server-side (%s); re-registering",o.heartbeatDevSession.message),await n.reregister())}catch(o){l.warn("heartbeat failed: %s",o instanceof Error?o.message:String(o))}},t=setInterval(()=>{r()},pn);return()=>{clearInterval(t)}}function Pn({claim:e,config:n,cwd:r,initialId:t,pool:o,sseClient:i,sseHealth:a}){let s=t,d=null,c=0,u=0,f=p=>{b(p)},m=()=>{let p=je({claim:e,cwd:r,devSessionId:s,onSubscriptionDead:f,pool:o,sseClient:i,sseHealth:a}),g=Ne({cwd:r,devSessionId:s,onSubscriptionDead:f,sseClient:i});return()=>{p(),g()}},S=m(),R=async p=>{let g=Date.now();c=g-u>pr*2?1:c+1,u=g,c>=fn&&a.markUnhealthy(p),await xn(Math.min(1e3*2**(c-1),pr));let k=await A(r);if(k.isErr()){l.error("re-register: compile failed: %s",H(k.error));return}let v=await fr(()=>_({config:n,cwd:r,lockfile:k.value}),{config:n,label:"re-register sync"});S(),s=v.devSessionId,S=m(),l.info("re-registered dev session as %s",s)},b=p=>(d!=null||(d=R(p).finally(()=>{d=null})),d);return{getId:()=>s,reregister:()=>b("dev session ended server-side"),stop:()=>{S()}}}function xn(e){return new Promise(n=>setTimeout(n,e))}function hn({cwd:e,initialConcurrency:n}){return tr({initialSize:n,spawn:or(_n(),e),lockfileProvider:async r=>{let t=await y(e);return t.result.isErr()?{unavailable:`daemon-load-failed:${t.result.error.kind}`}:t.fingerprint!==r?{unavailable:"fingerprint-mismatch"}:{lockfileJson:J(K,t.result.value)}}})}function bn(e){try{return ee({cwd:e,onCompromised:En})}catch(n){throw n instanceof Z&&(process.stderr.write(`${we({cwd:n.cwd,pid:n.pid})}
|
|
67
|
+
`),process.exit(1)),n}}function En(){l.error("daemon lock compromised; shutting down"),process.stderr.write(`${Se()}
|
|
68
|
+
`),process.exit(1)}function In(){let e={handler:()=>{}};return{promise:new Promise(r=>{e.handler=r}),resolve:()=>{e.handler()}}}async function Cn({cwd:e,ipc:n,releasePid:r}){return(await Je({cwd:e,onConnection:n.handleConnection})).match(o=>o,o=>{process.stderr.write(`${me(o)}
|
|
69
|
+
`),r(),process.exit(1)})}function Tn(){let e={provide:()=>{}};return{pool:new Promise(r=>{e.provide=r}),provide:r=>{e.provide(r)}}}function Wn(e){return I(e).match(n=>n,n=>{process.stderr.write(`${X(n)}
|
|
70
|
+
`),process.exit(1)})}function fr(e,{config:n,label:r}){let t=n.ripploServerUrl.includes("localhost")||n.ripploServerUrl.includes("127.0.0.1");return dn(async()=>{try{return await e()}catch(o){Ln({config:n,error:o});let i=o instanceof Error?o.message:String(o);throw Dn(i)?o:(l.error("%s failed: %s",r,i),new cn(i))}},{factor:2,maxTimeout:t?2e3:1e4,minTimeout:t?100:1e3,retries:1/0,onFailedAttempt:({attemptNumber:o,error:i})=>{l.warn("%s attempt %d failed \u2014 retrying: %s",r,o,i.message)}})}function Ln({config:e,error:n}){let r=B(n);r==="UNAUTHENTICATED"&&(process.stderr.write(`ripplo: ${ge()}
|
|
71
|
+
`),process.exit(1)),r==="FORBIDDEN"&&(process.stderr.write(`ripplo: ${ye({projectId:e.projectId,serverUrl:e.ripploServerUrl})}
|
|
72
|
+
`),process.exit(1))}function Dn(e){return e.includes("status 502")||e.includes("ECONNREFUSED")||e.includes("Failed to connect")||e.includes("fetch failed")}function An(){D({maxRuns:ur});let e=setInterval(()=>{D({maxRuns:ur})},un);return()=>{clearInterval(e)}}function Hn(){process.on("unhandledRejection",e=>{l.error({err:e},"unhandledRejection in watch; continuing")}),process.on("uncaughtException",e=>{l.error({err:e},"uncaughtException in watch; continuing")})}var Fn=4;async function qn(e){try{let r=(await E({config:e,document:yn,variables:void 0})).currentUser?.maxLocalConcurrentRuns;if(r!=null)return T(r),r}catch(n){l.warn({err:n},"failed to fetch local concurrency setting; using default")}return Fn}function _n(){let e=process.argv[1];if(e==null)throw new Error("cli entry unavailable");return e}export{wt as runDaemon};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{aa as a,ba as b,ca as c,da as d,ea as e,fa as f,ga as g,ha as h,ia as i,ja as j,ka as k}from"./chunk-R7CQWEBF.js";import"./chunk-IHSHBPJY.js";import"./chunk-7UWDMECF.js";export{b as renderDaemonBindError,g as renderDaemonLockCompromised,f as renderDaemonLockHeld,e as renderDaemonReady,h as renderDaemonStatus,j as renderDaemonVersionNote,i as renderExplorationProgress,d as renderNotSignedIn,c as renderProjectAccessDenied,a as renderTunnelProvisionFailed,k as wireOutcome};
|