Add urbit-uniswap proxy
Some checks failed
Lint Checks / Run linter (pull_request) Successful in 1m5s
Lint Checks / Run linter (push) Successful in 1m28s
Smoke Test / Run basic test suite (pull_request) Successful in 4m3s
Deploy Test / Run deploy test suite (pull_request) Successful in 4m48s
Webapp Test / Run webapp test suite (pull_request) Failing after 5m7s
K8s Deploy Test / Run deploy test suite on kind/k8s (pull_request) Successful in 8m19s
Some checks failed
Lint Checks / Run linter (pull_request) Successful in 1m5s
Lint Checks / Run linter (push) Successful in 1m28s
Smoke Test / Run basic test suite (pull_request) Successful in 4m3s
Deploy Test / Run deploy test suite (pull_request) Successful in 4m48s
Webapp Test / Run webapp test suite (pull_request) Failing after 5m7s
K8s Deploy Test / Run deploy test suite on kind/k8s (pull_request) Successful in 8m19s
This commit is contained in:
parent
7f0452cd73
commit
e7aa2e944f
@ -7,12 +7,12 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
- REACT_APP_INFURA_KEY=${CERC_INFURA_KEY}
|
- REACT_APP_INFURA_KEY=${CERC_INFURA_KEY}
|
||||||
- REACT_APP_AWS_API_ENDPOINT=${CERC_UNISWAP_GQL}
|
- REACT_APP_AWS_API_ENDPOINT=${CERC_UNISWAP_GQL}
|
||||||
|
- REACT_APP_UNISWAP_API_URL=${CERC_UNISWAP_API}
|
||||||
command: ["./build-app.sh"]
|
command: ["./build-app.sh"]
|
||||||
volumes:
|
volumes:
|
||||||
- ../config/uniswap-interface/build-app.sh:/app/build-app.sh
|
- ../config/uniswap-interface/build-app.sh:/app/build-app.sh
|
||||||
- urbit_app_builds:/app-builds
|
- urbit_app_builds:/app-builds
|
||||||
- ../config/uniswap-interface/urbit-files/mar:/app/mar
|
- ../config/uniswap-interface/urbit-files:/app/urbit-files
|
||||||
- ../config/uniswap-interface/urbit-files/desk.docket-0:/app/desk.docket-0
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
urbit_app_builds:
|
urbit_app_builds:
|
||||||
|
@ -15,7 +15,5 @@ yarn build
|
|||||||
|
|
||||||
# Copy over build and other files to app-builds for urbit deployment
|
# Copy over build and other files to app-builds for urbit deployment
|
||||||
mkdir -p /app-builds/uniswap
|
mkdir -p /app-builds/uniswap
|
||||||
cp -r ./build /app-builds/uniswap/
|
cp -r urbit-files /app-builds/uniswap/
|
||||||
|
cp -r ./build /app-builds/uniswap/urbit-files
|
||||||
cp -r mar /app-builds/uniswap/
|
|
||||||
cp desk.docket-0 /app-builds/uniswap/
|
|
||||||
|
@ -0,0 +1,225 @@
|
|||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
::
|
||||||
|
:: Proxy server
|
||||||
|
:: ------------
|
||||||
|
::
|
||||||
|
:: This is a simple agent which accepts requests at the path given in the `on-init` arm-- in this
|
||||||
|
:: case, "/apps/uniswap-proxy/"-- and proxies them to the upstream, in this case,
|
||||||
|
:: "https://api.uniswap.org/".
|
||||||
|
::
|
||||||
|
:: For example, assuming your ship is running on `localhost:8080`, a request to the url
|
||||||
|
::
|
||||||
|
:: `http://localhost:8080/apps/uniswap-proxy/v1/graphql`
|
||||||
|
::
|
||||||
|
:: will be proxied to
|
||||||
|
::
|
||||||
|
:: `https://api.uniswap.org/v1/graphql`
|
||||||
|
::
|
||||||
|
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
|
||||||
|
::
|
||||||
|
/+ dbug, server, default-agent
|
||||||
|
::
|
||||||
|
|%
|
||||||
|
+$ card card:agent:gall
|
||||||
|
+$ state
|
||||||
|
$% %0
|
||||||
|
==
|
||||||
|
--
|
||||||
|
::
|
||||||
|
:: Path config
|
||||||
|
|%
|
||||||
|
++ base-url-path /apps/uniswap-proxy :: HTTP path on the ship that this agent will bind to
|
||||||
|
++ upstream-api-url "https://api.uniswap.org/" :: Upstream HTTP api that requests should be proxied to
|
||||||
|
--
|
||||||
|
::
|
||||||
|
%- agent:dbug
|
||||||
|
::
|
||||||
|
=| state
|
||||||
|
=* state -
|
||||||
|
::
|
||||||
|
^- agent:gall
|
||||||
|
=<
|
||||||
|
|_ =bowl:gall
|
||||||
|
+* this .
|
||||||
|
default ~(. (default-agent this) bowl)
|
||||||
|
::
|
||||||
|
++ on-init
|
||||||
|
^- (quip card _this)
|
||||||
|
:_ this
|
||||||
|
:~
|
||||||
|
[%pass /eyre/connect %arvo %e %connect [~ base-url-path] %proxy]
|
||||||
|
==
|
||||||
|
::
|
||||||
|
++ on-poke
|
||||||
|
|= [=mark =vase]
|
||||||
|
^- (quip card _this)
|
||||||
|
:_ this :: We have no state
|
||||||
|
?+ mark (on-poke:default mark vase)
|
||||||
|
%handle-http-request
|
||||||
|
=/ [eyre-id=@ta inbound-req=inbound-request:eyre] !<([@ta =inbound-request:eyre] vase)
|
||||||
|
~& "Eyre id: {<eyre-id>}"
|
||||||
|
=/ old-req request:inbound-req
|
||||||
|
=/ new-req=request:http
|
||||||
|
%= old-req
|
||||||
|
:: Remove path prefix from the url, replace with Uniswap domain and path prefix
|
||||||
|
url (rewrite-path url:old-req)
|
||||||
|
:: Change the "Origin" header to match the upstream (this is hacky as fuck and will break eventually)
|
||||||
|
header-list (rewrite-headers header-list:old-req)
|
||||||
|
==
|
||||||
|
~& "Proxying {<url.old-req>} to {<url.new-req>}"
|
||||||
|
~& "Outgoing headers: {<header-list:new-req>}"
|
||||||
|
:~
|
||||||
|
[%pass /response/[eyre-id] %arvo %i %request new-req *outbound-config:iris]
|
||||||
|
==
|
||||||
|
==
|
||||||
|
::
|
||||||
|
++ on-arvo
|
||||||
|
|= [=wire =sign-arvo]
|
||||||
|
^- (quip card _this)
|
||||||
|
:_ this :: We don't have any state
|
||||||
|
?+ sign-arvo (on-arvo:default wire sign-arvo)
|
||||||
|
::
|
||||||
|
:: Arvo will respond when we initially connect to Eyre in `on-init`. We will accept (and ignore)
|
||||||
|
:: that and reject any other communications.
|
||||||
|
[%eyre %bound *]
|
||||||
|
~& "Got eyre bound: {<sign-arvo>}"
|
||||||
|
~
|
||||||
|
[%iris %http-response %finished *]
|
||||||
|
?+ wire (on-arvo:default wire sign-arvo)
|
||||||
|
[%response @ ~]
|
||||||
|
=/ original-eyre-id=@ta (snag 1 `(list @ta)`wire)
|
||||||
|
=/ resp=client-response:iris +:+:sign-arvo
|
||||||
|
?> ?= %finished -.resp
|
||||||
|
=/ resp-header=response-header:http response-header:resp
|
||||||
|
=/ the-octs=octs data:(need full-file:resp)
|
||||||
|
::
|
||||||
|
=/ thedata=@t q.the-octs
|
||||||
|
~& resp-header
|
||||||
|
~& "Proxied HTTP {<status-code:resp-header>}: {<thedata>}"
|
||||||
|
%+ give-simple-payload:app:server
|
||||||
|
original-eyre-id
|
||||||
|
:- %_(resp-header headers [['Content-type'^'application/json'] ~])
|
||||||
|
`the-octs
|
||||||
|
==
|
||||||
|
==
|
||||||
|
::
|
||||||
|
:: Each time Eyre pokes a request to us, it will subscribe for the response. We will just accept
|
||||||
|
:: those connections (wire = /http-response/[eyre-id]) and reject any others.
|
||||||
|
:: See: https://docs.urbit.org/system/kernel/eyre/reference/tasks#connect
|
||||||
|
++ on-watch
|
||||||
|
|= =path
|
||||||
|
^- (quip card _this)
|
||||||
|
?+ path (on-watch:default path)
|
||||||
|
[%http-response *]
|
||||||
|
`this
|
||||||
|
==
|
||||||
|
::
|
||||||
|
++ on-save on-save:default
|
||||||
|
++ on-load on-load:default
|
||||||
|
++ on-leave on-leave:default
|
||||||
|
++ on-peek on-peek:default
|
||||||
|
++ on-agent on-agent:default
|
||||||
|
++ on-fail on-fail:default
|
||||||
|
--
|
||||||
|
::
|
||||||
|
:: Helpers core
|
||||||
|
|%
|
||||||
|
:: Rewrites a path like "/apps/uniswap-proxy/v1/graphql" to "https://api.uniswap.org/v1/graphql".
|
||||||
|
:: `url-path` is a path, not a full URL!
|
||||||
|
++ rewrite-path
|
||||||
|
|= [url-path=@t]
|
||||||
|
%+ rash
|
||||||
|
url-path
|
||||||
|
:: Prepend the `upstream-api-url` base url and convert back to a cord
|
||||||
|
%+ cook
|
||||||
|
|= [a=tape]
|
||||||
|
(crip (weld upstream-api-url a))
|
||||||
|
:: Strip the base path
|
||||||
|
;~ pfix
|
||||||
|
(ifix [(just '/') (just '/')] (jest (crip (join '/' `(list @t)`base-url-path))))
|
||||||
|
(star prn)
|
||||||
|
==
|
||||||
|
::
|
||||||
|
:: Change the 'Origin' http header to "https://api.uniswap.org".
|
||||||
|
:: I don't know why this makes the request work, but it does.
|
||||||
|
:: Also drop the "x-forwarded-for" header for Red Horizon; otherwise this breaks it.
|
||||||
|
++ rewrite-headers
|
||||||
|
|= [headers=header-list:http]
|
||||||
|
^- header-list:http
|
||||||
|
=/ ret *header-list:http
|
||||||
|
|-
|
||||||
|
?~ headers
|
||||||
|
ret
|
||||||
|
%= $
|
||||||
|
ret ?+ (crip (cass (trip key:(head headers))))
|
||||||
|
::
|
||||||
|
:: Default: use the header
|
||||||
|
(snoc ret (head headers))
|
||||||
|
::
|
||||||
|
:: Drop "x-forwarded-for" header
|
||||||
|
%'x-forwarded-for'
|
||||||
|
ret
|
||||||
|
::
|
||||||
|
:: Drop the "cookie" header, which contains the Urbit auth token (!)
|
||||||
|
%'cookie'
|
||||||
|
ret
|
||||||
|
::
|
||||||
|
:: Rewrite "origin" header
|
||||||
|
%'origin'
|
||||||
|
(snoc ret ['origin' 'https://api.uniswap.org'])
|
||||||
|
==
|
||||||
|
headers +.headers
|
||||||
|
==
|
||||||
|
::
|
||||||
|
:: Manually construct a card that can be passed to iris, simulating a Uniswap graphql request.
|
||||||
|
:: Can be useful for testing purposes.
|
||||||
|
++ iris-request-card
|
||||||
|
::
|
||||||
|
:: The resulting card produces an HTTP request equivalent to the following cURL command:
|
||||||
|
::
|
||||||
|
:: curl 'https://api.uniswap.org/v1/graphql' \
|
||||||
|
:: -H 'authority: interface.gateway.uniswap.org' \
|
||||||
|
:: -H 'accept: */*' \
|
||||||
|
:: -H 'accept-language: en-US,en;q=0.7' \
|
||||||
|
:: -H 'content-type: application/json' \
|
||||||
|
:: -H 'origin: https://app.uniswap.org' \
|
||||||
|
:: -H 'referer: https://app.uniswap.org/' \
|
||||||
|
:: -H 'sec-ch-ua: "Not A(Brand";v="99", "Brave";v="121", "Chromium";v="121"' \
|
||||||
|
:: -H 'sec-ch-ua-mobile: ?0' \
|
||||||
|
:: -H 'sec-ch-ua-platform: "Linux"' \
|
||||||
|
:: -H 'sec-fetch-dest: empty' \
|
||||||
|
:: -H 'sec-fetch-mode: cors' \
|
||||||
|
:: -H 'sec-fetch-site: same-site' \
|
||||||
|
:: -H 'sec-gpc: 1' \
|
||||||
|
:: -H 'user-agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36' \
|
||||||
|
:: --data-raw $'{"operationName":"TokenSpotPrice","variables":{"address":null,"chain":"ETHEREUM"},"query":"query TokenSpotPrice($chain: Chain\u0021, $address: String = null) {\\n token(chain: $chain, address: $address) {\\n id\\n address\\n chain\\n name\\n symbol\\n project {\\n id\\n markets(currencies: [USD]) {\\n id\\n price {\\n id\\n value\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n}"}' \
|
||||||
|
:: --compressed
|
||||||
|
::
|
||||||
|
=/ the-request=request:http
|
||||||
|
:* %'POST' 'https://api.uniswap.org/v1/graphql'
|
||||||
|
:~ ['Accept-Language' 'en-US,en']
|
||||||
|
['Cache-Control' 'no-cache']
|
||||||
|
['Connection' 'keep-alive']
|
||||||
|
['Origin' 'http://localhost:8080']
|
||||||
|
['Pragma' 'no-cache']
|
||||||
|
['Referer' 'http://localhost:8080/']
|
||||||
|
['Sec-Fetch-Dest' 'empty']
|
||||||
|
['Sec-Fetch-Mode' 'cors']
|
||||||
|
['Sec-Fetch-Site' 'same-site']
|
||||||
|
['Sec-GPC' '1']
|
||||||
|
['User-Agent' 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36']
|
||||||
|
['accept' '*/*']
|
||||||
|
['content-type' 'application/json']
|
||||||
|
['sec-ch-ua' '"Not A(Brand";v="99", "Brave";v="121", "Chromium";v="121"']
|
||||||
|
['sec-ch-ua-mobile' '?0']
|
||||||
|
['sec-ch-ua-platform' '"Linux"']
|
||||||
|
==
|
||||||
|
:- ~ %- as-octs:mimes:html
|
||||||
|
'''
|
||||||
|
{"operationName":"TokenSpotPrice","variables":{"address":null,"chain":"ETHEREUM"},"query":"query TokenSpotPrice($chain: Chain\u0021, $address: String = null) {\n token(chain: $chain, address: $address) {\n id\n address\n chain\n name\n symbol\n project {\n id\n markets(currencies: [USD]) {\n id\n price {\n id\n value\n __typename\n }\n __typename\n }\n __typename\n }\n __typename\n }\n}"}
|
||||||
|
'''
|
||||||
|
==
|
||||||
|
:~
|
||||||
|
[%pass /response/1 %arvo %i %request the-request *outbound-config:iris]
|
||||||
|
==
|
||||||
|
--
|
@ -0,0 +1,2 @@
|
|||||||
|
:~ %proxy
|
||||||
|
==
|
@ -0,0 +1,155 @@
|
|||||||
|
:: dbug: agent wrapper for generic debugging tools
|
||||||
|
::
|
||||||
|
:: usage: %-(agent:dbug your-agent)
|
||||||
|
::
|
||||||
|
|%
|
||||||
|
+$ poke
|
||||||
|
$% [%bowl ~]
|
||||||
|
[%state grab=cord]
|
||||||
|
[%incoming =about]
|
||||||
|
[%outgoing =about]
|
||||||
|
==
|
||||||
|
::
|
||||||
|
+$ about
|
||||||
|
$@ ~
|
||||||
|
$% [%ship =ship]
|
||||||
|
[%path =path]
|
||||||
|
[%wire =wire]
|
||||||
|
[%term =term]
|
||||||
|
==
|
||||||
|
::
|
||||||
|
++ agent
|
||||||
|
|= =agent:gall
|
||||||
|
^- agent:gall
|
||||||
|
!.
|
||||||
|
|_ =bowl:gall
|
||||||
|
+* this .
|
||||||
|
ag ~(. agent bowl)
|
||||||
|
::
|
||||||
|
++ on-poke
|
||||||
|
|= [=mark =vase]
|
||||||
|
^- (quip card:agent:gall agent:gall)
|
||||||
|
?. ?=(%dbug mark)
|
||||||
|
=^ cards agent (on-poke:ag mark vase)
|
||||||
|
[cards this]
|
||||||
|
=/ dbug
|
||||||
|
!<(poke vase)
|
||||||
|
=; =tang
|
||||||
|
((%*(. slog pri 1) tang) [~ this])
|
||||||
|
?- -.dbug
|
||||||
|
%bowl [(sell !>(bowl))]~
|
||||||
|
::
|
||||||
|
%state
|
||||||
|
=? grab.dbug =('' grab.dbug) '-'
|
||||||
|
=; product=^vase
|
||||||
|
[(sell product)]~
|
||||||
|
=/ state=^vase
|
||||||
|
:: if the underlying app has implemented a /dbug/state scry endpoint,
|
||||||
|
:: use that vase in place of +on-save's.
|
||||||
|
::
|
||||||
|
=/ result=(each ^vase tang)
|
||||||
|
(mule |.(q:(need (need (on-peek:ag /x/dbug/state)))))
|
||||||
|
?:(?=(%& -.result) p.result on-save:ag)
|
||||||
|
%+ slap
|
||||||
|
(slop state !>([bowl=bowl ..zuse]))
|
||||||
|
(ream grab.dbug)
|
||||||
|
::
|
||||||
|
%incoming
|
||||||
|
=; =tang
|
||||||
|
?^ tang tang
|
||||||
|
[%leaf "no matching subscriptions"]~
|
||||||
|
%+ murn
|
||||||
|
%+ sort ~(tap by sup.bowl)
|
||||||
|
|= [[* a=[=ship =path]] [* b=[=ship =path]]]
|
||||||
|
(aor [path ship]:a [path ship]:b)
|
||||||
|
|= [=duct [=ship =path]]
|
||||||
|
^- (unit tank)
|
||||||
|
=; relevant=?
|
||||||
|
?. relevant ~
|
||||||
|
`>[path=path from=ship duct=duct]<
|
||||||
|
?: ?=(~ about.dbug) &
|
||||||
|
?- -.about.dbug
|
||||||
|
%ship =(ship ship.about.dbug)
|
||||||
|
%path ?=(^ (find path.about.dbug path))
|
||||||
|
%wire %+ lien duct
|
||||||
|
|=(=wire ?=(^ (find wire.about.dbug wire)))
|
||||||
|
%term !!
|
||||||
|
==
|
||||||
|
::
|
||||||
|
%outgoing
|
||||||
|
=; =tang
|
||||||
|
?^ tang tang
|
||||||
|
[%leaf "no matching subscriptions"]~
|
||||||
|
%+ murn
|
||||||
|
%+ sort ~(tap by wex.bowl)
|
||||||
|
|= [[[a=wire *] *] [[b=wire *] *]]
|
||||||
|
(aor a b)
|
||||||
|
|= [[=wire =ship =term] [acked=? =path]]
|
||||||
|
^- (unit tank)
|
||||||
|
=; relevant=?
|
||||||
|
?. relevant ~
|
||||||
|
`>[wire=wire agnt=[ship term] path=path ackd=acked]<
|
||||||
|
?: ?=(~ about.dbug) &
|
||||||
|
?- -.about.dbug
|
||||||
|
%ship =(ship ship.about.dbug)
|
||||||
|
%path ?=(^ (find path.about.dbug path))
|
||||||
|
%wire ?=(^ (find wire.about.dbug wire))
|
||||||
|
%term =(term term.about.dbug)
|
||||||
|
==
|
||||||
|
==
|
||||||
|
::
|
||||||
|
++ on-peek
|
||||||
|
|= =path
|
||||||
|
^- (unit (unit cage))
|
||||||
|
?. ?=([@ %dbug *] path)
|
||||||
|
(on-peek:ag path)
|
||||||
|
?+ path [~ ~]
|
||||||
|
[%u %dbug ~] ``noun+!>(&)
|
||||||
|
[%x %dbug %state ~] ``noun+!>(on-save:ag)
|
||||||
|
[%x %dbug %subscriptions ~] ``noun+!>([wex sup]:bowl)
|
||||||
|
==
|
||||||
|
::
|
||||||
|
++ on-init
|
||||||
|
^- (quip card:agent:gall agent:gall)
|
||||||
|
=^ cards agent on-init:ag
|
||||||
|
[cards this]
|
||||||
|
::
|
||||||
|
++ on-save on-save:ag
|
||||||
|
::
|
||||||
|
++ on-load
|
||||||
|
|= old-state=vase
|
||||||
|
^- (quip card:agent:gall agent:gall)
|
||||||
|
=^ cards agent (on-load:ag old-state)
|
||||||
|
[cards this]
|
||||||
|
::
|
||||||
|
++ on-watch
|
||||||
|
|= =path
|
||||||
|
^- (quip card:agent:gall agent:gall)
|
||||||
|
=^ cards agent (on-watch:ag path)
|
||||||
|
[cards this]
|
||||||
|
::
|
||||||
|
++ on-leave
|
||||||
|
|= =path
|
||||||
|
^- (quip card:agent:gall agent:gall)
|
||||||
|
=^ cards agent (on-leave:ag path)
|
||||||
|
[cards this]
|
||||||
|
::
|
||||||
|
++ on-agent
|
||||||
|
|= [=wire =sign:agent:gall]
|
||||||
|
^- (quip card:agent:gall agent:gall)
|
||||||
|
=^ cards agent (on-agent:ag wire sign)
|
||||||
|
[cards this]
|
||||||
|
::
|
||||||
|
++ on-arvo
|
||||||
|
|= [=wire =sign-arvo]
|
||||||
|
^- (quip card:agent:gall agent:gall)
|
||||||
|
=^ cards agent (on-arvo:ag wire sign-arvo)
|
||||||
|
[cards this]
|
||||||
|
::
|
||||||
|
++ on-fail
|
||||||
|
|= [=term =tang]
|
||||||
|
^- (quip card:agent:gall agent:gall)
|
||||||
|
=^ cards agent (on-fail:ag term tang)
|
||||||
|
[cards this]
|
||||||
|
--
|
||||||
|
--
|
@ -0,0 +1,65 @@
|
|||||||
|
|= [agent=agent:gall]
|
||||||
|
|_ =bowl:gall
|
||||||
|
++ on-init
|
||||||
|
`agent
|
||||||
|
::
|
||||||
|
++ on-save
|
||||||
|
!>(~)
|
||||||
|
::
|
||||||
|
++ on-load
|
||||||
|
|= old-state=vase
|
||||||
|
`agent
|
||||||
|
::
|
||||||
|
++ on-poke
|
||||||
|
|= =cage
|
||||||
|
~| "unexpected poke to {<dap.bowl>} with mark {<p.cage>}"
|
||||||
|
!!
|
||||||
|
::
|
||||||
|
++ on-watch
|
||||||
|
|= =path
|
||||||
|
~| "unexpected subscription to {<dap.bowl>} on path {<path>}"
|
||||||
|
!!
|
||||||
|
::
|
||||||
|
++ on-leave
|
||||||
|
|= path
|
||||||
|
`agent
|
||||||
|
::
|
||||||
|
++ on-peek
|
||||||
|
|= =path
|
||||||
|
~| "unexpected scry into {<dap.bowl>} on path {<path>}"
|
||||||
|
!!
|
||||||
|
::
|
||||||
|
++ on-agent
|
||||||
|
|= [=wire =sign:agent:gall]
|
||||||
|
^- (quip card:agent:gall _agent)
|
||||||
|
?- -.sign
|
||||||
|
%poke-ack
|
||||||
|
?~ p.sign
|
||||||
|
`agent
|
||||||
|
%- (slog leaf+"poke failed from {<dap.bowl>} on wire {<wire>}" u.p.sign)
|
||||||
|
`agent
|
||||||
|
::
|
||||||
|
%watch-ack
|
||||||
|
?~ p.sign
|
||||||
|
`agent
|
||||||
|
=/ =tank leaf+"subscribe failed from {<dap.bowl>} on wire {<wire>}"
|
||||||
|
%- (slog tank u.p.sign)
|
||||||
|
`agent
|
||||||
|
::
|
||||||
|
%kick `agent
|
||||||
|
%fact
|
||||||
|
~| "unexpected subscription update to {<dap.bowl>} on wire {<wire>}"
|
||||||
|
~| "with mark {<p.cage.sign>}"
|
||||||
|
!!
|
||||||
|
==
|
||||||
|
::
|
||||||
|
++ on-arvo
|
||||||
|
|= [=wire =sign-arvo]
|
||||||
|
~| "unexpected system response {<sign-arvo>} to {<dap.bowl>} on wire {<wire>}"
|
||||||
|
!!
|
||||||
|
::
|
||||||
|
++ on-fail
|
||||||
|
|= [=term =tang]
|
||||||
|
%- (slog leaf+"error in {<dap.bowl>}" >term< tang)
|
||||||
|
`agent
|
||||||
|
--
|
@ -0,0 +1,159 @@
|
|||||||
|
=, eyre
|
||||||
|
|%
|
||||||
|
+$ request-line
|
||||||
|
$: [ext=(unit @ta) site=(list @t)]
|
||||||
|
args=(list [key=@t value=@t])
|
||||||
|
==
|
||||||
|
:: +parse-request-line: take a cord and parse out a url
|
||||||
|
::
|
||||||
|
++ parse-request-line
|
||||||
|
|= url=@t
|
||||||
|
^- request-line
|
||||||
|
(fall (rush url ;~(plug apat:de-purl:html yque:de-purl:html)) [[~ ~] ~])
|
||||||
|
::
|
||||||
|
++ manx-to-octs
|
||||||
|
|= man=manx
|
||||||
|
^- octs
|
||||||
|
(as-octt:mimes:html (en-xml:html man))
|
||||||
|
::
|
||||||
|
++ json-to-octs
|
||||||
|
|= jon=json
|
||||||
|
^- octs
|
||||||
|
(as-octs:mimes:html (en:json:html jon))
|
||||||
|
::
|
||||||
|
++ app
|
||||||
|
|%
|
||||||
|
::
|
||||||
|
:: +require-authorization:
|
||||||
|
:: redirect to the login page when unauthenticated
|
||||||
|
:: otherwise call handler on inbound request
|
||||||
|
::
|
||||||
|
++ require-authorization
|
||||||
|
|= $: =inbound-request:eyre
|
||||||
|
handler=$-(inbound-request:eyre simple-payload:http)
|
||||||
|
==
|
||||||
|
^- simple-payload:http
|
||||||
|
::
|
||||||
|
?: authenticated.inbound-request
|
||||||
|
~! this
|
||||||
|
~! +:*handler
|
||||||
|
(handler inbound-request)
|
||||||
|
::
|
||||||
|
=- [[307 ['location' -]~] ~]
|
||||||
|
%^ cat 3
|
||||||
|
'/~/login?redirect='
|
||||||
|
url.request.inbound-request
|
||||||
|
::
|
||||||
|
:: +require-authorization-simple:
|
||||||
|
:: redirect to the login page when unauthenticated
|
||||||
|
:: otherwise pass through simple-paylod
|
||||||
|
::
|
||||||
|
++ require-authorization-simple
|
||||||
|
|= [=inbound-request:eyre =simple-payload:http]
|
||||||
|
^- simple-payload:http
|
||||||
|
::
|
||||||
|
?: authenticated.inbound-request
|
||||||
|
~! this
|
||||||
|
simple-payload
|
||||||
|
::
|
||||||
|
=- [[307 ['location' -]~] ~]
|
||||||
|
%^ cat 3
|
||||||
|
'/~/login?redirect='
|
||||||
|
url.request.inbound-request
|
||||||
|
::
|
||||||
|
++ give-simple-payload
|
||||||
|
|= [eyre-id=@ta =simple-payload:http]
|
||||||
|
^- (list card:agent:gall)
|
||||||
|
=/ header-cage
|
||||||
|
[%http-response-header !>(response-header.simple-payload)]
|
||||||
|
=/ data-cage
|
||||||
|
[%http-response-data !>(data.simple-payload)]
|
||||||
|
:~ [%give %fact ~[/http-response/[eyre-id]] header-cage]
|
||||||
|
[%give %fact ~[/http-response/[eyre-id]] data-cage]
|
||||||
|
[%give %kick ~[/http-response/[eyre-id]] ~]
|
||||||
|
==
|
||||||
|
--
|
||||||
|
++ gen
|
||||||
|
|%
|
||||||
|
::
|
||||||
|
++ max-1-da ['cache-control' 'max-age=86400']
|
||||||
|
++ max-1-wk ['cache-control' 'max-age=604800']
|
||||||
|
::
|
||||||
|
++ html-response
|
||||||
|
=| cache=?
|
||||||
|
|= =octs
|
||||||
|
^- simple-payload:http
|
||||||
|
:_ `octs
|
||||||
|
[200 [['content-type' 'text/html'] ?:(cache [max-1-wk ~] ~)]]
|
||||||
|
::
|
||||||
|
++ css-response
|
||||||
|
=| cache=?
|
||||||
|
|= =octs
|
||||||
|
^- simple-payload:http
|
||||||
|
:_ `octs
|
||||||
|
[200 [['content-type' 'text/css'] ?:(cache [max-1-wk ~] ~)]]
|
||||||
|
::
|
||||||
|
++ js-response
|
||||||
|
=| cache=?
|
||||||
|
|= =octs
|
||||||
|
^- simple-payload:http
|
||||||
|
:_ `octs
|
||||||
|
[200 [['content-type' 'text/javascript'] ?:(cache [max-1-wk ~] ~)]]
|
||||||
|
::
|
||||||
|
++ png-response
|
||||||
|
=| cache=?
|
||||||
|
|= =octs
|
||||||
|
^- simple-payload:http
|
||||||
|
:_ `octs
|
||||||
|
[200 [['content-type' 'image/png'] ?:(cache [max-1-wk ~] ~)]]
|
||||||
|
::
|
||||||
|
++ svg-response
|
||||||
|
=| cache=?
|
||||||
|
|= =octs
|
||||||
|
^- simple-payload:http
|
||||||
|
:_ `octs
|
||||||
|
[200 [['content-type' 'image/svg+xml'] ?:(cache [max-1-wk ~] ~)]]
|
||||||
|
::
|
||||||
|
++ ico-response
|
||||||
|
|= =octs
|
||||||
|
^- simple-payload:http
|
||||||
|
[[200 [['content-type' 'image/x-icon'] max-1-wk ~]] `octs]
|
||||||
|
::
|
||||||
|
++ woff2-response
|
||||||
|
=| cache=?
|
||||||
|
|= =octs
|
||||||
|
^- simple-payload:http
|
||||||
|
[[200 [['content-type' 'font/woff2'] max-1-wk ~]] `octs]
|
||||||
|
::
|
||||||
|
++ json-response
|
||||||
|
=| cache=_|
|
||||||
|
|= =json
|
||||||
|
^- simple-payload:http
|
||||||
|
:_ `(json-to-octs json)
|
||||||
|
[200 [['content-type' 'application/json'] ?:(cache [max-1-da ~] ~)]]
|
||||||
|
::
|
||||||
|
++ manx-response
|
||||||
|
=| cache=_|
|
||||||
|
|= man=manx
|
||||||
|
^- simple-payload:http
|
||||||
|
:_ `(manx-to-octs man)
|
||||||
|
[200 [['content-type' 'text/html'] ?:(cache [max-1-da ~] ~)]]
|
||||||
|
::
|
||||||
|
++ not-found
|
||||||
|
^- simple-payload:http
|
||||||
|
[[404 ~] ~]
|
||||||
|
::
|
||||||
|
++ login-redirect
|
||||||
|
|= =request:http
|
||||||
|
^- simple-payload:http
|
||||||
|
=- [[307 ['location' -]~] ~]
|
||||||
|
%^ cat 3
|
||||||
|
'/~/login?redirect='
|
||||||
|
url.request
|
||||||
|
::
|
||||||
|
++ redirect
|
||||||
|
|= redirect=cord
|
||||||
|
^- simple-payload:http
|
||||||
|
[[307 ['location' redirect]~] ~]
|
||||||
|
--
|
||||||
|
--
|
@ -0,0 +1,34 @@
|
|||||||
|
|_ bil=(list dude:gall)
|
||||||
|
++ grow
|
||||||
|
|%
|
||||||
|
++ mime `^mime`[/text/x-bill (as-octs:mimes:html hoon)]
|
||||||
|
++ noun bil
|
||||||
|
++ hoon
|
||||||
|
^- @t
|
||||||
|
|^ (crip (of-wall:format (wrap-lines (spit-duz bil))))
|
||||||
|
::
|
||||||
|
++ wrap-lines
|
||||||
|
|= taz=wall
|
||||||
|
^- wall
|
||||||
|
?~ taz ["~"]~
|
||||||
|
:- (weld ":~ " i.taz)
|
||||||
|
%- snoc :_ "=="
|
||||||
|
(turn t.taz |=(t=tape (weld " " t)))
|
||||||
|
::
|
||||||
|
++ spit-duz
|
||||||
|
|= duz=(list dude:gall)
|
||||||
|
^- wall
|
||||||
|
(turn duz |=(=dude:gall ['%' (trip dude)]))
|
||||||
|
--
|
||||||
|
++ txt (to-wain:format hoon)
|
||||||
|
--
|
||||||
|
++ grab
|
||||||
|
|%
|
||||||
|
++ noun (list dude:gall)
|
||||||
|
++ mime
|
||||||
|
|= [=mite len=@ud tex=@]
|
||||||
|
~_ tex
|
||||||
|
!<((list dude:gall) (slap !>(~) (ream tex)))
|
||||||
|
--
|
||||||
|
++ grad %noun
|
||||||
|
--
|
@ -0,0 +1,36 @@
|
|||||||
|
:::: /hoon/hoon/mar
|
||||||
|
::
|
||||||
|
/? 310
|
||||||
|
::
|
||||||
|
=, eyre
|
||||||
|
|_ own=@t
|
||||||
|
::
|
||||||
|
++ grow :: convert to
|
||||||
|
|%
|
||||||
|
++ mime `^mime`[/text/x-hoon (as-octs:mimes:html own)] :: convert to %mime
|
||||||
|
++ hymn
|
||||||
|
;html
|
||||||
|
;head
|
||||||
|
;title:"Source"
|
||||||
|
;script@"//cdnjs.cloudflare.com/ajax/libs/codemirror/4.3.0/codemirror.js";
|
||||||
|
;script@"/lib/syntax/hoon.js";
|
||||||
|
;link(rel "stylesheet", href "//cdnjs.cloudflare.com/ajax/libs/".
|
||||||
|
"codemirror/4.3.0/codemirror.min.css");
|
||||||
|
;link/"/lib/syntax/codemirror.css"(rel "stylesheet");
|
||||||
|
==
|
||||||
|
;body
|
||||||
|
;textarea#src:"{(trip own)}"
|
||||||
|
;script:'CodeMirror.fromTextArea(src, {lineNumbers:true, readOnly:true})'
|
||||||
|
==
|
||||||
|
==
|
||||||
|
++ txt
|
||||||
|
(to-wain:format own)
|
||||||
|
--
|
||||||
|
++ grab
|
||||||
|
|% :: convert from
|
||||||
|
++ mime |=([p=mite q=octs] q.q)
|
||||||
|
++ noun @t :: clam from %noun
|
||||||
|
++ txt of-wain:format
|
||||||
|
--
|
||||||
|
++ grad %txt
|
||||||
|
--
|
@ -0,0 +1,28 @@
|
|||||||
|
|_ kal=waft:clay
|
||||||
|
++ grow
|
||||||
|
|%
|
||||||
|
++ mime `^mime`[/text/x-kelvin (as-octs:mimes:html hoon)]
|
||||||
|
++ noun kal
|
||||||
|
++ hoon
|
||||||
|
%+ rap 3
|
||||||
|
%+ turn
|
||||||
|
%+ sort
|
||||||
|
~(tap in (waft-to-wefts:clay kal))
|
||||||
|
|= [a=weft b=weft]
|
||||||
|
?: =(lal.a lal.b)
|
||||||
|
(gte num.a num.b)
|
||||||
|
(gte lal.a lal.b)
|
||||||
|
|= =weft
|
||||||
|
(rap 3 '[%' (scot %tas lal.weft) ' ' (scot %ud num.weft) ']\0a' ~)
|
||||||
|
::
|
||||||
|
++ txt (to-wain:format hoon)
|
||||||
|
--
|
||||||
|
++ grab
|
||||||
|
|%
|
||||||
|
++ noun waft:clay
|
||||||
|
++ mime
|
||||||
|
|= [=mite len=@ud tex=@]
|
||||||
|
(cord-to-waft:clay tex)
|
||||||
|
--
|
||||||
|
++ grad %noun
|
||||||
|
--
|
@ -1,18 +0,0 @@
|
|||||||
::
|
|
||||||
:::: /hoon/map/mar
|
|
||||||
:: Mark for js source maps
|
|
||||||
/? 310
|
|
||||||
::
|
|
||||||
=, eyre
|
|
||||||
|_ mud=@
|
|
||||||
++ grow
|
|
||||||
|%
|
|
||||||
++ mime [/application/octet-stream (as-octs:mimes:html (@t mud))]
|
|
||||||
--
|
|
||||||
++ grab
|
|
||||||
|% :: convert from
|
|
||||||
++ mime |=([p=mite q=octs] (@t q.q))
|
|
||||||
++ noun cord :: clam from %noun
|
|
||||||
--
|
|
||||||
++ grad %mime
|
|
||||||
--
|
|
@ -0,0 +1,32 @@
|
|||||||
|
::
|
||||||
|
:::: /hoon/mime/mar
|
||||||
|
::
|
||||||
|
/? 310
|
||||||
|
::
|
||||||
|
|_ own=mime
|
||||||
|
++ grow
|
||||||
|
^?
|
||||||
|
|%
|
||||||
|
++ jam `@`q.q.own
|
||||||
|
--
|
||||||
|
::
|
||||||
|
++ grab :: convert from
|
||||||
|
^?
|
||||||
|
|%
|
||||||
|
++ noun mime :: clam from %noun
|
||||||
|
++ tape
|
||||||
|
|=(a=_"" [/application/x-urb-unknown (as-octt:mimes:html a)])
|
||||||
|
--
|
||||||
|
++ grad
|
||||||
|
^?
|
||||||
|
|%
|
||||||
|
++ form %mime
|
||||||
|
++ diff |=(mime +<)
|
||||||
|
++ pact |=(mime +<)
|
||||||
|
++ join |=([mime mime] `(unit mime)`~)
|
||||||
|
++ mash
|
||||||
|
|= [[ship desk mime] [ship desk mime]]
|
||||||
|
^- mime
|
||||||
|
~|(%mime-mash !!)
|
||||||
|
--
|
||||||
|
--
|
@ -0,0 +1,22 @@
|
|||||||
|
::
|
||||||
|
:::: /hoon/noun/mar
|
||||||
|
::
|
||||||
|
/? 310
|
||||||
|
!:
|
||||||
|
:::: A minimal noun mark
|
||||||
|
|_ non=*
|
||||||
|
++ grab |%
|
||||||
|
++ noun *
|
||||||
|
--
|
||||||
|
++ grow |%
|
||||||
|
++ mime [/application/x-urb-jam (as-octs:mimes:html (jam non))]
|
||||||
|
--
|
||||||
|
++ grad
|
||||||
|
|%
|
||||||
|
++ form %noun
|
||||||
|
++ diff |=(* +<)
|
||||||
|
++ pact |=(* +<)
|
||||||
|
++ join |=([* *] *(unit *))
|
||||||
|
++ mash |=([[ship desk *] [ship desk *]] `*`~|(%noun-mash !!))
|
||||||
|
--
|
||||||
|
--
|
@ -1,12 +0,0 @@
|
|||||||
|_ dat=octs
|
|
||||||
++ grow
|
|
||||||
|%
|
|
||||||
++ mime [/font/ttf dat]
|
|
||||||
--
|
|
||||||
++ grab
|
|
||||||
|%
|
|
||||||
++ mime |=([=mite =octs] octs)
|
|
||||||
++ noun octs
|
|
||||||
--
|
|
||||||
++ grad %mime
|
|
||||||
--
|
|
@ -0,0 +1,274 @@
|
|||||||
|
::
|
||||||
|
:::: /hoon/txt/mar
|
||||||
|
::
|
||||||
|
/? 310
|
||||||
|
::
|
||||||
|
=, clay
|
||||||
|
=, differ
|
||||||
|
=, format
|
||||||
|
=, mimes:html
|
||||||
|
|_ txt=wain
|
||||||
|
::
|
||||||
|
++ grab :: convert from
|
||||||
|
|%
|
||||||
|
++ mime |=((pair mite octs) (to-wain q.q))
|
||||||
|
++ noun wain :: clam from %noun
|
||||||
|
--
|
||||||
|
++ grow
|
||||||
|
=> v=.
|
||||||
|
|%
|
||||||
|
++ mime => v [/text/plain (as-octs (of-wain txt))]
|
||||||
|
--
|
||||||
|
++ grad
|
||||||
|
|%
|
||||||
|
++ form %txt-diff
|
||||||
|
++ diff
|
||||||
|
|= tyt=wain
|
||||||
|
^- (urge cord)
|
||||||
|
(lusk txt tyt (loss txt tyt))
|
||||||
|
::
|
||||||
|
++ pact
|
||||||
|
|= dif=(urge cord)
|
||||||
|
~| [%pacting dif]
|
||||||
|
^- wain
|
||||||
|
(lurk txt dif)
|
||||||
|
::
|
||||||
|
++ join
|
||||||
|
|= [ali=(urge cord) bob=(urge cord)]
|
||||||
|
^- (unit (urge cord))
|
||||||
|
|^
|
||||||
|
=. ali (clean ali)
|
||||||
|
=. bob (clean bob)
|
||||||
|
|- ^- (unit (urge cord))
|
||||||
|
?~ ali `bob
|
||||||
|
?~ bob `ali
|
||||||
|
?- -.i.ali
|
||||||
|
%&
|
||||||
|
?- -.i.bob
|
||||||
|
%&
|
||||||
|
?: =(p.i.ali p.i.bob)
|
||||||
|
%+ bind $(ali t.ali, bob t.bob)
|
||||||
|
|=(cud=(urge cord) [i.ali cud])
|
||||||
|
?: (gth p.i.ali p.i.bob)
|
||||||
|
%+ bind $(p.i.ali (sub p.i.ali p.i.bob), bob t.bob)
|
||||||
|
|=(cud=(urge cord) [i.bob cud])
|
||||||
|
%+ bind $(ali t.ali, p.i.bob (sub p.i.bob p.i.ali))
|
||||||
|
|=(cud=(urge cord) [i.ali cud])
|
||||||
|
::
|
||||||
|
%|
|
||||||
|
?: =(p.i.ali (lent p.i.bob))
|
||||||
|
%+ bind $(ali t.ali, bob t.bob)
|
||||||
|
|=(cud=(urge cord) [i.bob cud])
|
||||||
|
?: (gth p.i.ali (lent p.i.bob))
|
||||||
|
%+ bind $(p.i.ali (sub p.i.ali (lent p.i.bob)), bob t.bob)
|
||||||
|
|=(cud=(urge cord) [i.bob cud])
|
||||||
|
~
|
||||||
|
==
|
||||||
|
::
|
||||||
|
%|
|
||||||
|
?- -.i.bob
|
||||||
|
%|
|
||||||
|
?. =(i.ali i.bob)
|
||||||
|
~
|
||||||
|
%+ bind $(ali t.ali, bob t.bob)
|
||||||
|
|=(cud=(urge cord) [i.ali cud])
|
||||||
|
::
|
||||||
|
%&
|
||||||
|
?: =(p.i.bob (lent p.i.ali))
|
||||||
|
%+ bind $(ali t.ali, bob t.bob)
|
||||||
|
|=(cud=(urge cord) [i.ali cud])
|
||||||
|
?: (gth p.i.bob (lent p.i.ali))
|
||||||
|
%+ bind $(ali t.ali, p.i.bob (sub p.i.bob (lent p.i.ali)))
|
||||||
|
|=(cud=(urge cord) [i.ali cud])
|
||||||
|
~
|
||||||
|
==
|
||||||
|
==
|
||||||
|
++ clean :: clean
|
||||||
|
|= wig=(urge cord)
|
||||||
|
^- (urge cord)
|
||||||
|
?~ wig ~
|
||||||
|
?~ t.wig wig
|
||||||
|
?: ?=(%& -.i.wig)
|
||||||
|
?: ?=(%& -.i.t.wig)
|
||||||
|
$(wig [[%& (add p.i.wig p.i.t.wig)] t.t.wig])
|
||||||
|
[i.wig $(wig t.wig)]
|
||||||
|
?: ?=(%| -.i.t.wig)
|
||||||
|
$(wig [[%| (welp p.i.wig p.i.t.wig) (welp q.i.wig q.i.t.wig)] t.t.wig])
|
||||||
|
[i.wig $(wig t.wig)]
|
||||||
|
--
|
||||||
|
::
|
||||||
|
++ mash
|
||||||
|
|= $: [als=ship ald=desk ali=(urge cord)]
|
||||||
|
[bos=ship bod=desk bob=(urge cord)]
|
||||||
|
==
|
||||||
|
^- (urge cord)
|
||||||
|
|^
|
||||||
|
=. ali (clean ali)
|
||||||
|
=. bob (clean bob)
|
||||||
|
|- ^- (urge cord)
|
||||||
|
?~ ali bob
|
||||||
|
?~ bob ali
|
||||||
|
?- -.i.ali
|
||||||
|
%&
|
||||||
|
?- -.i.bob
|
||||||
|
%&
|
||||||
|
?: =(p.i.ali p.i.bob)
|
||||||
|
[i.ali $(ali t.ali, bob t.bob)]
|
||||||
|
?: (gth p.i.ali p.i.bob)
|
||||||
|
[i.bob $(p.i.ali (sub p.i.ali p.i.bob), bob t.bob)]
|
||||||
|
[i.ali $(ali t.ali, p.i.bob (sub p.i.bob p.i.ali))]
|
||||||
|
::
|
||||||
|
%|
|
||||||
|
?: =(p.i.ali (lent p.i.bob))
|
||||||
|
[i.bob $(ali t.ali, bob t.bob)]
|
||||||
|
?: (gth p.i.ali (lent p.i.bob))
|
||||||
|
[i.bob $(p.i.ali (sub p.i.ali (lent p.i.bob)), bob t.bob)]
|
||||||
|
=/ [fic=(unce cord) ali=(urge cord) bob=(urge cord)]
|
||||||
|
(resolve ali bob)
|
||||||
|
[fic $(ali ali, bob bob)]
|
||||||
|
:: ~ :: here, alice is good for a while, but not for the whole
|
||||||
|
== :: length of bob's changes
|
||||||
|
::
|
||||||
|
%|
|
||||||
|
?- -.i.bob
|
||||||
|
%|
|
||||||
|
=/ [fic=(unce cord) ali=(urge cord) bob=(urge cord)]
|
||||||
|
(resolve ali bob)
|
||||||
|
[fic $(ali ali, bob bob)]
|
||||||
|
::
|
||||||
|
%&
|
||||||
|
?: =(p.i.bob (lent p.i.ali))
|
||||||
|
[i.ali $(ali t.ali, bob t.bob)]
|
||||||
|
?: (gth p.i.bob (lent p.i.ali))
|
||||||
|
[i.ali $(ali t.ali, p.i.bob (sub p.i.bob (lent p.i.ali)))]
|
||||||
|
=/ [fic=(unce cord) ali=(urge cord) bob=(urge cord)]
|
||||||
|
(resolve ali bob)
|
||||||
|
[fic $(ali ali, bob bob)]
|
||||||
|
==
|
||||||
|
==
|
||||||
|
::
|
||||||
|
++ annotate :: annotate conflict
|
||||||
|
|= $: ali=(list @t)
|
||||||
|
bob=(list @t)
|
||||||
|
bas=(list @t)
|
||||||
|
==
|
||||||
|
^- (list @t)
|
||||||
|
%- zing
|
||||||
|
^- (list (list @t))
|
||||||
|
%- flop
|
||||||
|
^- (list (list @t))
|
||||||
|
:- :_ ~
|
||||||
|
%^ cat 3 '<<<<<<<<<<<<'
|
||||||
|
%^ cat 3 ' '
|
||||||
|
%^ cat 3 `@t`(scot %p bos)
|
||||||
|
%^ cat 3 '/'
|
||||||
|
bod
|
||||||
|
|
||||||
|
:- bob
|
||||||
|
:- ~['------------']
|
||||||
|
:- bas
|
||||||
|
:- ~['++++++++++++']
|
||||||
|
:- ali
|
||||||
|
:- :_ ~
|
||||||
|
%^ cat 3 '>>>>>>>>>>>>'
|
||||||
|
%^ cat 3 ' '
|
||||||
|
%^ cat 3 `@t`(scot %p als)
|
||||||
|
%^ cat 3 '/'
|
||||||
|
ald
|
||||||
|
~
|
||||||
|
::
|
||||||
|
++ clean :: clean
|
||||||
|
|= wig=(urge cord)
|
||||||
|
^- (urge cord)
|
||||||
|
?~ wig ~
|
||||||
|
?~ t.wig wig
|
||||||
|
?: ?=(%& -.i.wig)
|
||||||
|
?: ?=(%& -.i.t.wig)
|
||||||
|
$(wig [[%& (add p.i.wig p.i.t.wig)] t.t.wig])
|
||||||
|
[i.wig $(wig t.wig)]
|
||||||
|
?: ?=(%| -.i.t.wig)
|
||||||
|
$(wig [[%| (welp p.i.wig p.i.t.wig) (welp q.i.wig q.i.t.wig)] t.t.wig])
|
||||||
|
[i.wig $(wig t.wig)]
|
||||||
|
::
|
||||||
|
++ resolve
|
||||||
|
|= [ali=(urge cord) bob=(urge cord)]
|
||||||
|
^- [fic=[%| p=(list cord) q=(list cord)] ali=(urge cord) bob=(urge cord)]
|
||||||
|
=- [[%| bac (annotate alc boc bac)] ali bob]
|
||||||
|
|- ^- $: $: bac=(list cord)
|
||||||
|
alc=(list cord)
|
||||||
|
boc=(list cord)
|
||||||
|
==
|
||||||
|
ali=(urge cord)
|
||||||
|
bob=(urge cord)
|
||||||
|
==
|
||||||
|
?~ ali [[~ ~ ~] ali bob]
|
||||||
|
?~ bob [[~ ~ ~] ali bob]
|
||||||
|
?- -.i.ali
|
||||||
|
%&
|
||||||
|
?- -.i.bob
|
||||||
|
%& [[~ ~ ~] ali bob] :: no conflict
|
||||||
|
%|
|
||||||
|
=+ lob=(lent p.i.bob)
|
||||||
|
?: =(lob p.i.ali)
|
||||||
|
[[p.i.bob p.i.bob q.i.bob] t.ali t.bob]
|
||||||
|
?: (lth lob p.i.ali)
|
||||||
|
[[p.i.bob p.i.bob q.i.bob] [[%& (sub p.i.ali lob)] t.ali] t.bob]
|
||||||
|
=+ wat=(scag (sub lob p.i.ali) p.i.bob)
|
||||||
|
=+ ^= res
|
||||||
|
%= $
|
||||||
|
ali t.ali
|
||||||
|
bob [[%| (scag (sub lob p.i.ali) p.i.bob) ~] t.bob]
|
||||||
|
==
|
||||||
|
:* :* (welp bac.res wat)
|
||||||
|
(welp alc.res wat)
|
||||||
|
(welp boc.res q.i.bob)
|
||||||
|
==
|
||||||
|
ali.res
|
||||||
|
bob.res
|
||||||
|
==
|
||||||
|
==
|
||||||
|
::
|
||||||
|
%|
|
||||||
|
?- -.i.bob
|
||||||
|
%&
|
||||||
|
=+ loa=(lent p.i.ali)
|
||||||
|
?: =(loa p.i.bob)
|
||||||
|
[[p.i.ali q.i.ali p.i.ali] t.ali t.bob]
|
||||||
|
?: (lth loa p.i.bob)
|
||||||
|
[[p.i.ali q.i.ali p.i.ali] t.ali [[%& (sub p.i.bob loa)] t.bob]]
|
||||||
|
=+ wat=(slag (sub loa p.i.bob) p.i.ali)
|
||||||
|
=+ ^= res
|
||||||
|
%= $
|
||||||
|
ali [[%| (scag (sub loa p.i.bob) p.i.ali) ~] t.ali]
|
||||||
|
bob t.bob
|
||||||
|
==
|
||||||
|
:* :* (welp bac.res wat)
|
||||||
|
(welp alc.res q.i.ali)
|
||||||
|
(welp boc.res wat)
|
||||||
|
==
|
||||||
|
ali.res
|
||||||
|
bob.res
|
||||||
|
==
|
||||||
|
::
|
||||||
|
%|
|
||||||
|
=+ loa=(lent p.i.ali)
|
||||||
|
=+ lob=(lent p.i.bob)
|
||||||
|
?: =(loa lob)
|
||||||
|
[[p.i.ali q.i.ali q.i.bob] t.ali t.bob]
|
||||||
|
=+ ^= res
|
||||||
|
?: (gth loa lob)
|
||||||
|
$(ali [[%| (scag (sub loa lob) p.i.ali) ~] t.ali], bob t.bob)
|
||||||
|
~& [%scagging loa=loa pibob=p.i.bob slag=(scag loa p.i.bob)]
|
||||||
|
$(ali t.ali, bob [[%| (scag (sub lob loa) p.i.bob) ~] t.bob])
|
||||||
|
:* :* (welp bac.res ?:((gth loa lob) p.i.bob p.i.ali))
|
||||||
|
(welp alc.res q.i.ali)
|
||||||
|
(welp boc.res q.i.bob)
|
||||||
|
==
|
||||||
|
ali.res
|
||||||
|
bob.res
|
||||||
|
==
|
||||||
|
==
|
||||||
|
==
|
||||||
|
--
|
||||||
|
--
|
||||||
|
--
|
@ -1,12 +0,0 @@
|
|||||||
|_ dat=octs
|
|
||||||
++ grow
|
|
||||||
|%
|
|
||||||
++ mime [/font/woff dat]
|
|
||||||
--
|
|
||||||
++ grab
|
|
||||||
|%
|
|
||||||
++ mime |=([=mite =octs] octs)
|
|
||||||
++ noun octs
|
|
||||||
--
|
|
||||||
++ grad %mime
|
|
||||||
--
|
|
@ -17,7 +17,7 @@ if [ -d ${app_desk_dir} ]; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
app_files=/app-builds/${CERC_URBIT_APP}
|
app_files=/app-builds/${CERC_URBIT_APP}/urbit-files
|
||||||
|
|
||||||
# Loop until the app's build appears
|
# Loop until the app's build appears
|
||||||
while [ ! -d "${app_files}/build" ]; do
|
while [ ! -d "${app_files}/build" ]; do
|
||||||
@ -44,6 +44,9 @@ hood () {
|
|||||||
hood "merge %${CERC_URBIT_APP} our %landscape"
|
hood "merge %${CERC_URBIT_APP} our %landscape"
|
||||||
hood "mount %${CERC_URBIT_APP}"
|
hood "mount %${CERC_URBIT_APP}"
|
||||||
|
|
||||||
|
rm "${app_desk_dir}/desk.bill" # Don't install the landscape apps
|
||||||
|
rm "${app_desk_dir}/desk.ship"
|
||||||
|
|
||||||
|
|
||||||
echo "Copying files from ${app_files}"
|
echo "Copying files from ${app_files}"
|
||||||
|
|
||||||
@ -51,10 +54,6 @@ echo "Copying files from ${app_files}"
|
|||||||
cp -r ${app_files}/* ${app_desk_dir}
|
cp -r ${app_files}/* ${app_desk_dir}
|
||||||
rm ${app_desk_dir}/desk.docket-0 # Remove until we have a valid glob path; it's added back again below
|
rm ${app_desk_dir}/desk.docket-0 # Remove until we have a valid glob path; it's added back again below
|
||||||
|
|
||||||
# TODO: why? =>
|
|
||||||
rm "${app_desk_dir}/desk.bill"
|
|
||||||
rm "${app_desk_dir}/desk.ship"
|
|
||||||
|
|
||||||
# Commit changes and create a glob
|
# Commit changes and create a glob
|
||||||
hood "commit %${CERC_URBIT_APP}"
|
hood "commit %${CERC_URBIT_APP}"
|
||||||
dojo "-landscape!make-glob %${CERC_URBIT_APP} /build"
|
dojo "-landscape!make-glob %${CERC_URBIT_APP} /build"
|
||||||
|
@ -40,8 +40,6 @@ stack: uniswap-urbit-app
|
|||||||
deploy-to: compose
|
deploy-to: compose
|
||||||
network:
|
network:
|
||||||
ports:
|
ports:
|
||||||
proxy-server:
|
|
||||||
- '4000:4000'
|
|
||||||
urbit-fake-ship:
|
urbit-fake-ship:
|
||||||
- '8080:80'
|
- '8080:80'
|
||||||
ipfs:
|
ipfs:
|
||||||
@ -86,7 +84,8 @@ Inside the deployment directory, open the file `config.env` and set the followin
|
|||||||
# Set this to GQL proxy server endpoint for uniswap app
|
# Set this to GQL proxy server endpoint for uniswap app
|
||||||
# (Eg. http://localhost:4000/v1/graphql - in case stack is being run locally with proxy enabled)
|
# (Eg. http://localhost:4000/v1/graphql - in case stack is being run locally with proxy enabled)
|
||||||
# (Eg. https://abc.xyz.com/v1/graphql - in case https://abc.xyz.com is pointed to the proxy endpoint)
|
# (Eg. https://abc.xyz.com/v1/graphql - in case https://abc.xyz.com is pointed to the proxy endpoint)
|
||||||
CERC_UNISWAP_GQL=http://localhost:4000/v1/graphql
|
CERC_UNISWAP_GQL=/apps/uniswap-proxy/v1/graphql
|
||||||
|
CERC_UNISWAP_API=/apps/uniswap-proxy/v2
|
||||||
|
|
||||||
# Optional
|
# Optional
|
||||||
|
|
||||||
|
@ -2,12 +2,9 @@ version: "0.1"
|
|||||||
name: uniswap-urbit-app
|
name: uniswap-urbit-app
|
||||||
repos:
|
repos:
|
||||||
- github.com/cerc-io/uniswap-interface@laconic # TODO: Use release
|
- github.com/cerc-io/uniswap-interface@laconic # TODO: Use release
|
||||||
- github.com/cerc-io/watcher-ts@v0.2.78
|
|
||||||
containers:
|
containers:
|
||||||
- cerc/uniswap-interface
|
- cerc/uniswap-interface
|
||||||
- cerc/watcher-ts
|
|
||||||
pods:
|
pods:
|
||||||
- uniswap-interface
|
- uniswap-interface
|
||||||
- proxy-server
|
|
||||||
- fixturenet-urbit
|
- fixturenet-urbit
|
||||||
- kubo
|
- kubo
|
||||||
|
Loading…
Reference in New Issue
Block a user