mirror of
https://github.com/urbit/shrub.git
synced 2024-11-28 22:33:06 +03:00
ddb61adbd1
No reason conversion to octs has to happen outside of this function.
214 lines
5.3 KiB
Plaintext
214 lines
5.3 KiB
Plaintext
/- lens, *sole
|
|
/+ base64, *server, default-agent
|
|
/= lens-mark /mar/lens/command :: TODO: ask clay to build a $tube
|
|
=, format
|
|
|%
|
|
:: +lens-out: json or named octet-stream
|
|
::
|
|
+$ lens-out
|
|
$% [%json =json]
|
|
[%mime =mime]
|
|
==
|
|
+$ state
|
|
$% $: %0
|
|
job=(unit [eyre-id=@ta com=command:lens])
|
|
==
|
|
==
|
|
--
|
|
::
|
|
=| =state
|
|
|_ =bowl:gall
|
|
+* this .
|
|
def ~(. (default-agent this %|) bowl)
|
|
::
|
|
++ on-init on-init:def
|
|
++ on-save !>(state)
|
|
++ on-load
|
|
|= old=vase
|
|
`this(state !<(^state old))
|
|
::
|
|
++ on-poke
|
|
|= [=mark =vase]
|
|
^- (quip card:agent:gall _this)
|
|
?. ?=(%handle-http-request mark)
|
|
(on-poke:def mark vase)
|
|
=+ !<([eyre-id=@ta =inbound-request:eyre] vase)
|
|
?> ?=(~ job.state)
|
|
::
|
|
=/ request-line (parse-request-line url.request.inbound-request)
|
|
=/ site (flop site.request-line)
|
|
::
|
|
=/ jon=json
|
|
(need (de-json:html q:(need body.request.inbound-request)))
|
|
=/ com=command:lens
|
|
(json:grab:lens-mark jon)
|
|
::
|
|
?: ?=(%export -.source.com)
|
|
~& [%export app.source.com]
|
|
:_ this(job.state (some [eyre-id com]))
|
|
[%pass /export %agent [our.bowl app.source.com] %watch /export]~
|
|
::
|
|
?: ?=(%import -.source.com)
|
|
?~ enc=(de:base64 base64-jam.source.com)
|
|
!!
|
|
::
|
|
=/ c=* (cue q.u.enc)
|
|
::
|
|
:_ this(job.state (some [eyre-id com]))
|
|
[%pass /import %agent [our.bowl app.source.com] %poke %import !>(c)]~
|
|
::
|
|
:_ this(job.state (some [eyre-id com]))
|
|
[%pass /sole %agent [our.bowl %dojo] %watch /sole/[eyre-id]]~
|
|
::
|
|
++ on-watch
|
|
|= =path
|
|
^- (quip card:agent:gall _this)
|
|
?: ?=([%http-response *] path)
|
|
`this
|
|
(on-watch:def path)
|
|
::
|
|
++ on-leave on-leave:def
|
|
++ on-peek on-peek:def
|
|
++ on-agent
|
|
|= [=wire =sign:agent:gall]
|
|
^- (quip card:agent:gall _this)
|
|
|^
|
|
?+ wire (on-agent:def wire sign)
|
|
[%import ~]
|
|
?> ?=(%poke-ack -.sign)
|
|
?> ?=(^ job.state)
|
|
:_ this(job.state ~)
|
|
%+ give-simple-payload:app eyre-id.u.job.state
|
|
[[200 ~] `(as-octt:mimes:html "\"Imported data\"")]
|
|
::
|
|
[%export ~]
|
|
?+ -.sign (on-agent:def wire sign)
|
|
%watch-ack
|
|
?~ p.sign
|
|
`this
|
|
?> ?=(^ job.state)
|
|
:_ this(job.state ~)
|
|
(give-simple-payload:app eyre-id.u.job.state not-found:gen)
|
|
::
|
|
%fact
|
|
=^ cards this (take-export !<(* q.cage.sign))
|
|
:_ this(job.state ~)
|
|
:_ cards
|
|
?> ?=(^ job.state)
|
|
?> ?=(%export -.source.com.u.job.state)
|
|
[%pass /export %agent [our.bowl app.source.com.u.job.state] %leave ~]
|
|
==
|
|
::
|
|
[%sole ~]
|
|
?+ -.sign (on-agent:def wire sign)
|
|
%watch-ack
|
|
?> ?=(^ job.state)
|
|
?^ p.sign
|
|
:_ this(job.state ~)
|
|
(give-simple-payload:app eyre-id.u.job.state not-found:gen)
|
|
:_ this :_ ~
|
|
:* %pass /sole
|
|
%agent [our.bowl %dojo]
|
|
%poke %lens-command !>
|
|
[eyre-id.u.job.state com.u.job.state]
|
|
==
|
|
::
|
|
%fact
|
|
?> ?=(%sole-effect p.cage.sign)
|
|
=^ cards this (take-sole-effect !<(sole-effect q.cage.sign))
|
|
[[[%pass /sole %agent [our.bowl %dojo] %leave ~] cards] this]
|
|
==
|
|
==
|
|
::
|
|
++ take-export
|
|
|= data=*
|
|
^- (quip card:agent:gall _this)
|
|
?> ?=(^ job.state)
|
|
?> ?=(%export -.source.com.u.job.state)
|
|
=/ app-name=tape (trip app.source.com.u.job.state)
|
|
=/ output=@t (crip "/{app-name}/jam")
|
|
::
|
|
=/ jon=json
|
|
=/ =atom (jam data)
|
|
=/ =octs [(met 3 atom) atom]
|
|
=/ enc (en:base64 octs)
|
|
(pairs:enjs:format file+s+output data+s+enc ~)
|
|
::
|
|
:_ this
|
|
%+ give-simple-payload:app eyre-id.u.job.state
|
|
(json-response:gen jon)
|
|
::
|
|
++ take-sole-effect
|
|
|= fec=sole-effect
|
|
^- (quip card:agent:gall _this)
|
|
=/ out
|
|
|- ^- (unit lens-out)
|
|
=* loop $
|
|
?+ -.fec
|
|
~
|
|
::
|
|
%tan
|
|
%- some
|
|
:- %json
|
|
%- wall:enjs:format
|
|
(turn (flop p.fec) |=(=tank ~(ram re tank)))
|
|
::
|
|
%txt
|
|
(some %json s+(crip p.fec))
|
|
::
|
|
%sag
|
|
%- some
|
|
[%mime p.fec (as-octs:mimes:html (jam q.fec))]
|
|
::
|
|
%sav
|
|
:: XX use +en:base64 or produce %mime a la %sag
|
|
::
|
|
%- some
|
|
:- %json
|
|
%- pairs:enjs:format
|
|
:~ file+s+(crip <`path`p.fec>)
|
|
data+s+(crip (en-base64:mimes:html q.fec))
|
|
==
|
|
::
|
|
%mor
|
|
=/ all `(list lens-out)`(murn p.fec |=(a=sole-effect loop(fec a)))
|
|
?~ all ~
|
|
~| [%multiple-effects all]
|
|
?> ?=(~ t.all)
|
|
(some i.all)
|
|
==
|
|
::
|
|
?~ out
|
|
[~ this]
|
|
::
|
|
?> ?=(^ job.state)
|
|
:_ this(job.state ~)
|
|
%+ give-simple-payload:app eyre-id.u.job.state
|
|
?- -.u.out
|
|
%json
|
|
(json-response:gen json.u.out)
|
|
::
|
|
%mime
|
|
=/ headers
|
|
:~ ['content-type' 'application/octet-stream']
|
|
?> ?=([@ @ ~] p.mime.u.out)
|
|
:- 'content-disposition'
|
|
^- @t
|
|
%^ cat 3
|
|
'attachment; filename='
|
|
(rap 3 '"' i.p.mime.u.out '.' i.t.p.mime.u.out '"' ~)
|
|
==
|
|
[[200 headers] (some q.mime.u.out)]
|
|
==
|
|
--
|
|
::
|
|
++ on-arvo
|
|
|= [=wire =sign-arvo]
|
|
^- (quip card:agent:gall _this)
|
|
?. ?=(%bound +<.sign-arvo)
|
|
(on-arvo:def wire sign-arvo)
|
|
[~ this]
|
|
::
|
|
++ on-fail on-fail:def
|
|
--
|