Merge branch 'master' into slam-wa

This commit is contained in:
ixv 2019-08-02 11:08:29 -07:00 committed by GitHub
commit 6c0ac0ac3d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
42 changed files with 679 additions and 3319 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1019,6 +1019,8 @@
== ==
:: ::
$listen-api !! $listen-api !!
$export !!
$import !!
$as $as
:* %as mar.source.com :* %as mar.source.com
$(num +(num), source.com next.source.com) $(num +(num), source.com next.source.com)

View File

@ -92,6 +92,7 @@
++ lime :: diff fruit ++ lime :: diff fruit
$% {$hall-prize prize} :: $% {$hall-prize prize} ::
{$hall-rumor rumor} :: {$hall-rumor rumor} ::
{$export [%hall-v0 (list telegram)]} :: sent to lens
== :: == ::
++ pear :: poke fruit ++ pear :: poke fruit
$% {$hall-command command} :: $% {$hall-command command} ::
@ -2789,6 +2790,8 @@
^- (list move) ^- (list move)
=+ mur=(~(get by res) p) =+ mur=(~(get by res) p)
?^ mur u.mur ?^ mur u.mur
?: =([%export ~] p)
~
=- =. res (~(put by res) p -) =- =. res (~(put by res) p -)
- -
=+ qer=(path-to-query p) =+ qer=(path-to-query p)
@ -3017,6 +3020,10 @@
|= pax/path |= pax/path
^- (quip move _+>) ^- (quip move _+>)
?: ?=([%sole *] pax) ~&(%hall-no-sole !!) ?: ?=([%sole *] pax) ~&(%hall-no-sole !!)
?: ?=([%export *] pax)
:_ +>.$
[ost.bol %diff %export [%hall-v0 grams:(~(got by stories) ~.inbox)]]~
::
=+ qer=(path-to-query pax) =+ qer=(path-to-query pax)
?. (leak src.bol qer) ~&(%peer-invisible !!) ?. (leak src.bol qer) ~&(%peer-invisible !!)
=^ mos +>.$ =^ mos +>.$
@ -3196,6 +3203,20 @@
:- ~ :- ~
+>.$(log (~(del by log) nom)) +>.$(log (~(del by log) nom))
:: ::
++ poke-import
|= i=*
^- (quip move _+>)
::
?> ?=([%hall-v0 *] i)
=/ grams=(list telegram) ;;((list telegram) +.i)
::
~& [%importing-telegrams count=(lent grams)]
::
%- pre-bake
%+ turn grams
|= t/telegram
[%story ~.inbox %gram [our.bol ~.inbox] t]
::
++ log-all-to-file ++ log-all-to-file
:: update stories logs :: update stories logs
:: ::

View File

@ -1,5 +1,5 @@
/- lens /- lens
/+ *server /+ *server, base64
/= lens-mark /: /===/mar/lens/command /= lens-mark /: /===/mar/lens/command
/!noun/ /!noun/
=, format =, format
@ -12,6 +12,7 @@
+$ card +$ card
$% [%connect wire binding:eyre term] $% [%connect wire binding:eyre term]
[%http-response =http-event:http] [%http-response =http-event:http]
[%peer wire dock path]
[%peel wire dock mark path] [%peel wire dock mark path]
[%poke wire dock poke] [%poke wire dock poke]
[%pull wire dock ~] [%pull wire dock ~]
@ -19,6 +20,7 @@
:: ::
+$ poke +$ poke
$% [%lens-command command:lens] $% [%lens-command command:lens]
[%import *]
== ==
:: ::
+$ state +$ state
@ -49,6 +51,7 @@
%- (require-authorization:app ost.bow move this) %- (require-authorization:app ost.bow move this)
|= =inbound-request:eyre |= =inbound-request:eyre
^- (quip move _this) ^- (quip move _this)
::
?^ job.state ?^ job.state
:_ this :_ this
[ost.bow %http-response %start [%500 ~] ~ %.y]~ [ost.bow %http-response %start [%500 ~] ~ %.y]~
@ -60,6 +63,22 @@
(need (de-json:html q:(need body.request.inbound-request))) (need (de-json:html q:(need body.request.inbound-request)))
=/ com=command:lens =/ com=command:lens
(json:grab:lens-mark jon) (json:grab:lens-mark jon)
::
?: ?=(%export -.source.com)
~& [%export app.source.com]
:_ this(job.state (some [ost.bow com]))
[ost.bow %peer /export [our.bow app.source.com] /export]~
::
?: ?=(%import -.source.com)
?~ enc=(de:base64 base64-jam.source.com)
:_ this
[ost.bow %http-response %start [%500 ~] ~ %.y]~
::
=/ c=* (cue q.u.enc)
::
:_ this(job.state (some [ost.bow com]))
[ost.bow %poke /import [our.bow app.source.com] %import c]~
::
:_ this(job.state (some [ost.bow com])) :_ this(job.state (some [ost.bow com]))
[ost.bow %peel /sole [our.bow %dojo] %lens-json /sole]~ [ost.bow %peel /sole [our.bow %dojo] %lens-json /sole]~
:: ::
@ -72,6 +91,29 @@
:_ this(job.state ~) :_ this(job.state ~)
[bone.u.job.state %http-response (json-response:app (json-to-octs jon))]~ [bone.u.job.state %http-response (json-response:app (json-to-octs jon))]~
:: ::
++ diff-export
|= [=wire data=*]
^- (quip move _this)
::
?> ?=(^ job.state)
:: herb will do whatever we tell it to, so by convention have it write to an
:: app name based on the file name.
::
?> ?=(%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(job.state ~)
:~ [bone.u.job.state %http-response (json-response:app (json-to-octs jon))]
[ost.bow %pull /export [our.bow app.source.com.u.job.state] ~]
==
::
++ quit ++ quit
|= =wire |= =wire
^- (quip move _this) ^- (quip move _this)
@ -81,6 +123,10 @@
++ reap ++ reap
|= [=wire saw=(unit tang)] |= [=wire saw=(unit tang)]
^- (quip move _this) ^- (quip move _this)
::
?: =([%export ~] wire)
[~ this]
::
?^ saw ?^ saw
[((slog u.saw) ~) this] [((slog u.saw) ~) this]
?> ?=(^ job.state) ?> ?=(^ job.state)
@ -92,6 +138,19 @@
++ coup ++ coup
|= [=wire saw=(unit tang)] |= [=wire saw=(unit tang)]
^- (quip move _this) ^- (quip move _this)
::
?: =([%import ~] wire)
?> ?=(^ job.state)
:_ this(job.state ~)
:_ ~
:* bone.u.job.state
%http-response
%start
[%200 ~]
[~ (as-octt:mimes:html "\"Imported data\"")]
%.y
==
::
?^ saw ?^ saw
[((slog u.saw) ~) this] [((slog u.saw) ~) this]
[~ this] [~ this]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -66,9 +66,9 @@
== :: == ::
++ work :: interface action ++ work :: interface action
$% :: circle management :: $% :: circle management ::
{$join (map circle range)} :: subscribe to {$join (map circle range) (unit char)} :: subscribe to
{$leave audience} :: unsubscribe from {$leave audience} :: unsubscribe from
{$create security name cord} :: create circle {$create security name cord (unit char)} :: create circle
{$delete name (unit cord)} :: delete circle {$delete name (unit cord)} :: delete circle
{$depict name cord} :: change description {$depict name cord} :: change description
{$filter name ? ?} :: change message rules {$filter name ? ?} :: change message rules
@ -838,14 +838,14 @@
:: ::
;~((glue ace) (perk %read ~) cire dem:ag) ;~((glue ace) (perk %read ~) cire dem:ag)
:: ::
;~((glue ace) (perk %join ~) sorz) ;~((glue ace) (perk %join ~) ;~(plug sorz (punt ;~(pfix ace glyph))))
:: ::
;~((glue ace) (perk %leave ~) cirs) ;~((glue ace) (perk %leave ~) cirs)
:: ::
;~ (glue ace) (perk %create ~) ;~ (glue ace) (perk %create ~)
pore pore
cire cire
qut ;~(plug qut (punt ;~(pfix ace glyph)))
== ==
:: ::
;~ plug (perk %delete ~) ;~ plug (perk %delete ~)
@ -1186,9 +1186,11 @@
:: change local mailbox config to include :: change local mailbox config to include
:: subscriptions to {pas}. :: subscriptions to {pas}.
:: ::
|= pos/(map circle range) |= {pos/(map circle range) gyf/(unit char)}
^+ ..sh-work ^+ ..sh-work
=+ pas=~(key by pos) =+ pas=~(key by pos)
=? ..sh-work ?=(^ gyf)
(bind u.gyf `pas)
=. ..sh-work =. ..sh-work
sh-prod(active.she pas) sh-prod(active.she pas)
:: default to a day of backlog :: default to a day of backlog
@ -1226,11 +1228,11 @@
:: ::
:: creates circle {nom} with specified config. :: creates circle {nom} with specified config.
:: ::
|= {sec/security nom/name txt/cord} |= {sec/security nom/name txt/cord gyf/(unit char)}
^+ ..sh-work ^+ ..sh-work
=. ..sh-work =. ..sh-work
(sh-act %create nom txt sec) (sh-act %create nom txt sec)
(join [[[self nom] ~] ~ ~]) (join [[[self nom] ~] ~ ~] gyf)
:: ::
++ delete ++ delete
:: %delete :: %delete
@ -1922,7 +1924,7 @@
$(dif [%filter fit.cof.dif]) $(dif [%filter fit.cof.dif])
?: ?=($remove -.dif) ?: ?=($remove -.dif)
(sh-note (weld "rip " (~(cr-show cr cir) ~))) (sh-note (weld "rip " (~(cr-show cr cir) ~)))
?: ?=($usage -.dif) +> ?: ?=(?($usage $read) -.dif) +>
%- sh-note %- sh-note
%+ weld %+ weld
(weld ~(cr-phat cr cir) ": ") (weld ~(cr-phat cr cir) ": ")
@ -1933,9 +1935,6 @@
:: ::
$caption $caption
"cap: {(trip cap.dif)}" "cap: {(trip cap.dif)}"
::
$read
""
:: ::
$filter $filter
;: weld ;: weld

File diff suppressed because one or more lines are too long

View File

@ -35,6 +35,8 @@
;~(pfix col (more net (cook crip (star ;~(less net prn))))) ;~(pfix col (more net (cook crip (star ;~(less net prn)))))
== ==
listen-api+(su ;~(plug sym ;~(pfix col sym))) listen-api+(su ;~(plug sym ;~(pfix col sym)))
export+so
import+(ot app+so base64-jam+so ~)
as+(ot mark+(su sym) next+source ~) as+(ot mark+(su sym) next+source ~)
hoon+(ot code+so next+source ~) hoon+(ot code+so next+source ~)
== ==

View File

@ -15,6 +15,8 @@
{$hoon code/@t next/source} :: end since they {$hoon code/@t next/source} :: end since they
{$tuple next/(list source)} :: don't bunt well {$tuple next/(list source)} :: don't bunt well
{$listen-api api/term event/term} {$listen-api api/term event/term}
{$export app/@t}
{$import app/@t base64-jam/@t}
== ==
++ sink ++ sink
$% {$stdout ~} $% {$stdout ~}

View File

@ -101,8 +101,11 @@
++ wake ++ wake
|= error=(unit tang) |= error=(unit tang)
^+ [moves state] ^+ [moves state]
:: no-op on spurious but innocuous unix wakeups
:: ::
?~ timers.state ~| %behn-wake-no-timer^error !! ?~ timers.state
~? ?=(^ error) %behn-wake-no-timer^u.error
[moves state]
:: if we errored, pop the timer and notify the client vane of the error :: if we errored, pop the timer and notify the client vane of the error
:: ::
?^ error ?^ error
@ -111,7 +114,6 @@
:: if unix woke us too early, retry by resetting the unix wakeup timer :: if unix woke us too early, retry by resetting the unix wakeup timer
:: ::
?: (gth date.i.timers.state now) ?: (gth date.i.timers.state now)
~? debug=%.n [%behn-wake-too-soon `@dr`(sub date.i.timers.state now)]
set-unix-wake(next-wake.state ~) set-unix-wake(next-wake.state ~)
:: pop first timer, tell vane it has elapsed, and adjust next unix wakeup :: pop first timer, tell vane it has elapsed, and adjust next unix wakeup
:: ::
@ -197,7 +199,6 @@
:: ignore duplicates :: ignore duplicates
:: ::
?: =(t i.timers) ?: =(t i.timers)
~? debug=%.n [%behn-set-duplicate t]
timers timers
:: timers at the same date form a fifo queue :: timers at the same date form a fifo queue
:: ::
@ -214,7 +215,6 @@
:: if we don't have this timer, no-op :: if we don't have this timer, no-op
:: ::
?~ timers ?~ timers
~? debug=%.n [%behn-unset-missing t]
~ ~
?: =(i.timers t) ?: =(i.timers t)
t.timers t.timers
@ -260,11 +260,10 @@
:: +load: migrate an old state to a new behn version :: +load: migrate an old state to a new behn version
:: ::
++ load ++ load
|= old=* |= old=behn-state
^+ behn-gate ^+ behn-gate
:: ::
~| %behn-load-fail behn-gate(state old)
behn-gate(state (behn-state old))
:: +scry: view timer state :: +scry: view timer state
:: ::
:: TODO: not referentially transparent w.r.t. elapsed timers, :: TODO: not referentially transparent w.r.t. elapsed timers,

View File

@ -802,7 +802,7 @@
:: ::
:_ state :_ state
:_ ~ :_ ~
:^ duct %pass /run-app/[app.act] :^ duct %pass /run-app-request/[app.act]
^- note ^- note
:^ %g %deal [our our] :^ %g %deal [our our]
:: ::
@ -847,7 +847,7 @@
%app %app
:_ state :_ state
:_ ~ :_ ~
:^ duct %pass /run-app/[app.action] :^ duct %pass /run-app-request/[app.action]
^- note ^- note
:^ %g %deal [our our] :^ %g %deal [our our]
:: todo: i don't entirely understand gall; there's a way to make a gall :: todo: i don't entirely understand gall; there's a way to make a gall
@ -892,12 +892,9 @@
%app %app
:_ state :_ state
:_ ~ :_ ~
:^ duct %pass /run-app/[app.action.u.connection] :^ duct %pass /run-app-cancel/[app.action.u.connection]
^- note ^- note
:^ %g %deal [our our] :^ %g %deal [our our]
:: todo: i don't entirely understand gall; there's a way to make a gall
:: use a %handle arm instead of a sub-%poke with the
:: %handle-http-request type.
:: ::
^- cush:gall ^- cush:gall
:* app.action.u.connection :* app.action.u.connection
@ -2029,13 +2026,14 @@
?+ i.wire ?+ i.wire
~|([%bad-take-wire wire] !!) ~|([%bad-take-wire wire] !!)
:: ::
%run-app run-app %run-app-request run-app-request
%run-app-cancel run-app-cancel
%run-build run-build %run-build run-build
%channel channel %channel channel
%acme acme-ack %acme acme-ack
== ==
:: ::
++ run-app ++ run-app-request
:: ::
?> ?=([%g %unto *] sign) ?> ?=([%g %unto *] sign)
:: ::
@ -2060,6 +2058,18 @@
=^ moves server-state.ax (handle-response http-event.p.sign) =^ moves server-state.ax (handle-response http-event.p.sign)
[moves http-server-gate] [moves http-server-gate]
:: ::
++ run-app-cancel
::
?> ?=([%g %unto *] sign)
::
:: we explicitly don't care about the return value of a
:: %handle-http-cancel. It is purely a notification and we don't care if
:: it succeeds or not. The user might not have implemented
:: +poke-handle-http-cancel or it might have crashed, but since it's a
:: notification, we don't don't care about its return value.
::
[~ http-server-gate]
::
++ run-build ++ run-build
:: ::
?> ?=([%f %made *] sign) ?> ?=([%f %made *] sign)

View File

@ -272,7 +272,7 @@
(expect-eq !>(~[/http-blah]) !>(duct)) (expect-eq !>(~[/http-blah]) !>(duct))
:: ::
%+ expect-gall-deal %+ expect-gall-deal
:+ /run-app/app1 [~nul ~nul] :+ /run-app-request/app1 [~nul ~nul]
^- cush:gall ^- cush:gall
:* %app1 %poke %handle-http-request :* %app1 %poke %handle-http-request
!>([%.n %.n [%ipv4 .192.168.1.1] [%'GET' '/' ~ ~]]) !>([%.n %.n [%ipv4 .192.168.1.1] [%'GET' '/' ~ ~]])
@ -287,7 +287,7 @@
now=~1111.1.4 now=~1111.1.4
scry=scry-provides-code scry=scry-provides-code
^= take-args ^= take-args
:* wire=/run-app/app1 duct=~[/http-blah] :* wire=/run-app-request/app1 duct=~[/http-blah]
^- (hypo sign:http-server-gate) ^- (hypo sign:http-server-gate)
:- *type :- *type
:* %g %unto %http-response :* %g %unto %http-response
@ -359,7 +359,7 @@
(expect-eq !>(~[/http-blah]) !>(duct)) (expect-eq !>(~[/http-blah]) !>(duct))
:: ::
%+ expect-gall-deal %+ expect-gall-deal
:+ /run-app/app1 [~nul ~nul] :+ /run-app-request/app1 [~nul ~nul]
^- cush:gall ^- cush:gall
:* %app1 %poke %handle-http-request :* %app1 %poke %handle-http-request
!>([%.n %.n [%ipv4 .192.168.1.1] [%'GET' '/' ~ ~]]) !>([%.n %.n [%ipv4 .192.168.1.1] [%'GET' '/' ~ ~]])
@ -374,7 +374,7 @@
now=~1111.1.4 now=~1111.1.4
scry=scry-provides-code scry=scry-provides-code
^= take-args ^= take-args
:* wire=/run-app/app1 duct=~[/http-blah] :* wire=/run-app-request/app1 duct=~[/http-blah]
^- (hypo sign:http-server-gate) ^- (hypo sign:http-server-gate)
:- *type :- *type
:* %g %unto %coup ~ :* %g %unto %coup ~
@ -449,7 +449,7 @@
(expect-eq !>(~[/http-blah]) !>(duct)) (expect-eq !>(~[/http-blah]) !>(duct))
:: ::
%+ expect-gall-deal %+ expect-gall-deal
:+ /run-app/app1 [~nul ~nul] :+ /run-app-request/app1 [~nul ~nul]
^- cush:gall ^- cush:gall
:* %app1 %poke %handle-http-request :* %app1 %poke %handle-http-request
!>([%.n %.n [%ipv4 .192.168.1.1] [%'GET' '/' ~ ~]]) !>([%.n %.n [%ipv4 .192.168.1.1] [%'GET' '/' ~ ~]])
@ -464,7 +464,7 @@
now=~1111.1.4 now=~1111.1.4
scry=scry-provides-code scry=scry-provides-code
^= take-args ^= take-args
:* wire=/run-app/app1 duct=~[/http-blah] :* wire=/run-app-request/app1 duct=~[/http-blah]
^- (hypo sign:http-server-gate) :- *type ^- (hypo sign:http-server-gate) :- *type
:* %g %unto %http-response :* %g %unto %http-response
%start %start
@ -485,7 +485,7 @@
now=~1111.1.4 now=~1111.1.4
scry=scry-provides-code scry=scry-provides-code
^= take-args ^= take-args
:* wire=/run-app/app1 duct=~[/http-blah] :* wire=/run-app-request/app1 duct=~[/http-blah]
^- (hypo sign:http-server-gate) :- *type ^- (hypo sign:http-server-gate) :- *type
:* %g %unto %http-response :* %g %unto %http-response
[%continue [~ (as-octs:mimes:html 'ya!')] %.y] [%continue [~ (as-octs:mimes:html 'ya!')] %.y]
@ -556,7 +556,7 @@
(expect-eq !>(~[/http-blah]) !>(duct)) (expect-eq !>(~[/http-blah]) !>(duct))
:: ::
%+ expect-gall-deal %+ expect-gall-deal
:+ /run-app/app1 [~nul ~nul] :+ /run-app-request/app1 [~nul ~nul]
^- cush:gall ^- cush:gall
:* %app1 %poke %handle-http-request :* %app1 %poke %handle-http-request
!>([%.n %.n [%ipv4 .192.168.1.1] [%'GET' '/~landscape/inner-path' ~ ~]]) !>([%.n %.n [%ipv4 .192.168.1.1] [%'GET' '/~landscape/inner-path' ~ ~]])
@ -571,7 +571,7 @@
now=~1111.1.4 now=~1111.1.4
scry=scry-provides-code scry=scry-provides-code
^= take-args ^= take-args
:* wire=/run-app/app1 duct=~[/http-blah] :* wire=/run-app-request/app1 duct=~[/http-blah]
^- (hypo sign:http-server-gate) :- *type ^- (hypo sign:http-server-gate) :- *type
:* %g %unto %http-response :* %g %unto %http-response
[%start [307 ['location' '/~/login?redirect=/~landscape/inner-path']~] ~ %.y] [%start [307 ['location' '/~/login?redirect=/~landscape/inner-path']~] ~ %.y]
@ -624,7 +624,7 @@
:: expect authenticated=%.y in the handle below :: expect authenticated=%.y in the handle below
:: ::
%+ expect-gall-deal %+ expect-gall-deal
:+ /run-app/app1 [~nul ~nul] :+ /run-app-request/app1 [~nul ~nul]
^- cush:gall ^- cush:gall
:* %app1 %poke %handle-http-request :* %app1 %poke %handle-http-request
!> :* !> :*
@ -1814,7 +1814,7 @@
(expect-eq !>(~[/http-blah]) !>(duct)) (expect-eq !>(~[/http-blah]) !>(duct))
:: ::
%+ expect-gall-deal %+ expect-gall-deal
:+ /run-app/app1 [~nul ~nul] :+ /run-app-request/app1 [~nul ~nul]
^- cush:gall ^- cush:gall
:* %app1 %poke %handle-http-request :* %app1 %poke %handle-http-request
!>([%.n %.n [%ipv4 .192.168.1.1] [%'GET' '/' ~ ~]]) !>([%.n %.n [%ipv4 .192.168.1.1] [%'GET' '/' ~ ~]])
@ -1848,19 +1848,38 @@
(expect-eq !>(~[/http-blah]) !>(duct)) (expect-eq !>(~[/http-blah]) !>(duct))
:: ::
%+ expect-gall-deal %+ expect-gall-deal
:+ /run-app/app1 [~nul ~nul] :+ /run-app-cancel/app1 [~nul ~nul]
^- cush:gall ^- cush:gall
:* %app1 %poke %handle-http-cancel :* %app1 %poke %handle-http-cancel
!>([%.n %.n [%ipv4 .192.168.1.1] [%'GET' '/' ~ ~]]) !>([%.n %.n [%ipv4 .192.168.1.1] [%'GET' '/' ~ ~]])
== ==
card card
== ==
:: app1 doesn't have a %handle-http-cancel arm, but that's fine and doesn't
:: crash eyre when it sends its error coup back because we take no action on
:: the response to handle-http-cancel.
::
=^ results5 http-server-gate
%- http-server-take :*
http-server-gate
now=~1111.1.4
scry=scry-provides-code
^= take-args
:* wire=/run-app-cancel/app1 duct=~[/http-blah]
^- (hypo sign:http-server-gate) :- *type
:* %g %unto %coup
`[[%leaf "error! error! error!"] ~]
==
==
expected-move=~
==
:: ::
;: weld ;: weld
results1 results1
results2 results2
results3 results3
results4 results4
results5
== ==
:: ::
++ http-server-call ++ http-server-call

View File

@ -113,6 +113,33 @@ class sourceAction(argparse.Action):
else: else:
return {self.which: new_value} return {self.which: new_value}
class importFileAction(argparse.Action):
"""Handles the import statement.
The --import statement reads in a jammed noun file from the current working
directory and stuffs it the base64 encoded version which gets passed into
your Urbit.
"""
def __call__(self, parser, res, new_value, option_string):
logging.debug('%r %r' % (new_value, option_string))
logging.debug('source %s' % res.source)
logging.debug('level %s' % res.level)
# We check to see if there's a "{new_value}.jam" file in the current
# working directory. If there isn't, we error
data = ""
filename = new_value + ".jam"
with open(filename, 'rb') as f:
data = f.read()
if data == "":
raise ValueError('Failed to read jamfile')
base_data = base64.b64encode(data)
res.source = {"import": {"app": new_value, "base64-jam": base_data}}
class transformerAction(argparse.Action): class transformerAction(argparse.Action):
"""Handle transformer flag. """Handle transformer flag.
@ -310,6 +337,14 @@ parser.add_argument('-l', '--listen-api', which='listen-api',
metavar='api:event', metavar='api:event',
help='listen to event from api', help='listen to event from api',
action=sourceAction) action=sourceAction)
parser.add_argument('-e', '--export', which='export',
metavar='app-name',
help='exports the application state',
action=sourceAction)
parser.add_argument('-i', '--import',
metavar='app-name',
help='imports the application state',
action=importFileAction)
parser.add_argument('-m', '--mark', which='as', parser.add_argument('-m', '--mark', which='as',
metavar='mark', metavar='mark',
help='transform a source to another mark', help='transform a source to another mark',

View File

@ -1,16 +1,14 @@
var gulp = require('gulp'); var gulp = require('gulp');
var cssimport = require('gulp-cssimport'); var cssimport = require('gulp-cssimport');
var rollup = require('gulp-better-rollup'); var rollup = require('gulp-better-rollup');
var cssnano = require('cssnano');
var postcss = require('gulp-postcss');
var sucrase = require('@sucrase/gulp-plugin'); var sucrase = require('@sucrase/gulp-plugin');
var minify = require('gulp-minify'); var minify = require('gulp-minify');
var exec = require('child_process').exec;
var rename = require('gulp-rename'); var rename = require('gulp-rename');
var resolve = require('rollup-plugin-node-resolve'); var resolve = require('rollup-plugin-node-resolve');
var commonjs = require('rollup-plugin-commonjs'); var commonjs = require('rollup-plugin-commonjs');
var replace = require('rollup-plugin-replace');
var json = require('rollup-plugin-json');
var builtins = require('@joseph184/rollup-plugin-node-builtins');
var rootImport = require('rollup-plugin-root-import'); var rootImport = require('rollup-plugin-root-import');
var globals = require('rollup-plugin-node-globals'); var globals = require('rollup-plugin-node-globals');
@ -25,9 +23,13 @@ var urbitrc = require('../urbitrc');
***/ ***/
gulp.task('css-bundle', function() { gulp.task('css-bundle', function() {
let plugins = [
cssnano()
];
return gulp return gulp
.src('src/index.css') .src('src/index.css')
.pipe(cssimport()) .pipe(cssimport())
.pipe(postcss(plugins))
.pipe(gulp.dest('../../arvo/app/chat/css')); .pipe(gulp.dest('../../arvo/app/chat/css'));
}); });
@ -57,17 +59,12 @@ gulp.task('js-imports', function(cb) {
'node_modules/react-is/index.js': [ 'isValidElementType' ], 'node_modules/react-is/index.js': [ 'isValidElementType' ],
} }
}), }),
replace({
'process.env.NODE_ENV': JSON.stringify('development')
}),
rootImport({ rootImport({
root: `${__dirname}/dist/js`, root: `${__dirname}/dist/js`,
useEntry: 'prepend', useEntry: 'prepend',
extensions: '.js' extensions: '.js'
}), }),
json(),
globals(), globals(),
builtins(),
resolve() resolve()
] ]
}, 'umd')) }, 'umd'))
@ -93,9 +90,7 @@ gulp.task('tile-js-imports', function(cb) {
useEntry: 'prepend', useEntry: 'prepend',
extensions: '.js' extensions: '.js'
}), }),
json(),
globals(), globals(),
builtins(),
resolve() resolve()
] ]
}, 'umd')) }, 'umd'))
@ -107,7 +102,6 @@ gulp.task('tile-js-imports', function(cb) {
.on('end', cb); .on('end', cb);
}); });
gulp.task('js-minify', function () { gulp.task('js-minify', function () {
return gulp.src('../../arvo/app/chat/js/index.js') return gulp.src('../../arvo/app/chat/js/index.js')
.pipe(minify()) .pipe(minify())
@ -132,18 +126,6 @@ gulp.task('rename-tile-min', function() {
.pipe(gulp.dest('../../arvo/app/chat/js/')); .pipe(gulp.dest('../../arvo/app/chat/js/'));
}); });
gulp.task('js-cachebust', function(cb) {
return Promise.resolve(
exec('git log', function (err, stdout, stderr) {
let firstLine = stdout.split("\n")[0];
let commitHash = firstLine.split(' ')[1].substr(0, 10);
let newFilename = "index-" + commitHash + "-min.js";
exec('mv ../../arvo/app/chat/js/index-min.js ../../arvo/app/chat/js/' + newFilename);
})
);
})
gulp.task('urbit-copy', function () { gulp.task('urbit-copy', function () {
let ret = gulp.src('../../arvo/**/*'); let ret = gulp.src('../../arvo/**/*');

File diff suppressed because it is too large Load Diff

View File

@ -9,9 +9,7 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"@joseph184/rollup-plugin-node-builtins": "^2.1.4",
"@sucrase/gulp-plugin": "^2.0.0", "@sucrase/gulp-plugin": "^2.0.0",
"autoprefixer": "^9.6.1",
"cssnano": "^4.1.10", "cssnano": "^4.1.10",
"gulp": "^4.0.0", "gulp": "^4.0.0",
"gulp-better-rollup": "^4.0.1", "gulp-better-rollup": "^4.0.1",
@ -21,10 +19,8 @@
"gulp-rename": "^1.4.0", "gulp-rename": "^1.4.0",
"rollup": "^1.6.0", "rollup": "^1.6.0",
"rollup-plugin-commonjs": "^9.2.0", "rollup-plugin-commonjs": "^9.2.0",
"rollup-plugin-json": "^4.0.0",
"rollup-plugin-node-globals": "^1.4.0", "rollup-plugin-node-globals": "^1.4.0",
"rollup-plugin-node-resolve": "^4.0.0", "rollup-plugin-node-resolve": "^4.0.0",
"rollup-plugin-replace": "^2.0.0",
"rollup-plugin-root-import": "^0.2.3", "rollup-plugin-root-import": "^0.2.3",
"sucrase": "^3.8.0" "sucrase": "^3.8.0"
}, },
@ -32,11 +28,10 @@
"classnames": "^2.2.6", "classnames": "^2.2.6",
"lodash": "^4.17.11", "lodash": "^4.17.11",
"moment": "^2.20.1", "moment": "^2.20.1",
"mousetrap": "^1.6.1", "mousetrap": "^1.6.3",
"react": "^16.5.2", "react": "^16.5.2",
"react-dom": "^16.8.6", "react-dom": "^16.8.6",
"react-router-dom": "^5.0.0", "react-router-dom": "^5.0.0",
"rollup-plugin-postcss": "^2.0.3",
"urbit-ob": "^3.1.1", "urbit-ob": "^3.1.1",
"urbit-sigil-js": "^1.3.2" "urbit-sigil-js": "^1.3.2"
}, },

View File

@ -191,13 +191,29 @@ export class ChatScreen extends Component {
.slice(messages.length - (50 * state.numPages), messages.length); .slice(messages.length - (50 * state.numPages), messages.length);
} }
let chatMessages = messages.reverse().map((msg) => { let reversedMessages = messages.reverse();
let chatMessages = reversedMessages.map((msg, i) => {
// Render sigil if previous message is not by the same sender
let gamAut = ['gam', 'aut'];
let renderSigil =
_.get(reversedMessages[i + 1], gamAut) !== _.get(msg, gamAut);
// More padding top if previous message is not by the same sender
let paddingTop = renderSigil;
// More padding bot if next message is not by the same sender
let paddingBot =
_.get(reversedMessages[i - 1], gamAut) !== _.get(msg, gamAut);
return ( return (
<Message <Message
key={msg.gam.uid} key={msg.gam.uid}
msg={msg.gam} /> msg={msg.gam}
renderSigil={renderSigil}
paddingTop={paddingTop}
paddingBot={paddingBot} />
); );
}); });
let peers = props.peers[state.station] || [window.ship]; let peers = props.peers[state.station] || [window.ship];
return ( return (

View File

@ -27,8 +27,34 @@ export class LandingScreen extends Component {
} }
onClickSubscribe() { onClickSubscribe() {
const { props } = this;
let station = props.match.params.ship + '/' + props.match.params.station; let station = props.match.params.ship + '/' + props.match.params.station;
this.props.api.source(station, true); let actions = [
{
create: {
nom: 'hall-internal-' + props.match.params.station,
des: "chatroom",
sec: "channel"
}
},
{
source: {
nom: "inbox",
sub: true,
srs: [station]
}
},
{
source: {
nom: "inbox",
sub: true,
srs: [`~${window.ship}/hall-internal-${props.match.params.station}`]
}
}
];
this.props.api.chat(actions);
this.props.history.push('/~chat'); this.props.history.push('/~chat');
} }
@ -50,7 +76,7 @@ export class LandingScreen extends Component {
<br /> <br />
<button <button
onClick={this.onClickSubscribe.bind(this)} onClick={this.onClickSubscribe.bind(this)}
className="label-r" className="label-regular fw-bold pointer"
>Subscribe</button> >Subscribe</button>
</div> </div>
</div> </div>

View File

@ -6,11 +6,9 @@ export class Sigil extends Component {
render() { render() {
const { props } = this; const { props } = this;
console.log("sigil ship", props.ship);
if (props.ship.length > 14) { if (props.ship.length > 14) {
return ( return (
<div className="bg-black" style={{width: 32, height: 32}}> <div className="bg-black" style={{width: 36, height: 36}}>
</div> </div>
); );
} else { } else {

View File

@ -58,7 +58,7 @@ export class Message extends Component {
if (typeof url !== 'string') { throw 'Only transmogrify strings!'; } if (typeof url !== 'string') { throw 'Only transmogrify strings!'; }
const ship = window.ship; const ship = window.ship;
if (url.indexOf('arvo://') === 0) { if (url.indexOf('arvo://') === 0) {
return `http://${ship}.arvo.network` + url.split('arvo://')[1]; return url.split('arvo://')[1];
} }
return url; return url;
} }
@ -66,11 +66,16 @@ export class Message extends Component {
render() { render() {
const { props } = this; const { props } = this;
let pending = !!props.msg.pending ? ' o-80' : ''; let pending = !!props.msg.pending ? ' o-80' : '';
let timestamp = moment.unix(props.msg.wen / 1000).format('hh:mm');
let datestamp = moment.unix(props.msg.wen / 1000).format('LL'); let datestamp = moment.unix(props.msg.wen / 1000).format('LL');
let paddingTop = props.paddingTop ? 'pt3' : '';
let paddingBot = props.paddingBot ? 'pb2' : 'pb1';
if (props.renderSigil) {
let timestamp = moment.unix(props.msg.wen / 1000).format('hh:mm a');
return ( return (
<div className={"w-100 pl3 pr3 pt2 pb2 cf flex" + pending} <div className={"w-100 pl3 pr3 cf flex " + paddingTop + " " + paddingBot + pending}
style={{ style={{
minHeight: 'min-content' minHeight: 'min-content'
}}> }}>
@ -91,7 +96,21 @@ export class Message extends Component {
</div> </div>
</div> </div>
); );
} else {
let timestamp = moment.unix(props.msg.wen / 1000).format('hh:mm');
return (
<div className={"w-100 pr3 pb1 cf hide-child flex" + pending}
style={{
minHeight: 'min-content'
}}>
<p className="child pl3 pr2 label-small-mono gray dib">{timestamp}</p>
<div className="fr" style={{ flexGrow: 1 }}>
{this.renderContent()}
</div>
</div>
)
}
} }
} }

View File

@ -127,7 +127,6 @@ class Clock extends Component {
} }
render() { render() {
console.log('hi')
return <div style={{position:'relative'}}> return <div style={{position:'relative'}}>
<svg style={{position:'absolute'}} width="218" height="218" viewBox="0 0 234 234" fill="none" xmlns="http://www.w3.org/2000/svg"> <svg style={{position:'absolute'}} width="218" height="218" viewBox="0 0 234 234" fill="none" xmlns="http://www.w3.org/2000/svg">

View File

@ -2,18 +2,13 @@ var gulp = require('gulp');
var cssimport = require('gulp-cssimport'); var cssimport = require('gulp-cssimport');
var rollup = require('gulp-better-rollup'); var rollup = require('gulp-better-rollup');
var cssnano = require('cssnano'); var cssnano = require('cssnano');
var autoprefixer = require('autoprefixer');
var postcss = require('gulp-postcss') var postcss = require('gulp-postcss')
var sucrase = require('@sucrase/gulp-plugin'); var sucrase = require('@sucrase/gulp-plugin');
var minify = require('gulp-minify'); var minify = require('gulp-minify');
var exec = require('child_process').exec;
var rename = require('gulp-rename'); var rename = require('gulp-rename');
var resolve = require('rollup-plugin-node-resolve'); var resolve = require('rollup-plugin-node-resolve');
var commonjs = require('rollup-plugin-commonjs'); var commonjs = require('rollup-plugin-commonjs');
var replace = require('rollup-plugin-replace');
var json = require('rollup-plugin-json');
var builtins = require('@joseph184/rollup-plugin-node-builtins');
var rootImport = require('rollup-plugin-root-import'); var rootImport = require('rollup-plugin-root-import');
var globals = require('rollup-plugin-node-globals'); var globals = require('rollup-plugin-node-globals');
@ -29,7 +24,6 @@ var urbitrc = require('../urbitrc');
gulp.task('css-bundle', function() { gulp.task('css-bundle', function() {
let plugins = [ let plugins = [
autoprefixer({ browsers: ['last 1 version'] }),
cssnano() cssnano()
]; ];
return gulp return gulp
@ -57,17 +51,12 @@ gulp.task('js-imports', function(cb) {
'node_modules/react-is/index.js': [ 'isValidElementType' ], 'node_modules/react-is/index.js': [ 'isValidElementType' ],
} }
}), }),
replace({
'process.env.NODE_ENV': JSON.stringify('development')
}),
rootImport({ rootImport({
root: `${__dirname}/dist/js`, root: `${__dirname}/dist/js`,
useEntry: 'prepend', useEntry: 'prepend',
extensions: '.js' extensions: '.js'
}), }),
json(),
globals(), globals(),
builtins(),
resolve() resolve()
] ]
}, 'umd')) }, 'umd'))
@ -91,18 +80,6 @@ gulp.task('rename-index-min', function() {
.pipe(gulp.dest('../../arvo/app/launch/js/')); .pipe(gulp.dest('../../arvo/app/launch/js/'));
}); });
gulp.task('js-cachebust', function(cb) {
return Promise.resolve(
exec('git log', function (err, stdout, stderr) {
let firstLine = stdout.split("\n")[0];
let commitHash = firstLine.split(' ')[1].substr(0, 10);
let newFilename = "index-" + commitHash + "-min.js";
exec('mv ../../arvo/app/launch/js/index-min.js ../../arvo/app/launch/js/' + newFilename);
})
);
})
gulp.task('urbit-copy', function () { gulp.task('urbit-copy', function () {
let ret = gulp.src('../../arvo/**/*'); let ret = gulp.src('../../arvo/**/*');

File diff suppressed because it is too large Load Diff

View File

@ -9,9 +9,7 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"@joseph184/rollup-plugin-node-builtins": "^2.1.4",
"@sucrase/gulp-plugin": "^2.0.0", "@sucrase/gulp-plugin": "^2.0.0",
"autoprefixer": "^9.6.1",
"cssnano": "^4.1.10", "cssnano": "^4.1.10",
"gulp": "^4.0.0", "gulp": "^4.0.0",
"gulp-better-rollup": "^4.0.1", "gulp-better-rollup": "^4.0.1",
@ -21,10 +19,8 @@
"gulp-rename": "^1.4.0", "gulp-rename": "^1.4.0",
"rollup": "^1.6.0", "rollup": "^1.6.0",
"rollup-plugin-commonjs": "^9.2.0", "rollup-plugin-commonjs": "^9.2.0",
"rollup-plugin-json": "^2.3.0",
"rollup-plugin-node-globals": "^1.4.0", "rollup-plugin-node-globals": "^1.4.0",
"rollup-plugin-node-resolve": "^3.4.0", "rollup-plugin-node-resolve": "^4.0.0",
"rollup-plugin-replace": "^2.0.0",
"rollup-plugin-root-import": "^0.2.3", "rollup-plugin-root-import": "^0.2.3",
"sucrase": "^3.8.0" "sucrase": "^3.8.0"
}, },
@ -32,9 +28,7 @@
"classnames": "^2.2.6", "classnames": "^2.2.6",
"lodash": "^4.17.11", "lodash": "^4.17.11",
"moment": "^2.20.1", "moment": "^2.20.1",
"mousetrap": "^1.6.1",
"react": "^16.5.2", "react": "^16.5.2",
"react-custom-scrollbars": "^4.2.1",
"react-dom": "^16.8.6", "react-dom": "^16.8.6",
"react-router-dom": "^5.0.0", "react-router-dom": "^5.0.0",
"urbit-ob": "^3.1.1" "urbit-ob": "^3.1.1"

View File

@ -2,18 +2,13 @@ var gulp = require('gulp');
var cssimport = require('gulp-cssimport'); var cssimport = require('gulp-cssimport');
var rollup = require('gulp-better-rollup'); var rollup = require('gulp-better-rollup');
var cssnano = require('cssnano'); var cssnano = require('cssnano');
var autoprefixer = require('autoprefixer');
var postcss = require('gulp-postcss') var postcss = require('gulp-postcss')
var sucrase = require('@sucrase/gulp-plugin'); var sucrase = require('@sucrase/gulp-plugin');
var minify = require('gulp-minify'); var minify = require('gulp-minify');
var exec = require('child_process').exec;
var rename = require('gulp-rename'); var rename = require('gulp-rename');
var resolve = require('rollup-plugin-node-resolve'); var resolve = require('rollup-plugin-node-resolve');
var commonjs = require('rollup-plugin-commonjs'); var commonjs = require('rollup-plugin-commonjs');
var replace = require('rollup-plugin-replace');
var json = require('rollup-plugin-json');
var builtins = require('@joseph184/rollup-plugin-node-builtins');
var rootImport = require('rollup-plugin-root-import'); var rootImport = require('rollup-plugin-root-import');
var globals = require('rollup-plugin-node-globals'); var globals = require('rollup-plugin-node-globals');
@ -29,7 +24,6 @@ var urbitrc = require('../urbitrc');
gulp.task('css-bundle', function() { gulp.task('css-bundle', function() {
let plugins = [ let plugins = [
autoprefixer({ browsers: ['last 1 version'] }),
cssnano() cssnano()
]; ];
return gulp return gulp
@ -65,17 +59,12 @@ gulp.task('js-imports', function(cb) {
'node_modules/react-is/index.js': [ 'isValidElementType' ], 'node_modules/react-is/index.js': [ 'isValidElementType' ],
} }
}), }),
replace({
'process.env.NODE_ENV': JSON.stringify('development')
}),
rootImport({ rootImport({
root: `${__dirname}/dist/js`, root: `${__dirname}/dist/js`,
useEntry: 'prepend', useEntry: 'prepend',
extensions: '.js' extensions: '.js'
}), }),
json(),
globals(), globals(),
builtins(),
resolve() resolve()
] ]
}, 'umd')) }, 'umd'))
@ -101,9 +90,7 @@ gulp.task('tile-js-imports', function(cb) {
useEntry: 'prepend', useEntry: 'prepend',
extensions: '.js' extensions: '.js'
}), }),
json(),
globals(), globals(),
builtins(),
resolve() resolve()
] ]
}, 'umd')) }, 'umd'))
@ -140,18 +127,6 @@ gulp.task('rename-tile-min', function() {
.pipe(gulp.dest('../../arvo/app/publish/js/')); .pipe(gulp.dest('../../arvo/app/publish/js/'));
}); });
gulp.task('js-cachebust', function(cb) {
return Promise.resolve(
exec('git log', function (err, stdout, stderr) {
let firstLine = stdout.split("\n")[0];
let commitHash = firstLine.split(' ')[1].substr(0, 10);
let newFilename = "index-" + commitHash + "-min.js";
exec('mv ../../arvo/app/publish/js/index-min.js ../../arvo/app/publish/js/' + newFilename);
})
);
})
gulp.task('urbit-copy', function () { gulp.task('urbit-copy', function () {
let ret = gulp.src('../../arvo/**/*'); let ret = gulp.src('../../arvo/**/*');

File diff suppressed because it is too large Load Diff

View File

@ -9,9 +9,7 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"@joseph184/rollup-plugin-node-builtins": "^2.1.4",
"@sucrase/gulp-plugin": "^2.0.0", "@sucrase/gulp-plugin": "^2.0.0",
"autoprefixer": "^9.6.1",
"cssnano": "^4.1.10", "cssnano": "^4.1.10",
"gulp": "^4.0.0", "gulp": "^4.0.0",
"gulp-better-rollup": "^4.0.1", "gulp-better-rollup": "^4.0.1",
@ -21,10 +19,8 @@
"gulp-rename": "^1.4.0", "gulp-rename": "^1.4.0",
"rollup": "^1.6.0", "rollup": "^1.6.0",
"rollup-plugin-commonjs": "^9.2.0", "rollup-plugin-commonjs": "^9.2.0",
"rollup-plugin-json": "^2.3.0",
"rollup-plugin-node-globals": "^1.4.0", "rollup-plugin-node-globals": "^1.4.0",
"rollup-plugin-node-resolve": "^3.4.0", "rollup-plugin-node-resolve": "^4.0.0",
"rollup-plugin-replace": "^2.0.0",
"rollup-plugin-root-import": "^0.2.3", "rollup-plugin-root-import": "^0.2.3",
"sucrase": "^3.8.0" "sucrase": "^3.8.0"
}, },
@ -32,9 +28,7 @@
"classnames": "^2.2.6", "classnames": "^2.2.6",
"lodash": "^4.17.11", "lodash": "^4.17.11",
"moment": "^2.20.1", "moment": "^2.20.1",
"mousetrap": "^1.6.1",
"react": "^16.5.2", "react": "^16.5.2",
"react-custom-scrollbars": "^4.2.1",
"react-dom": "^16.8.6", "react-dom": "^16.8.6",
"react-router-dom": "^5.0.0", "react-router-dom": "^5.0.0",
"urbit-ob": "^3.1.1", "urbit-ob": "^3.1.1",

View File

@ -8,8 +8,6 @@ export default class PublishTile extends Component {
} }
render(){ render(){
console.log("tile", this.props);
let info = []; let info = [];
if (this.props.data.invites > 0) { if (this.props.data.invites > 0) {
let text = (this.props.data.invites == 1) let text = (this.props.data.invites == 1)

View File

@ -48,7 +48,7 @@ export default class WeatherTile extends Component {
renderWrapper(child) { renderWrapper(child) {
return ( return (
<div className="pa2" style={{ <div className="pa2 relative" style={{
width: 234, width: 234,
height: 234, height: 234,
background: '#1a1a1a' background: '#1a1a1a'
@ -60,9 +60,12 @@ export default class WeatherTile extends Component {
renderNoData() { renderNoData() {
return this.renderWrapper(( return this.renderWrapper((
<div> <div onClick={this.locationSubmit.bind(this)}>
<p className="white sans-serif">Weather</p> <p className="gray label-regular b absolute"
<button onClick={this.locationSubmit.bind(this)}>Set location</button> style={{left: 8, top: 4}}>
Weather
</p>
<p className="absolute w-100 flex-col body-regular white" style={{verticalAlign: "bottom", bottom: 8, left: 8, cursor: "pointer"}}>-> Set location</p>
</div> </div>
)); ));
} }
@ -75,12 +78,12 @@ export default class WeatherTile extends Component {
return this.renderWrapper(( return this.renderWrapper((
<div> <div>
<p className="gray" style={{ <p className="gray label-regular b absolute"
fontWeight: 'bold', style={{left: 8, top: 4}}>
fontSize: 14, Weather
lineHeight: '24px' </p>
}}>Weather</p> <div className="w-100 mb2 mt2 absolute"
<div className="w-100 mb2 mt2"> style={{left: 18, top: 28}}>
<img <img
src={'/~weather/img/' + c.icon + '.png'} src={'/~weather/img/' + c.icon + '.png'}
width={64} width={64}
@ -95,7 +98,8 @@ export default class WeatherTile extends Component {
}}> }}>
{Math.round(c.temperature)}°</h2> {Math.round(c.temperature)}°</h2>
</div> </div>
<div className="w-100 cf"> <div className="w-100 cf absolute"
style={{ left: 18, top: 118 }}>
<div className="fl w-50"> <div className="fl w-50">
<IconWithData <IconWithData
icon='winddirection' icon='winddirection'

View File

@ -509,10 +509,10 @@ _stop_exit(c3_i int_i)
u3_daemon_bail(); u3_daemon_bail();
} }
/* _stop_trace(): print trace on SIGABRT. /* _stop_signal(): handle termination signal.
*/ */
static void static void
_stop_trace(c3_i int_i) _stop_signal(c3_i int_i)
{ {
// if we have a pier, unmap the event log before dumping core // if we have a pier, unmap the event log before dumping core
// //
@ -673,7 +673,7 @@ main(c3_i argc,
// Cleanup on SIGABRT. // Cleanup on SIGABRT.
// //
signal(SIGABRT, _stop_trace); signal(SIGABRT, _stop_signal);
printf("~\n"); printf("~\n");
// printf("welcome.\n"); // printf("welcome.\n");

View File

@ -337,6 +337,7 @@
c3_c* dns_c; // domain XX multiple/fallback c3_c* dns_c; // domain XX multiple/fallback
c3_w imp_w[256]; // imperial IPs c3_w imp_w[256]; // imperial IPs
time_t imp_t[256]; // imperial IP timestamps time_t imp_t[256]; // imperial IP timestamps
c3_o imp_o[256]; // imperial print status
} u3_ames; } u3_ames;
/* u3_save: checkpoint control. /* u3_save: checkpoint control.

View File

@ -122,11 +122,19 @@ _ames_czar_gone(u3_pact* pac_u, time_t now)
u3_pier* pir_u = u3_pier_stub(); u3_pier* pir_u = u3_pier_stub();
u3_ames* sam_u = pir_u->sam_u; u3_ames* sam_u = pir_u->sam_u;
if ( c3y == sam_u->imp_o[pac_u->imp_y] ) {
u3l_log("ames: czar at %s: not found (b)\n", pac_u->dns_c); u3l_log("ames: czar at %s: not found (b)\n", pac_u->dns_c);
sam_u->imp_o[pac_u->imp_y] = c3n;
}
if ( (0 == sam_u->imp_w[pac_u->imp_y]) || if ( (0 == sam_u->imp_w[pac_u->imp_y]) ||
(0xffffffff == sam_u->imp_w[pac_u->imp_y]) ) { (0xffffffff == sam_u->imp_w[pac_u->imp_y]) )
{
sam_u->imp_w[pac_u->imp_y] = 0xffffffff; sam_u->imp_w[pac_u->imp_y] = 0xffffffff;
} /* else keep existing ip for 5 more minutes */ }
// keep existing ip for 5 more minutes
//
sam_u->imp_t[pac_u->imp_y] = now; sam_u->imp_t[pac_u->imp_y] = now;
_ames_pact_free(pac_u); _ames_pact_free(pac_u);
@ -160,6 +168,7 @@ _ames_czar_cb(uv_getaddrinfo_t* adr_u,
sam_u->imp_w[pac_u->imp_y] = ntohl(add_u->sin_addr.s_addr); sam_u->imp_w[pac_u->imp_y] = ntohl(add_u->sin_addr.s_addr);
sam_u->imp_t[pac_u->imp_y] = now; sam_u->imp_t[pac_u->imp_y] = now;
sam_u->imp_o[pac_u->imp_y] = c3y;
#if 1 #if 1
if ( sam_u->imp_w[pac_u->imp_y] != old_w if ( sam_u->imp_w[pac_u->imp_y] != old_w
@ -309,6 +318,12 @@ u3_ames_ef_send(u3_pier* pir_u, u3_noun lan, u3_noun pac)
return; return;
} }
if ( c3n == sam_u->liv ) {
u3l_log("ames: not yet live, dropping outbound\r\n");
u3z(lan); u3z(pac);
return;
}
u3_pact* pac_u = c3_calloc(sizeof(*pac_u)); u3_pact* pac_u = c3_calloc(sizeof(*pac_u));
if ( c3y == _ames_lane_ip(lan, &pac_u->por_s, &pac_u->pip_w) ) { if ( c3y == _ames_lane_ip(lan, &pac_u->por_s, &pac_u->pip_w) ) {

View File

@ -750,6 +750,19 @@ _daemon_sign_init(void)
sig_u->nex_u = u3_Host.sig_u; sig_u->nex_u = u3_Host.sig_u;
u3_Host.sig_u = sig_u; u3_Host.sig_u = sig_u;
} }
// handle SIGQUIT (turn it into SIGABRT)
//
{
u3_usig* sig_u;
sig_u = c3_malloc(sizeof(u3_usig));
uv_signal_init(u3L, &sig_u->sil_u);
sig_u->num_i = SIGQUIT;
sig_u->nex_u = u3_Host.sig_u;
u3_Host.sig_u = sig_u;
}
} }
/* _daemon_sign_cb: signal callback. /* _daemon_sign_cb: signal callback.
@ -778,6 +791,10 @@ _daemon_sign_cb(uv_signal_t* sil_u, c3_i num_i)
u3_term_ef_winc(); u3_term_ef_winc();
break; break;
} }
case SIGQUIT: {
abort();
}
} }
} }
@ -866,6 +883,14 @@ u3_daemon_commence()
u3C.sign_hold_f = _daemon_sign_hold; u3C.sign_hold_f = _daemon_sign_hold;
u3C.sign_move_f = _daemon_sign_move; u3C.sign_move_f = _daemon_sign_move;
// Ignore SIGPIPE signals.
{
struct sigaction sig_s = {{0}};
sigemptyset(&(sig_s.sa_mask));
sig_s.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &sig_s, 0);
}
// boot the ivory pill // boot the ivory pill
// //
{ {

View File

@ -496,7 +496,7 @@ static void
_pier_work_bail(void* vod_p, _pier_work_bail(void* vod_p,
const c3_c* err_c) const c3_c* err_c)
{ {
fprintf(stderr, "pier: work error: %s\r\n", err_c); fprintf(stderr, "\rpier: work error: %s\r\n", err_c);
} }
/* _pier_work_boot(): prepare for boot. /* _pier_work_boot(): prepare for boot.
@ -838,11 +838,15 @@ _pier_work_exit(uv_process_t* req_u,
u3_controller* god_u = (void *) req_u; u3_controller* god_u = (void *) req_u;
u3_pier* pir_u = god_u->pir_u; u3_pier* pir_u = god_u->pir_u;
u3l_log("pier: exit: status %" PRIu64 ", signal %d\r\n", sas_i, sig_i); fprintf(stderr, "\rpier: work exit: status %" PRId64 ", signal %d\r\n",
sas_i, sig_i);
uv_close((uv_handle_t*) req_u, 0); uv_close((uv_handle_t*) req_u, 0);
u3_pier_db_shutdown(pir_u); // XX dispose
_pier_work_shutdown(pir_u); //
pir_u->god_u = 0;
u3_pier_bail();
} }
/* _pier_work_poke(): handle subprocess result. transfer nouns. /* _pier_work_poke(): handle subprocess result. transfer nouns.
@ -1803,10 +1807,12 @@ u3_pier_interrupt(u3_pier* pir_u)
static void static void
_pier_exit_done(u3_pier* pir_u) _pier_exit_done(u3_pier* pir_u)
{ {
u3l_log("pier: exit\r\n");
u3_pier_db_shutdown(pir_u); u3_pier_db_shutdown(pir_u);
if ( 0 != pir_u->god_u ) {
_pier_work_shutdown(pir_u); _pier_work_shutdown(pir_u);
}
_pier_loop_exit(pir_u); _pier_loop_exit(pir_u);
// XX uninstall pier from u3K.tab_u, dispose // XX uninstall pier from u3K.tab_u, dispose

View File

@ -898,6 +898,15 @@ main(c3_i argc, c3_c* argv[])
u3C.slog_f = _worker_send_slog; u3C.slog_f = _worker_send_slog;
} }
// Ignore SIGPIPE signals.
//
{
struct sigaction sig_s = {{0}};
sigemptyset(&(sig_s.sa_mask));
sig_s.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &sig_s, 0);
}
/* configure pipe to daemon process /* configure pipe to daemon process
*/ */
{ {