foomo-docs/docs/general/technologies/sse.html
2023-07-21 10:22:30 +00:00

21 lines
23 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper docs-doc-page docs-version-current plugin-docs plugin-id-default docs-doc-id-general/technologies/SSE">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.1">
<title data-rh="true">SSE Server Sent Events | foomo project docs</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://www.foomo.org/docs/general/technologies/sse"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="current"><meta data-rh="true" name="docusaurus_tag" content="docs-default-current"><meta data-rh="true" name="docsearch:version" content="current"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-current"><meta data-rh="true" property="og:title" content="SSE Server Sent Events | foomo project docs"><meta data-rh="true" name="description" content="Server Sent Events SSE are a well established web standard."><meta data-rh="true" property="og:description" content="Server Sent Events SSE are a well established web standard."><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://www.foomo.org/docs/general/technologies/sse"><link data-rh="true" rel="alternate" href="https://www.foomo.org/docs/general/technologies/sse" hreflang="en"><link data-rh="true" rel="alternate" href="https://www.foomo.org/docs/general/technologies/sse" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://SUATUVZDDM-dsn.algolia.net" crossorigin="anonymous"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="foomo project docs RSS Feed">
<link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="foomo project docs Atom Feed">
<link rel="search" type="application/opensearchdescription+xml" title="foomo project docs" href="/opensearch.xml"><link rel="stylesheet" href="/assets/css/styles.a204f99f.css">
<link rel="preload" href="/assets/js/runtime~main.9b95f4c1.js" as="script">
<link rel="preload" href="/assets/js/main.5c774faa.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><b class="navbar__title text--truncate">foomo</b></a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/docs/general">General</a><a class="navbar__item navbar__link" href="/docs/frontend">Frontend</a><a class="navbar__item navbar__link" href="/docs/backend">Backend</a><a class="navbar__item navbar__link" href="/docs/devops">DevOps</a><a class="navbar__item navbar__link" href="/docs/projects">Projects</a></div><div class="navbar__items navbar__items--right"><a class="navbar__item navbar__link" href="/blog">Blog</a><div class="searchBox_ZlJk"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0 docsWrapper_BCFX"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docPage__5DB"><aside class="theme-doc-sidebar-container docSidebarContainer_b6E3"><div class="sidebarViewport_Xe31"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/general">General guide</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/general/setup/workplace">Setup</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/general/work/general">Work</a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/general/package-managers">Package managers</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" aria-expanded="true" href="/docs/general/technologies/sse">Technologies</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/general/technologies/sse">SSE Server Sent Events</a></li></ul></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/general/essentials">(Random) essentials</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/general/security">Security</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--sublist-caret" aria-expanded="false" href="/docs/general/utilities/k9s">utilities</a></div></li></ul></nav></div></div></aside><main class="docMainContainer_gTbr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_VOVn"><div class="docItemContainer_Djhp"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">Technologies</span><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">SSE Server Sent Events</span><meta itemprop="position" content="2"></li></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><h1>SSE Server Sent Events</h1><p>Server Sent Events <a href="https://html.spec.whatwg.org/multipage/server-sent-events.html" target="_blank" rel="noopener noreferrer">SSE</a> are a well established web standard.</p><p>They allow a web server to push messages to the client. </p><p>I have created a minimal example <a href="https://github.com/janhalfar/sse-playground/tree/main/minimal" target="_blank" rel="noopener noreferrer">https://github.com/janhalfar/sse-playground/tree/main/minimal</a> to illustrate the technology.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="minimal-example-in-action">Minimal Example in action<a href="#minimal-example-in-action" class="hash-link" aria-label="Direct link to Minimal Example in action" title="Direct link to Minimal Example in action"></a></h2><p>if you clone <a href="https://github.com/janhalfar/sse-playground" target="_blank" rel="noopener noreferrer">https://github.com/janhalfar/sse-playground</a> locally and run <nobr><code>go run minimal/main.go</code></nobr> you will be able to open http://localhost:8080 :</p><p><img loading="lazy" alt="screenshot of chrome debugging SSE" src="/assets/images/sse-minimal-8e509ce578077ebdc2ca78a9199632e5.png" width="2908" height="3214" class="img_ev3q"></p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="minimal-server">Minimal server<a href="#minimal-server" class="hash-link" aria-label="Direct link to Minimal server" title="Direct link to Minimal server"></a></h2><p>This server will:</p><ul><li>serve its minimal frontend on <a href="http://localhost:8080" target="_blank" rel="noopener noreferrer">http://localhost:8080</a></li><li>serve a time event 100 times on <a href="http://localhost/sse/time" target="_blank" rel="noopener noreferrer">http://localhost/sse/time</a></li></ul><p>Let´s take a look at the server response with:</p><p><code>curl -v localhost:8080/sse/time</code></p><div class="language-zsh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-zsh codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain">% curl -v localhost:8080/sse/time</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">* Trying 127.0.0.1:8080...</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">* Connected to localhost (127.0.0.1) port 8080 (#0)</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">&gt; GET /sse/time HTTP/1.1</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">&gt; Host: localhost:8080</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">&gt; User-Agent: curl/7.79.1</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">&gt; Accept: */*</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">&gt;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">* Mark bundle as not supporting multiuse</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; HTTP/1.1 200 OK</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; Content-Type: text/event-stream</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; Date: Fri, 16 Sep 2022 14:49:17 GMT</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">&lt; Transfer-Encoding: chunked</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">&lt;</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">event: time</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">id: 1</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">data: 2022-09-16T16:49:17.482796+02:00</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">event: time</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">id: 2</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">data: 2022-09-16T16:49:17.498366+02:00</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">event: time</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">id: 3</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">data: 2022-09-16T16:49:17.514079+02:00</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">event: time</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">id: 4</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">data: 2022-09-16T16:49:17.529639+02:00</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">event: time</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">id: 5</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">data: 2022-09-16T16:49:17.545335+02:00</span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#bfc7d5"><span class="token plain">...</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="serving-the-frontend">serving the frontend<a href="#serving-the-frontend" class="hash-link" aria-label="Direct link to serving the frontend" title="Direct link to serving the frontend"></a></h3><p>The first thing the server is to serve a frontend, which is described below:</p><div><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockTitle_Ktv7">serve the embedded index.html</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain">loading</span><span class="token operator" style="color:rgb(137, 221, 255)">...</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div style="font-size:.9em;font-weight:600;color:#0E75DD;text-align:center;padding-bottom:13px;text-decoration:underline"><a href="https://github.com/janhalfar/sse-playground/blob/main/minimal/main.go#L16-L18" target="_blank">See full example on GitHub</a></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="serving-time-events">serving time events<a href="#serving-time-events" class="hash-link" aria-label="Direct link to serving time events" title="Direct link to serving time events"></a></h3><div><div class="language-go codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockTitle_Ktv7">serve an event stream of 100 server sent events</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-go codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain">loading</span><span class="token operator" style="color:rgb(137, 221, 255)">...</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div style="font-size:.9em;font-weight:600;color:#0E75DD;text-align:center;padding-bottom:13px;text-decoration:underline"><a href="https://github.com/janhalfar/sse-playground/blob/main/minimal/main.go#L20-L43" target="_blank">See full example on GitHub</a></div></div><h2 class="anchor anchorWithStickyNavbar_LWe7" id="minimal-client">Minimal client<a href="#minimal-client" class="hash-link" aria-label="Direct link to Minimal client" title="Direct link to Minimal client"></a></h2><div><div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockTitle_Ktv7">a minimal and incomplete client example</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#bfc7d5"><span class="token plain">loading</span><span class="token spread operator" style="color:rgb(137, 221, 255)">...</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><div style="font-size:.9em;font-weight:600;color:#0E75DD;text-align:center;padding-bottom:13px;text-decoration:underline"><a href="https://github.com/janhalfar/sse-playground/blob/main/minimal/index.html#L11-L30" target="_blank">See full example on GitHub</a></div></div></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="theme-doc-footer-tags-row row margin-bottom--sm"><div class="col"><b>Tags:</b><ul class="tags_jXut padding--none margin-left--sm"><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/docs/tags/javascript">javascript</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/docs/tags/go">go</a></li><li class="tag_QGVx"><a class="tag_zVej tagRegular_sFm0" href="/docs/tags/sse">sse</a></li></ul></div></div><div class="theme-doc-footer-edit-meta-row row"><div class="col"><a href="https://github.com/foomo/foomo-docs/tree/main/foomo/docs/general/technologies/SSE.md" target="_blank" rel="noreferrer noopener" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_vwxv"></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/general/package-managers"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Package managers</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/general/essentials"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">(Random) essentials</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#minimal-example-in-action" class="table-of-contents__link toc-highlight">Minimal Example in action</a></li><li><a href="#minimal-server" class="table-of-contents__link toc-highlight">Minimal server</a><ul><li><a href="#serving-the-frontend" class="table-of-contents__link toc-highlight">serving the frontend</a></li><li><a href="#serving-time-events" class="table-of-contents__link toc-highlight">serving time events</a></li></ul></li><li><a href="#minimal-client" class="table-of-contents__link toc-highlight">Minimal client</a></li></ul></div></div></div></div></main></div></div><footer class="footer"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">github</div><ul class="footer__items clean-list"><li class="footer__item"><a href="https://github.com/foomo" target="_blank" rel="noopener noreferrer" class="footer__link-item">https://github.com/foomo</a></li></ul></div><div class="col footer__col"><div class="footer__title">legal</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/etc/imprint">Imprint</a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright">© 2023 bestbytes</div></div></div></footer></div>
<script src="/assets/js/runtime~main.9b95f4c1.js"></script>
<script src="/assets/js/main.5c774faa.js"></script>
</body>
</html>