From 317621c6969b4277ac5fbc76512a9e04705abd3a Mon Sep 17 00:00:00 2001 From: Philipp Heckel Date: Sun, 24 Oct 2021 14:22:53 -0400 Subject: [PATCH] Styling --- assets/favicon.xcf | Bin 0 -> 9911 bytes examples/example_eventsource_sse.html | 1 + server/index.html | 170 ++++-------------- server/server.go | 12 ++ server/static/css/app.css | 76 ++++++++ .../lato-v17-latin-ext_latin-regular.woff | Bin 0 -> 30924 bytes .../lato-v17-latin-ext_latin-regular.woff2 | Bin 0 -> 25320 bytes server/static/img/favicon.png | Bin 0 -> 1260 bytes server/static/img/ntfy.png | Bin 0 -> 1260 bytes server/static/js/app.js | 128 +++++++++++++ 10 files changed, 252 insertions(+), 135 deletions(-) create mode 100644 assets/favicon.xcf create mode 100644 server/static/css/app.css create mode 100644 server/static/font/lato-v17-latin-ext_latin-regular.woff create mode 100644 server/static/font/lato-v17-latin-ext_latin-regular.woff2 create mode 100644 server/static/img/favicon.png create mode 100644 server/static/img/ntfy.png create mode 100644 server/static/js/app.js diff --git a/assets/favicon.xcf b/assets/favicon.xcf new file mode 100644 index 0000000000000000000000000000000000000000..9f0bc699fc6181833c586cf275ae144f994fb986 GIT binary patch literal 9911 zcmeI2U1%It6vyvon=~fb%{FaXtfdZVQ`3)aKB!_KhEgA@pd!|ylw!L{W;bIuvtf5a z6BVwmXB>Vo?#Spj8ngiVva>q7R}krSy~5l8>D`{?DB|o82~Qi)mWy z44mDwzkBY?oik_eIeXZI*4M8LcE^>tmQ)#z2c?ic4-yFAWj>^G!z+xD;8*~e1BpNu zN}cTLVZRaYp#)AF?N0Uesk(vBj0WrOPOC9P?NN4WMz6B*-uvlNEFw&`zF0zyCem6D zF<1v!Q^puds!Ar6)OuD{HN_L%sbngxG>NxpI?)wVTGqCRV;ZGZ4z0x0u4$%vSS8PzB(kY-gX$X0@OvekWfY5_+AeB<5(VL`>H@2imuPV~3i}aczJyfLELZ|aq zI*xM+?{kaByr3utqd-XE-F>=-I%q_bu_2WfE1vGAroLEu$3VZ*(BUeb9bKIr@S(0` zv?tWNwl=i4w6?ZwZRpfHnhAGyG{c}-8aKd?@sw^T4Vz+m#`_edsY+YB_vl?4L0#YW zYlCW%9!pF&v{+J$Wt1WDn36F)F@OkE8dNl=7a$0U;5h`*(o#MLk2CZD1c5a_Ok=~9+nN1Gp3miZJAafd zVw^iQ4(F_#SX8+Yo# zj$vmJmXn;F;m#tufFyZ-f;%@m+{WG_OalBC%s9tt>Emj$l$y+GO{OMBYd8F9zx?mN4H2Kjq zW0B}blfO3=cK`pp*SXPjw(_1AKl=6L#MsFn-+y|2kkZ`R1cdoCD(w)Recj^U7cZX{z-4UG_MRjCSy8E(5fe7?>})CJNBssl;%b#;l1E#_UUTc{YNO_JzCJ-b+tO@!q}llRz<3B)4rpG zcOpQkX@nBq(dBeIfy^ZBMolh8!rK!-CCB>-KI}qFdoM@{?{msyPq`2Y@AN`Sc-sl? z_8`|O;VmO}$Yn@)7s8bA%ErluM?A_+TH)`+z9_J5#C{<5b%CuV_7$;Fm%$qo8A*@qinWMT^ix&iC1j`enFsE`Iv> zzMhTP@_p@oqi50AGRs`OolB$&vGLxx*Pyr_4nA8V_(i-D(hi}+`#DV=m2zEK)=F@; zS}xUSxtzuIrfa!SyXHn|xwNdkd{6KhZiGgxzxwev!l;+ zNM8R8V@pY1#n=WKpq5MiaDixy@9FN{T`>XIgcz-9v>a(MglBz1AX&@1vqqlD#Go(<3mq7F+xPRiR`NFqc^T zO)8a4Yc<&kZH>iuQ8{K>&_q>dT2V_3)nUqb&fL8VE1hS#-4Yg`V= z3R>We>%s81rN-@$ei|FbU!Y0^|FjwYCn=Ax;Ud8)+N99wyz7%*y&=}UBau!G=tNl= zz2LYWT<5I?%UQ8etZHiML9lI*cS`w+C&8YFyasuT#^APg>AEd&S-W&wsa_swm+snv IDFs*k1&h+8R{#J2 literal 0 HcmV?d00001 diff --git a/examples/example_eventsource_sse.html b/examples/example_eventsource_sse.html index 83a8344a..db1acdae 100644 --- a/examples/example_eventsource_sse.html +++ b/examples/example_eventsource_sse.html @@ -1,6 +1,7 @@ + ntfy.sh: EventSource Example + + + ntfy.sh | simple HTTP-based pub-sub + + + + + + + + + + + + + + + + + + + + + + +

ntfy.sh - simple HTTP-based pub-sub

- ntfy (pronounce: notify) is a simple HTTP-based pub-sub notification service and tool. - It allows you to send desktop notifications via scripts, entirely without signup or cost. + ntfy (pronounce: notify) is a simple HTTP-based pub-sub notification service and tool. + It allows you to send desktop notifications via scripts from any computer, entirely without signup or cost. It's also open source if you want to run your own.

@@ -37,151 +57,31 @@

- +

Subscribed topics:

    Subscribe via your app, or via the CLI

    - + curl -s ntfy.sh/mytopic/raw # one message per line (\n are replaced with a space)
    curl -s ntfy.sh/mytopic/json # one JSON message per line
    curl -s ntfy.sh/mytopic/sse # server-sent events (SSE) stream -
    + -

    Publishing messages

    +

    Publishing messages

    Publishing messages can be done via PUT or POST using. Here's an example using curl:

    - + curl -d "long process is done" ntfy.sh/mytopic - +

    Messages published to a non-existing topic or a topic without subscribers will not be delivered later. There is (currently) no buffering of any kind. If you're not listening, the message won't be delivered.

    - - - + diff --git a/server/server.go b/server/server.go index a8050f47..acb1664a 100644 --- a/server/server.go +++ b/server/server.go @@ -2,6 +2,7 @@ package server import ( "bytes" + "embed" _ "embed" // required for go:embed "encoding/json" "fmt" @@ -51,10 +52,14 @@ var ( jsonRegex = regexp.MustCompile(`^/[^/]+/json$`) sseRegex = regexp.MustCompile(`^/[^/]+/sse$`) rawRegex = regexp.MustCompile(`^/[^/]+/raw$`) + staticRegex = regexp.MustCompile(`^/static/.+`) //go:embed "index.html" indexSource string + //go:embed static + webStaticFs embed.FS + errHTTPNotFound = &errHTTP{http.StatusNotFound, http.StatusText(http.StatusNotFound)} errHTTPTooManyRequests = &errHTTP{http.StatusTooManyRequests, http.StatusText(http.StatusTooManyRequests)} ) @@ -123,6 +128,8 @@ func (s *Server) handleInternal(w http.ResponseWriter, r *http.Request) error { } if r.Method == http.MethodGet && r.URL.Path == "/" { return s.handleHome(w, r) + } else if r.Method == http.MethodGet && staticRegex.MatchString(r.URL.Path) { + return s.handleStatic(w, r) } else if r.Method == http.MethodGet && jsonRegex.MatchString(r.URL.Path) { return s.handleSubscribeJSON(w, r) } else if r.Method == http.MethodGet && sseRegex.MatchString(r.URL.Path) { @@ -241,6 +248,11 @@ func (s *Server) handleOptions(w http.ResponseWriter, r *http.Request) error { return nil } +func (s *Server) handleStatic(w http.ResponseWriter, r *http.Request) error { + http.FileServer(http.FS(webStaticFs)).ServeHTTP(w, r) + return nil +} + func (s *Server) createTopic(id string) *topic { s.mu.Lock() defer s.mu.Unlock() diff --git a/server/static/css/app.css b/server/static/css/app.css new file mode 100644 index 00000000..1c623901 --- /dev/null +++ b/server/static/css/app.css @@ -0,0 +1,76 @@ +/* general styling */ + +html, body { + font-family: 'Lato', sans-serif; + color: #333; + font-size: 1.1em; +} + +a { + color: #39005a; +} + +a:hover { + text-decoration: none; +} + +h1 { + margin-top: 25px; + margin-bottom: 18px; + font-size: 2.5em; +} + +h2 { + margin-top: 20px; + margin-bottom: 5px; + font-size: 1.8em; +} + +h3 { + margin-top: 20px; + margin-bottom: 5px; + font-size: 1.3em; +} + +p { + margin-top: 0; + font-size: 1.1em; +} + +tt { + background: #eee; + padding: 2px 7px; + border-radius: 3px; +} + +code { + display: block; + background: #eee; + font-family: monospace; + padding: 20px; + border-radius: 3px; +} + +/* Lato font (OFL), https://fonts.google.com/specimen/Lato#about, + embedded with the help of https://google-webfonts-helper.herokuapp.com/fonts/lato?subsets=latin */ + +@font-face { + font-family: 'Lato'; + font-style: normal; + font-weight: 400; + src: local(''), + url('../font/lato-v17-latin-ext_latin-regular.woff2') format('woff2'), /* Chrome 26+, Opera 23+, Firefox 39+ */ + url('../font/lato-v17-latin-ext_latin-regular.woff') format('woff'); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */ +} + +/* Main page */ + +#main { + max-width: 900px; + margin: 0 auto 50px auto; +} + +#error { + color: darkred; + font-style: italic; +} diff --git a/server/static/font/lato-v17-latin-ext_latin-regular.woff b/server/static/font/lato-v17-latin-ext_latin-regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..c6d3d1d9dee498895d1478a79170a922507bcf25 GIT binary patch literal 30924 zcmZ6y18`-@Mj08F|%i2g$$k5F%RhPI~P*spIHu5bNx zp1WVd4))G20DxQcH}?3AJ;m6Y4>&lPe(SpXf9uKohf1JQFx}T>}eA6NT;|rqZ`<107!9T2HBfy^b*M}3c(zrOgpqzYZ!^+RK%5$Tf+A1>B z(@*oO@mX^*`K5VL#mVvSVSxdKns0Y+RqEsd-u(oMIpjfOvIF0Y4#Mw}!{$b%Wo_1l zzyY={#W|+B+tHYOaB^xn>}68)=Za~bi=`m&mOqU%|0Jq4731Td%BpwF zL_bKl9VyQX2u-WK4r`-qcOpf+8C%>Wloy4I)%~F5R`Li#Obv< z>5JeHFN${zEx|nlBkvRmt8<8w);^$GIVu#l8z(- zLzzfrR34DWk2!fAuB}IWB=Ri!V^TYNAUWBSyi=fhfwmSizGH?LuuE7MON?Ha{DLEn zM$IBYInQPp2|=b6keHsuX4Zm+r5L%7q)VYUdP@&SwF~=>$a>8FIf$;0=ZTp0Gr~L(|Iv7Q|z2KVS=w91Mwu^rINMQPJ(;sQv zE0;gxMJ+0_tb=sUe1GiqbPN*6Q#JPrIwbgxVPFobXm<=2T$TCio=Lai8ULN=6UVr) z4B+ksE}2KB{Wckk{X}sZFZ35-kf?Vcr-4;3j2mn|O)HS}<^O9=Rgmmt^y}x=UhZ>> zQA&MfjJ9ZX7lSA1;=*o+QZ%h~BG7V24zc@jZWa)9oXK{LwlKvsiT6NPH-<7u=zid&=v55d82 z>M_k`HLg#%HZ(gW*BNgz5b~HTNgJ zz%mO~8o@FTlqyL#3)MV!H~92$3=m7zFbfGgC%8+eB%A83@SfJW*oVxTXw{)S;$7~U z%za-y>GLIwq>eotJ(uS?lGQu|Dp;LDDO7AFt;76h4KkljLmw7IXjx|+9VpV&&KMKJ zSimmB6JEO7J@2sc(tg)MtWv3Mn=TA3%fcK49ⅅ|Fz>e?=Tzd6w4?dEM3D83oTi6 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®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 C-b5q- literal 0 HcmV?d00001 diff --git a/server/static/img/favicon.png b/server/static/img/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..93982c6f1098797152e5aeef37eafaf978dd9ab5 GIT binary patch literal 1260 zcmVWFU8GbZ8()Nlj2>E@cM*00dA;L_t(|+U?wLOdDk! z2k`H;g$W4ht&2-6o1)EJ}VjhdkG#a!Z_7mLRE=gmw^l*D(# zsEIGOII}kzjV55`VnjM4CAcAfI!A@J8#JX{DZT66`D#K%<9h8{uKj)AwU>K-&wcVd z&-I?BWxVK9Kv5kX5fC5&5+DIm2#^2?kN_zJNPq-LfD{5OVhmfogH=WY_V{+9qpJn3 zRwtbI*l}B}1!j(gEGt+`rm+}~V&&j;}sGk24>9jpaqYvZiq3HXGhKa}=Ki z-bHW!!JP2`z-G7N>DL~?7r_BMe)JH)R0v>CzYnJ`zlZK8y#;B{!kO^OhtJ^TxtG9N zs>^E)wBJ>WW2bun0MXevcJA1X2mAKll3EWux)%fA9mlcmlMqs3d5u7W!GOp54&O4o z8)@6;!TaC73P33zK)qfMpU;PFJDQ79Z_oX$c>VKdVKC~o52(}W(An9E`uh5!*6r>+ zfT!L*07G?QF1=)HU|n5ZN$MJnM)-R6VJVWpHv_-WlZcwQ-EMfi&1mUz5}?{q=x{i& z|Hv*FYpMuPO`J|A*qUl|9Cnx2vv4MpK{y=7+}s@E@i0L z-gO!p8lWf&c6Z;2pU+J}5@hWIMx#-Tj*cRkOl~^H^E`N-$IQ$OJRT3)+uNbntN%E{ zvMe}`1JCeqb=Wce(}K3A@a*g?hKGm$6)$V|gJCc=HHERUvAkipjn$P@K>&@WDs2Hul7vJe z@%QWC#VEuzDd%>CbfzHv(N!_p0{rKl_i7-j?$J*y44_`G(-xp8X0LVE|467C$)Z%4 z4ypX+Zc6}485yzp6;Vd2fCNZ@1V|x30wh2Jq!1th5+DIm2#^2?kN_zJSe!70`v1VL=i1QPwO!S@ z;prI8p7=5EK0N&LUbydVDrz5S1kw~PlPOFikV1e2NPq-LAwU8oKmw!?AOR9!W#lhP WZetnY50iZW0000WFU8GbZ8()Nlj2>E@cM*00dA;L_t(|+U?wLOdDk! z2k`H;g$W4ht&2-6o1)EJ}VjhdkG#a!Z_7mLRE=gmw^l*D(# zsEIGOII}kzjV55`VnjM4CAcAfI!A@J8#JX{DZT66`D#K%<9h8{uKj)AwU>K-&wcVd z&-I?BWxVK9Kv5kX5fC5&5+DIm2#^2?kN_zJNPq-LfD{5OVhmfogH=WY_V{+9qpJn3 zRwtbI*l}B}1!j(gEGt+`rm+}~V&&j;}sGk24>9jpaqYvZiq3HXGhKa}=Ki z-bHW!!JP2`z-G7N>DL~?7r_BMe)JH)R0v>CzYnJ`zlZK8y#;B{!kO^OhtJ^TxtG9N zs>^E)wBJ>WW2bun0MXevcJA1X2mAKll3EWux)%fA9mlcmlMqs3d5u7W!GOp54&O4o z8)@6;!TaC73P33zK)qfMpU;PFJDQ79Z_oX$c>VKdVKC~o52(}W(An9E`uh5!*6r>+ zfT!L*07G?QF1=)HU|n5ZN$MJnM)-R6VJVWpHv_-WlZcwQ-EMfi&1mUz5}?{q=x{i& z|Hv*FYpMuPO`J|A*qUl|9Cnx2vv4MpK{y=7+}s@E@i0L z-gO!p8lWf&c6Z;2pU+J}5@hWIMx#-Tj*cRkOl~^H^E`N-$IQ$OJRT3)+uNbntN%E{ zvMe}`1JCeqb=Wce(}K3A@a*g?hKGm$6)$V|gJCc=HHERUvAkipjn$P@K>&@WDs2Hul7vJe z@%QWC#VEuzDd%>CbfzHv(N!_p0{rKl_i7-j?$J*y44_`G(-xp8X0LVE|467C$)Z%4 z4ypX+Zc6}485yzp6;Vd2fCNZ@1V|x30wh2Jq!1th5+DIm2#^2?kN_zJSe!70`v1VL=i1QPwO!S@ z;prI8p7=5EK0N&LUbydVDrz5S1kw~PlPOFikV1e2NPq-LAwU8oKmw!?AOR9!W#lhP WZetnY50iZW0000 { + if (Notification.permission !== "granted") { + Notification.requestPermission().then((permission) => { + if (permission === "granted") { + subscribeInternal(topic, 0); + } else { + showNotificationDeniedError(); + } + }); + } else { + subscribeInternal(topic, 0); + } +}; + +const subscribeInternal = (topic, delaySec) => { + setTimeout(() => { + // Render list entry + let topicEntry = document.getElementById(`topic-${topic}`); + if (!topicEntry) { + topicEntry = document.createElement('li'); + topicEntry.id = `topic-${topic}`; + topicEntry.innerHTML = `${topic} `; + topicsList.appendChild(topicEntry); + } + topicsHeader.style.display = ''; + + // Open event source + let eventSource = new EventSource(`${topic}/sse`); + eventSource.onopen = () => { + topicEntry.innerHTML = `${topic} `; + delaySec = 0; // Reset on successful connection + }; + eventSource.onerror = (e) => { + const newDelaySec = (delaySec + 5 <= 15) ? delaySec + 5 : 15; + topicEntry.innerHTML = `${topic} (Reconnecting in ${newDelaySec}s ...) `; + eventSource.close() + subscribeInternal(topic, newDelaySec); + }; + eventSource.onmessage = (e) => { + const event = JSON.parse(e.data); + new Notification(event.message); + }; + topics[topic] = eventSource; + localStorage.setItem('topics', JSON.stringify(Object.keys(topics))); + }, delaySec * 1000); +}; + +const unsubscribe = (topic) => { + topics[topic].close(); + delete topics[topic]; + localStorage.setItem('topics', JSON.stringify(Object.keys(topics))); + document.getElementById(`topic-${topic}`).remove(); + if (Object.keys(topics).length === 0) { + topicsHeader.style.display = 'none'; + } +}; + +const test = (topic) => { + fetch(`/${topic}`, { + method: 'PUT', + body: `This is a test notification for topic ${topic}!` + }) +}; + +const showError = (msg) => { + errorField.innerHTML = msg; + topicField.disabled = true; + subscribeButton.disabled = true; +}; + +const showBrowserIncompatibleError = () => { + showError("Your browser is not compatible to use the web-based desktop notifications."); +}; + +const showNotificationDeniedError = () => { + showError("You have blocked desktop notifications for this website. Please unblock them and refresh to use the web-based desktop notifications."); +}; + +subscribeForm.onsubmit = function () { + if (!topicField.value) { + return false; + } + subscribe(topicField.value); + topicField.value = ""; + return false; +}; + +// Disable Web UI if notifications of EventSource are not available +if (!window["Notification"] || !window["EventSource"]) { + showBrowserIncompatibleError(); +} else if (Notification.permission === "denied") { + showNotificationDeniedError(); +} + +// Reset UI +topicField.value = ""; + +// Restore topics +const storedTopics = localStorage.getItem('topics'); +if (storedTopics && Notification.permission === "granted") { + const storedTopicsArray = JSON.parse(storedTopics) + storedTopicsArray.forEach((topic) => { subscribeInternal(topic, 0); }); + if (storedTopicsArray.length === 0) { + topicsHeader.style.display = 'none'; + } +} else { + topicsHeader.style.display = 'none'; +}