!: :: %eyre, http servant !? 164 :::: |= pit/vase => =~ |% :: interfaces ++ gift gift-eyre :: out result <-$ ++ kiss kiss-eyre :: in request ->$ ++ move {p/duct q/(mold note gift)} :: local move ++ note :: out request $-> $% $: $a :: to %ames $% {$wont p/sock q/{path *}} :: == == :: $: $b :: to %behn $% {$wait p/@da} :: {$rest p/@da} :: == == :: $: $d :: to %dill $% {$flog p/{$crud p/@tas q/(list tank)}} :: == == :: $: $e :: to self $% {$thud $~} :: proxied death {$this p/? q/clip r/httq} :: proxied request {$meta vase:{$them (unit httr)}} :: type check == == :: $: $f :: to %ford $% {$exec p/@p q/(unit {beak silk})} :: {$wasp p/@p q/@uvH r/?} :: == == :: $: $g :: to %gall $% {$deal p/sock q/cush} :: full transmission == == == :: ++ sign :: in result $<- $? $: $a :: by %aformedmes $% {$woot p/ship q/coop} :: == == :: $: $b :: by %behn $% {$wake $~} :: timer activate == == :: $: $g :: by %gall $% {$unto p/cuft} :: within agent == == :: $: $e :: by self $% {$thou p/httr} :: response for proxy == == :: $: $f :: by %ford $% {$made p/@uvH q/gage} :: {$news p/@uvH} :: == == :: $: @tas :: by any $% {$crud p/@tas q/(list tank)} :: == == == :: ++ ixor @t :: oryx hash ++ whir $@ $~ :: wire subset $% {$at p/hole q/whir} :: authenticated {$ay p/knot:ship q/knot:@uvH $~} :: remote duct {$ha p/path:beak} :: GET request {$he p/whir} :: HEAD request {$hi p/mark $~} :: outbound HTTP {$si $~} :: response done {$of p/ixor q/$@($~ whir-of)} :: associated view {$ow p/ixor $~} :: dying view {$on $~} :: dependency == :: ++ whir-of {p/knot:ship q/term r/wire} :: path in dock -- :: |% :: models ++ bolo :: eyre state $: $4 :: version gub/@t :: random identity hov/(unit ship) :: master for remote top/beam :: ford serve prefix ged/duct :: client interface ded/(set duct) :: killed requests lyv/(map duct live) :: living requests pox/(map @uvH duct) :: proxied sessions ask/{p/@ud q/(map @ud {p/duct q/hiss})} :: outgoing by number kes/(map duct @ud) :: outgoing by duct ney/@uvI :: rolling entropy dop/(map host ship) :: host aliasing liz/(jug @uvH (each duct ixor)) :: ford depsets wup/(map hole cyst) :: secure sessions sop/(map hole {ship ?}) :: foreign sess names wix/(map ixor stem) :: open views == :: :: ++ live :: in flight $% {$exec p/whir} :: ford build {$wasp p/(list @uvH)} :: ford deps {$xeno p/ship} :: proxied request {$poll p/ixor} :: session state == ++ cyst :: client session $: ced/cred :: credential {him/ship aut/(set ship)} :: authenticated cug/(list @t) :: unacked cookies lax/@da :: last used way/(map ship {purl duct}) :: waiting auth vew/(set oryx) :: open views XX expire == :: :: ++ stem :: client view $: him/ship :: static identity ude/(unit {p/duct q/?}) :: stream long-poll? era/@da :: next wake die/@da :: collection date sus/(set {dock $json wire path}) :: subscriptions eve/{p/@u q/(map @u even)} :: queued events med/(qeu duct) :: waiting /~/to/ == ++ even :: client event $% {$news p/@uvH} {$quit p/{dock path}} {$rush p/{dock path} q/json} == :: ++ perk :: parsed request $% {$auth p/perk-auth} {$away $~} {$bugs p/?($as $to) $~} {$beam p/beam} {$deps p/?($put $delt) q/@uvH} {$mess p/dock q/mark r/wire s/json} {$poll p/{i/@uvH t/(list @uvH)}} {$spur p/spur} {$subs p/?($put $delt) q/{dock $json wire path}} {$view p/ixor q/{$~ u/@ud}} == :: ++ perk-auth :: parsed auth $% {$at p/pork} :: inject auth {$del p/(unit ship)} {$get him/ship rem/pork} {$js $~} {$json $~} {$try him/ship paz/(unit cord)} {$xen ses/hole rem/pork} == :: ++ pest :: result $@ $~ $% {$$ p/httr} :: direct response {$red $~} :: parent redirect {$bake p/whir q/mark r/coin s/beam} :: ford request {$js p/@t} :: script {$json p/json} :: data {$html p/manx} :: successful page {$htme p/manx} :: authentication fail == -- :: |% ++ eat-headers |= hed/(list {p/@t q/@t}) ^- math %+ roll hed |= {a/{p/cord q/cord} b/math} =. p.a (cass (trip p.a)) (~(add ja b) p.a q.a) :: ++ fcgi :: credential caboose |= {quy/quay ced/cred} ^- coin :+ %many [%blob ced] |- ^- (list coin) ?~ quy [%$ %n ~]~ [[%$ %t p.i.quy] [%$ %t q.i.quy] $(quy t.quy)] :: ++ gsig |=({a/dock b/path} [(scot %p p.a) q.a b]) ++ session-from-cookies |= {nam/@t maf/math} ^- (unit hole) (from-cookies maf |=({k/@t v/@} &(=(nam k) !=('~' v)))) :: ++ ship-from-cookies |= maf/math ^- (unit ship) (biff (from-cookies maf |=({k/@ @} =(%ship k))) (slat %p)) :: ++ from-cookies |= {maf/math fil/$-({@t @t} ?)} =+ `cot/(list @t)`(~(get ju maf) 'cookie') =+ `cok/quay`(zing `(list quay)`(murn cot (curr rush cock:epur))) |- ^- (unit cord) ?~ cok ~ ?:((fil i.cok) [~ q.i.cok] $(cok t.cok)) :: ++ wush |= {wid/@u tan/tang} ^- tape =+ rolt=|=(a/wall `tape`?~(a ~ :(weld i.a "\0a" $(a t.a)))) (rolt (turn tan |=(a/tank (rolt (wash 0^wid a))))) :: :: ++ add-cookies |= {cug/(list @t) hit/httr} ^- httr ?~ cug hit =+ cuh=(turn `(list @t)`cug |=(a/@t set-cookie+a)) hit(q (weld cuh q.hit)) :: ++ add-json :: inject window.urb |= {urb/json jaz/cord} ^- cord =- (cat 3 (crip -) jaz) """ var _urb = {(pojo urb)} window.urb = window.urb || \{}; for(k in _urb) window.urb[k] = _urb[k] """ :: ++ ares-to-json |= err/ares ^- json =- (jobe fail+s+typ mess+(jape mez) ~) ^- {typ/term mez/tape} ?~ err [%fail "Unknown Error"] [p.u.err (wush 160 q.u.err)] :: ++ resp :: mimed response |= {sas/@uG mit/mite rez/@} ^- httr :: (weld (turn cug |=(a=@t ['set-cookie' a])) [sas ~[content-type+(moon mit)] [~ (taco rez)]] :: ++ render-tang :: tanks to manx |= {dep/@uvH tan/tang} ;html ;head ;link(rel "stylesheet", href "/lib/base.css"); ;title: server error == ;body:div#c.err:pre:code:"{(wush 80 tan)}" ;script@"/~/on/{}.js"; == :: ++ favi :: XX favicon %+ can 6 :~ [20 0wf~.~0000.00000.00000.00000.00000.1g000.00002.000g0.00200.000g0. 000a0.001kU.001gE.02000.g0082.00000.C0005.a00w0.04001.0g008.00g00] :: [98 (fil 6 98 0w3.~~~~~)] [59 0wf~~~Z.jkRf~.OYLb~.~~~~~.~~~~~.~Z~vT.~LrSZ.~SNIr.fZnlR.v~CVK.r~~LX. -~~~~.~~~~~.~~~~~.~~~~~.~~~~~.~~~~~.rSZLY.Ib2P~.gA92~.XqSJL.-vDV~.~fzU-. ~M000.fY000.3~000.0~M00.0fZwo.63~-f.zU~~~.~~~~~.~~~~~.~~~~~.~~~~~.V-vD~. pStD~.M000f.Y0003.~0000.~M000.fZ6hA.r~GqC.F~X-~.L~Z7h.Qv~82.0w~~b.OYL~~. ~~~~~.~~~~~.~~~~~.~~~~~.~~~~~.~X-~L.-FGqD.~nlRt.~SRJr.v~3MY.f~~~~.~~~~~. ~~~~~.~~~Xu.TJ~Yv.7N~~~] :: [98 (fil 6 98 0w3.~~~~~)] [1 0wf~~] [63 (fil 6 63 0w0)] [11 0wf~~0.00000.00000.00000.00000.00050.00000.00200.0g000.40000.0w000.0a000] [389 (fil 6 389 0w3.~~~~~)] [3 0w~.~~~Xe.PI~~H.W-L~~] [9 (fil 6 9 0w3.~~~~~)] [6 0w~~.~~StD.p~VWu.DL-7x.Uv~Dp.St~Zv.nR~~~] [14 (fil 6 14 0w3.~~~~~)] [4 0w3~.~~~IX.eP~ez.EW~WG.GGL~~] [5 (fil 6 5 0w3.~~~~~)] [11 0wf~~~.-byUL.ZzoSf.~3MYf.~M000.fY000. 3~000.0~MQd.3vZik.Bb~Kb.yU~~P.Y~f~~] [11 (fil 6 11 0w3.~~~~~)] [13 0wfY.10g7~.gk51~.WOIHf.~RZvn.~~~~~.~~~~~. ~~~~~.~~W-L.H~QVe.jLY00.03~cj.4N~~b.OYL~~] [6 (fil 6 6 0wfY0)] [3 0w~.~~~Os.D9~Ok.B9vY0] [10 (fil 6 10 0w3.~~~~~)] [10 0wf.YJbiT.~sTdP.~VunB.~ZZvn.T~aiA.F~M00.0fY00.03~00.00~VG.qCL~~] [10 (fil 6 10 0wfY0)] [3 0w~.~~~Qt.7h~NI.r6~Y0] [9 (fil 6 9 0w3.~~~~~)] [3 0w3~5N.sn~Y~.fP~~~] [10 (fil 6 10 0wfY0)] [10 0w3~~~.-QJbj.~0000.~M000.fY000.3~6hA.p~SFG.qL-6x.Er~oC.9y~NU.u7LY0] [10 (fil 6 10 0w3.~~~~~)] [3 0w3~5h.kl~XG.WKL~~] [7 (fil 6 7 0wfY0)] [12 0w~~~~.~fPY~.QB9iv.Y0003.~k51g.~Z~vT.~~~~~. ~~~~~.~~~~~.~~~FW.uD~Cp.Cp~P8.OcLY0] [11 (fil 6 11 0w3.~~~~~)] [11 0wf~~~.~nRZv.-FGqD.~hQt7.~MEa2.LY000. 3~000.0~M00.0fY20.wb~i4.x8~YX.ePL~~] [5 (fil 6 5 0w3.~~~~~)] [4 0w3~.~~-~L.X~~lB.pm~~n.RZv~~] [13 (fil 6 13 0w3.~~~~~)] [7 0w3~~.~~kRd.j~DFW.u~Ue3.w~-ez.EX~Nc.j4~~P.Y~f~~] [9 (fil 6 9 0w3.~~~~~)] [3 0w~.~~~~L.X-~~H.W-L~~] [389 (fil 6 389 0w3.~~~~~)] [1 0wf~~] == :: ++ js :: static javascript |% ++ poll :: dependency long-poll ''' urb.tries = 0 urb.call = function() { urb.wreq = new XMLHttpRequest() urb.wreq.open('GET', "/~/on.json?"+urb.deps.join('&'), true) urb.wreq.addEventListener('load', function() { // if(~~(this.status / 100) == 4) // return document.write(this.responseText) if(this.status === 200) { var dep = JSON.parse(this.responseText) urb.onupdate(dep) urb.dewasp(dep) } urb.keep() }) urb.wreq.addEventListener('error', urb.keep) urb.wreq.addEventListener('abort', urb.keep) urb.wreq.send() } urb.keep = function() { setTimeout(urb.call,1000*urb.tries) urb.tries++ } urb.onupdate = function(){document.location.reload()} urb.call() urb.wasp = function(deh){ if (!deh) return; if (urb.deps.indexOf(deh) !== -1) return; urb.deps.push(deh) urb.wreq.abort() // trigger keep } urb.dewasp = function(deh){ var index = urb.deps.indexOf(deh) if (-1 !== index) { urb.deps.splice(index,1) urb.wreq.abort() // trigger keep } } ''' :: ++ auth-redir 'document.location.pathname = "/~~"+document.location.pathname' :: ++ auth ''' var req = function(url,dat,cb){ var xhr = new XMLHttpRequest() xhr.open('POST', url, true) dat.oryx = urb.oryx xhr.send(JSON.stringify(dat)) xhr.addEventListener('load', function(ev){ if(this.status !== 200) return err.innerHTML = ":( " + Date.now() + "\n" + xhr.responseText else if(cb) return cb(xhr.responseText,ev) }) } urb.foreign = /^\/~\/am/.test(window.location.pathname) urb.redir = function(ship){ if(ship) document.location.pathname = document.location.pathname.replace(/^\/~~|\/~\/as\/any/,'/~/as/~'+ship) else document.location = document.location.hash.match(/#[^?]+/)[0].slice(1) + document.location.pathname.replace( /^\/~\/am\/[^/]+/, '/~/as/~' + urb.ship) + document.location.search } if(urb.foreign && urb.auth.indexOf(urb.ship) !== -1){ req("/~/auth.json?PUT", {ship:urb.ship,code:null}, function(){urb.redir()}) } urb.is_me = function(ship) { return (urb.ship === ship) } urb.submit = function(ship,pass){ if(!urb.is_me(ship)) return urb.redir(ship) req( "/~/auth.json?PUT", {ship:ship, code:pass}, function(){ if(urb.foreign) urb.redir() else document.location.reload() }) } urb.away = function(){req("/~/auth.json?DELETE", {}, function(){document.getElementById("c").innerHTML = "" } )} ''' -- ++ xml |% ++ login-page %+ titl 'Sign in - Urbit' ;= ;div.container ;div.row ;div.col-md-4 ;h1.sign: Sign in == ;div.col-md-8 ;p.ship ;label.sig: ~ ;input#ship.mono(contenteditable "", placeholder "planet"); == ;input#pass.mono(type "password", placeholder "passcode"); ;h2.advice: Your passcode code has been printed to your console. ;pre:code#err; == == == ;script@"/~/at/~/auth.js"; ;script:''' $(function() { $ship = $('#ship') $pass = $('#pass') $ship.on('keydown', function(e) { if(e.keyCode === 13 || e.keyCode === 9) { if(!urb.is_me($ship.val().toLowerCase())) urb.redir($ship.val().toLowerCase()) $pass.show() $pass.focus() e.preventDefault() } }) $ship.on('focus', function(e) { $pass.hide() }) $pass.on('keydown', function(e) { if(e.keyCode === 13) { urb.submit($ship.val().toLowerCase(),$pass.val()) } }) if(window.ship) { $ship.val(urb.ship) $pass.focus() } else { $pass.hide() } }) ''' == :: ++ logout-page %+ titl 'Log out' ;= ;div.container ;div.row ;div.col-md-4 ;h1.sign: Bye! == ;div.col-md-8#c ;p.ship ;label.sig: ~ ;span#ship; == ;button#act(onclick "urb.away()"): Go ;pre:code#err; ;script@"/~/at/~/auth.js"; == == == == :: ++ poke-test %+ titl 'Poke' ;= ;button(onclick "urb.testPoke('/~/to/hood/helm-hi.json')"): Hi anonymous ;button(onclick "urb.testPoke('/~/as/own/~/to/hood/helm-hi.json')"): Hi ;pre:code#err; ;script@"/~/at/~/auth.js"; ;script:''' show = function(t){err.innerText = ":) " + Date.now() + "\n" + t} urb.testPoke = function(url){ req(url,{wire:"/",xyro:'test'}, show) } ''' == ++ titl |= {a/cord b/marl} ;html ;head ;meta(charset "utf-8"); ;meta(name "viewport", content "width=device-width, ". "height=device-height, initial-scale=1.0, user-scalable=0, ". "minimum-scale=1.0, maximum-scale=1.0"); ;title:"{(trip a)}" ;script(type "text/javascript", src "//cdnjs.cloudflare.com/ajax/". "libs/jquery/2.1.1/jquery.min.js"); ;link(rel "stylesheet", href "/lib/css/fonts.css"); ;link(rel "stylesheet", href "/lib/css/bootstrap.css"); == ;body:div#c:"*{b}" == -- -- |% :: functions ++ ye :: per event =| $: $: hen/duct :: event floor $: now/@da :: event date eny/@ :: unique entropy our/ship :: current ship sky/$-({* *} (unit)) :: system namespace == :: mow/(list move) :: pending actions == :: bolo :: all vane state == :: =* bol -> |% ++ abet :: resolve moves ^- {(list move) bolo} [(flop mow) bol] :: ++ adit .(ney (mix eny ney)) :: flip entropy :: ++ anon `@p`(add our ^~((bex 64))) :: pseudo-sub ++ apex :: accept request |= kyz/kiss ^+ +> =. our ?~(hov our u.hov) :: XX =. p.top our :: XX necessary? ?- -.kyz $born +>.$(ged hen) :: register external $serv =< ~&([%serving (tope top)] .) ?^(p.kyz +>.$(top p.kyz) +>.$(q.top p.kyz)) :: $crud +>.$(mow [[hen %slip %d %flog kyz] mow]) :: $init :: register ownership =. our ?~(hov p.kyz (min u.hov p.kyz)) +>.$(hov [~ our], top [[our %home ud+0] /web]) :: $this :: inbound request %- emule |. ^+ ..apex =* sec p.kyz :: ? :: https bit =* heq r.kyz :: httq :: request content =+ ryp=`quri`(rash q.heq zest:epur) =+ maf=(eat-headers r.heq) =+ ^= pul ^- purl ?- -.ryp $& ?>(=(sec p.p.p.ryp) p.ryp) $| =+ hot=(~(get ja maf) %host) ?> ?=({@ $~} hot) [[sec (rash i.hot thor:epur)] p.ryp q.ryp] == =. p.p.pul |(p.p.pul ?=(hoke r.p.pul)) =+ her=(host-to-ship r.p.pul) ?: |(?=($~ her) =(our u.her)) (handle pul [q.+.kyz |] [p.heq maf s.heq]) =+ han=(sham hen) =. pox (~(put by pox) han hen) (ames-gram u.her [%get ~] han +.kyz) :: $them :: outbound request ?~ p.kyz =+ sud=(need (~(get by kes) hen)) %= +>.$ mow :_(mow [ged [%give %thus sud ~]]) q.ask (~(del by q.ask) sud) kes (~(del by kes) hen) == :: ~& eyre-them+(earn p.u.p.kyz) %= +>.$ mow :_(mow [ged [%give %thus p.ask p.kyz]]) p.ask +(p.ask) q.ask (~(put by q.ask) p.ask hen u.p.kyz) kes (~(put by kes) hen p.ask) == :: $hiss :: outbound cage ::?~ p.kyz :: XX cancel :: =+ sud=(need (~(get by kes) hen)) :: %= +>.$ :: mow :_(mow [ged [%give %thus sud ~]]) :: q.ask (~(del by q.ask) sud) :: kes (~(del by kes) hen) :: == :: ~& eyre-them+(earn p.u.p.kyz) =+ wir=hi+/[p.kyz] ?: ?=($hiss p.q.kyz) (pass-note wir [%e %meta :(slop !>(%them) !>(~) q.q.kyz)]) (back wir %hiss q.kyz) :: $they :: inbound response =+ kas=(need (~(get by q.ask) p.kyz)) :: ~& > eyre-they+[p.q.kyz (earn p.q.kas)] %= +>.$ mow :_(mow [p.kas [%give %thou q.kyz]]) q.ask (~(del by q.ask) p.kas) == :: $thud :: cancel request ?. (~(has by lyv) hen) ~& dead-request+hen +>.$(ded (~(put in ded) hen)) :: uncaught requests =+ lid=(~(got by lyv) hen) :: ~& did-thud+[-.lid hen] ?- -.lid $exec (pass-note p.lid %f [%exec our ~]) :: $poll ?. (~(has by wix) p.lid) +>.$ poll-dead:(ire-ix p.lid) :: $xeno =+ han=(sham hen) =. pox (~(del by pox) han hen) (ames-gram p.lid [%gib ~] han) :: $wasp |- ^+ +>.^$ ?~ p.lid +>.^$ (del-deps:$(p.lid t.p.lid) i.p.lid %& hen) == :: $west :: remote request =. mow :_(mow [hen %give %mack ~]) =+ mez=((soft gram) q.kyz) ?~ mez ~& e+[%strange-west p.kyz] ~|(%strange-west !!) ?- -<.u.mez $aut abet:(logon:(ses-ya p.u.mez) q.p.kyz) $hat (foreign-hat:(ses-ya p.u.mez) q.p.kyz q.u.mez) $gib (pass-note ay+(dray p+uv+~ q.p.kyz p.u.mez) [%e %thud ~]) $get (pass-note ay+(dray p+uv+~ q.p.kyz p.u.mez) [%e %this q.u.mez]) $got ?. (~(has by pox) p.u.mez) ~& lost-gram-thou+p.kyz^p.u.mez +>.$ =: hen (~(got by pox) p.u.mez) pox (~(del by pox) p.u.mez) == (give-thou q.u.mez) :: $lon ~& ses-ask+[p.u.mez sop (~(run by wup) $~)] ?: (ses-authed p.u.mez) (ames-gram q.p.kyz aut+~ p.u.mez) =. sop (~(put by sop) p.u.mez q.p.kyz |) (ames-gram q.p.kyz hat+~ p.u.mez our-host) == :: $wegh !! :: handled elsewhere == :: ::++ axom :: old response :: |= [tee=whir hon=honk] :: ^+ +> :: ?+ tee !! :: ~ ?-(-.hon %nice (nice-json), %mean (mean-json 500 p.hon)) :: [%of @ ^] (get-ack:(ire-ix p.tee) q.tee hon) :: == ++ axon :: accept response |= {tee/whir typ/span sih/sign} ^+ +> =. our ?~(hov our u.hov) :: XX ?: &(?=({?($of $ow) ^} tee) !(~(has by wix) p.tee)) ~&(dead-ire+[`whir`tee ({term term $~} +.sih)] +>) ?- &2.sih $crud +>.$(mow [[hen %slip %d %flog +.sih] mow]) :: $dumb :: =. +> ?+(tee +> [%of ^] pop-duct:(ire-ix p.tee)) :: (emule |.(~|(gall-dumb+tee !!))) :: $woot +>.$ $thou ?+ -.tee !! $ay (ames-gram (slav %p p.tee) got+~ (slav %uv q.tee) |2.sih) $hi =+ cay=[%httr !>(`httr`p.sih)] ?: ?=($httr p.tee) (give-sigh %& cay) (back si+~ p.tee cay) == :: $unto :: app response ?> ?=({$of @ ^} tee) =+ cuf=`cuft`+>.sih ?- -.cuf ?($coup $reap) (get-ack:(ire-ix p.tee) q.tee ?~(p.cuf ~ `[-.cuf u.p.cuf])) :: $doff !! $diff ?. ?=($json p.p.cuf) :: ~> %slog.`%*(. >[%backing p.p.cuf %q-p-cuf]< &3.+> (sell q.p.cuf)) (back tee %json p.cuf) (get-rush:(ire-ix p.tee) q.tee ((hard json) q.q.p.cuf)) :: $quit ~&(quit+tee (get-quit:(ire-ix p.tee) q.tee)) == :: $wake ?> ?=({?($of $ow) @ $~} tee) ?: ?=($ow -.tee) abut:(ire-ix p.tee) => wake:(ire-ix p.tee) (give-json 200 ~ (joba %beat %b &)) :: $news :: dependency updated ?. ?=({$on $~} tee) ~&(e+lost+[tee hen] +>.$) %+ roll (~(tap in (~(get ju liz) p.sih))) =< .(con ..axon(liz (~(del by liz) p.sih))) |= {sus/(each duct ixor) con/_..axon} =. ..axon con ?- -.sus $& (give-json(hen p.sus) 200 ~ %s (scot %uv p.sih)) $| (get-even:(ire-ix p.sus) +.sih) == :: $made ?< ?=($tabl -.q.sih) =. our (need hov) :: XX |- ^+ ..axon ?- tee $@($~ {?($on $ay $ow) *}) ~|(e+ford+lost+tee !!) {$of @ $~} ~|(e+ford+lost+tee !!) {$si $~} (give-sigh q.sih) :: {$hi ^} ?: ?=($| -.q.sih) (give-sigh q.sih) :: XX crash? =* cay p.q.sih ?> ?=($hiss p.cay) (pass-note tee [%e %meta :(slop !>(%them) !>(~) q.cay)]) :: {$he *} :: XX hack =. ..axon $(tee p.tee) %_ ..axon mow %+ turn mow |= a/move ?+ q.a a {$give $thou *} a(r.p.p.q ~) {$pass ^} ?.(=(p.tee p.q.a) a a(p.q tee)) == == :: {$of @ ^} ?: ?=($| -.q.sih) ((slog p.q.sih) +>.^$) :: XX get-even %mean %+ get-rush:(ire-ix p.tee) q.tee ?> ?=($json p.p.q.sih) :: XX others ((hard json) q.q.p.q.sih) :: {$at ^} ?: ?=($| -.q.sih) $(tee q.tee) ?. ?=($js -.p.q.sih) ~& e+at-lost+[-.p.q.sih q.tee] $(tee q.tee) ?> ?=(@ q.q.p.q.sih) =+ cyz=(~(got by wup) p.tee) =^ jon ..ya ~(stat-json ya p.tee cyz) $(tee q.tee, q.q.p.q.sih (add-json jon q.q.p.q.sih)) :: {$ha *} %- emule |. ^+ ..apex ?. ?=($& -.q.sih) (fail 404 p.sih p.q.sih) =* cay p.q.sih ?: ?=($red-quri p.cay) =+ url=((hard quri) q.q.cay) (give-thou 307 [location+(crip (apex:earn url))]~ ~) ?. ?=($mime p.cay) =+ bek=-:(need (tome p.tee)) =+ bik=?+(r.bek bek {$ud $0} bek(r da+now)) (execute tee bik [%flag [p.sih `~] %cast %mime [%$ p.q.sih]]) ~| q.q.cay =+ ((hard {mit/mite rez/octs}) q.q.cay) =+ dep=(crip "W/{(pojo %s (scot %uv p.sih))}") (give-thou 200 ~[etag+dep content-type+(moon mit)] ~ rez) == == :: ++ emule |= a/_|?(..emule) ^+ ..emule =+ mul=(mule a) ?~ -.mul p.mul (fail 500 0v0 >%exit< p.mul) :: ++ ire-ix |=(ire/ixor ~(. ix ire (~(got by wix) ire))) :: ++ ses-authed |= ses/hole =+ sap=(~(get by sop) ses) ?: ?=({$~ @ $&} sap) & =+ cyz=(~(get by wup) ses) ?~ cyz | (~(has in aut.u.cyz) our) :: ++ ses-ya |=(ses/hole ~(. ya ses (~(got by wup) ses))) ++ our-host `hart`[& ~ %& /org/urbit/(rsh 3 1 (scot %p our))] :: [| [~ 8.443] `/localhost] :: XX testing :: ++ ames-gram |=({him/ship gam/gram} (pass-note ~ %a %wont [our him] [%e -.gam] +.gam)) :: ++ back :: %ford bounce |= {tea/whir mar/mark cay/cage} =+ bek=?+(r.top -.top {$ud $0} -.top(r da+now)) (pass-note tea (ford-req bek [%cast mar $+cay])) :: ++ del-deps |= {a/@uvH b/(each duct ixor)} ^+ +>.$ ?: =(`@`0 a) +>.$ =. liz (~(del ju liz) a b) :: ~& del-deps+[a (~(get ju liz) a)] ?: (~(has by liz) a) +>.$ =- -(hen hen.+) (pass-note(hen `~) on+~ %f [%wasp our a |]) :: ++ new-deps |= {a/@uvH b/(each duct ixor)} ^+ +>.$ :: ~& new-deps+[a b] ?: =(`@`0 a) +>.$ =+ had=(~(has by liz) a) =. liz (~(put ju liz) a b) ?: had +>.$ =- -(hen hen.+) (pass-note(hen `~) on+~ %f [%wasp our a &]) :: ++ ford-req |=({bek/beak kas/silk} [%f [%exec our `[bek kas]]]) ++ execute |= {tea/whir req/{beak silk}} =. lyv (~(put by lyv) hen [%exec tea]) (pass-note tea (ford-req req)) :: ++ fail |= {sas/@ud dep/@uvH mez/tang} ^+ +> :: (back ha+~ dep %tang !>(mez)) ::tang->urb chain may be source of failure (give-html sas ~ (render-tang dep mez)) :: ++ give-html |= {sas/@ud cug/(list @t) max/manx} %- give-thou %+ add-cookies cug (resp sas text+/html (crip (poxo max))) :: ++ give-json |= {sas/@uG cug/(list @t) jon/json} %- give-thou %+ add-cookies cug (resp sas application+/json (crip (pojo jon))) :: ++ give-thou :: done request |= hit/httr ?: (~(has in ded) hen) :: request closed +>(ded (~(del in ded) hen)) =. lyv (~(del by lyv) hen) +>(mow :_(mow [hen %give %thou hit])) :: ++ give-sigh :: userspace done |= res/(each cage tang) =- +>.$(mow :_(mow [hen %give %sigh `cage`-])) ?. ?=($| -.res) p.res [%tang !>(p.res)] :: ++ mean-json |=({sas/@uG err/ares} (give-json sas ~ (ares-to-json err))) ++ nice-json |=(* (give-json 200 ~ (joba %ok %b &))) :: ++ pass-note |=(noe/{whir note} +>(mow :_(mow [hen %pass noe]))) ++ host-to-ship :: host to ship |= hot/host ^- (unit ship) :: =+ gow=(~(get by dop) hot) :: XX trust :: ?^ gow gow ?. ?=($& -.hot) ~ =+ dom=(flop p.hot) :: domain name ?~ dom ~ (rush i.dom fed:ag) :: ++ load-secret ^- @ta =+ pax=/(scot %p our)/code/(scot %da now)/(scot %p our) %^ rsh 3 1 (scot %p (@ (need (sky [151 %noun] %a pax)))) :: :: ++ handle |= $: {hat/hart pok/pork quy/quay} :: purl parsed url {cip/clip aut/?} :: client ip nonymous? {mef/meth maf/math bod/(unit octs)} :: method+headers+body == =< apex |% ++ abet ..handle ++ done . ++ teba |*(a/$-(* ..handle) |*(b/* %_(done ..handle (a b)))) ++ execute (teba ^execute) ++ del-deps (teba ^del-deps) ++ new-deps (teba ^new-deps) ++ give-html (teba ^give-html) ++ give-thou (teba ^give-thou) ++ give-json (teba ^give-json) ++ nice-json (teba ^nice-json) ++ pass-note (teba ^pass-note) :: ++ fcgi-cred ^- cred ?: aut fcgi-cred:for-client %*(fcgi-cred for-client him anon) :: ++ apex =< abet ^+ done =+ oar=(host-to-ship r.hat) =. our ?~(oar our u.oar) :: XX =+ pez=process ?: ?=($| -.pez) p.pez (resolve ~ p.pez) :: ++ resolve |= {cug/(list @t) pez/pest} ^+ done ?~ pez done ?- -.pez $~ (give-thou (add-cookies cug p.pez)) $js $(pez [%$ (resp 200 text+/javascript p.pez)]) $json (give-json 200 cug p.pez) $html (give-html 200 cug p.pez) $htme (give-html 401 cug p.pez) $bake =+ req=[%bake mar=q.pez [r s]:pez] =+ red=req(mar %red-quri) (execute p.pez -.s.pez `silk`[%alts ~[red req]]) :: $red =+ url=(earn hat pok(p [~ %html]) quy) ?+ p.pok ~|(bad-redirect+[p.pok url] !!) {$~ $js} $(pez [%js auth-redir:js]) {$~ $json} $(pez [%json (jobe ok+b+| red+(jape url) ~)]) == == :: :: ++ is-anon =([~ ''] (~(get by (molt quy)) 'anon')) ++ check-oryx :: | if json with bad oryx ^- ? ?. &(?=({$~ $json} p.pok) ?=($post mef) ?=(^ bod) !is-anon) & =+ oxe=grab-oryx ?~ oxe | ?: (~(has in vew.cyz:for-client) u.oxe) & ~&(bad-oryx+[u.oxe vew.cyz:for-client] &) :: XX security :: ++ grab-json ?. ?=(?($post $put $delt) mef) ~ ?~(bod ~ (poja q.u.bod)) :: ++ need-body |*(a/fist:jo (need (biff grab-json a))) ++ grab-oryx ^- (unit oryx) =+ oxe=(biff grab-json (ot oryx+so ~):jo) ?^ oxe oxe (~(get by (molt quy)) %oryx) :: :: ++ parse ^- (each perk httr) |^ =+ hit=as-magic-filename ?^ hit [%| u.hit] ?: is-spur [%& %spur (flop q.pok)] =+ bem=as-beam ?^ bem [%& %beam u.bem] ?. check-oryx ~|(%bad-oryx ~|([grab-oryx vew.cyz:for-client] !!)) =+ hem=as-aux-request ?^ hem [%& u.hem] ~|(strange-path+q.pok !!) :: ++ as-magic-filename ^- (unit httr) ?+ [(fall p.pok %$) q.pok] ~ {?($ico $png) $favicon $~} :- ~ %^ resp 200 image+/png favi :: {$txt $robots $~} :- ~ %^ resp 200 text+/plain %- role :~ 'User-agent: *' 'Disallow: /' == == :: ++ is-spur |(?~(q.pok & ((sane %tas) i.q.pok))) ++ as-beam ^- (unit beam) ?~ q.pok ~ =+ ^- (unit {@ dez/desk rel/?}) :: /=desk/, /=desk=/ (rush i.q.pok ;~(plug tis sym ;~(pose (cold | tis) (easy &)))) ?~ - (tome q.pok) :: /~ship/desk/case/... :+ ~ [our dez.u r.top] ?. rel.u (flop t.q.pok) (weld (flop t.q.pok) s.top) :: /=desk/... as hoon /=desk%/... :: ++ as-aux-request :: /~/... req parser ^- (unit perk) =. mef ?. ?=($post mef) mef ?+ (skim quy |=({a/@t b/@t} &(=('' b) =(a (cuss (trip a)))))) ~|(bad-quy+[req='"?PUT" or "?DELETE"' quy] !!) $~ mef {{$'DELETE' $~} $~} %delt {{$'PUT' $~} $~} %put == |- ?: ?=({$'~~' *} q.pok) :: auth shortcuts $(q.pok ['~' %as %own t.q.pok]) ?. ?=({$'~' @ *} q.pok) ~ :- ~ ^- perk =* pef i.t.q.pok =+ but=t.t.q.pok :: XX =* ?+ pef ~|(pfix-lost+`path`/~/[pef] !!) $debug ((hard perk) [%bugs but]) $away [%away ~] $at [%auth %at pok(q but)] $am ?~(but !! [%auth %xen i.but pok(q t.but)]) $as :+ %auth %get ~| bad-ship+?~(but ~ i.but) ?~ but !! :_ pok(q t.but) ?+ i.but (slav %p i.but) $anon anon $own (fall (ship-from-cookies maf) our) == :: $on :- %poll ?^ but [(raid but %uv ~)]~ =+ dep=((hard (list {@ $~})) quy) =< ?~(. !! .) (turn dep |=({a/@tas $~} (slav %uv a))) :: $of :+ %view ?>(?=({@ $~} but) i.but) ?> ?=({{$poll @} $~} quy) :: XX eventsource [~ (rash q.i.quy dem)] :: $to =+ ^- dir/{p/ship q/term r/mark} ~| bad-mess+but ?+ but !! {@ @ $~} [our (raid but %tas %tas ~)] {@ @ @ $~} (raid but %p %tas %tas ~) == :^ %mess [p q]:dir r.dir =+ wir=(~(get by (molt quy)) 'wire') ?^ wir [(stab u.wir) (need grab-json)] :: XX distinguish (need-body (ot wire+(cu stab so) xyro+some ~):jo) :: $in ~| expect+[%post 'application+json' /'@uv' '?PUT/DELETE'] ?> &(?=(?($delt $put) mef) ?=($@($~ {$~ $json}) p.pok)) [%deps mef (raid but %uv ~)] :: $is ?~ but ~|(no-app+but=but !!) |- ^- perk ?~ p.pok $(p.pok [~ %json]) ?. ?=($json u.p.pok) ~|(is+stub+u.p.pok !!) :: XX marks ?: ((sane %tas) i.but) $(but [(scot %p our) but]) ?> ?=(?($delt $put) mef) =+ :- hap=[(slav %p i.but) (slav %tas -.t.but)] wir=(need-body (ot wire+(cu stab so) ~):jo) [%subs mef hap u.p.pok wir +.t.but] :: $auth :- %auth |- ^- perk-auth ?+ p.pok !! $~ $(p.pok [~ %json]) {$~ $js} [%js ~] {$~ $json} ?+ mef ~|(bad-meth+mef !!) $get [%json ~] $put ~| parsing+bod [%try (need-body (ot ship+(su fed:ag) code+(mu so) ~):jo)] :: $delt ~| parsing+bod =+ jon=(need (poja q:(need bod))) ?> ?=($o -.jon) =+ sip=(~(get by p.jon) %ship) [%del ?~(sip ~ [~ (need ((su:jo fed:ag) u.sip))])] == == == -- :: :: process-payload handles the translation of a payload for post. :: currently this involves treating the payload as a urlencoded :: request. In the future it's possible the payload could be :: a specific mark instead. :: ++ process-payload ^- {quay meth} ?+ mef [quy mef] $post [`quay`(weld quy `quay`(rash q:(need bod) yquy:urlp)) %get] == ++ process ^- (each pest _done) =+ pet=parse ?: ?=($| -.pet) [%& %$ p.pet] (process-parsed p.pet) :: ++ process-parsed |= hem/perk ^- (each pest _done) ?- -.hem $auth (process-auth p.hem) $away [%& %html logout-page:xml] ?($beam $spur) =^ payload mef process-payload =+ ext=(fall p.pok %urb) =+ bem=?-(-.hem $beam p.hem, $spur [-.top (weld p.hem s.top)]) ~| bad-beam+q.bem ?< =([~ 0] (sky %cw (tope bem(+ ~, r [%da now])))) =+ wir=`whir`[%ha (tope -.bem ~)] =. wir ?+(mef !! $get wir, $head [%he wir]) =. r.bem ?+(r.bem r.bem {$ud $0} da+now) =+ arg=(fcgi payload fcgi-cred) =+ [%bake wir ext arg bem] ?.(aut [%& `pest`-] [%| `_done`(resolve ~ -)]) :: $bugs ?- p.hem $as (show-login-page) $to [%& %html poke-test:xml] == :: $deps =+ ire=need-ixor ?> (~(has by wix) ire) :: XX made redundant by oryx checking =< [%| (nice-json)] ?- p.hem $put (new-deps q.hem %| ire) $delt (del-deps q.hem %| ire) == :: $mess :- %| =^ orx ..ya ?:(is-anon new-view:for-client [(need grab-oryx) ..ya]) =+ vew=(ire-ix (oryx-to-ixor orx)) ((teba new-mess.vew) p.hem r.hem q.hem %json !>(`json`s.hem)) :: $poll ?: ?=({$~ $js} p.pok) :: XX treat non-json cases? =+ deps=[%a (turn `(list @uvH)`p.hem |=(a/@ s+(scot %uv a)))] [%& %js (add-json (joba %deps deps) poll:js)] =. lyv (~(put by lyv) hen %wasp p.hem) |- =. done (new-deps i.p.hem %& hen) ?~ t.p.hem [%| done] $(p.hem t.p.hem) :: $subs ?- p.hem $put [%| ((teba add-subs:for-view) q.hem)] $delt [%| ((teba del-subs:for-view) q.hem)] == :: $view ~| lost-ixor+p.hem [%| ((teba poll:(ire-ix p.hem)) u.q.hem)] == :: ++ process-auth |= ham/perk-auth ^- (each pest _done) =+ yac=for-client ?- -.ham $js [%& %js auth:js] $json =^ jon ..ya stat-json.yac [%| (give-json 200 ~ jon)] $xen (show-login-page ~ ses.ham) :: $at =. ..ya abet.yac =+ pez=process(pok p.ham, aut |) ?. ?=($& -.pez) ~|(no-inject+p.ham !!) ?~ p.pez pez ?+ -.p.pez ~&(bad-inject+p.pez !!) $red pez $bake =. ya abet.yac [%| (resolve ~ p.pez(p [%at ses.yac p.p.pez]))] :: $js =^ jon ..ya stat-json.yac [%| (resolve cug.yac p.pez(p (add-json jon p.p.pez)))] == :: $del =. ..ya (logoff:yac p.ham) =+ cug=[(set-cookie cookie-prefix '~')]~ [%| (give-json 200 cug (joba %ok %b &))] :: $get |- ~| aute+ham ?: |(=(anon him.ham) (~(has in aut.yac) him.ham)) =. ..ya abet.yac(him him.ham) =+ pez=process(pok rem.ham, aut &) ?: ?=($| -.pez) pez [%| (resolve ~ p.pez)] ?. =(our him.ham) [%| ((teba foreign-auth.yac) him.ham hat rem.ham quy)] (show-login-page ~) :: $try :- %| ?. =(our him.ham) ~|(stub-foreign+him.ham !!) ?. ?| (~(has in aut.yac) him.ham) ?~(paz.ham | =(u.paz.ham load-secret)) == ~& code=`@t`load-secret ~|([%try 'code' %in %console] !!) :: XX security =^ jon ..ya stat-json:(logon:yac him.ham) =. cug.yac :_(cug.yac (set-cookie %ship (scot %p him.ham))) (give-json 200 cug.yac jon) == :: ++ show-login-page |= ses/(unit hole) ^- (each pest _done) %- (slog leaf+"login code for {(scow %p our)}: {(trip load-secret)}" ~) ?. ?=($@($~ {$~ $html}) p.pok) [%& %red ~] ?~ ses [%& %htme login-page:xml] ?: (~(has by wup) u.ses) [%& %htme login-page:xml] =+ yac=(new-ya u.ses) =+ =- lon=?~(- | (~(has in aut.u.-) our)) (biff (session-from-cookies cookie-prefix maf) ~(get by wup)) =. yac ?.(lon yac (logon.yac our)) [%| (give-html(..ya abet.yac) 401 cug.yac login-page:xml)] :: ++ cookie-prefix (rsh 3 1 (scot %p our)) ++ cookie-domain ^- cord ?- r.hat {$| @} (cat 3 '; Domain=' (rsh 3 1 (scot %if p.r.hat))) {$& $org $urbit *} '; Domain=.urbit.org' {$& @ @ *} =- (rap 3 "; Domain={-}{i.p.r.hat ~}") (turn (flop `path`t.p.r.hat) |=(a/knot (cat 3 a '.'))) {$& *} '' :: XX security? == :: ++ set-cookie |= {key/@t val/@t} %+ rap 3 :~ key '=' val :: '; HttpOnly' ?.(sec '' '; Secure') :: XX security cookie-domain '; Path=/; HttpOnly' == ++ need-ixor (oryx-to-ixor (need grab-oryx)) ++ for-view ^+(ix (ire-ix need-ixor)) :: ++ for-client :: stateful per-session engine ^+ ya =+ pef=cookie-prefix =+ lig=(session-from-cookies pef maf) ?~ lig (new-ya (rsh 3 1 (scot %p (end 6 1 ney)))) =+ cyz=(~(get by wup) u.lig) ?~ cyz ~& bad-cookie+u.lig (new-ya (rsh 3 1 (scot %p (end 6 1 ney)))) ~(. ya u.lig u.cyz(cug ~)) :: ++ new-ya |=(ses/hole ~(. ya ses (new-cyst ses))) ++ new-cyst |= ses/hole =* sec p.hat ^- cyst :* ^- cred :* hat(p sec) ~ 'not-yet-implemented' ::(rsh 3 1 (scot %p (end 6 1 (shaf %oryx ses)))) :: =+ lag=(~(get by maf) %accept-language) ?~(lag ~ ?~(u.lag ~ [~ i.u.lag])) :: cip ~ == [anon ~] :: [(set-cookie cookie-prefix ses)]~ :: now ~ ~ :: [1 ~] == -- :: ++ oryx-to-ixor |=(a/oryx (rsh 3 1 (scot %p (end 6 1 (shas %ire a))))) ++ ya :: session engine =| {ses/hole cyst} =* cyz -> |% ++ abet ..ya(wup (~(put by wup) ses cyz)) ++ abut ..ya(wup (~(del by wup) ses)) ++ foreign-auth |= {him/ship pul/purl} ^+ ..ya =. way (~(put by way) him pul hen) ~& asking-foreign+him (ames-gram:abet him [lon+~ ses]) :: ++ foreign-hat |= {him/ship hat/hart} ^+ ..ya ~| way =^ pul hen (~(got by way) him) =: way (~(del by way) him) dop (~(put by dop) r.hat him) q.q.pul ['~' %am ses q.q.pul] == =+ url=(welp (earn pul(p hat)) '#' (head:earn p.pul)) %- give-thou:abet (add-cookies cug [307 [location+(crip url)]~ ~]) :: ++ logon |= her/ship %_ +> him her aut (~(put in aut) her) ..ya ~& logon+[our her ses] ?. =(our her) ..ya =+ sap=(~(get by sop) ses) ~& sap ?. ?=({$~ @ $|} sap) ..ya (ames-gram -.u.sap aut+~ ses) == ++ logoff |= her/(unit ship) ^+ ..ya ?~ her abut =. aut (~(del in aut) u.her) ?~ aut abut abet(him ?.(=(u.her him) him n.aut)) :: ++ new-view ^+ [*oryx ..ya] =+ orx=`@t`(rsh 3 1 (scot %p (shaf %orx eny))) =. vew (~(put in vew) orx) =+ ire=(oryx-to-ixor orx) =. ..ix ~(init ix ire %*(. *stem him him, p.eve 1)) :: ~& stat-ire+`@t`ire [orx abet] :: ++ fcgi-cred %_(ced aut (~(put ju aut.ced) %$ (scot %p him))) ++ stat-json ^+ [*json ..ya] =^ orx ..ya new-view :_ ..ya %- jobe :~ oryx+s+orx ixor+s+(oryx-to-ixor orx) ship+(jape +:) user+(jape +:) auth+a+(turn (~(tap in aut)) |=(a/@p (jape +:))) == -- :: ++ ix =| {ire/ixor stem} =* sem -> |% ++ done . ++ abet ..ix(wix (~(put by wix) ire sem)) ++ abut =+ sub=(~(tap in sus)) |- ^+ ..ix ?^ sub $(sub t.sub, ..ix (pul-subs i.sub)) =. +> poll-rest ..ix(wix (~(del by wix) ire)) :: ++ teba |*(a/$-(* ..ix) |*(b/* %_(done ..ix (a b)))) ++ give-json (teba ^give-json) ++ pass-note (teba ^pass-note) ++ hurl-note |= {a/{dock path} b/note} ^+ ..ix =: med (~(put to med) hen) hen `~ == :: ~& > hurl+[&2.b ire a] (pass-note:abet [%of ire (gsig a)] b) :: ++ init =. die (add ~d1 now) abet(mow :_(mow [`/ %pass ow+/[ire] [%b %wait die]])) :: ++ refresh =. mow :_(mow [`/ %pass ow+/[ire] [%b %rest die]]) =. die (add ~d1 now) done(mow :_(mow [`/ %pass ow+/[ire] [%b %wait die]])) :: ++ add-even |= a/even ^+ eve [+(p.eve) (~(put by q.eve) p.eve a)] :: ++ new-mess |= {a/dock b/wire c/mark d/cage} ^+ ..ix (hurl-note [a b] [%g %deal [him -.a] +.a %punk c d]) :: ++ add-subs |= {a/dock $json b/wire c/path} ^+ ..ix ?: (~(has in sus) +<) ~|(duplicate+c !!) =. sus (~(put in sus) +<) (hurl-note [a b] [%g %deal [him -.a] +.a %peel %json c]) :: ++ pul-subs |= {a/dock $json b/wire c/path} ^+ ..ix =. sus (~(del in sus) +<) (hurl-note [a b] [%g %deal [him -.a] +.a %pull ~]) :: ++ del-subs :: XX per path? |= {a/dock $json b/wire c/path} ^+ ..ix =. ..ix (pul-subs +<) (nice-json:pop-duct:(ire-ix ire)) :: XX gall ack :: ++ get-rush |= {a/whir-of b/json} ^+ ..ix (get-even [%rush [[(slav %p p.a) q.a] r.a] (joba %json b)]) :: ++ get-quit |= a/whir-of ^+ ..ix (get-even [%quit [[(slav %p p.a) q.a] r.a]]) :: ++ get-ack |= {a/whir-of b/(unit {term tang})} ^+ ..ix ?: =(~ med) ~& resp-lost+ire ..ix ?~ b (nice-json:pop-duct) (mean-json:pop-duct 500 b) :: ++ get-even |= ven/even ^+ ..ix =+ num=p.eve =. eve (add-even ven) =< abet ?~ ude done =. hen p.u.ude (give-even:pass-rest(ude ~) q.u.ude num ven) :: ++ give-even |= {pol/? num/@u ven/even} ^+ done =: q.eve (~(del by q.eve) (dec num)) :: TODO ponder a-2 mow ?.(?=($rush -.ven) mow mow:(pass-took p.ven)) == ?> pol :: XX eventstream %^ give-json 200 ~ %^ jobe id+(jone num) type+[%s -.ven] ?- -.ven $news ~[from+[%s (scot %uv p.ven)]] $quit ~[from+(subs-to-json p.ven)] $rush ~[from+(subs-to-json p.ven) data+q.ven] == :: ++ pass-wait (pass-note of+/[ire] [%b %wait era]) ++ pass-rest =. lyv (~(del by lyv) hen) (pass-note of+/[ire] [%b %rest era]) :: ++ pass-took |= a/{p/dock wire} %+ pass-note(hen `~) [%of ire (gsig a)] [%g %deal [him -.p.a] +.p.a %pump ~] :: ++ pop-duct =^(ned med ~(get to med) abet(hen ned)) ++ poll |= a/@u ^+ ..ix =< abet =. ..poll refresh ?: =(a p.eve) =. ..poll poll-rest =. era (add ~s30 now) =. lyv (~(put by lyv) hen [%poll ire]) pass-wait(ude [~ hen &]) ?: (gth a p.eve) ~|(seq-high+cur=p.eve !!) =+ ven=~|(seq-low+cur=p.eve (~(got by q.eve) a)) (give-even & a ven) :: ++ poll-rest ?~ ude done %*(. pass-rest(hen p.u.ude) hen hen) :: ++ poll-dead ^+ ..ix =< abet ?. =(ude [~ hen &]) done :: old long poll pass-rest(ude ~) :: ++ subs-to-json |= {a/dock b/path} %- jobe :~ ship+[%s (rsh 3 1 (scot %p p.a))] appl+[%s q.a] path+(jape (spud b)) == ++ wake ^+(..ix abet(ude ~)) :: XX other effects? :: XX unused ++ print-subs |=({a/dock b/path} "{}/{(trip q.a)}{(spud b)}") -- -- -- . == =| bolo =* bol - |= {now/@da eny/@ ski/sley} :: activate ^? :: opaque core |% :: ++ call :: handle request |= $: hen/duct hic/(hypo (hobo kiss)) == => %= . :: XX temporary q.hic ^- kiss ?: ?=($soft -.q.hic) ((hard kiss) p.q.hic) ?: (~(nest ut -:!>(*kiss)) | p.hic) q.hic ~& [%eyre-call-flub (@tas `*`-.q.hic)] ((hard kiss) q.hic) == ^+ [p=*(list move) q=..^$] ?: ?=($wegh -.q.hic) :_ ..^$ :_ ~ :^ hen %give %mass :- %eyre :- %| :~ dependencies+[%& liz] sessions+[%& wup] views+[%& wix] ducts+[%| ~[dead+[%& ded] proxy+[%& pox] outgoing+[%& ask]]] hosts+[%& dop] misc+[%& bol] == =+ our=`@p`0x100 :: XX sentinel =+ ska=(sloy ski) =+ sky=|=({* *} `(unit)`=+(a=(ska +<) ?~(a ~ ?~(u.a ~ [~ u.u.a])))) =. ney (shax :(mix (shax now) +(eny) ney)) :: XX!! shd not need ^+ [p=*(list move) q=..^$] =. gub ?.(=(`@`0 gub) gub (cat 3 (rsh 3 1 (scot %p (end 6 1 eny))) '-')) =^ mos bol abet:(apex:~(adit ye [hen [now eny our sky] ~] bol) q.hic) [mos ..^$] :: ++ doze :: require no timer |= {now/@da hen/duct} ^- (unit @da) ~ :: ++ load :: take previous state |= old/bolo ..^$(+>- old) :: ++ scry |= {fur/(unit (set monk)) ren/@tas who/ship syd/desk lot/coin tyl/path} ^- (unit (unit cage)) =+ our=(need hov) :: XX single home =+ ska=(sloy ski) =+ sky=|=({* *} `(unit)`=+(a=(ska +<) ?~(a ~ ?~(u.a ~ [~ u.u.a])))) ?. ?=($$ ren) [~ ~] ?. ?=($$ -.lot) [~ ~] ?+ syd [~ ~] $host %- (lift (lift |=(a/hart [%hart !>(a)]))) ^- (unit (unit hart)) ?. =(our who) ?. =([%da now] p.lot) [~ ~] ~& [%e %scry-foreign-host who] ~ :: XX add non-scry binding to $hat gram =. p.lot ?.(=([%da now] p.lot) p.lot [%tas %real]) ?+ p.lot [~ ~] {$tas $fake} ``[& [~ 8.443] %& /localhost] :: XX from unix {$tas $real} ``~(our-host ye [`duct`~[/] [now eny our sky] ~] bol) == == :: ++ stay `bolo`+>-.$ ++ take :: accept response |= {tea/wire hen/duct hin/(hypo sign)} ^+ [p=*(list move) q=..^$] =+ our=`@p`0x100 :: XX sentinel =+ ska=(sloy ski) =+ sky=|=({* *} `(unit)`=+(a=(ska +<) ?~(a ~ ?~(u.a ~ [~ u.u.a])))) =. ney (shax :(mix (shax now) +(eny) ney)) :: XX!! shd not need ^+ [p=*(list move) q=..^$] =. gub ?.(=(`@`0 gub) gub (cat 3 (rsh 3 1 (scot %p (end 6 1 eny))) '-')) =+ tee=((soft whir) tea) ?~ tee ~& [%e %lost -.q.hin hen] [~ ..^$] =^ mos bol =< abet %^ axon:~(adit ye [hen [now eny our sky] ~] bol) u.tee (~(peek ut p.hin) %free 3) q.hin [mos ..^$] --